xin
2025-07-11 138e3641fbe49a114a399323aa145774f310627e
订单信息优化
16 files modified
304 ■■■■ changed files
oying-system/src/main/java/com/oying/modules/sh/domain/Order.java 33 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/OrderAddressSnapshot.java 15 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/OrderProductSnapshot.java 25 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderAddressSnapshotQueryCriteria.java 4 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderQueryCriteria.java 6 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/request/SubmitOrder.java 10 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java 2 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java 12 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderAddressSnapshotServiceImpl.java 2 ●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java 38 ●●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/domain/Merchant.java 1 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/system/service/impl/MerchantServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
oying-system/src/main/resources/config/application-dev.yml 2 ●●● patch | view | raw | blame | history
oying-system/src/main/resources/config/application-prod.yml 2 ●●● patch | view | raw | blame | history
oying-system/src/main/resources/mapper/sh/OrderAddressSnapshotMapper.xml 9 ●●●●● patch | view | raw | blame | history
oying-system/src/main/resources/mapper/sh/OrderMapper.xml 141 ●●●● patch | view | raw | blame | history
oying-system/src/main/java/com/oying/modules/sh/domain/Order.java
@@ -1,5 +1,6 @@
package com.oying.modules.sh.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.oying.base.BaseEntity;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,9 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
import java.util.Set;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -28,6 +32,10 @@
    @ApiModelProperty(value = "主键")
    private Long orderId;
    @TableField(exist = false)
    @ApiModelProperty(value = "用户角色")
    private Set<OrderProductSnapshot> productSnapshots;
    @NotBlank
    @ApiModelProperty(value = "订单号")
    private String orderNum;
@@ -39,6 +47,13 @@
    @NotBlank
    @ApiModelProperty(value = "订单状态描述")
    private String orderStatusDescribe;
    @ApiModelProperty(value = "订单状态描述")
    private String orderRemark;
    @NotBlank
    @ApiModelProperty(value = "预计送达时间")
    private String orderTime;
    @NotNull
    @ApiModelProperty(value = "用户id")
@@ -116,6 +131,24 @@
    @ApiModelProperty(value = "签名")
    private String paySign;
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Order user = (Order) o;
        return Objects.equals(orderId, user.orderId) &&
                Objects.equals(orderNum, user.orderNum);
    }
    @Override
    public int hashCode() {
        return Objects.hash(orderId, username);
    }
    public void copy(Order source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }
oying-system/src/main/java/com/oying/modules/sh/domain/OrderAddressSnapshot.java
@@ -1,6 +1,5 @@
package com.oying.modules.sh.domain;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
@@ -8,16 +7,20 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
/**
* @description /
* @author lixin
* @date 2025-06-11
**/
@Data
@Getter
@Setter
@TableName("sh_order_address_snapshot")
public class OrderAddressSnapshot implements Serializable {
@@ -26,8 +29,8 @@
    private Long snapshotId;
    @NotNull
    @ApiModelProperty(value = "订单ID")
    private Long orderId;
    @ApiModelProperty(value = "订单号")
    private String orderNum;
    @NotBlank
    @ApiModelProperty(value = "收货人姓名")
@@ -49,6 +52,10 @@
    @ApiModelProperty(value = "街道")
    private String street;
    @ApiModelProperty(value = "短地址")
    @NotBlank
    private String shortAddress;
    @NotBlank
    @ApiModelProperty(value = "详细地址")
    private String detail;
oying-system/src/main/java/com/oying/modules/sh/domain/OrderProductSnapshot.java
@@ -1,6 +1,5 @@
package com.oying.modules.sh.domain;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
@@ -8,16 +7,21 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Objects;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter;
import lombok.Setter;
/**
* @description /
* @author lixin
* @date 2025-06-11
**/
@Data
@Getter
@Setter
@TableName("sh_order_product_snapshot")
public class OrderProductSnapshot implements Serializable {
@@ -86,6 +90,23 @@
    @ApiModelProperty(value = "状态")
    private String payState;
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        OrderProductSnapshot snapshot = (OrderProductSnapshot) o;
        return Objects.equals(snapshotId, snapshot.snapshotId);
    }
    @Override
    public int hashCode() {
        return Objects.hash(snapshotId);
    }
    public void copy(OrderProductSnapshot source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }
oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderAddressSnapshotQueryCriteria.java
@@ -16,6 +16,6 @@
    @ApiModelProperty(value = "每页数据量", example = "10")
    private Integer size = 10;
    @ApiModelProperty(value = "订单ID")
    private Long orderId;
    @ApiModelProperty(value = "订单号")
    private String orderNum;
}
oying-system/src/main/java/com/oying/modules/sh/domain/dto/OrderQueryCriteria.java
@@ -18,6 +18,9 @@
    @ApiModelProperty(value = "每页数据量", example = "10")
    private Integer size = 10;
    @ApiModelProperty(value = "商品模糊查询")
    private String blurry;
    @ApiModelProperty(value = "订单状态")
    private Integer orderStatus;
