Merge remote-tracking branch 'origin/syj-bypass-auth' into syj-bypass-auth
This commit is contained in:
37
pro_v3.5.1/view/admin/src/api/syjPromote.js
Normal file
37
pro_v3.5.1/view/admin/src/api/syjPromote.js
Normal file
@@ -0,0 +1,37 @@
|
||||
import request from '@/plugins/request';
|
||||
|
||||
export function taskListApi(params) {
|
||||
return request({ url: 'syj/promote/task/list', method: 'get', params });
|
||||
}
|
||||
|
||||
export function taskDetailApi(id) {
|
||||
return request({ url: `syj/promote/task/${id}`, method: 'get' });
|
||||
}
|
||||
|
||||
export function taskRecordsApi(id) {
|
||||
return request({ url: `syj/promote/task/${id}/records`, method: 'get' });
|
||||
}
|
||||
|
||||
export function cashoutListApi(params) {
|
||||
return request({ url: 'syj/promote/cashout/list', method: 'get', params });
|
||||
}
|
||||
|
||||
export function auditCashoutApi(id, data) {
|
||||
return request({ url: `syj/promote/cashout/${id}/audit`, method: 'post', data });
|
||||
}
|
||||
|
||||
export function settlementListApi(params) {
|
||||
return request({ url: 'syj/promote/settlement/list', method: 'get', params });
|
||||
}
|
||||
|
||||
export function configGetApi() {
|
||||
return request({ url: 'syj/promote/config', method: 'get' });
|
||||
}
|
||||
|
||||
export function configSaveApi(data) {
|
||||
return request({ url: 'syj/promote/config', method: 'post', data });
|
||||
}
|
||||
|
||||
export function retryTriggerApi(taskId) {
|
||||
return request({ url: `syj/promote/retry-trigger/${taskId}`, method: 'post' });
|
||||
}
|
||||
68
pro_v3.5.1/view/admin/src/pages/syj/cashout/index.vue
Normal file
68
pro_v3.5.1/view/admin/src/pages/syj/cashout/index.vue
Normal file
@@ -0,0 +1,68 @@
|
||||
<template>
|
||||
<div>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt" :padding="0">
|
||||
<div class="new_card_pd">
|
||||
<Form inline @submit.native.prevent>
|
||||
<FormItem label="关键词:"><Input v-model="query.keyword" placeholder="任务号/用户" class="input-add" clearable /></FormItem>
|
||||
<FormItem label="状态:">
|
||||
<Select v-model="query.audit_status" class="input-add" clearable>
|
||||
<Option :value="0">待审核</Option>
|
||||
<Option :value="1">已通过</Option>
|
||||
<Option :value="2">已拒绝</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem><Button type="primary" @click="getList">查询</Button></FormItem>
|
||||
</Form>
|
||||
</div>
|
||||
</Card>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt">
|
||||
<Table :columns="columns" :data="list" :loading="loading">
|
||||
<template slot-scope="{ row }" slot="amount">¥{{ row.net_amount }} / 应结 ¥{{ row.gross_amount }}</template>
|
||||
<template slot-scope="{ row }" slot="status">{{ ['待审核','已通过','已拒绝'][row.audit_status] }}</template>
|
||||
<template slot-scope="{ row }" slot="action">
|
||||
<Button v-if="row.audit_status == 0" size="small" type="primary" @click="audit(row, 1)">通过</Button>
|
||||
<Button v-if="row.audit_status == 0" size="small" class="ivu-ml-8" @click="audit(row, 2)">拒绝</Button>
|
||||
</template>
|
||||
</Table>
|
||||
</Card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { cashoutListApi, auditCashoutApi } from '@/api/syjPromote.js';
|
||||
|
||||
export default {
|
||||
name: 'SyjCashout',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
list: [],
|
||||
query: { keyword: '', audit_status: 0, page: 1, limit: 20 },
|
||||
columns: [
|
||||
{ title: '任务号', key: 'task_no', minWidth: 180 },
|
||||
{ title: '用户', key: 'nickname', minWidth: 140 },
|
||||
{ title: '到账/应结', slot: 'amount', minWidth: 160 },
|
||||
{ title: '扣费', key: 'fee_amount', width: 100 },
|
||||
{ title: '状态', slot: 'status', width: 100 },
|
||||
{ title: '操作', slot: 'action', width: 160 }
|
||||
]
|
||||
};
|
||||
},
|
||||
created() { this.getList(); },
|
||||
methods: {
|
||||
getList() {
|
||||
this.loading = true;
|
||||
cashoutListApi(this.query).then(res => {
|
||||
const data = res.data || res;
|
||||
this.list = data.list || [];
|
||||
}).finally(() => { this.loading = false; });
|
||||
},
|
||||
audit(row, status) {
|
||||
auditCashoutApi(row.id, { status, remark: status === 1 ? '审核通过' : '审核拒绝' }).then(() => {
|
||||
this.$Message.success('审核成功');
|
||||
this.getList();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
63
pro_v3.5.1/view/admin/src/pages/syj/config/index.vue
Normal file
63
pro_v3.5.1/view/admin/src/pages/syj/config/index.vue
Normal file
@@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt">
|
||||
<p slot="title">芍药居任务配置</p>
|
||||
<Spin v-if="loading" fix />
|
||||
<Form v-else :model="form" :label-width="180" @submit.native.prevent>
|
||||
<FormItem label="任务基准金额"><InputNumber v-model="form.base_amount" :min="1" style="width:180px" /></FormItem>
|
||||
<FormItem label="目标单数"><InputNumber v-model="form.target_count" :min="1" :precision="0" style="width:180px" /></FormItem>
|
||||
<FormItem label="奖励比例"><Input v-model="ratesText" placeholder="10,20,30,40" style="width:260px" /></FormItem>
|
||||
<FormItem label="提前兑现扣费比例"><InputNumber v-model="form.early_cashout_fee_rate" :min="0" :max="100" style="width:180px" /></FormItem>
|
||||
<FormItem label="任务生成节点">
|
||||
<RadioGroup v-model="form.task_generate_timing">
|
||||
<Radio label="on_confirm">确认收货</Radio>
|
||||
<Radio label="on_pay">支付成功</Radio>
|
||||
</RadioGroup>
|
||||
</FormItem>
|
||||
<FormItem label="奖励触发"><i-switch v-model="form.reward_trigger_enable" :true-value="1" :false-value="0" /></FormItem>
|
||||
<FormItem><Button type="primary" :loading="saving" @click="save">保存</Button></FormItem>
|
||||
</Form>
|
||||
</Card>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { configGetApi, configSaveApi } from '@/api/syjPromote.js';
|
||||
|
||||
export default {
|
||||
name: 'SyjConfig',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
saving: false,
|
||||
ratesText: '10,20,30,40',
|
||||
form: {
|
||||
base_amount: 4333,
|
||||
target_count: 4,
|
||||
reward_rates: [10, 20, 30, 40],
|
||||
early_cashout_fee_rate: 7,
|
||||
task_generate_timing: 'on_confirm',
|
||||
task_order_dedupe: 'order',
|
||||
reward_trigger_enable: 1
|
||||
}
|
||||
};
|
||||
},
|
||||
created() { this.load(); },
|
||||
methods: {
|
||||
load() {
|
||||
this.loading = true;
|
||||
configGetApi().then(res => {
|
||||
this.form = Object.assign(this.form, res.data || res);
|
||||
this.ratesText = (this.form.reward_rates || []).join(',');
|
||||
}).finally(() => { this.loading = false; });
|
||||
},
|
||||
save() {
|
||||
this.saving = true;
|
||||
const data = Object.assign({}, this.form, {
|
||||
reward_rates: this.ratesText.split(',').map(item => Number(item.trim())).filter(item => !Number.isNaN(item))
|
||||
});
|
||||
configSaveApi(data).then(() => {
|
||||
this.$Message.success('保存成功');
|
||||
}).finally(() => { this.saving = false; });
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
109
pro_v3.5.1/view/admin/src/pages/syj/promoteTask/index.vue
Normal file
109
pro_v3.5.1/view/admin/src/pages/syj/promoteTask/index.vue
Normal file
@@ -0,0 +1,109 @@
|
||||
<template>
|
||||
<div>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt" :padding="0">
|
||||
<div class="new_card_pd">
|
||||
<Form inline @submit.native.prevent>
|
||||
<FormItem label="关键词:">
|
||||
<Input v-model="query.keyword" placeholder="任务号/订单号/用户" class="input-add" clearable />
|
||||
</FormItem>
|
||||
<FormItem label="状态:">
|
||||
<Select v-model="query.status" class="input-add" clearable>
|
||||
<Option :value="0">进行中</Option>
|
||||
<Option :value="1">已完成</Option>
|
||||
<Option :value="2">提前兑现</Option>
|
||||
<Option :value="4">异常</Option>
|
||||
<Option :value="5">审核中</Option>
|
||||
</Select>
|
||||
</FormItem>
|
||||
<FormItem>
|
||||
<Button type="primary" class="mr14" @click="getList">查询</Button>
|
||||
<Button @click="reset">重置</Button>
|
||||
</FormItem>
|
||||
</Form>
|
||||
</div>
|
||||
</Card>
|
||||
<Card :bordered="false" dis-hover class="ivu-mt">
|
||||
<Table :columns="columns" :data="list" :loading="loading">
|
||||
<template slot-scope="{ row }" slot="status">{{ statusText(row.status) }}</template>
|
||||
<template slot-scope="{ row }" slot="progress">{{ row.progress_count }}/{{ row.target_count }}</template>
|
||||
<template slot-scope="{ row }" slot="amount">¥{{ Number(row.base_amount).toFixed(2) }}</template>
|
||||
<template slot-scope="{ row }" slot="action">
|
||||
<Button size="small" type="primary" @click="showDetail(row)">详情</Button>
|
||||
<Button v-if="row.reward_trigger_status == 2" size="small" class="ivu-ml-8" @click="retry(row)">重试奖励</Button>
|
||||
</template>
|
||||
</Table>
|
||||
<Page class="mt20" :total="total" :current="query.page" :page-size="query.limit" show-total @on-change="p => { query.page = p; getList(); }" />
|
||||
</Card>
|
||||
<Modal v-model="detailVisible" width="720" title="推广任务详情">
|
||||
<pre class="detail-json">{{ detail }}</pre>
|
||||
</Modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { taskListApi, taskDetailApi, retryTriggerApi } from '@/api/syjPromote.js';
|
||||
|
||||
export default {
|
||||
name: 'SyjPromoteTask',
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
detailVisible: false,
|
||||
detail: '',
|
||||
total: 0,
|
||||
list: [],
|
||||
query: { keyword: '', status: '', page: 1, limit: 20 },
|
||||
columns: [
|
||||
{ title: '任务号', key: 'task_no', minWidth: 180 },
|
||||
{ title: '用户', key: 'nickname', minWidth: 140 },
|
||||
{ title: '来源订单', key: 'source_order_no', minWidth: 160 },
|
||||
{ title: '金额', slot: 'amount', width: 110 },
|
||||
{ title: '进度', slot: 'progress', width: 90 },
|
||||
{ title: '状态', slot: 'status', width: 100 },
|
||||
{ title: '创建时间', key: 'add_time', width: 140 },
|
||||
{ title: '操作', slot: 'action', width: 180, fixed: 'right' }
|
||||
]
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
getList() {
|
||||
this.loading = true;
|
||||
taskListApi(this.query).then(res => {
|
||||
const data = res.data || res;
|
||||
this.list = data.list || [];
|
||||
this.total = data.count || 0;
|
||||
}).finally(() => { this.loading = false; });
|
||||
},
|
||||
reset() {
|
||||
this.query = { keyword: '', status: '', page: 1, limit: 20 };
|
||||
this.getList();
|
||||
},
|
||||
showDetail(row) {
|
||||
taskDetailApi(row.id).then(res => {
|
||||
this.detail = JSON.stringify(res.data || res, null, 2);
|
||||
this.detailVisible = true;
|
||||
});
|
||||
},
|
||||
retry(row) {
|
||||
retryTriggerApi(row.id).then(() => {
|
||||
this.$Message.success('重试完成');
|
||||
this.getList();
|
||||
});
|
||||
},
|
||||
statusText(status) {
|
||||
return ['进行中', '已完成', '提前兑现', '已关闭', '异常', '审核中'][Number(status)] || '未知';
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.detail-json {
|
||||
max-height: 520px;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
</style>
|
||||
34
pro_v3.5.1/view/admin/src/router/modules/syj.js
Normal file
34
pro_v3.5.1/view/admin/src/router/modules/syj.js
Normal file
@@ -0,0 +1,34 @@
|
||||
import BasicLayout from '@/layouts/basic-layout';
|
||||
|
||||
const pre = 'syj_';
|
||||
|
||||
export default {
|
||||
path: '/admin/syj',
|
||||
name: 'syj',
|
||||
header: 'syj',
|
||||
meta: {
|
||||
auth: ['admin-syj'],
|
||||
title: '芍药居'
|
||||
},
|
||||
component: BasicLayout,
|
||||
children: [
|
||||
{
|
||||
path: 'promote/task',
|
||||
name: `${pre}promoteTask`,
|
||||
meta: { auth: ['syj-promote-task'], title: '推广任务' },
|
||||
component: () => import('@/pages/syj/promoteTask/index')
|
||||
},
|
||||
{
|
||||
path: 'promote/cashout',
|
||||
name: `${pre}cashout`,
|
||||
meta: { auth: ['syj-promote-cashout'], title: '提前兑现审核' },
|
||||
component: () => import('@/pages/syj/cashout/index')
|
||||
},
|
||||
{
|
||||
path: 'promote/config',
|
||||
name: `${pre}config`,
|
||||
meta: { auth: ['syj-promote-config'], title: '任务配置' },
|
||||
component: () => import('@/pages/syj/config/index')
|
||||
}
|
||||
]
|
||||
};
|
||||
@@ -26,6 +26,7 @@ import work from "./modules/work";
|
||||
import content from "./modules/content";
|
||||
import inventory from "./modules/inventory";
|
||||
import hjfQueue from "./modules/hjfCustom.js";
|
||||
import syj from "./modules/syj.js";
|
||||
import { isSupplierPath } from "@/utils/pathUtils";
|
||||
|
||||
/**
|
||||
@@ -210,7 +211,8 @@ const frameIn = [
|
||||
work,
|
||||
content,
|
||||
inventory,
|
||||
hjfQueue
|
||||
hjfQueue,
|
||||
syj
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
25
pro_v3.5.1/view/uniapp/api/syjPromote.js
Normal file
25
pro_v3.5.1/view/uniapp/api/syjPromote.js
Normal file
@@ -0,0 +1,25 @@
|
||||
import request from '@/utils/request.js';
|
||||
|
||||
export function getSyjOverview() {
|
||||
return request.get('syj/promote/overview');
|
||||
}
|
||||
|
||||
export function getSyjTaskList(params) {
|
||||
return request.get('syj/promote/task/list', params);
|
||||
}
|
||||
|
||||
export function getSyjTaskDetail(id) {
|
||||
return request.get(`syj/promote/task/${id}`);
|
||||
}
|
||||
|
||||
export function applySyjCashout(id) {
|
||||
return request.post(`syj/promote/task/${id}/cashout`);
|
||||
}
|
||||
|
||||
export function getSyjAmountLog(params) {
|
||||
return request.get('syj/promote/amount/log', params);
|
||||
}
|
||||
|
||||
export function getSyjSettlementList(params) {
|
||||
return request.get('syj/promote/settlement/list', params);
|
||||
}
|
||||
@@ -133,6 +133,18 @@
|
||||
"titleNView": false
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/syj/promote_task/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "我的推广任务"
|
||||
}
|
||||
},
|
||||
{
|
||||
"path": "pages/syj/promote_task/detail",
|
||||
"style": {
|
||||
"navigationBarTitleText": "任务详情"
|
||||
}
|
||||
}
|
||||
],
|
||||
// "plugins": {
|
||||
|
||||
80
pro_v3.5.1/view/uniapp/pages/syj/promote_task/detail.vue
Normal file
80
pro_v3.5.1/view/uniapp/pages/syj/promote_task/detail.vue
Normal 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>
|
||||
108
pro_v3.5.1/view/uniapp/pages/syj/promote_task/index.vue
Normal file
108
pro_v3.5.1/view/uniapp/pages/syj/promote_task/index.vue
Normal 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>
|
||||
Reference in New Issue
Block a user