// 开发文档:https://uniapp.dcloud.io/uniCloud/clientdb?id=action
|
const db = uniCloud.database();
|
const dbCmd = db.command
|
const signInTable = db.collection('opendb-sign-in');
|
const scoresTable = db.collection('uni-id-scores');
|
module.exports = async function({user_id,ip}) {
|
let date = todayTimestamp()
|
let {
|
total
|
} = await signInTable.where({
|
user_id,
|
date,
|
isDelete: false
|
}).count()
|
console.log(total);
|
if (total) {
|
throw new Error("今天已经签到")
|
}
|
// state.newData.date = date
|
// state.newData.isDelete = false
|
|
await signInTable.add({
|
ip,
|
date,
|
user_id,
|
create_date:Date.now(),
|
isDelete:false,
|
})
|
|
|
// after -------------------------
|
//查最近7天的签到情况
|
let {
|
data: signInData
|
} = await signInTable.where({
|
user_id,
|
date: dbCmd.gte(date - 3600 * 24 * 6 * 1000),
|
isDelete: false
|
}).get()
|
|
let allDate = signInData.map(item => item.date)
|
|
//今天是本轮签到的第几天
|
const n = (date - Math.min(...allDate)) / 3600 / 24 / 1000 + 1;
|
//换成数字--第几天
|
let days = signInData.map(item => {
|
return (n * 10000 - (date - item.date) / 3600 / 24 / 1000 * 10000) / 10000 - 1
|
})
|
|
//查出来用户当前有多少积分
|
let {
|
data: [userScore]
|
} = await scoresTable
|
.where({
|
user_id
|
})
|
.orderBy("create_date", "desc")
|
.limit(1)
|
.get()
|
let balance = 0
|
if (userScore) {
|
balance = userScore.balance
|
}
|
|
if (n == 7) { //如果已经满一轮就软删除之前的内容
|
let setIsDeleteRes = await signInTable.where({
|
user_id,
|
date: dbCmd.neq(date)
|
}).update({
|
isDelete: true
|
})
|
console.log({
|
setIsDeleteRes
|
});
|
}
|
//给加积分
|
let score = n+days.length==14?60:10 //如果连续签到7天就多加50分,也就是60分
|
balance += score
|
let addScores = await scoresTable.add({
|
user_id,
|
balance,
|
score,
|
type: 1,
|
create_date: Date.now()
|
})
|
console.log({
|
addScores
|
});
|
return {
|
score: balance,
|
signInData,
|
n,
|
days
|
}
|
}
|
|
function todayTimestamp() {
|
//时区
|
let timeZone = new Date().getTimezoneOffset() / 60
|
//获得相对于北京时间的时间戳
|
let timestamp = Date.now() + 3600 * 1000 * (8 + timeZone)
|
//一天一共多少毫秒
|
const D = 3600 * 24 * 1000
|
//去掉余数,再减去东8区的8小时 得到当天凌晨的时间戳
|
return parseInt(timestamp / D) * D - 3600 * 1000 * 8
|
}
|