Commit 4b59e54c by zhangdongwei-intern

feat-1001865: 群打卡排行榜新增点赞和分享功能

parent d2167c92
......@@ -273,4 +273,11 @@ public interface GroupQrcodeDao extends BaseDao<GroupQrcode> {
* @return
*/
List<Long> getIdsByBookGroupId(Long bookGroupId);
/**
* 根据群id获取群信息
* @param wxGroupId
* @return
*/
GroupQrcode getByWxGroupId(String wxGroupId);
}
......@@ -277,4 +277,9 @@ public class GroupQrcodeDaoImpl extends BaseDaoImpl<GroupQrcode> implements Grou
public List<Long> getIdsByBookGroupId(Long bookGroupId) {
return this.getSqlSession().selectList(this.getStatement("getIdsByBookGroupId"), bookGroupId);
}
@Override
public GroupQrcode getByWxGroupId(String wxGroupId) {
return super.getSessionTemplate().selectOne(getStatement("getByWxGroupId"), wxGroupId);
}
}
package com.pcloud.book.util.common;
import com.pcloud.common.utils.string.StringUtil;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
/**
* @Describe: 工具类,实现阴阳历互转
* @Author: zhangdongwei
* @Date: Create on 22:01 2019/10/28 0028
*/
public class LunarCalendarUtils {
/**
* 支持转换的最小农历年份
*/
public static final int MIN_YEAR = 1900;
/**
* 支持转换的最大农历年份
*/
public static final int MAX_YEAR = 2099;
private static final String[] CHINESE_NUM = {"零", "一", "二", "三", "四" , "五" , "六" , "七", "八" , "九" , "十", "冬", "腊"};
private static final String[] HEAD = {"初", "十", "廿", "卅"};
private static final String[] GAN = {"甲","乙","丙","丁","戊","己","庚","辛","壬","癸"};
private static final String[] ZHI = {"子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"};
private static final int[] MONTH_DAY = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/**
* 公历每月前的天数
*/
private static final int[] DAYS_BEFORE_MONTH = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
/**
* 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
* 1. 前4位表示该年闰哪个月;
* 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
* 3. 最后7位表示农历年首(正月初一)对应的公历日期。
* 以2014年的数据0x955ABF为例说明:
* 1001 0101 0101 1010 1011 1111
* 闰九月 农历正月初一对应公历1月31号
*/
private static final int[] LUNAR_INFO = {
/*1900*/
0x84B6BF,
/*1901-1910*/
0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,
/*1911-1920*/
0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,
/*1921-1930*/
0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,
/*1931-1940*/
0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,
/*1941-1950*/
0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,
/*1951-1960*/
0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,
/*1961-1970*/
0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,
/*1971-1980*/
0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,
/*1981-1990*/
0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,
/*1991-2000*/
0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,
/*2001-2010*/
0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,
/*2011-2020*/
0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,
/*2021-2030*/
0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,
/*2031-2040*/
0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,
/*2041-2050*/
0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,
/*2051-2060*/
0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,
/*2061-2070*/
0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,
/*2071-2080*/
0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,
/*2081-2090*/
0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,
/*2091-2099*/
0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5
};
final static String[] SOLAR_TERM = new String[] { "小寒", "大寒", "立春", "雨水",
"惊蛰", "春分", "清明", "谷雨", "立夏", "小满", "芒种", "夏至", "小暑", "大暑", "立秋",
"处暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至" };
final static long[] SOLAR_TERM_INFO = new long[] { 0, 21208, 42467, 63836, 85337,
107014, 128867, 150921, 173149, 195551, 218072, 240693, 263343,
285989, 308563, 331033, 353350, 375494, 397447, 419210, 440795,
462224, 483532, 504758 };
/**
* 将农历日期转换为公历日期
*
* @param year 农历年份
* @param month 农历月
* @param monthDay 农历日
* @param isLeapMonth 该月是否是闰月
* @return 返回农历日期对应的公历日期,year0, month1, day2.
*/
public static final int[] lunarToSolar(int year, int month, int monthDay, boolean isLeapMonth) {
int dayOffset;
int leapMonth;
int i;
if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12
|| monthDay < 1 || monthDay > 30) {
throw new IllegalArgumentException(
"Illegal lunar date, must be like that:\n\t" +
"year : 1900~2099\n\t" +
"month : 1~12\n\t" +
"day : 1~30");
}
dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;
if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2) {
dayOffset += 31;
}
for (i = 1; i < month; i++) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0) {
dayOffset += 29;
} else {
dayOffset += 30;
}
}
dayOffset += monthDay;
leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;
// 这一年有闰月
if (leapMonth != 0) {
if (month > leapMonth || (month == leapMonth && isLeapMonth)) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0) {
dayOffset += 29;
} else {
dayOffset += 30;
}
}
}
if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {
year += 1;
if (year % 4 == 1) {
dayOffset -= 366;
} else {
dayOffset -= 365;
}
}
int[] solarInfo = new int[3];
for (i = 1; i < 13; i++) {
int iPos = DAYS_BEFORE_MONTH[i];
if (year % 4 == 0 && i > 2) {
iPos += 1;
}
if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {
solarInfo[1] = i;
solarInfo[2] = dayOffset - 31;
break;
}
if (iPos >= dayOffset) {
solarInfo[1] = i;
iPos = DAYS_BEFORE_MONTH[i - 1];
if (year % 4 == 0 && i > 2) {
iPos += 1;
}
if (dayOffset > iPos) {
solarInfo[2] = dayOffset - iPos;
} else if (dayOffset == iPos) {
if (year % 4 == 0 && i == 2) {
solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;
} else {
solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];
}
} else {
solarInfo[2] = dayOffset;
}
break;
}
}
solarInfo[0] = year;
return solarInfo;
}
/**
* 将公历日期转换为农历日期,且标识是否是闰月
*
* @param year
* @param month
* @param monthDay
* @return 返回公历日期对应的农历日期,year0,month1,day2,leap3
*/
public static final int[] solarToLunar(int year, int month, int monthDay) {
int[] lunarDate = new int[4];
Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();
Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();
int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
// 用offset减去每农历年的天数计算当天是农历第几天
// iYear最终结果是农历的年份, offset是当年的第几天
int iYear, daysOfYear = 0;
for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {
daysOfYear = daysInLunarYear(iYear);
offset -= daysOfYear;
}
if (offset < 0) {
offset += daysOfYear;
iYear--;
}
// 农历年份
lunarDate[0] = iYear;
int leapMonth = leapMonth(iYear);
// 闰哪个月,1-12
boolean isLeap = false;
// 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
int iMonth, daysOfMonth = 0;
for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {
daysOfMonth = daysInLunarMonth(iYear, iMonth);
offset -= daysOfMonth;
}
// 当前月超过闰月,要校正
if (leapMonth != 0 && iMonth > leapMonth) {
--iMonth;
if (iMonth == leapMonth) {
isLeap = true;
}
}
// offset小于0时,也要校正
if (offset < 0) {
offset += daysOfMonth;
--iMonth;
}
lunarDate[1] = iMonth;
lunarDate[2] = offset + 1;
lunarDate[3] = isLeap ? 1 : 0;
return lunarDate;
}
/**
* 传回农历year年month月的总天数
*
* @param year 要计算的年份
* @param month 要计算的月
* @return 传回天数
*/
final public static int daysInMonth(int year, int month) {
return daysInMonth(year, month, false);
}
/**
* 传回农历year年month月的总天数
*
* @param year 要计算的年份
* @param month 要计算的月
* @param leap 当月是否是闰月
* @return 传回天数,如果闰月是错误的,返回0.
*/
public static final int daysInMonth(int year, int month, boolean leap) {
int leapMonth = leapMonth(year);
int offset = 0;
// 如果本年有闰月且month大于闰月时,需要校正
if (leapMonth != 0 && month > leapMonth) {
offset = 1;
}
// 不考虑闰月
if (!leap) {
return daysInLunarMonth(year, month + offset);
} else {
// 传入的闰月是正确的月份
if (leapMonth != 0 && leapMonth == month) {
return daysInLunarMonth(year, month + 1);
}
}
return 0;
}
/**
* 传回农历 year年的总天数
*
* @param year 将要计算的年份
* @return 返回传入年份的总天数
*/
private static int daysInLunarYear(int year) {
int i, sum = 348;
if (leapMonth(year) != 0) {
sum = 377;
}
int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;
for (i = 0x80000; i > 0x7; i >>= 1) {
if ((monthInfo & i) != 0) {
sum += 1;
}
}
return sum;
}
/**
* 传回农历 year年month月的总天数,总共有13个月包括闰月
*
* @param year 将要计算的年份
* @param month 将要计算的月份
* @return 传回农历 year年month月的总天数
*/
private static int daysInLunarMonth(int year, int month) {
if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0) {
return 29;
} else {
return 30;
}
}
/**
* 传回农历 year年闰哪个月 1-12 , 没闰传回 0
*
* @param year 将要计算的年份
* @return 传回农历 year年闰哪个月1-12, 没闰传回 0
*/
private static int leapMonth(int year) {
return ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;
}
/**
* 返回某一年的元旦农历日期
* @param year
* @return
*/
private static int[] firstDayInLunar(int year){
return solarToLunar(year, 1, 1);
}
/**
* 某年的第n个节气为几日(从0小寒起算)
* @param y
* @param n
* @return
*/
final private static int sTerm(int y, int n) {
Calendar calendar = Calendar.getInstance();
calendar.set(1900, 0, 6, 2, 5, 0);
long temp = calendar.getTime().getTime();
calendar.setTime(new Date((long) ((31556925974.7 * (y - 1900) + SOLAR_TERM_INFO[n] * 60000L) + temp)));
return calendar.get(Calendar.DAY_OF_MONTH);
}
/**
* 传入年份,返回干支年
* 公元元年是辛酉年,干的周期是10,支的周期是12
* @param year
* @return
*/
private static String ganZhiYear(int year){
int gan = year % 10 > 3 ? (year % 10 - 3) : (year % 10 - 3 + 10);
int zhi = year % 12 > 3 ? (year % 12 - 3) : (year % 12 - 3 + 12);
return GAN[gan - 1] + ZHI[zhi - 1] + "年";
}
/**
* 传入年月日和农历年月,返回干支月
* 支的周期是12, 正好对应12个月
* 干的周期是10,每一年的一月的“干”间隔2(即只能是:甲丙戊庚壬),每年一月的周期是5,
* @param month
* @return
*/
private static String ganZhiMonth(int year, int month, int day, int lunarYear, int lunarMonth){
//该月第一个节气是一年里的第几个节气
int num = month * 2 - 2;
//计算该节气在几日
int d = sTerm(year, num);
int m = lunarMonth;
int y = lunarYear;
if (day < d){
//如果今天在本月第一个节气前 农历月份取上一月
y = lunarMonth == 1 ? lunarYear - 1 : lunarYear;
m = lunarMonth == 1 ? 12 : lunarMonth - 1;
}
int ganYear = y % 10 > 3 ? (y % 10 - 3) : (y % 10 - 3 + 10);
int gan = (ganYear * 2 + m) % 10;
gan = gan == 0 ? 10 : gan;
return GAN[gan-1] + ZHI[m%12 + 1] + "月";
}
/**
* 传入年日,返回干支日
* 1900年元旦 己亥年 【猪年】 丙子月 甲戌日
* @param year
* @param month
* @param day
* @return
*/
private static String ganZhiDay(int year, int month, int day){
int ganZhi = 0;
int num = 0;
for (int i = 1900; i < year ; i ++ ){
if(i % 400 == 0 || (i % 100 != 0 && i % 4 == 0)){
num += 366;
}else {
num += 365;
}
}
for(int i = 1; i < month; i++){
num += MONTH_DAY[i];
}
if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0)){
num += 1;
}
num += day;
num %= 60;
ganZhi = num + 10;
ganZhi = ganZhi > 60 ? ganZhi-60 : ganZhi;
int gan = ganZhi % 10 == 0 ? ganZhi % 10 + 10 : ganZhi % 10;
int zhi = ganZhi % 12 == 0 ? ganZhi % 12 + 12 : ganZhi % 12;
return GAN[gan - 1] + ZHI[zhi - 1] + "日";
}
/**
* 公历日期转农历日期
* @param date
* @return
*/
public static Map<String, String> dataToLunar(Date date){
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DATE);
int[] result = solarToLunar(year, month, day);
Map<String, String> strMap = new HashMap<>();
String lunar = CHINESE_NUM[result[0] / 1000] +
CHINESE_NUM[result[0] % 1000 / 100] +
CHINESE_NUM[result[0] % 100 / 10] +
CHINESE_NUM[result[0] % 10] + "年 " +
(result[3] == 1 ? "闰" : "") +
(result[1] == 1 ? "正" : CHINESE_NUM[result[1]]) + "月 ";
if (result[2] == 20 || result[2] == 30){
lunar += CHINESE_NUM[result[2] / 10];
}else{
lunar += HEAD[result[2] == 10 ? 0 : result[2] / 10];
}
lunar += CHINESE_NUM[result[2] % 10 == 0 ? 10 : result[2] % 10] + "日";
strMap.put("lunar", lunar);
String ganZhi = ganZhiYear(year) + " " + ganZhiMonth(year, month, day, result[0], result[1]) + " " + ganZhiDay(year, month, day);
strMap.put("ganZhi", ganZhi);
return strMap;
}
/*public static void main(String[] args){
SimpleDateFormat sdf =new SimpleDateFormat("yyyy/MM/dd HH:mm:ss" );
String str = "2023/2/1 00:00:00";
try {
Date d = sdf.parse(str);
*//*Calendar calendar = Calendar.getInstance();
calendar.setTime(d);
System.out.println(calendar.get(Calendar.MONTH) + 1);*//*
System.out.printf("字符串 %s 通过格式 yyyy/MM/dd HH:mm:ss %n转换为日期对象: %s\n",str,d.toString());
System.out.println(dataToLunar(d));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/
}
......@@ -2,6 +2,7 @@ package com.pcloud.book.weixinclock.biz;
import com.pcloud.book.group.vo.BookGroupClassifyVO;
import com.pcloud.book.group.vo.ListGroupClassifyParam;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.book.weixinclock.dto.WeixinClockDto;
import com.pcloud.common.exceptions.BizException;
......@@ -77,10 +78,10 @@ public interface WeixinClockBiz {
/**
* 获取某个群内的打卡排行榜
* @param wxGroupId
* @param dto
* @return
*/
PageBeanNew<RankDto> listWeixinClockRank(String wxGroupId, String wxUserId, Integer currentPage, Integer numPerPage);
PageBeanNew<RankDto> listWeixinClockRank(ListWeixinClockRankDto dto);
/**
* 获取某个群内某个用户的信息
......
package com.pcloud.book.weixinclock.biz;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.book.weixinclock.vo.request.PraiseForMemberRequestVO;
import java.util.List;
/**
* @Describe: 微信打卡点赞逻辑层
* @Author: zhangdongwei
* @Date: Create on 9:10 2019/10/23 0023
*/
public interface WeixinClockPraiseBiz {
/**
* 为打卡成员点赞/取消点赞
* @param vo
*/
void praiseForMember(PraiseForMemberRequestVO vo);
/**
* 填充打卡排行榜点赞信息
* @param list
* @param listWeixinClockRankDto
*/
void fillPraise(List<RankDto> list, ListWeixinClockRankDto listWeixinClockRankDto);
}
package com.pcloud.book.weixinclock.biz;
import com.pcloud.book.weixinclock.vo.response.DoShareResponseVO;
/**
* @Describe: 微信群打卡分享逻辑层
* @Author: zhangdongwei
* @Date: Create on 10:23 2019/10/29 0029
*/
public interface WeixinClockShareBiz {
/**
* 微信群打卡分享
* @param wechatUserId
* @param wxGroupId
* @param wxUserId
* @return
*/
DoShareResponseVO doShare(Long wechatUserId, String wxGroupId, String wxUserId);
}
......@@ -17,7 +17,9 @@ import com.pcloud.book.group.dto.GroupClassifyQrcodeDTO;
import com.pcloud.book.group.vo.BookGroupClassifyVO;
import com.pcloud.book.group.vo.ListGroupClassifyParam;
import com.pcloud.book.weixinclock.biz.WeixinClockBiz;
import com.pcloud.book.weixinclock.biz.WeixinClockPraiseBiz;
import com.pcloud.book.weixinclock.check.WeixinClockCheck;
import com.pcloud.book.weixinclock.dao.WeixinClockBrowseDao;
import com.pcloud.book.weixinclock.dao.WeixinClockDao;
import com.pcloud.book.weixinclock.dao.WeixinClockGroupClassifyDao;
import com.pcloud.book.weixinclock.dao.WeixinClockMemberDao;
......@@ -25,11 +27,14 @@ import com.pcloud.book.weixinclock.dao.WeixinClockPrizeRecordDao;
import com.pcloud.book.weixinclock.dao.WeixinClockRewardDao;
import com.pcloud.book.weixinclock.dao.WeixinClockTopicDao;
import com.pcloud.book.weixinclock.dto.DrawRewardDto;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.book.weixinclock.dto.WeixinClockDto;
import com.pcloud.book.weixinclock.entity.WeixinClock;
import com.pcloud.book.weixinclock.entity.WeixinClockBrowse;
import com.pcloud.book.weixinclock.entity.WeixinClockGroupClassify;
import com.pcloud.book.weixinclock.entity.WeixinClockMember;
import com.pcloud.book.weixinclock.entity.WeixinClockPraise;
import com.pcloud.book.weixinclock.entity.WeixinClockPrizeRecord;
import com.pcloud.book.weixinclock.entity.WeixinClockTopic;
import com.pcloud.channelcenter.base.constants.ChannelConstants;
......@@ -125,6 +130,10 @@ public class WeixinClockBizImpl implements WeixinClockBiz {
private WeixinClockPrizeRecordDao weixinClockPrizeRecordDao;
@Autowired
private AdviserConsr adviserConsr;
@Autowired
private WeixinClockPraiseBiz weixinClockPraiseBiz;
@Autowired
private WeixinClockBrowseDao weixinClockBrowseDao;
private static final ThreadFactory NAMED_THREAD_FACTORY = new ThreadFactoryBuilder()
.setNameFormat("weixinclock-pool-%d").build();
......@@ -326,6 +335,7 @@ public class WeixinClockBizImpl implements WeixinClockBiz {
WeixinClockDto weixinClockDto = weixinClockDao.getWeixinClockBaseInfo(weixinClockId);
if(null != weixinClockDto && null != weixinClockDto.getClockPrizeId() && !weixinClockDto.getClockPrizeId().equals(0L)) {
AppDto appDto = appConsr.getBaseById(weixinClockDto.getClockPrizeId());
appDto = null == appDto ? new AppDto() :appDto;
DrawRewardDto drawRewardDto = new DrawRewardDto();
drawRewardDto.setAppId(weixinClockDto.getClockPrizeId());
drawRewardDto.setChannelId(appDto.getChannelId());
......@@ -584,21 +594,29 @@ public class WeixinClockBizImpl implements WeixinClockBiz {
/**
* 获取某个群内的打卡排行榜
* @param wxGroupId
* @param wxUserId
* @param dto
* @return
*/
@Override
@ParamLog("获取某个群内的打卡排行榜")
public PageBeanNew<RankDto> listWeixinClockRank(String wxGroupId, String wxUserId, Integer currentPage, Integer numPerPage) {
PageParam pageParam = new PageParam(currentPage, numPerPage);
public PageBeanNew<RankDto> listWeixinClockRank(ListWeixinClockRankDto dto) {
PageParam pageParam = new PageParam(dto.getCurrentPage(), dto.getNumPerPage());
Map<String, Object> map = new HashMap<>();
map.put("wxGroupId", wxGroupId);
map.put("wxUserId", wxUserId);
map.put("wxGroupId", dto.getWxGroupId());
map.put("wxUserId", dto.getWxUserId());
PageBeanNew<RankDto> rankDtos = weixinClockMemberDao.listPageNew(pageParam, map, "listWeixinClockRank");
if (null == rankDtos || ListUtils.isEmpty(rankDtos.getRecordList())) {
return new PageBeanNew<>(currentPage, numPerPage, 0, new ArrayList<>());
return new PageBeanNew<>(dto.getCurrentPage(), dto.getNumPerPage(), 0, new ArrayList<>());
}
List<RankDto> list = rankDtos.getRecordList();
weixinClockPraiseBiz.fillPraise(list, dto);
rankDtos.setRecordList(list);
//埋点,用户浏览排行榜记录
WeixinClockBrowse clockBrowse = new WeixinClockBrowse();
BeanUtils.copyProperties(dto, clockBrowse);
clockBrowse.setBrowseTime(new Date());
clockBrowse.setIpAddress(dto.getIpAddress());
weixinClockBrowseDao.insert(clockBrowse);
return rankDtos;
}
......
package com.pcloud.book.weixinclock.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.weixinclock.biz.WeixinClockPraiseBiz;
import com.pcloud.book.weixinclock.dao.WeixinClockMemberDao;
import com.pcloud.book.weixinclock.dao.WeixinClockPraiseDao;
import com.pcloud.book.weixinclock.dto.GetByMemberAndUserDto;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.book.weixinclock.entity.WeixinClockMember;
import com.pcloud.book.weixinclock.entity.WeixinClockPraise;
import com.pcloud.book.weixinclock.vo.request.PraiseForMemberRequestVO;
import com.pcloud.common.utils.ListUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @Describe: 微信打卡点赞逻辑层实现类
* @Author: zhangdongwei
* @Date: Create on 9:10 2019/10/23 0023
*/
@Service("weixinClockPraiseBiz")
public class WeixinClockPraiseBizImpl implements WeixinClockPraiseBiz {
@Autowired
private WeixinClockPraiseDao weixinClockPraiseDao;
@Autowired
private WeixinClockMemberDao weixinClockMemberDao;
@Override
@Transactional(rollbackFor = Exception.class)
public void praiseForMember(PraiseForMemberRequestVO vo) {
//根据微信群id和打卡成员id获取打卡成员信息
WeixinClockMember weixinClockMember = weixinClockMemberDao.getByWxUserId(vo.getWxGroupId(), vo.getWxUserId());
Optional.ofNullable(weixinClockMember).orElseThrow(() -> new BookBizException(BookBizException.ID_NOT_EXIST, "该打卡成员不存在,不能点赞"));
if (weixinClockMember.getAllClockDay() <= 0){
throw new BookBizException(BookBizException.ID_NOT_EXIST, "该打卡成员未打过卡,不能点赞");
}
//获取当天零点的时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date zero = calendar.getTime();
GetByMemberAndUserDto dto = new GetByMemberAndUserDto();
dto.setCreateTime(zero);
dto.setWechatUserId(vo.getPraiseUserId());
dto.setWxGroupId(vo.getWxGroupId());
dto.setWxUserId(vo.getWxUserId());
WeixinClockPraise oldWeixinClockPraise = weixinClockPraiseDao.getByMemberAndUser(dto);
WeixinClockPraise weixinClockPraise = PraiseForMemberRequestVO.valueToClockPraise(vo);
weixinClockPraise.setWeixinClockId(weixinClockMember.getWeixinClockId());
if (null == oldWeixinClockPraise){
weixinClockPraise.setIsCancel(1);
weixinClockPraiseDao.insert(weixinClockPraise);
}else{
weixinClockPraise.setId(oldWeixinClockPraise.getId());
weixinClockPraiseDao.update(weixinClockPraise);
}
}
@Override
public void fillPraise(List<RankDto> list, ListWeixinClockRankDto listWeixinClockRankDto) {
if (ListUtils.isEmpty(list)){
return;
}
List<String> wxUserIds = list.stream().map(RankDto::getWxUserId).collect(Collectors.toList());
if (ListUtils.isEmpty(wxUserIds)){
return;
}
listWeixinClockRankDto.setWxUserIdList(wxUserIds);
List<WeixinClockPraise> weixinClockPraiseList = weixinClockPraiseDao.getMemberPraise(listWeixinClockRankDto);
Map<String, List<WeixinClockPraise>> praiseMap = weixinClockPraiseList.stream().collect(Collectors.groupingBy(WeixinClockPraise::getWxUserId));
Map<String, Boolean> map = new HashMap<>();
//获取当天零点的时间
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date zero = calendar.getTime();
for (WeixinClockPraise praise : weixinClockPraiseList){
if (null == praise.getPraiseUserId()
|| !listWeixinClockRankDto.getWechatUserId().equals(praise.getPraiseUserId())
|| map.getOrDefault(praise.getWxUserId(), Boolean.FALSE )|| praise.getCreateTime().before(zero)){
continue;
}
map.put(praise.getWxUserId(), Boolean.TRUE);
}
for (RankDto rankDto : list){
rankDto.setPraiseNum(ListUtils.isEmpty(praiseMap.get(rankDto.getWxUserId())) ? 0 : praiseMap.get(rankDto.getWxUserId()).size());
rankDto.setIsPraise(map.getOrDefault(rankDto.getWxUserId(), Boolean.FALSE) ? 1 : 0);
}
}
}
package com.pcloud.book.weixinclock.biz.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.group.dao.GroupQrcodeDao;
import com.pcloud.book.group.entity.GroupQrcode;
import com.pcloud.book.util.common.LunarCalendarUtils;
import com.pcloud.book.weixinclock.biz.WeixinClockShareBiz;
import com.pcloud.book.weixinclock.dao.WeixinClockMemberDao;
import com.pcloud.book.weixinclock.dao.WeixinClockShareDao;
import com.pcloud.book.weixinclock.dao.WeixinClockShareWordDao;
import com.pcloud.book.weixinclock.dao.WeixinClockTopicDao;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.book.weixinclock.entity.WeixinClockMember;
import com.pcloud.book.weixinclock.entity.WeixinClockShare;
import com.pcloud.book.weixinclock.vo.response.DoShareResponseVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Map;
/**
* @Describe: 微信群打卡分享逻辑层实现
* @Author: zhangdongwei
* @Date: Create on 10:24 2019/10/29 0029
*/
@Service("weixinClockShareBiz")
public class WeixinClockShareBizImpl implements WeixinClockShareBiz {
@Autowired
private WeixinClockShareWordDao weixinClockShareWordDao;
@Autowired
private WeixinClockMemberDao weixinClockMemberDao;
@Autowired
private WeixinClockTopicDao weixinClockTopicDao;
@Autowired
private GroupQrcodeDao groupQrcodeDao;
@Autowired
private WeixinClockShareDao weixinClockShareDao;
@Override
public DoShareResponseVO doShare(Long wechatUserId, String wxGroupId, String wxUserId) {
if (null == wxGroupId || null == wxUserId){
throw new BookBizException(BookBizException.PARAM_IS_NULL, "分享失败,参数为空");
}
RankDto rankDto = weixinClockMemberDao.getClockWechatUserRank(wechatUserId, wxGroupId);
if (null == rankDto || null == rankDto.getWxUserId()){
rankDto = weixinClockMemberDao.getClockWechatUserRankByWxUserId(wxUserId, wxGroupId);
}
if (null == rankDto){
return new DoShareResponseVO();
}
wxUserId = null != rankDto.getWxUserId() ? rankDto.getWxUserId() : wxUserId;
DoShareResponseVO doShareResponseVO = DoShareResponseVO.valueFromRankDto(rankDto);
Date today = new Date();
Map<String, String> strMap = LunarCalendarUtils.dataToLunar(today);
doShareResponseVO.setLunar(strMap.get("lunar"));
doShareResponseVO.setToday(today);
doShareResponseVO.setGanZhi(strMap.get("ganZhi"));
String shareWord = weixinClockShareWordDao.getRoundWord();
doShareResponseVO.setShareWord(shareWord);
Date date = weixinClockTopicDao.getFirstClockDay(wxUserId, wxGroupId);
doShareResponseVO.setStartClockDate(date);
GroupQrcode groupQrcode = groupQrcodeDao.getByWxGroupId(wxGroupId);
doShareResponseVO.setTitle(groupQrcode.getGroupName());
doShareResponseVO.setQrcodeUrl(groupQrcode.getQrcodeUrl());
//埋点,用户分享记录
WeixinClockShare weixinClockShare = new WeixinClockShare();
weixinClockShare.setShareTime(new Date());
weixinClockShare.setShareUserId(wechatUserId);
weixinClockShare.setWxGroupId(wxGroupId);
weixinClockShareDao.insert(weixinClockShare);
return doShareResponseVO;
}
}
package com.pcloud.book.weixinclock.dao;
import com.pcloud.book.weixinclock.entity.WeixinClockBrowse;
import com.pcloud.common.core.dao.BaseDao;
/**
* @Describe: 微信打卡分享记录dao接口层
* @Author: zhangdongwei
* @Date: Create on 17:03 2019/10/31 0031
*/
public interface WeixinClockBrowseDao extends BaseDao<WeixinClockBrowse> {
}
\ No newline at end of file
......@@ -57,4 +57,12 @@ public interface WeixinClockMemberDao extends BaseDao<WeixinClockMember> {
* @return
*/
void updatMemberWechatUserId(String wxUserId, Long wechatUserId);
/**
* 获取某个群内某个用户的信息
* @param wxGroupId
* @param wxUserId
* @return
*/
RankDto getClockWechatUserRankByWxUserId(String wxUserId, String wxGroupId);
}
package com.pcloud.book.weixinclock.dao;
import com.pcloud.book.weixinclock.dto.GetByMemberAndUserDto;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.entity.WeixinClockPraise;
import com.pcloud.common.core.dao.BaseDao;
import java.util.List;
/**
* @Describe: 打卡点赞dao
* @Author: zhangdongwei
* @Date: Create on 17:19 2019/10/22 0022
*/
public interface WeixinClockPraiseDao extends BaseDao<WeixinClockPraise> {
/**
* 获取用户为成员点赞信息
* @param dto
* @return
*/
WeixinClockPraise getByMemberAndUser(GetByMemberAndUserDto dto);
/**
* 获取去打卡成员收到的点赞
* @param dto
* @return
*/
List<WeixinClockPraise> getMemberPraise(ListWeixinClockRankDto dto);
}
package com.pcloud.book.weixinclock.dao;
import com.pcloud.book.weixinclock.entity.WeixinClockShare;
import com.pcloud.common.core.dao.BaseDao;
/**
* @Describe: 微信群打卡分享dao接口层
* @Author: zhangdongwei
* @Date: Create on 17:40 2019/10/31 0031
*/
public interface WeixinClockShareDao extends BaseDao<WeixinClockShare> {
}
\ No newline at end of file
package com.pcloud.book.weixinclock.dao;
import com.pcloud.book.weixinclock.entity.WeixinClockShareWord;
import com.pcloud.common.core.dao.BaseDao;
/**
* @Describe: 微信打卡分享句子dao接口
* @Author: zhangdongwei
* @Date: Create on 9:52 2019/10/29 0029
*/
public interface WeixinClockShareWordDao extends BaseDao<WeixinClockShareWord> {
/**
* 随机获取一个句子
* @return
*/
String getRoundWord();
}
......@@ -3,6 +3,8 @@ package com.pcloud.book.weixinclock.dao;
import com.pcloud.book.weixinclock.entity.WeixinClockTopic;
import com.pcloud.common.core.dao.BaseDao;
import java.util.Date;
/**
* @author 杨涛
* @description TODO
......@@ -26,4 +28,12 @@ public interface WeixinClockTopicDao extends BaseDao<WeixinClockTopic> {
*/
Long getClockCountByUser(String wxGroupId, String wxUserId);
/**
* 获取成员第一次打卡日期
* @param wxUserId
* @param wxGroupId
* @return
*/
Date getFirstClockDay(String wxUserId, String wxGroupId);
}
package com.pcloud.book.weixinclock.dao.impl;
import com.pcloud.book.weixinclock.dao.WeixinClockBrowseDao;
import com.pcloud.book.weixinclock.entity.WeixinClockBrowse;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Describe: 微信打卡分享记录dao实现层
* @Author: zhangdongwei
* @Date: Create on 17:08 2019/10/31 0031
*/
@Repository("weixinClockBrowseDao")
public class WeixinClockBrowseDaoImpl extends BaseDaoImpl<WeixinClockBrowse> implements WeixinClockBrowseDao {
}
\ No newline at end of file
......@@ -92,4 +92,12 @@ public class WeixinClockMemberDaoImpl extends BaseDaoImpl<WeixinClockMember> imp
paramMap.put("wechatUserId",wechatUserId);
super.sqlSessionTemplate.update(getStatement("updatMemberWechatUserId"),paramMap);
}
@Override
public RankDto getClockWechatUserRankByWxUserId(String wxUserId, String wxGroupId) {
Map<String, Object> map = new HashMap<>();
map.put("wxUserId", wxUserId);
map.put("wechatGroupId", wxGroupId);
return super.getSqlSession().selectOne(getStatement("getClockWechatUserRankByWxUserId"), map);
}
}
package com.pcloud.book.weixinclock.dao.impl;
import com.pcloud.book.weixinclock.dao.WeixinClockPraiseDao;
import com.pcloud.book.weixinclock.dto.GetByMemberAndUserDto;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.entity.WeixinClockPraise;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @Describe: 打卡点赞dao实现类
* @Author: zhangdongwei
* @Date: Create on 17:20 2019/10/22 0022
*/
@Repository("weixinClockPraise")
public class WeixinClockPraiseDaoImpl extends BaseDaoImpl<WeixinClockPraise> implements WeixinClockPraiseDao {
@Override
public WeixinClockPraise getByMemberAndUser(GetByMemberAndUserDto dto){
return super.sqlSessionTemplate.selectOne(getStatement("getByMemberAndUser"), dto);
}
@Override
public List<WeixinClockPraise> getMemberPraise(ListWeixinClockRankDto dto) {
return super.sqlSessionTemplate.selectList(getStatement("getMemberPraise"), dto);
}
}
package com.pcloud.book.weixinclock.dao.impl;
import com.pcloud.book.weixinclock.dao.WeixinClockShareDao;
import com.pcloud.book.weixinclock.entity.WeixinClockShare;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Describe: 微信群打卡分享dao实现层
* @Author: zhangdongwei
* @Date: Create on 17:42 2019/10/31 0031
*/
@Repository("weixinClockShareDao")
public class WeixinClockShareDaoImpl extends BaseDaoImpl<WeixinClockShare> implements WeixinClockShareDao {
}
\ No newline at end of file
package com.pcloud.book.weixinclock.dao.impl;
import com.pcloud.book.weixinclock.dao.WeixinClockShareWordDao;
import com.pcloud.book.weixinclock.entity.WeixinClockShareWord;
import com.pcloud.common.core.dao.BaseDaoImpl;
import org.springframework.stereotype.Repository;
/**
* @Describe: 微信打卡分享句子dao接口实现
* @Author: zhangdongwei
* @Date: Create on 9:52 2019/10/29 0029
*/
@Repository("weixinClockShareWordDao")
public class WeixinClockShareWordDaoImpl extends BaseDaoImpl<WeixinClockShareWord> implements WeixinClockShareWordDao {
@Override
public String getRoundWord() {
return super.sqlSessionTemplate.selectOne(getStatement("getRoundWord"));
}
}
......@@ -9,6 +9,7 @@ import com.pcloud.common.utils.DateNewUtils;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.Map;
/**
......@@ -42,4 +43,12 @@ public class WeixinClockTopicDaoImpl extends BaseDaoImpl<WeixinClockTopic> imple
return super.getSqlSession().selectOne(getStatement("getClockCountByUser"), paramMap);
}
@Override
public Date getFirstClockDay(String wxUserId, String wxGroupId) {
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("wxGroupId", wxGroupId);
paramMap.put("wxUserId", wxUserId);
return super.getSqlSession().selectOne(getStatement("getFirstClockDay"), paramMap);
}
}
package com.pcloud.book.weixinclock.dto;
import java.util.Date;
import lombok.Data;
/**
* @Describe: 获取用户为打卡成员点赞参数dto
* @Author: zhangdongwei
* @Date: Create on 16:39 2019/10/29 0029
*/
@Data
public class GetByMemberAndUserDto {
private String wxUserId;
private String wxGroupId;
private Long wechatUserId;
private Date createTime;
}
package com.pcloud.book.weixinclock.dto;
import java.util.List;
import lombok.Data;
/**
* @Describe: 获取微信群打卡排名请求dto
* @Author: zhangdongwei
* @Date: Create on 10:11 2019/10/28 0028
*/
@Data
public class ListWeixinClockRankDto {
/**
* 微信群id
*/
private String wxGroupId;
/**
* 微信打卡成员id
*/
private String wxUserId;
/**
* 微信用户di
*/
private Long wechatUserId;
/**
* 当前页
*/
private Integer currentPage;
/**
* 每页条数
*/
private Integer numPerPage;
/**
* 打卡成员id列表
*/
private List<String> wxUserIdList;
private String ipAddress;
}
\ No newline at end of file
......@@ -16,6 +16,9 @@ public class RankDto extends BaseDto {
@ApiModelProperty("排名")
private Integer rankNum;
@ApiModelProperty("打卡成员微信号")
private String wxUserId;
@ApiModelProperty("昵称")
private String nickname;
......@@ -25,6 +28,12 @@ public class RankDto extends BaseDto {
@ApiModelProperty("打卡次数")
private Integer clockNum;
@ApiModelProperty("获取的点赞数")
private Integer praiseNum;
@ApiModelProperty("当前用户是否点赞")
private Integer isPraise;
public Integer getRankNum() {
return rankNum;
}
......@@ -33,6 +42,14 @@ public class RankDto extends BaseDto {
this.rankNum = rankNum;
}
public String getWxUserId() {
return wxUserId;
}
public void setWxUserId(String wxUserId) {
this.wxUserId = wxUserId;
}
public String getNickname() {
return nickname;
}
......@@ -57,6 +74,22 @@ public class RankDto extends BaseDto {
this.clockNum = clockNum;
}
public Integer getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Integer praiseNum) {
this.praiseNum = praiseNum;
}
public Integer getIsPraise() {
return isPraise;
}
public void setIsPraise(Integer isPraise) {
this.isPraise = isPraise;
}
@Override
public String toString() {
return "RankDto{" +
......@@ -64,6 +97,8 @@ public class RankDto extends BaseDto {
", nickname='" + nickname + '\'' +
", headPic='" + headPic + '\'' +
", clockNum=" + clockNum +
", praiseNum=" + praiseNum +
", isPraise=" + isPraise +
'}';
}
}
package com.pcloud.book.weixinclock.entity;
import com.pcloud.common.entity.BaseEntity;
import java.util.Date;
import lombok.Data;
/**
* @Describe: 打卡排行榜浏览记录实体类
* @Author: zhangdongwei
* @Date: Create on 17:00 2019/10/31 0031
*/
@Data
public class WeixinClockBrowse extends BaseEntity {
/**
* 微信打卡id
*/
private Long weixinClockId;
/**
* 微信群id
*/
private String wxGroupId;
/**
* 微信用户id
*/
private Long wechatUserId;
/**
* 浏览时间
*/
private Date browseTime;
}
\ No newline at end of file
package com.pcloud.book.weixinclock.entity;
import com.pcloud.common.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* @Describe: 打卡点赞实体
* @Author: zhangdongwei
* @Date: Create on 10:46 2019/10/22 0022
*/
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class WeixinClockPraise extends BaseEntity {
/**
* 打卡id
*/
private Long weixinClockId;
/**
* 打卡成员id
*/
private String wxUserId;
/**
* 打卡所在微信群id
*/
private String wxGroupId;
/**
* 点赞用户id
*/
private Long praiseUserId;
/**
* 是否取消点赞
*/
private Integer isCancel;
}
package com.pcloud.book.weixinclock.entity;
import com.pcloud.common.entity.BaseEntity;
import java.util.Date;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* @Describe: 打卡分享实体
* @Author: zhangdongwei
* @Date: Create on 11:53 2019/10/22 0022
*/
@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class WeixinClockShare extends BaseEntity {
/**
* 分享用户id
*/
private Long shareUserId;
/**
* 微信群id
*/
private String wxGroupId;
/**
* 分享时间
*/
private Date shareTime;
}
package com.pcloud.book.weixinclock.entity;
import com.pcloud.common.entity.BaseEntity;
import lombok.Data;
import lombok.ToString;
/**
* @Describe: 微信打卡分享句子
* @Author: zhangdongwei
* @Date: Create on 9:39 2019/10/29 0029
*/
@Data
@ToString(callSuper = true)
public class WeixinClockShareWord extends BaseEntity {
private String shareWord;
}
......@@ -16,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
......@@ -103,7 +105,8 @@ public interface WeixinClockFacade {
@RequestParam(value = "wxGroupId", required = false) String wxGroupId,
@RequestParam(value = "wxUserId", required = false) String wxUserId,
@RequestParam(value = "currentPage", required = false) Integer currentPage,
@RequestParam(value = "numPerPage", required = false) Integer numPerPage)
@RequestParam(value = "numPerPage", required = false) Integer numPerPage,
HttpServletRequest request)
throws BizException, PermissionException;
@ApiOperation("获取某个群内某个用户的信息")
......
......@@ -4,6 +4,7 @@ import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.group.vo.BookGroupClassifyVO;
import com.pcloud.book.group.vo.ListGroupClassifyParam;
import com.pcloud.book.weixinclock.biz.WeixinClockBiz;
import com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto;
import com.pcloud.book.weixinclock.dto.WeixinClockDto;
import com.pcloud.book.weixinclock.facade.WeixinClockFacade;
import com.pcloud.common.dto.ResponseDto;
......@@ -13,6 +14,7 @@ import com.pcloud.common.page.PageParam;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.SessionUtil;
import com.pcloud.common.utils.cookie.Cookie;
import com.pcloud.common.utils.nginx.NginxUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CookieValue;
......@@ -26,6 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import io.swagger.annotations.ApiParam;
/**
......@@ -181,10 +185,19 @@ public class WeixinClockFacadeImpl implements WeixinClockFacade {
@RequestParam(value = "wxGroupId", required = false) String wxGroupId,
@RequestParam(value = "wxUserId", required = false) String wxUserId,
@RequestParam(value = "currentPage", required = false) Integer currentPage,
@RequestParam(value = "numPerPage", required = false) Integer numPerPage)
@RequestParam(value = "numPerPage", required = false) Integer numPerPage,
HttpServletRequest request)
throws BizException, PermissionException {
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
return new ResponseDto<>(weixinClockBiz.listWeixinClockRank(wxGroupId, wxUserId, currentPage, numPerPage));
ListWeixinClockRankDto dto = new ListWeixinClockRankDto();
dto.setCurrentPage(currentPage);
dto.setNumPerPage(numPerPage);
dto.setWxGroupId(wxGroupId);
dto.setWxGroupId(wxGroupId);
dto.setWechatUserId(wechatUserId);
String ipAddress = NginxUtils.getClientIp(request);
dto.setIpAddress(ipAddress);
return new ResponseDto<>(weixinClockBiz.listWeixinClockRank(dto));
}
/**
......
package com.pcloud.book.weixinclock.facade.impl;
import com.pcloud.book.base.exception.BookBizException;
import com.pcloud.book.weixinclock.biz.WeixinClockPraiseBiz;
import com.pcloud.book.weixinclock.vo.request.PraiseForMemberRequestVO;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.cookie.Cookie;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Optional;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
/**
* @Describe: 微信打卡点赞外部接口实现
* @Author: zhangdongwei
* @Date: Create on 17:37 2019/10/22 0022
*/
@Api(description = "微信群签到打卡")
@RestController("weixinClockPraiseFacade")
@RequestMapping("weixinClockPraise")
public class WeixinClockPraiseFacadeImpl {
@Autowired
private WeixinClockPraiseBiz weixinClockPraiseBiz;
/**
* 为打卡成员点赞/取消点赞
* @param userInfo
* @param vo
* @return
* @throws BizException
* @throws PermissionException
*/
@ApiOperation(value = "为打卡成员点赞/取消点赞", httpMethod = "POST")
@PostMapping("praiseForMember")
public ResponseDto<?> praiseForMember(@CookieValue("userInfo") String userInfo, @RequestBody PraiseForMemberRequestVO vo) throws BizException, PermissionException {
Optional.ofNullable(vo).orElseThrow(() -> new BookBizException(BookBizException.PARAM_IS_ERROR, "点赞失败,参数为空"));
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
vo.setPraiseUserId(wechatUserId);
weixinClockPraiseBiz.praiseForMember(vo);
return new ResponseDto<>();
}
}
package com.pcloud.book.weixinclock.facade.impl;
import com.pcloud.book.weixinclock.biz.WeixinClockShareBiz;
import com.pcloud.common.dto.ResponseDto;
import com.pcloud.common.exceptions.BizException;
import com.pcloud.common.permission.PermissionException;
import com.pcloud.common.utils.cookie.Cookie;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
/**
* @Describe: 微信群打卡分享接口类
* @Author: zhangdongwei
* @Date: Create on 10:21 2019/10/29 0029
*/
@Api(description = "微信群签到打卡分享")
@RestController("weixinClockShareFacade")
@RequestMapping("weixinClockShare")
public class WeixinClockShareFacadeImpl {
@Autowired
private WeixinClockShareBiz weixinClockShareBiz;
/**
* 获取我的打卡排名
* @param userInfo
* @param wxGroupId
* @param wxUserId
* @return
* @throws BizException
* @throws PermissionException
*/
@ApiOperation("分享我的排名")
@ApiImplicitParams({@ApiImplicitParam(name = "wxGroupId", value = "微信群id", dataType = "string", paramType = "query"),
@ApiImplicitParam(name = "weUserId", value = "微信群id", dataType = "string", paramType = "query")})
@RequestMapping(value = "doShare", method = RequestMethod.GET)
public ResponseDto<?> doShare(@CookieValue("userInfo") String userInfo,
@RequestParam("wxGroupId") String wxGroupId,
@RequestParam("wxUserId") String wxUserId) throws BizException, PermissionException {
Long wechatUserId = Cookie.getId(userInfo, Cookie._WECHAT_USER_ID);
return new ResponseDto<>(weixinClockShareBiz.doShare(wechatUserId, wxGroupId, wxUserId));
}
}
package com.pcloud.book.weixinclock.vo.request;
import com.pcloud.book.weixinclock.entity.WeixinClockPraise;
import com.pcloud.common.utils.bean.BeanUtils;
import com.pcloud.common.vo.BaseVO;
import javax.validation.constraints.NotNull;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Describe: 为打卡成员点赞请求vo
* @Author: zhangdongwei
* @Date: Create on 17:57 2019/10/22 0022
*/
@Data
@ApiModel("为打卡成员点赞请求类")
public class PraiseForMemberRequestVO extends BaseVO {
/**
* 点赞人id
*/
private Long praiseUserId;
/**
* 打卡成员id
*/
@NotNull(message = "打卡成员不能为空")
@ApiModelProperty("打卡成员id")
private String wxUserId;
/**
* 群id
*/
@NotNull(message = "群id不能为空")
@ApiModelProperty("打卡关联微信群id")
private String wxGroupId;
@ApiModelProperty("是否取消点赞")
private Integer isCancel;
public static WeixinClockPraise valueToClockPraise(PraiseForMemberRequestVO vo){
WeixinClockPraise weixinClockPraise = BeanUtils.copy(vo, WeixinClockPraise.class);
weixinClockPraise.setIsCancel(vo.getIsCancel() == null ? 0 : vo.getIsCancel());
return weixinClockPraise;
}
}
package com.pcloud.book.weixinclock.vo.response;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.pcloud.book.weixinclock.dto.RankDto;
import com.pcloud.common.utils.BeanUtils;
import com.pcloud.common.vo.BaseVO;
import java.util.Date;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Describe: 微信群打卡分享返回类
* @Author: zhangdongwei
* @Date: Create on 10:43 2019/10/29 0029
*/
@Data
@ApiModel("微信群打卡分享返回类")
public class DoShareResponseVO extends BaseVO {
@ApiModelProperty("排名")
private Integer rankNum;
@ApiModelProperty("打卡成员微信号")
private String wxUserId;
@ApiModelProperty("昵称")
private String nickname;
@ApiModelProperty("头像")
private String headPic;
@ApiModelProperty("打卡次数")
private Integer clockNum;
@ApiModelProperty("开始打卡日期")
@JsonFormat(
pattern = "yyyy-MM-dd HH:mm:ss",
timezone = "GMT+8"
)
private Date startClockDate;
@ApiModelProperty("今天日期")
@JsonFormat(
pattern = "MM/dd",
timezone = "GMT+8"
)
private Date today;
@ApiModelProperty("农历日期")
private String lunar;
@ApiModelProperty("干支日期")
private String ganZhi;
@ApiModelProperty("分享句子")
private String shareWord;
@ApiModelProperty("二维码链接")
private String qrcodeUrl;
@ApiModelProperty("标题")
private String title;
public static DoShareResponseVO valueFromRankDto(RankDto dto){
DoShareResponseVO vo = new DoShareResponseVO();
BeanUtils.copyProperties(dto, vo);
return vo;
}
}
......@@ -770,5 +770,10 @@
WHERE
c.book_group_id = #{bookGroupId}
</select>
<select id="getByWxGroupId" parameterType="string" resultMap="BaseResultMap">
select <include refid="Base_Column_List"/>
from book_group_qrcode where weixin_group_id = #{wxGroupId}
and is_delete = 0
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.weixinclock.dao.impl.WeixinClockBrowseDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.weixinclock.entity.WeixinClockBrowse">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="weixin_clock_id" property="weixinClockId" jdbcType="BIGINT" />
<result column="wx_group_id" property="wxGroupId" jdbcType="VARCHAR" />
<result column="wechat_user_id" property="wechatUserId" jdbcType="BIGINT" />
<result column="browse_time" property="browseTime" jdbcType="TIMESTAMP" />
<result column="ip_address" property="ipAddress" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List" >
id, weixin_clock_id, wx_group_id, wechat_user_id, browse_time, ip_address
</sql>
<insert id="insert" parameterType="com.pcloud.book.weixinclock.entity.WeixinClockBrowse" useGeneratedKeys="true" keyProperty="id">
insert into weixin_clock_browse (weixin_clock_id, wx_group_id, wechat_user_id, browse_time, ip_address)
values (#{weixinClockId}, #{wxGroupId}, #{wechatUserId}, #{browseTime}, #{ipAddress})
</insert>
</mapper>
......@@ -35,7 +35,7 @@
<select id="listWeixinClockRank" parameterType="map" resultType="com.pcloud.book.weixinclock.dto.RankDto">
SELECT
w.all_clock_day clockNum, w.nickname nickname, w.head_pic headPic, (@i :=@i + 1) rankNum
w.wx_user_id wxUserId, w.all_clock_day clockNum, w.nickname nickname, w.head_pic headPic, (@i :=@i + 1) rankNum
FROM
weixin_clock_member w,
(SELECT @i := 0) i
......@@ -80,7 +80,7 @@
</select>
<select id="getClockWechatUserRank" parameterType="map" resultType="com.pcloud.book.weixinclock.dto.RankDto">
select cm.rankNum rankNum, cm.clockNum clockNum, cm.nickname nickname, cm.headPic headPic from (
select cm.wx_user_id wxUserId, cm.rankNum rankNum, cm.clockNum clockNum, cm.nickname nickname, cm.headPic headPic from (
select wx_user_id, (@rowNum:=@rowNum+1) AS rankNum, all_clock_day clockNum, nickname nickname, head_pic headPic, wechat_user_id from (
select wx_user_id, all_clock_day, nickname, head_pic, wechat_user_id, @rowNum:=0 from weixin_clock_member
where wx_group_id = #{wechatGroupId}
......@@ -98,4 +98,16 @@
where wx_user_id = #{wxUserId,jdbcType=VARCHAR}
</update>
<select id="getClockWechatUserRankByWxUserId" parameterType="map" resultType="com.pcloud.book.weixinclock.dto.RankDto">
select cm.wx_user_id wxUserId, cm.rankNum rankNum, cm.clockNum clockNum, cm.nickname nickname, cm.headPic headPic from (
select wx_user_id, (@rowNum:=@rowNum+1) AS rankNum, all_clock_day clockNum, nickname nickname, head_pic headPic, wechat_user_id from (
select wx_user_id, all_clock_day, nickname, head_pic, wechat_user_id, @rowNum:=0 from weixin_clock_member
where wx_group_id = #{wechatGroupId}
AND (all_clock_day <![CDATA[ >]]> 0 or wx_user_id = #{wxUserId, jdbcType=VARCHAR})
order by all_clock_day desc, update_time asc
) a
) cm where cm.wx_user_id = #{wxUserId}
LIMIT 1
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.weixinclock.dao.impl.WeixinClockPraiseDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.weixinclock.entity.WeixinClockPraise">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="weixin_clock_id" property="weixinClockId" jdbcType="BIGINT" />
<result column="wx_user_id" property="wxUserId" jdbcType="VARCHAR" />
<result column="wx_group_id" property="wxGroupId" jdbcType="VARCHAR" />
<result column="praise_user_id" property="praiseUserId" jdbcType="BIGINT" />
<result column="is_cancel" property="isCancel" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, weixin_clock_id, wx_user_id, wx_group_id, praise_user_id, is_cancel, create_time, update_time
</sql>
<insert id="insert" parameterType="com.pcloud.book.weixinclock.entity.WeixinClockPraise" useGeneratedKeys="true" keyProperty="id">
insert into weixin_clock_praise (weixin_clock_id, wx_user_id, wx_group_id, praise_user_id, is_cancel, create_time, update_time)
values (#{weixinClockId}, #{wxUserId}, #{wxGroupId}, #{praiseUserId}, #{isCancel}, now(), now())
</insert>
<update id="update" parameterType="com.pcloud.book.weixinclock.entity.WeixinClockPraise">
update weixin_clock_praise
<set>
<if test="weixinClockId != null">
weixin_clock_id = #{weixinClockId},
</if>
<if test="wxUserId != null">
wx_user_id = #{wxUserId},
</if>
<if test="wxGroupId">
wx_group_id = #{wxGroupId},
</if>
<if test="praiseUserId != null">
praise_user_id = #{praiseUserId},
</if>
<if test="isCancel != null">
is_cancel = #{isCancel},
</if>
update_time = now(),
</set>
where id = #{id}
</update>
<select id="getByMemberAndUser" parameterType="com.pcloud.book.weixinclock.dto.GetByMemberAndUserDto" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from weixin_clock_praise
where wx_group_id = #{wxGroupId} and wx_user_id = #{wxUserId}
and praise_user_id = #{wechatUserId} and create_time <![CDATA[>]]> #{createTime}
limit 1
</select>
<select id="getMemberPraise" parameterType="com.pcloud.book.weixinclock.dto.ListWeixinClockRankDto" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from weixin_clock_praise
where wx_group_id = #{wxGroupId}
and wx_user_id in
<foreach collection="wxUserIdList" open="(" close=")" separator="," item="item">
#{item}
</foreach>
and is_cancel = 1
</select>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.weixinclock.dao.impl.WeixinClockShareDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.weixinclock.entity.WeixinClockShare">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="share_user_id" property="shareUserId" jdbcType="BIGINT"/>
<result column="wx_group_id" property="wxGroupId" jdbcType="VARCHAR" />
<result column="share_time" property="shareTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, share_user_id, wx_group_id, share_time
</sql>
<insert id="insert" parameterType="com.pcloud.book.weixinclock.entity.WeixinClockShare" useGeneratedKeys="true" keyProperty="id">
insert into weixin_clock_share (share_user_id, wx_group_id, share_time)
values (#{shareUserId}, #{wxGroupId}, #{shareTime})
</insert>
</mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pcloud.book.weixinclock.dao.impl.WeixinClockShareWordDaoImpl" >
<resultMap id="BaseResultMap" type="com.pcloud.book.weixinclock.entity.WeixinClockShareWord">
<id column="id" property="id" jdbcType="BIGINT" />
<result column="share_word" property="shareWord" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, share_word
</sql>
<select id="getRoundWord" resultType="string">
SELECT share_word
FROM weixin_clock_share_word AS t1 JOIN (
SELECT ROUND(RAND() * ((SELECT MAX(id) FROM weixin_clock_share_word)-(SELECT MIN(id) FROM weixin_clock_share_word))+(SELECT MIN(id) FROM weixin_clock_share_word)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
</select>
</mapper>
\ No newline at end of file
......@@ -56,4 +56,11 @@
</if>
</select>
<select id="getFirstClockDay" parameterType="map" resultType="date">
select CREATED_DAY from weixin_clock_topic
where wx_group_id = #{wxGroupId, jdbcType=VARCHAR}
AND wx_user_id = #{wxUserId, jdbcType=VARCHAR}
order by CREATED_DAY limit 1
</select>
</mapper>
\ No newline at end of file
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