@@ -43,4 +46,7 @@
    private String payType;
    private List<String> payTime;
    private List<Timestamp> createTime;
    @ApiModelProperty(value = "偏移量", hidden = true)
    private long offset;
}
oying-system/src/main/java/com/oying/modules/sh/domain/request/SubmitOrder.java
@@ -5,7 +5,8 @@
import lombok.Getter;
import lombok.Setter;
import java.sql.Timestamp;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
@@ -17,16 +18,21 @@
@Setter
public class SubmitOrder {
    @NotNull(message = "地址不能为空")
    @ApiModelProperty(value = "地址ID")
    private Long addressId;
    @NotBlank(message = "送达时间不能为空")
    @ApiModelProperty(value = "送达时间")
    private Timestamp dateTime;
    private String dateTime;
    @NotNull(message = "门店不能为空")
    @ApiModelProperty(value = "门店ID")
    private Long storeId;
    @NotNull(message = "商品不能为空")
    @ApiModelProperty(value = "商品&数量")
    private List<ProductOrder> products;
    @ApiModelProperty(value = "备注")
    private String remark;
    @NotBlank(message = "支付类型不能为空")
    @ApiModelProperty(value = "支付类型")
    private PayTypeEnum payType;
oying-system/src/main/java/com/oying/modules/sh/mapper/OrderMapper.java
@@ -21,6 +21,8 @@
    List<Order> findAll(@Param("criteria") OrderQueryCriteria criteria);
    Long countAll(@Param("criteria") OrderQueryCriteria criteria);
    Order getByOrderNum(String orderNum);
    void updatePayStatus(String orderNum, String payState, String payMessage, String payTime);
oying-system/src/main/java/com/oying/modules/sh/rest/OrderController.java
@@ -1,7 +1,6 @@
package com.oying.modules.sh.rest;
import com.oying.annotation.Log;
import com.oying.exception.BadRequestException;
import com.oying.modules.sh.domain.request.GeneratorOrder;
import com.oying.modules.sh.domain.request.SubmitOrder;
import com.oying.modules.sh.service.OrderService;
@@ -48,17 +47,6 @@
    @ApiOperation("查询订单信息")
    @PreAuthorize("@el.check('order:list')")
    public ResponseEntity<Object> queryOrder(OrderQueryCriteria criteria) {
        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
        return new ResponseEntity<>(R.success(orderService.queryAll(criteria, page)), HttpStatus.OK);
    }
    @GetMapping("app")
    @ApiOperation("APP:查询订单信息")
    @PreAuthorize("@el.check('order:list')")
    public ResponseEntity<Object> appQueryOrder(OrderQueryCriteria criteria) {
        if (criteria.getStoreId() == null) {
            throw new BadRequestException("请选择门店");
        }
        Page<Object> page = new Page<>(criteria.getPage(), criteria.getSize());
        return new ResponseEntity<>(R.success(orderService.queryAll(criteria, page)), HttpStatus.OK);
    }
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderAddressSnapshotServiceImpl.java
@@ -70,7 +70,7 @@
        List<Map<String, Object>> list = new ArrayList<>();
        for (OrderAddressSnapshot orderAddressSnapshot : all) {
            Map<String, Object> map = new LinkedHashMap<>();
            map.put("订单ID", orderAddressSnapshot.getOrderId());
            map.put("订单号", orderAddressSnapshot.getOrderNum());
            map.put("收货人姓名", orderAddressSnapshot.getReceiverName());
            map.put("收货人电话", orderAddressSnapshot.getReceiverPhone());
            map.put("省份", orderAddressSnapshot.getProvince());
oying-system/src/main/java/com/oying/modules/sh/service/impl/OrderServiceImpl.java
@@ -10,12 +10,15 @@
import com.oying.modules.pc.store.domain.Store;
import com.oying.modules.pc.store.service.StoreService;
import com.oying.modules.sh.domain.Order;
import com.oying.modules.sh.domain.OrderAddressSnapshot;
import com.oying.modules.sh.domain.OrderProductSnapshot;
import com.oying.modules.sh.domain.UserAddress;
import com.oying.modules.sh.domain.request.GeneratorOrder;
import com.oying.modules.sh.domain.request.ProductOrder;
import com.oying.modules.sh.domain.request.SubmitOrder;
import com.oying.modules.sh.domain.vo.OrderInfo;
import com.oying.modules.sh.domain.vo.ProductInfo;
import com.oying.modules.sh.service.OrderAddressSnapshotService;
import com.oying.modules.sh.service.OrderProductSnapshotService;
import com.oying.modules.sh.service.UserAddressService;
import com.oying.utils.*;
@@ -53,13 +56,17 @@
    private final ProductService productService;
    private final SwiftPassService swiftPassService;
    private final OrderProductSnapshotService productSnapshotService;
    private final OrderAddressSnapshotService addressSnapshotService;
    private final RedisUtils redisUtils;
    private final StoreService storeService;
    private final static String DESCRIBE = "哦应:";
    @Override
    public PageResult<Order> queryAll(OrderQueryCriteria criteria, Page<Object> page) {
        return PageUtil.toPage(orderMapper.findAll(criteria, page));
        criteria.setOffset(page.offset());
        List<Order> list = orderMapper.findAll(criteria);
        Long total = orderMapper.countAll(criteria);
        return PageUtil.toPage(list, total);
    }
    @Override
@@ -70,7 +77,11 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized Order submitOrder(SubmitOrder submit, HttpServletRequest request) {
        if (!submit.getPayType().equals(PayTypeEnum.HWC)) {
        switch (submit.getPayType()) {
            case HWC:
            case HWC2:
                break;
            default:
            throw new BadRequestException("支付类型暂未开放");
        }
        String orderNum = redisUtils.generateOrderSn(GenerateEnum.ORDER.getKey());
@@ -82,7 +93,6 @@
        OrderInfo info = generatorOrder(generator);
        // 商品快照
        List<OrderProductSnapshot> snapshots = new ArrayList<>();
        for (ProductInfo productInfo : info.getProducts()) {
            Product product = productInfo.getProduct();
            OrderProductSnapshot snapshot = new OrderProductSnapshot();
@@ -117,6 +127,8 @@
        order.setOrderNum(orderNum);
        order.setOrderStatus(OrderStatusEnum.ZERO.getKey());
        order.setOrderStatusDescribe(OrderStatusEnum.ZERO.getValue());
        order.setOrderRemark(submit.getRemark() != null ? submit.getRemark() : "");
        order.setOrderTime(submit.getDateTime());
        order.setUserId(SecurityUtils.getCurrentUserId());
        order.setUsername(SecurityUtils.getCurrentUsername());
        Store store = storeService.getById(submit.getStoreId());
@@ -150,11 +162,31 @@
            order.setPayMessage(PayStateEnum.SUCCESS.getValue());
            order.setPayTime(DateUtil.localDateTimeFormat(now.toLocalDateTime(), DateUtil.SDF_YMDHMS));
        }
        UserAddress address = userAddressService.getById(submit.getAddressId());
        OrderAddressSnapshot snapshot = getOrderAddressSnapshot(orderNum, address);
        addressSnapshotService.save(snapshot);
        orderMapper.insert(order);
        productSnapshotService.saveBatch(snapshots);
        return order;
    }
    private static OrderAddressSnapshot getOrderAddressSnapshot(String orderNum, UserAddress address) {
        OrderAddressSnapshot snapshot = new OrderAddressSnapshot();
        snapshot.setOrderNum(orderNum);
        snapshot.setReceiverName(address.getReceiverName());
        snapshot.setReceiverPhone(address.getReceiverPhone());
        snapshot.setProvince(address.getProvince() != null ? address.getProvince() : "");
        snapshot.setCity(address.getCity() != null ? address.getCity() : "");
        snapshot.setDistrict(address.getDistrict() != null ? address.getDistrict() : "");
        snapshot.setStreet(address.getStreet() != null ? address.getStreet() : "");
        snapshot.setShortAddress(address.getShortAddress());
        snapshot.setDetail(address.getDetail());
        snapshot.setLongitude(address.getLongitude());
        snapshot.setLatitude(address.getLatitude());
        snapshot.setTag(address.getTag());
        return snapshot;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public synchronized OrderInfo generatorOrder(GeneratorOrder criteria) {
oying-system/src/main/java/com/oying/modules/system/domain/Merchant.java
@@ -34,7 +34,6 @@
    @ApiModelProperty(value = "名称")
    private String merchantName;
    @NotBlank
    @ApiModelProperty(value = "商户编码")
    private String merchantCode;
oying-system/src/main/java/com/oying/modules/system/service/impl/MerchantServiceImpl.java
@@ -1,5 +1,6 @@
package com.oying.modules.system.service.impl;
import cn.hutool.core.util.IdUtil;
import com.oying.modules.system.domain.Merchant;
import com.oying.modules.system.domain.UserMerchant;
import com.oying.modules.system.mapper.MerchantMapper;
@@ -47,6 +48,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void create(Merchant resources) {
        resources.setMerchantCode(IdUtil.getSnowflakeNextIdStr());
        merchantMapper.insert(resources);
        UserMerchant userMerchant = new UserMerchant();
        userMerchant.setMerchantId(resources.getMerchantId());
oying-system/src/main/resources/config/application-dev.yml
@@ -173,7 +173,7 @@
  # 支付通知地址
  notify-url: http://1.95.124.88:8088/api/swiftPass/alipayCallback
  # 退款通知地址
  refund-url: https://1.95.124.88:8088/api/swiftPass/returnNotify
  refund-url: http://1.95.124.88:8088/api/swiftPass/returnNotify
obs:
  access_key_id: RZ1UIOZDZ58DD4NWPD6Q
oying-system/src/main/resources/config/application-prod.yml
@@ -184,7 +184,7 @@
  # 支付通知地址
  notify-url: http://1.95.124.88:8088/api/swiftPass/alipayCallback
  # 退款通知地址
  refund-url: https://1.95.124.88:8088/api/swiftPass/returnNotify
  refund-url: http://1.95.124.88:8088/api/swiftPass/returnNotify
obs:
  access_key_id: RZ1UIOZDZ58DD4NWPD6Q
oying-system/src/main/resources/mapper/sh/OrderAddressSnapshotMapper.xml
@@ -3,13 +3,14 @@
<mapper namespace="com.oying.modules.sh.mapper.OrderAddressSnapshotMapper">
    <resultMap id="BaseResultMap" type="com.oying.modules.sh.domain.OrderAddressSnapshot">
        <id column="snapshot_id" property="snapshotId"/>
        <result column="order_id" property="orderId"/>
        <result column="order_num" property="orderNum"/>
        <result column="receiver_name" property="receiverName"/>
        <result column="receiver_phone" property="receiverPhone"/>
        <result column="province" property="province"/>
        <result column="city" property="city"/>
        <result column="district" property="district"/>
        <result column="street" property="street"/>
        <result column="short_address" property="shortAddress"/>
        <result column="detail" property="detail"/>
        <result column="longitude" property="longitude"/>
        <result column="latitude" property="latitude"/>
@@ -17,7 +18,7 @@
    </resultMap>
    <sql id="Base_Column_List">
        snapshot_id, order_id, receiver_name, receiver_phone, province, city, district, street, detail, longitude, latitude, tag
        snapshot_id, order_num, receiver_name, receiver_phone, province, city, district, street, short_address, detail, longitude, latitude, tag
    </sql>
    <select id="findAll" resultMap="BaseResultMap">
@@ -25,8 +26,8 @@
        <include refid="Base_Column_List"/>
        from sh_order_address_snapshot
        <where>
            <if test="criteria.orderId != null">
                and order_id = #{criteria.orderId}
            <if test="criteria.orderNum != null">
                and order_num = #{criteria.orderNum}
            </if>
        </where>
        order by snapshot_id desc
oying-system/src/main/resources/mapper/sh/OrderMapper.xml
@@ -6,6 +6,8 @@
        <result column="order_num" property="orderNum"/>
        <result column="order_status" property="orderStatus"/>
        <result column="order_status_describe" property="orderStatusDescribe"/>
        <result column="order_remark" property="orderRemark"/>
        <result column="order_time" property="orderTime"/>
        <result column="user_id" property="userId"/>
        <result column="username" property="username"/>
        <result column="store_id" property="storeId"/>
@@ -31,63 +33,166 @@
        <result column="create_time" property="createTime"/>
        <result column="update_by" property="updateBy"/>
        <result column="update_time" property="updateTime"/>
        <collection property="productSnapshots" ofType="com.oying.modules.sh.domain.OrderProductSnapshot">
            <id column="snapshot_id" property="snapshotId"/>
            <result column="product_id" property="productId"/>
            <result column="product_code" property="productCode"/>
            <result column="product_barcode" property="productBarcode"/>
            <result column="product_name" property="productName"/>
            <result column="product_title" property="productTitle"/>
            <result column="product_main_image" property="productMainImage"/>
            <result column="product_description" property="productDescription"/>
            <result column="param_data" property="paramData"/>
            <result column="unit_price" property="unitPrice"/>
            <result column="detail_count" property="detailCount"/>
            <result column="original_price" property="originalPrice"/>
            <result column="paid_price" property="paidPrice"/>
            <result column="actually_pay_price" property="actuallyPayPrice"/>
            <result column="pay_state" property="payState"/>
        </collection>
    </resultMap>
    <sql id="Base_Column_List">
        order_id, order_num, order_status, order_status_describe, user_id, username, store_id, store_name, store_logo, order_describe, original_price, paid_price, actually_pay_price, pay_state, pay_message, pay_type, pay_time, expire_time, openid, app_id, timestamp, nonce_str, package_val, sign_type, pay_sign, create_by, create_time, update_by, update_time
        o.order_id, o.order_num, o.order_status, o.order_status_describe, o.order_remark, o.order_time, o.user_id, o.username, o.store_id,
        o.store_name, o.store_logo, o.order_describe, o.original_price, o.paid_price, o.actually_pay_price, o.pay_state, o.pay_message,
        o.pay_type, o.pay_time, o.expire_time, o.openid, o.app_id, o.timestamp, o.nonce_str, o.package_val, o.sign_type, o.pay_sign,
        o.create_by, o.create_time, o.update_by, o.update_time
    </sql>
    <sql id="product_Column_List">
        p.snapshot_id, p.product_id, p.product_code, p.product_barcode, p.product_name, p.product_title,
        p.product_main_image, p.product_description, p.param_data, p.unit_price, p.detail_count, p.original_price, p.paid_price,
        p.actually_pay_price, p.pay_state
    </sql>
    <update id="updatePayStatus">
        update sh_order set pay_state = #{payState}, pay_message = #{payMessage},
                            pay_time = #{payTime} where order_num = #{orderNum}
        update sh_order
        set pay_state   = #{payState},
            pay_message = #{payMessage},
            pay_time    = #{payTime}
        where order_num = #{orderNum}
    </update>
    <update id="updateCloseStatus">
        update sh_order set pay_state = #{payState} where order_num = #{orderNum}
        update sh_order
        set pay_state = #{payState}
        where order_num = #{orderNum}
    </update>
    <select id="findAll" resultMap="BaseResultMap">
        select o.*,
        <include refid="product_Column_List"/>
        from (
        select
        <include refid="Base_Column_List"/>
        from sh_order
        from sh_order as o
        <where>
            <if test="criteria.orderNum != null and criteria.orderNum != ''">
                and order_num like concat('%',#{criteria.orderNum},'%')
                and o.order_num like concat('%',#{criteria.orderNum},'%')
            </if>
            <if test="criteria.orderStatus != null and criteria.orderStatus != ''">
                and order_status = #{criteria.orderStatus}
                and o.order_status = #{criteria.orderStatus}
            </if>
            <if test="criteria.userId != null and criteria.userId != ''">
                and user_id = #{criteria.userId}
                and o.user_id = #{criteria.userId}
            </if>
            <if test="criteria.username != null and criteria.username != ''">
                and username like concat('%',#{criteria.username},'%')
                and o.username like concat('%',#{criteria.username},'%')
            </if>
            <if test="criteria.storeId != null and criteria.storeId != ''">
                and store_id = #{criteria.storeId}
                and o.store_id = #{criteria.storeId}
            </if>
            <if test="criteria.orderDescribe != null and criteria.orderDescribe != ''">
                and order_describe like concat('%',#{criteria.orderDescribe},'%')
                and o.order_describe like concat('%',#{criteria.orderDescribe},'%')
            </if>
            <if test="criteria.payState != null and criteria.payState != ''">
                and pay_state = #{criteria.payState}
                and o.pay_state = #{criteria.payState}
            </if>
            <if test="criteria.payType != null and criteria.payType != ''">
                and pay_type = #{criteria.payType}
                and o.pay_type = #{criteria.payType}
            </if>
            <if test="criteria.payTime != null and criteria.payTime.size() > 0">
                AND pay_time BETWEEN #{criteria.payTime[0]} AND #{criteria.payTime[1]}
                AND o.pay_time BETWEEN #{criteria.payTime[0]} AND #{criteria.payTime[1]}
            </if>
            <if test="criteria.createTime != null and criteria.createTime.size() > 0">
                AND create_time BETWEEN #{criteria.createTime[0]} AND #{criteria.createTime[1]}
                AND o.create_time BETWEEN #{criteria.createTime[0]} AND #{criteria.createTime[1]}
            </if>
        </where>
        order by order_id desc
        order by o.order_id desc
        <if test="criteria.offset != null">
            limit #{criteria.offset}, #{criteria.size}
        </if>
        ) o
        left join sh_order_product_snapshot as p on p.order_num = o.order_num
        where 1=1
        <if test="criteria.blurry != null and criteria.blurry != ''">
            and (o.product_code like concat('%',#{criteria.blurry},'%')
            or o.product_barcode like concat('%',#{criteria.blurry},'%')
            or o.product_name like concat('%',#{criteria.blurry},'%')
            or o.product_title like concat('%',#{criteria.blurry},'%')
            or o.product_description like concat('%',#{criteria.blurry},'%'))
        </if>
        order by o.order_id desc
    </select>
    <select id="getByOrderNum" resultMap="BaseResultMap">
        select
        <include refid="Base_Column_List"/>
        from sh_order
        where order_num = #{orderNum}
        from sh_order as o
        where o.order_num = #{orderNum}
    </select>
    <select id="countAll" resultType="java.lang.Long">
        select count(1)
        from ( select distinct o.*,
        p.product_code,
        p.product_barcode,
        p.product_name,
        p.product_title,
        p.product_description
        from (
        select
        <include refid="Base_Column_List"/>
        from sh_order as o
        <where>
            <if test="criteria.orderNum != null and criteria.orderNum != ''">
                and o.order_num like concat('%',#{criteria.orderNum},'%')
            </if>
            <if test="criteria.orderStatus != null and criteria.orderStatus != ''">
                and o.order_status = #{criteria.orderStatus}
            </if>
            <if test="criteria.userId != null and criteria.userId != ''">
                and o.user_id = #{criteria.userId}
            </if>
            <if test="criteria.username != null and criteria.username != ''">
                and o.username like concat('%',#{criteria.username},'%')
            </if>
            <if test="criteria.storeId != null and criteria.storeId != ''">
                and o.store_id = #{criteria.storeId}
            </if>
            <if test="criteria.orderDescribe != null and criteria.orderDescribe != ''">
                and o.order_describe like concat('%',#{criteria.orderDescribe},'%')
            </if>
            <if test="criteria.payState != null and criteria.payState != ''">
                and o.pay_state = #{criteria.payState}
            </if>
            <if test="criteria.payType != null and criteria.payType != ''">
                and o.pay_type = #{criteria.payType}
            </if>
            <if test="criteria.payTime != null and criteria.payTime.size() > 0">
                AND o.pay_time BETWEEN #{criteria.payTime[0]} AND #{criteria.payTime[1]}
            </if>
            <if test="criteria.createTime != null and criteria.createTime.size() > 0">
                AND o.create_time BETWEEN #{criteria.createTime[0]} AND #{criteria.createTime[1]}
            </if>
        </where>
        ) o
        left join sh_order_product_snapshot as p on p.order_num = o.order_num
        where 1=1
        <if test="criteria.blurry != null and criteria.blurry != ''">
            and (p.product_code like concat('%',#{criteria.blurry},'%')
            or p.product_barcode like concat('%',#{criteria.blurry},'%')
            or p.product_name like concat('%',#{criteria.blurry},'%')
            or p.product_title like concat('%',#{criteria.blurry},'%')
            or p.product_description like concat('%',#{criteria.blurry},'%'))
        </if>) t
    </select>
</mapper>