feat: 生产部署 + 会议全链路 (执行方分配/费用结算/签到脱敏/H5相机)
- 生产 nginx 三路径: ry-vue3 /hg/, ry-h5 /camera/, API /hg-api, .env 分环境 - 签约链接/摄像头 base-url 走 yml, 不再硬编码 /hg 与 localhost - 新增 biz_project_executor_assign (镜像 sponsor_assign) 执行方项目级分配 - 会议费用后台汇总 FeeCalcScheduler + 结算回写项目金额 + 状态流转调度 - 签到表拍照高斯模糊脱敏 extra_oss_url, 新增 PosterService/StageDeriver - 清理 biz_support_intent 旧表 (6 Java/XML 删除) - ry-h5 相机黑屏修复: 显式 video.play() + 动态 apiBase 上传 - 资源: simhei 字体 / logo.png / qrcode_1.png / favicon.ico Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -30,10 +30,14 @@
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="当前阶段">
|
||||
<el-select v-model="q.currentStage" clearable placeholder="全部" style="width:120px">
|
||||
<el-option label="已执行" value="已执行" />
|
||||
<el-option label="未执行" value="未执行" />
|
||||
<el-option label="执行中" value="执行中" />
|
||||
<el-select v-model="q.currentStage" clearable placeholder="全部" style="width:140px">
|
||||
<el-option label="未执行" value="NOT_STARTED" />
|
||||
<el-option label="执行中" value="RUNNING" />
|
||||
<el-option label="待合规审核" value="AWAITING_COMPLIANCE" />
|
||||
<el-option label="待支持方审核" value="AWAITING_SPONSOR" />
|
||||
<el-option label="待结算" value="AWAITING_SETTLEMENT" />
|
||||
<el-option label="已完结" value="SETTLED" />
|
||||
<el-option label="冻结中" value="FROZEN" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="备注">
|
||||
@@ -74,7 +78,7 @@
|
||||
<el-button size="small" link type="primary" @click="onAudit(row)">审核</el-button>
|
||||
<el-button size="small" link @click="onDownload(row, 'labor')">劳务下载</el-button>
|
||||
<el-button size="small" link @click="onDownload(row, 'meeting')">会务下载</el-button>
|
||||
<el-button size="small" link type="danger" :disabled="row.currentStage !== '冻结中'" @click="onUnfreeze(row)">解冻</el-button>
|
||||
<el-button size="small" link type="danger" :disabled="row.currentStage !== 'FROZEN'" @click="onUnfreeze(row)">解冻</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
@@ -160,6 +164,7 @@
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useRoute } from 'vue-router'
|
||||
import { bizList, bizUpdate } from '@/api/public'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
|
||||
@@ -185,6 +190,14 @@ const unfreezeOpen = ref(false)
|
||||
const unfreezeRow = ref(null)
|
||||
const unfreezeSubmitting = ref(false)
|
||||
|
||||
// 读 URL query 写入 q (Home KPI 卡跳转时带 ?currentStage=RUNNING/NOT_STARTED, 让列表页自动应用筛选)
|
||||
// 只读不改 URL — Home 是 source of truth, 列表页内 reset()/search 不反向写 URL
|
||||
const route = useRoute()
|
||||
function readQueryFromRoute() {
|
||||
const q2 = route.query
|
||||
if (q2.currentStage != null && q2.currentStage !== '') q.currentStage = String(q2.currentStage)
|
||||
}
|
||||
|
||||
async function loadList() {
|
||||
loading.value = true
|
||||
try {
|
||||
@@ -253,12 +266,12 @@ async function submitAudit() {
|
||||
}
|
||||
|
||||
function canSettle(row) {
|
||||
return row && ['未执行', '执行中'].includes(row.currentStage)
|
||||
return row && ['NOT_STARTED', 'RUNNING'].includes(row.currentStage)
|
||||
}
|
||||
function onSettle(row) {
|
||||
ElMessageBox.confirm(`确定发起「${row.meetingName}」结算吗?`, '结算', { type: 'warning' })
|
||||
.then(async () => {
|
||||
await bizUpdate('meeting', { meetingId: row.meetingId, currentStage: '已完结' })
|
||||
await bizUpdate('meeting', { meetingId: row.meetingId, currentStage: 'SETTLED' })
|
||||
ElMessage.success('已发起结算')
|
||||
loadList()
|
||||
}).catch(() => {})
|
||||
@@ -278,7 +291,7 @@ async function submitUnfreeze() {
|
||||
if (!unfreezeRow.value) return
|
||||
unfreezeSubmitting.value = true
|
||||
try {
|
||||
await bizUpdate('meeting', { meetingId: unfreezeRow.value.meetingId, currentStage: '执行中' })
|
||||
await bizUpdate('meeting', { meetingId: unfreezeRow.value.meetingId, currentStage: 'RUNNING' })
|
||||
ElMessage.success('解冻成功')
|
||||
unfreezeOpen.value = false
|
||||
loadList()
|
||||
@@ -304,7 +317,7 @@ function calcRemain(row) {
|
||||
return h > 24 ? `${Math.floor(h/24)}天${h%24}小时` : `${h}小时`
|
||||
}
|
||||
|
||||
onMounted(loadList)
|
||||
onMounted(() => { readQueryFromRoute(); loadList() })
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
Reference in New Issue
Block a user