This commit is contained in:
parent
38a6f53380
commit
bc0e6ba142
|
@ -161,7 +161,16 @@ export const asyncRoutes = [
|
||||||
title: '流转订单',
|
title: '流转订单',
|
||||||
roles: ['order_back', 'editor']
|
roles: ['order_back', 'editor']
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'product',
|
||||||
|
component: () => import('@/views/order/product'),
|
||||||
|
name: 'productNameList',
|
||||||
|
meta: {
|
||||||
|
title: '产品统计列表',
|
||||||
|
roles: ['order_pub', 'editor']
|
||||||
}
|
}
|
||||||
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,58 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
|
||||||
|
<div class="card-panel">
|
||||||
|
<div class="card-panel-icon-wrapper icon-shopping">
|
||||||
|
<svg-icon icon-class="shopping" class-name="card-panel-icon" />
|
||||||
|
</div>
|
||||||
|
<div class="card-panel-description">
|
||||||
|
<div class="card-panel-text">
|
||||||
|
核销订单数
|
||||||
|
</div>
|
||||||
|
<count-to :start-val="0" :end-val="asset" :duration="1" class="card-panel-num" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
|
||||||
|
<div class="card-panel">
|
||||||
|
<div class="card-panel-icon-wrapper icon-shopping">
|
||||||
|
<svg-icon icon-class="shopping" class-name="card-panel-icon" />
|
||||||
|
</div>
|
||||||
|
<div class="card-panel-description">
|
||||||
|
<div class="card-panel-text">
|
||||||
|
核销订单金额
|
||||||
|
</div>
|
||||||
|
<count-to :start-val="0" :end-val="asset_price" :duration="10" class="card-panel-num" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
|
||||||
|
<div class="card-panel">
|
||||||
|
<div class="card-panel-icon-wrapper icon-shopping">
|
||||||
|
<svg-icon icon-class="shopping" class-name="card-panel-icon" />
|
||||||
|
</div>
|
||||||
|
<div class="card-panel-description">
|
||||||
|
<div class="card-panel-text">
|
||||||
|
退款订单数
|
||||||
|
</div>
|
||||||
|
<count-to :start-val="0" :end-val="refund" :duration="10" class="card-panel-num" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :xs="12" :sm="12" :lg="6" class="card-panel-col">
|
||||||
|
<div class="card-panel">
|
||||||
|
<div class="card-panel-icon-wrapper icon-shopping">
|
||||||
|
<svg-icon icon-class="shopping" class-name="card-panel-icon" />
|
||||||
|
</div>
|
||||||
|
<div class="card-panel-description">
|
||||||
|
<div class="card-panel-text">
|
||||||
|
退款订单金额
|
||||||
|
</div>
|
||||||
|
<count-to :start-val="0" :end-val="refund_price" :duration="10" class="card-panel-num" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -67,7 +119,11 @@ export default {
|
||||||
wait:0,
|
wait:0,
|
||||||
doing:0,
|
doing:0,
|
||||||
all:0,
|
all:0,
|
||||||
total:0
|
total:0,
|
||||||
|
asset:0,
|
||||||
|
asset_price:0,
|
||||||
|
refund:0,
|
||||||
|
refund_price:0
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
@ -77,6 +133,10 @@ export default {
|
||||||
this.doing = parseFloat(res.data.doing)
|
this.doing = parseFloat(res.data.doing)
|
||||||
this.all = parseFloat(res.data.all)
|
this.all = parseFloat(res.data.all)
|
||||||
this.total = parseFloat(res.data.total)/100
|
this.total = parseFloat(res.data.total)/100
|
||||||
|
this.asset = parseFloat(res.data.asset)
|
||||||
|
this.asset_price = parseFloat(res.data.asset_price)/100
|
||||||
|
this.refund = parseFloat(res.data.refund)
|
||||||
|
this.refund_price = parseFloat(res.data.refund_price)/100
|
||||||
}).catch(err=>{
|
}).catch(err=>{
|
||||||
console.log(err)
|
console.log(err)
|
||||||
})
|
})
|
||||||
|
|
|
@ -0,0 +1,125 @@
|
||||||
|
<template>
|
||||||
|
|
||||||
|
<div class="app-container">
|
||||||
|
<div class="filter-container">
|
||||||
|
<el-input v-model="listQuery.product_name" placeholder="产品名称" style="width: 200px;" class="filter-item" />
|
||||||
|
|
||||||
|
<el-cascader
|
||||||
|
v-model="listQuery.os_status"
|
||||||
|
placeholder="平台状态"
|
||||||
|
:options="os_arr"
|
||||||
|
class="filter-item"
|
||||||
|
@change="handleChange"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<el-button class="filter-item" type="primary" icon="el-icon-search" @click="getList">
|
||||||
|
搜索
|
||||||
|
</el-button>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-table v-loading="listLoading" :data="list" border fit highlight-current-row style="width: 100%">
|
||||||
|
|
||||||
|
<el-table-column align="center" fixed label="产品名称" width="220" prop="product_name" />
|
||||||
|
|
||||||
|
<el-table-column align="center" fixed label="平台" width="80" prop="os" />
|
||||||
|
|
||||||
|
<el-table-column align="center" fixed label="订单数" width="80" prop="all" />
|
||||||
|
|
||||||
|
<el-table-column align="center" label="订单金额" width="180" prop="total" />
|
||||||
|
|
||||||
|
<el-table-column align="center" width="500px" label="待跟进" prop="wait" />
|
||||||
|
|
||||||
|
<el-table-column width="138px" align="center" label="跟进中" prop="doing" />
|
||||||
|
|
||||||
|
<el-table-column align="center" width="500px" label="核销数" prop="asset" />
|
||||||
|
|
||||||
|
<el-table-column width="138px" align="center" label="核销金额" prop="asset_price" />
|
||||||
|
|
||||||
|
<el-table-column align="center" width="500px" label="退款数" prop="asset" />
|
||||||
|
|
||||||
|
<el-table-column width="138px" align="center" label="退款金额" prop="asset_price" />
|
||||||
|
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="listQuery.page"
|
||||||
|
:limit.sync="listQuery.limit"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
// import Pagination from '@/components/Pagination'
|
||||||
|
import Pagination from '@/components/PaginationFixed'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'productNameList',
|
||||||
|
components: { Pagination },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
active: 'follow',
|
||||||
|
types: { 0: '', 1: '', 2: '', 3: 'primary', 4: 'success', 5: 'warning' },
|
||||||
|
types2: { 1: 'primary', 2: 'success', 3: 'warning' },
|
||||||
|
status_arr: ['待跟进', '跟进中', '已核销', '核销失败', '放弃跟单'],
|
||||||
|
type_arr: ['-', '收益', '支出'],
|
||||||
|
timetype_arr: {},
|
||||||
|
order_status: ['#9e9f9c', '#04bcd9', '#fc9904', '#1193f4', '#48b14b', '#eb1662', '#9d1cb5'],
|
||||||
|
follow_status: ['#9e9f9c', '#04bcd9', '#fc9904', '#1193f4', '#48b14b', '#eb1662'],
|
||||||
|
options: [],
|
||||||
|
list: [],
|
||||||
|
total: 0,
|
||||||
|
listLoading: true,
|
||||||
|
listQuery: {
|
||||||
|
page: 1,
|
||||||
|
limit: 10,
|
||||||
|
product_name: ''
|
||||||
|
},
|
||||||
|
os_arr: { 1: '美团', 2: '快手', 3: '抖音' },
|
||||||
|
form: {},
|
||||||
|
rules:{
|
||||||
|
flowObj: [
|
||||||
|
{ required: true, message: '请选择活动区域', trigger: 'change' }
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.listQuery.status = this.$route.query.status || null
|
||||||
|
this.listQuery.zhubo = this.$route.query.zhubo || null
|
||||||
|
if (this.$route.query.start && this.$route.query.end) {
|
||||||
|
this.listQuery.times = [this.$route.query.start, this.$route.query.end]
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getList()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getList() {
|
||||||
|
this.$axios.get('/admin/index/productNameList', { params: this.listQuery }).then(response => {
|
||||||
|
this.list = response.data.data
|
||||||
|
this.total = response.data.total
|
||||||
|
this.timetype_arr = response.ext.timetype
|
||||||
|
this.oss = response.ext.oss
|
||||||
|
this.listLoading = false
|
||||||
|
}).catch(() => {
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.app-container {
|
||||||
|
position: relative;
|
||||||
|
padding-bottom: 60px; /* 分页条的高度 */
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-container,
|
||||||
|
.el-table {
|
||||||
|
padding-bottom: 52px; /* 分页条的高度,以避免内容重叠 */
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,4 +1,5 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace app\admin\controller;
|
namespace app\admin\controller;
|
||||||
|
|
||||||
use app\model\Admins;
|
use app\model\Admins;
|
||||||
|
@ -7,13 +8,15 @@ use app\model\Finances;
|
||||||
use app\model\Onlines;
|
use app\model\Onlines;
|
||||||
use app\model\Orders;
|
use app\model\Orders;
|
||||||
use Qiniu\Auth;
|
use Qiniu\Auth;
|
||||||
|
use support\Log;
|
||||||
use support\Redis;
|
use support\Redis;
|
||||||
use support\Request;
|
use support\Request;
|
||||||
|
|
||||||
class IndexController extends base
|
class IndexController extends base
|
||||||
{
|
{
|
||||||
|
|
||||||
public function isWork(Request $request) {
|
public function isWork(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$lastTime = Redis::get('CRM:USER:ONLINE:' . $request->admin->id);
|
$lastTime = Redis::get('CRM:USER:ONLINE:' . $request->admin->id);
|
||||||
$end = Redis::hGet('CRM:USER:ONLINE:END', $request->admin->id);
|
$end = Redis::hGet('CRM:USER:ONLINE:END', $request->admin->id);
|
||||||
|
@ -50,7 +53,6 @@ class IndexController extends base
|
||||||
Redis::hSet('CRM:USER:ONLINE:END', $request->admin->id, time() + 60);
|
Redis::hSet('CRM:USER:ONLINE:END', $request->admin->id, time() + 60);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$new = Redis::get('CRM:USER:ONLINE:NEW:' . $request->admin->id);
|
$new = Redis::get('CRM:USER:ONLINE:NEW:' . $request->admin->id);
|
||||||
Redis::del('CRM:USER:ONLINE:NEW:' . $request->admin->id);
|
Redis::del('CRM:USER:ONLINE:NEW:' . $request->admin->id);
|
||||||
$back = Redis::set('CRM:USER:ONLINE:FOLLOW:LOCK:' . $request->admin->id, time(), 'EX', 60, 'nx');
|
$back = Redis::set('CRM:USER:ONLINE:FOLLOW:LOCK:' . $request->admin->id, time(), 'EX', 60, 'nx');
|
||||||
|
@ -63,7 +65,8 @@ class IndexController extends base
|
||||||
return $this->success(['new' => $new ?? 0, 'follow' => $follow, 'back' => $backs]);
|
return $this->success(['new' => $new ?? 0, 'follow' => $follow, 'back' => $backs]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function line() {
|
public function line()
|
||||||
|
{
|
||||||
$time = strtotime(date('Y-m-d'));
|
$time = strtotime(date('Y-m-d'));
|
||||||
$data = [];
|
$data = [];
|
||||||
for ($i = 10; $i > 0; $i--) {
|
for ($i = 10; $i > 0; $i--) {
|
||||||
|
@ -84,14 +87,42 @@ class IndexController extends base
|
||||||
return $this->success($_data);
|
return $this->success($_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function orders(Request $request) {
|
public function orders(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$order = Orders::where('admin_id', $request->admin->id)->fieldRaw('SUM(IF(status=0,1,0)) as wait, SUM(IF(status=1,1,0)) as doing, SUM(total_price) as total,count(id) as `all`')->find();
|
$order = Orders::where('admin_id', $request->admin->id)->fieldRaw('
|
||||||
|
SUM(IF(status=0,1,0)) as wait,
|
||||||
|
SUM(IF(status=1,1,0)) as doing,
|
||||||
|
SUM(total_price) as total,
|
||||||
|
count(id) as `all`,
|
||||||
|
SUM(IF(asset_price>0 AND status=2,1,0)) as asset,
|
||||||
|
SUM(IF(asset_price>0 AND status=2,asset_price,0)) as asset_price,
|
||||||
|
SUM(CASE
|
||||||
|
WHEN (os = 1 AND STATUS = 5) OR (os = 3 AND STATUS = 4) OR (os = 2 AND STATUS = 1) THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END) AS refund,
|
||||||
|
SUM(CASE
|
||||||
|
WHEN (os = 1 AND STATUS = 5) OR (os = 3 AND STATUS = 4) OR (os = 2 AND STATUS = 1) THEN actual_price
|
||||||
|
ELSE 0
|
||||||
|
END) AS refund_price
|
||||||
|
')->find();
|
||||||
|
|
||||||
return $this->success(['wait' => $order->wait ?? 0,'doing' => $order->doing ?? 0,'total' => $order->total ?? 0,'all' => $order->all ?? 0 ]);
|
// Log::warning("=====",['sql'=>$order]);
|
||||||
|
|
||||||
|
return $this->success([
|
||||||
|
'wait' => $order->wait ?? 0,
|
||||||
|
'doing' => $order->doing ?? 0,
|
||||||
|
'total' => $order->total ?? 0,
|
||||||
|
'all' => $order->all ?? 0,
|
||||||
|
'asset' => $order->asset ?? 0,
|
||||||
|
'asset_price' => $order->asset_price ?? 0,
|
||||||
|
'refund' => $order->refund ?? 0,
|
||||||
|
'refund_price' => $order->refund_price ?? 0
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function pie() {
|
public function pie()
|
||||||
|
{
|
||||||
$time = strtotime(date('Y-m-d'));
|
$time = strtotime(date('Y-m-d'));
|
||||||
$_time = $time - 3600 * 24 * 10;
|
$_time = $time - 3600 * 24 * 10;
|
||||||
$data = Orders::whereBetween('create_time', [$_time, time()])->fieldRaw('sum(total_price) as value, status')->group('status')->select();
|
$data = Orders::whereBetween('create_time', [$_time, time()])->fieldRaw('sum(total_price) as value, status')->group('status')->select();
|
||||||
|
@ -111,7 +142,8 @@ class IndexController extends base
|
||||||
return $this->success($ddd);
|
return $this->success($ddd);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function Info(Request $request) {
|
public function Info(Request $request)
|
||||||
|
{
|
||||||
|
|
||||||
$info = Admins::where('id', $request->admin->id)->find();
|
$info = Admins::where('id', $request->admin->id)->find();
|
||||||
|
|
||||||
|
@ -125,7 +157,8 @@ class IndexController extends base
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function qiniu() {
|
public function qiniu()
|
||||||
|
{
|
||||||
// 用于签名的公钥和私钥
|
// 用于签名的公钥和私钥
|
||||||
$accessKey = config('qiniu.accessKey');
|
$accessKey = config('qiniu.accessKey');
|
||||||
$secretKey = config('qiniu.secretKey');
|
$secretKey = config('qiniu.secretKey');
|
||||||
|
@ -141,7 +174,8 @@ class IndexController extends base
|
||||||
return $this->success(['qiniu_key' => $key, 'qiniu_token' => $token, 'qiniu_url' => 'http://up-z2.qiniup.com']);
|
return $this->success(['qiniu_key' => $key, 'qiniu_token' => $token, 'qiniu_url' => 'http://up-z2.qiniup.com']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function avatar(Request $request) {
|
public function avatar(Request $request)
|
||||||
|
{
|
||||||
$file = $request->file("file");
|
$file = $request->file("file");
|
||||||
$filename = '/uploads/avatar/' . $request->admin->id . '.' . $file->getUploadExtension();
|
$filename = '/uploads/avatar/' . $request->admin->id . '.' . $file->getUploadExtension();
|
||||||
$file->move(public_path() . $filename);
|
$file->move(public_path() . $filename);
|
||||||
|
@ -150,4 +184,35 @@ class IndexController extends base
|
||||||
$item->save();
|
$item->save();
|
||||||
return $this->success($filename);
|
return $this->success($filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function productNameList(Request $request)
|
||||||
|
{
|
||||||
|
$limit = $request->get('limit', 10);
|
||||||
|
$product_name = $request->get('product_name');
|
||||||
|
$list = Orders::where('admin_id',$request->admin->id)
|
||||||
|
->fieldRaw('
|
||||||
|
os,product_name,
|
||||||
|
SUM(IF(status=0,1,0)) as wait,
|
||||||
|
SUM(IF(status=1,1,0)) as doing,
|
||||||
|
SUM(total_price) as total,
|
||||||
|
count(id) as `all`,
|
||||||
|
SUM(IF(asset_price>0 AND status=2,1,0)) as asset,
|
||||||
|
SUM(IF(asset_price>0 AND status=2,asset_price,0)) as asset_price,
|
||||||
|
SUM(CASE
|
||||||
|
WHEN (os = 1 AND STATUS = 5) OR (os = 3 AND STATUS = 4) OR (os = 2 AND STATUS = 1) THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END) AS refund,
|
||||||
|
SUM(CASE
|
||||||
|
WHEN (os = 1 AND STATUS = 5) OR (os = 3 AND STATUS = 4) OR (os = 2 AND STATUS = 1) THEN actual_price
|
||||||
|
ELSE 0
|
||||||
|
END) AS refund_price
|
||||||
|
')
|
||||||
|
->group('os,product_name')
|
||||||
|
->order('total desc');
|
||||||
|
if (!empty($product_name)){
|
||||||
|
$list = $list->where('product_name','like','%'.$product_name.'%');
|
||||||
|
}
|
||||||
|
$list = $list->paginate($limit);
|
||||||
|
return $this->success($list);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -104,7 +104,7 @@ class Orders extends base{
|
||||||
}
|
}
|
||||||
|
|
||||||
public function backs() {
|
public function backs() {
|
||||||
return $this->hasOne(Backs::class, 'order_id')->visible(['status']);
|
return $this->hasOne(Backs::class, 'order_id')->where('status',0)->visible(['status','admin_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function follow() {
|
public function follow() {
|
||||||
|
|
Loading…
Reference in New Issue