diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCommision.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCommision.java index a1fe6f18a..2ee667379 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCommision.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysCommision.java @@ -62,4 +62,10 @@ public class SysCommision extends BaseEntity { //订单审核状态 private String reviewStatus; + + //服务开始时间,用于计算该时间段的提成 + private String serverScopeStartTime; + + //服务结束时间,用于计算该时间段的提成 + private String serverScopeEndTime; } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrderCommisionDayDetail.java b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrderCommisionDayDetail.java index 449d24a61..981507c97 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrderCommisionDayDetail.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/domain/SysOrderCommisionDayDetail.java @@ -18,6 +18,9 @@ public class SysOrderCommisionDayDetail extends BaseEntity { private static final long serialVersionUID = 1L; + /**订单ID*/ + private Long orderId; + /**订单成交时间*/ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime orderTime; @@ -66,6 +69,9 @@ public class SysOrderCommisionDayDetail extends BaseEntity { /**每年每月对应提成*/ private Map everyYearMonthServerCommission; + /**每年每月的提成是否发放**/ + private Map everyYearMonthCommissionSendFlag; + //该笔订单成交的当月的总成交额,用于确定提成比例 private BigDecimal monthOrderTotalAmount; diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java index 41e40a9a6..1432f75c3 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysCommissionDayServiceImpl.java @@ -3,6 +3,7 @@ package com.stdiet.custom.service.impl; import com.alibaba.fastjson.JSONArray; import com.stdiet.common.core.domain.AjaxResult; import com.stdiet.common.utils.DateUtils; +import com.stdiet.common.utils.StringUtils; import com.stdiet.custom.domain.*; import com.stdiet.custom.dto.request.SysOrderCommision; import com.stdiet.custom.dto.response.EveryMonthTotalAmount; @@ -138,7 +139,14 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { } //获取每个月的提成比例以及计算提成 Map rateMap = getRateByAmount(userId, postId, everyMonthTotalAmountMap); + //总服务金额 + BigDecimal totalServerAmount = BigDecimal.valueOf(0); + //总提成金额 BigDecimal totalCommission = BigDecimal.valueOf(0); + //已发放提成金额 + BigDecimal totalSendCommission = BigDecimal.valueOf(0); + //未发放提成金额 + BigDecimal totalNotSendCommission = BigDecimal.valueOf(0); //根据用户ID获取对应订单列表 List orderDetailList = orderUserMap.get(userId); for(SysOrderCommisionDayDetail sysOrderCommisionDayDetail : orderDetailList){ @@ -147,18 +155,42 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { sysOrderCommisionDayDetail.setCommissionRate(rateMap.get(yearMonth)); //计算该笔订单总提成 sysOrderCommisionDayDetail.setOrderCommission(getMoney(sysOrderCommisionDayDetail.getOrderAmount().doubleValue() * sysOrderCommisionDayDetail.getCommissionRate() / 100D)); + //每年每月提成 Map everyYearMonthServerCommission = new TreeMap<>(new MyComparator()); + //每年每月提成是否发放状态 + Map everyYearMonthCommissionSendFlag = new TreeMap<>(new MyComparator()); + //当前订单的提成总和 + BigDecimal currentOrderCommission = BigDecimal.valueOf(0); for (String everyMonth : sysOrderCommisionDayDetail.getEveryYearMonthServerMoney().keySet()) { - everyYearMonthServerCommission.put(everyMonth, getMoney(sysOrderCommisionDayDetail.getEveryYearMonthServerMoney().get(everyMonth).doubleValue() * sysOrderCommisionDayDetail.getCommissionRate() / 100D)); + if(everyMonth.equals(sysOrderCommisionDayDetail.getServerEndDate().getYear()+""+sysOrderCommisionDayDetail.getServerEndDate().getMonth().getValue())){ + //最后一个月的提成直接相减,避免误差 + everyYearMonthServerCommission.put(everyMonth, sysOrderCommisionDayDetail.getOrderCommission().subtract(currentOrderCommission)); + }else{ + everyYearMonthServerCommission.put(everyMonth, getMoney(sysOrderCommisionDayDetail.getEveryYearMonthServerMoney().get(everyMonth).doubleValue() * sysOrderCommisionDayDetail.getCommissionRate() / 100D)); + } + //判断是否已发放 + if(isSendCommissionByYearMonth(everyMonth)){ + everyYearMonthCommissionSendFlag.put(everyMonth, true); + totalSendCommission = totalSendCommission.add(everyYearMonthServerCommission.get(everyMonth)); + }else{ + everyYearMonthCommissionSendFlag.put(everyMonth, false); + totalNotSendCommission = totalNotSendCommission.add(everyYearMonthServerCommission.get(everyMonth)); + } + currentOrderCommission = currentOrderCommission.add(everyYearMonthServerCommission.get(everyMonth)); } sysOrderCommisionDayDetail.setEveryYearMonthServerCommission(everyYearMonthServerCommission); + sysOrderCommisionDayDetail.setEveryYearMonthCommissionSendFlag(everyYearMonthCommissionSendFlag); totalCommission = totalCommission.add(sysOrderCommisionDayDetail.getOrderCommission()); + totalServerAmount = totalServerAmount.add(sysOrderCommisionDayDetail.getOrderAmount()); } result = AjaxResult.success(); int total = sysOrderMapper.selectSimpleOrderMessageCount(sysCommision); result.put("total", total); result.put("list", orderDetailList); + result.put("totalServerAmount", totalServerAmount); result.put("totalCommission", totalCommission); + result.put("totalSendCommission", totalSendCommission); + result.put("totalNotSendCommission", totalNotSendCommission); return result; } @@ -296,7 +328,7 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { continue; } //对每笔订单进行处理,统计出该比订单在每年每月对应的服务天数、金额、暂停天数等 - SysOrderCommisionDayDetail sysOrderCommisionDayDetail = statisticsOrderMessage(sysOrder); + SysOrderCommisionDayDetail sysOrderCommisionDayDetail = statisticsOrderMessage(sysOrder, sysCommision.getServerScopeStartTime(), sysCommision.getServerScopeEndTime()); if(sysOrder.getAfterSaleId() != null && sysOrder.getAfterSaleId() > 0L){ addUserOrderResultMap(sysOrder.getAfterSaleId(), sysOrderCommisionDayDetail, userOrderResultMap); } @@ -323,7 +355,7 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { /** * 统计每笔订单的服务开始时间、结束时间、每年每月服务天数、服务金额、服务暂停天数等信息 * */ - public SysOrderCommisionDayDetail statisticsOrderMessage(SysOrder sysOrder){ + public SysOrderCommisionDayDetail statisticsOrderMessage(SysOrder sysOrder, String serverScopeStartTime, String serverScopeEndTime){ //提成计算开始时间(与食谱计划开始时间可能不同) LocalDate serverStartDate = DateUtils.dateToLocalDate(sysOrder.getCommissStartTime()); //订单总服务月数 @@ -349,9 +381,10 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { //每天对应金额 BigDecimal dayMoney = getMoney(orderAmount.doubleValue()/serverDay); //每年每月对于金额 - Map everyYearMonthServerMoney = getEveryMonthServerMoney(everyYearMonthServerDay, orderAmount, dayMoney); + Map everyYearMonthServerMoney = getEveryMonthServerMoney(everyYearMonthServerDay, orderAmount, dayMoney, serverEndDate); SysOrderCommisionDayDetail sysOrderCommisionDayDetail = new SysOrderCommisionDayDetail(); + sysOrderCommisionDayDetail.setOrderId(sysOrder.getOrderId()); sysOrderCommisionDayDetail.setOrderTime(DateUtils.dateToLocalDateTime(sysOrder.getOrderTime())); sysOrderCommisionDayDetail.setName(sysOrder.getCustomer()); sysOrderCommisionDayDetail.setServerStartDate(serverStartDate); @@ -366,9 +399,50 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { sysOrderCommisionDayDetail.setEveryYearMonthServerDay(everyYearMonthServerDay); sysOrderCommisionDayDetail.setEveryYearMonthServerMoney(everyYearMonthServerMoney); + if(StringUtils.isNotEmpty(serverScopeStartTime) && StringUtils.isNotEmpty(serverScopeEndTime)){ + LocalDate realStartTime = DateUtils.stringToLocalDate(serverScopeStartTime, "yyyy-MM-dd"); + LocalDate realEndTime = DateUtils.stringToLocalDate(serverScopeEndTime, "yyyy-MM-dd"); + //计算该时间范围内的暂停时间 + Map realEveryYearMonthPauseDay = getRealEveryYearMonthPauseDay(sysOrder.getOrderPauseList(), serverStartDate, serverEndDate, realStartTime, realEndTime); + //暂停总天数 + int realPauseTotalDay = getTotalByMap(realEveryYearMonthPauseDay); + //计算每年每月服务天数 + Map realEveryYearMonthServerDay = getRealEveryYearMonthDayCount(serverStartDate, serverEndDate, realStartTime, realEndTime, everyYearMonthPauseDay); + //服务总天数 + int realServerDay = getTotalByMap(realEveryYearMonthServerDay); + //每年每月对于金额 + Map realEveryYearMonthServerMoney = getEveryMonthServerMoney(realEveryYearMonthServerDay, orderAmount, dayMoney, serverEndDate); + //服务时间范围内暂停天数 + sysOrderCommisionDayDetail.setPauseTotalDay(realPauseTotalDay); + sysOrderCommisionDayDetail.setEveryYearMonthPauseDay(realEveryYearMonthPauseDay); + sysOrderCommisionDayDetail.setServerDay(realServerDay); + sysOrderCommisionDayDetail.setEveryYearMonthServerDay(realEveryYearMonthServerDay); + sysOrderCommisionDayDetail.setEveryYearMonthServerMoney(realEveryYearMonthServerMoney); + sysOrderCommisionDayDetail.setOrderAmount(getBigDecimalTotalByMap(realEveryYearMonthServerMoney)); + } return sysOrderCommisionDayDetail; } + /** + * 获取真正服务时间范围内的每年每月暂停天数 + * @Param list 暂停记录集合 + * */ + public Map getRealEveryYearMonthPauseDay(List list, LocalDate serverStartDate, LocalDate serverEndDate, LocalDate realStartDate, LocalDate realEndDate){ + Map pauseMap = new TreeMap<>(new MyComparator()); + if(ChronoUnit.DAYS.between(realEndDate, serverStartDate) > 0 || ChronoUnit.DAYS.between(serverEndDate, realStartDate) > 0){ + return pauseMap; + } + //更新服务开始时间 + if(ChronoUnit.DAYS.between(serverStartDate,realStartDate) > 0){ + serverStartDate = realStartDate; + } + //更新服务结束时间 + if(ChronoUnit.DAYS.between(realEndDate,serverEndDate) > 0){ + serverEndDate = realEndDate; + } + return getEveryYearMonthPauseDay(list, serverStartDate, serverEndDate); + } + /** * 获取每年每月暂停天数 * @Param list 暂停记录集合 @@ -423,6 +497,17 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { return total; } + /** + * 获取Map集合中BigDecimal的总和 + * */ + public BigDecimal getBigDecimalTotalByMap(Map map){ + BigDecimal totalBigDecimal = BigDecimal.valueOf(0); + for(String key : map.keySet()){ + totalBigDecimal = totalBigDecimal.add(map.get(key)); + } + return totalBigDecimal; + } + /** * 获取订单服务时间范围中每年每月服务天数,减去当月暂停天数 * @Param server_start_date 服务开始时间 @@ -438,27 +523,50 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { * @Param everyMonthServerDay 每年每月服务天数 * @Param orderMoney 订单总额 * @Param dayMoney 每天对于金额 + * @Param serverEndTime 订单服务结束时间 * */ - public Map getEveryMonthServerMoney(Map everyMonthServerDay, BigDecimal orderMoney, BigDecimal dayMoney){ + public Map getEveryMonthServerMoney(Map everyMonthServerDay, BigDecimal orderMoney, BigDecimal dayMoney, LocalDate serverEndTime){ Map everyMonthServerMoney = new TreeMap<>(new MyComparator()); Set keySet = everyMonthServerDay.keySet(); int i = 1; - double totalMoney = 0.0; + BigDecimal total = BigDecimal.valueOf(0); for(String key : keySet){ - if(i++ != keySet.size()){ - everyMonthServerMoney.put(key, getMoney(everyMonthServerDay.get(key) * dayMoney.doubleValue())); - totalMoney += everyMonthServerMoney.get(key).doubleValue(); + //System.out.println(serverEndTime.getYear()+""+serverEndTime.getMonth().getValue()); + //判断是否为最后一个月 + if(key.equals(serverEndTime.getYear()+""+serverEndTime.getMonth().getValue())){ + System.out.println(key); + //由于小数保留问题,最后一个月的金额等于总额减去前几个月金额,避免总数不一致 + everyMonthServerMoney.put(key, orderMoney.subtract(total)); }else{ - //由于小数点只保留一位,最后一个月的金额等于总额减去前几个月金额,避免总数不一致 - everyMonthServerMoney.put(key, getMoney(orderMoney.doubleValue() - totalMoney)); + everyMonthServerMoney.put(key, getMoney(everyMonthServerDay.get(key) * dayMoney.doubleValue())); + total = total.add(everyMonthServerMoney.get(key)); } } return everyMonthServerMoney; } + /** + * 根据订单服务开始日期、订单服务结束日期、营养师或售后实际开始时间、营养师或售后实际结束时间,统计出实际时间范围内每年每月对应的天数 + * */ + public Map getRealEveryYearMonthDayCount(LocalDate startDate, LocalDate endDate, LocalDate realStartDate, LocalDate realEndDate, Map lessDayMap){ + Map everyYearMonthServerDay = new TreeMap<>(new MyComparator()); + if(ChronoUnit.DAYS.between(realEndDate, startDate) > 0 || ChronoUnit.DAYS.between(endDate, realStartDate) > 0){ + return everyYearMonthServerDay; + } + //更新服务开始时间 + if(ChronoUnit.DAYS.between(startDate,realStartDate) > 0){ + startDate = realStartDate; + } + //更新服务结束时间 + if(ChronoUnit.DAYS.between(realEndDate,endDate) > 0){ + endDate = realEndDate; + } + return getEveryYearMonthDayCount(startDate, endDate, lessDayMap); + } + /** - * 根据开始日期、结束日期统计出时间范围内每年每月对应的天数 + * 根据订单开始日期、订单结束日期统计出时间范围内每年每月对应的天数 * */ public Map getEveryYearMonthDayCount(LocalDate startDate, LocalDate endDate, Map lessDayMap){ Map everyYearMonthServerDay = new TreeMap<>(new MyComparator()); @@ -468,8 +576,8 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { LocalDate everyMonthLastDate = everyMonthFirstDate.with(TemporalAdjusters.lastDayOfMonth()); int day = 0; boolean breakFlag = false; - //写100防止死循环 - for(int i = 0; i < 100; i++){ + //写1000防止死循环 + for(int i = 0; i < 1000; i++){ if(ChronoUnit.DAYS.between(everyMonthLastDate, endDate) > 0){ day = Period.between(everyMonthFirstDate, everyMonthLastDate).getDays() + 1; }else{ diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml index 1c4c712f8..84c9e65dd 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml @@ -400,7 +400,8 @@ from sys_order o left join sys_user su_sale on su_sale.user_id = o.after_sale_id and su_sale.del_flag = 0 left join sys_user su_nutritionist on su_nutritionist.user_id = o.nutritionist_id and su_nutritionist.del_flag = 0 - where o.order_time >= '2021-01-01' and o.del_flag = 0 + where o.order_time >= '2021-01-01' and o.del_flag = 0 and (su_sale.user_id is not null OR su_nutritionist.user_id is not null) + and o.amount is not null and review_status = #{reviewStatus} @@ -410,6 +411,9 @@ AND DATE_FORMAT(o.order_time,'%Y-%m-%d') <= #{endTime} + + AND #{serverScopeEndTime} >= DATE_FORMAT(o.commiss_start_time,'%Y-%m-%d') + order by o.order_time desc @@ -419,7 +423,8 @@ from sys_order o left join sys_user su_sale on su_sale.user_id = o.after_sale_id and su_sale.del_flag = 0 left join sys_user su_nutritionist on su_nutritionist.user_id = o.nutritionist_id and su_nutritionist.del_flag = 0 - where o.order_time >= '2021-01-01' and o.del_flag = 0 + where o.order_time >= '2021-01-01' and o.del_flag = 0 and (su_sale.user_id is not null OR su_nutritionist.user_id is not null) + and o.amount is not null and review_status = #{reviewStatus} @@ -429,6 +434,9 @@ AND DATE_FORMAT(o.order_time,'%Y-%m-%d') <= #{endTime} + + AND #{serverScopeEndTime} >= DATE_FORMAT(o.commiss_start_time,'%Y-%m-%d') + order by o.order_time desc @@ -440,7 +448,8 @@ FROM sys_order o LEFT JOIN sys_user su_sale ON su_sale.user_id = o.after_sale_id AND su_sale.del_flag = 0 LEFT JOIN sys_user su_nutritionist ON su_nutritionist.user_id = o.nutritionist_id AND su_nutritionist.del_flag = 0 - where o.order_time >= '2021-01-01' and o.del_flag = 0 + where o.order_time >= '2021-01-01' and o.del_flag = 0 and (su_sale.user_id is not null OR su_nutritionist.user_id is not null) + and o.amount is not null and o.review_status = #{reviewStatus} diff --git a/stdiet-ui/src/components/OrdercommissDetail/index.vue b/stdiet-ui/src/components/OrdercommissDetail/index.vue index 6529b1dd6..1b3c5c932 100644 --- a/stdiet-ui/src/components/OrdercommissDetail/index.vue +++ b/stdiet-ui/src/components/OrdercommissDetail/index.vue @@ -5,19 +5,53 @@ :close-on-press-escape="false" :visible.sync="visible" @closed="handleOnClosed" - size="63%" + size="65%" > -
+
+
+ + + + + + + 搜索 + 重置 + + +
- + 当前页总服务金额:{{totalServerAmount}}元 + + 当前页总提成:{{ totalCommission }}元 + 已发放总提成:{{ totalSendCommission }}元 + 未发放总提成:{{ totalNotSendCommission }}元
- - +
+ @@ -419,7 +419,7 @@ export default { dayjs(this.month).startOf("month").format("YYYY-MM-DD"), dayjs(this.month).endOf("month").format("YYYY-MM-DD"), ]; - this.$refs["ordercommissDetailRef"].showDrawer(this.addDateRange({'name': row.nickName, 'userId': row.userId, 'reviewStatus': this.queryParams.reviewStatus}, dateRange)); + this.$refs["ordercommissDetailRef"].showDrawer(this.addDateRange({'yearMonth': dayjs(this.month).endOf("month").format("YYYY-MM-DD"),'name': row.nickName, 'userId': row.userId, 'reviewStatus': this.queryParams.reviewStatus}, dateRange)); }, getSummaries(param) { //param 是固定的对象,里面包含 columns与 data参数的对象 {columns: Array[4], data: Array[5]},包含了表格的所有的列与数据信息