Merge remote-tracking branch 'origin/master'

master
zccbbg 2 years ago
commit 7aa60fd7b3

@ -58,9 +58,9 @@ https://github.com/zccbbg/ruoyi-mall
* 开发团队成立5年我们前端开发、后端架构有一颗热爱开源的心致力于打造企业级的通用产品设计UI体系让项目 或者更直观更高效、更简单未来将持续关注UI交互持续推出高质量的交互产品。 * 开发团队成立5年我们前端开发、后端架构有一颗热爱开源的心致力于打造企业级的通用产品设计UI体系让项目 或者更直观更高效、更简单未来将持续关注UI交互持续推出高质量的交互产品。
* 这五年我主要做isv对接淘宝、拼多多、抖音、美团等平台的订单处理应用日处理订单300w条因为要熟悉业务也开过淘宝和拼多多店铺运营了一个网易严选的品牌。我们的公众号会陆续更新一些我一边撸代码一边做客服的经历。也会更新一些我的读书笔记以及编程、创业、生活中踩坑的文章。另外还会开放一些米哈游、博世、企查查、同程、阿里、京东、拼多多等大厂、中厂或外企的内推岗位 * 这五年我主要做isv对接淘宝、拼多多、抖音、美团等平台的订单处理应用日处理订单300w条因为要熟悉业务也开过淘宝和拼多多店铺运营了一个网易严选的品牌。我们的公众号会陆续更新一些我一边撸代码一边做客服的经历。也会更新一些我的读书笔记以及编程、创业、生活中踩坑的文章。另外还会开放一些米哈游、博世、企查查、同程、阿里、京东、拼多多等大厂、中厂或外企的内推岗位
## 技术支持 ## 加群/技术支持
| 公众号 | | 公众号 |
|:------------------------------------------:| |:------------------------------------------:|
| <img src="doc/datacall.jpg" width="200px"> | | <img src="doc/datacall.jpg" width="200px"> |
扫公众号二维码,关注后回复:“支持” 扫公众号二维码,关注后回复:“支持”或者“加群”

@ -0,0 +1,54 @@
import request from '@/utils/request'
// 查询系统数据统计列表
export function listAwsSystemStatistics(query, pageReq) {
return request({
url: '/aws/systemStatistics/list',
method: 'post',
data: query,
params: pageReq
})
}
// 查询系统数据统计详细
export function getAwsSystemStatistics(id) {
return request({
url: '/aws/systemStatistics/' + id,
method: 'get'
})
}
// 新增系统数据统计
export function addAwsSystemStatistics(data) {
return request({
url: '/aws/systemStatistics',
method: 'post',
data: data
})
}
// 修改系统数据统计
export function updateAwsSystemStatistics(data) {
return request({
url: '/aws/systemStatistics',
method: 'put',
data: data
})
}
// 删除系统数据统计
export function delAwsSystemStatistics(id) {
return request({
url: '/aws/systemStatistics/' + id,
method: 'delete'
})
}
// 导出系统数据统计
export function exportAwsSystemStatistics(query) {
return request({
url: '/aws/systemStatistics/export',
method: 'get',
params: query
})
}

