package com.dawn.question.api.wechat.dao;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.MappingJsonFactory;
import java.io.StringWriter;
import java.util.*;
/**
* Author: cg
* Date: 2020/7/1 17:24
* Content:
*/
public class SignDataTableModel {
private static String[] parsePatterns = {"yyyy-MM-dd",
"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd",
"yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd",
"yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
//第几天
private Integer day;
//是否签到(1:已签到,0:未签到)
private Integer isSign;
//是否是今天(1:是,0:否)
private Integer isToday;
//月份
private Integer month;
//月份字符串(month+"月")
private String monthStr;
public Date parseDate(String str) {
if (str == null) {
return null;
}
try {
return org.apache.commons.lang.time.DateUtils.parseDate(str, parsePatterns);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return null;
}
public Integer getWeekDayNumber(String dateStr) {
Date date = parseDate(dateStr);
Calendar calendar = Calendar.getInstance();
if(date != null){
calendar.setTime(date);
}
int w = calendar.get(Calendar.DAY_OF_WEEK) - 1;
return w;
}
public Integer getMonthOneWeek(int dayNumber) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
String oneDay = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-"+dayNumber+"";//1号日期
int index = getWeekDayNumber(oneDay);
if(index==0){
index=7;
}
return index;
}
/**
* 获取的当月最后一天是几号
*/
public Integer getMonthLastDay() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
String beforeMonthLastStr = year+"-"+(month+1)+"-"+"01"; //上个月日期
cal.setTime(parseDate(beforeMonthLastStr));
cal.set(Calendar.DAY_OF_MONTH,0);
return cal.get(Calendar.DAY_OF_MONTH);
}
/**
* 获取的当月最后一天是星期几
*/
public Integer getMonthLastWeekNumber() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int lastDay = getMonthLastDay();//本月最后一天是几号
String lastDayStr = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1) + "-"+lastDay+"";//1号日期
int index = getWeekDayNumber(lastDayStr);
if(index==0){
index=7;
}
return index;
}
/**
* 获取的上月最后一天是几号
*/
public Integer getBeforeMonthLastDay() {
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
if (month==12){
month=0;
year=year+1;
}
String beforeMonthLastStr = year+"-"+(month)+"-"+"01"; //上个月日期
cal.setTime(parseDate(beforeMonthLastStr));
cal.set(Calendar.DAY_OF_MONTH,0);
return cal.get(Calendar.DAY_OF_MONTH);
}
public String toJson(Object object) {
MappingJsonFactory f = new MappingJsonFactory();
StringWriter sw = new StringWriter();
try {
JsonGenerator generator = f.createGenerator(sw);
generator.writeObject(object);
generator.close();
} catch (Exception e) {
return "";
}
return sw.toString();
}
public static void main(String[] args) {
/*组装日历数据*/
// headMap(year:'2019', month:'四月', days:[dataMap(rowIndex:0,data:[]) ])
Map headMap = new HashMap();
Calendar cal = Calendar.getInstance();
headMap.put("year", cal.get(Calendar.YEAR));
headMap.put("month", (cal.get(Calendar.MONTH) + 1) + "月");
SignDataTableModel tableModel = new SignDataTableModel();
List<SignDataTableModel> monthDataList = new ArrayList<>();
int monthOneWeek = tableModel.getMonthOneWeek(1);//本月1号是星期几(1-7)
int lastDay = tableModel.getMonthLastDay();//本月最后一天是几号
int monthLastWeek = tableModel.getMonthLastWeekNumber();//本月最后一天是星期几(1-7)
int beforeMonthLastDay = tableModel.getBeforeMonthLastDay();//上个月最后一天是几号
int beforeDay = beforeMonthLastDay-monthOneWeek+2;
int nextDay = 1;
int index = 1;
int totalCount = lastDay+monthOneWeek-1+(7-monthLastWeek);//日历表总天数
int beforeMonth = cal.get(Calendar.MONTH);
if(beforeMonth==0){
beforeMonth=12;
}
int nextMonth = cal.get(Calendar.MONTH)+2;
if(nextMonth==13){
nextMonth=1;
}
for (int i=0;i<totalCount;i++){
tableModel = new SignDataTableModel();
tableModel.setIsToday(0);
tableModel.setIsSign(0);
if(beforeDay<=beforeMonthLastDay){
tableModel.setDay(beforeDay);
tableModel.setMonth(beforeMonth);
tableModel.setMonthStr(beforeMonth+"月");
beforeDay++;
}else {
tableModel.setDay(index);
if (index==cal.get(Calendar.DATE)){
tableModel.setIsToday(1);
}
tableModel.setMonth(cal.get(Calendar.MONTH)+1);
tableModel.setMonthStr((cal.get(Calendar.MONTH)+1)+"月");
index++;
}
if(index-1>lastDay && 7-monthLastWeek>0){
tableModel.setDay(nextDay);
tableModel.setMonth(nextMonth);
tableModel.setMonthStr(nextMonth+"月");
nextDay++;
}
monthDataList.add(tableModel);
}
//日历表的签到数据
int toDay = monthDataList.get(0).getDay();
int endDay = monthDataList.get(monthDataList.size()-1).getDay();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH)+1;
String beforeMonthStr=beforeMonth+"";
String nextMonthStr=nextMonth+"";
if(beforeMonth<10){
beforeMonthStr="0"+beforeMonthStr;
}
if(nextMonth<10){
nextMonthStr="0"+nextMonthStr;
}
String monthStr = month+"";
if(month<10){
monthStr="0"+monthStr;
}
String statTime = year+"-"+monthStr+"-"+toDay;
String endTime = year+"-"+monthStr+"-"+endDay;
if(toDay>1){
statTime=year+"-"+beforeMonthStr+"-"+toDay;
if(beforeMonth==12){
statTime=(year-1)+"-"+beforeMonthStr+"-"+toDay;
}
}
if(endDay<=7){
endTime=year+"-"+nextMonthStr+"-0"+endDay;
if(nextMonth==1){
endTime=(year+1)+"-"+nextMonthStr+"-0"+endDay;
}
}
List<SignDataTableModel> rowDataList = new ArrayList<>();
Map rowMap;
List<Map> rowMaps = new ArrayList();
int i=0;
int rowNumber=0;
for (SignDataTableModel signDataTableModel : monthDataList) {
i++;
rowDataList.add(signDataTableModel);
if(i%7==0){
rowNumber++;
rowMap = new LinkedHashMap();
rowMap.put("rowIndex",rowNumber);
rowMap.put("data",rowDataList);
rowMaps.add(rowMap);
rowDataList = new ArrayList<>();
}
}
headMap.put("days",rowMaps);
System.out.println(tableModel.toJson(headMap));
}
public Integer getDay() {
return day;
}
public void setDay(Integer day) {
this.day = day;
}
public Integer getIsSign() {
return isSign;
}
public void setIsSign(Integer isSign) {
this.isSign = isSign;
}
public Integer getIsToday() {
return isToday;
}
public void setIsToday(Integer isToday) {
this.isToday = isToday;
}
public Integer getMonth() {
return month;
}
public void setMonth(Integer month) {
this.month = month;
}
public String getMonthStr() {
return monthStr;
}
public void setMonthStr(String monthStr) {
this.monthStr = monthStr;
}
}