|
|
@@ -1,6 +1,7 @@
|
|
|
package com.goafanti.report.service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
@@ -15,6 +16,8 @@ import org.springframework.ui.ModelMap;
|
|
|
|
|
|
import com.goafanti.common.constant.AFTConstants;
|
|
|
import com.goafanti.common.dao.DailySalesReportMapper;
|
|
|
+import com.goafanti.common.error.BusinessException;
|
|
|
+import com.goafanti.common.model.DailySalesReport;
|
|
|
import com.goafanti.core.mybatis.BaseMybatisDao;
|
|
|
import com.goafanti.report.bo.DepartmentSalesReportBO;
|
|
|
import com.goafanti.report.bo.PersonalSalesReportBO;
|
|
|
@@ -30,22 +33,45 @@ public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMappe
|
|
|
DailySalesReportMapper salesReportMapper;
|
|
|
|
|
|
public int insertDailyReports(Date startTime, Date endTime) {
|
|
|
- return salesReportMapper.insertSalesReports(startTime, endTime);
|
|
|
+ List<DailySalesReport> list = salesReportMapper.selectAdmins();
|
|
|
+ Map<String, DailySalesReport> map = new HashMap<>();
|
|
|
+ for (DailySalesReport dsr : list) {
|
|
|
+ dsr.setCreateTime(endTime);
|
|
|
+ map.put(dsr.getAdminId(), dsr);
|
|
|
+ }
|
|
|
+ List<DailySalesReport> reports = salesReportMapper.selectDailySalesReports(startTime, endTime);
|
|
|
+ for (DailySalesReport dsr : reports) {
|
|
|
+ DailySalesReport item = map.get(dsr.getAdminId());
|
|
|
+ if (item != null) {
|
|
|
+ item.setOrderAmount(item.getOrderAmount().add(dsr.getOrderAmount()));
|
|
|
+ item.setOrderCount(item.getOrderCount() + dsr.getOrderCount());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ salesReportMapper.deleteByDate(endTime);
|
|
|
+ return salesReportMapper.insertBatch(list);
|
|
|
}
|
|
|
|
|
|
- public ModelMap getReportTotal(Date startTime) {
|
|
|
+ public ModelMap getReportTotal(Date startTime, String depName, String name, String position) {
|
|
|
ReportDate rd = new ReportDate(startTime);
|
|
|
ModelMap mm = new ModelMap();
|
|
|
- putField(mm, "dailyTotalCount", "dailyTotalAmount", rd.getDailyStart(), rd.getDailyEnd());
|
|
|
- putField(mm, "weeklyTotalCount", "weeklyTotalAmount", rd.getWeeklyStart(), rd.getWeeklyEnd());
|
|
|
- putField(mm, "monthlyTotalCount", "monthlyTotalAmount", rd.getMonthStart(), rd.getMonthEnd());
|
|
|
- putField(mm, "quarterlyTotalCount", "quarterlyTotalAmount", rd.getQuarterStart(), rd.getQuarterEnd());
|
|
|
- putField(mm, "annuallyTotalCount", "annuallyTotalAmount", rd.getYearStart(), rd.getYearEnd());
|
|
|
+ putField(mm, "dailyTotalCount", "dailyTotalAmount", rd.getDailyStart(), rd.getDailyEnd(), depName, name,
|
|
|
+ position);
|
|
|
+ putField(mm, "weeklyTotalCount", "weeklyTotalAmount", rd.getWeeklyStart(), rd.getWeeklyEnd(), depName, name,
|
|
|
+ position);
|
|
|
+ putField(mm, "monthlyTotalCount", "monthlyTotalAmount", rd.getMonthStart(), rd.getMonthEnd(), depName, name,
|
|
|
+ position);
|
|
|
+ putField(mm, "quarterlyTotalCount", "quarterlyTotalAmount", rd.getQuarterStart(), rd.getQuarterEnd(), depName,
|
|
|
+ name, position);
|
|
|
+ putField(mm, "annuallyTotalCount", "annuallyTotalAmount", rd.getYearStart(), rd.getYearEnd(), depName, name,
|
|
|
+ position);
|
|
|
+ mm.put("totalRecordCount", salesReportMapper.selectSalesPersonalReportsCount(rd.getDailyStart(),
|
|
|
+ rd.getDailyEnd(), depName, name, position));
|
|
|
return mm;
|
|
|
}
|
|
|
|
|
|
- private void putField(ModelMap mm, String count, String amount, Date start, Date end) {
|
|
|
- ModelMap res = salesReportMapper.selectTotalReports(start, end);
|
|
|
+ private void putField(ModelMap mm, String count, String amount, Date start, Date end, String depName, String name,
|
|
|
+ String position) {
|
|
|
+ ModelMap res = salesReportMapper.selectTotalReports(start, end, depName, name, position);
|
|
|
mm.put(count, res == null ? 0 : res.get("totalCount"));
|
|
|
mm.put(amount, res == null ? 0 : res.get("totalAmount"));
|
|
|
}
|
|
|
@@ -87,6 +113,11 @@ public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMappe
|
|
|
SalesReportOrderField.AnnuallyOrderAmount.getCode(), depName, name, position);
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ if (list.isEmpty()) {
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
Map<String, PersonalSalesReportBO> map = new HashMap<>();
|
|
|
List<String> ids = list.stream().map(item -> {
|
|
|
map.put(item.getId(), item);
|
|
|
@@ -136,18 +167,47 @@ public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMappe
|
|
|
|
|
|
for (DepartmentSalesReportBO dsr : list) {
|
|
|
if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
|
|
|
- addToParent(map, dsr.getValues(), dsr.getSuperId(), 0);
|
|
|
+ dsr.setLevel(calcLevel(map, dsr.getSuperId(), 0));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ list.sort(new Comparator<DepartmentSalesReportBO>() {
|
|
|
+ @Override
|
|
|
+ public int compare(DepartmentSalesReportBO o1, DepartmentSalesReportBO o2) {
|
|
|
+ // 排序确保父节点在前,不重复计算父级数据
|
|
|
+ return o1.getLevel() - o2.getLevel();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ for (DepartmentSalesReportBO dsr : list) {
|
|
|
+ if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
|
|
|
+ addToParent(map, dsr.getValues(), dsr.getMemberCount(), dsr.getSuperId());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return list;
|
|
|
}
|
|
|
|
|
|
+ private int calcLevel(Map<String, DepartmentSalesReportBO> map, String parentId, int level) {
|
|
|
+ DepartmentSalesReportBO dsr = map.get(parentId);
|
|
|
+ if (dsr != null) {
|
|
|
+ level++;
|
|
|
+ if (level > 5) {
|
|
|
+ // 业务只能有3层,代码定义强行5层跳出,超过5层可能出现上下级循环嵌套的错误数据,导致递归死循环
|
|
|
+ throw new BusinessException("部门数据层级错误,请检查数据: " + parentId);
|
|
|
+ }
|
|
|
+ if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
|
|
|
+ return calcLevel(map, dsr.getSuperId(), level);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return level;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
- * 递归给所有上级增加销售统计, 业务规定最多3级上级,递归设定超出5级递归直接退出
|
|
|
+ * 递归给所有上级增加销售统计
|
|
|
*/
|
|
|
- private void addToParent(Map<String, DepartmentSalesReportBO> map, Map<String, SalesValues> values, String parentId,
|
|
|
- int level) {
|
|
|
+ private void addToParent(Map<String, DepartmentSalesReportBO> map, Map<String, SalesValues> values, int memberCount,
|
|
|
+ String parentId) {
|
|
|
DepartmentSalesReportBO dsr = map.get(parentId);
|
|
|
if (dsr != null) {
|
|
|
Map<String, SalesValues> pValues = dsr.getValues();
|
|
|
@@ -157,9 +217,9 @@ public class SalesReportServiceImpl extends BaseMybatisDao<DailySalesReportMappe
|
|
|
psv.setOrderCount(psv.getOrderCount() + sv.getOrderCount());
|
|
|
psv.setOrderAmount(psv.getOrderAmount().add(sv.getOrderAmount()));
|
|
|
}
|
|
|
- if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())
|
|
|
- && level < 5) {
|
|
|
- addToParent(map, values, dsr.getSuperId(), ++level);
|
|
|
+ dsr.setMemberCount(dsr.getMemberCount() + memberCount);
|
|
|
+ if (StringUtils.isNotBlank(dsr.getSuperId()) && !StringUtils.equals(dsr.getId(), dsr.getSuperId())) {
|
|
|
+ addToParent(map, values, memberCount, dsr.getSuperId());
|
|
|
}
|
|
|
}
|
|
|
}
|