Просмотр исходного кода

Merge branch 'dev' of git@git.coding.net:aft/AFT.git into dev

wanghui лет назад: 8
Родитель
Сommit
b363a0ed00

+ 12 - 2
src/main/java/com/goafanti/common/dao/DailySalesReportMapper.java

@@ -14,7 +14,13 @@ public interface DailySalesReportMapper {
 
 	DailySalesReport selectByPrimaryKey(Long id);
 
-	int insertSalesReports(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+	List<DailySalesReport> selectAdmins();
+
+	List<DailySalesReport> selectDailySalesReports(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+
+	int insertBatch(List<DailySalesReport> list);
+
+	int deleteByDate(@Param("createTime") Date createTime);
 
 	List<PersonalSalesReportBO> selectSalesPersonalReports(@Param("startTime") Date startTime,
 			@Param("endTime") Date endTime, @Param("pageNo") Integer pageNo, @Param("pageSize") Integer pageSize,
@@ -22,10 +28,14 @@ public interface DailySalesReportMapper {
 			@Param("countField") String countField, @Param("amountField") String amountField,
 			@Param("depName") String depName, @Param("name") String name, @Param("position") String position);
 
+	Long selectSalesPersonalReportsCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime,
+			@Param("depName") String depName, @Param("name") String name, @Param("position") String position);
+
 	List<ModelMap> selectSalesPersonalExtraReports(@Param("startTime") Date startTime, @Param("endTime") Date endTime,
 			@Param("ids") List<String> ids);
 
-	ModelMap selectTotalReports(@Param("startTime") Date startTime, @Param("endTime") Date endTime);
+	ModelMap selectTotalReports(@Param("startTime") Date startTime, @Param("endTime") Date endTime,
+			@Param("depName") String depName, @Param("name") String name, @Param("position") String position);
 
 	List<DepartmentSalesReportBO> selectSalesDepartmentReports();
 

+ 59 - 5
src/main/java/com/goafanti/common/mapper/DailySalesReportMapper.xml

@@ -18,15 +18,37 @@
     from daily_sales_report
     where id = #{id,jdbcType=INTEGER}
   </select>
-  <insert id="insertSalesReports">
-    insert into daily_sales_report 
-    (admin_id, dep_id, order_count, order_amount) 
+  
+  <select id="selectAdmins" resultMap="BaseResultMap">
+    select a.id as admin_id, dm.id as dep_id
+    from admin a
+    left join department_management dm on dm.id = a.department_id 
+  </select>
+  
+  <select id="selectDailySalesReports" resultMap="BaseResultMap">
     SELECT o.salesman_id as admin_id, a.department_id as dep_id,
 	count(o.order_no) as order_count, sum(o.order_amount) as order_amount
 	FROM aft.t_order o
 	left join aft.admin a on o.salesman_id=a.id
 	where o.order_status=3 and o.sign_time &gt;= #{startTime,jdbcType=TIMESTAMP} and o.sign_time &lt; #{endTime,jdbcType=TIMESTAMP}
 	group by o.salesman_id, a.department_id;
+  </select>
+  
+  <delete id="deleteByDate">
+    delete from daily_sales_report
+    where create_time = #{createTime,jdbcType=TIMESTAMP}
+  </delete>
+  
+  <insert id="insertBatch" parameterType="com.goafanti.common.model.DailySalesReport" >
+    insert into daily_sales_report (admin_id, dep_id, order_count, order_amount, create_time)
+    values 
+    <foreach item="item" index="index" collection="list" separator=",">
+        (#{item.adminId,jdbcType=VARCHAR},
+        #{item.depId,jdbcType=VARCHAR},
+        #{item.orderCount,jdbcType=INTEGER},
+        #{item.orderAmount,jdbcType=DECIMAL},
+        #{item.createTime,jdbcType=TIMESTAMP})
+    </foreach>
   </insert>
   
   <select id="selectSalesPersonalReports" resultType="com.goafanti.report.bo.PersonalSalesReportBO">
@@ -35,7 +57,7 @@
 	FROM admin a
 	left join daily_sales_report dsr on dsr.admin_id = a.id 
 	left join department_management dm on dm.id = dsr.dep_id 
-	where (dsr.create_time is null or (dsr.create_time &gt;= #{startTime,jdbcType=TIMESTAMP} and dsr.create_time &lt; #{endTime,jdbcType=TIMESTAMP}))
+	where dsr.create_time &gt;= #{startTime,jdbcType=TIMESTAMP} and dsr.create_time &lt; #{endTime,jdbcType=TIMESTAMP}
 	<if test="depName != null">
 		and dm.name like concat(#{depName,jdbcType=VARCHAR},'%')
 	</if>
@@ -52,6 +74,25 @@
     </if>
   </select>
   
+  <select id="selectSalesPersonalReportsCount" resultType="java.lang.Long">
+    SELECT count(distinct(a.id))
+	FROM admin a
+	left join daily_sales_report dsr on dsr.admin_id = a.id
+	<if test="depName != null"> 
+	left join department_management dm on dm.id = a.department_id 
+	</if>
+	where dsr.create_time &gt;= #{startTime,jdbcType=TIMESTAMP} and dsr.create_time &lt; #{endTime,jdbcType=TIMESTAMP}
+	<if test="depName != null">
+		and dm.name like concat(#{depName,jdbcType=VARCHAR},'%')
+	</if>
+	<if test="name != null">
+		and a.name like concat(#{name,jdbcType=VARCHAR},'%')
+	</if>
+	<if test="position != null">
+		and a.position like concat(#{position,jdbcType=VARCHAR},'%')
+	</if>
+  </select>
+  
   <select id="selectSalesPersonalExtraReports" resultType="org.springframework.ui.ModelMap">
     SELECT dsr.admin_id as id, sum(dsr.order_count) as order_count, sum(dsr.order_amount) as order_amount
 	FROM daily_sales_report dsr 
@@ -83,7 +124,20 @@
   
   <select id="selectTotalReports" resultType="org.springframework.ui.ModelMap">
     SELECT sum(dsr.order_count) as totalCount, sum(dsr.order_amount) as totalAmount
-	FROM daily_sales_report dsr 
+	FROM admin a
+	left join daily_sales_report dsr on dsr.admin_id = a.id
+	<if test="depName != null"> 
+	left join department_management dm on dm.id = a.department_id 
+	</if>
 	where dsr.create_time &gt;= #{startTime,jdbcType=TIMESTAMP} and dsr.create_time &lt; #{endTime,jdbcType=TIMESTAMP}
+	<if test="depName != null">
+		and dm.name like concat(#{depName,jdbcType=VARCHAR},'%')
+	</if>
+	<if test="name != null">
+		and a.name like concat(#{name,jdbcType=VARCHAR},'%')
+	</if>
+	<if test="position != null">
+		and a.position like concat(#{position,jdbcType=VARCHAR},'%')
+	</if>
   </select>
 </mapper>

+ 2 - 2
src/main/java/com/goafanti/common/model/DailySalesReport.java

@@ -24,12 +24,12 @@ public class DailySalesReport {
 	/**
 	* 销售签单数量
 	*/
-	private Integer		orderCount;
+	private Integer		orderCount	= 0;
 
 	/**
 	* 销售签单总额
 	*/
-	private BigDecimal	orderAmount;
+	private BigDecimal	orderAmount	= BigDecimal.ZERO;
 
 	public Integer getId() {
 		return id;

+ 1 - 1
src/main/java/com/goafanti/common/task/OrderReportTask.java

@@ -25,7 +25,7 @@ public class OrderReportTask {
 	 * "0 0 17 * * ?" 每天17点触发一次
 	 */
 	@Scheduled(cron = "0 0 17 * * ?")
-	public void exprireRun() {
+	public void runStatistics() {
 		LoggerUtils.debug(logger, "统计订单报表任务开始");
 		Calendar now = Calendar.getInstance();
 		now.set(Calendar.MILLISECOND, 0);

+ 10 - 1
src/main/java/com/goafanti/report/bo/DepartmentSalesReportBO.java

@@ -10,7 +10,8 @@ public class DepartmentSalesReportBO {
 	private String						superId;
 	private String						departmentName;
 	private String						managerName;
-	private int							memberCount;
+	private int							memberCount	= 0;
+	private int							level		= 0;
 	private Map<String, SalesValues>	values;
 
 	public DepartmentSalesReportBO() {
@@ -70,4 +71,12 @@ public class DepartmentSalesReportBO {
 		this.superId = superId;
 	}
 
+	public int getLevel() {
+		return level;
+	}
+
+	public void setLevel(int level) {
+		this.level = level;
+	}
+
 }

+ 25 - 2
src/main/java/com/goafanti/report/controller/ReportApiController.java

@@ -1,5 +1,6 @@
 package com.goafanti.report.controller;
 
+import java.util.Calendar;
 import java.util.Date;
 
 import org.apache.commons.lang3.StringUtils;
@@ -46,14 +47,15 @@ public class ReportApiController extends BaseApiController {
 	}
 
 	@RequestMapping(value = "/sales/total", method = RequestMethod.GET)
-	public Result total(String date) {
+	public Result total(String date, @RequestParam(required = false) String depName,
+			@RequestParam(required = false) String name, @RequestParam(required = false) String position) {
 		Date startTime = null;
 		try {
 			startTime = DateUtils.parseDate(date, AFTConstants.YYYYMMDDHHMMSS);
 		} catch (Exception e) {
 			startTime = new Date();
 		}
-		return res().data(reportService.getReportTotal(startTime));
+		return res().data(reportService.getReportTotal(startTime, depName, name, position));
 	}
 
 	@RequestMapping(value = "/sales/department", method = RequestMethod.GET)
@@ -67,4 +69,25 @@ public class ReportApiController extends BaseApiController {
 		return res().data(reportService.getDepartmentSalesReports(startTime));
 	}
 
+	@RequestMapping(value = "/sales/doStatistics", method = RequestMethod.GET)
+	public Result doStatistics(String date) {
+		Date dateTime = null;
+		try {
+			dateTime = DateUtils.parseDate(date, AFTConstants.YYYYMMDDHHMMSS);
+		} catch (Exception e) {
+			dateTime = new Date();
+		}
+		Calendar now = Calendar.getInstance();
+		now.setTime(dateTime);
+		now.set(Calendar.MILLISECOND, 0);
+		now.set(Calendar.SECOND, 0);
+		now.set(Calendar.MINUTE, 0);
+		now.set(Calendar.HOUR_OF_DAY, 17);
+		Date start = new Calendar.Builder()
+				.setDate(now.get(Calendar.YEAR), now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH) - 1)
+				.setTimeOfDay(17, 0, 0, 0).build().getTime();
+		// 统计从指定日期前一天的17点到指定日期17点的数据,算作改日期数据
+		return res().data(reportService.insertDailyReports(start, now.getTime()));
+	}
+
 }

+ 76 - 16
src/main/java/com/goafanti/report/service/SalesReportServiceImpl.java

@@ -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());
 			}
 		}
 	}