feat: add syj promote workflow

This commit is contained in:
apple
2026-05-03 14:44:12 +08:00
parent 12c2431d4e
commit 0e07a65e3f
36 changed files with 1972 additions and 1 deletions

View File

@@ -0,0 +1,80 @@
<template>
<view class="page">
<view class="card">
<view class="title">{{ detail.task_no }}</view>
<view class="status">{{ statusText(detail.status) }}</view>
<view class="amount">¥{{ detail.base_amount || '0.00' }}</view>
<view class="progress">
<view class="bar"><view :style="{width: progressWidth}"></view></view>
<text>{{ detail.progress_count || 0 }}/{{ detail.target_count || 4 }}</text>
</view>
</view>
<view class="card">
<view class="section-title">推荐进度</view>
<view class="record" v-for="item in records" :key="item.id">
<text> {{ item.step_no }} </text>
<text>{{ item.order_no }}</text>
</view>
<view v-if="!records.length" class="empty">暂无推荐订单</view>
</view>
<button v-if="canCashout" class="cashout" @tap="cashout">申请提前兑现</button>
</view>
</template>
<script>
import { getSyjTaskDetail, applySyjCashout } from '@/api/syjPromote.js';
export default {
data() {
return { id: 0, detail: {} };
},
computed: {
records() {
return this.detail.records || [];
},
canCashout() {
const progress = Number(this.detail.progress_count || 0);
return Number(this.detail.status) === 0 && progress >= 1 && progress <= 3;
},
progressWidth() {
const total = Number(this.detail.target_count || 4);
return `${Math.min(100, Number(this.detail.progress_count || 0) / total * 100)}%`;
}
},
onLoad(options) {
this.id = Number(options.id || 0);
this.load();
},
methods: {
load() {
getSyjTaskDetail(this.id).then(res => {
this.detail = res.data || res;
});
},
cashout() {
applySyjCashout(this.id).then(() => {
uni.showToast({ title: '已提交审核' });
this.load();
});
},
statusText(status) {
return ['进行中', '已完成', '提前兑现', '已关闭', '异常', '审核中'][Number(status)] || '未知';
}
}
};
</script>
<style scoped>
.page{min-height:100vh;background:#f6f7f9;padding:24rpx;}
.card{background:#fff;border-radius:16rpx;padding:30rpx;margin-bottom:20rpx;}
.title{font-size:30rpx;color:#222;font-weight:600;}
.status{font-size:26rpx;color:#0f8f6f;margin-top:12rpx;}
.amount{font-size:52rpx;color:#111;font-weight:600;margin:28rpx 0;}
.progress{display:flex;align-items:center;gap:20rpx;}
.bar{flex:1;height:12rpx;background:#edf0f2;border-radius:12rpx;overflow:hidden;}
.bar view{height:100%;background:#0f8f6f;}
.section-title{font-size:30rpx;font-weight:600;margin-bottom:20rpx;}
.record{display:flex;justify-content:space-between;font-size:26rpx;color:#555;padding:20rpx 0;border-bottom:1px solid #f0f0f0;}
.empty{text-align:center;color:#999;font-size:26rpx;padding:40rpx 0;}
.cashout{height:88rpx;line-height:88rpx;border-radius:44rpx;background:#0f8f6f;color:#fff;font-size:30rpx;}
</style>

View File

@@ -0,0 +1,108 @@
<template>
<view class="page">
<view class="summary">
<view class="summary-title">我的推广任务</view>
<view class="summary-amount">¥{{ overview.pending_amount || '0.00' }}</view>
<view class="summary-sub">待推广金额 / ¥{{ overview.base_amount || '4333.00' }} 生成 1 个任务</view>
<view class="summary-grid">
<view><text>{{ overview.active_task_count || 0 }}</text><text>进行中</text></view>
<view><text>{{ overview.completed_task_count || 0 }}</text><text>已完成</text></view>
<view><text>{{ overview.cashout_task_count || 0 }}</text><text>已兑现</text></view>
</view>
</view>
<view class="tabs">
<view v-for="tab in tabs" :key="tab.value" :class="{active: status === tab.value}" @tap="switchTab(tab.value)">{{ tab.label }}</view>
</view>
<view class="task" v-for="item in list" :key="item.id" @tap="goDetail(item.id)">
<view class="task-head">
<text>{{ item.task_no }}</text>
<text>{{ statusText(item.status) }}</text>
</view>
<view class="progress">
<view class="bar"><view :style="{width: progressWidth(item)}"></view></view>
<text>{{ item.progress_count }}/{{ item.target_count }}</text>
</view>
<view class="task-meta">来源订单{{ item.source_order_no }}</view>
<view class="task-meta">任务金额¥{{ item.base_amount }}</view>
</view>
<view v-if="!list.length && !loading" class="empty">暂无推广任务</view>
</view>
</template>
<script>
import { getSyjOverview, getSyjTaskList } from '@/api/syjPromote.js';
export default {
data() {
return {
overview: {},
list: [],
loading: false,
status: '',
page: 1,
tabs: [
{ label: '全部', value: '' },
{ label: '进行中', value: 0 },
{ label: '已完成', value: 1 },
{ label: '已兑现', value: 2 },
{ label: '异常', value: 4 }
]
};
},
onShow() {
this.load();
},
methods: {
load() {
this.loading = true;
Promise.all([
getSyjOverview(),
getSyjTaskList({ status: this.status, page: this.page, limit: 20 })
]).then(([overview, tasks]) => {
this.overview = overview.data || overview;
const data = tasks.data || tasks;
this.list = data.list || [];
}).finally(() => {
this.loading = false;
});
},
switchTab(value) {
this.status = value;
this.page = 1;
this.load();
},
goDetail(id) {
uni.navigateTo({ url: `/pages/syj/promote_task/detail?id=${id}` });
},
progressWidth(item) {
const total = Number(item.target_count || 4);
return `${Math.min(100, Number(item.progress_count || 0) / total * 100)}%`;
},
statusText(status) {
return ['进行中', '已完成', '提前兑现', '已关闭', '异常', '审核中'][Number(status)] || '未知';
}
}
};
</script>
<style scoped>
.page{min-height:100vh;background:#f6f7f9;padding:24rpx;}
.summary{background:#fff;border-radius:16rpx;padding:32rpx;}
.summary-title{font-size:30rpx;color:#333;}
.summary-amount{font-size:56rpx;font-weight:600;color:#0f8f6f;margin-top:20rpx;}
.summary-sub{font-size:24rpx;color:#777;margin-top:8rpx;}
.summary-grid{display:flex;margin-top:28rpx;border-top:1px solid #eee;padding-top:24rpx;}
.summary-grid view{flex:1;display:flex;flex-direction:column;gap:8rpx;font-size:24rpx;color:#777;}
.summary-grid text:first-child{font-size:34rpx;color:#222;font-weight:600;}
.tabs{display:flex;gap:16rpx;margin:24rpx 0;overflow-x:auto;}
.tabs view{white-space:nowrap;background:#fff;border-radius:999rpx;padding:14rpx 24rpx;font-size:26rpx;color:#555;}
.tabs .active{background:#0f8f6f;color:#fff;}
.task{background:#fff;border-radius:16rpx;padding:28rpx;margin-bottom:20rpx;}
.task-head{display:flex;justify-content:space-between;font-size:28rpx;color:#222;}
.task-head text:last-child{color:#0f8f6f;}
.progress{display:flex;align-items:center;gap:20rpx;margin:24rpx 0;}
.bar{flex:1;height:12rpx;background:#edf0f2;border-radius:12rpx;overflow:hidden;}
.bar view{height:100%;background:#0f8f6f;}
.task-meta{font-size:24rpx;color:#777;line-height:38rpx;}
.empty{text-align:center;color:#999;font-size:28rpx;padding:80rpx 0;}
</style>