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

618 lines
26 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;
}
.breadcrumb {
font-size: 13px;
color: #8c8c8c;
margin-bottom: 12px;
}
.breadcrumb a {
color: #1890ff;
text-decoration: none;
}
.breadcrumb a:hover { text-decoration: underline; }
.page-title {
font-size: 22px;
font-weight: 600;
color: #1a1a1a;
margin-bottom: 16px;
}
.hint-list {
background: #fff;
border: 1px solid #f0f0f0;
border-radius: 8px;
padding: 16px 20px;
margin-bottom: 16px;
font-size: 12px;
color: #ff4d4f;
line-height: 1.8;
}
.hint-list p { margin-bottom: 4px; }
.card {
background: #fff;
border-radius: 8px;
padding: 20px 24px;
margin-bottom: 16px;
border: 1px solid #f0f0f0;
}
.filter-row {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
margin-bottom: 12px;
}
.btn-group {
display: flex;
gap: 8px;
}
.filter-field {
display: flex;
align-items: center;
gap: 8px;
}
.filter-label {
font-size: 14px;
color: #595959;
white-space: nowrap;
}
.filter-input, .filter-select {
width: 180px;
height: 32px;
padding: 0 10px;
border: 1px solid #d9d9d9;
border-radius: 4px;
font-size: 13px;
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: 24px;
}
.filter-btn {
height: 32px;
padding: 0 20px;
background: #1890ff;
color: #fff;
border: none;
border-radius: 4px;
font-size: 13px;
cursor: pointer;
}
.filter-btn:hover { background: #096dd9; }
.filter-pair {
display: flex;
align-items: center;
gap: 4px;
}
.filter-pair .filter-input {
width: 60px;
}
.header-actions {
display: flex;
gap: 8px;
margin-top: 12px;
}
.header-btn {
height: 32px;
padding: 0 16px;
background: #fff;
border: 1px solid #d9d9d9;
color: #333;
border-radius: 4px;
font-size: 13px;
cursor: pointer;
}
.header-btn:hover { border-color: #1890ff; color: #1890ff; }
/* ============= 表格 ============= */
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
}
.data-table thead th {
background: #fafafa;
padding: 12px 12px;
text-align: left;
color: #1a1a1a;
font-weight: 600;
border-bottom: 1px solid #f0f0f0;
white-space: nowrap;
}
.data-table tbody td {
padding: 12px 12px;
border-bottom: 1px solid #f5f5f5;
color: #595959;
vertical-align: middle;
white-space: nowrap;
}
.data-table tbody tr:hover { background: #fafcff; }
.col-check { width: 36px; }
.data-table input[type="checkbox"] {
cursor: pointer;
width: 14px;
height: 14px;
accent-color: #1890ff;
}
.col-code {
color: #1890ff;
font-family: ui-monospace, "Courier New", monospace;
}
.col-name { color: #1a1a1a; }
.status-tag {
display: inline-block;
padding: 2px 10px;
border-radius: 10px;
font-size: 12px;
}
.status-pending { background: #fff7e6; color: #fa8c16; }
.status-active { background: #e6f7ff; color: #1890ff; }
.status-done { background: #f6ffed; color: #52c41a; }
.status-disabled { background: #fff1f0; color: #ff4d4f; }
.op-link {
color: #1890ff;
text-decoration: none;
margin-right: 8px;
font-size: 12px;
}
.op-link:last-child { margin-right: 0; }
.op-link:hover { text-decoration: underline; }
.op-link.disabled { color: #bfbfbf; cursor: not-allowed; }
.col-remark {
max-width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
@media (max-width: 768px) {
.content { padding: 16px; }
.data-table { display: block; overflow-x: auto; white-space: nowrap; }
}
</style>
</head>
<body>
<main class="content">
<div class="breadcrumb">
<a href="项目列表.html">项目列表</a> &gt; 会议管理
</div>
<h1 class="page-title">会议管理</h1>
<!-- 筛选区(按原型 会议管理_1.html:2 行 8 字段+1 按钮) -->
<div class="card">
<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">会议ID:</span>
<input type="text" class="filter-input" placeholder="输入会议ID">
</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>
<input type="text" class="filter-input" placeholder="期数" style="width:100px">
<span class="filter-label"></span>
</div>
<div class="filter-field">
<span class="filter-label">会议时间:</span>
<input type="text" class="filter-input" placeholder="开始时间">
<span class="filter-label"></span>
<input type="text" class="filter-input" placeholder="结束时间">
</div>
</div>
<div class="filter-row">
<div class="filter-field">
<span class="filter-label">项目形式:</span>
<select class="filter-select">
<option value="">请选择</option>
<option value="online">线上</option>
<option value="offline">线下</option>
<option value="both">线上+线下</option>
<option value="other">其他</option>
</select>
</div>
<div class="filter-field">
<span class="filter-label">当前阶段:</span>
<select class="filter-select">
<option value="">请选择</option>
<option>未执行</option>
<option>执行中</option>
<option>待审核</option>
<option>待结算</option>
<option>已完结</option>
<option>冻结中</option>
</select>
</div>
<div class="filter-field">
<span class="filter-label">备注:</span>
<input type="text" class="filter-input" placeholder="输入备注">
</div>
<div class="btn-group">
<button class="filter-btn">查找</button>
<button class="filter-btn" style="background:#1890ff;color:#fff;border:1px solid #1890ff;margin-left:8px" onclick="alert('批量提交:后端待对接')">批量提交</button>
</div>
</div>
</div>
<!-- 表格 -->
<div class="card" style="padding: 0; overflow-x: auto;">
<table class="data-table">
<thead>
<tr>
<th class="col-check"><input type="checkbox" id="selectAll"></th>
<th>项目编号</th>
<th>会议ID</th>
<th>项目形式</th>
<th>会议名称</th>
<th>会议开始时间</th>
<th>会议结束时间</th>
<th>总期数</th>
<th>期数</th>
<th>当前阶段</th>
<th>备注</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-pending">未执行</span></td>
<td class="col-remark" title="首次会议">首次会议</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-active">执行中</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-pending">待审核</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-pending">待结算</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-done">已完结</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-disabled">冻结中</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-active">执行中</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-pending">未执行</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-active">执行中</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-pending">未执行</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
<tr>
<td><input type="checkbox" class="row-check"></td>
<td><a class="col-code" href="javascript:void(0)">ZH-2026-658</a></td>
<td>5643145673</td>
<td>线上</td>
<td><a class="col-name" href="javascript:void(0)">小牛血清创新应用研讨会</a></td>
<td>2026.05.11 11:30</td>
<td>2026.05.11 14:30</td>
<td>26</td>
<td>第 3 期</td>
<td><span class="status-tag status-active">执行中</span></td>
<td class="col-remark">XXXXXX</td>
<td>
<a class="op-link" href="javascript:void(0)">提交</a>
<a class="op-link" href="meeting-detail-executor.html">查看</a>
<a class="op-link" href="javascript:void(0)">修改</a>
<a class="op-link" onclick="copyMeeting(this)">复制</a>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 红色提示(开发时参考,原型 u6969/u6971/u7013/u7015/u7017/u7285/u7303/u7305/u7307,共9条) -->
<div class="hint-list">
<p>*执行方只能在项目列表中进行建会</p>
<p>*执行方的当前阶段跟支持方基本一致</p>
<p>*提交审核后,在OA新建流程时,才能选择该场会,合规人员才能看到,是否为待审核状态时,OA才能看到该场会议</p>
<p>*点击复制后,则跳转到新建会议并将会议基本信息自动带入</p>
<p>*点击总期数,可以筛选出该系列会的所有会议</p>
<p>*提交后,返回提交成功的提示,三秒消失</p>
<p>*统一状态(当前阶段): 未执行=会议开始时间前; 执行中=会议开始时间后执行方未提交材料; 待审核=执行方提交材料后合规审核; 待结算=支持方审核通过后; 已完结=合规人员点击结算后; 冻结中=会议结束后未按时提交</p>
<p>*冻结中时,提交按钮置灰,无法点击</p>
<p>*增加最后期限,到期前24小时,每4小时,给执行方发送短信催促一次</p>
</div>
</main>
<script>
document.getElementById('selectAll').addEventListener('change', function() {
document.querySelectorAll('.row-check').forEach(cb => cb.checked = this.checked);
});
function batchSubmit() {
const checked = document.querySelectorAll('.row-check:checked');
if (checked.length === 0) {
alert('请先选择要提交的会议');
return;
}
if (confirm(`确定要提交选中的 ${checked.length} 个会议吗?`)) {
alert('提交成功!');
}
}
function batchDelete() {
const checked = document.querySelectorAll('.row-check:checked');
if (checked.length === 0) {
alert('请先选择要删除的会议');
return;
}
if (confirm(`确定要删除选中的 ${checked.length} 个会议吗?`)) {
alert('删除成功!');
}
}
// 复制会议:跳新建会议页,带原会议基本信息
function copyMeeting(btn) {
var tr = btn.closest('tr');
var code = tr.querySelector('.col-code').textContent.trim();
var name = tr.querySelector('.col-name').textContent.trim();
var tds = tr.querySelectorAll('td');
// td 顺序:checkbox, code, 会议ID, 项目形式, 会议名称, 开始时间, 结束时间, 总期数, 期数, 当前阶段, 备注
var form = tds[3].textContent.trim();
var startTime = tds[5].textContent.trim();
var endTime = tds[6].textContent.trim();
var params = new URLSearchParams();
params.set('code', code);
params.set('name', name);
params.set('form', form);
params.set('start', startTime);
params.set('end', endTime);
params.set('copy', '1');
navigateTo('new-meeting.html?' + params.toString());
}
// iframe 路由
function navigateTo(href) {
try {
if (window.parent && window.parent.document.getElementById('contentFrame')) {
window.parent.document.getElementById('contentFrame').src = href;
} else {
window.location.href = href;
}
} catch (e) { window.location.href = href; }
}
// 跳转到会议详情页
function viewDetail(el) {
try {
if (window.parent && window.parent.document.getElementById('contentFrame')) {
window.parent.document.getElementById('contentFrame').src = 'meeting-detail-executor.html';
} else {
window.location.href = 'meeting-detail-executor.html';
}
} catch (e) {
window.location.href = 'meeting-detail-executor.html';
}
}
</script>
</body>
</html>