|
|
@@ -0,0 +1,264 @@
|
|
|
+package org.dromara.order.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.dromara.common.core.utils.MapstructUtils;
|
|
|
+import org.dromara.common.core.utils.StringUtils;
|
|
|
+import org.dromara.common.mybatis.core.page.PageQuery;
|
|
|
+import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
|
+import org.dromara.common.redis.utils.SequenceUtils;
|
|
|
+import org.dromara.order.domain.OrderMain;
|
|
|
+import org.dromara.order.domain.OrderReturn;
|
|
|
+import org.dromara.order.domain.OrderReturnItem;
|
|
|
+import org.dromara.order.domain.OrderRevenueHeader;
|
|
|
+import org.dromara.order.domain.bo.OrderReturnBo;
|
|
|
+import org.dromara.order.domain.bo.OrderReturnItemBo;
|
|
|
+import org.dromara.order.domain.vo.OrderReturnVo;
|
|
|
+import org.dromara.order.mapper.OrderReturnItemMapper;
|
|
|
+import org.dromara.order.mapper.OrderReturnMapper;
|
|
|
+import org.dromara.order.service.IOrderReturnService;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.util.Collection;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 退货主Service业务层处理
|
|
|
+ *
|
|
|
+ * @author LionLi
|
|
|
+ * @date 2026-01-05
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Service
|
|
|
+public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, OrderReturn> implements IOrderReturnService {
|
|
|
+
|
|
|
+ private final OrderReturnMapper baseMapper;
|
|
|
+
|
|
|
+ private final OrderReturnItemMapper orderReturnItemMapper;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询退货主
|
|
|
+ *
|
|
|
+ * @param id 主键
|
|
|
+ * @return 退货主
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public OrderReturnVo queryById(Long id) {
|
|
|
+ OrderReturnVo orderReturnVo = baseMapper.selectVoById(id);
|
|
|
+ orderReturnVo.setOrderReturnItemList(orderReturnItemMapper.selectVoList(new LambdaQueryWrapper<OrderReturnItem>()
|
|
|
+ .eq(OrderReturnItem::getReturnId, orderReturnVo.getId())));
|
|
|
+ return baseMapper.selectVoById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询退货主列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @param pageQuery 分页参数
|
|
|
+ * @return 退货主分页列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public TableDataInfo<OrderReturnVo> queryPageList(OrderReturnBo bo, PageQuery pageQuery) {
|
|
|
+ LambdaQueryWrapper<OrderReturn> lqw = buildQueryWrapper(bo);
|
|
|
+ Page<OrderReturnVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
|
|
+ return TableDataInfo.build(result);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询符合条件的退货主列表
|
|
|
+ *
|
|
|
+ * @param bo 查询条件
|
|
|
+ * @return 退货主列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<OrderReturnVo> queryList(OrderReturnBo bo) {
|
|
|
+ LambdaQueryWrapper<OrderReturn> lqw = buildQueryWrapper(bo);
|
|
|
+ return baseMapper.selectVoList(lqw);
|
|
|
+ }
|
|
|
+
|
|
|
+ private LambdaQueryWrapper<OrderReturn> buildQueryWrapper(OrderReturnBo bo) {
|
|
|
+ Map<String, Object> params = bo.getParams();
|
|
|
+ LambdaQueryWrapper<OrderReturn> lqw = Wrappers.lambdaQuery();
|
|
|
+ lqw.orderByAsc(OrderReturn::getId);
|
|
|
+ lqw.eq(bo.getOrderId() != null, OrderReturn::getOrderId, bo.getOrderId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), OrderReturn::getOrderNo, bo.getOrderNo());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getServiceType()), OrderReturn::getServiceType, bo.getServiceType());
|
|
|
+ lqw.eq(bo.getReturnTime() != null, OrderReturn::getReturnTime, bo.getReturnTime());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getReturnNo()), OrderReturn::getReturnNo, bo.getReturnNo());
|
|
|
+ lqw.eq(bo.getCustomerId() != null, OrderReturn::getCustomerId, bo.getCustomerId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), OrderReturn::getCustomerNo, bo.getCustomerNo());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getCustomerName()), OrderReturn::getCustomerName, bo.getCustomerName());
|
|
|
+ lqw.eq(bo.getAfterSaleAmount() != null, OrderReturn::getAfterSaleAmount, bo.getAfterSaleAmount());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getReturnStatus()), OrderReturn::getReturnStatus, bo.getReturnStatus());
|
|
|
+ lqw.eq(bo.getReturnProductNum() != null, OrderReturn::getReturnProductNum, bo.getReturnProductNum());
|
|
|
+ lqw.eq(bo.getProcessingTime() != null, OrderReturn::getProcessingTime, bo.getProcessingTime());
|
|
|
+ lqw.eq(bo.getReturnReasonId() != null, OrderReturn::getReturnReasonId, bo.getReturnReasonId());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getReturnReason()), OrderReturn::getReturnReason, bo.getReturnReason());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getProblemDescription()), OrderReturn::getProblemDescription, bo.getProblemDescription());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getVoucherPhoto()), OrderReturn::getVoucherPhoto, bo.getVoucherPhoto());
|
|
|
+ lqw.eq(bo.getShippingFee() != null, OrderReturn::getShippingFee, bo.getShippingFee());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getIsShippingFee()), OrderReturn::getIsShippingFee, bo.getIsShippingFee());
|
|
|
+ lqw.eq(bo.getOrderAmount() != null, OrderReturn::getOrderAmount, bo.getOrderAmount());
|
|
|
+ lqw.eq(bo.getReturnAmount() != null, OrderReturn::getReturnAmount, bo.getReturnAmount());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getAfterSalesRemarks()), OrderReturn::getAfterSalesRemarks, bo.getAfterSalesRemarks());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getReturnMethod()), OrderReturn::getReturnMethod, bo.getReturnMethod());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getChargebackName()), OrderReturn::getChargebackName, bo.getChargebackName());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackPhone()), OrderReturn::getChargebackPhone, bo.getChargebackPhone());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackPickupTime()), OrderReturn::getChargebackPickupTime, bo.getChargebackPickupTime());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackProvincial()), OrderReturn::getChargebackProvincial, bo.getChargebackProvincial());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackCity()), OrderReturn::getChargebackCity, bo.getChargebackCity());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackCounty()), OrderReturn::getChargebackCounty, bo.getChargebackCounty());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getProvincialCityCounty()), OrderReturn::getProvincialCityCounty, bo.getProvincialCityCounty());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getChargebackAddress()), OrderReturn::getChargebackAddress, bo.getChargebackAddress());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getPushStatus()), OrderReturn::getPushStatus, bo.getPushStatus());
|
|
|
+ lqw.eq(bo.getLogisticsId() != null, OrderReturn::getLogisticsId, bo.getLogisticsId());
|
|
|
+ lqw.like(StringUtils.isNotBlank(bo.getLogisticsName()), OrderReturn::getLogisticsName, bo.getLogisticsName());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getLogisticsNo()), OrderReturn::getLogisticsNo, bo.getLogisticsNo());
|
|
|
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), OrderReturn::getStatus, bo.getStatus());
|
|
|
+ if (params != null) {
|
|
|
+ lqw.between(params.get("beginTime") != null && params.get("endTime") != null,
|
|
|
+ OrderReturn::getCreateTime, params.get("beginTime"), params.get("endTime"));
|
|
|
+ }
|
|
|
+ return lqw;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增退货主
|
|
|
+ *
|
|
|
+ * @param bo 退货主
|
|
|
+ * @return 是否新增成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean insertByBo(OrderReturnBo bo) {
|
|
|
+
|
|
|
+ if (bo == null) {
|
|
|
+ log.warn("新增退货单失败:入参为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成单号
|
|
|
+ bo.setReturnNo(SequenceUtils.generateOrderCode("OR"));
|
|
|
+
|
|
|
+ // 转换并校验
|
|
|
+ OrderReturn entity = MapstructUtils.convert(bo, OrderReturn.class);
|
|
|
+ validEntityBeforeSave(entity);
|
|
|
+
|
|
|
+ // 插入主表
|
|
|
+ boolean inserted = baseMapper.insert(entity) > 0;
|
|
|
+ if (!inserted) {
|
|
|
+ log.warn("插入退货单主表失败");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存明细
|
|
|
+ saveOrderReturnItems(entity.getId(), bo.getOrderReturnItemList(), false);
|
|
|
+
|
|
|
+ log.info("新增退货单成功,单号: {}", entity.getReturnNo());
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改退货主
|
|
|
+ *
|
|
|
+ * @param bo 退货主
|
|
|
+ * @return 是否修改成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public Boolean updateByBo(OrderReturnBo bo) {
|
|
|
+
|
|
|
+ if (bo == null || bo.getId() == null) {
|
|
|
+ log.warn("修改退货单失败:BO 或 ID 为空");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查主表记录是否存在
|
|
|
+ if (baseMapper.selectById(bo.getId()) == null) {
|
|
|
+ log.warn("修改退货单失败:主表记录不存在,ID={}", bo.getId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转换并校验
|
|
|
+ OrderReturn entity = MapstructUtils.convert(bo, OrderReturn.class);
|
|
|
+ validEntityBeforeSave(entity);
|
|
|
+
|
|
|
+ // 更新主表
|
|
|
+ boolean updated = baseMapper.updateById(entity) > 0;
|
|
|
+ if (!updated) {
|
|
|
+ log.warn("更新退货单主表失败,ID={}", bo.getId());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 先删后插明细
|
|
|
+ saveOrderReturnItems(bo.getId(), bo.getOrderReturnItemList(), true);
|
|
|
+
|
|
|
+ log.info("修改退货单成功,ID: {}", bo.getId());
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存收入单明细
|
|
|
+ *
|
|
|
+ * @param orderReturnId 主表ID
|
|
|
+ * @param itemList 明细列表
|
|
|
+ * @param deleteFirst 是否先删除已有明细(true=编辑模式)
|
|
|
+ */
|
|
|
+ private void saveOrderReturnItems(Long orderReturnId, List<OrderReturnItemBo> itemList, boolean deleteFirst) {
|
|
|
+ if (orderReturnId == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (deleteFirst) {
|
|
|
+ orderReturnItemMapper.deleteByOrderReturnId(orderReturnId);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (itemList == null || itemList.isEmpty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderReturnItem> items = itemList.stream()
|
|
|
+ .filter(Objects::nonNull) // 防止空元素
|
|
|
+ .map(bo -> {
|
|
|
+ OrderReturnItem item = MapstructUtils.convert(bo, OrderReturnItem.class);
|
|
|
+ item.setReturnId(orderReturnId);
|
|
|
+ return item;
|
|
|
+ })
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (!items.isEmpty()) {
|
|
|
+ orderReturnItemMapper.insertBatch(items);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 保存前的数据校验
|
|
|
+ */
|
|
|
+ private void validEntityBeforeSave(OrderReturn entity) {
|
|
|
+ //TODO 做一些数据校验,如唯一约束
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验并批量删除退货主信息
|
|
|
+ *
|
|
|
+ * @param ids 待删除的主键集合
|
|
|
+ * @param isValid 是否进行有效性校验
|
|
|
+ * @return 是否删除成功
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
+ if (isValid) {
|
|
|
+ //TODO 做一些业务上的校验,判断是否需要校验
|
|
|
+ }
|
|
|
+ return baseMapper.deleteByIds(ids) > 0;
|
|
|
+ }
|
|
|
+}
|