Files
郭庆泰 cf5790229a refactor: 合并 biz_support_unit/biz_execution_unit/biz_service_org 为 biz_org, 删除 2 张孤儿表, 改 biz_person.work_unit → org_id FK
主要改动:
- SQL: biz_support_unit → biz_org, 加 org_type, 加 business_nature; 删 biz_execution_unit, biz_service_org
- SQL: biz_project.support_unit_id/name + service_org_id/name → org_id/name/type
- SQL: biz_meeting.support_unit_name → org_name
- SQL: biz_person.work_unit → org_id (FK)
- 后端: 新 BizOrg entity/mapper/service/controller
- 后端: BizProject/BizMeeting 字段重命名
- 后端: 删 12 个 BizSupportUnit/BizExecutionUnit/BizServiceOrg Java 文件
- 后端: BizPersonImportVO.workUnit → orgName (导入时查 biz_org 取 org_id)
- 后端: BizAuthController.registerExecutor 完整实现 (原 registerSupplier stub)
- 前端: 新 admin/Orgs.vue + manager/Orgs.vue (原 SupportUnits)
- 前端: RegisterExecutor.vue (原 RegisterSupplier, 单页 2 步)
- 前端: sponsor/executor/manager 多个文件 workUnit → orgId/orgName 重命名
- 前端: 统一 supplier → executor, 业务命名 sponsor(赞助方) / executor(执行方=供应商)
- 前端: 全工程 execution → executor (company type / role / person unit_type)
2026-08-15 12:41:10 +08:00

