|
|
|
@ -1,14 +1,16 @@
|
|
|
|
|
package cc.yunxi.service.impl;
|
|
|
|
|
|
|
|
|
|
import cc.yunxi.common.domain.LambdaQueryWrapperX;
|
|
|
|
|
import cc.yunxi.common.exception.BizIllegalException;
|
|
|
|
|
import cc.yunxi.common.exception.DbException;
|
|
|
|
|
import cc.yunxi.common.exception.ForbiddenException;
|
|
|
|
|
import cc.yunxi.common.utils.BeanUtils;
|
|
|
|
|
import cc.yunxi.common.utils.CommonUtil;
|
|
|
|
|
import cc.yunxi.domain.dto.LocationDTO;
|
|
|
|
|
import cc.yunxi.domain.po.*;
|
|
|
|
|
import cc.yunxi.domain.query.RecycleOrderQuery;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorder.*;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorder.dzorder.DZRecycleOrderCreateVO;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorder.shorder.*;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorder.tmorder.TMRecycleOrderCreateVO;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;
|
|
|
|
|
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailUpdateVO;
|
|
|
|
|
import cc.yunxi.enums.*;
|
|
|
|
@ -16,7 +18,6 @@ import cc.yunxi.mapper.RecycleOrderMapper;
|
|
|
|
|
import cc.yunxi.service.*;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
@ -55,17 +56,24 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
@Resource
|
|
|
|
|
private IRecycleStationService recycleStationService;
|
|
|
|
|
|
|
|
|
|
@Resource
|
|
|
|
|
private IHousingEstateService housingEstateService;
|
|
|
|
|
|
|
|
|
|
public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) {
|
|
|
|
|
LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
LambdaQueryWrapperX<RecycleOrder> wrapper = new LambdaQueryWrapperX<>();
|
|
|
|
|
// 订单类型首要条件
|
|
|
|
|
wrapper.eq(RecycleOrder::getOrderType, recycleOrderQuery.getOrderType());
|
|
|
|
|
if (recycleOrderQuery.getUserType().equals(UserTypeEnum.CLIENT)) { // 散户查询
|
|
|
|
|
wrapper.eq(RecycleOrder::getClientId, recycleOrderQuery.getUserId());
|
|
|
|
|
wrapper.eq(ObjectUtil.isNotEmpty(recycleOrderQuery.getStatus()), RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
|
|
|
|
|
wrapper.eqIfPresent(RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
|
|
|
|
|
} else { // 回收员查询
|
|
|
|
|
if (StrUtil.isEmpty(recycleOrderQuery.getStationId())) {
|
|
|
|
|
throw new ForbiddenException("请先联系管理员绑定回收站点!");
|
|
|
|
|
}
|
|
|
|
|
// 只查回收员所在回收站下的订单
|
|
|
|
|
wrapper.eq(RecycleOrder::getRecycleStationId, recycleOrderQuery.getStationId());
|
|
|
|
|
switch (recycleOrderQuery.getOrderType()) {
|
|
|
|
|
case SH_ORDER:
|
|
|
|
|
// 不为待接单状态时, 只查自己的订单
|
|
|
|
|
if (!OrderStatusEnum.PENDING.equals(recycleOrderQuery.getStatus())) {
|
|
|
|
|
wrapper.eq(RecycleOrder::getStaffsId, recycleOrderQuery.getUserId());
|
|
|
|
@ -76,8 +84,21 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
} else {
|
|
|
|
|
wrapper.eq(RecycleOrder::getOrderStatus, recycleOrderQuery.getStatus());
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case TM_RECOVERY:
|
|
|
|
|
// 根据小区id查询
|
|
|
|
|
wrapper.eq(RecycleOrder::getHousingEstateId, recycleOrderQuery.getHousingEstateId());
|
|
|
|
|
// 散户手机号查询
|
|
|
|
|
wrapper.likeIfPresent(RecycleOrder::getClientMobile, recycleOrderQuery.getMobile());
|
|
|
|
|
break;
|
|
|
|
|
case DZ_RECOVERY:
|
|
|
|
|
// 散户手机号查询
|
|
|
|
|
wrapper.likeIfPresent(RecycleOrder::getClientMobile, recycleOrderQuery.getMobile());
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
wrapper.eq(StrUtil.isNotEmpty(recycleOrderQuery.getId()), RecycleOrder::getId, recycleOrderQuery.getId());
|
|
|
|
|
}
|
|
|
|
|
// 订单id查询
|
|
|
|
|
wrapper.eqIfPresent(RecycleOrder::getId, recycleOrderQuery.getId());
|
|
|
|
|
// 默认按创建时间倒序、已完成则按结算时间倒序
|
|
|
|
|
if (OrderStatusEnum.FINISHED.equals(recycleOrderQuery.getStatus())) {
|
|
|
|
|
recycleOrderQuery.addOrderItem(RecycleOrder::getCompleteTime, false);
|
|
|
|
@ -105,9 +126,6 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
public String createOrder(RecycleOrderCreateVO orderCreateVO) {
|
|
|
|
|
// 查询散户是否存在
|
|
|
|
|
Client client = clientService.getClientById(orderCreateVO.getClientId());
|
|
|
|
|
if (ObjectUtil.isEmpty(client)) {
|
|
|
|
|
throw new DbException("散户不存在!");
|
|
|
|
|
}
|
|
|
|
|
// 判断下单地址和回收站的距离
|
|
|
|
|
LocationDTO location = orderCreateVO.getLocation();
|
|
|
|
|
RecycleStation recycleStation = recycleStationService.getStationById(orderCreateVO.getRecycleStationId());
|
|
|
|
@ -117,6 +135,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
if (acceptRange.compareTo(distance) < 0) {
|
|
|
|
|
throw new BizIllegalException("超出回收站接单范围!");
|
|
|
|
|
}
|
|
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
|
|
// 创建订单
|
|
|
|
|
RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> {
|
|
|
|
|
target.setLatitude(source.getLocation().getLatitude());
|
|
|
|
@ -130,7 +149,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
recycleOrder.setDistance(distance.doubleValue());
|
|
|
|
|
recycleOrder.setOrderType(OrderTypeEnum.SH_ORDER);
|
|
|
|
|
recycleOrder.setOrderStatus(OrderStatusEnum.PENDING);
|
|
|
|
|
recycleOrder.setCreatorTime(LocalDateTime.now());
|
|
|
|
|
recycleOrder.setCreatorTime(now);
|
|
|
|
|
log.info("create recycleOrder info : {}", recycleOrder);
|
|
|
|
|
this.save(recycleOrder);
|
|
|
|
|
|
|
|
|
@ -139,7 +158,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
List<RecycleOrderDetailCreateVO> recycleOrderProductVOList = orderCreateVO.getOrderDetails();
|
|
|
|
|
recycleOrderProductVOList.forEach(rp -> {
|
|
|
|
|
rp.setRecycleOrderId(orderId);
|
|
|
|
|
rp.setCreatorTime(LocalDateTime.now());
|
|
|
|
|
rp.setCreatorTime(now);
|
|
|
|
|
});
|
|
|
|
|
List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class);
|
|
|
|
|
this.recycleOrderProductService.createOrderProducts(recycleOrderProducts);
|
|
|
|
@ -147,6 +166,86 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
return orderId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public String createOrderByHousing(TMRecycleOrderCreateVO tmOrderCreateVO) {
|
|
|
|
|
// 查询散户是否存在
|
|
|
|
|
Client client = clientService.getClientById(tmOrderCreateVO.getClientId());
|
|
|
|
|
String idNumber = CommonUtil.getIdNumber(BusinessCodeEnum.ORDER.getCode());
|
|
|
|
|
String housingEstateId = tmOrderCreateVO.getHousingEstateId();
|
|
|
|
|
HousingEstate housingInfo = housingEstateService.getHousingInfo(housingEstateId);
|
|
|
|
|
if (housingInfo.getHasSchedule() != 1 || StrUtil.isEmpty(housingInfo.getStationId())) {
|
|
|
|
|
throw new BizIllegalException("该小区不支持定点回收或未绑定回收站点!");
|
|
|
|
|
}
|
|
|
|
|
RecycleOrder recycleOrder = BeanUtils.copyBean(tmOrderCreateVO, RecycleOrder.class);
|
|
|
|
|
recycleOrder.setClientId(client.getId());
|
|
|
|
|
recycleOrder.setClientName(client.getNickName());
|
|
|
|
|
recycleOrder.setClientMobile(client.getMobilePhone());
|
|
|
|
|
recycleOrder.setOrderNumber(idNumber);
|
|
|
|
|
recycleOrder.setOrderType(OrderTypeEnum.TM_RECOVERY);
|
|
|
|
|
recycleOrder.setOrderStatus(OrderStatusEnum.UNPROCESSED);
|
|
|
|
|
recycleOrder.setCreatorTime(LocalDateTime.now());
|
|
|
|
|
this.save(recycleOrder);
|
|
|
|
|
|
|
|
|
|
return recycleOrder.getId();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public String createOrderByStation(DZRecycleOrderCreateVO dzOrderCreateVO) {
|
|
|
|
|
// 查询散户、回收员信息
|
|
|
|
|
Client client = clientService.getClientByMobile(dzOrderCreateVO.getClientMobile());
|
|
|
|
|
Recycler recycler = recyclerService.getRecyclerById(dzOrderCreateVO.getRecyclerId());
|
|
|
|
|
if (StrUtil.isEmpty(recycler.getStationId())) {
|
|
|
|
|
throw new BizIllegalException("警告,该回收员未绑定回收站点!");
|
|
|
|
|
}
|
|
|
|
|
// 创建订单
|
|
|
|
|
String orderNo = CommonUtil.getIdNumber(BusinessCodeEnum.ORDER.getCode());
|
|
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
|
|
RecycleOrder recycleOrder = new RecycleOrder();
|
|
|
|
|
recycleOrder.setClientId(client.getId());
|
|
|
|
|
recycleOrder.setClientName(client.getNickName());
|
|
|
|
|
recycleOrder.setClientMobile(client.getMobilePhone());
|
|
|
|
|
recycleOrder.setOrderNumber(orderNo);
|
|
|
|
|
recycleOrder.setOrderType(OrderTypeEnum.DZ_RECOVERY);
|
|
|
|
|
recycleOrder.setOrderStatus(OrderStatusEnum.FINISHED); // 直接完成
|
|
|
|
|
recycleOrder.setCreatorTime(now);
|
|
|
|
|
recycleOrder.setCompleteTime(now); // 完成时间
|
|
|
|
|
this.save(recycleOrder);
|
|
|
|
|
|
|
|
|
|
// 创建订单明细
|
|
|
|
|
String orderId = recycleOrder.getId();
|
|
|
|
|
List<RecycleOrderDetailUpdateVO> recycleOrderProductVOList = dzOrderCreateVO.getOrderDetails();
|
|
|
|
|
List<RecycleOrderProduct> recycleOrderProducts = BeanUtils.copyList(recycleOrderProductVOList, RecycleOrderProduct.class);
|
|
|
|
|
recycleOrderProducts.forEach(rp -> {
|
|
|
|
|
rp.setRecycleOrderId(orderId);
|
|
|
|
|
rp.setCreatorTime(now);
|
|
|
|
|
rp.setUpdateTime(now);
|
|
|
|
|
PriceProduct latestPriceProduct = this.recycleOrderProductService.getLatestPriceProduct(rp.getProductId());
|
|
|
|
|
log.info("latest price product: {}", latestPriceProduct);
|
|
|
|
|
if (ObjectUtil.isEmpty(latestPriceProduct)) {
|
|
|
|
|
throw new BizIllegalException("产品价格信息未公布,请联系商户!");
|
|
|
|
|
}
|
|
|
|
|
BigDecimal recoveryPrice = Optional.ofNullable(latestPriceProduct.getRecoveryPrice()).orElse(new BigDecimal("0.00"));
|
|
|
|
|
rp.setActualRecoveryPrice(recoveryPrice);
|
|
|
|
|
});
|
|
|
|
|
this.recycleOrderProductService.createOrderProducts(recycleOrderProducts);
|
|
|
|
|
|
|
|
|
|
// 订单结算
|
|
|
|
|
BigDecimal totalAmount = new BigDecimal("0.00");
|
|
|
|
|
for (RecycleOrderProduct recycleOrderProduct : recycleOrderProducts) {
|
|
|
|
|
BigDecimal weight = BigDecimal.valueOf(recycleOrderProduct.getProductActualWeight());
|
|
|
|
|
BigDecimal price = recycleOrderProduct.getActualRecoveryPrice();
|
|
|
|
|
totalAmount = totalAmount.add(weight.multiply(price));
|
|
|
|
|
}
|
|
|
|
|
recycleOrder.setOrderAmount(totalAmount);
|
|
|
|
|
this.updateById(recycleOrder);
|
|
|
|
|
|
|
|
|
|
// 增加收入余额 异步? todo
|
|
|
|
|
clientService.addBalance(client.getId(), totalAmount, orderNo, recycler.getStationId());
|
|
|
|
|
return orderId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
@ -233,7 +332,6 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
if (recycleOrder.getOrderStatus().equals(OrderStatusEnum.FINISHED)) {
|
|
|
|
|
throw new BizIllegalException("订单已完成结算!");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新订单明细信息
|
|
|
|
|
List<RecycleOrderDetailUpdateVO> recycleOrderProductVOList = orderFinishVO.getOrderDetails();
|
|
|
|
|
recycleOrderProductVOList.forEach(rp -> {
|
|
|
|
@ -280,6 +378,8 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 校验订单是否存在
|
|
|
|
|
private void validateOrderExists(String id) {
|
|
|
|
|
if (this.getOrderById(id) == null) {
|
|
|
|
|