@ -35,6 +35,13 @@ export function updateUmsMember(data) {
data: data data: data
}) })
} }
export function updateUmsMemberMark(data) {
return request({
url: '/ums/member/mark/update',
method: 'post',
data: data
})
}
// 删除会员信息 // 删除会员信息
export function delUmsMember(id) { export function delUmsMember(id) {

@ -19,7 +19,7 @@ import './assets/icons' // icon
import './permission' // permission control import './permission' // permission control
import { getDicts } from "@/api/system/dict/data"; import { getDicts } from "@/api/system/dict/data";
import { getConfigKey } from "@/api/system/config"; import { getConfigKey } from "@/api/system/config";
import { parseTime, resetForm, addDateRange, addDateRange2, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi"; import { parseTime, resetForm, addDateRange, addDateRange2, addDateRange3, selectDictLabel, selectDictLabels, handleTree } from "@/utils/ruoyi";
import { getHiddenName, getHiddenDetailAddress } from '@/utils/DataHidden' import { getHiddenName, getHiddenDetailAddress } from '@/utils/DataHidden'
// 分页组件 // 分页组件
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
@ -56,6 +56,7 @@ Vue.prototype.selectDictLabels = selectDictLabels
Vue.prototype.download = download Vue.prototype.download = download
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree
Vue.prototype.addDateRange2 = addDateRange2 Vue.prototype.addDateRange2 = addDateRange2
Vue.prototype.addDateRange3 = addDateRange3
Vue.prototype.getHiddenName = getHiddenName Vue.prototype.getHiddenName = getHiddenName
Vue.prototype.getHiddenDetailAddress = getHiddenDetailAddress Vue.prototype.getHiddenDetailAddress = getHiddenDetailAddress

@ -81,6 +81,19 @@ export function addDateRange2(params, dateRange, addDay=true) {
return search; return search;
} }
export function addDateRange3(params, dateRange, addDay=true) {
let search = params;
dateRange = Array.isArray(dateRange) ? dateRange : [];
if (addDay) {
search['beginTime'] = dateRange[0] + ' 00:00:00';
search['endTime'] = moment(dateRange[1]).add(1,"days").format('yyyy-MM-DD')+ ' 00:00:00';
} else {
search['beginTime'] = dateRange[0]+ ' 00:00:00';
search['endTime'] = dateRange[1]+ ' 00:00:00';
}
return search;
}
// 回显数据字典 // 回显数据字典
export function selectDictLabel(datas, value) { export function selectDictLabel(datas, value) {
if (value === undefined) { if (value === undefined) {

@ -0,0 +1,248 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px" size="medium" class="ry_form">
<el-form-item label="统计日期" prop="date">
<el-date-picker v-model="dateRange" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
:clearable="true" :picker-options='pickerOptions' range-separator="-" start-placeholder="开始日期"
end-placeholder="结束日期"></el-date-picker>
</el-form-item>
<el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="awsSystemStatisticsList" @selection-change="handleSelectionChange">
<el-table-column label="统计日期" align="center" prop="date" width="180" >
<template slot-scope="scope">
<span>{{ parseTime(scope.row.date, '{y}-{m}-{d}')}}</span>
</template>
</el-table-column>
<el-table-column label="登录用户数" align="center" prop="loginMemberCount" />
<el-table-column label="注册用户数" align="center" prop="registerMemberCount" />
<el-table-column label="加购用户数" align="center" prop="addCartMemberCount" />
<el-table-column label="下单用户数" align="center" prop="createOrderMemberCount" />
<el-table-column label="成交用户数" align="center" prop="dealMemberCount" />
<el-table-column label="下单数" align="center" prop="orderCount" />
<el-table-column label="成交数" align="center" prop="dealCount" />
<el-table-column label="成交金额" align="center" prop="dealAmount">
<template v-slot="scope">
{{ scope.row.dealAmount.toFixed(2) }}
</template>
</el-table-column>
<el-table-column label="售后数" align="center" prop="aftersaleCount" />
<el-table-column label="售后金额" align="center" prop="aftersaleAmount">
<template v-slot="scope">
{{ scope.row.aftersaleAmount.toFixed(2) }}
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script>
import { listAwsSystemStatistics, getAwsSystemStatistics, delAwsSystemStatistics, addAwsSystemStatistics, updateAwsSystemStatistics, exportAwsSystemStatistics } from "@/api/aws/systemStatistics";
import dateUtil from "@/utils/DateUtil";
export default {
name: "AwsSystemStatistics",
data() {
return {
//
loading: true,
pickerOptions: {
shortcuts: dateUtil.getTimeShort()
},
dateRange: [],
//
exportLoading: false,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
awsSystemStatisticsList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10
},
//
form: {},
//
rules: {
date: [
{ required: true, message: "统计日期不能为空", trigger: "blur" }
],
loginMemberCount: [
{ required: true, message: "登录用户数不能为空", trigger: "blur" }
],
registerMemberCount: [
{ required: true, message: "注册用户数不能为空", trigger: "blur" }
],
addCartMemberCount: [
{ required: true, message: "加购用户数不能为空", trigger: "blur" }
],
createOrderMemberCount: [
{ required: true, message: "下单用户数不能为空", trigger: "blur" }
],
dealMemberCount: [
{ required: true, message: "成交用户数不能为空", trigger: "blur" }
],
orderCount: [
{ required: true, message: "下单数不能为空", trigger: "blur" }
],
dealCount: [
{ required: true, message: "成交数不能为空", trigger: "blur" }
],
dealAmount: [
{ required: true, message: "成交金额不能为空", trigger: "blur" }
],
aftersaleCount: [
{ required: true, message: "售后数不能为空", trigger: "blur" }
],
aftersaleAmount: [
{ required: true, message: "售后金额不能为空", trigger: "blur" }
]
},
showMoreCondition: false
};
},
created() {
this.getList();
},
methods: {
/** 查询系统数据统计列表 */
getList() {
this.loading = true;
const {pageNum, pageSize} = this.queryParams;
let query = {...this.queryParams, pageNum: undefined, pageSize: undefined};
const pageReq = {page: pageNum - 1, size: pageSize};
if (this.dateRange && this.dateRange.length > 0){
query = {...this.addDateRange3(query, this.dateRange)}
}
listAwsSystemStatistics(query, pageReq).then(response => {
const { content, totalElements } = response
this.awsSystemStatisticsList = content;
this.total = totalElements;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
date: null,
loginMemberCount: null,
registerMemberCount: null,
addCartMemberCount: null,
createOrderMemberCount: null,
dealMemberCount: null,
orderCount: null,
dealCount: null,
dealAmount: null,
aftersaleCount: null,
aftersaleAmount: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加系统数据统计";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getAwsSystemStatistics(id).then(response => {
this.form = response;
this.open = true;
this.title = "修改系统数据统计";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAwsSystemStatistics(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAwsSystemStatistics(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除系统数据统计编号为"' + ids + '"的数据项?').then(function() {
return delAwsSystemStatistics(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
const queryParams = this.queryParams;
this.$modal.confirm('是否确认导出所有系统数据统计数据项?').then(() => {
this.exportLoading = true;
return exportAwsSystemStatistics(queryParams);
}).then(response => {
this.$download.download(response);
this.exportLoading = false;
}).catch(() => {});
}
}
};
</script>

@ -46,6 +46,7 @@
<template v-slot="scope"> <template v-slot="scope">
<div>{{ scope.row.nickName }}</div> <div>{{ scope.row.nickName }}</div>
<div>{{ scope.row.phone }}</div> <div>{{ scope.row.phone }}</div>
<div>{{scope.row.mark}}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="退款金额" align="center" prop="applyReturnAmount" width="120"/> <el-table-column label="退款金额" align="center" prop="applyReturnAmount" width="120"/>

@ -64,6 +64,12 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="客户信息" prop="receiverName" width="160">
<template v-slot="scope">
<p>{{scope.row.nickName}}</p>
<p>{{scope.row.mark}}</p>
</template>
</el-table-column>
<el-table-column label="备注留言" prop="note" width="160"> <el-table-column label="备注留言" prop="note" width="160">
<template v-slot="scope"> <template v-slot="scope">
<div> <div>
@ -79,7 +85,7 @@
<div v-if="scope.row.note">{{ scope.row.note }}</div> <div v-if="scope.row.note">{{ scope.row.note }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="下单时间/支付时间" prop="payTime" width="200" > <el-table-column label="下单时间/支付时间" prop="payTime" width="140" >
<template slot-scope="scope"> <template slot-scope="scope">
<div v-if="scope.row.createTime">{{ parseTime(scope.row.createTime, '{mm}-{dd} {hh}:{ii}')}} </div> <div v-if="scope.row.createTime">{{ parseTime(scope.row.createTime, '{mm}-{dd} {hh}:{ii}')}} </div>
<div v-if="scope.row.payTime">{{ parseTime(scope.row.payTime, '{mm}-{dd} {hh}:{ii}')}} </div> <div v-if="scope.row.payTime">{{ parseTime(scope.row.payTime, '{mm}-{dd} {hh}:{ii}')}} </div>
@ -94,7 +100,7 @@
<div>总价 {{ scope.row.totalAmount }}</div> <div>总价 {{ scope.row.totalAmount }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="商品规格" prop="productList" width="340"> <el-table-column label="商品规格" prop="productList" width="280">
<template v-slot="scope"> <template v-slot="scope">
<div v-for="item in scope.row.productList" class="product-container"> <div v-for="item in scope.row.productList" class="product-container">
<el-popover <el-popover
@ -115,7 +121,7 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="订单状态" prop="status" width="270"> <el-table-column label="订单状态" prop="status" width="160">
<template v-slot="scope"> <template v-slot="scope">
<div> <div>
<el-tag :type="getOrderStatusTag(scope.row.status)" style="margin-right: 10px"> <el-tag :type="getOrderStatusTag(scope.row.status)" style="margin-right: 10px">

@ -39,6 +39,12 @@
size="small" size="small"
/> />
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="mark">
<el-select v-model="queryParams.hasMark" clearable size="small">
<el-option value="1" label="有备注" />
<el-option value="0" label="无备注" />
</el-select>
</el-form-item>
<el-form-item class="flex_one tr"> <el-form-item class="flex_one tr">
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
@ -74,6 +80,12 @@
<div>{{ parseTime(scope.row.createTime) }}</div> <div>{{ parseTime(scope.row.createTime) }}</div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="备注">
<template v-slot="scope">
<span class="mr10">{{scope.row.mark}}</span>
<i class="el-icon-edit pointer" @click="showUpdateMark(scope.row)"></i>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fix="right" width="200"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fix="right" width="200">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
@ -111,12 +123,18 @@
<el-descriptions-item label="售后数">{{ statisticsObj.data.aftersaleCount }}</el-descriptions-item> <el-descriptions-item label="售后数">{{ statisticsObj.data.aftersaleCount }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-dialog> </el-dialog>
<el-dialog title="修改备注" :visible.sync="remarkModal.visible" width="30%" append-to-body>
<el-input type='textarea' :rows='3' placeholder='请输入内容' v-model='remarkModal.mark'/>
<span class="dialog-footer" slot="footer">
<el-button @click="remarkModal.visible = false"> </el-button>
<el-button type='primary' @click='updateRemark'> </el-button>
</span>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import { listUmsMember, getUmsMember, delUmsMember, addUmsMember, updateUmsMember, exportUmsMember, changeAccountStatus, decryptedPhone, viewStatistics } from "@/api/ums/member"; import { listUmsMember, getUmsMember, delUmsMember, addUmsMember, updateUmsMember,updateUmsMemberMark, exportUmsMember, changeAccountStatus, decryptedPhone, viewStatistics } from "@/api/ums/member";
import dateUtil from '@/utils/DateUtil'; import dateUtil from '@/utils/DateUtil';
import moment from "moment"; import moment from "moment";
@ -127,6 +145,11 @@ export default {
pickerOptions: { pickerOptions: {
shortcuts: dateUtil.getTimeShort() shortcuts: dateUtil.getTimeShort()
}, },
remarkModal: {
visible: false,
mark: null,
memberId: null,
},
// //
loading: true, loading: true,
// //
@ -153,7 +176,8 @@ export default {
pageSize: 10, pageSize: 10,
nickname: null, nickname: null,
phone: null, phone: null,
status: undefined status: undefined,
hasMark: undefined
}, },
dateRange:[], dateRange:[],
// //
@ -184,6 +208,26 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
showUpdateMark(record){
this.remarkModal = {
visible: true,
mark: record.mark,
memberId: record.id
}
},
updateRemark(){
updateUmsMemberMark({id:this.remarkModal.memberId,mark:this.remarkModal.mark})
.then(res=>{
if (res > 0) {
this.$message.success('修改成功');
this.remarkModal.visible = false;
const obj = this.umsMemberList.filter(it=>it.id === this.remarkModal.memberId)[0]
obj.mark = this.remarkModal.mark;
} else {
this.$message.success('修改失败');
}
})
},
/** 查询会员信息列表 */ /** 查询会员信息列表 */
getList() { getList() {
this.loading = true; this.loading = true;

@ -27,7 +27,13 @@
<el-table v-loading="loading" :data="umsMemberCartList" @selection-change="handleSelectionChange" border cell-class-name="my-cell"> <el-table v-loading="loading" :data="umsMemberCartList" @selection-change="handleSelectionChange" border cell-class-name="my-cell">
<!-- <el-table-column type="selection" width="55" />--> <!-- <el-table-column type="selection" width="55" />-->
<el-table-column label="用户手机号" prop="phoneHidden" width="100"/> <el-table-column label="用户信息" prop="phoneHidden">
<template v-slot="scope">
<p>{{scope.row.phoneHidden}}</p>
<p>{{scope.row.nickname}}</p>
</template>
</el-table-column>
<el-table-column label="用户备注" prop="mark" />
<el-table-column label="商品名称" prop="productName" /> <el-table-column label="商品名称" prop="productName" />
<el-table-column label="商品规格" prop="spData"> <el-table-column label="商品规格" prop="spData">
<template v-slot="scope"> <template v-slot="scope">

Loading…
Cancel
Save