feat: 积分商城-基本实现拆单、确认收货2
This commit is contained in:
@@ -26,12 +26,6 @@ public class PointsMallH5OrderController {
|
|||||||
public void index() {
|
public void index() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@At("/stateList")
|
|
||||||
@SaCheckPermission("h5.points.mall")
|
|
||||||
public Result stateList() {
|
|
||||||
return Result.success(pointsMallOrderService.mobileOrderStates());
|
|
||||||
}
|
|
||||||
|
|
||||||
@At("/pageData")
|
@At("/pageData")
|
||||||
@SaCheckPermission("h5.points.mall")
|
@SaCheckPermission("h5.points.mall")
|
||||||
public Result pageData(PointsMallMobileOrderPageParam param) {
|
public Result pageData(PointsMallMobileOrderPageParam param) {
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.dto.MallOrderEventDTO;
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
|
|
||||||
@@ -24,6 +25,6 @@ public class MallAbolishSubOrderEventHandler implements MallOrderEventHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MallInboundResult handle(MallOrderEventDTO dto) {
|
public MallInboundResult handle(MallOrderEventDTO dto) {
|
||||||
return inboundEventService.updateSubOrderStatus(dto, MallInboundEventService.ORDER_ABOLISH);
|
return inboundEventService.updateSubOrderStatus(dto, MallOrderStatusEnum.ABOLISH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.dto.MallOrderEventDTO;
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
|
|
||||||
@@ -24,6 +25,6 @@ public class MallCancelSubOrderEventHandler implements MallOrderEventHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MallInboundResult handle(MallOrderEventDTO dto) {
|
public MallInboundResult handle(MallOrderEventDTO dto) {
|
||||||
return inboundEventService.updateSubOrderStatus(dto, MallInboundEventService.ORDER_CANCELLED);
|
return inboundEventService.updateSubOrderStatus(dto, MallOrderStatusEnum.CANCELLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+6
-1
@@ -4,12 +4,17 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.dto.MallOrderEventDTO;
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MallConfirmReceiptEventHandler
|
* MallConfirmReceiptEventHandler
|
||||||
* orderType=6: 确认收货事件处理器。
|
* orderType=6: 确认收货事件处理器。
|
||||||
|
* 行为: 根据子单外部ID更新子单状态为已妥投(电商处已收货待用户callP侧确认收货)。
|
||||||
|
*
|
||||||
|
* <p>注意:供应商侧“确认收货”对应 zhgh/callP 侧“已妥投(4)”,
|
||||||
|
* 不等同于 zhgh/callP 用户确认收货后的“已完成(5)”。</p>
|
||||||
*/
|
*/
|
||||||
@IocBean
|
@IocBean
|
||||||
public class MallConfirmReceiptEventHandler implements MallOrderEventHandler {
|
public class MallConfirmReceiptEventHandler implements MallOrderEventHandler {
|
||||||
@@ -24,6 +29,6 @@ public class MallConfirmReceiptEventHandler implements MallOrderEventHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MallInboundResult handle(MallOrderEventDTO dto) {
|
public MallInboundResult handle(MallOrderEventDTO dto) {
|
||||||
return inboundEventService.updateSubOrderStatus(dto, MallInboundEventService.ORDER_COMPLETED);
|
return inboundEventService.updateSubOrderStatus(dto, MallOrderStatusEnum.RECEIVED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.dto.MallOrderEventDTO;
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
|
|
||||||
@@ -24,6 +25,6 @@ public class MallExchangeSubEventHandler implements MallOrderEventHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MallInboundResult handle(MallOrderEventDTO dto) {
|
public MallInboundResult handle(MallOrderEventDTO dto) {
|
||||||
return inboundEventService.updateSubOrderStatus(dto, MallInboundEventService.ORDER_EXCHANGE);
|
return inboundEventService.updateSubOrderStatus(dto, MallOrderStatusEnum.EXCHANGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -4,6 +4,7 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.dto.MallOrderEventDTO;
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.event.MallOrderEventHandler;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.MallInboundEventService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
|
|
||||||
@@ -24,6 +25,6 @@ public class MallSubOrderReturnEventHandler implements MallOrderEventHandler {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MallInboundResult handle(MallOrderEventDTO dto) {
|
public MallInboundResult handle(MallOrderEventDTO dto) {
|
||||||
return inboundEventService.updateSubOrderStatus(dto, MallInboundEventService.ORDER_REFUNDED);
|
return inboundEventService.updateSubOrderStatus(dto, MallOrderStatusEnum.REFUNDED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+58
-12
@@ -19,6 +19,7 @@ import com.budwk.app.zhgh.pointsmall.mallbridge.event.handlers.MallSubOrderRetur
|
|||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallInboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallOutboundResult;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.model.MallOutboundResult;
|
||||||
import com.budwk.app.zhgh.pointsmall.mallbridge.service.support.AbstractMallBridgeSupport;
|
import com.budwk.app.zhgh.pointsmall.mallbridge.service.support.AbstractMallBridgeSupport;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderMain;
|
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderMain;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSub;
|
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSub;
|
||||||
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallPointsLockService;
|
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallPointsLockService;
|
||||||
@@ -46,12 +47,6 @@ import java.util.Map;
|
|||||||
@IocBean(args = {"refer:dao"})
|
@IocBean(args = {"refer:dao"})
|
||||||
public class MallInboundEventService extends AbstractMallBridgeSupport {
|
public class MallInboundEventService extends AbstractMallBridgeSupport {
|
||||||
|
|
||||||
public static final int ORDER_CANCELLED = 3;
|
|
||||||
public static final int ORDER_COMPLETED = 5;
|
|
||||||
public static final int ORDER_EXCHANGE = 6;
|
|
||||||
public static final int ORDER_REFUNDED = 7;
|
|
||||||
public static final int ORDER_ABOLISH = 8;
|
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
private PointsMallPointsLockService pointsMallPointsLockService;
|
private PointsMallPointsLockService pointsMallPointsLockService;
|
||||||
@Inject
|
@Inject
|
||||||
@@ -269,7 +264,18 @@ public class MallInboundEventService extends AbstractMallBridgeSupport {
|
|||||||
return sub;
|
return sub;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MallInboundResult updateSubOrderStatus(MallOrderEventDTO dto, int state) {
|
/**
|
||||||
|
* 更新子单状态。
|
||||||
|
*
|
||||||
|
* <p>订单类型为:6(确认收货)时,供应商侧“确认收货”对应 zhgh/callP 侧“已妥投(4)”,
|
||||||
|
* 需重新调用 9.2.2 获取订单详情接口,补充确认收货时间、发货时间、商品信息等字段。</p>
|
||||||
|
*
|
||||||
|
* @param dto 请求参数
|
||||||
|
* @param statusEnum zhgh/callP 侧订单状态枚举
|
||||||
|
* @return 操作结果
|
||||||
|
*/
|
||||||
|
public MallInboundResult updateSubOrderStatus(MallOrderEventDTO dto, MallOrderStatusEnum statusEnum) {
|
||||||
|
Integer state = statusEnum.getCode();
|
||||||
PointsMallOrderSub sub = dao.fetch(PointsMallOrderSub.class, Cnd.where("supplierId", "=", dto.getSupplierId())
|
PointsMallOrderSub sub = dao.fetch(PointsMallOrderSub.class, Cnd.where("supplierId", "=", dto.getSupplierId())
|
||||||
.and("orderId", "=", dto.getOrderId()).and("delFlag", "=", false));
|
.and("orderId", "=", dto.getOrderId()).and("delFlag", "=", false));
|
||||||
if (sub == null) {
|
if (sub == null) {
|
||||||
@@ -280,19 +286,24 @@ public class MallInboundEventService extends AbstractMallBridgeSupport {
|
|||||||
return MallInboundResult.success();
|
return MallInboundResult.success();
|
||||||
}
|
}
|
||||||
Trans.exec((Atom) () -> {
|
Trans.exec((Atom) () -> {
|
||||||
|
if (statusEnum == MallOrderStatusEnum.RECEIVED) {
|
||||||
|
fillReceivedSubOrder(dto, sub);
|
||||||
|
}
|
||||||
sub.setOrderState(state);
|
sub.setOrderState(state);
|
||||||
sub.setOrderUpdateTime(new Date());
|
if (statusEnum != MallOrderStatusEnum.RECEIVED || sub.getOrderUpdateTime() == null) {
|
||||||
if (state == ORDER_RECEIVED) {
|
sub.setOrderUpdateTime(new Date());
|
||||||
|
}
|
||||||
|
if (statusEnum == MallOrderStatusEnum.RECEIVED && sub.getOrderFinishTime() == null) {
|
||||||
sub.setOrderFinishTime(new Date());
|
sub.setOrderFinishTime(new Date());
|
||||||
}
|
}
|
||||||
if (state == ORDER_COMPLETED) {
|
if (statusEnum == MallOrderStatusEnum.COMPLETED) {
|
||||||
sub.setOrderCompleteTime(new Date());
|
sub.setOrderCompleteTime(new Date());
|
||||||
}
|
}
|
||||||
dao.updateIgnoreNull(sub);
|
dao.updateIgnoreNull(sub);
|
||||||
if (state == ORDER_CANCELLED || state == ORDER_REFUNDED || state == ORDER_ABOLISH) {
|
if (statusEnum == MallOrderStatusEnum.CANCELLED || statusEnum == MallOrderStatusEnum.REFUNDED || statusEnum == MallOrderStatusEnum.ABOLISH) {
|
||||||
pointsMallPointsLockService.releaseOrReturnSub(sub, state, nvl(sub.getRefund(), BigDecimal.ZERO));
|
pointsMallPointsLockService.releaseOrReturnSub(sub, state, nvl(sub.getRefund(), BigDecimal.ZERO));
|
||||||
}
|
}
|
||||||
if (state == ORDER_COMPLETED) {
|
if (statusEnum == MallOrderStatusEnum.COMPLETED) {
|
||||||
pointsMallPointsLockService.deductCompletedSub(sub);
|
pointsMallPointsLockService.deductCompletedSub(sub);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -300,6 +311,41 @@ public class MallInboundEventService extends AbstractMallBridgeSupport {
|
|||||||
return MallInboundResult.success();
|
return MallInboundResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单类型为:6(确认收货)时,调用 9.2.2 获取订单详情接口,补充子单妥投相关信息。
|
||||||
|
*
|
||||||
|
* <p>供应商侧确认收货只代表电商处已收货,对 zhgh/callP 侧应更新为已妥投(4),
|
||||||
|
* 等待 callP 用户侧确认收货后才进入已完成(5)。</p>
|
||||||
|
*/
|
||||||
|
private void fillReceivedSubOrder(MallOrderEventDTO dto, PointsMallOrderSub sub) {
|
||||||
|
if (mallOrderQueryOutboundService == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
MallOrderQueryDTO queryDTO = new MallOrderQueryDTO();
|
||||||
|
queryDTO.setSupplierId(dto.getSupplierId());
|
||||||
|
queryDTO.setOrderId(dto.getOrderId());
|
||||||
|
queryDTO.setOrderType(2);
|
||||||
|
log.info("订单类型为:6(确认收货)时,调用9.2.2获取订单详情接口:{}", queryDTO);
|
||||||
|
try {
|
||||||
|
MallOutboundResult result = mallOrderQueryOutboundService.queryOrderInfo(queryDTO);
|
||||||
|
if (result == null || result.getResultCode() != 0 || result.getOrderInfo() == null || result.getOrderInfo().isEmpty()) {
|
||||||
|
log.error("订单类型为:6(确认收货)时,调用9.2.2 获取订单详情失败:{},{}", queryDTO, result == null ? null : result.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
OrderInfoDTO orderInfo = result.getOrderInfo().get(0);
|
||||||
|
sub.setOrderCreateTime(parseDate(orderInfo.getCreateTime()));
|
||||||
|
sub.setOrderUpdateTime(parseDate(orderInfo.getUpdateTime()));
|
||||||
|
sub.setOrderFinishTime(parseDate(orderInfo.getOrderFinishTime()));
|
||||||
|
sub.setDeliveryTime(parseDate(orderInfo.getDeliveryTime()));
|
||||||
|
sub.setDeliveryStatus(parseInteger(orderInfo.getDeliveryStatus()));
|
||||||
|
if (orderInfo.getOrderProInfos() != null) {
|
||||||
|
sub.setExtJson(JSONUtil.toJsonStr(orderInfo.getOrderProInfos()));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("订单类型为:6(确认收货)时,调用9.2.2 获取订单详情异常:{},{}", queryDTO, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public MallInboundResult invoiceInfo(MallOrderEventDTO dto) {
|
public MallInboundResult invoiceInfo(MallOrderEventDTO dto) {
|
||||||
String mainOrderId = StrUtil.blankToDefault(dto.getMainOrderId(), dto.getOrderId());
|
String mainOrderId = StrUtil.blankToDefault(dto.getMainOrderId(), dto.getOrderId());
|
||||||
if (StrUtil.isBlank(mainOrderId)) {
|
if (StrUtil.isBlank(mainOrderId)) {
|
||||||
|
|||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package com.budwk.app.zhgh.pointsmall.order.enums;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 积分商城订单状态枚举。
|
||||||
|
*
|
||||||
|
* <p>zhgh/callP 侧订单状态与供应商商城订单状态是两套规则,不能混用。</p>
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
public enum MallOrderStatusEnum {
|
||||||
|
// 待付款 - 主单状态
|
||||||
|
PENDING_PAY(0, "待付款", false),
|
||||||
|
|
||||||
|
// 已支付 - 主单状态
|
||||||
|
FINISH_PAY(1, "已支付", false),
|
||||||
|
|
||||||
|
// 进行中 - 子单状态
|
||||||
|
IN_PROGRESS(2, "进行中", true),
|
||||||
|
|
||||||
|
// 已取消 - 主单子单状态
|
||||||
|
CANCELLED(3, "已取消", true),
|
||||||
|
|
||||||
|
// 已妥投(电商处已收货待用户callP侧确认收货)
|
||||||
|
RECEIVED(4, "已妥投", true),
|
||||||
|
|
||||||
|
// 已完成(callP侧用户确认收货)
|
||||||
|
COMPLETED(5, "已完成", true),
|
||||||
|
|
||||||
|
// 已换货(退货换货表的订单状态)
|
||||||
|
EXCHANGE(6, "换货", true),
|
||||||
|
|
||||||
|
// 已退货(退货换货表的订单状态)
|
||||||
|
REFUNDED(7, "退货", true),
|
||||||
|
|
||||||
|
// 已废除
|
||||||
|
ABOLISH(8, "废除", false);
|
||||||
|
|
||||||
|
private final Integer code;
|
||||||
|
private final String description;
|
||||||
|
private final Boolean isSaveHis;
|
||||||
|
|
||||||
|
MallOrderStatusEnum(Integer code, String description, Boolean isSaveHis) {
|
||||||
|
this.code = code;
|
||||||
|
this.description = description;
|
||||||
|
this.isSaveHis = isSaveHis;
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-3
@@ -9,6 +9,7 @@ import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderReceivedPa
|
|||||||
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderPageParam;
|
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderPageParam;
|
||||||
import com.budwk.app.zhgh.pointsmall.supplier.models.PointsMallSupplier;
|
import com.budwk.app.zhgh.pointsmall.supplier.models.PointsMallSupplier;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallOrderPageParam;
|
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallOrderPageParam;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.vo.PointsMallMobileOrderVO;
|
||||||
import org.nutz.dao.entity.Record;
|
import org.nutz.dao.entity.Record;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -19,9 +20,7 @@ public interface PointsMallOrderService extends BaseService<PointsMallOrderMain>
|
|||||||
|
|
||||||
Pagination<Record> pageSub(PointsMallOrderPageParam param);
|
Pagination<Record> pageSub(PointsMallOrderPageParam param);
|
||||||
|
|
||||||
Pagination<Record> mobileOrderPage(PointsMallMobileOrderPageParam param, String defaultUserId);
|
Pagination<PointsMallMobileOrderVO> mobileOrderPage(PointsMallMobileOrderPageParam param, String defaultUserId);
|
||||||
|
|
||||||
List<Record> mobileOrderStates();
|
|
||||||
|
|
||||||
Record supplierOrderUrl(String supplierId, String orderId, Integer orderType);
|
Record supplierOrderUrl(String supplierId, String orderId, Integer orderType);
|
||||||
|
|
||||||
|
|||||||
+272
-56
@@ -1,32 +1,45 @@
|
|||||||
package com.budwk.app.zhgh.pointsmall.order.service.impl;
|
package com.budwk.app.zhgh.pointsmall.order.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.json.JSONArray;
|
||||||
|
import cn.hutool.json.JSONObject;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.budwk.app.base.page.Pagination;
|
import com.budwk.app.base.page.Pagination;
|
||||||
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderExchange;
|
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderExchange;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderMain;
|
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderMain;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSub;
|
import com.budwk.app.zhgh.pointsmall.order.models.PointsMallOrderSub;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.enums.MallOrderStatusEnum;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderPageParam;
|
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderPageParam;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderReceivedParam;
|
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallMobileOrderReceivedParam;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallOrderPageParam;
|
import com.budwk.app.zhgh.pointsmall.order.param.PointsMallOrderPageParam;
|
||||||
import com.budwk.app.zhgh.pointsmall.order.service.PointsMallOrderService;
|
import com.budwk.app.zhgh.pointsmall.order.service.PointsMallOrderService;
|
||||||
|
import com.budwk.app.zhgh.pointsmall.order.vo.PointsMallMobileOrderVO;
|
||||||
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallPointsLockService;
|
import com.budwk.app.zhgh.pointsmall.points.service.PointsMallPointsLockService;
|
||||||
import com.budwk.app.zhgh.pointsmall.supplier.models.PointsMallSupplier;
|
import com.budwk.app.zhgh.pointsmall.supplier.models.PointsMallSupplier;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nutz.dao.Chain;
|
import org.nutz.dao.Chain;
|
||||||
import org.nutz.dao.Cnd;
|
import org.nutz.dao.Cnd;
|
||||||
import org.nutz.dao.Dao;
|
import org.nutz.dao.Dao;
|
||||||
|
import org.nutz.dao.pager.Pager;
|
||||||
import org.nutz.dao.Sqls;
|
import org.nutz.dao.Sqls;
|
||||||
import org.nutz.dao.entity.Record;
|
import org.nutz.dao.entity.Record;
|
||||||
import org.nutz.dao.sql.Sql;
|
import org.nutz.dao.sql.Sql;
|
||||||
|
import org.nutz.dao.util.Daos;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
import org.nutz.trans.Atom;
|
import org.nutz.trans.Atom;
|
||||||
import org.nutz.trans.Trans;
|
import org.nutz.trans.Trans;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@IocBean(args = {"refer:dao"})
|
@IocBean(args = {"refer:dao"})
|
||||||
public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderMain> implements PointsMallOrderService {
|
public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderMain> implements PointsMallOrderService {
|
||||||
|
|
||||||
@@ -77,47 +90,45 @@ public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderM
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Pagination<Record> mobileOrderPage(PointsMallMobileOrderPageParam param, String defaultUserId) {
|
public Pagination<PointsMallMobileOrderVO> mobileOrderPage(PointsMallMobileOrderPageParam param, String defaultUserId) {
|
||||||
Cnd cnd = Cnd.where("o.delFlag", "=", false);
|
|
||||||
String userId = StrUtil.blankToDefault(param.getUserId(), defaultUserId);
|
String userId = StrUtil.blankToDefault(param.getUserId(), defaultUserId);
|
||||||
if (StrUtil.isNotBlank(userId)) {
|
if (StrUtil.isBlank(userId)) {
|
||||||
cnd.and("o.userId", "=", userId);
|
throw new RuntimeException("用户不存在");
|
||||||
}
|
}
|
||||||
if (param.getOrderState() != null && param.getOrderState() >= 0) {
|
String orderState = param.getOrderState() == null ? "-1" : String.valueOf(param.getOrderState());
|
||||||
cnd.and("o.orderState", "=", param.getOrderState());
|
List<String> orderStateMain = Collections.singletonList("0");
|
||||||
|
List<String> orderStateSub = Arrays.asList("2", "4", "5", "3");
|
||||||
|
List<String> orderStateExchange = Arrays.asList("7", "6");
|
||||||
|
|
||||||
|
// 获取供应商列表
|
||||||
|
List<PointsMallSupplier> supplierList = dao().query(PointsMallSupplier.class, Cnd.where("delFlag", "=", false));
|
||||||
|
// 构建供应商键值对Map,key为supplierId,value为supplierName
|
||||||
|
Map<String, String> supplierNameMap = supplierList.stream()
|
||||||
|
.collect(Collectors.toMap(PointsMallSupplier::getSupplierId, PointsMallSupplier::getSupplierName));
|
||||||
|
|
||||||
|
Sql sql;
|
||||||
|
if (StrUtil.equals(orderState, "-1")) { // 全部订单,走主订单查询,查询所有主订单表
|
||||||
|
sql = getMobileOrderPageSql(userId, orderState);
|
||||||
|
} else if (orderStateMain.contains(orderState)) { // 主订单状态,走主订单查询,查询主订单表
|
||||||
|
sql = getMobileOrderMainPageSql(userId, orderState);
|
||||||
|
} else if (orderStateSub.contains(orderState)) { // 子订单状态,走子订单查询,查询子订单表
|
||||||
|
sql = getMobileOrderSubPageSql(userId, orderState);
|
||||||
|
} else if (orderStateExchange.contains(orderState)) { // 退换货订单状态,走退换货查询,查询退换货订单表
|
||||||
|
sql = getMobileOrderExchangePageSql(userId, orderState);
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException("订单状态不正确");
|
||||||
}
|
}
|
||||||
if (StrUtil.isNotBlank(param.getSupplierId())) {
|
|
||||||
cnd.and("o.supplierId", "=", param.getSupplierId());
|
Pagination<PointsMallMobileOrderVO> page = listMobileOrderPage(param.getPageNumber(), param.getPageSize(), sql);
|
||||||
}
|
for (PointsMallMobileOrderVO item : page.getList()) {
|
||||||
if (StrUtil.isNotBlank(param.getOrderId())) {
|
// 塞入供应商名称
|
||||||
cnd.and("o.orderId", "like", "%" + param.getOrderId() + "%");
|
item.setSupplierName(supplierNameMap.get(item.getSupplierId()));
|
||||||
}
|
// 处理商品信息
|
||||||
cnd.desc("o.orderCreateTime");
|
fillProductInfo(item);
|
||||||
Sql sql = Sqls.create("select o.*, s.supplierName, s.supplierOrderUrl, s.supplierReturnOrderUrl from points_mall_order_sub o left join points_mall_supplier s on o.supplierId = s.supplierId and s.delFlag = 0 $condition");
|
|
||||||
sql.setCondition(cnd);
|
|
||||||
Pagination<Record> page = listPage(param.getPageNumber(), param.getPageSize(), sql);
|
|
||||||
for (Record item : page.getList()) {
|
|
||||||
item.put("productImgList", productImages(item.getString("orderId")));
|
|
||||||
}
|
}
|
||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<Record> mobileOrderStates() {
|
|
||||||
return Arrays.asList(
|
|
||||||
state(-1, "全部"),
|
|
||||||
state(0, "待付款"),
|
|
||||||
state(1, "已支付"),
|
|
||||||
state(2, "进行中"),
|
|
||||||
state(3, "已取消"),
|
|
||||||
state(4, "已妥投"),
|
|
||||||
state(5, "已完成"),
|
|
||||||
state(6, "换货"),
|
|
||||||
state(7, "退货"),
|
|
||||||
state(8, "已废除")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Record supplierOrderUrl(String supplierId, String orderId, Integer orderType) {
|
public Record supplierOrderUrl(String supplierId, String orderId, Integer orderType) {
|
||||||
PointsMallSupplier supplier = dao().fetch(PointsMallSupplier.class, Cnd.where("supplierId", "=", supplierId).and("delFlag", "=", false));
|
PointsMallSupplier supplier = dao().fetch(PointsMallSupplier.class, Cnd.where("supplierId", "=", supplierId).and("delFlag", "=", false));
|
||||||
@@ -138,18 +149,39 @@ public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderM
|
|||||||
.and("supplierId", "=", param.getSupplierId())
|
.and("supplierId", "=", param.getSupplierId())
|
||||||
.and("delFlag", "=", false));
|
.and("delFlag", "=", false));
|
||||||
if (sub == null) {
|
if (sub == null) {
|
||||||
throw new RuntimeException("order not exists");
|
throw new RuntimeException("订单不存在");
|
||||||
}
|
}
|
||||||
if (!Integer.valueOf(2).equals(sub.getOrderState())) {
|
if (!MallOrderStatusEnum.RECEIVED.getCode().equals(sub.getOrderState())) {
|
||||||
throw new RuntimeException("order does not support receive");
|
throw new RuntimeException("订单不支持收货");
|
||||||
}
|
}
|
||||||
Trans.exec((Atom) () -> {
|
log.info("积分商城H5用户确认收货开始,supplierId={},userId={},orderId={}", sub.getSupplierId(), sub.getUserId(), sub.getOrderId());
|
||||||
sub.setOrderState(5);
|
try {
|
||||||
sub.setOrderCompleteTime(new Date());
|
Trans.exec((Atom) () -> {
|
||||||
sub.setOrderUpdateTime(new Date());
|
Date now = new Date();
|
||||||
dao().updateIgnoreNull(sub);
|
// 使用状态条件更新,避免重复确认收货导致积分重复扣减
|
||||||
pointsMallPointsLockService.deductCompletedSub(sub);
|
int update = dao().update(PointsMallOrderSub.class,
|
||||||
});
|
Chain.make("orderState", MallOrderStatusEnum.COMPLETED.getCode())
|
||||||
|
.add("orderCompleteTime", now)
|
||||||
|
.add("orderUpdateTime", now),
|
||||||
|
Cnd.where("id", "=", sub.getId())
|
||||||
|
.and("orderState", "=", MallOrderStatusEnum.RECEIVED.getCode())
|
||||||
|
.and("delFlag", "=", false));
|
||||||
|
if (update <= 0) {
|
||||||
|
throw new RuntimeException("更新订单失败,请重试");
|
||||||
|
}
|
||||||
|
sub.setOrderState(MallOrderStatusEnum.COMPLETED.getCode());
|
||||||
|
sub.setOrderCompleteTime(now);
|
||||||
|
sub.setOrderUpdateTime(now);
|
||||||
|
// 扣除用户积分、增加记录,并同步修改主单锁定积分
|
||||||
|
pointsMallPointsLockService.deductCompletedSub(sub);
|
||||||
|
/// 更新主订单状态,所有子单callP端确认收货后,修改主单的状态为已完成
|
||||||
|
updateMainOrderStatus(sub.getMainOrderId(), sub.getSupplierId());
|
||||||
|
});
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error(">>> 积分锁定失败:", e);
|
||||||
|
throw new RuntimeException("系统繁忙,请稍后重试");
|
||||||
|
}
|
||||||
|
log.info("积分商城H5用户确认收货完成,supplierId={},userId={},orderId={}", sub.getSupplierId(), sub.getUserId(), sub.getOrderId());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,12 +253,202 @@ public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderM
|
|||||||
return dao().query(PointsMallSupplier.class, Cnd.where("delFlag", "=", false).asc("sortCode"));
|
return dao().query(PointsMallSupplier.class, Cnd.where("delFlag", "=", false).asc("sortCode"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<String> productImages(String orderId) {
|
/**
|
||||||
Sql sql = Sqls.create("select picInfo from points_mall_order_sub_product where orderSubId=@orderId and delFlag=0 and picInfo is not null and picInfo<>'' order by createdAt asc");
|
* 移动端订单分页(合并主单、子单、退换货单)
|
||||||
sql.params().set("orderId", orderId);
|
*/
|
||||||
sql.setCallback(Sqls.callback.strList());
|
private Sql getMobileOrderPageSql(String userId, String orderState) {
|
||||||
|
boolean filterOrderState = StrUtil.isNotBlank(orderState) && !StrUtil.equals(orderState, "-1");
|
||||||
|
Sql sql = Sqls.create("select " +
|
||||||
|
"id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, cashPaid, " +
|
||||||
|
"orderState, orderCreateTime, createTime, orderType, extJson " +
|
||||||
|
"from (" +
|
||||||
|
"select id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, cashPaid, " +
|
||||||
|
"orderState, orderCreateTime, createdAt as createTime, 1 as orderType, extJson " +
|
||||||
|
"from points_mall_order_main " +
|
||||||
|
"where userId=@userId and orderId not in (" +
|
||||||
|
"select distinct mainOrderId from points_mall_order_sub where userId=@userId and delFlag=0 and mainOrderId is not null" +
|
||||||
|
") and delFlag=0 " +
|
||||||
|
"union all " +
|
||||||
|
"select id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, null as cashPaid, " +
|
||||||
|
"orderState, orderCreateTime, createdAt as createTime, 2 as orderType, extJson " +
|
||||||
|
"from points_mall_order_sub " +
|
||||||
|
"where userId=@userId and delFlag=0 and orderState != 8" +
|
||||||
|
") as mall_order " +
|
||||||
|
"where userId=@userId " +
|
||||||
|
(filterOrderState ? "and orderState=@orderState " : "") +
|
||||||
|
"order by createTime desc, orderType");
|
||||||
|
sql.params().set("userId", userId);
|
||||||
|
if (filterOrderState) {
|
||||||
|
sql.params().set("orderState", orderState);
|
||||||
|
}
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动端主单分页
|
||||||
|
*/
|
||||||
|
private Sql getMobileOrderMainPageSql(String userId, String orderState) {
|
||||||
|
boolean filterOrderState = StrUtil.isNotBlank(orderState) && !StrUtil.equals(orderState, "-1");
|
||||||
|
Sql sql = Sqls.create("select " +
|
||||||
|
"id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, cashPaid, " +
|
||||||
|
"orderState, orderCreateTime, createdAt as createTime, 1 as orderType, extJson " +
|
||||||
|
"from points_mall_order_main " +
|
||||||
|
"where userId=@userId and orderId not in (" +
|
||||||
|
"select distinct mainOrderId from points_mall_order_sub where userId=@userId and delFlag=0 and mainOrderId is not null" +
|
||||||
|
") " +
|
||||||
|
(filterOrderState ? "and orderState=@orderState " : "") +
|
||||||
|
"and delFlag=0 order by createTime desc, orderType asc");
|
||||||
|
sql.params().set("userId", userId);
|
||||||
|
if (filterOrderState) {
|
||||||
|
sql.params().set("orderState", orderState);
|
||||||
|
}
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动端子单分页(合并主单+子单)
|
||||||
|
*/
|
||||||
|
private Sql getMobileOrderSubPageSql(String userId, String orderState) {
|
||||||
|
boolean filterOrderState = StrUtil.isNotBlank(orderState) && !StrUtil.equals(orderState, "-1");
|
||||||
|
Sql sql = Sqls.create("select " +
|
||||||
|
"id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, " +
|
||||||
|
"orderState, orderCreateTime, createTime, orderType, extJson " +
|
||||||
|
"from (" +
|
||||||
|
"select id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, " +
|
||||||
|
"orderState, orderCreateTime, createdAt as createTime, 1 as orderType, extJson " +
|
||||||
|
"from points_mall_order_main " +
|
||||||
|
"where userId=@userId and orderId not in (" +
|
||||||
|
"select distinct mainOrderId from points_mall_order_sub where userId=@userId and delFlag=0 and mainOrderId is not null" +
|
||||||
|
") and delFlag=0 " +
|
||||||
|
"union all " +
|
||||||
|
"select id, orderId, orderNumberId, supplierId, userId, totalPrice, wPayOrAPay, pointsPrice, " +
|
||||||
|
"orderState, orderCreateTime, createdAt as createTime, 2 as orderType, extJson " +
|
||||||
|
"from points_mall_order_sub " +
|
||||||
|
"where userId=@userId and delFlag=0 and orderState != 8" +
|
||||||
|
") as mall_order " +
|
||||||
|
"where userId=@userId " +
|
||||||
|
(filterOrderState ? "and orderState=@orderState " : "") +
|
||||||
|
"order by createTime desc, orderType");
|
||||||
|
sql.params().set("userId", userId);
|
||||||
|
if (filterOrderState) {
|
||||||
|
sql.params().set("orderState", orderState);
|
||||||
|
}
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动端退换货单分页
|
||||||
|
*/
|
||||||
|
private Sql getMobileOrderExchangePageSql(String userId, String orderState) {
|
||||||
|
boolean filterOrderState = StrUtil.isNotBlank(orderState) && !StrUtil.equals(orderState, "-1");
|
||||||
|
Sql sql = Sqls.create("select " +
|
||||||
|
"moe.id as id, " +
|
||||||
|
"moe.orderId as orderId, " +
|
||||||
|
"null as orderNumberId, " +
|
||||||
|
"moe.supplierId as supplierId, " +
|
||||||
|
"moe.userId as userId, " +
|
||||||
|
"moe.totalPrice as totalPrice, " +
|
||||||
|
"moe.wPayOrAPay as wPayOrAPay, " +
|
||||||
|
"moe.pointsPrice as pointsPrice, " +
|
||||||
|
"moe.refund as refund, " +
|
||||||
|
"moe.orderState as orderState, " +
|
||||||
|
"moe.orderCreateTime as orderCreateTime, " +
|
||||||
|
"moe.createdAt as createTime, " +
|
||||||
|
"3 as orderType, " +
|
||||||
|
"moe.extJson as extJson, " +
|
||||||
|
"moe.orderMainId as mainOrderId, " +
|
||||||
|
"mos.pointsPrice as relPointsPrice " +
|
||||||
|
"from points_mall_order_exchange moe " +
|
||||||
|
"left join points_mall_order_sub mos on moe.orderMainId = mos.orderId " +
|
||||||
|
"where moe.userId=@userId " +
|
||||||
|
(filterOrderState ? "and moe.orderState=@orderState " : "") +
|
||||||
|
"and moe.delFlag=0 and moe.orderState != 8 order by moe.createdAt desc");
|
||||||
|
sql.params().set("userId", userId);
|
||||||
|
if (filterOrderState) {
|
||||||
|
sql.params().set("orderState", orderState);
|
||||||
|
}
|
||||||
|
return sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void fillProductInfo(PointsMallMobileOrderVO record) {
|
||||||
|
if (StrUtil.isBlank(record.getExtJson())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
JSONArray array = null;
|
||||||
|
try {
|
||||||
|
array = JSONUtil.parseArray(record.getExtJson());
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("订单类型:{},订单号:{},商品信息:{}", record.getOrderType(), record.getOrderId(), record.getExtJson());
|
||||||
|
}
|
||||||
|
if (array == null || array.isEmpty()) return;
|
||||||
|
int number = 0;
|
||||||
|
List<String> imgUrlList = new ArrayList<>();
|
||||||
|
for (int i = 0; i < array.size(); i++) {
|
||||||
|
JSONObject obj = array.getJSONObject(i);
|
||||||
|
Integer productNumber = obj.getInt("number");
|
||||||
|
number = number + (productNumber == null ? 0 : productNumber);
|
||||||
|
if (i < 3) {
|
||||||
|
String filePath = obj.getStr("filePath");
|
||||||
|
if (StrUtil.isNotEmpty(filePath)) {
|
||||||
|
imgUrlList.add(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
record.setProductNum(number);
|
||||||
|
record.setProductImgList(imgUrlList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新主订单状态,所有子单取消、退货或完成后,修改主单状态为已完成。
|
||||||
|
*/
|
||||||
|
private void updateMainOrderStatus(String mainOrderId, String supplierId) {
|
||||||
|
if (StrUtil.hasBlank(mainOrderId, supplierId)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int count = dao().count(PointsMallOrderSub.class, Cnd.where("mainOrderId", "=", mainOrderId)
|
||||||
|
.and("supplierId", "=", supplierId).and("delFlag", "=", false));
|
||||||
|
if (count == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 只有一个子单主订单随子单变化
|
||||||
|
if (count == 1) {
|
||||||
|
// 修改主订单状态为完成
|
||||||
|
dao().update(PointsMallOrderMain.class,
|
||||||
|
Chain.make("orderState", MallOrderStatusEnum.COMPLETED.getCode()).add("orderUpdateTime", new Date()),
|
||||||
|
Cnd.where("orderId", "=", mainOrderId).and("supplierId", "=", supplierId).and("delFlag", "=", false));
|
||||||
|
log.info("主订单只有一个子单,则更新主订单状态为已完成");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
log.info("查询所有子订单的状态是否都为已取消、退款或已完成收货");
|
||||||
|
List<Integer> finishedStatus = Arrays.asList(
|
||||||
|
MallOrderStatusEnum.CANCELLED.getCode(),
|
||||||
|
MallOrderStatusEnum.REFUNDED.getCode(),
|
||||||
|
MallOrderStatusEnum.COMPLETED.getCode()
|
||||||
|
);
|
||||||
|
int finishedCount = dao().count(PointsMallOrderSub.class, Cnd.where("mainOrderId", "=", mainOrderId)
|
||||||
|
.and("supplierId", "=", supplierId)
|
||||||
|
.and("orderState", "in", finishedStatus)
|
||||||
|
.and("delFlag", "=", false));
|
||||||
|
// 如果所有子订单都已取消、已退货或已完成收货,则更新主订单状态为已完成
|
||||||
|
if (count == finishedCount) {
|
||||||
|
// 修改主订单状态为完成
|
||||||
|
dao().update(PointsMallOrderMain.class,
|
||||||
|
Chain.make("orderState", MallOrderStatusEnum.COMPLETED.getCode()).add("orderUpdateTime", new Date()),
|
||||||
|
Cnd.where("orderId", "=", mainOrderId).and("supplierId", "=", supplierId).and("delFlag", "=", false));
|
||||||
|
log.info("所有子订单都已取消、已退货或已完成收货,则更新主订单状态为已完成");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Pagination<PointsMallMobileOrderVO> listMobileOrderPage(Integer pageNumber, int pageSize, Sql sql) {
|
||||||
|
pageNumber = getPageNumber(pageNumber);
|
||||||
|
pageSize = getPageSize(pageSize);
|
||||||
|
Pager pager = dao().createPager(pageNumber, pageSize);
|
||||||
|
pager.setRecordCount((int) Daos.queryCount(dao(), sql));
|
||||||
|
sql.setPager(pager);
|
||||||
|
sql.setEntity(dao().getEntity(PointsMallMobileOrderVO.class));
|
||||||
|
sql.setCallback(Sqls.callback.entities());
|
||||||
dao().execute(sql);
|
dao().execute(sql);
|
||||||
return sql.getList(String.class);
|
return new Pagination<>(pageNumber, pageSize, pager.getRecordCount(), sql.getList(PointsMallMobileOrderVO.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
private String appendOrderId(String url, String orderId) {
|
private String appendOrderId(String url, String orderId) {
|
||||||
@@ -236,10 +458,4 @@ public class PointsMallOrderServiceImpl extends BaseServiceImpl<PointsMallOrderM
|
|||||||
return url + (url.contains("?") ? "&" : "?") + "orderId=" + orderId;
|
return url + (url.contains("?") ? "&" : "?") + "orderId=" + orderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Record state(Integer code, String name) {
|
|
||||||
Record record = new Record();
|
|
||||||
record.put("code", code);
|
|
||||||
record.put("name", name);
|
|
||||||
return record;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,87 @@
|
|||||||
|
package com.budwk.app.zhgh.pointsmall.order.vo;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.nutz.dao.entity.annotation.Column;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移动端订单列表展示对象。
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class PointsMallMobileOrderVO {
|
||||||
|
|
||||||
|
@Column
|
||||||
|
private String id;
|
||||||
|
@Column
|
||||||
|
private String orderId;
|
||||||
|
@Column
|
||||||
|
private String orderNumberId;
|
||||||
|
@Column
|
||||||
|
private String mainOrderId;
|
||||||
|
@Column
|
||||||
|
private BigDecimal relPointsPrice;
|
||||||
|
@Column
|
||||||
|
private String supplierId;
|
||||||
|
@Column
|
||||||
|
private String supplierName;
|
||||||
|
@Column
|
||||||
|
private String userId;
|
||||||
|
@Column
|
||||||
|
private String aplName;
|
||||||
|
@Column
|
||||||
|
private Date orderCreateTime;
|
||||||
|
@Column
|
||||||
|
private Long createTime;
|
||||||
|
@Column
|
||||||
|
private Date orderUpdateTime;
|
||||||
|
@Column
|
||||||
|
private Date deliveryTime;
|
||||||
|
@Column
|
||||||
|
private Date orderFinishTime;
|
||||||
|
@Column
|
||||||
|
private Date orderCompleteTime;
|
||||||
|
@Column
|
||||||
|
private Integer deliveryStatus;
|
||||||
|
@Column
|
||||||
|
private BigDecimal freightCost;
|
||||||
|
@Column
|
||||||
|
private BigDecimal wPayOrAPayFreightCost;
|
||||||
|
@Column
|
||||||
|
private BigDecimal refund;
|
||||||
|
@Column
|
||||||
|
private BigDecimal wPayOrAPayRefund;
|
||||||
|
@Column
|
||||||
|
private String logisticsOrderId;
|
||||||
|
@Column
|
||||||
|
private String crrgBsnNm;
|
||||||
|
@Column
|
||||||
|
private Integer orderState;
|
||||||
|
@Column
|
||||||
|
private BigDecimal totalPrice;
|
||||||
|
@Column
|
||||||
|
private BigDecimal wPayOrAPay;
|
||||||
|
@Column
|
||||||
|
private BigDecimal pointsPrice;
|
||||||
|
@Column
|
||||||
|
private String invoiceCode;
|
||||||
|
@Column
|
||||||
|
private String extJson;
|
||||||
|
@Column
|
||||||
|
private Integer reconciliationStatus;
|
||||||
|
@Column
|
||||||
|
private Integer invoiceStatus;
|
||||||
|
@Column
|
||||||
|
private String supplierOrderUrl;
|
||||||
|
@Column
|
||||||
|
private String supplierReturnOrderUrl;
|
||||||
|
@Column
|
||||||
|
private Integer productNum;
|
||||||
|
@Column
|
||||||
|
private Integer orderType;
|
||||||
|
@Column
|
||||||
|
private Integer cashPaid;
|
||||||
|
private List<String> productImgList;
|
||||||
|
}
|
||||||
@@ -3,7 +3,7 @@ layout("/layouts/platform_h5.html"){
|
|||||||
#-->
|
#-->
|
||||||
<div id="app" v-cloak>
|
<div id="app" v-cloak>
|
||||||
<van-nav-bar title="我的订单" left-arrow left-text="返回" @click-left="back" fixed placeholder></van-nav-bar>
|
<van-nav-bar title="我的订单" left-arrow left-text="返回" @click-left="back" fixed placeholder></van-nav-bar>
|
||||||
<div class="order-page">
|
<div class="order-page order-list-page">
|
||||||
<section class="order-header">
|
<section class="order-header">
|
||||||
<div class="points-content">
|
<div class="points-content">
|
||||||
<div class="points-label">剩余积分</div>
|
<div class="points-label">剩余积分</div>
|
||||||
@@ -14,69 +14,125 @@ layout("/layouts/platform_h5.html"){
|
|||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<van-sticky>
|
<van-sticky :offset-top="0">
|
||||||
<div class="filter-bar">
|
<div class="filter-bar">
|
||||||
<van-tabs
|
<div class="grid-icon">
|
||||||
v-model="pageForm.orderState"
|
<van-icon name="apps-o" size="20" color="#1989fa"></van-icon>
|
||||||
class="custom-tabs"
|
</div>
|
||||||
line-width="20px"
|
<div class="custom-tab-wrap">
|
||||||
color="#1989fa"
|
<div class="tab-group tab-group--normal">
|
||||||
title-active-color="#1989fa"
|
<div
|
||||||
title-inactive-color="#666"
|
v-for="tab in normalTabList"
|
||||||
:border="false"
|
:key="tab.code"
|
||||||
@change="doSearch"
|
class="tab-item"
|
||||||
>
|
:class="{ 'tab-item--active': Number(pageForm.orderState) === Number(tab.code) }"
|
||||||
<van-tab v-for="tab in tabList" :key="tab.code" :name="tab.code" :title="tab.name"></van-tab>
|
@click="onTabClick(tab.code)"
|
||||||
</van-tabs>
|
>
|
||||||
|
{{ tab.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab-divider">|</div>
|
||||||
|
<div class="tab-group tab-group--special">
|
||||||
|
<div
|
||||||
|
v-for="tab in specialTabList"
|
||||||
|
:key="tab.code"
|
||||||
|
class="tab-item"
|
||||||
|
:class="{ 'tab-item--active': Number(pageForm.orderState) === Number(tab.code) }"
|
||||||
|
@click="onTabClick(tab.code)"
|
||||||
|
>
|
||||||
|
{{ tab.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</van-sticky>
|
</van-sticky>
|
||||||
|
|
||||||
<van-list v-if="tableData.length" class="list-container" v-model="tableLoading" :finished="tableFinished" finished-text="没有更多了" @load="pageData">
|
<van-pull-refresh v-model="refreshing" class="list-container" @refresh="onRefresh">
|
||||||
<article class="order-card" v-for="item in tableData" :key="item.id || item.orderId">
|
<van-list v-if="tableData.length" v-model="tableLoading" :finished="tableFinished" finished-text="没有更多了" @load="pageData">
|
||||||
<header class="card-header">
|
<article class="order-card" v-for="item in tableData" :key="item.id || item.orderId">
|
||||||
<div class="shop-info">
|
<header class="card-header">
|
||||||
<span class="shop-name">{{ item.supplierName || "积分商城" }}</span>
|
<div class="shop-info">
|
||||||
<van-icon name="arrow" color="#ccc" size="12"></van-icon>
|
<span class="shop-name">{{ item.supplierName || "积分商城" }}</span>
|
||||||
</div>
|
<van-icon name="arrow" color="#ccc" size="12"></van-icon>
|
||||||
<span class="status-text" :class="getStatusClass(item.orderState)">{{ orderStateName(item.orderState) }}</span>
|
<span class="order-type-name">{{ getOrderTypeName(item.orderType) }}</span>
|
||||||
</header>
|
</div>
|
||||||
|
<div class="status-box">
|
||||||
|
<span class="status-text" :class="'status-bg-' + getStatusClass(item.orderState)">{{ orderStateName(item.orderState) }}</span>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
<div class="product-row" v-if="item.productImgList && item.productImgList.length">
|
<div class="card-body" v-if="item.productImgList && item.productImgList.length">
|
||||||
<van-image v-for="(img, index) in item.productImgList.slice(0, 3)" :key="index" :src="img" fit="cover" radius="4"></van-image>
|
<div class="multi-prod-view" v-if="item.productImgList.length > 1">
|
||||||
</div>
|
<div class="imgs-scroll">
|
||||||
|
<div class="img-box" v-for="(img, index) in item.productImgList.slice(0, 3)" :key="index">
|
||||||
|
<van-image :src="img" fit="cover" radius="4"></van-image>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="single-prod-view" v-else>
|
||||||
|
<van-image :src="item.productImgList[0]" fit="cover" radius="4" class="p-img"></van-image>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="order-info">
|
<div class="order-info">
|
||||||
<div class="info-row">
|
<div class="info-row" v-if="item.cashPaid === 1">
|
||||||
<span>订单号:</span>
|
<span class="payment-warning">积分已支付,待“支付宝/微信/其他”支付</span>
|
||||||
<em>{{ item.orderId }}</em>
|
</div>
|
||||||
|
<div class="info-row" v-if="(Number(item.orderState) === 6 || Number(item.orderState) === 7) && item.orderMainId">
|
||||||
|
<span class="label">关联发货单号:</span>
|
||||||
|
<span class="value">{{ item.orderMainId }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row" v-if="Number(item.orderState) === 6 && item.relPointsPrice">
|
||||||
|
<span class="label">原发货单消耗积分:</span>
|
||||||
|
<span class="value points">{{ item.relPointsPrice }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row" v-if="item.wPayOrAPay">
|
||||||
|
<span class="label">支付宝/微信/其他:</span>
|
||||||
|
<span class="value points">{{ item.wPayOrAPay }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row" v-if="item.refund">
|
||||||
|
<span class="label">退回积分:</span>
|
||||||
|
<span class="value points">{{ item.refund }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row" v-if="item.orderNumberId">
|
||||||
|
<span class="label">订单编号:</span>
|
||||||
|
<span class="value">{{ item.orderNumberId }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row">
|
||||||
|
<span class="label">订单号:</span>
|
||||||
|
<span class="value">{{ item.orderId }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row">
|
||||||
|
<span class="label">消费积分:</span>
|
||||||
|
<span class="value points">{{ item.pointsPrice || 0 }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row" v-if="item.freightCost">
|
||||||
|
<span class="label">运费:</span>
|
||||||
|
<span class="value">¥ {{ item.freightCost }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="info-row">
|
||||||
|
<span class="label">创建时间:</span>
|
||||||
|
<span class="value">{{ item.orderCreateTime || "-" }}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="info-row">
|
|
||||||
<span>消费积分:</span>
|
|
||||||
<em class="points">{{ item.pointsPrice || 0 }}</em>
|
|
||||||
</div>
|
|
||||||
<div class="info-row" v-if="item.freightCost">
|
|
||||||
<span>运费:</span>
|
|
||||||
<em>¥ {{ item.freightCost }}</em>
|
|
||||||
</div>
|
|
||||||
<div class="info-row">
|
|
||||||
<span>创建时间:</span>
|
|
||||||
<em>{{ item.orderCreateTime || "-" }}</em>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<footer class="card-footer">
|
<footer class="card-footer">
|
||||||
<van-button v-if="Number(item.orderState) === 4" round size="small" color="#4CAF50" @click.stop="openSupplierOrder(item)">确认收货</van-button>
|
<div class="order-type"></div>
|
||||||
<van-button round size="small" color="#409EFF" @click.stop="openSupplierOrder(item)">查看订单</van-button>
|
<div class="action-bar">
|
||||||
</footer>
|
<van-button v-if="Number(item.orderState) === 4" round size="small" color="#4CAF50" @click.stop="userOrderReceive(item)">确认收货</van-button>
|
||||||
</article>
|
<van-button round size="small" color="#409EFF" @click.stop="openSupplierOrder(item)">查看订单</van-button>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</article>
|
||||||
|
|
||||||
</van-list>
|
</van-list>
|
||||||
<van-empty
|
<van-empty
|
||||||
v-else-if="!tableLoading"
|
v-else-if="!tableLoading"
|
||||||
class="empty-tip"
|
class="empty-tip"
|
||||||
image="/assets/platform/plugins/vant-green/images/nodata/nodata.png"
|
image="/assets/platform/plugins/vant-green/images/nodata/nodata.png"
|
||||||
description="暂无订单数据"
|
description="暂无订单数据"
|
||||||
></van-empty>
|
></van-empty>
|
||||||
|
</van-pull-refresh>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script nonce="${cspNonce!}">
|
<script nonce="${cspNonce!}">
|
||||||
@@ -86,9 +142,21 @@ layout("/layouts/platform_h5.html"){
|
|||||||
return {
|
return {
|
||||||
userPoints: 0,
|
userPoints: 0,
|
||||||
tableLoading: false,
|
tableLoading: false,
|
||||||
|
refreshing: false,
|
||||||
tableFinished: false,
|
tableFinished: false,
|
||||||
tableData: [],
|
tableData: [],
|
||||||
tabList: [],
|
normalTabList: [
|
||||||
|
{ code: -1, name: "全部", class: "gray" },
|
||||||
|
{ code: 0, name: "待付款", class: "orange" },
|
||||||
|
{ code: 2, name: "进行中", class: "blue" },
|
||||||
|
{ code: 3, name: "已取消", class: "gray" },
|
||||||
|
{ code: 4, name: "已妥投", class: "green" },
|
||||||
|
{ code: 5, name: "已完成", class: "gray" }
|
||||||
|
],
|
||||||
|
specialTabList: [
|
||||||
|
{ code: 6, name: "换货", class: "purple" },
|
||||||
|
{ code: 7, name: "退货", class: "red" }
|
||||||
|
],
|
||||||
pageForm: {
|
pageForm: {
|
||||||
pageNumber: 1,
|
pageNumber: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
@@ -99,10 +167,6 @@ layout("/layouts/platform_h5.html"){
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
back() { this.$pjaxReplace("/platform/h5/points-mall") },
|
back() { this.$pjaxReplace("/platform/h5/points-mall") },
|
||||||
async loadTabs() {
|
|
||||||
const resp = await this.$axios.post("/platform/h5/points-mall/order/stateList")
|
|
||||||
if (resp.code === 0) this.tabList = resp.data || []
|
|
||||||
},
|
|
||||||
async loadPoints() {
|
async loadPoints() {
|
||||||
const resp = await this.$axios.post("/platform/h5/points-mall/me/points")
|
const resp = await this.$axios.post("/platform/h5/points-mall/me/points")
|
||||||
if (resp.code === 0) this.userPoints = resp.data || 0
|
if (resp.code === 0) this.userPoints = resp.data || 0
|
||||||
@@ -113,6 +177,11 @@ layout("/layouts/platform_h5.html"){
|
|||||||
this.tableFinished = false
|
this.tableFinished = false
|
||||||
this.pageData()
|
this.pageData()
|
||||||
},
|
},
|
||||||
|
onTabClick(code) {
|
||||||
|
if (Number(this.pageForm.orderState) === Number(code)) return
|
||||||
|
this.pageForm.orderState = code
|
||||||
|
this.doSearch()
|
||||||
|
},
|
||||||
async pageData() {
|
async pageData() {
|
||||||
if (this.tableFinished) return
|
if (this.tableFinished) return
|
||||||
this.tableLoading = true
|
this.tableLoading = true
|
||||||
@@ -133,6 +202,17 @@ layout("/layouts/platform_h5.html"){
|
|||||||
this.pageForm.pageNumber++
|
this.pageForm.pageNumber++
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
async onRefresh() {
|
||||||
|
this.pageForm.pageNumber = 1
|
||||||
|
this.tableData = []
|
||||||
|
this.tableFinished = false
|
||||||
|
try {
|
||||||
|
await this.loadPoints()
|
||||||
|
await this.pageData()
|
||||||
|
} finally {
|
||||||
|
this.refreshing = false
|
||||||
|
}
|
||||||
|
},
|
||||||
async openSupplierOrder(item) {
|
async openSupplierOrder(item) {
|
||||||
const resp = await this.$axios.post("/platform/h5/points-mall/order/supplierOrderUrl", {
|
const resp = await this.$axios.post("/platform/h5/points-mall/order/supplierOrderUrl", {
|
||||||
supplierId: item.supplierId,
|
supplierId: item.supplierId,
|
||||||
@@ -143,67 +223,115 @@ layout("/layouts/platform_h5.html"){
|
|||||||
if (url) window.location.href = url
|
if (url) window.location.href = url
|
||||||
else this.$toast("暂无订单跳转地址")
|
else this.$toast("暂无订单跳转地址")
|
||||||
},
|
},
|
||||||
|
async userOrderReceive(item) {
|
||||||
|
try {
|
||||||
|
await this.$dialog.confirm({
|
||||||
|
title: "确认收货",
|
||||||
|
message: "您是否确认收货?",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
confirmButtonText: "确认"
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const resp = await this.$axios.post("/platform/h5/points-mall/order/userOrderReceive", {
|
||||||
|
emplid: item.userId,
|
||||||
|
supplierId: item.supplierId,
|
||||||
|
orderId: item.orderId,
|
||||||
|
orderType: item.orderType
|
||||||
|
})
|
||||||
|
if (resp.code !== 0) {
|
||||||
|
this.$toast(resp.msg || "确认收货失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
this.$toast.success("确认收货成功")
|
||||||
|
this.loadPoints()
|
||||||
|
this.doSearch()
|
||||||
|
},
|
||||||
orderStateName(value) {
|
orderStateName(value) {
|
||||||
const item = this.tabList.find((tab) => String(tab.code) === String(value))
|
const item = this.getOrderStatusItem(value)
|
||||||
if (item) return item.name
|
return item ? item.name : "未知状态"
|
||||||
const map = { 0: "待付款", 1: "已支付", 2: "进行中", 3: "已取消", 4: "已签收", 5: "已完成", 6: "换货", 7: "退货" }
|
|
||||||
return map[value] || "未知状态"
|
|
||||||
},
|
},
|
||||||
getStatusClass(status) {
|
getStatusClass(status) {
|
||||||
const value = Number(status)
|
const item = this.getOrderStatusItem(status)
|
||||||
if (value === 0) return "orange"
|
return item ? item.class : "gray"
|
||||||
if (value === 1 || value === 2) return "blue"
|
},
|
||||||
if (value === 4) return "green"
|
getOrderStatusItem(value) {
|
||||||
if (value === 6) return "purple"
|
const list = this.normalTabList.concat(this.specialTabList)
|
||||||
if (value === 7) return "red"
|
return list.find((tab) => Number(tab.code) === Number(value))
|
||||||
return "gray"
|
},
|
||||||
|
getOrderTypeName(orderType) {
|
||||||
|
const typeMap = { 1: "支付单", 2: "发货单" }
|
||||||
|
return typeMap[orderType] || ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.loadTabs()
|
|
||||||
this.loadPoints()
|
this.loadPoints()
|
||||||
this.pageData()
|
this.pageData()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
body { background: #fbfcff; }
|
body { height: 100%; overflow: hidden; background: #f7f8fa; }
|
||||||
.order-page { background: #fbfcff; }
|
html { height: 100%; overflow: hidden; }
|
||||||
.order-header { position: relative; height: 166px; overflow: hidden; background: url("/assets/mobile/img/mall/order/my-order.png") center / cover no-repeat; }
|
#app { height: 100%; overflow: hidden; }
|
||||||
.points-content { position: absolute; left: 24px; top: 50px; z-index: 2; }
|
.order-list-page { height: calc(100vh - 46px); padding-bottom: 0; overflow: hidden; background: #f7f8fa; }
|
||||||
.points-label { color: #111; font-size: 14px; line-height: 20px; }
|
.order-header { position: relative; height: 160px; overflow: hidden; background: url("/assets/mobile/img/mall/order/my-order.png") center / cover no-repeat; }
|
||||||
.points-value { display: flex; align-items: center; gap: 10px; margin-top: 10px; }
|
.points-content { position: absolute; left: 24px; top: 46px; z-index: 2; }
|
||||||
.points-value span { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; color: #fff; background: #ffbf00; font-size: 15px; font-weight: 700; box-shadow: 0 3px 8px rgba(255, 191, 0, .35); }
|
.points-label { margin-bottom: 8px; color: #111; font-size: 14px; line-height: 20px; }
|
||||||
.points-value strong { color: #000; font-size: 28px; line-height: 32px; font-weight: 800; }
|
.points-value { display: flex; align-items: center; color: #333; font-weight: 700; }
|
||||||
.filter-bar { display: flex; align-items: center; height: 46px; background: #fff; box-shadow: 0 2px 8px rgba(40, 50, 70, .03); }
|
.points-value span { display: inline-flex; align-items: center; justify-content: center; width: 24px; height: 24px; margin-right: 8px; border-radius: 50%; color: #fff; background: #ffc107; font-size: 14px; box-shadow: 0 2px 4px rgba(255, 193, 7, .4); }
|
||||||
.custom-tabs { flex: 1; min-width: 0; }
|
.points-value strong { color: #000; font-size: 28px; line-height: 32px; font-weight: 800; font-family: "DIN Alternate", Arial, sans-serif; }
|
||||||
.custom-tabs .van-tabs__wrap { height: 46px; }
|
.filter-bar { display: flex; align-items: center; height: 44px; background: #fff; box-shadow: 0 2px 6px rgba(0, 0, 0, .02); }
|
||||||
.custom-tabs .van-tab { flex: none; padding: 0 14px; color: #666; font-size: 14px; }
|
.grid-icon { flex: none; width: 40px; display: flex; align-items: center; justify-content: center; }
|
||||||
.custom-tabs .van-tab--active { color: #1989fa; font-weight: 500; }
|
.custom-tab-wrap { flex: 1; display: flex; align-items: center; height: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
|
||||||
.custom-tabs .van-tabs__line { bottom: 16px; height: 2px; background: #1989fa; }
|
.custom-tab-wrap::-webkit-scrollbar { display: none; }
|
||||||
.list-container { background: #fbfcff; }
|
.tab-group { flex: none; display: flex; align-items: center; height: 100%; }
|
||||||
.order-card { margin: 12px; padding: 16px; border-radius: 12px; background: #fff; box-shadow: 0 2px 8px rgba(0, 0, 0, .04); }
|
.tab-group--normal { background: #eef5ff; }
|
||||||
.card-header { display: flex; align-items: center; justify-content: space-between; padding-bottom: 12px; border-bottom: 1px solid #f5f5f5; }
|
.tab-group--special { background: #fff4ec; }
|
||||||
|
.tab-divider { flex: none; display: flex; align-items: center; align-self: stretch; padding: 0 2px; color: #d0d0d0; background: #fff; font-size: 16px; line-height: 44px; }
|
||||||
|
.tab-item { position: relative; display: flex; align-items: center; height: 100%; padding: 0 12px; color: #666; font-size: 13px; white-space: nowrap; }
|
||||||
|
.tab-item:active { opacity: .7; }
|
||||||
|
.tab-group--normal .tab-item--active { color: #1989fa; font-weight: 700; }
|
||||||
|
.tab-group--special .tab-item--active { color: #e65100; font-weight: 700; }
|
||||||
|
.tab-item--active:after { position: absolute; bottom: 0; left: 50%; width: 20px; height: 2px; border-radius: 2px; content: ""; transform: translateX(-50%); }
|
||||||
|
.tab-group--normal .tab-item--active:after { background: #1989fa; }
|
||||||
|
.tab-group--special .tab-item--active:after { background: #e65100; }
|
||||||
|
.list-container { height: calc(100vh - 46px - 160px - 44px); padding: 12px; overflow-y: auto; background: #f7f8fa; -webkit-overflow-scrolling: touch; box-sizing: border-box; }
|
||||||
|
.order-card { margin-bottom: 12px; padding: 16px; border-radius: 12px; background: #fff; box-shadow: 0 2px 8px rgba(0, 0, 0, .04); }
|
||||||
|
.card-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; padding-bottom: 12px; border-bottom: 1px solid #f5f5f5; }
|
||||||
.shop-info { display: flex; align-items: center; min-width: 0; }
|
.shop-info { display: flex; align-items: center; min-width: 0; }
|
||||||
.shop-name { overflow: hidden; color: #333; font-size: 15px; font-weight: 700; white-space: nowrap; text-overflow: ellipsis; }
|
.shop-name { overflow: hidden; margin-right: 4px; color: #333; font-size: 15px; font-weight: 700; white-space: nowrap; text-overflow: ellipsis; }
|
||||||
.status-text { flex: none; margin-left: 10px; font-size: 13px; font-weight: 500; }
|
.order-type-name { flex: none; margin-left: 4px; color: #666; font-size: 12px; }
|
||||||
.status-text.orange { color: #ff8a00; }
|
.status-box { flex: none; display: flex; align-items: center; margin-left: 10px; font-size: 13px; font-weight: 500; }
|
||||||
.status-text.blue { color: #1989fa; }
|
.status-text { display: inline-flex; align-items: center; justify-content: center; min-width: 52px; height: 24px; padding: 0 8px; border-radius: 10px; font-size: 12px; line-height: 24px; box-sizing: border-box; }
|
||||||
.status-text.green { color: #23b65d; }
|
.status-bg-gray { color: #999; background: #f5f5f5; }
|
||||||
.status-text.purple { color: #7b61ee; }
|
.status-bg-green { color: #2e7d32; background: #e8f5e9; }
|
||||||
.status-text.red { color: #e64a3b; }
|
.status-bg-blue { color: #1565c0; background: #e3f2fd; }
|
||||||
.status-text.gray { color: #999; }
|
.status-bg-orange { color: #e65100; background: #fff8e1; }
|
||||||
.product-row { display: flex; gap: 8px; padding: 12px 0; }
|
.status-bg-purple { color: #6a1b9a; background: #ede7f6; }
|
||||||
.product-row .van-image { width: 70px; height: 70px; background: #f3f4f6; }
|
.status-bg-red { color: #c62828; background: #fce4ec; }
|
||||||
|
.card-body { margin-bottom: 12px; }
|
||||||
|
.multi-prod-view { display: flex; align-items: center; }
|
||||||
|
.imgs-scroll { flex: 1; display: flex; overflow: hidden; }
|
||||||
|
.img-box { flex: none; width: 70px; height: 70px; margin-right: 8px; background: #f3f4f6; border-radius: 4px; overflow: hidden; }
|
||||||
|
.single-prod-view { display: flex; }
|
||||||
|
.p-img { flex: none; width: 70px; height: 70px; margin-right: 12px; background: #f3f4f6; }
|
||||||
|
.card-body .van-image { width: 70px; height: 70px; display: block; }
|
||||||
.order-info { padding: 12px; margin-bottom: 12px; border-radius: 8px; background: #fafafa; }
|
.order-info { padding: 12px; margin-bottom: 12px; border-radius: 8px; background: #fafafa; }
|
||||||
.info-row { display: flex; justify-content: space-between; gap: 12px; margin-bottom: 8px; font-size: 13px; line-height: 18px; }
|
.info-row { display: flex; justify-content: space-between; gap: 12px; margin-bottom: 8px; font-size: 13px; line-height: 18px; }
|
||||||
.info-row:last-child { margin-bottom: 0; }
|
.info-row:last-child { margin-bottom: 0; }
|
||||||
.info-row span { flex: none; color: #999; }
|
.info-row span:first-child { flex: none; color: #999; }
|
||||||
|
.info-row .label { flex: none; color: #999; }
|
||||||
|
.info-row .value { min-width: 0; color: #333; text-align: right; word-break: break-all; }
|
||||||
.info-row em { min-width: 0; color: #333; font-style: normal; text-align: right; word-break: break-all; }
|
.info-row em { min-width: 0; color: #333; font-style: normal; text-align: right; word-break: break-all; }
|
||||||
.info-row .points { color: #c62828; font-weight: 700; }
|
.info-row .points { color: #c62828; font-weight: 700; }
|
||||||
.card-footer { display: flex; justify-content: flex-end; gap: 10px; }
|
.card-footer { display: flex; align-items: center; justify-content: space-between; }
|
||||||
|
.order-type { flex: 1; min-width: 0; }
|
||||||
|
.action-bar { display: flex; justify-content: flex-end; gap: 10px; }
|
||||||
.card-footer .van-button { min-width: 86px; height: 32px; padding: 0 16px; font-size: 13px; }
|
.card-footer .van-button { min-width: 86px; height: 32px; padding: 0 16px; font-size: 13px; }
|
||||||
.empty-tip { padding-top: 36px; }
|
.empty-tip { padding-top: 36px; }
|
||||||
|
.info-row .payment-warning { color: #e64a3b; font-size: 14px; }
|
||||||
</style>
|
</style>
|
||||||
<!--#
|
<!--#
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user