package org.jeecg.modules.weekly.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.constant.CacheConstant;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.HTMLUtils;
import org.jeecg.common.util.RedisUtil;
import org.jeecg.modules.weekly.entity.*;
import org.jeecg.modules.weekly.entity.ProProject;
import org.jeecg.modules.weekly.feign.ProjectClient;
import org.jeecg.modules.weekly.mapper.WekEvaluateMapper;
import org.jeecg.modules.weekly.mapper.WekRecordMapper;
import org.jeecg.modules.weekly.service.IWekRecordService;
import org.jeecg.modules.weekly.vo.*;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Field;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* 周报记录
*
* 注:1、查询个人周报时会查询一年的每一周,没数据则显示空列表
* methods: queryWeeklyListByWeekNo
* 2、查询部门周报或项目周报时只查询有数据的周,不查询空数据
* methods: queryDepartUserWeeklyList、queryProjectWeekly、queryAllProjectWeekly
*/
@Service
public class WekRecordServiceImpl extends ServiceImpl implements IWekRecordService {
@Autowired
private WekRecordMapper wekRecordMapper;
@Autowired
private WekEvaluateMapper wekEvaluateMapper;
@Autowired
private RedisUtil redisUtil;
@Autowired
private ProjectClient projectClient;
@Override
@Transactional
public void insertBatch(WekResultBean resultBean) {
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
List weekList = resultBean.getWeekList();
for (int i = 0; i < weekList.size(); i++) {
WekWeekBean weekBean = weekList.get(i);
if (weekBean == null) continue;
List typeList = weekBean.getTypeList();
if (typeList == null) continue;
for (int j = 0; j < typeList.size(); j++) {
WekTypeBean typeBean = typeList.get(j);
if (typeBean == null) continue;
List wekList = typeBean.getWekList();
if (wekList == null || wekList.size() < 1) continue;
wekList.forEach((item) -> {
item.setUser(sysUser.getUsername());
item.setYearWeek(item.getYear() * 100 + item.getWeek());
});
saveOrUpdateBatch(wekList);
}
}
}
@Override
public List querySingleThisWeek(WekRecord wekRecord) {
LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
int curWeek = DateUtils.getCurWeek();
int curYear = DateUtils.getCurYear();
//查询本周和上周数据
List list = new ArrayList<>();
if (curWeek != 1) {
int arr[] = {curWeek, curWeek - 1};
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(WekRecord::getYear, curYear).eq(WekRecord::getUser, sysUser.getUsername()).and(j -> j.in(WekRecord::getWeek, arr[0], arr[1]));
queryWrapper.lambda().orderByAsc(WekRecord::getCreateTime);
List list1 = this.list(queryWrapper);
list.addAll(list1);
} else {
QueryWrapper queryWrapper2 = new QueryWrapper<>();
queryWrapper2.lambda().eq(WekRecord::getYear, curYear - 1).eq(WekRecord::getUser, sysUser.getUsername()).and(j -> j.in(WekRecord::getWeek, 52));
queryWrapper2.lambda().orderByAsc(WekRecord::getCreateTime);
List list2 = this.list(queryWrapper2);
list.addAll(list2);
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(WekRecord::getYear, curYear).eq(WekRecord::getUser, sysUser.getUsername()).and(j -> j.in(WekRecord::getWeek, 1));
queryWrapper.lambda().orderByAsc(WekRecord::getCreateTime);
List list1 = this.list(queryWrapper);
list.addAll(list1);
}
//自动录入
autoEnter(list, curWeek,curYear);
//根据周和数据类型分类
Map>> collect = list.stream().collect(Collectors.groupingBy(t -> t.getWeek(), Collectors.groupingBy(t -> t.getType())));
List templateData = createTemplateData();
/**
* 将周报信息填充到模板中
*/
//周
for (Map.Entry>> entry : collect.entrySet()) {
for (int i = 0; i < templateData.size(); i++) {
WekWeekBean week = templateData.get(i);
week.setUsername(sysUser.getUsername());
week.setShowDetail(true);
if (entry.getKey() == week.getWeek()) {
Map> typeMap = entry.getValue();
List typeList = week.getTypeList();
//周报类型 0-本周周报 1-本周计划外 2-下周计划 3-下周需协调
for (Map.Entry> type : typeMap.entrySet()) {
for (int j = 0; j < typeList.size(); j++) {
WekTypeBean typeBean = typeList.get(j);
if (typeBean.getWeek() == week.getWeek() && typeBean.getType() == type.getKey()) {
typeBean.getWekList().addAll(type.getValue());
}
}
}
}
}
}
return templateData;
}
/**
* 本周周报自动录入上周下周计划内容
*
* @param list 本周和上周周报记录
* @param curWeek 当前周号
*/
private void autoEnter(List list, int curWeek,int curYear) {
//TODO 上周计划填充到本周内容(思想:本周周报内容没有记录的时候,查询上周计划填充,只填充不做真实保存,用户编辑本周周报保存后再真实保存)
//1.0本周周报内容
List tWeekList = list.stream().filter(i -> i.getWeek() == curWeek).collect(Collectors.toList());
//1.1上周周报内容
List lWeekList = new ArrayList<>();
if (curWeek != 1) {
List collect = list.stream().filter(i -> i.getWeek() == (curWeek - 1)).collect(Collectors.toList());
lWeekList.addAll(collect);
} else {
List collect = list.stream().filter(i -> i.getWeek() == 52).collect(Collectors.toList());
lWeekList.addAll(collect);
}
//2.0本周没有周报记录
if (tWeekList.isEmpty()) {
//2.1上周有数据
if (!lWeekList.isEmpty()) {
//type = 2 下周计划
List nList = lWeekList.stream().filter(i -> i.getType() == 2).collect(Collectors.toList());
//2.2上周周报存在下周计划数据
if (!nList.isEmpty()) {
for (int i = 0; i < nList.size(); i++) {
WekRecord record = nList.get(i);
WekRecord item = new WekRecord();
//将上周周报的下周计划 填充到本周周报内容
BeanUtils.copyProperties(record, item);
item.setId(UUID.randomUUID().toString().replace("-", ""));
item.setWeek(curWeek);
item.setYear(curYear);
item.setYearWeek(item.getYear() * 100 + item.getWeek());
item.setType(0);
item.setCreateTime(DateUtils.minusSeconds(nList.size()-i));
item.setUpdateTime(null);
list.add(item);
}
}
}
}
}
@Override
public List queryWeeklyListByWeekNo(Integer year, Integer week, String username) {
List result = new ArrayList<>();
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(WekRecord::getYear, year).eq(WekRecord::getUser, username).and(j -> j.in(WekRecord::getWeek, week));
queryWrapper.lambda().orderByAsc(WekRecord::getCreateTime);
List list = this.list(queryWrapper);
//没有数据则返回空白数据
if (list.isEmpty()) {
return createEmptyData(year, week,username);
}
//根据周和数据类型分类
Map>> collect = list.stream().collect(Collectors.groupingBy(t -> t.getWeek(), Collectors.groupingBy(t -> t.getType())));
for (Map.Entry>> entry : collect.entrySet()) {
Map> typeMap = entry.getValue();
WekWeekBean weekBean = new WekWeekBean();
weekBean.setWeek(entry.getKey());
weekBean.setStartDateStr1(DateUtils.weekToDayStartStr(year, entry.getKey()));
weekBean.setEndDateStr1(DateUtils.weekToDayEndStr(year, entry.getKey()));
String tws = DateUtils.weekToDayEndStr(year, entry.getKey(), "yyyy-MM-dd");
weekBean.setWeekInMonth(DateUtils.getWeekInMonth(tws,2));
weekBean.setStartDateStr2(DateUtils.weekToDayStartStr(year, entry.getKey() + 1));
weekBean.setEndDateStr2(DateUtils.weekToDayEndStr(year, entry.getKey() + 1));
weekBean.setShow(true);
weekBean.setUsername(username);
weekBean.setShowDetail(true);
List typeList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
WekTypeBean typeBean = new WekTypeBean();
typeBean.setWeek(entry.getKey());
typeBean.setType(i);
configTypeName(entry.getKey(), typeBean);
if (typeMap.containsKey(i)) {
typeBean.setWekList(typeMap.get(i));
} else {
List wekRecords = new ArrayList<>();
typeBean.setWekList(wekRecords);
}
typeList.add(typeBean);
}
weekBean.setTypeList(typeList);
weekBean.setUsername(username);
weekBean.setYear(year);
result.add(weekBean);
}
return result;
}
@Override
public List queryDepartUserWeeklyList(String orgCode, int page) {
List result = new ArrayList<>();
//查询部门下用户
List departUsers = wekRecordMapper.queryDepartUsers(orgCode);
if (departUsers == null || departUsers.size() < 1) {
return result;
}
WekRecord mapParams = new WekRecord();
//先查询数据的年 周
List> hashMaps = wekRecordMapper.queryYearWeekGroup(mapParams);
//页码大于总数据时
if (page > hashMaps.size()) {
return result;
}
HashMap stringObjectHashMap = hashMaps.get(page - 1);
int curYear = (int) stringObjectHashMap.get("year");
int curWeek = (int) stringObjectHashMap.get("week");
//拼接查询条件
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("user", departUsers).in("year", curYear).in("week", curWeek).orderByDesc("user").orderByDesc("year").orderByDesc("week").orderByAsc("type");
queryWrapper.lambda().orderByAsc(WekRecord::getCreateTime);
//查询数据
List list = wekRecordMapper.selectList(queryWrapper);
//按照 用户-周-数据类型 分类数据
Map>>> collect = list.stream().collect(Collectors.groupingBy(t -> t.getUser(), Collectors.groupingBy(t -> t.getWeek(), Collectors.groupingBy(t -> t.getType()))));
for (Map.Entry>>> userEntry : collect.entrySet()) {
Map>> weekMap = userEntry.getValue();
for (Map.Entry>> entry : weekMap.entrySet()) {
Map> typeMap = entry.getValue();
WekWeekBean weekBean = new WekWeekBean();
weekBean.setWeek(entry.getKey());
weekBean.setStartDateStr1(DateUtils.weekToDayStartStr(entry.getKey()));
weekBean.setEndDateStr1(DateUtils.weekToDayEndStr(entry.getKey()));
weekBean.setStartDateStr2(DateUtils.weekToDayStartStr(entry.getKey() + 1));
weekBean.setEndDateStr2(DateUtils.weekToDayEndStr(entry.getKey() + 1));
weekBean.setShow(true);
List typeList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
WekTypeBean typeBean = new WekTypeBean();
typeBean.setWeek(entry.getKey());
typeBean.setType(i);
configTypeName(entry.getKey(), typeBean);
if (typeMap.containsKey(i)) {
typeBean.setWekList(typeMap.get(i));
} else {
List wekRecords = new ArrayList<>();
typeBean.setWekList(wekRecords);
}
typeList.add(typeBean);
}
weekBean.setTypeList(typeList);
weekBean.setYear(curYear);
weekBean.setUsername(userEntry.getKey());
result.add(weekBean);
}
}
//姓名升序
Comparator nameCom = Comparator.comparing(
WekWeekBean::getUsername);
//week 降序
Comparator weekCom = Comparator.comparingInt(
WekWeekBean::getWeek).reversed();
result.sort(nameCom.thenComparing(weekCom));
return result;
}
@Override
public List queryJuniorBatchWeekly(String usernames, int page) {
List result = new ArrayList<>();
String[] split = usernames.split(",");
//查询部门下用户
List departUsers = Arrays.asList(split);
if (departUsers == null || departUsers.size() < 1) {
return result;
}
WekRecord mapParams = new WekRecord();
//先查询数据的年 周
List> hashMaps = wekRecordMapper.queryYearWeekGroup(mapParams);
//页码大于总数据时
if (page > hashMaps.size()) {
return result;
}
HashMap stringObjectHashMap = hashMaps.get(page - 1);
int curYear = (int) stringObjectHashMap.get("year");
int curWeek = (int) stringObjectHashMap.get("week");
//拼接查询条件
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("user", departUsers).in("year", curYear).in("week", curWeek).orderByDesc("user").orderByDesc("year").orderByDesc("week").orderByAsc("type");
//查询数据
List list = wekRecordMapper.selectList(queryWrapper);
//按照 用户-周-数据类型 分类数据
Map>>> collect = list.stream().collect(Collectors.groupingBy(t -> t.getUser(), Collectors.groupingBy(t -> t.getWeek(), Collectors.groupingBy(t -> t.getType()))));
for (Map.Entry>>> userEntry : collect.entrySet()) {
Map>> weekMap = userEntry.getValue();
for (Map.Entry>> entry : weekMap.entrySet()) {
Map> typeMap = entry.getValue();
WekWeekBean weekBean = new WekWeekBean();
weekBean.setWeek(entry.getKey());
weekBean.setStartDateStr1(DateUtils.weekToDayStartStr(entry.getKey()));
weekBean.setEndDateStr1(DateUtils.weekToDayEndStr(entry.getKey()));
weekBean.setStartDateStr2(DateUtils.weekToDayStartStr(entry.getKey() + 1));
weekBean.setEndDateStr2(DateUtils.weekToDayEndStr(entry.getKey() + 1));
weekBean.setShow(true);
List typeList = new ArrayList<>();
for (int i = 0; i < 4; i++) {
WekTypeBean typeBean = new WekTypeBean();
typeBean.setWeek(entry.getKey());
typeBean.setType(i);
configTypeName(entry.getKey(), typeBean);
if (typeMap.containsKey(i)) {
typeBean.setWekList(typeMap.get(i));
} else {
List wekRecords = new ArrayList<>();
typeBean.setWekList(wekRecords);
}
typeList.add(typeBean);
}
weekBean.setTypeList(typeList);
weekBean.setYear(curYear);
weekBean.setUsername(userEntry.getKey());
result.add(weekBean);
}
}
//姓名升序
Comparator nameCom = Comparator.comparing(
WekWeekBean::getUsername);
//week 降序
Comparator weekCom = Comparator.comparingInt(
WekWeekBean::getWeek).reversed();
result.sort(nameCom.thenComparing(weekCom));
return result;
}
@Override
public List projectTreeList(ProProject project) {
List proProjects = wekRecordMapper.queryProjectList(project);
ProjectTreeVo treeVo = new ProjectTreeVo();
Map slotMap = new HashMap<>();
slotMap.put("icon", "proGroup");
treeVo.setId("0");
treeVo.setTitle("项目列表");
treeVo.setValue("0");
treeVo.setType(1);
treeVo.setScopedSlots(slotMap);
List result = new ArrayList<>();
List subList = new ArrayList<>();
for (int i = 0; i < proProjects.size(); i++) {
ProProject proProject = proProjects.get(i);
ProjectTreeVo vo = new ProjectTreeVo(proProject);
Map slot = new HashMap<>();
slot.put("icon", "proItem");
vo.setLeaf(true);
vo.setType(2);
vo.setScopedSlots(slot);
subList.add(vo);
}
treeVo.setChildren(subList);
result.add(treeVo);
return result;
}
@Override
public List queryProjectWeekly(String xm, int page) {
List result = new ArrayList<>();
WekRecord mapParams = new WekRecord();
if (!StringUtils.isEmpty(xm)) {
mapParams.setXm(xm);
}
//先查询数据的年 周
List> hashMaps = wekRecordMapper.queryYearWeekGroup(mapParams);
//页码大于总数据时
if (page > hashMaps.size()) {
return result;
}
HashMap stringObjectHashMap = hashMaps.get(page - 1);
int curYear = (int) stringObjectHashMap.get("year");
int curWeek = (int) stringObjectHashMap.get("week");
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.lambda().eq(WekRecord::getYear, curYear).and(j -> j.in(WekRecord::getWeek, curWeek));
//条件查询
if (!StringUtils.isEmpty(xm)) {
queryWrapper.lambda().eq(WekRecord::getXm, xm);
}
queryWrapper.lambda().orderByAsc(WekRecord::getUser);
//只查询0-本周总结
queryWrapper.lambda().eq(WekRecord::getType, 0);
List list = wekRecordMapper.selectList(queryWrapper);
//根据周分类
Map> collect = list.stream().collect(Collectors.groupingBy(t -> t.getWeek()));
for (Map.Entry> entry : collect.entrySet()) {
List value = entry.getValue();
WekProject pro = new WekProject();
Map colorMap = new HashMap<>();
pro.setWeek(entry.getKey());
pro.setYear(curYear);
pro.setStartDateStr1(DateUtils.weekToDayStartStr(entry.getKey()));
pro.setEndDateStr1(DateUtils.weekToDayEndStr(entry.getKey()));
pro.setWekRecordList(value);
pro.setXmName(value.get(0).getXmName());
pro.setShow(true);
//根据项目内成员生成颜色
for (int i = 0; i < value.size(); i++) {
WekRecord record = value.get(i);
if (!colorMap.containsKey(record.getUser()))
colorMap.put(record.getUser(), HTMLUtils.getColor(colorMap.size()));
}
pro.setColorMap(colorMap);
result.add(pro);
}
return result;
}
@Override
public List queryAllProjectWeekly(int page) {
List result = new ArrayList<>();
WekRecord mapParams = new WekRecord();
//先查询数据的年 周
List> hashMaps = wekRecordMapper.queryAllXmYearWeekGroup(mapParams);
//页码大于总数据时
if (page > hashMaps.size()) {
return result;
}
HashMap stringObjectHashMap = hashMaps.get(page - 1);
int curYear = (int) stringObjectHashMap.get("year");
int curWeek = (int) stringObjectHashMap.get("week");
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.in("year", curYear).in("week", curWeek).in("type", 0).isNotNull("xm").orderByDesc("year").orderByDesc("week").orderByAsc("user");
//查询数据
List list = wekRecordMapper.selectList(queryWrapper);
//按照 项目-周 分类数据
Map>> collect = list.stream().collect(Collectors.groupingBy(t -> t.getXm(), Collectors.groupingBy(t -> t.getWeek())));
for (Map.Entry>> project : collect.entrySet()) {
String xm = project.getKey();
for (Map.Entry> entry : project.getValue().entrySet()) {
List value = entry.getValue();
WekProject pro = new WekProject();
Map colorMap = new HashMap<>();
pro.setWeek(entry.getKey());
pro.setYear(curYear);
pro.setStartDateStr1(DateUtils.weekToDayStartStr(entry.getKey()));
pro.setEndDateStr1(DateUtils.weekToDayEndStr(entry.getKey()));
pro.setWekRecordList(value);
pro.setXmName(value.get(0).getXmName());
pro.setShow(true);
//根据项目内成员生成颜色
for (int i = 0; i < value.size(); i++) {
WekRecord record = value.get(i);
if (!colorMap.containsKey(record.getUser()))
colorMap.put(record.getUser(), HTMLUtils.getColor(colorMap.size()));
}
pro.setColorMap(colorMap);
result.add(pro);
}
}
//项目名升序
Comparator nameCom = Comparator.comparing(
WekProject::getXmName);
//week 降序
Comparator weekCom = Comparator.comparingInt(
WekProject::getWeek).reversed();
result.sort(nameCom.thenComparing(weekCom));
return result;
}
@Override
public Result>> statisticsList(WekRecord wekRecord) {
Result>> result = new Result<>();
int SUB_TYPE_1 = 1;//项目相关工作
int SUB_TYPE_2 = 2;//日常事务工作
//查询参数
Map param = new HashMap<>();
param.put("xm", wekRecord.getXm()); //项目名称
param.put("user", wekRecord.getUser());//用户
//计算日期的周
if (wekRecord.getKsrq() != null) {
Integer sno = DateUtils.getWeekNoByDate(wekRecord.getKsrq());
int year = DateUtils.getYear(wekRecord.getKsrq());
param.put("syear", year);//查询开始年份
param.put("sweek", sno);//查询开始星期号
}
if (wekRecord.getJsrq() != null) {
Integer eno = DateUtils.getWeekNoByDate(wekRecord.getJsrq());
int year = DateUtils.getYear(wekRecord.getJsrq());
param.put("eyear", year);//查询结束年份
param.put("eweek", eno);//查询结束星期号
}
//查询数据包括type 0-本周总结 和 1-本周计划外工作
//0对数据进行分组,通过subtype进行分组 subtype 1-项目相关工作 2-日常事务工作(需统计type 0-本周总结 和 1-本周计划外工作,只区分项目相关和日常事务)
List list = wekRecordMapper.statisticsList(param);
//测试 TODO 删除
// list = list.stream().filter(i -> i.getId().intValue() <= 150).collect(Collectors.toList());
//统计有周报记录的所有成员(表格的列)
List