shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
package com.ishop.merchant.service;
 
import com.ishop.merchant.OrderConstants;
import com.ishop.model.po.EbMerchantOrder;
import com.ishop.model.po.EbOrder;
import com.ishop.model.po.EbOrderDetail;
import com.ishop.model.po.EbOrderInvoice;
import com.ishop.model.po.EbOrderInvoiceDetail;
import com.walker.db.page.GenericPager;
import com.walker.infrastructure.time.TimeRange;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.jdbc.service.BaseServiceImpl;
import org.springframework.stereotype.Service;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Service
public class OrderServiceImpl extends BaseServiceImpl {
 
    private static final String SQL_PAGE_USER_LIST = "select * from eb_order where uid=:uid";
    private static final String SQL_PAGE_PLATFORM_ORDER = "select id,mer_id,order_no,uid,pay_price,pay_type,paid,status" +
            ",refund_status,is_user_del,is_merchant_del,cancel_status,level,type,create_time from eb_order where 1=1";
 
    /**
     * 发货(express)数据库更新。
     * @param orderInvoice
     * @param orderInvoiceDetailList
     * @param orderDetailUpdateList
     * @param updateOrder
     * @date 2023-08-21
     */
    public void execSendExpress(EbOrderInvoice orderInvoice
            , List<EbOrderInvoiceDetail> orderInvoiceDetailList, List<EbOrderDetail> orderDetailUpdateList, EbOrder updateOrder){
        // 1:写入发货单
        // 2:写入发货单明细
        // 3:更新订单明细表中,邮递数量(delivery_num)字段
        // 4:更新商户订单快递方式为(express),暂时无需设置,默认就是
        // 5:更新平台订单为:已发货
        this.insert(orderInvoice);
        this.insert(orderInvoiceDetailList);
        this.update(orderDetailUpdateList);
        this.update(updateOrder);
    }
 
    /**
     * 分页查询平台订单
     * @param merId 商户ID,可选
     * @param orderNo 订单编号,可选
     * @param type 订单类型,可选
     * @param timeRange 时间范围,可选
     * @param status 订单状态,可选
     * @return
     * @date 2023-07-20
     */
    public GenericPager<EbOrder> queryPagePlatformOrderList(Integer merId, String orderNo, Integer type, TimeRange timeRange, String status){
        Map<String, Object> param = new HashMap<>(4);
        StringBuilder sql = new StringBuilder(SQL_PAGE_PLATFORM_ORDER);
        if(merId != null && merId > 0){
            sql.append(" and mer_id=:merId");
            param.put("merId", merId);
        }
        if(StringUtils.isNotEmpty(orderNo)){
            sql.append(" and order_no=:orderNo");
            param.put("orderNo", orderNo);
        }
        if(type != null && type >= 0){
            sql.append(" and type=:type");
            param.put("type", type);
        }
        if(timeRange != null){
            if(timeRange.getStartTime() != null){
                sql.append(" and create_time >= :startTime");
                param.put("startTime", timeRange.getStartTime());
            }
            if(timeRange.getEndTime() != null){
                sql.append(" and create_time <= :endTime");
                param.put("endTime", timeRange.getEndTime());
            }
        }
        if(StringUtils.isNotEmpty(status)){
            this.setupStatusCondition(sql, status);
        }
        sql.append(" order by id desc");
        return this.selectSplit(sql.toString(), param, new EbOrder());
    }
 
