diff --git a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCommisionController.java b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCommisionController.java index c7fd11182..bbef32ffb 100644 --- a/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCommisionController.java +++ b/stdiet-admin/src/main/java/com/stdiet/web/controller/custom/SysCommisionController.java @@ -5,8 +5,11 @@ import java.math.RoundingMode; import java.util.List; import com.stdiet.custom.domain.SysCommissionDayDetail; +import com.stdiet.custom.domain.SysOrder; +import com.stdiet.custom.domain.SysOrderCommisionDayDetail; import com.stdiet.custom.dto.request.SysOrderCommision; import com.stdiet.custom.service.ISysCommissionDayService; +import com.stdiet.custom.service.ISysOrderService; import com.stdiet.framework.web.domain.server.Sys; import com.stdiet.system.domain.CusSalesman; import com.stdiet.system.service.ISysUserService; @@ -199,6 +202,16 @@ public class SysCommisionController extends BaseController { return getDataTable(sysCommissionDayService.calculateCommissionByDay(sysCommision)); } + /** + * 根据用户ID查询该用户按天计算提成的详情 + * */ + @PreAuthorize("@ss.hasPermi('commisionDay:detail:list')") + @GetMapping("/orderDetailDay") + public AjaxResult getOrderCommissionDetailDay(SysCommision sysCommision) { + startPage(); + return sysCommissionDayService.calculateOrderCommissionDetail(sysCommision); + } + /** * 导出按天计算提成详细列表 */ 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 7d9ff4f04..449d24a61 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 @@ -3,6 +3,7 @@ package com.stdiet.custom.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.stdiet.common.annotation.Excel; import com.stdiet.common.core.domain.BaseEntity; +import lombok.Data; import java.math.BigDecimal; import java.time.LocalDate; @@ -12,22 +13,24 @@ import java.util.Map; /** * 每个订单的提成详情 * */ +@Data public class SysOrderCommisionDayDetail extends BaseEntity { private static final long serialVersionUID = 1L; /**订单成交时间*/ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime orderTime; /**客户姓名*/ private String name; /**服务结束时间*/ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "成交时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate serverStartDate; /**服务结束时间*/ + @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate serverEndDate; /**服务月数*/ @@ -39,12 +42,18 @@ public class SysOrderCommisionDayDetail extends BaseEntity { /**订单金额*/ private BigDecimal orderAmount; + /**订单总提成**/ + private BigDecimal orderCommission; + /**服务天数*/ private Integer serverDay; /**每天金额*/ private BigDecimal dayMoney; + /** 暂停总天数 **/ + private int pauseTotalDay; + /**每年每月暂停天数*/ private Map everyYearMonthPauseDay; @@ -54,99 +63,12 @@ public class SysOrderCommisionDayDetail extends BaseEntity { /**每年每月对应金额*/ private Map everyYearMonthServerMoney; - public LocalDateTime getOrderTime() { - return orderTime; - } + /**每年每月对应提成*/ + private Map everyYearMonthServerCommission; - public void setOrderTime(LocalDateTime orderTime) { - this.orderTime = orderTime; - } + //该笔订单成交的当月的总成交额,用于确定提成比例 + private BigDecimal monthOrderTotalAmount; - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public LocalDate getServerStartDate() { - return serverStartDate; - } - - public void setServerStartDate(LocalDate serverStartDate) { - this.serverStartDate = serverStartDate; - } - - public LocalDate getServerEndDate() { - return serverEndDate; - } - - public void setServerEndDate(LocalDate serverEndDate) { - this.serverEndDate = serverEndDate; - } - - public Integer getServerMonth() { - return serverMonth; - } - - public void setServerMonth(Integer serverMonth) { - this.serverMonth = serverMonth; - } - - public Integer getGiveDay() { - return giveDay; - } - - public void setGiveDay(Integer giveDay) { - this.giveDay = giveDay; - } - - public BigDecimal getOrderAmount() { - return orderAmount; - } - - public void setOrderAmount(BigDecimal orderAmount) { - this.orderAmount = orderAmount; - } - - public Integer getServerDay() { - return serverDay; - } - - public void setServerDay(Integer serverDay) { - this.serverDay = serverDay; - } - - public BigDecimal getDayMoney() { - return dayMoney; - } - - public void setDayMoney(BigDecimal dayMoney) { - this.dayMoney = dayMoney; - } - - public Map getEveryYearMonthPauseDay() { - return everyYearMonthPauseDay; - } - - public void setEveryYearMonthPauseDay(Map everyYearMonthPauseDay) { - this.everyYearMonthPauseDay = everyYearMonthPauseDay; - } - - public Map getEveryYearMonthServerDay() { - return everyYearMonthServerDay; - } - - public void setEveryYearMonthServerDay(Map everyYearMonthServerDay) { - this.everyYearMonthServerDay = everyYearMonthServerDay; - } - - public Map getEveryYearMonthServerMoney() { - return everyYearMonthServerMoney; - } - - public void setEveryYearMonthServerMoney(Map everyYearMonthServerMoney) { - this.everyYearMonthServerMoney = everyYearMonthServerMoney; - } + //该笔订单对应提成比例 + private Float commissionRate; } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/EveryMonthTotalAmount.java b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/EveryMonthTotalAmount.java new file mode 100644 index 000000000..f34d2d53f --- /dev/null +++ b/stdiet-custom/src/main/java/com/stdiet/custom/dto/response/EveryMonthTotalAmount.java @@ -0,0 +1,13 @@ +package com.stdiet.custom.dto.response; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class EveryMonthTotalAmount { + + private String yearMonth; + + private BigDecimal totalAmount; +} diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderMapper.java b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderMapper.java index 8662f4b91..caafa2e63 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderMapper.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/mapper/SysOrderMapper.java @@ -2,12 +2,14 @@ package com.stdiet.custom.mapper; import java.math.BigDecimal; import java.util.List; +import java.util.Map; import com.stdiet.custom.domain.SysCommision; import com.stdiet.custom.domain.SysCommissionDayDetail; import com.stdiet.custom.domain.SysCustomer; import com.stdiet.custom.domain.SysOrder; import com.stdiet.custom.dto.request.SysOrderCommision; +import com.stdiet.custom.dto.response.EveryMonthTotalAmount; import org.apache.ibatis.annotations.Param; /** @@ -85,4 +87,17 @@ public interface SysOrderMapper * @return */ int getOrderCountByCustomer(SysCustomer sysCustomer); + + /** + * 查询每年每月的总金额 + * @return + */ + List getTotalAmountByUserId(SysCommision sysCommision); + + /** + * 获取订单数量(按天提成计算) + * @param sysCommision + * @return + */ + int selectSimpleOrderMessageCount(SysCommision sysCommision); } \ No newline at end of file diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCommissionDayService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCommissionDayService.java index cb92b0c40..f3fae710c 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCommissionDayService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysCommissionDayService.java @@ -1,5 +1,6 @@ package com.stdiet.custom.service; +import com.stdiet.common.core.domain.AjaxResult; import com.stdiet.custom.domain.SysCommision; import com.stdiet.custom.domain.SysCommissionDayDetail; import com.stdiet.custom.domain.SysOrder; @@ -33,4 +34,9 @@ public interface ISysCommissionDayService { */ LocalDate getServerEndDate(SysOrder sysOrder); + /** + * 计算订单提成详情 + */ + AjaxResult calculateOrderCommissionDetail(SysCommision sysCommision); + } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderService.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderService.java index 8daa51afe..06402d7d3 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderService.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/ISysOrderService.java @@ -3,9 +3,12 @@ package com.stdiet.custom.service; import java.math.BigDecimal; import java.util.Date; import java.util.List; +import java.util.Map; +import com.stdiet.custom.domain.SysCommision; import com.stdiet.custom.domain.SysCustomer; import com.stdiet.custom.domain.SysOrder; +import com.stdiet.custom.dto.response.EveryMonthTotalAmount; /** * 销售订单Service接口 @@ -84,4 +87,17 @@ public interface ISysOrderService * @return */ int getOrderCountByCustomer(SysCustomer sysCustomer); + + /** + * 查询每年每月的总金额 + * @return + */ + List getTotalAmountByUserId(SysCommision sysCommision); + + /** + * 获取订单数量(按天提成计算) + * @param sysCommision + * @return + */ + int selectSimpleOrderMessageCount(SysCommision sysCommision); } \ No newline at end of file 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 02e223550..41e40a9a6 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 @@ -1,9 +1,11 @@ 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.custom.domain.*; import com.stdiet.custom.dto.request.SysOrderCommision; +import com.stdiet.custom.dto.response.EveryMonthTotalAmount; import com.stdiet.custom.mapper.SysCommisionMapper; import com.stdiet.custom.mapper.SysOrderMapper; import com.stdiet.custom.mapper.SysOrderPauseMapper; @@ -103,6 +105,63 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { return serverEndDate; } + /** + * 计算订单提成详情 + * @param sysCommision + */ + @Override + public AjaxResult calculateOrderCommissionDetail(SysCommision sysCommision){ + AjaxResult result = AjaxResult.error("参数错误"); + if(sysCommision.getUserId() == null){ + return result; + } + //分页查询2021年1月份之后所有订单 + Map> orderUserMap = getOrderByList(sysCommision); + if(orderUserMap == null || !orderUserMap.containsKey(sysCommision.getUserId())){ + return result; + } + //查询用户 + List list = sysCommisionMapper.getAfterSaleAndNutri(sysCommision); + if(list == null || list.size() == 0){ + return result; + } + Long userId = list.get(0).getUserId(); + Long postId = list.get(0).getPostId(); + //获取每个月的成交总额度 + List everyMonthTotalAmountList = sysOrderMapper.getTotalAmountByUserId(sysCommision); + if(everyMonthTotalAmountList == null || everyMonthTotalAmountList.size() == 0){ + return result; + } + Map everyMonthTotalAmountMap = new TreeMap<>(new MyComparator()); + for (EveryMonthTotalAmount everyMonthTotalAmount : everyMonthTotalAmountList) { + everyMonthTotalAmountMap.put(everyMonthTotalAmount.getYearMonth(), everyMonthTotalAmount.getTotalAmount()); + } + //获取每个月的提成比例以及计算提成 + Map rateMap = getRateByAmount(userId, postId, everyMonthTotalAmountMap); + BigDecimal totalCommission = BigDecimal.valueOf(0); + //根据用户ID获取对应订单列表 + List orderDetailList = orderUserMap.get(userId); + for(SysOrderCommisionDayDetail sysOrderCommisionDayDetail : orderDetailList){ + String yearMonth = sysOrderCommisionDayDetail.getOrderTime().getYear() + "" + sysOrderCommisionDayDetail.getOrderTime().getMonth().getValue(); + sysOrderCommisionDayDetail.setMonthOrderTotalAmount(everyMonthTotalAmountMap.get(yearMonth)); + sysOrderCommisionDayDetail.setCommissionRate(rateMap.get(yearMonth)); + //计算该笔订单总提成 + sysOrderCommisionDayDetail.setOrderCommission(getMoney(sysOrderCommisionDayDetail.getOrderAmount().doubleValue() * sysOrderCommisionDayDetail.getCommissionRate() / 100D)); + Map everyYearMonthServerCommission = new TreeMap<>(new MyComparator()); + for (String everyMonth : sysOrderCommisionDayDetail.getEveryYearMonthServerMoney().keySet()) { + everyYearMonthServerCommission.put(everyMonth, getMoney(sysOrderCommisionDayDetail.getEveryYearMonthServerMoney().get(everyMonth).doubleValue() * sysOrderCommisionDayDetail.getCommissionRate() / 100D)); + } + sysOrderCommisionDayDetail.setEveryYearMonthServerCommission(everyYearMonthServerCommission); + totalCommission = totalCommission.add(sysOrderCommisionDayDetail.getOrderCommission()); + } + result = AjaxResult.success(); + int total = sysOrderMapper.selectSimpleOrderMessageCount(sysCommision); + result.put("total", total); + result.put("list", orderDetailList); + result.put("totalCommission", totalCommission); + return result; + } + /** * 根据用户ID统计出该用户在该月所有订单的服务数量、服务总天数、服务订单总额、暂停总天数 @@ -135,14 +194,14 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { for (String ym : commissionMonthSet) { BigDecimal ym_mession = new BigDecimal(0); if(orderAmount.containsKey(ym)){ - totalCommissionAmount = totalCommissionAmount.add(getMoney(orderAmount.get(ym).doubleValue() * rateMap.get(ym) / 100D, 1)); + totalCommissionAmount = totalCommissionAmount.add(getMoney(orderAmount.get(ym).doubleValue() * rateMap.get(ym) / 100D)); } for (SysOrderCommisionDayDetail sysOrderCommisionDayDetail : orderDetailList) { Map everyYearMonthServerMoney = sysOrderCommisionDayDetail.getEveryYearMonthServerMoney(); if(everyYearMonthServerMoney.containsKey(ym)){ String orderYearMonth = sysOrderCommisionDayDetail.getOrderTime().getYear()+""+sysOrderCommisionDayDetail.getOrderTime().getMonth().getValue(); BigDecimal m = (everyYearMonthServerMoney.get(ym) == null) ? new BigDecimal(0) : everyYearMonthServerMoney.get(ym); - ym_mession = ym_mession.add(getMoney(m.doubleValue() * rateMap.get(orderYearMonth) / 100D, 1)); + ym_mession = ym_mession.add(getMoney(m.doubleValue() * rateMap.get(orderYearMonth) / 100D)); } } if(isSendCommissionByYearMonth(ym)){ @@ -288,7 +347,7 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { //服务总天数 int serverDay = getTotalByMap(everyYearMonthServerDay); //每天对应金额 - BigDecimal dayMoney = getMoney(orderAmount.doubleValue()/serverDay, 1); + BigDecimal dayMoney = getMoney(orderAmount.doubleValue()/serverDay); //每年每月对于金额 Map everyYearMonthServerMoney = getEveryMonthServerMoney(everyYearMonthServerDay, orderAmount, dayMoney); @@ -299,12 +358,14 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { sysOrderCommisionDayDetail.setServerEndDate(serverEndDate); sysOrderCommisionDayDetail.setServerMonth(serverMonth); sysOrderCommisionDayDetail.setGiveDay(giveDay); + sysOrderCommisionDayDetail.setPauseTotalDay(pauseTotalDay); sysOrderCommisionDayDetail.setOrderAmount(orderAmount); sysOrderCommisionDayDetail.setServerDay(serverDay); sysOrderCommisionDayDetail.setDayMoney(dayMoney); sysOrderCommisionDayDetail.setEveryYearMonthPauseDay(everyYearMonthPauseDay); sysOrderCommisionDayDetail.setEveryYearMonthServerDay(everyYearMonthServerDay); sysOrderCommisionDayDetail.setEveryYearMonthServerMoney(everyYearMonthServerMoney); + return sysOrderCommisionDayDetail; } @@ -385,11 +446,11 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { double totalMoney = 0.0; for(String key : keySet){ if(i++ != keySet.size()){ - everyMonthServerMoney.put(key, getMoney(everyMonthServerDay.get(key) * dayMoney.doubleValue(), 1)); + everyMonthServerMoney.put(key, getMoney(everyMonthServerDay.get(key) * dayMoney.doubleValue())); totalMoney += everyMonthServerMoney.get(key).doubleValue(); }else{ //由于小数点只保留一位,最后一个月的金额等于总额减去前几个月金额,避免总数不一致 - everyMonthServerMoney.put(key, getMoney(orderMoney.doubleValue() - totalMoney, 1)); + everyMonthServerMoney.put(key, getMoney(orderMoney.doubleValue() - totalMoney)); } } return everyMonthServerMoney; @@ -436,9 +497,9 @@ public class SysCommissionDayServiceImpl implements ISysCommissionDayService { } /** - * double转为BigDecimal,保留一位小数,向下舍去 + * double转为BigDecimal,保留2位小数,四舍五入 * */ - public BigDecimal getMoney(Double money, int n){ + public BigDecimal getMoney(Double money){ return new BigDecimal(money.toString()).setScale(2, BigDecimal.ROUND_HALF_UP); } diff --git a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java index 9ee2c1a41..4922a2c11 100644 --- a/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java +++ b/stdiet-custom/src/main/java/com/stdiet/custom/service/impl/SysOrderServiceImpl.java @@ -4,8 +4,10 @@ import com.stdiet.common.annotation.Excel; import com.stdiet.common.utils.DateUtils; import com.stdiet.common.utils.SecurityUtils; import com.stdiet.common.utils.StringUtils; +import com.stdiet.custom.domain.SysCommision; import com.stdiet.custom.domain.SysCustomer; import com.stdiet.custom.domain.SysOrder; +import com.stdiet.custom.dto.response.EveryMonthTotalAmount; import com.stdiet.custom.mapper.SysOrderMapper; import com.stdiet.custom.service.ISysCommissionDayService; import com.stdiet.custom.service.ISysOrderPauseService; @@ -22,6 +24,7 @@ import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.Date; import java.util.List; +import java.util.Map; /** * 销售订单Service业务层处理 @@ -349,7 +352,26 @@ public class SysOrderServiceImpl implements ISysOrderService { * @param sysCustomer * @return */ + @Override public int getOrderCountByCustomer(SysCustomer sysCustomer){ return sysOrderMapper.getOrderCountByCustomer(sysCustomer); } + + /** + * 查询每年每月的总金额 + * @return + */ + @Override + public List getTotalAmountByUserId(SysCommision sysCommision){ + return sysOrderMapper.getTotalAmountByUserId(sysCommision); + } + + /** + * 获取订单数量(按天提成计算) + * @param sysCommision + * @return + */ + public int selectSimpleOrderMessageCount(SysCommision sysCommision){ + return sysOrderMapper.selectSimpleOrderMessageCount(sysCommision); + } } \ No newline at end of file diff --git a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml index 0d38fd545..1c4c712f8 100644 --- a/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml +++ b/stdiet-custom/src/main/resources/mapper/custom/SysOrderMapper.xml @@ -404,7 +404,7 @@ and review_status = #{reviewStatus} - + and (su_sale.user_id = #{userId} or su_nutritionist.user_id = #{userId}) @@ -413,6 +413,48 @@ order by o.order_time desc + + + + + +