import moment from 'moment'; import activity from '../../model/activity.js'; import { stringUtils } from '../../util/stringClass.js'; import { globalCache } from '../../util/GlobalCache.js'; import config from '../../config/index.js'; import { query } from '../../util/db.js'; // 以下模型在旧项目中独立存在,新项目暂用 query 直接调用 // PayInfo.GetActivityMoneyList, Users.GetUsersInfoByUserID, Users.UpdateUsersIsRebateByUserID /** * 得到当前活动信息 * 旧: exports.GetCurrentActivityInfo */ export async function GetCurrentActivityInfo(ctx) { let param = { UserID: ctx.query.UserID || 0, }; if (param.UserID === "undefined") param.UserID = 0; const list = await activity.GetCurrentActivityInfo(param); if (list && list.length > 0) { const result = {}; result.MoneyNotPay = 0; //未领取金额 result.MoneyTotal = 0; //累计回馈 result.MoneyPay = 0; //领取金额 result.ActivityCurrent = null; result.ActivityHistory = []; for (let i = 0; i < list.length; i++) { const item = list[i]; item.UserCreateTime = moment(item.UserCreateTime).format('YYYY年MM月DD日 HH:mm'); item.DateStartCHS = moment(item.DateStart).format('YYYY年MM月DD日'); item.DateEndCHS = moment(item.DateEnd).format('YYYY年MM月DD日'); item.DateStart = moment(item.DateStart).format('MM.DD'); item.DateEnd = moment(item.DateEnd).format('MM.DD'); const param2 = { UserID: param.UserID, ActivityInfoID: item.ActivityInfoID, }; item.MoneyPlan = 0; //预计回馈 const detailList = await activity.GetUserActivityInfo(param2); for (let j = 0; j < detailList.length; j++) { const itemChild = detailList[j]; let payMoney = 0; if (item.RuleCompute1 === "*") { payMoney = Math.round(itemChild.Money * Number(item.RuleCompute2)); } else if (item.RuleCompute1 === "-") { payMoney = itemChild.Money - Number(item.RuleCompute2); } if (item.Status === -1 && itemChild.IsRebate === 0) { result.MoneyNotPay += payMoney; result.MoneyTotal += payMoney; } else if (item.Status === -1 && itemChild.IsRebate === 1) { result.MoneyPay += payMoney; result.MoneyTotal += payMoney; } item.MoneyPlan += payMoney; } item.MoneyPlan = stringUtils.FormatMoney(item.MoneyPlan); item.List = detailList; if (item.Status === 1) { result.ActivityCurrent = item; } else { result.ActivityHistory.push(item); } } result.MoneyNotPay = stringUtils.FormatMoney(result.MoneyNotPay); result.MoneyTotal = stringUtils.FormatMoney(result.MoneyTotal); result.MoneyPay = stringUtils.FormatMoney(result.MoneyPay); ctx.body = { "errcode": 10000, result: result }; } else ctx.body = { "errcode": 10000 }; } /** * 得到当前活动 * 旧: exports.GetCurrentActivity */ export async function GetCurrentActivity(ctx) { const list = await activity.GetCurrentActivity(); if (list && list.length > 0) { const item = list[0]; ctx.body = { "errcode": 10000, result: item }; } else ctx.body = { "errcode": 10000 }; } /** * 参加活动 * 旧: exports.AddActivity */ export async function AddActivity(ctx) { let param = { UserID: ctx.query.UserID || 0, ActivityInfoID: ctx.query.ActivityInfoID || 0, }; if (param.UserID === "undefined") param.UserID = 0; const list = await activity.GetUserActivityInfo4(param); if (list && list.length > 0) { ctx.body = { "errcode": 10000 }; } else { param.CreateTime = new Date(); param.Status = 0; param.Flag = 0; await activity.AddActivity(param); ctx.body = { "errcode": 10000 }; } } /** * 支付活动经费 * 旧: exports.PayActivity * 使用 globalCache 替代旧的 BufferMemory 实现节流 */ export async function PayActivity(ctx) { let param = { UserID: ctx.query.UserID || 0, }; if (param.UserID === "undefined") param.UserID = 0; const cacheKey = "PayActivity?UserID=" + param.UserID; const canPay = globalCache.get(cacheKey); if (!canPay) { //计算费用 const list = await activity.GetCurrentActivityInfo(param); if (list && list.length > 0) { const result = {}; result.MoneyNotPay = 0; //未领取金额 const userIDArr = []; for (let i = 0; i < list.length; i++) { const item = list[i]; const param2 = { UserID: param.UserID, ActivityInfoID: item.ActivityInfoID, }; const detailList = await activity.GetUserActivityInfo(param2); for (let j = 0; j < detailList.length; j++) { const itemChild = detailList[j]; let payMoney = 0; if (item.RuleCompute1 === "*") { payMoney = Math.round(itemChild.Money * Number(item.RuleCompute2)); } else if (item.RuleCompute1 === "-") { payMoney = itemChild.Money - Number(item.RuleCompute2); } if (item.Status === -1 && itemChild.IsRebate === 0) { result.MoneyNotPay += payMoney; userIDArr.push(itemChild.UserID); } } } // 获取用户信息 const sql = "select * from WXUsers where UserID=?;"; const userInfo = await query(sql, [param.UserID]); if (userInfo && userInfo.length > 0 && result.MoneyNotPay > 0) { const text = "领取推广回馈,详见《数学练习小学口算版》小程序"; const url = "http://localhost:" + config.port + "/api/PayUserRebate/?PayType=2&UserID=" + param.UserID + "&OpenID=" + userInfo[0].OpenID + "&Money=" + result.MoneyNotPay + "&Text=" + text; console.log("url:" + url); // 异步调用支付接口(非阻塞) import('axios').then(axios => { axios.default.get(encodeURI(url)) .then(response => { if (response.data) { console.log("send ok:" + response.data.status); if (userIDArr.length > 0) { const sqlUpdate = "Update WXUsers SET IsRebate=1 where UserID in (" + userIDArr.join(",") + ");"; query(sqlUpdate).catch(err => console.error(err)); } } }) .catch(err => console.error(err)); }); } } // 设置缓存节流 globalCache.set(cacheKey, true, config.BufferMemoryTimeLowNormal); } else { console.log("CanNotPay"); } ctx.body = { "errcode": 10000 }; } /** * 得到领取记录 * 旧: exports.GetActivityMoneyList */ export async function GetActivityMoneyList(ctx) { let param = { UserID: ctx.query.UserID || 0, }; if (param.UserID === "undefined") param.UserID = 0; const result = { MoneyTotal: 0, List: [], }; // 从 ProductPayInfo 和 PaybackInfo 获取活动领取记录 const sql = "select ID,TradeNo,CreateTime,Body,Money from PaybackInfo where UserID=? order by ID desc"; const list = await query(sql, [param.UserID]); if (list && list.length > 0) { for (let i = 0; i < list.length; i++) { result.MoneyTotal += list[i].Money; list[i].Money = stringUtils.FormatMoney(list[i].Money); list[i].CreateTime = moment(list[i].CreateTime).format('YYYY年MM月DD日 HH:mm'); } result.MoneyTotal = stringUtils.FormatMoney(result.MoneyTotal); result.List = list; } ctx.body = { "errcode": 10000, result: result }; }