Commit c5a8ab02 authored by 李硕's avatar 李硕

按条件搜索中奖名单和导入物流信息

parent ceb9aa69
......@@ -32,6 +32,10 @@ const API = {
request("queryBenefitByEname", "POST", params),
// 复制创建新活动
createCopyActivity: (params) => request("copyNewActivity", "POST", params),
//搜索条件查询中奖信息
exportAwardsInfoBySearch: (params) => request("exportAwardsInfoBySearch", "POST", params),
findWinnerInfoListBySearch: (params) => request("findWinnerInfoListBySearch", "POST", params),
downloadFile: (params) => request("downloadFile", "POST", params),
};
export default API;
.rank-dialog-wrap {
max-height: 400px;
overflow: scroll
}
.other-winner-list {
display: flex;
......
......@@ -14,8 +14,41 @@
title="{{item.tab}}"
key="{{item.key}}"
> -->
<!-- 添加筛选条件导出中奖名单 start -->
<form class="edit-content-form" data-name="form" inline="true" labelTextAlign="right" size="large">
<form-item class="edit-content-formItem" label="奖品编号" labelTextAlign="right" asterisk="{{false}}">
<input data-type="prize" value="{{searchInfo.prizeId}}" onChange="onInputChange" hasLimitHint="true" name="奖品编号" />
</form-item>
<form-item class="edit-content-formItem" label="用户id" labelTextAlign="right" asterisk="{{false}}">
<input data-type="user" value="{{searchInfo.userNick}}" onChange="onInputChange" hasLimitHint="true" name="用户id" />
</form-item>
<form-item class="edit-content-formItem" label="发奖时间" labelTextAlign="right" asterisk="{{false}}">
<range-picker style="width: 300px" onChange="onChangeTime" hasClear="true" value="{{timeRange}}" data-time="{{timeRange}}" class="block" show-time="{{ format: 'HH:mm' }}" />
</form-item>
<form-item class="edit-content-formItem" label="发货状态" labelTextAlign="right">
<select onChange="onSelectShipStatus">
<option value="{{1}}">全部</option>
<option value="{{2}}">未发货</option>
<option value="{{3}}">已发货</option>
</select>
</form-item>
<form-item class="edit-content-formItem" label="奖品类型">
<select onChange="onSelectPrizeType">
<option value="{{1}}">优惠券</option>
<option value="{{3}}">实物</option>
</select>
</form-item>
</form>
<view style="textAlign:right">
<button onTap="onChangeSearch" style="height:32px;" type="primary" size="medium">搜索</button>
<button style="margin-left:20px;height:32px" type="primary" data-type="search" onTap="exportWinnerListBySearch" size="medium">导出</button>
<button style="margin-left:20px;height:32px" type="primary" onTap="onChangeUpLoad" size="medium">导入发货</button>
</view>
<!-- end -->
<view class="now-winner-list">
<button type="primary" onTap="exportWinnerList">导出中奖名单</button>
<button type="primary" data-type="export" onTap="exportWinnerList">导出中奖名单</button>
</view>
<table dataSource="{{list}}">
......@@ -23,9 +56,11 @@
</table>
<view class="rank-pagination">
<text class="rank-pagination-text">共{{list.length}}条</text>
<pagination shape="arrow-only" hideOnlyOnePage="true" defaultCurrent="1" current="{{pageInfo.pageNo}}" pageSize="{{pageInfo.pageSize}}" onChange="changePagination" pageShowCount="100" total="{{pageInfo.total}}" />
<!-- <pagination shape="arrow-only" hideOnlyOnePage="true" defaultCurrent="1" current="{{pageInfo.pageNo}}" pageSize="{{pageInfo.pageSize}}" onChange="changePagination" pageShowCount="100" total="{{pageInfo.total}}" /> -->
<pagination showJump="{{false}}" defaultCurrent="{{1}}" data-type="all" pageSize="{{pageSize}}" onChange="onChangePageNo" pageShowCount="{{10}}" total="{{total}}" a:if="{{total > 0}}" shape="arrow-only" />
</view>
<!-- </tab-item>
</tab> -->
</view>
</dialog-wrap>
\ No newline at end of file
</dialog-wrap>
<ship-dialog a:if="{{showShip}}" showShip="{{showShip}}" onClose="onCloseShip" activityId="{{winactivityId}}"></ship-dialog>
\ No newline at end of file
......@@ -2,6 +2,9 @@
import {
findWinnerInfoList,
uploadDataCreateFile,
//通过搜索条件筛选中奖名单
exportAwardsInfoBySearch,
findWinnerInfoListBySearch
} from "/api";
import { appId } from "/config";
import { setClipboard } from "/utils";
......@@ -12,69 +15,106 @@ Component({
tabs: [{
tab: '0608-0712',
key: 111
},{
}, {
tab: '03308-0712',
key: 43
},{
}, {
tab: '064548-0712',
key: 435
},{
}, {
tab: '0608-0712',
key: 436545
},{
}, {
tab: '0608-0712',
key: 65
},{
}, {
tab: '0608-0712',
key: 11561
},{
}, {
tab: '0608-0712',
key: 13311
},{
}, {
tab: '0608-0712',
key: 145611
},{
}, {
tab: '0608-0712',
key: 1178761
}],
dataSource: [],
columns: [
{ title: '排名', prop: 'rank' },
{ title: '奖品编号', prop: 'prizeId' },//prizeId为awards_info中的_id
{ title: '发奖时间', prop: 'createTime' },
{ title: '填地址时间', prop: 'receiveTime' },
{ title: '用户昵称', prop: 'userNick' },
{ title: '奖品类型', prop: 'typeName' },
{ title: '奖品名称', prop: 'prizeName' },
{ title: '奖池类型', prop: 'awardsType' },
{ title: '奖品类型', prop: 'type' },
{ title: '奖品名', prop: 'name' },
{ title: '收货人', prop: 'receiveName' },
{ title: '联系方式', prop: 'phone' },
{ title: '收货地址', prop: 'address', width: 240 }
/*注:需要在接口里将 省+市+区+详细 拼写起来*/
{ title: '收货地址', prop: 'address' },//{ title: '收货地址', prop: 'address', width: 240 }
{ title: '物流状态', prop: 'shipStatus' },
{ title: '物流公司', prop: 'shipCompany' },
{ title: '物流单号', prop: 'shipNum' }
],
pageInfo: {
pageNo: 1,
pageSize: 100,
total: 0
},
// pageInfo: {
// pageNo: 1,
// pageSize: 100,
// total: 0
// },
//《条件搜索》start显示中奖名单搜索条件
list: [],
prizeId: "",
userId: "",
startT: "",
endT: "",
shipStatus: "",
timeRange: [],
prizeType: "",
showShip: false,
winactivityId: "",
pageNo: 1,
pageSize: 1,
total: 0,
type: ""
//end
},
props: {
onClose: () => {},
onClose: () => { },
list: [],
selectedItem: {},
},
didMount() {},
didUpdate() {},
didUnmount() {},
didMount() { },
didUpdate() { },
didUnmount() { },
methods: {
//start《条件搜索》初始化数据更新
initData() {
this.setData({
list: [],
prizeId: "",
userId: "",
startT: "",
endT: "",
timeRange: [],
shipStatus: "",
prizeType: ""
})
},
//end
onCloseDialog() {
this.props.onClose && this.props.onClose();
},
async getWinnerList() {
const { avtivityId } = this.props;
const { data } = await findWinnerInfoList({
avtivityId
})
});
this.setData({
dataSource: data
})
},
onCloseDialog() {
this.props.onClose && this.props.onClose();
});
},
// 导出中奖名单
async exportWinnerList(evt) {
......@@ -97,7 +137,7 @@ Component({
this.setData({
exportDialogVisible: true,
exportUrl: data.url.replace(/amp;/g, "")
})
});
} else {
my.showToast({
type: "fail",
......@@ -109,5 +149,181 @@ Component({
console.log(error, "exportList-error");
}
},
//《条件搜索》 导出中奖名单
timeExchange(time) {
console.log("time==", time);
let a = time ? new Date(time) : "";
let times = a ? a.getTime() : "";
return times;
},
async exportWinnerListBySearch(evt) {
const { activityId, title } = this.props.selectedItem;
let { prizeId, userId, startT, endT, shipStatus, pageNo, pageSize, prizeType } = this.data;
let timeStart = this.timeExchange(startT);
let timeEnd = this.timeExchange(endT);
if (prizeId || userId || (timeStart && timeEnd) || shipStatus || prizeType) {
try {
console.log("导出名单数据接口");
const { success, data, message } = await exportAwardsInfoBySearch({
activityId,
pageNo, pageSize,
title,
prizeId,
userId,
timeStart,
timeEnd,
shipStatus,
prizeType
});
if (success) {
if (!data) {
my.showToast({
type: 'fail',
content: '没有符合条件的订单!'
})
}
else {
console.log("导出中奖名单");
my.setClipboard({
text: data.url.replace(/amp;/g, ''),
success(res) {
my.showToast({
type: 'success',
content: '下载链接复制成功,请在浏览器中打开下载'
})
}
});
}
} else {
my.showToast({
type: 'fail',
content: message
})
}
} catch (error) {
my.hideLoading();
console.log('exportList-error', error);
}
}
else {
my.showToast({
type: "fail",
content: "请填写至少一个筛选信息"
})
}
},
//《条件搜索》导入发货信息
onChangeUpLoad() {
const { activityId, title } = this.props.selectedItem;
this.setData({
showShip: true,
winactivityId: activityId
})
},
//《条件搜索》关闭导入发货窗口
onCloseShip() {
this.setData({
showShip: false,
})
},
//《条件搜索》搜索
async onChangeSearch() {
const { activityId, title } = this.props.selectedItem;
let { prizeId, userId, startT, endT, pageNo, pageSize, shipStatus, prizeType } = this.data;
let timeStart = this.timeExchange(startT);
let timeEnd = this.timeExchange(endT);
console.log(prizeId, userId, timeStart, timeEnd, pageNo, pageSize, shipStatus, prizeType);
if (prizeId || userId || (timeStart && timeEnd) || shipStatus === 0 || shipStatus || prizeType > 0) {
let rewardList = await findWinnerInfoListBySearch({ activityId, pageNo, pageSize, title, prizeId, userId, timeStart, timeEnd, shipStatus, prizeType });
if (rewardList.data.list.length == 0) {
this.setData({
list: [],
total: 0
}); 0
my.showToast({
type: "fail",
content: "没有符合条件的订单!"
})
} else {
console.log("rewardList==", rewardList);
//时间戳的转换都去到服务端做
/*
rewardList.data.list.forEach((item) => {
item.createTime = moment(+item.createTime).format("YYYY-MM-DD HH:mm:ss");
item.receiveTime = !!item.receiveTime ? moment(+item.receiveTime).format("YYYY-MM-DD HH:mm:ss") : '/';
});
*/
this.setData({
list: rewardList.data.list,
total: rewardList.data.total
});
}
}
else {
my.showToast({
type: "fail",
content: "请填写至少一个筛选信息"
})
}
},
//《条件搜索》按照时间搜索
onChangeTime(e) {
console.log("时间搜索e", e);
const [startTime, endTime] = e.detail.value;
this.setData({
startT: startTime || "",
endT: endTime || "",
timeRange: [startTime, endTime],
pageNo: 1,
pageSize: 10,
total: 0,
});
console.log("this.data.timeRange==", this.data.timeRange, this.data.startT, this.data.endT);
},
//《条件搜索》输入框查找信息
onInputChange(e) {
let { type } = e.currentTarget.dataset;
let { value } = e.detail;
this.setData({
[type + "Id"]: value,
pageNo: 1,
pageSize: 10,
total: 0,
})
console.log("this.data.prizeId===", this.data.prizeId, "this.data.userId===", this.data.userId);
},
//《条件搜索》发货状态筛选
onSelectShipStatus(e) {
console.log('筛选发货状态e>>>', e);
this.setData({
shipStatus: e.detail.value,
pageNo: 1,
pageSize: 10,
total: 0,
})
},
//《条件搜索》奖品类型筛选
onSelectPrizeType(e) {
console.log('筛选奖品类型e>>>', e);
this.setData({
prizeType: e.detail.value,
pageNo: 1,
pageSize: 10,
total: 0,
});
console.log("type", this.data.prizeType);
},
//《条件搜索》更换页码时调用接口
onChangePageNo(e) {
this.setData({
pageNo: e.detail.value
})
this.onChangeSearch();
}
},
});
{
"component": true,
"usingComponents": {
"dialog-wrap": "../../basic/dialiog-wrap/dialiog-wrap"
"dialog-wrap": "../../basic/dialiog-wrap/dialiog-wrap",
"ship-dialog": "../../dialog/ship-dialog/ship-dialog"
}
}
\ No newline at end of file
.edit-content-shipDialog1 {
background: white;
width: 100%;
height: 200px;
/* margin-left: 80px; */
margin-top: 100px;
}
.edit-content-titleLoad {
font-size: 25px;
font: bold;
text-align: center;
margin-top: 20px;
}
.edit-content-shipDialog {
width: 340px;
margin-left: 76px;
margin-top: 40px;
}
.edit-content-buttons {
width: 200px;
margin-left: 300px;
}
.edit-content-buttonShip {
margin-left: 5px
}
\ No newline at end of file
<dialog-wrap title="批量发货" visible="{{showShip}}" onClose="closeShip">
<view class="edit-content-shipDialog1">
<form-item class="edit-content-shipDialog" label="上传附件:" style="display:flex">
<input placeholder="Input" style="80px" value="{{fileName}}" onChange="onChangeInput"/>
</form-item>
<view class="edit-content-buttons">
<button class="edit-content-buttonShip" type="primary" onTap="closeShip">
取消
</button>
<button class="edit-content-buttonShip" type="primary" onTap="onChangeLoadFile">
确认发货
</button>
</view>
</view>
</dialog-wrap>
\ No newline at end of file
import { downloadFile } from "../../../api";
// import { upLoadFileApi } from "../../utils/my-api";
Component({
data: {
fileName: ""
},
props: {
activityId: "",
onClose: () => { }
},
didMount() {
console.log(">>>>>>activityId",this.props.activityId);
},
didUpdate() {
},
didUnmount() { },
methods: {
//LS20200716关闭弹窗
closeShip() {
this.props.onClose();
this.setData({
fileName: ""
})
console.log("ship-dialog====showShip");
},
closeDialog() {
this.setData({})
},
//20200717确认发货
//20200717
async onChangeLoadFile() {
let { fileName } = this.data;
let { activityId } = this.props;
console.log("fileName==", fileName, "activityId===", activityId);
let result = await downloadFile({ activityId, fileName });
console.log("-----**", result);
if (result.success) {
if (result.data.total == 0) {
my.showToast({
type: "fail",
content: `无用户填写地址,导入信息错误`,
});
}
else {
my.showToast({
type: "success",
content: `成功导入${JSON.stringify(result.data.total)}条发货信息!`,
});
}
} else {
my.showToast({
type: "fail",
content: result.message
});
}
},
//输入框变化
onChangeInput(e) {
console.log("输入框变化", e);
let { fileName } = this.data;
this.setData({
fileName: e.detail.value
})
console.log("====", fileName);
}
}
})
{
"component": true,
"usingComponents": {
"dialog-wrap": "../../basic/dialiog-wrap/dialiog-wrap"
}
}
\ No newline at end of file
......@@ -3,6 +3,10 @@ const { endingNotify } = require("./controller/endingNodify.controller");
const {
findWinnerInfoList,
exportAwardsList,
//搜索条件导出中奖名单
findWinnerInfoListBySearch,
exportAwardsInfoBySearch,
downloadFile
} = require("./controller/awards.controller");
const {
getActivityListByOpenId,
......@@ -18,6 +22,10 @@ const {
getBenefitByEname,
} = require("./controller/activitygettbitem.controller");
//搜索条件导出中奖名单
exports.findWinnerInfoListBySearch = findWinnerInfoListBySearch;
exports.exportAwardsInfoBySearch = exportAwardsInfoBySearch;
exports.downloadFile = downloadFile;
// 定时开奖
exports.endingNotify = endingNotify;
// 活动中奖名单
......
// 排行榜开奖记录
const BaseDao = require("../dao/base.dao");
const { DRAW_STATUS } = require("../utils/constants");
const { DRAW_STATUS, SHIP_STATUS } = require("../utils/constants");
const { USER_PRIZE } = require("../config/db_config");
const DBName = USER_PRIZE;
class RankopenprizeService {
......@@ -28,11 +27,11 @@ class RankopenprizeService {
}
// 根据活动id查找中奖名单
async getAwardslistByActivityId(activityId, pageNo, pageSize) {
async getAwardslistByActivityId(activityId) {
if (!activityId) {
return false;
}
let result = await this.rankopenprizeDao.find(
return await this.rankopenprizeDao.find(
{
activityId: activityId,
},
......@@ -41,12 +40,91 @@ class RankopenprizeService {
score: -1,
rankTime: -1,
},
}
);
}
//《条件搜索》查询中奖信息
async getUserPrizeByActivityId(activityId, pageNo, pageSize, prizeId, userNick, timeStart, timeEnd, shipStatus, type) {
let p = prizeId ? { _id: prizeId } : '';
let u = userNick ? { userNick: { $regex: ".*" + userNick + ".*" } } : '';
let c = (timeStart > 0 && timeEnd > 0) ? { createTime: { $gt: timeStart, $lt: timeEnd } } : '';
let s = shipStatus
? (shipStatus == 1
? { shipStatus: { $in: [SHIP_STATUS.NO_ADDRESS, SHIP_STATUS.NO_SHIP, SHIP_STATUS.HAS_SHIP] } }
: (shipStatus == 2
? { shipStatus: { $in: [SHIP_STATUS.NO_ADDRESS, SHIP_STATUS.NO_SHIP] } }
: { shipStatus: SHIP_STATUS.HAS_SHIP }
)
)
: '';
let t = type ? { type: +type } : '';
let arr = [p, u, c, s, t];
arr = arr.filter((i) => { return i });
console.log('arr--222---', arr);
return await this.rankopenprizeDao.find(
{
activityId,
$and: arr
},
{
limit: pageSize,
skip: (pageNo - 1) * pageSize,
}
);
return result
}
//《条件搜索》获取中奖名单长度
async getTotalObjectCount(activityId, prizeId, userNick, timeStart, timeEnd, shipStatus, type) {
let p = prizeId ? { _id: prizeId } : '';
let u = userNick ? { userNick: { $regex: ".*" + userNick + ".*" } } : '';
let c = (timeStart > 0 && timeEnd > 0) ? { createTime: { $gt: timeStart, $lt: timeEnd } } : '';
let s = shipStatus
? (shipStatus == 1
? { shipStatus: { $in: [SHIP_STATUS.NO_ADDRESS, SHIP_STATUS.NO_SHIP, SHIP_STATUS.HAS_SHIP] } }
: (shipStatus == 2
? { shipStatus: { $in: [SHIP_STATUS.NO_ADDRESS, SHIP_STATUS.NO_SHIP] } }
: { shipStatus: SHIP_STATUS.HAS_SHIP }
)
)
: '';
let t = type ? { type: +type } : ''
let arr = [p, u, c, s, t];
arr = arr.filter((i) => { return i });
console.log('arr--111---', arr, "s>>>", s);
return await this.rankopenprizeDao.count({
activityId,
$and: arr
});
}
//《条件搜索》导入发货状态
async setUserShipStatus(activityId, prizeId, shipCompany, shipNum) {
prizeId = prizeId ? prizeId : "/";
shipCompany = shipCompany ? shipCompany : '';
shipNum = shipNum !== null ? shipNum : ''
let status = 0;
if (shipCompany && shipNum) {
status = SHIP_STATUS.HAS_SHIP;
} else {
status = SHIP_STATUS.NO_SHIP;
}
if (status == SHIP_STATUS.HAS_SHIP) {
return await this.rankopenprizeDao.update({
activityId,
_id: prizeId,
shipStatus: SHIP_STATUS.NO_SHIP
}, {
$set: {
shipCompany,
shipNum,
shipStatus: SHIP_STATUS.HAS_SHIP
}
})
} else {
return 0;
}
}
}
......
......@@ -32,6 +32,12 @@ const LOGGER_TYPE = {
ERROR: 1,
INFO: 2,
};
//物流状态
const SHIP_STATUS = {
NO_ADDRESS: 1,
NO_SHIP: 2,
HAS_SHIP: 3
}
const PRIZE_TYPE = {
EQUITY: 1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment