package com.yeshi.fanli.service.impl.user; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeMap; import javax.annotation.Resource; import org.springframework.stereotype.Service; import com.yeshi.fanli.dao.mybatis.money.UserMoneyDetailMapper; import com.yeshi.fanli.entity.money.UserMoneyDetail; import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum; import com.yeshi.fanli.service.inter.user.UserMoneyDetailService; import com.yeshi.fanli.util.TimeUtil; import com.yeshi.fanli.vo.money.UserMoneyDetailHistoryVO; import com.yeshi.fanli.vo.money.UserMonthMoneyVO; @Service public class UserMoneyDetailServiceImpl implements UserMoneyDetailService { @Resource private UserMoneyDetailMapper userMoneyDetailMapper; @Override public List listUserMoneyDetailForClient(Long uid, Long userMoneyDetailId, Date maxTime) { List finalList = new ArrayList<>(); List list = null; if (userMoneyDetailId == null) {// 首次请求 if (maxTime == null)// 没有筛选时间 { list = userMoneyDetailMapper.selectByMaxCreateTime(uid, new Date(System.currentTimeMillis() + 1000 * 60 * 60L), 20); } else {// 筛选了时间 list = userMoneyDetailMapper.selectByMaxCreateTime(uid, maxTime, 20); } if (list != null && list.size() > 0) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(list.get(0).getCreateTime().getTime()); UserMoneyDetailHistoryVO vo = new UserMoneyDetailHistoryVO(); vo.setMonth(new UserMonthMoneyVO(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1)); finalList.add(vo); } else { if (maxTime != null) {// Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(maxTime.getTime()); UserMoneyDetailHistoryVO vo = new UserMoneyDetailHistoryVO(); vo.setMonth(new UserMonthMoneyVO(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1)); vo.getMonth().setExpend("0"); vo.getMonth().setIncome("0"); finalList.add(vo); } } } else {// 二次请求 int size = 21; List tempList = userMoneyDetailMapper.selectByUidWithIndexId(uid, userMoneyDetailId, size); Set dateSet = new HashSet<>();// 用于储存是否在同一时间上面(精确到秒) if (tempList.size() > 0) { for (UserMoneyDetail umd : tempList) { dateSet.add(umd.getCreateTime()); } List tempList2 = new ArrayList<>(); while (dateSet.size() == 1 && tempList2.size() != tempList.size() && size < 40) {// 只有一个时间点的数据 tempList = tempList2; size += 10; tempList2 = userMoneyDetailMapper.selectByUidWithIndexId(uid, userMoneyDetailId, size); dateSet.clear(); for (UserMoneyDetail umd : tempList2) { dateSet.add(umd.getCreateTime()); } } if (tempList2.size() > 0) tempList = tempList2; } for (int i = 0; i < tempList.size(); i++) { if (tempList.get(i).getId().longValue() == userMoneyDetailId) { tempList.remove(i); break; } else { tempList.remove(i); i--; } } list = tempList; } if (list != null) { if (userMoneyDetailId != null && list.size() > 0) { UserMoneyDetail umd = userMoneyDetailMapper.selectByPrimaryKey(userMoneyDetailId); if (!TimeUtil.getGernalTime(umd.getCreateTime().getTime(), "yyyy-MM") .equalsIgnoreCase(TimeUtil.getGernalTime(list.get(0).getCreateTime().getTime(), "yyyy-MM"))) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(list.get(0).getCreateTime().getTime()); UserMoneyDetailHistoryVO vo = new UserMoneyDetailHistoryVO(); vo.setMonth(new UserMonthMoneyVO(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1)); finalList.add(vo); } } for (int i = 0; i < list.size(); i++) { if (i > 0 && !TimeUtil.getGernalTime(list.get(i - 1).getCreateTime().getTime(), "yyyy-MM") .equalsIgnoreCase(TimeUtil.getGernalTime(list.get(i).getCreateTime().getTime(), "yyyy-MM"))) {// 本条数据与上条数据不是同一月则插入月份 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(list.get(i).getCreateTime().getTime()); UserMoneyDetailHistoryVO vo = new UserMoneyDetailHistoryVO(); vo.setMonth(new UserMonthMoneyVO(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + 1)); finalList.add(vo); } UserMoneyDetailHistoryVO vo = new UserMoneyDetailHistoryVO(); vo.setDetail(list.get(i)); finalList.add(vo); } } // 统计月资金 Map monthMap = new TreeMap<>(); if (finalList.size() > 1) for (int i = 0; i < finalList.size(); i++) { if (finalList.get(i).getMonth() != null) monthMap.put(i, finalList.get(i)); } if (!monthMap.isEmpty()) { List dateFormat = new ArrayList<>(); Iterator keys = monthMap.keySet().iterator(); while (keys.hasNext()) { Integer key = keys.next(); String date = ""; date += monthMap.get(key).getMonth().getYear(); date += "-"; date += (monthMap.get(key).getMonth().getMonth() + "").length() < 2 ? "0" + monthMap.get(key).getMonth().getMonth() : monthMap.get(key).getMonth().getMonth(); dateFormat.add(date); } List voList = userMoneyDetailMapper.selectMonthMoneyByUid(uid, dateFormat); int p = 0; keys = monthMap.keySet().iterator(); while (keys.hasNext()) { Integer key = keys.next(); // 去除支出负号 finalList.get(key).getMonth().setExpend(voList.get(p).getExpend().replace("-", "")); finalList.get(key).getMonth().setIncome(voList.get(p).getIncome()); p++; } } return finalList; } @Override public long countUserMoneyDetailForClient(Long uid, Long userMoneyDetailId, Date maxTime) { long monthCount = 0L; long detailCount = 0L; // 未通过时间筛选,查询所有 if (maxTime == null) { detailCount = userMoneyDetailMapper.selectCountByUid(uid); // 用于表示当前所有 monthCount = userMoneyDetailMapper.selectMonthCountByUid(uid, new Date(System.currentTimeMillis() + 1000 * 60 * 60L)); } else {// 通过时间筛选了的,需要查询所有 detailCount = userMoneyDetailMapper.selectCountByUidAndMaxCreateTime(uid, maxTime); monthCount = userMoneyDetailMapper.selectMonthCountByUid(uid, maxTime); } return monthCount + detailCount; } @Override public List listByUidWithState(Long uid, int page, int pageSize) { return userMoneyDetailMapper.selectByUidWithState(uid, (page - 1) * pageSize, pageSize); } @Override public long countByUidWithState(Long uid) { return userMoneyDetailMapper.selectCountByUidWithState(uid); } @Override public BigDecimal statisticUserTypeMoneyWithDate(Long uid, List typeList, Date minDate, Date maxDate) { List list = new ArrayList<>(); if (typeList != null) for (UserMoneyDetailTypeEnum type : typeList) { list.add(type.name()); } BigDecimal money = userMoneyDetailMapper.getTotalMoneyByTypeAndUidWithDate(uid, list, minDate, maxDate); return money == null ? new BigDecimal(0) : money; } }