546 lines
24 KiB
HTML

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>我参与的会议</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
color: #333;
background: #fafafa;
min-height: 100vh;
}
.content {
padding: 24px 32px;
}
.page-header {
margin-bottom: 20px;
}
.page-title {
font-size: 22px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 4px;
}
.page-subtitle {
font-size: 13px;
color: #8c8c8c;
}
/* 红字提示(原型 u11590/u11592/u11594/u11681/u11683) */
.hint-text {
font-size: 12px;
color: #ff4d4f;
margin-bottom: 12px;
line-height: 1.6;
}
.hint-list {
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 8px;
padding: 14px 20px;
margin-top: 16px;
font-size: 12px;
color: #ff4d4f;
line-height: 1.9;
}
.hint-list p { margin-bottom: 4px; }
.hint-list p:last-child { margin-bottom: 0; }
/* 面包屑 */
.breadcrumb {
font-size: 13px;
color: #8c8c8c;
margin-bottom: 12px;
}
.breadcrumb a {
color: #1890ff;
text-decoration: none;
}
.breadcrumb a:hover { text-decoration: underline; }
.card {
background: #fff;
border-radius: 8px;
padding: 20px 24px;
margin-bottom: 16px;
border: 1px solid #f0f0f0;
}
.card-title {
font-size: 15px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16px;
padding-left: 10px;
border-left: 3px solid #1890ff;
line-height: 1;
}
.filter-row {
display: grid;
grid-template-columns: repeat(5, 1fr) auto;
gap: 12px;
align-items: center;
}
.filter-field {
display: flex;
align-items: center;
gap: 8px;
}
.filter-label {
font-size: 14px;
color: #595959;
white-space: nowrap;
}
.filter-input,
.filter-select {
flex: 1;
height: 36px;
padding: 0 12px;
border: 1px solid #d9d9d9;
border-radius: 4px;
font-size: 14px;
color: #333;
background: #fff;
outline: none;
}
.filter-input:focus,
.filter-select:focus {
border-color: #1890ff;
box-shadow: 0 0 0 3px rgba(24,144,255,0.1);
}
.filter-select {
cursor: pointer;
appearance: none;
background-image: url("data:image/svg+xml;charset=UTF-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23999' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 10px center;
background-size: 14px;
padding-right: 28px;
}
.filter-btn {
height: 36px;
padding: 0 24px;
background: #1890ff;
color: #fff;
border: none;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
}
.filter-btn:hover { background: #096dd9; }
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 13px;
}
.data-table thead th {
background: #fafafa;
padding: 12px 16px;
text-align: left;
color: #1a1a1a;
font-weight: 600;
border-bottom: 1px solid #f0f0f0;
}
.data-table tbody td {
padding: 12px 16px;
border-bottom: 1px solid #f5f5f5;
color: #595959;
vertical-align: middle;
}
.data-table tbody tr:hover { background: #fafcff; }
.col-code {
color: #1890ff;
font-family: ui-monospace, "Courier New", monospace;
}
.col-name {
color: #1a1a1a;
font-weight: 500;
}
.status-tag {
display: inline-block;
padding: 2px 10px;
border-radius: 10px;
font-size: 12px;
}
.status-pending { background: #fff7e6; color: #fa8c16; }
.status-done { background: #f6ffed; color: #52c41a; }
.op-link {
color: #1890ff;
text-decoration: none;
margin-right: 8px;
font-size: 13px;
}
.op-link:hover { text-decoration: underline; }
.op-link:last-child { margin-right: 0; }
@media (max-width: 768px) {
.filter-row { grid-template-columns: 1fr; }
.content { padding: 16px; }
.data-table { font-size: 12px; }
}
/* ============= 弹框(原型 u11685 日程 + u11690 邀请函,动态面板) ============= */
.modal-mask {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
display: none;
align-items: center;
justify-content: center;
z-index: 1000;
}
.modal-mask.active { display: flex; }
.modal {
background: #fff;
border-radius: 8px;
width: 600px;
max-width: 90vw;
max-height: 85vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
border-bottom: 1px solid #f0f0f0;
}
.modal-title {
font-size: 16px;
font-weight: 600;
color: #1a1a1a;
}
.modal-close {
width: 28px;
height: 28px;
border: none;
background: transparent;
cursor: pointer;
font-size: 18px;
color: #8c8c8c;
line-height: 1;
}
.modal-close:hover { color: #1a1a1a; }
.modal-body {
padding: 20px;
overflow-y: auto;
}
/* 海报占位(对应原型 u11686/u11691) */
.poster {
width: 100%;
aspect-ratio: 16/9;
border: 1px dashed #d9d9d9;
border-radius: 4px;
background: #fafafa;
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: 8px;
color: #8c8c8c;
}
.poster-icon { font-size: 48px; opacity: 0.5; }
.poster-text { font-size: 14px; }
</style>
</head>
<body>
<!--
============================================================
来源: /原型/我参与的会议.html
/原型/files/我参与的会议/styles.css
============================================================
按 top 排序的内容区模块:
#1 u11494 "首页" (287, 52) → 面包屑根
#2 u11508/u11510 项目编号 (277,242)/(344,238) → 筛选 label+input
#3 u11511/u11513 会议名称 (511,242)/(578,238) → 筛选 label+input
#4 u11525/u11527 当前阶段 (747,236)/(844,239) → 筛选 label+select
#5 u11662 签署状态 (1054, 239) → 筛选 select
#6 u11514 查找 (1210, 233) → 按钮
#7 u11590 红字提示(顶部) (759, 270) → 表前红字
#8 u11496/u11498/u11582/u11584/u11656/u11506 表头 → 7列表格列头
#9 u11502/u11504 未开始/已结束 (645, 354/392) → 状态
#10 u11528/u11566/u11568/u11570/u11572/u11574/u11576/u11578 操作列 → 签署劳务(未签署) / 查看劳务(已签署),单按钮
#11 u11592/u11594/u11681/u11683 红字提示(底部) → 表后红字
#12 弹框邀请函(原型 u11690 动态面板)→ .modal-mask#modalInvitation
#13 弹框日程 (原型 u11685 动态面板)→ .modal-mask#modalSchedule
#14 meeting-detail.html 会议详情(已建)
============================================================
框架元素(由父级 doctor.html 渲染,本页面不输出):
- u11474/u11476/u11478/u11480/u11482/u11484/u11486/u11488/u11490/u11492 侧边栏+顶栏
============================================================
新增项(非原型,现代表格默认):
- page-subtitle 副标题
- 11 行样例数据(原型有 5-6 行,自行扩展)
- 弹框 HTML/CSS(原型是 Axure 动态面板,这里用现代 modal 重写)
- 响应式 768px 断点
============================================================
-->
<main class="content">
<!-- #1 面包屑(对应 u11494) -->
<div class="breadcrumb">
<a href="javascript:void(0)" onclick="goHome()">首页</a> &gt; 我参与的会议
</div>
<div class="page-header">
<h1 class="page-title">我参与的会议</h1>
<p class="page-subtitle">查看您参与的会议列表、会议资料、签署劳务协议</p>
</div>
<!-- 筛选 -->
<div class="card">
<div class="card-title">筛选条件</div>
<div class="filter-row">
<div class="filter-field">
<span class="filter-label">项目编号:</span>
<input type="text" class="filter-input" placeholder="输入项目编号">
</div>
<div class="filter-field">
<span class="filter-label">会议名称:</span>
<input type="text" class="filter-input" placeholder="输入会议名称">
</div>
<div class="filter-field">
<span class="filter-label">当前阶段:</span>
<select class="filter-select">
<option value="">请选择</option>
<option value="pending">未开始</option>
<option value="done">已结束</option>
</select>
</div>
<div class="filter-field">
<span class="filter-label">签署状态:</span>
<select class="filter-select">
<option value="">请选择</option>
<option value="signed">已签署</option>
<option value="unsigned">未签署</option>
</select>
</div>
<button class="filter-btn">查找</button>
</div>
</div>
<!-- #6 表前红字提示(对应 u11590) -->
<p class="hint-text">*邀请函根据执行方上传的邀请函模板和专家列表进行生成并显示到专家的会议列表中</p>
<!-- 表格 -->
<div class="card">
<table class="data-table">
<thead>
<tr>
<th>项目编号</th>
<th>会议名称</th>
<th>当前阶段</th>
<th>日程</th>
<th>邀请函</th>
<th>签署状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-658</a></td>
<td><a class="col-name" href="meeting-detail.html">小牛血清创新应用研讨会</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-659</a></td>
<td><a class="col-name" href="meeting-detail.html">整合医学学会项目评审会</a></td>
<td><span class="status-tag status-done">已结束</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-done">已签署</span></td>
<td><a class="op-link" href="查看劳务.html">查看劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-650</a></td>
<td><a class="col-name" href="meeting-detail.html">智慧医院建设项目方案论证会</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-645</a></td>
<td><a class="col-name" href="meeting-detail.html">基层医疗改革试点中期评估会</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-640</a></td>
<td><a class="col-name" href="meeting-detail.html">数字化医疗转型方案评审会</a></td>
<td><span class="status-tag status-done">已结束</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-done">已签署</span></td>
<td><a class="op-link" href="查看劳务.html">查看劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-635</a></td>
<td><a class="col-name" href="meeting-detail.html">临床医学研究方案评议会</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-628</a></td>
<td><a class="col-name" href="meeting-detail.html">公共卫生应急体系建设研讨会</a></td>
<td><span class="status-tag status-done">已结束</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-done">已签署</span></td>
<td><a class="op-link" href="查看劳务.html">查看劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-622</a></td>
<td><a class="col-name" href="meeting-detail.html">中医诊疗标准化研究论坛</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-618</a></td>
<td><a class="col-name" href="meeting-detail.html">医疗 AI 辅助诊断应用论坛</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-610</a></td>
<td><a class="col-name" href="meeting-detail.html">医院信息化标准研讨会</a></td>
<td><span class="status-tag status-done">已结束</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-done">已签署</span></td>
<td><a class="op-link" href="查看劳务.html">查看劳务</a></td>
</tr>
<tr>
<td><a class="col-code" href="项目详情.html">ZH-2026-605</a></td>
<td><a class="col-name" href="meeting-detail.html">重大疾病防控体系建设讨论会</a></td>
<td><span class="status-tag status-pending">未开始</span></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('schedule')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><a class="op-link" href="javascript:void(0)" onclick="openModal('invitation')">查看</a> <a class="op-link" href="下载.html">下载</a></td>
<td><span class="status-tag status-pending">未签署</span></td>
<td><a class="op-link" href="签署劳务.html">签署劳务</a></td>
</tr>
</tbody>
</table>
</div>
<!-- #10 表后红字提示(对应 u11592 / u11594 / u11681 / u11683) -->
<div class="hint-list">
<p>*未签署时显示「签署劳务」,已签署后显示「查看劳务」</p>
<p>*在会议编辑中,导入专家信息,并点击推送电子签后,专家才可以查看到签署按钮</p>
<p>*点击签署劳务跳转到电子签</p>
<p>*签署劳务协议时,先验证是否有执业证书、职称证明、身份证照片,如果没有,必须先上传</p>
</div>
</main>
<!-- 弹框(对应原型 u11685 日程 / u11690 邀请函 动态面板) -->
<div class="modal-mask" id="modalSchedule" onclick="if(event.target===this)closeModal('schedule')">
<div class="modal">
<div class="modal-header">
<span class="modal-title">会议日程</span>
<button class="modal-close" onclick="closeModal('schedule')">&times;</button>
</div>
<div class="modal-body">
<div class="poster">
<span class="poster-icon">📅</span>
<span class="poster-text">日程海报</span>
</div>
</div>
</div>
</div>
<div class="modal-mask" id="modalInvitation" onclick="if(event.target===this)closeModal('invitation')">
<div class="modal">
<div class="modal-header">
<span class="modal-title">邀请函</span>
<button class="modal-close" onclick="closeModal('invitation')">&times;</button>
</div>
<div class="modal-body">
<div class="poster">
<span class="poster-icon">📄</span>
<span class="poster-text">邀请函</span>
</div>
</div>
</div>
</div>
<script>
function goHome() {
try {
if (window.parent && window.parent.document.getElementById('contentFrame')) {
window.parent.document.getElementById('contentFrame').src = 'home.html';
}
} catch (e) {}
}
// 弹框控制(对应原型 u11685/u11690 动态面板)
function openModal(type) {
const id = type === 'schedule' ? 'modalSchedule' : 'modalInvitation';
const el = document.getElementById(id);
if (el) el.classList.add('active');
}
function closeModal(type) {
const id = type === 'schedule' ? 'modalSchedule' : 'modalInvitation';
const el = document.getElementById(id);
if (el) el.classList.remove('active');
}
// ESC 关闭
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
closeModal('schedule');
closeModal('invitation');
}
});
</script>
</body>
</html>