    private void setupStatusCondition(StringBuilder sql, String status){
        //未支付
        if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_UNPAID)){
            sql.append(" and paid=0");
            sql.append(" and status=").append(OrderConstants.ORDER_STATUS_WAIT_PAY);
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_NOT_SHIPPED)){
            // 未发货
            sql.append(" and (status=").append(OrderConstants.ORDER_STATUS_WAIT_SHIPPING)
                    .append(" or status=").append(OrderConstants.ORDER_STATUS_PART_SHIPPING).append(")");
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status<>").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_SPIKE)){
            //待收货
            sql.append(" and status=").append(OrderConstants.ORDER_STATUS_WAIT_RECEIPT);
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status<>").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_RECEIVING)){
            //已收货
            sql.append(" and status=").append(OrderConstants.ORDER_STATUS_TAKE_DELIVERY);
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status<>").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_COMPLETE)){
            //交易完成
            sql.append(" and status=").append(OrderConstants.ORDER_STATUS_COMPLETE);
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status<>").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_AWAIT_VERIFICATION)){
            //待核销
            sql.append(" and status=").append(OrderConstants.ORDER_STATUS_AWAIT_VERIFICATION);
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status<>").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_REFUNDED)){
            //已退款
            sql.append(" and paid=1");
            sql.append(" and cancel_status=").append(OrderConstants.ORDER_CANCEL_STATUS_NORMAL);
            sql.append(" and refund_status=").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
            sql.append(" and is_user_del=0");
 
        } else if(status.equals(OrderConstants.MERCHANT_ORDER_STATUS_DELETED)){
            sql.append(" and is_user_del=1");
        }
    }
 
    /**
     * 根据主订单编号,返回一个商户订单信息。
     * <p>原:(支付完成进行商户拆单后可用)</p>
     * @param orderNo
     * @return
     * @date 2023-07-20
     */
    public EbMerchantOrder queryMerchantOrderOne(String orderNo){
        List<EbMerchantOrder> list = this.select("select * from eb_merchant_order where order_no=? limit 1", new Object[]{orderNo}, new EbMerchantOrder());
        if(StringUtils.isEmptyList(list)){
            return null;
        }
        return list.get(0);
    }
 
    /**
     * 根据平台订单编号,查询商户订单列表,商户订单(可能多商品)对应一个平台订单。
     * @param orderNo
     * @return
     * @date 2023-07-13
     */
    public List<EbMerchantOrder> queryMerchantOrderList(String orderNo){
        EbMerchantOrder param = new EbMerchantOrder();
        param.setOrderNo(orderNo);
        return this.select(param);
    }
 
    /**
     * 根据订单编号,返回订单信息。
     * @param orderNo
     * @return
     * @date 2023-07-12
     */
    public EbOrder queryOrder(String orderNo){
        EbOrder order = new EbOrder();
        order.setOrderNo(orderNo);
        List<EbOrder> list = this.select(order);
        if(StringUtils.isEmptyList(list)){
            return null;
        }
        return list.get(0);
    }
 
    /**
     * 平台订单,如果用订单编号(不用主键),还要配合商户ID才能确定一条记录。
     * @param orderNo
     * @param merId
     * @return
     * @date 2023-08-18
     */
    public EbOrder queryPlatformOrder(String orderNo, int merId){
        EbOrder order = new EbOrder();
        order.setOrderNo(orderNo);
        order.setMerId(merId);
        List<EbOrder> list = this.select(order);
        if(StringUtils.isEmptyList(list)){
            return null;
        }
        return list.get(0);
    }
 
    public List<EbOrderDetail> queryOrderDetailList(String orderNo){
        EbOrderDetail detail = new EbOrderDetail();
        detail.setOrderNo(orderNo);
        return this.select(detail);
    }
 
    /**
     * 根据平台订单ID,查询对应商品ID集合。
     * @param orderNo
     * @return
     * @date 2023-09-09
     */
    public List<Long> queryOrderProductIds(String orderNo){
        List<Map<String, Object>> list = this.select(SQL_ORDER_PRODUCT_ID, new Object[]{orderNo});
        if(StringUtils.isEmptyList(list)){
            return null;
        }
        List<Long> data = new ArrayList<>(2);
        for(Map<String, Object> map : list){
            data.add(Long.parseLong(map.get("product_id").toString()));
        }
        return data;
    }
 
    private static final String SQL_ORDER_PRODUCT_ID = "select product_id from eb_order_detail where order_no=?";
 
    /**
     * 订单发货获取订单详情列表
     * @param orderNo
     * @return
     * @date 2023-08-21
     */
    public List<EbOrderDetail> queryShipmentList(String orderNo){
        return this.select(SQL_SHIP_ORDER_DETAIL, new Object[]{orderNo}, new EbOrderDetail());
    }
 
    private static final String SQL_SHIP_ORDER_DETAIL = "select id,product_name,image,sku,pay_num,delivery_num,refund_num from eb_order_detail where order_no=?";
 
    /**
     * 分页返回用户订单列表
     * @param userId
     * @param status 订单状态(-1:全部,0:待支付,1:待发货,2:部分发货, 3:待核销,4:待收货,5:已收货,6:已完成,9:已取消)
     * @return
     * @date 2023-07-07
     */
    public GenericPager<EbOrder> queryUserOrderList(long userId, Integer status){
        StringBuilder sql = new StringBuilder(SQL_PAGE_USER_LIST);
        Map<String, Object> param = new HashMap<>(8);
        param.put("uid", userId);
 
        if(status != null && status.intValue() >= 0){
            if(status.intValue() == 1){
                sql.append(" and (status=").append(OrderConstants.ORDER_STATUS_WAIT_SHIPPING);
                sql.append(" or status=").append(OrderConstants.ORDER_STATUS_PART_SHIPPING).append(")");
            } else {
                sql.append(" and status=:status");
                param.put("status", status);
            }
        }
        // 退款状态
        sql.append(" and refund_status<").append(OrderConstants.ORDER_REFUND_STATUS_REFUND);
        sql.append(" and is_user_del=0");
        sql.append(" and is_merchant_del=0");
        sql.append(" and (type=").append(OrderConstants.ORDER_TYPE_NORMAL)
                .append(" or type=").append(OrderConstants.ORDER_TYPE_SECKILL).append(")");
        sql.append(" and is_del=0");
        sql.append(" order by id desc");
        return this.selectSplit(sql.toString(), param, new EbOrder());
    }
}