|
@@ -16,25 +16,21 @@ import com.ylx.common.exception.ServiceException;
|
|
|
import com.ylx.common.utils.SecurityUtils;
|
|
import com.ylx.common.utils.SecurityUtils;
|
|
|
import com.ylx.massage.domain.*;
|
|
import com.ylx.massage.domain.*;
|
|
|
import com.ylx.massage.domain.vo.*;
|
|
import com.ylx.massage.domain.vo.*;
|
|
|
-import com.ylx.massage.enums.BillTypeEnum;
|
|
|
|
|
-import com.ylx.massage.enums.DiscountTypeEnum;
|
|
|
|
|
-import com.ylx.massage.enums.JsStatusEnum;
|
|
|
|
|
-import com.ylx.massage.enums.OrderStatusEnum;
|
|
|
|
|
|
|
+import com.ylx.massage.enums.*;
|
|
|
import com.ylx.massage.mapper.TOrderMapper;
|
|
import com.ylx.massage.mapper.TOrderMapper;
|
|
|
import com.ylx.massage.service.*;
|
|
import com.ylx.massage.service.*;
|
|
|
import com.ylx.massage.utils.*;
|
|
import com.ylx.massage.utils.*;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+import lombok.var;
|
|
|
import org.apache.commons.compress.utils.Lists;
|
|
import org.apache.commons.compress.utils.Lists;
|
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
import java.math.RoundingMode;
|
|
|
-import java.time.Duration;
|
|
|
|
|
-import java.time.LocalDate;
|
|
|
|
|
-import java.time.LocalDateTime;
|
|
|
|
|
-import java.time.LocalTime;
|
|
|
|
|
|
|
+import java.time.*;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
@@ -102,6 +98,15 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
@Resource
|
|
@Resource
|
|
|
private CancelOrderApplicationService cancelOrderApplicationService;
|
|
private CancelOrderApplicationService cancelOrderApplicationService;
|
|
|
|
|
|
|
|
|
|
+ @Resource
|
|
|
|
|
+ private TTxRecordService recordService;
|
|
|
|
|
+
|
|
|
|
|
+ @Value("${percent}")
|
|
|
|
|
+ private String percent;
|
|
|
|
|
+
|
|
|
|
|
+ @Value("${hPercent}")
|
|
|
|
|
+ private String hPercent;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 判断是否免车费
|
|
* 判断是否免车费
|
|
|
* 时间段判断:
|
|
* 时间段判断:
|
|
@@ -802,6 +807,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
orderParam.setcId(orderNew.getcId());
|
|
orderParam.setcId(orderNew.getcId());
|
|
|
orderParam.setnStatus(OrderStatusEnum.REFUSE.getCode());
|
|
orderParam.setnStatus(OrderStatusEnum.REFUSE.getCode());
|
|
|
orderParam.setReasonRefusal(order.getReasonRefusal());
|
|
orderParam.setReasonRefusal(order.getReasonRefusal());
|
|
|
|
|
+
|
|
|
|
|
+ // 订单结算状态:未结算 2026-03-27 lixl
|
|
|
|
|
+ orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
|
|
|
updateJs(orderNew);
|
|
updateJs(orderNew);
|
|
|
return updateById(orderParam);
|
|
return updateById(orderParam);
|
|
|
}
|
|
}
|
|
@@ -876,6 +884,9 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
// 订单状态:待评价
|
|
// 订单状态:待评价
|
|
|
orderNew.setnStatus(OrderStatusEnum.WAIT_EVALUATE.getCode());
|
|
orderNew.setnStatus(OrderStatusEnum.WAIT_EVALUATE.getCode());
|
|
|
orderNew.setEndTime(LocalDateTime.now());
|
|
orderNew.setEndTime(LocalDateTime.now());
|
|
|
|
|
+
|
|
|
|
|
+ // 订单结算状态:待结算 2026-03-27 lixl
|
|
|
|
|
+ orderNew.setwStatus(OrderWStateEnum.WAIT_ACCOUNT.getCode());
|
|
|
updateById(orderNew);
|
|
updateById(orderNew);
|
|
|
|
|
|
|
|
// 添加订单完成消息通知(用户侧)
|
|
// 添加订单完成消息通知(用户侧)
|
|
@@ -1137,6 +1148,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
TOrder orderParam = new TOrder();
|
|
TOrder orderParam = new TOrder();
|
|
|
orderParam.setcId(orderNew.getcId());
|
|
orderParam.setcId(orderNew.getcId());
|
|
|
orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
|
|
orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
|
|
|
|
|
+
|
|
|
|
|
+ // 订单结算状态:未结算 2026-03-27 lixl
|
|
|
|
|
+ orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
|
|
|
|
|
+
|
|
|
//更新技师状态
|
|
//更新技师状态
|
|
|
TJs tJs = new TJs();
|
|
TJs tJs = new TJs();
|
|
|
tJs.setId(orderNew.getcJsId());
|
|
tJs.setId(orderNew.getcJsId());
|
|
@@ -1154,6 +1169,10 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
TOrder orderParam = new TOrder();
|
|
TOrder orderParam = new TOrder();
|
|
|
orderParam.setcId(orderNew.getcId());
|
|
orderParam.setcId(orderNew.getcId());
|
|
|
orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
|
|
orderParam.setnStatus(OrderStatusEnum.CANCEL.getCode());
|
|
|
|
|
+
|
|
|
|
|
+ // 订单结算状态:未结算 2026-03-27 lixl
|
|
|
|
|
+ orderParam.setwStatus(OrderWStateEnum.NO_ACCOUNT.getCode());
|
|
|
|
|
+
|
|
|
updateById(orderParam);
|
|
updateById(orderParam);
|
|
|
// 添加取消订单通知
|
|
// 添加取消订单通知
|
|
|
orderNotificationService.sendCancelledNotification(orderNew);
|
|
orderNotificationService.sendCancelledNotification(orderNew);
|
|
@@ -1297,13 +1316,13 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 申请取消订单(退单申请)
|
|
* 申请取消订单(退单申请)
|
|
|
- *
|
|
|
|
|
* 业务流程:
|
|
* 业务流程:
|
|
|
* 1. 校验订单状态(仅进行中的订单可申请退单)
|
|
* 1. 校验订单状态(仅进行中的订单可申请退单)
|
|
|
* 2. 创建退单申请记录
|
|
* 2. 创建退单申请记录
|
|
|
* 3. 更新订单状态为"退单待审核"
|
|
* 3. 更新订单状态为"退单待审核"
|
|
|
*
|
|
*
|
|
|
- * @param order 订单对象
|
|
|
|
|
|
|
+ * @param cId 订单对象
|
|
|
|
|
+ * @param cancelReason 订单对象
|
|
|
* @return Boolean 申请结果
|
|
* @return Boolean 申请结果
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
@@ -1416,4 +1435,191 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
|
|
|
return Boolean.TRUE;
|
|
return Boolean.TRUE;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Page<TOrder> getPcOrderIncome(Page<TOrder> page, TOrder o) {
|
|
|
|
|
+ Page<TOrder> orderPage = orderMapper.getAll(page, o);
|
|
|
|
|
+ if (orderPage != null && CollectionUtil.isNotEmpty(orderPage.getRecords())) {
|
|
|
|
|
+
|
|
|
|
|
+ ArrayList<TOrder> ordersList = Lists.newArrayList();
|
|
|
|
|
+ orderPage.getRecords().forEach(order -> {
|
|
|
|
|
+ order.setStatusName(OrderStatusEnum.getDescByCode(order.getnStatus()));
|
|
|
|
|
+ order.setJsPhone(order.getJs().getcPhone());
|
|
|
|
|
+ order.setJsName(order.getJs().getcName());
|
|
|
|
|
+ //订单金额
|
|
|
|
|
+ order.setOrderPrice(String.valueOf(order.getTotalPrice()));
|
|
|
|
|
+ //优惠券补贴
|
|
|
|
|
+ order.setCouponPrice(String.valueOf(order.getPreferential()));
|
|
|
|
|
+ //实付金额
|
|
|
|
|
+ order.setRealPayPrice(String.valueOf(order.getTotalPrice()));
|
|
|
|
|
+ //平台佣金比例
|
|
|
|
|
+ order.setPercent(percent.substring(percent.length() - 1)+"%");
|
|
|
|
|
+ //商户应收金额 不进行四舍五入
|
|
|
|
|
+ BigDecimal rp = order.getTotalPrice().multiply(new BigDecimal(hPercent)).
|
|
|
|
|
+ setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ order.setrPrice(String.valueOf(rp));
|
|
|
|
|
+ //平台佣金
|
|
|
|
|
+ BigDecimal cp = order.getTotalPrice().subtract(rp).
|
|
|
|
|
+ setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ order.setyPrice(String.valueOf(cp));
|
|
|
|
|
+ ordersList.add(order);
|
|
|
|
|
+
|
|
|
|
|
+ });
|
|
|
|
|
+ orderPage.setRecords(ordersList);
|
|
|
|
|
+ }
|
|
|
|
|
+ return orderPage;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 累计营业收入 累计平台佣金收入 累计商家收入
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public Map<String, String> totalData() {
|
|
|
|
|
+ //订单状态(-1:待付款 0:待接单 1:已接单 6:已出发 2:已到达 3:服务中 4:待评价
|
|
|
|
|
+ //5:已完成 7:退单待审核 8:退单审核通过 -2:已取消 -3:已拒绝)
|
|
|
|
|
+
|
|
|
|
|
+ // 过滤 待付款 退单审核通过 已取消 已拒绝
|
|
|
|
|
+ List<TOrder> listOrder = baseMapper.selectList(new LambdaQueryWrapper<TOrder>().
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY).ne(TOrder::getnStatus, OrderStatusEnum.CANCEL_APPLICATION_PASS).
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.CANCEL).ne(TOrder::getnStatus, OrderStatusEnum.REFUSE));
|
|
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
|
|
+ final BigDecimal[] total1 = {BigDecimal.ZERO};
|
|
|
|
|
+ final BigDecimal[] total2 = {BigDecimal.ZERO};
|
|
|
|
|
+ BigDecimal total3 = BigDecimal.ZERO;
|
|
|
|
|
+ listOrder.forEach(order -> {
|
|
|
|
|
+ total1[0] = total1[0].add(null == order.getTotalPrice() ? BigDecimal.ZERO : order.getTotalPrice());
|
|
|
|
|
+ total2[0] = total2[0].add(null == order.getTotalPrice() ? BigDecimal.ZERO : order.getTotalPrice().
|
|
|
|
|
+ multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN));
|
|
|
|
|
+ });
|
|
|
|
|
+ total3 = total1[0].subtract(total2[0]).setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ map.put("totalPrice", total1[0].toString());
|
|
|
|
|
+ map.put("merchantPrice", total2[0].toString());
|
|
|
|
|
+ map.put("platformPrice", total3.toString());
|
|
|
|
|
+ return map;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public void callAutoAccount(int hCount, BigDecimal percent) {
|
|
|
|
|
+ baseMapper.callAutoAccount(hCount, percent);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 商户收益,总额,待结算,已结算,已提现
|
|
|
|
|
+ * @param user
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public Map<String, String> myIncome(TWxUser user) {
|
|
|
|
|
+ List<TOrder> orderList = getTOrders(user, null);
|
|
|
|
|
+ Map<String, String> result = new HashMap<>();
|
|
|
|
|
+ // 我的收益 = 待结算 + 已结算
|
|
|
|
|
+ if(CollectionUtil.isNotEmpty(orderList)){
|
|
|
|
|
+ // 所有订单的总金额
|
|
|
|
|
+ BigDecimal tAmount = orderList.stream()
|
|
|
|
|
+ .map(TOrder::getTotalPrice)
|
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+ tAmount = tAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ // 已结算订单的总金额
|
|
|
|
|
+ BigDecimal yAmount = orderList.stream()
|
|
|
|
|
+ .filter(order -> OrderWStateEnum.OK_ACCOUNT.getCode().intValue() == order.getwStatus().intValue())
|
|
|
|
|
+ .map(TOrder::getTotalPrice)
|
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+ yAmount = yAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ // 待结算订单的总金额
|
|
|
|
|
+ BigDecimal wAmount = orderList.stream()
|
|
|
|
|
+ .filter(order -> OrderWStateEnum.WAIT_ACCOUNT.getCode().intValue() == order.getwStatus().intValue())
|
|
|
|
|
+ .map(TOrder::getTotalPrice)
|
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+ wAmount = wAmount.multiply(new BigDecimal(hPercent)).setScale(2, RoundingMode.DOWN);
|
|
|
|
|
+ result.put("tAmount", tAmount.toPlainString());
|
|
|
|
|
+ result.put("yAmount", yAmount.toPlainString());
|
|
|
|
|
+ result.put("wAmount", wAmount.toPlainString());
|
|
|
|
|
+ }
|
|
|
|
|
+ List<TTxRecord> tTxRecords = recordService.tTxRecordList(user.getcOpenid());
|
|
|
|
|
+ if(CollectionUtil.isNotEmpty(tTxRecords)){
|
|
|
|
|
+ // 已提现
|
|
|
|
|
+ BigDecimal gAmount = tTxRecords.stream()
|
|
|
|
|
+ .map(TTxRecord::getdPrice)
|
|
|
|
|
+ .reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
+ result.put("gAmount", gAmount.toPlainString());
|
|
|
|
|
+ }
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 商户收入明细
|
|
|
|
|
+ * @param user
|
|
|
|
|
+ * @param wStatus
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ public Map<YearMonth, List<TOrder>> myIncomeDetail(TWxUser user, Integer wStatus) {
|
|
|
|
|
+ List<TOrder> orderList = getTOrders(user, wStatus);
|
|
|
|
|
+ Map<YearMonth, List<TOrder>> sortedMonthlyGroupedOrders = new HashMap<>();
|
|
|
|
|
+ if(CollectionUtil.isNotEmpty(orderList)){
|
|
|
|
|
+ orderList.forEach(item->{
|
|
|
|
|
+ //商户应收金额 不进行四舍五入
|
|
|
|
|
+ item.setrPrice(String.valueOf(item.getTotalPrice().multiply(new BigDecimal(hPercent)).
|
|
|
|
|
+ setScale(2, RoundingMode.DOWN)));
|
|
|
|
|
+ item.setProjectNames(getProjectNames(item));
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+// Map<YearMonth, List<TOrder>> monthlyGroupedOrders = orderList.stream()
|
|
|
|
|
+// .collect(Collectors.groupingBy(o -> YearMonth.from(o.getEndTime())));
|
|
|
|
|
+ Map<YearMonth, List<TOrder>> monthlyGroupedOrders = orderList.stream()
|
|
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
|
|
+ order -> YearMonth.from(order.getDtCreateTime()),
|
|
|
|
|
+ Collectors.collectingAndThen(
|
|
|
|
|
+ Collectors.toList(),
|
|
|
|
|
+ list -> list.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(TOrder::getDtCreateTime).reversed())
|
|
|
|
|
+ .collect(Collectors.toList())
|
|
|
|
|
+ )
|
|
|
|
|
+ ));
|
|
|
|
|
+ sortedMonthlyGroupedOrders = new TreeMap<>(Comparator.reverseOrder());
|
|
|
|
|
+ sortedMonthlyGroupedOrders.putAll(monthlyGroupedOrders);
|
|
|
|
|
+ // Sort the map by YearMonth
|
|
|
|
|
+// monthlyGroupedOrders.entrySet().stream()
|
|
|
|
|
+// .sorted(Map.Entry.comparingByKey());
|
|
|
|
|
+ //.forEach(entry -> {
|
|
|
|
|
+ // System.out.println("Month: " + entry.getKey());
|
|
|
|
|
+ // entry.getValue().forEach(od ->
|
|
|
|
|
+ // System.out.println(" Order ID: " + od.getOrderNo() + ", Amount: " + od.getTotalPrice()));
|
|
|
|
|
+ //});
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return sortedMonthlyGroupedOrders;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 查询待结算/已结算订单
|
|
|
|
|
+ * @param user
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<TOrder> getTOrders(TWxUser user, Integer wStatus) {
|
|
|
|
|
+ LambdaQueryWrapper<TOrder> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(TOrder::getIsDelete, 0).
|
|
|
|
|
+ eq(com.ylx.common.utils.StringUtils.isNotBlank(user.getcOpenid()),TOrder::getcOpenId, user.getcOpenid()).
|
|
|
|
|
+ eq(wStatus != null, TOrder::getwStatus, wStatus).
|
|
|
|
|
+ // 过滤 待付款 退单审核通过 已取消 已拒绝
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.WAIT_PAY).
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.CANCEL_APPLICATION_PASS).
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.CANCEL.getCode()).
|
|
|
|
|
+ ne(TOrder::getnStatus, OrderStatusEnum.REFUSE.getCode()).
|
|
|
|
|
+ orderByDesc(TOrder::getDtCreateTime);
|
|
|
|
|
+ return orderMapper.selectList(queryWrapper);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String getProjectNames(TOrder order) {
|
|
|
|
|
+ List<TXiangmu> list = JSONObject.parseArray(order.getcGoods().toJSONString(), TXiangmu.class);
|
|
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
|
|
+ for (TXiangmu xiangmu : list) {
|
|
|
|
|
+ sb.append(xiangmu.getcTitle()).append(",");
|
|
|
|
|
+ }
|
|
|
|
|
+ // 移除最后一个逗号
|
|
|
|
|
+ if (sb.length() > 0) {
|
|
|
|
|
+ sb.setLength(sb.length() - 1);
|
|
|
|
|
+ }
|
|
|
|
|
+ return sb.toString();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|