顺丰同城嵌入逻辑开发

This commit is contained in:
Jack 2024-12-02 00:20:47 +08:00
parent a820c7bbdf
commit cb18871f40
14 changed files with 528 additions and 135 deletions

View File

@ -506,4 +506,15 @@ public class StateCode {
public static final int PRINTER_TEMP_CATE_ORDER = 1;
// 打票机模版分类1-下单打印模版2-退货打印模版
public static final int PRINTER_TEMP_CATE_REFUND = 2;
// 顺丰同城订单状态1-订单创建;2-订单取消;10-配送员接单/配送员改派;12-配送员到店;15配送员配送中已取货;17-配送员妥投完单;22-配送员撤单;31-取消中;91-骑士上报异常;
public static final int SF_ORDER_STATUS_CREATED = 1;
public static final int SF_ORDER_STATUS_CANCELED = 2;
public static final int SF_ORDER_STATUS_RECEIVING = 10;
public static final int SF_ORDER_STATUS_ARRIVED = 12;
public static final int SF_ORDER_STATUS_RECEIVED = 15;
public static final int SF_ORDER_STATUS_FINISH = 17;
public static final int SF_ORDER_STATUS_WITHDRAW = 22;
public static final int SF_ORDER_STATUS_EXCEPTION = 91;
public static final int SF_ORDER_STATUS_CANCELING = 31;
}

View File

@ -0,0 +1,27 @@
/*
* Copyright (c) 2024. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
* Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
* Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
* Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
* Vestibulum commodo. Ut rhoncus gravida arcu.
*/
package com.suisung.mall.common.pojo.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
/**
* 标准的地址实体类
*/
public class StandardAddressDTO implements Serializable {
private String fullAddress; // 详细地址
private String longitude; //经度
private String latitude; // 维度
}

View File

@ -1,12 +1,13 @@
package com.suisung.mall.common.utils;
import cn.hutool.core.util.ObjectUtil;
import com.suisung.mall.common.api.StateCode;
import com.suisung.mall.common.exception.ApiException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
@ -148,4 +149,73 @@ public class CommonUtil {
return d.setScale(0, BigDecimal.ROUND_HALF_UP);
}
public static String getOrderStateNote(int order_state_pre_id, int order_state_id) {
String rtn = "";
String access = "";
Map state_code_arr = new HashMap();
state_code_arr.put(StateCode.ORDER_STATE_CANCEL, -1); // 取消订单
state_code_arr.put(StateCode.ORDER_PROCESS_SUBMIT, 0); // 提交订单
state_code_arr.put(StateCode.ORDER_PROCESS_PAY, 1); // 订单支付
state_code_arr.put(StateCode.ORDER_PROCESS_CHECK, 2); // 订单审核
state_code_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, 3); // 财务审核
state_code_arr.put(StateCode.ORDER_PROCESS_OUT, 4); // 订单出库
state_code_arr.put(StateCode.ORDER_PROCESS_SHIPPED, 5); // 订单发货
state_code_arr.put(StateCode.ORDER_PROCESS_RECEIVED, 6); // 确认收货
state_code_arr.put(StateCode.ORDER_STATE_RECEIVED, 7); // 已签收
state_code_arr.put(StateCode.ORDER_STATE_FINISH, 8); // 已完成
Set keySet = state_code_arr.keySet();
if (!keySet.contains(order_state_id)) {
throw new ApiException(I18nUtil._("订单状态ID错误"));
}
Map state_msg_arr = new HashMap();
state_msg_arr.put(StateCode.ORDER_PROCESS_SUBMIT, I18nUtil._("提交订单"));
state_msg_arr.put(StateCode.ORDER_PROCESS_PAY, I18nUtil._("支付"));
state_msg_arr.put(StateCode.ORDER_PROCESS_CHECK, I18nUtil._("订单审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, I18nUtil._("财务审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_OUT, I18nUtil._("出库审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_SHIPPED, I18nUtil._("确认发货"));
state_msg_arr.put(StateCode.ORDER_PROCESS_RECEIVED, I18nUtil._("确认收货"));
state_msg_arr.put(StateCode.ORDER_STATE_RECEIVED, I18nUtil._("签收"));
state_msg_arr.put(StateCode.ORDER_STATE_FINISH, I18nUtil._("完成"));
state_msg_arr.put(StateCode.ORDER_STATE_CANCEL, I18nUtil._("取消"));
state_msg_arr.put(StateCode.ORDER_PROCESS_FINISH, I18nUtil._("完成"));
if (CheckUtil.isEmpty(order_state_pre_id) && ObjectUtil.equal(order_state_id, StateCode.ORDER_PROCESS_SUBMIT)) {
rtn = I18nUtil._("已提交订单");
} else if (ObjectUtil.equal(order_state_id, StateCode.ORDER_STATE_CANCEL)) {
rtn = I18nUtil._("已提交取消");
} else {
Integer state1 = (Integer) state_code_arr.get(order_state_id);
Integer state2 = (Integer) state_code_arr.get(order_state_pre_id);
if (state1 > state2) {
access = I18nUtil._("");
} else {
access = I18nUtil._("");
rtn = I18nUtil._("退回重审");
}
switch (order_state_pre_id) {
case StateCode.ORDER_PROCESS_CHECK:
case StateCode.ORDER_PROCESS_FINANCE_REVIEW:
case StateCode.ORDER_PROCESS_OUT:
rtn = I18nUtil._("订单") + access + I18nUtil._("通过") + state_msg_arr.get(order_state_pre_id);
break;
case StateCode.ORDER_PROCESS_PAY:
case StateCode.ORDER_PROCESS_SHIPPED:
case StateCode.ORDER_PROCESS_RECEIVED:
case StateCode.ORDER_PROCESS_FINISH:
rtn = I18nUtil._("订单") + access + state_msg_arr.get(order_state_pre_id) + rtn;
break;
}
}
return rtn;
}
}

View File

@ -8,6 +8,7 @@ import com.suisung.mall.common.modules.order.ShopOrderInfo;
import com.suisung.mall.shop.message.service.MqMessageService;
import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.ShopOrderInfoService;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.service.ShopStorePrinterService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
@ -16,8 +17,10 @@ import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
@ -36,6 +39,8 @@ public class OrderPayedListener {
private ShopStorePrinterService shopStorePrinterService;
@Autowired
private MqMessageService mqMessageService;
@Resource
private SFExpressApiService sfExpressApiService;
@RabbitHandler
public void listener(String data, Channel channel, Message message) throws IOException, InterruptedException {
@ -87,6 +92,18 @@ public class OrderPayedListener {
shopStorePrinterService.printShopStoreOrder(orderId);
// 发送顺丰同城快递
Pair<Boolean, String> pairCreateSfOrder = sfExpressApiService.innerCreateSfExpressOrder(orderId, orderPickupNum);
if(pairCreateSfOrder==null){
logger.error("顺丰同城下单失败pairCreateSfOrder 返回空值");
return;
}
if(!pairCreateSfOrder.getFirst()){
logger.error("顺丰同城下单失败:{}",pairCreateSfOrder.getSecond());
return;
}
logger.info("顺丰同城下单成功");
}
}

View File

@ -528,5 +528,5 @@ public interface ShopOrderBaseService extends IBaseService<ShopOrderBase> {
* @param orderPickupNum
* @return
*/
SFCreateOrderReq buildSFOrderData(Integer devId,String orderId,String orderPickupNum);
SFCreateOrderReq buildSFOrderData(Integer devId,String orderId, Long orderPickupNum);
}

View File

@ -1,7 +1,10 @@
package com.suisung.mall.shop.order.service;
import com.suisung.mall.common.modules.order.ShopOrderDeliveryAddress;
import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.pojo.dto.StandardAddressDTO;
import com.suisung.mall.core.web.service.IBaseService;
import org.springframework.data.util.Pair;
/**
* <p>
@ -18,4 +21,11 @@ public interface ShopOrderDeliveryAddressService extends IBaseService<ShopOrderD
* @return
*/
ShopOrderDeliveryAddress selectByOrderId(String orderId);
/**
* 检测地址是否有效返回规范全地址
* @param shopOrderDeliveryAddress
* @return
*/
Pair<Boolean, StandardAddressDTO> checkAddress(ShopOrderDeliveryAddress shopOrderDeliveryAddress);
}

View File

@ -31,4 +31,15 @@ public interface ShopOrderInfoService extends IBaseService<ShopOrderInfo> {
*/
Long genTodayPickupNum(Integer storeId);
/**
* 更改商家订单的状态出库状态发货状态并写入订单状态更改日志
* @param orderId
* @param orderStatus 约定0值不更改
* @param orderIsOutStatus 出库状态约定0值不更改
* @param orderIsShippedStatus 发货状态约定0值不更改
* @return
*/
Boolean changeOrderStatus(String orderId, Integer orderStatus,Integer orderIsOutStatus,Integer orderIsShippedStatus);
}

View File

@ -54,9 +54,8 @@ import com.suisung.mall.common.modules.product.ShopProductItem;
import com.suisung.mall.common.modules.product.ShopProductValidPeriod;
import com.suisung.mall.common.modules.store.*;
import com.suisung.mall.common.modules.user.*;
import com.suisung.mall.common.pojo.req.SFCreateOrderReq;
import com.suisung.mall.common.pojo.req.SFOrderReceiveReq;
import com.suisung.mall.common.pojo.req.SFOrderShopReq;
import com.suisung.mall.common.pojo.dto.StandardAddressDTO;
import com.suisung.mall.common.pojo.req.*;
import com.suisung.mall.common.pojo.to.MsgTO;
import com.suisung.mall.common.pojo.to.PayMoneyTO;
import com.suisung.mall.common.pojo.to.PayPointTO;
@ -101,6 +100,7 @@ import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Service;
import org.springframework.transaction.TransactionDefinition;
@ -113,6 +113,7 @@ import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@ -349,7 +350,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
@Resource
private ShopOrderDeliveryAddressService shopOrderDeliveryAddressService;
private Logger logger = LoggerFactory.getLogger(ShopOrderBaseServiceImpl.class);
private final Logger logger = LoggerFactory.getLogger(ShopOrderBaseServiceImpl.class);
@Override
@ -452,9 +453,9 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
order_info.put("fin_num", fin_num);
long fin_num_entity = getFinishedNum(user_id, null, null, StateCode.PRODUCT_KIND_ENTITY);
long edu_fin_num = getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Arrays.asList(StateCode.ORDER_STATE_FINISH));
long edu_fin_num = getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Collections.singletonList(StateCode.ORDER_STATE_FINISH));
order_info.put("edu_fin_num", edu_fin_num);
order_info.put("edu_cancel_num", getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Arrays.asList(StateCode.ORDER_STATE_CANCEL)));
order_info.put("edu_cancel_num", getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Collections.singletonList(StateCode.ORDER_STATE_CANCEL)));
order_info.put("fin_num_entity", fin_num_entity);
order_info.put("fin_num_v", fin_num - fin_num_entity - edu_fin_num);
@ -488,7 +489,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
order_info.put("wait_pay_num", wait_pay_num);
long wait_pay_num_entity = getWaitPayNum(user_id, null, null, StateCode.PRODUCT_KIND_ENTITY);
order_info.put("wait_pay_num_entity", wait_pay_num_entity);
long edu_wait_num = getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Arrays.asList(StateCode.ORDER_STATE_WAIT_PAY));
long edu_wait_num = getOrderNumByState(user_id, null, null, StateCode.PRODUCT_KIND_EDU, Collections.singletonList(StateCode.ORDER_STATE_WAIT_PAY));
order_info.put("edu_wait_num", edu_wait_num);
order_info.put("wait_pay_num_v", wait_pay_num - wait_pay_num_entity - edu_wait_num);
@ -2149,80 +2150,80 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
log.setOrder_state_type(shopBaseStateCodeService.getText(order_state_id, null));
log.setUser_id(user_id);
log.setUser_nickname(user_nickname);
log.setOrder_state_note(getOrderStateNote(order_state_pre_id, order_state_id));
log.setOrder_state_note(CommonUtil.getOrderStateNote(order_state_pre_id, order_state_id));
log.setOrder_state_time(new Date());
}
return shopOrderStateLogService.saveOrUpdate(logs);
}
private String getOrderStateNote(int order_state_pre_id, int order_state_id) {
String rtn = "";
String access = "";
Map state_code_arr = new HashMap();
state_code_arr.put(StateCode.ORDER_STATE_CANCEL, -1); // 取消订单
state_code_arr.put(StateCode.ORDER_PROCESS_SUBMIT, 0); // 提交订单
state_code_arr.put(StateCode.ORDER_PROCESS_PAY, 1); // 订单支付
state_code_arr.put(StateCode.ORDER_PROCESS_CHECK, 2); // 订单审核
state_code_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, 3); // 财务审核
state_code_arr.put(StateCode.ORDER_PROCESS_OUT, 4); // 订单出库
state_code_arr.put(StateCode.ORDER_PROCESS_SHIPPED, 5); // 订单发货
state_code_arr.put(StateCode.ORDER_PROCESS_RECEIVED, 6); // 确认收货
state_code_arr.put(StateCode.ORDER_STATE_RECEIVED, 7); // 已签收
state_code_arr.put(StateCode.ORDER_STATE_FINISH, 8); // 已完成
Set keySet = state_code_arr.keySet();
if (!keySet.contains(order_state_id)) {
throw new ApiException(I18nUtil._("订单状态ID错误"));
}
Map state_msg_arr = new HashMap();
state_msg_arr.put(StateCode.ORDER_PROCESS_SUBMIT, I18nUtil._("提交订单"));
state_msg_arr.put(StateCode.ORDER_PROCESS_PAY, I18nUtil._("支付"));
state_msg_arr.put(StateCode.ORDER_PROCESS_CHECK, I18nUtil._("订单审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, I18nUtil._("财务审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_OUT, I18nUtil._("出库审核"));
state_msg_arr.put(StateCode.ORDER_PROCESS_SHIPPED, I18nUtil._("确认发货"));
state_msg_arr.put(StateCode.ORDER_PROCESS_RECEIVED, I18nUtil._("确认收货"));
state_msg_arr.put(StateCode.ORDER_STATE_RECEIVED, I18nUtil._("签收"));
state_msg_arr.put(StateCode.ORDER_STATE_FINISH, I18nUtil._("完成"));
state_msg_arr.put(StateCode.ORDER_STATE_CANCEL, I18nUtil._("取消"));
state_msg_arr.put(StateCode.ORDER_PROCESS_FINISH, I18nUtil._("完成"));
if (CheckUtil.isEmpty(order_state_pre_id) && ObjectUtil.equal(order_state_id, StateCode.ORDER_PROCESS_SUBMIT)) {
rtn = I18nUtil._("已提交订单");
} else if (ObjectUtil.equal(order_state_id, StateCode.ORDER_STATE_CANCEL)) {
rtn = I18nUtil._("已提交取消");
} else {
Integer state1 = (Integer) state_code_arr.get(order_state_id);
Integer state2 = (Integer) state_code_arr.get(order_state_pre_id);
if (state1 > state2) {
access = I18nUtil._("");
} else {
access = I18nUtil._("");
rtn = I18nUtil._("退回重审");
}
switch (order_state_pre_id) {
case StateCode.ORDER_PROCESS_CHECK:
case StateCode.ORDER_PROCESS_FINANCE_REVIEW:
case StateCode.ORDER_PROCESS_OUT:
rtn = I18nUtil._("订单") + access + I18nUtil._("通过") + state_msg_arr.get(order_state_pre_id);
break;
case StateCode.ORDER_PROCESS_PAY:
case StateCode.ORDER_PROCESS_SHIPPED:
case StateCode.ORDER_PROCESS_RECEIVED:
case StateCode.ORDER_PROCESS_FINISH:
rtn = I18nUtil._("订单") + access + state_msg_arr.get(order_state_pre_id) + rtn;
break;
}
}
return rtn;
}
// private String getOrderStateNote(int order_state_pre_id, int order_state_id) {
//
// String rtn = "";
// String access = "";
//
// Map state_code_arr = new HashMap();
// state_code_arr.put(StateCode.ORDER_STATE_CANCEL, -1); // 取消订单
// state_code_arr.put(StateCode.ORDER_PROCESS_SUBMIT, 0); // 提交订单
// state_code_arr.put(StateCode.ORDER_PROCESS_PAY, 1); // 订单支付
// state_code_arr.put(StateCode.ORDER_PROCESS_CHECK, 2); // 订单审核
// state_code_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, 3); // 财务审核
// state_code_arr.put(StateCode.ORDER_PROCESS_OUT, 4); // 订单出库
// state_code_arr.put(StateCode.ORDER_PROCESS_SHIPPED, 5); // 订单发货
// state_code_arr.put(StateCode.ORDER_PROCESS_RECEIVED, 6); // 确认收货
// state_code_arr.put(StateCode.ORDER_STATE_RECEIVED, 7); // 已签收
// state_code_arr.put(StateCode.ORDER_STATE_FINISH, 8); // 已完成
//
// Set keySet = state_code_arr.keySet();
// if (!keySet.contains(order_state_id)) {
// throw new ApiException(I18nUtil._("订单状态ID错误"));
// }
//
// Map state_msg_arr = new HashMap();
// state_msg_arr.put(StateCode.ORDER_PROCESS_SUBMIT, I18nUtil._("提交订单"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_PAY, I18nUtil._("支付"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_CHECK, I18nUtil._("订单审核"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_FINANCE_REVIEW, I18nUtil._("财务审核"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_OUT, I18nUtil._("出库审核"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_SHIPPED, I18nUtil._("确认发货"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_RECEIVED, I18nUtil._("确认收货"));
// state_msg_arr.put(StateCode.ORDER_STATE_RECEIVED, I18nUtil._("签收"));
// state_msg_arr.put(StateCode.ORDER_STATE_FINISH, I18nUtil._("完成"));
// state_msg_arr.put(StateCode.ORDER_STATE_CANCEL, I18nUtil._("取消"));
// state_msg_arr.put(StateCode.ORDER_PROCESS_FINISH, I18nUtil._("完成"));
//
//
// if (CheckUtil.isEmpty(order_state_pre_id) && ObjectUtil.equal(order_state_id, StateCode.ORDER_PROCESS_SUBMIT)) {
// rtn = I18nUtil._("已提交订单");
// } else if (ObjectUtil.equal(order_state_id, StateCode.ORDER_STATE_CANCEL)) {
// rtn = I18nUtil._("已提交取消");
// } else {
// Integer state1 = (Integer) state_code_arr.get(order_state_id);
// Integer state2 = (Integer) state_code_arr.get(order_state_pre_id);
// if (state1 > state2) {
// access = I18nUtil._("");
// } else {
// access = I18nUtil._("");
// rtn = I18nUtil._("退回重审");
// }
//
// switch (order_state_pre_id) {
// case StateCode.ORDER_PROCESS_CHECK:
// case StateCode.ORDER_PROCESS_FINANCE_REVIEW:
// case StateCode.ORDER_PROCESS_OUT:
// rtn = I18nUtil._("订单") + access + I18nUtil._("通过") + state_msg_arr.get(order_state_pre_id);
// break;
// case StateCode.ORDER_PROCESS_PAY:
// case StateCode.ORDER_PROCESS_SHIPPED:
// case StateCode.ORDER_PROCESS_RECEIVED:
// case StateCode.ORDER_PROCESS_FINISH:
// rtn = I18nUtil._("订单") + access + state_msg_arr.get(order_state_pre_id) + rtn;
// break;
// }
// }
//
// return rtn;
// }
/**
* 1.修改订单为下一个待处理状态,并几率当前状态处理时间
@ -2505,7 +2506,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Map tmp_stock_bill_id = new HashMap();
tmp_stock_bill_id.put(src_order_id, bill.getStock_bill_id());
if (!doReviewPicking(Arrays.asList(src_order_id), null, filter_order_items, tmp_stock_bill_id)) {
if (!doReviewPicking(Collections.singletonList(src_order_id), null, filter_order_items, tmp_stock_bill_id)) {
throw new ApiException(ResultCode.FAILED);
}
}
@ -2944,7 +2945,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
BigDecimal points_consume_max = Convert.toBigDecimal(accountBaseConfigService.getConfig("points_consume_max"), BigDecimal.ZERO);
BigDecimal round_points = NumberUtil.round(NumberUtil.mul(points_consume_rate, order_payment_amount_for_points), 2);
BigDecimal min = NumberUtil.min(round_points, points_consume_max);
order_points_add = min.setScale(0, BigDecimal.ROUND_DOWN);
order_points_add = min.setScale(0, RoundingMode.DOWN);
}
if (CheckUtil.isNotEmpty(order_points_add)) {
@ -3000,7 +3001,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
// todo 教育购买课程记录不放在这
Long product_id = item.getProduct_id();
if (!eduService.saveUserCourseStock(user_id, product_id)) {
logger.error("保存购买课程记录失败product_id{}",product_id);
logger.error("保存购买课程记录失败product_id{}", product_id);
throw new ApiException(String.format(I18nUtil._("保存购买课程记录失败product_id【%s】"), product_id));
}
}
@ -3138,7 +3139,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (ObjectUtil.equal(1002, order_item_inventory_lock) && CheckUtil.isEmpty(item_src_id)) {
Long item_id = order_item_row.getItem_id();
if (shopProductItemService.lockSkuStock(item_id, order_item_row.getOrder_item_quantity()) <= 0) {
logger.error("更改: {} 冻结库存失败!",item_id);
logger.error("更改: {} 冻结库存失败!", item_id);
throw new ApiException(String.format(I18nUtil._("更改: %s 冻结库存失败!"), item_id));
}
}
@ -3204,7 +3205,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
ShopOrderInvoice invoice = orderInvoiceService.findOne(invoiceQueryWrapper);
if (invoice != null) {
if (!orderInvoiceService.edit(shopOrderInvoice, invoiceQueryWrapper)) {
logger.error("更改: {} 发票失败!",order_ids);
logger.error("更改: {} 发票失败!", order_ids);
throw new ApiException(ResultCode.FAILED);
}
}
@ -3725,7 +3726,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
String logistics_explain = getParameter("logistics_explain", "");
String str_logistics_time = getParameter("logistics_time");
Date logistics_time = StrUtil.isNotBlank(str_logistics_time) ? DateUtil.parse(str_logistics_time) : null;
Long order_logistics_id = getParameter("order_logistics_id", 0l);
Long order_logistics_id = getParameter("order_logistics_id", 0L);
if (orderLogistics != null) {
order_tracking_number = orderLogistics.getOrder_tracking_number();
@ -3754,7 +3755,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
params.put("store_id:eq", userDto.getStore_id());
if ("DESC".equals(sord.toUpperCase())) {
if ("DESC".equalsIgnoreCase(sord)) {
params.put(sidx + ":desc", "");
} else {
params.put(sidx + ":asc", "");
@ -4216,12 +4217,12 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
params.put("order_time:lt", DateUtil.parse(order_time_end, "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").getTime());
}
Long stime = getParameter("stime", 0l);
Long stime = getParameter("stime", 0L);
if (CheckUtil.isNotEmpty(stime)) {
params.put("order_time:gt", stime);
}
Long etime = getParameter("etime", 0l);
Long etime = getParameter("etime", 0L);
if (CheckUtil.isNotEmpty(etime)) {
params.put("order_time:lt", etime);
}
@ -5585,7 +5586,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
} else {
//todo 通知余额不足
//throw new Exception(sprintf('order_id : %s 余额不足%s - 转单无法下单', $order_id, $trade_payment_money));
throw new ApiException(String.format("order_id : %s 余额不足:%s - 转单无法下单", order_id, trade_payment_amount.toString()));
throw new ApiException(String.format("order_id : %s 余额不足:%s - 转单无法下单", order_id, trade_payment_amount));
}
}
}
@ -7273,11 +7274,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Boolean is_on_sale_tmp = Convert.toBool(s.get("is_on_sale"));
Long item_id_tmp = Convert.toLong(s.get("item_id"));
if (cart_select_tmp && is_on_sale_tmp && act_item_id.contains(item_id_tmp)) {
return true;
} else {
return false;
}
return cart_select_tmp && is_on_sale_tmp && act_item_id.contains(item_id_tmp);
}).map(s -> {
return Convert.toBigDecimal(s.get("cart_quantity"), BigDecimal.ZERO);
}).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
@ -7298,11 +7295,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
Boolean is_on_sale_tmp = Convert.toBool(s.get("is_on_sale"));
Long item_id_tmp = Convert.toLong(s.get("item_id"));
if (cart_select_tmp && is_on_sale_tmp && act_item_id.contains(item_id_tmp)) {
return true;
} else {
return false;
}
return cart_select_tmp && is_on_sale_tmp && act_item_id.contains(item_id_tmp);
}).map(s -> {
return Convert.toBigDecimal(s.get("subtotal"), BigDecimal.ZERO);
}).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
@ -7543,7 +7536,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (ObjectUtil.compare(_order_payment_amount, BigDecimal.ZERO) <= 0) {
// 订单付款状态处理
// 不需要添加收款记录直接修改订单状态
List<String> order_id_row_temp = Arrays.asList(order_id);
List<String> order_id_row_temp = Collections.singletonList(order_id);
if (!setPaidYes(order_id_row_temp)) {
throw new ApiException(I18nUtil._("订单支付状态修改失败!"));
} else {
@ -8115,7 +8108,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
if (CollUtil.isNotEmpty(order_id_receipt)) {
for (String order_id : order_id_receipt) {
try {
if (!shopOrderBaseService.receive(Arrays.asList(order_id), null)) {
if (!shopOrderBaseService.receive(Collections.singletonList(order_id), null)) {
LogUtil.error(String.format(I18nUtil._("order_id : %s 确认出错"), order_id));
}
} catch (Exception e) {
@ -8295,7 +8288,7 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
* @param orderId
* @return
*/
public SFCreateOrderReq buildSFOrderData(Integer devId,String orderId,String orderPickupNum) {
public SFCreateOrderReq buildSFOrderData(Integer devId, String orderId, Long orderPickupNum) {
if (StrUtil.isBlank(orderId)) {
return null;
}
@ -8307,38 +8300,82 @@ public class ShopOrderBaseServiceImpl extends BaseServiceImpl<ShopOrderBaseMappe
return null;
}
ShopOrderBase shopOrderBase = shopOrderBaseService.getById(orderId);
QueryWrapper<ShopOrderItem> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("order_id", orderId);
List<ShopOrderItem> shopOrderItemList = shopOrderItemService.list(queryWrapper);
if (shopOrderBase == null || CollUtil.isEmpty(shopOrderItemList)) {
return null;
}
// 7位数取单号位数不够向左补0
String orderPickupNumStr = String.format("%07d", orderPickupNum);
SFCreateOrderReq sfCreateOrderReq = new SFCreateOrderReq();
sfCreateOrderReq.setDev_id(devId);
sfCreateOrderReq.setShop_id(shopStoreBase.getStore_id().toString());
sfCreateOrderReq.setPush_time(DateUtil.currentSeconds());
sfCreateOrderReq.setShop_order_id(orderId);
sfCreateOrderReq.setOrder_time(DateUtil.currentSeconds());
sfCreateOrderReq.setOrder_source("小发同城");
sfCreateOrderReq.setOrder_sequence(orderPickupNum);
sfCreateOrderReq.setOrder_time(shopOrderBase.getOrder_time().getTime() / 1000);
sfCreateOrderReq.setOrder_source("小发同城"); //订单来源
sfCreateOrderReq.setOrder_sequence(orderPickupNumStr); //拣货编号
// sfCreateOrderReq.setRemark(shopStoreInfo.getOrder_message);
sfCreateOrderReq.setVersion(19);
sfCreateOrderReq.setReturn_flag(511);
Integer productNum = 0;
Integer productTypeNum = shopOrderItemList.size();
// 订单详情信息
SFOrderDetailReq orderDetail = new SFOrderDetailReq();
// 订单里的所有商品列表
List<SFOrderProductDetailReq> orderProductList = new ArrayList<>();
for (ShopOrderItem shopOrderItem : shopOrderItemList) {
productNum += shopOrderItem.getOrder_item_quantity();
// 产品详情
SFOrderProductDetailReq orderProductDetail = new SFOrderProductDetailReq();
orderProductDetail.setProduct_id(shopOrderItem.getProduct_id());
orderProductDetail.setProduct_name(shopOrderItem.getItem_name());
orderProductDetail.setProduct_num(shopOrderItem.getOrder_item_quantity());
orderProductList.add(orderProductDetail);
}
orderDetail.setProduct_type(6); // 生鲜参考https://commit-openic.sf-express.com/#/apidoc
orderDetail.setTotal_price(shopOrderBase.getOrder_payment_amount().multiply(BigDecimal.valueOf(1000)).intValue()); // 单位分
orderDetail.setWeight_gram(0); // 重量一律传 0kg 谢总本地运营商协商好的
orderDetail.setProduct_num(productNum); //物品个数
orderDetail.setProduct_type_num(productTypeNum); //物品种类个数
// 订单里的所有商品列表
orderDetail.setProduct_detail(orderProductList);
// 订单详情信息
sfCreateOrderReq.setOrder_detail(orderDetail);
// 店铺信息发货人信息
Pair<Boolean, StandardAddressDTO> pairShopAddr = shopStoreBaseService.checkStoreAddress(shopStoreBase);
SFOrderShopReq sfOrderShopReq = new SFOrderShopReq();
sfOrderShopReq.setShop_name(shopStoreBase.getStore_name());
sfOrderShopReq.setShop_phone(shopStoreInfo.getStore_tel());
sfOrderShopReq.setShop_address(shopStoreBase.getStore_address());
sfOrderShopReq.setShop_lng(shopStoreBase.getStore_longitude());
sfOrderShopReq.setShop_lat(shopStoreBase.getStore_latitude());
sfOrderShopReq.setShop_address(pairShopAddr.getSecond().getFullAddress());
sfOrderShopReq.setShop_lng(pairShopAddr.getSecond().getLongitude());
sfOrderShopReq.setShop_lat(pairShopAddr.getSecond().getLatitude());
sfCreateOrderReq.setShop(sfOrderShopReq);
// 收货人信息
Pair<Boolean, StandardAddressDTO> pairReceiveAddr = shopOrderDeliveryAddressService.checkAddress(shopOrderDeliveryAddress);
SFOrderReceiveReq receive = new SFOrderReceiveReq();
receive.setUser_name(shopOrderDeliveryAddress.getDa_name());
receive.setUser_phone(shopOrderDeliveryAddress.getDa_telephone());
receive.setUser_address(shopOrderDeliveryAddress.getDa_address());
receive.setUser_lng(shopOrderDeliveryAddress.getDa_longitude());
receive.setUser_lat(shopOrderDeliveryAddress.getDa_latitude());
receive.setUser_address(pairReceiveAddr.getSecond().getFullAddress());
receive.setUser_lng(pairReceiveAddr.getSecond().getLongitude());
receive.setUser_lat(pairReceiveAddr.getSecond().getLatitude());
sfCreateOrderReq.setReceive(receive);

View File

@ -2,9 +2,11 @@ package com.suisung.mall.shop.order.service.impl;
import cn.hutool.core.util.StrUtil;
import com.suisung.mall.common.modules.order.ShopOrderDeliveryAddress;
import com.suisung.mall.common.pojo.dto.StandardAddressDTO;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.order.mapper.ShopOrderDeliveryAddressMapper;
import com.suisung.mall.shop.order.service.ShopOrderDeliveryAddressService;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
@ -32,4 +34,52 @@ public class ShopOrderDeliveryAddressServiceImpl extends BaseServiceImpl<ShopOrd
return getById(orderId);
}
/**
* 检测地址是否有效返回规范全地址
*
* @param shopOrderDeliveryAddress
* @return
*/
@Override
public Pair<Boolean, StandardAddressDTO> checkAddress(ShopOrderDeliveryAddress shopOrderDeliveryAddress) {
if (shopOrderDeliveryAddress == null) {
return Pair.of(false, new StandardAddressDTO());
}
StringBuffer sb = new StringBuffer();
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_province())){
sb.append(shopOrderDeliveryAddress.getDa_province());
}
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_city())){
sb.append(shopOrderDeliveryAddress.getDa_city());
}
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_county())){
sb.append(shopOrderDeliveryAddress.getDa_county());
}
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_address())){
sb.append(shopOrderDeliveryAddress.getDa_address());
}
StandardAddressDTO standardAddressDTO = new StandardAddressDTO();
if ( StrUtil.isBlank(shopOrderDeliveryAddress.getDa_address()) || StrUtil.isBlank(shopOrderDeliveryAddress.getDa_longitude()) || StrUtil.isBlank(shopOrderDeliveryAddress.getDa_latitude())) {
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_longitude())){
shopOrderDeliveryAddress.setDa_longitude("0");
}
if(StrUtil.isNotBlank(shopOrderDeliveryAddress.getDa_latitude())){
shopOrderDeliveryAddress.setDa_latitude("0");
}
standardAddressDTO.setFullAddress(sb.toString());
standardAddressDTO.setLongitude(shopOrderDeliveryAddress.getDa_longitude());
standardAddressDTO.setLatitude(shopOrderDeliveryAddress.getDa_latitude());
return Pair.of(false, new StandardAddressDTO());
}
standardAddressDTO.setLongitude(shopOrderDeliveryAddress.getDa_longitude());
standardAddressDTO.setLatitude(shopOrderDeliveryAddress.getDa_latitude());
standardAddressDTO.setFullAddress(sb.toString());
return Pair.of(true, standardAddressDTO);
}
}

View File

@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.suisung.mall.common.api.StateCode;
import com.suisung.mall.common.feignService.AccountService;
import com.suisung.mall.common.feignService.PayService;
@ -12,18 +13,18 @@ import com.suisung.mall.common.feignService.SnsService;
import com.suisung.mall.common.modules.distribution.ShopDistributionUserWithdraw;
import com.suisung.mall.common.modules.order.ShopOrderInfo;
import com.suisung.mall.common.modules.order.ShopOrderInvoice;
import com.suisung.mall.common.modules.order.ShopOrderStateLog;
import com.suisung.mall.common.modules.pay.PayPlantformResource;
import com.suisung.mall.common.modules.plantform.ShopPlantformFeedback;
import com.suisung.mall.common.modules.product.ShopProductComment;
import com.suisung.mall.common.utils.CommonUtil;
import com.suisung.mall.core.web.service.impl.BaseServiceImpl;
import com.suisung.mall.shop.base.service.AccountBaseConfigService;
import com.suisung.mall.shop.base.service.ShopBaseStateCodeService;
import com.suisung.mall.shop.distribution.service.ShopDistributionUserCommissionService;
import com.suisung.mall.shop.distribution.service.ShopDistributionUserWithdrawService;
import com.suisung.mall.shop.order.mapper.ShopOrderInfoMapper;
import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.ShopOrderInfoService;
import com.suisung.mall.shop.order.service.ShopOrderInvoiceService;
import com.suisung.mall.shop.order.service.ShopOrderReturnService;
import com.suisung.mall.shop.order.service.*;
import com.suisung.mall.shop.plantform.service.ShopPlantformActivityItemService;
import com.suisung.mall.shop.plantform.service.ShopPlantformFeedbackService;
import com.suisung.mall.shop.product.service.ShopProductBaseService;
@ -34,9 +35,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@ -98,6 +101,12 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
@Autowired
private ShopOrderInvoiceService shopOrderInvoiceService;
@Resource
private ShopOrderStateLogService shopOrderStateLogService;
@Resource
private ShopBaseStateCodeService shopBaseStateCodeService;
@Autowired
private ThreadPoolExecutor executor;
@ -193,7 +202,7 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR_OF_DAY, 0);
// calendar.set(2024,10,5,0,0,0);
// calendar.set(2024,10,5,0,0,0);
QueryWrapper<ShopOrderInfo> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("store_id", storeId);
@ -209,6 +218,61 @@ public class ShopOrderInfoServiceImpl extends BaseServiceImpl<ShopOrderInfoMappe
}
}
/**
* 更改商家订单的状态出库状态发货状态并写入订单状态更改日志
*
* @param orderId
* @param orderStatus 约定0值不更改
* @param orderIsOutStatus 出库状态约定0值不更改
* @param orderIsShippedStatus 发货状态约定0值不更改
* @return
*/
@Override
public Boolean changeOrderStatus(String orderId, Integer orderStatus, Integer orderIsOutStatus, Integer orderIsShippedStatus) {
if (orderId == null || orderStatus == null) {
return false;
}
ShopOrderInfo shopOrderInfo = getById(orderId);
if (shopOrderInfo == null) {
return false;
}
Integer preOrderStatus = shopOrderInfo.getOrder_state_id();
UpdateWrapper<ShopOrderInfo> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("order_id", orderId);
if (orderStatus > 0 && !orderIsOutStatus.equals(orderStatus)) {
updateWrapper.set("order_state_id", orderStatus);
}
if (orderIsOutStatus > 0 && !shopOrderInfo.getOrder_is_out().equals(orderIsOutStatus)) {
updateWrapper.set("order_is_out", orderStatus);
}
if (orderStatus > 0 && !shopOrderInfo.getOrder_is_shipped().equals(orderIsShippedStatus)) {
updateWrapper.set("order_is_shipped", orderIsShippedStatus);
}
if (!update(updateWrapper)) {
return false;
}
// 写入订单状态更改日志
ShopOrderStateLog shopOrderStateLog = new ShopOrderStateLog();
shopOrderStateLog.setOrder_id(orderId);
shopOrderStateLog.setOrder_state_is_sync(0);
shopOrderStateLog.setOrder_state_id(orderStatus);
shopOrderStateLog.setOrder_state_time(new Date());
shopOrderStateLog.setOrder_state_pre_id(preOrderStatus);
shopOrderStateLog.setOrder_state_type(shopBaseStateCodeService.getText(orderStatus, null));
shopOrderStateLog.setOrder_state_note(CommonUtil.getOrderStateNote(preOrderStatus, orderStatus));
shopOrderStateLog.setUser_id(0);
shopOrderStateLog.setUser_nickname("SfExpress");
return shopOrderStateLogService.add(shopOrderStateLog);
}
// todo 优化多次远程查询
private Map dashboardPlantform() {
List<Integer> order_state = Arrays.asList(

View File

@ -27,10 +27,11 @@ public interface SFExpressApiService {
/**
* 内部顺丰同城订单下单
* @param sfCreateOrderReq
* @param orderId
* @param orderPickupNum
* @return
*/
Pair<Boolean,String> innerCreateSfExpressOrder(SFCreateOrderReq sfCreateOrderReq);
Pair<Boolean,String> innerCreateSfExpressOrder(String orderId, Long orderPickupNum);
/**

View File

@ -14,11 +14,17 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.suisung.mall.common.api.StateCode;
import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.store.ShopStoreSfOrder;
import com.suisung.mall.common.pojo.req.*;
import com.suisung.mall.common.pojo.res.SFExpressApiRes;
import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.common.utils.JsonUtil;
import com.suisung.mall.shop.order.service.ShopOrderBaseService;
import com.suisung.mall.shop.order.service.ShopOrderInfoService;
import com.suisung.mall.shop.sfexpress.service.SFExpressApiService;
import com.suisung.mall.shop.store.service.ShopStoreBaseService;
import com.suisung.mall.shop.store.service.ShopStoreSfOrderService;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
@ -26,6 +32,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
@ -50,6 +57,12 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
@Resource
private ShopStoreSfOrderService shopStoreSfOrderService;
@Resource
private ShopOrderBaseService shopOrderBaseService;
@Resource
private ShopOrderInfoService shopOrderInfoService;
@Override
public SFExpressApiRes createOrder(String shopOrderId) {
// 组织请求参数
@ -126,12 +139,20 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
/**
* 内部顺丰同城订单下单
*
* @param sfCreateOrderReq
* @param orderId
* @param orderPickupNum
* @return
*/
@Override
public Pair<Boolean,String> innerCreateSfExpressOrder(SFCreateOrderReq sfCreateOrderReq) {
public Pair<Boolean,String> innerCreateSfExpressOrder(String orderId, Long orderPickupNum) {
// 从商家订单中组件顺丰的订单信息关键的函数
SFCreateOrderReq sfCreateOrderReq = shopOrderBaseService.buildSFOrderData(devId, orderId, orderPickupNum);
if (sfCreateOrderReq == null) {
logger.error("顺丰同城下单异常,无法获取下单记录!");
return Pair.of(false, "顺丰同城下单异常,无法获取下单记录!");
}
// 请求参数转换 json 字符串参数
String paramJSON = JsonUtil.toJSONString(sfCreateOrderReq);
@ -141,36 +162,37 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
String retRespStr = HttpUtil.post(send_url, paramJSON);
if (StrUtil.isEmpty(retRespStr)) {
logger.error("创建顺丰同城订单异常,无返回值!");
return Pair.of(false, "创建顺丰同城订单异常,无返回值!");
return Pair.of(false, "顺丰同城下单异常,无返回值!");
}
JSONObject sfExpressApiRes = JSONUtil.parseObj(retRespStr);
if (sfExpressApiRes == null) {
logger.error("创建顺丰同城订单后异常,无返回值");
return Pair.of(false, "创建顺丰同城订单后异常,无返回值!");
logger.error("顺丰同城下单异常,无返回值!");
return Pair.of(false, "顺丰同城下单异常,无返回值!");
}
if (!sfExpressApiRes.get("error_code").equals(0) || sfExpressApiRes.get("result") == null) {
logger.error("创建顺丰同城订单后,发生错误 {}", sfExpressApiRes.get("error_msg"));
logger.error("顺丰同城下单发生错误 {}", sfExpressApiRes.get("error_msg"));
return Pair.of(false, Convert.toStr(sfExpressApiRes.get("error_msg")));
}
// 顺丰同城 result json 数据转实体实例
ShopStoreSfOrder shopStoreSfOrder = JSONUtil.toBean(sfExpressApiRes.get("result").toString(),ShopStoreSfOrder.class);
ShopStoreSfOrder shopStoreSfOrder = JSONUtil.toBean(sfExpressApiRes.get("result").toString(), ShopStoreSfOrder.class);
shopStoreSfOrder.setDev_id(sfCreateOrderReq.getDev_id());
// 下单成功保存顺丰同城订单记录到 shop_store_sf_order 表里
Boolean success = shopStoreSfOrderService.insertShopStoreSfOrder(shopStoreSfOrder);
if (!success) {
return Pair.of(false, "保存顺丰同城单失败!");
return Pair.of(false, "保存顺丰同城单失败!");
}
// 取件码在顺丰同城商户侧配置配置后有此字段
// String pickupCode = shopStoreSfOrder.getPickup_code() != null ? shopStoreSfOrder.getPickup_code().toString() : "";
// TODO 商城订单状态 待发货 更改为 待收货
// 商城订单状态 2020-待配货/待出库审核 2030-待发货
shopOrderInfoService.changeOrderStatus(orderId, StateCode.ORDER_STATE_WAIT_SHIPPING, 0, 0);
return Pair.of(true, "");
return Pair.of(true, "顺丰同城下单成功!");
}
/**
@ -414,11 +436,13 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
/**
* 接收顺丰配送状态更改回调
* // 顺丰同城订单状态1-订单创建;2-订单取消;10-配送员接单/配送员改派;12-配送员到店;15配送员配送中已取货;17-配送员妥投完单;22-配送员撤单;31-取消中;91-骑士上报异常;
*
* @param jsonData
* @param sign
* @return
*/
@Transactional
@Override
public SFExpressApiRes receiveRiderOrderStatusNotify(String jsonData, String sign) {
if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) {
@ -435,9 +459,23 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData);
Boolean success = shopStoreSfOrderService.updateShopStoreSfOrderStatus(shopStoreSfOrder);
if (!success) {
return new SFExpressApiRes().fail(-1,"状态处理失败!");
throw new ApiException(I18nUtil._("状态处理失败!"));
// return new SFExpressApiRes().fail(-1,"状态处理失败!");
}
// 更改商城订单状态为注意事务问题
if(shopStoreSfOrder.getSf_order_status().equals(StateCode.SF_ORDER_STATUS_RECEIVED)) {
// 配送员已取单配送中
// 商城订单状态 2030-待发货 2040-已发货/待收货确认
success = shopOrderInfoService.changeOrderStatus(shopStoreSfOrder.getShop_order_id(), StateCode.ORDER_STATE_WAIT_SHIPPING, StateCode.ORDER_PICKING_STATE_YES, StateCode.ORDER_SHIPPED_STATE_YES);
}
if (!success) {
throw new ApiException(I18nUtil._("状态处理失败!"));
//return new SFExpressApiRes().fail(-1,"状态处理失败!");
}
return new SFExpressApiRes().success("success");
}
@ -448,6 +486,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
* @param sign
* @return
*/
@Transactional
@Override
public SFExpressApiRes receiveOrderCompleteNotify(String jsonData, String sign) {
if (StrUtil.isBlank(jsonData) || StrUtil.isBlank(sign)) {
@ -461,7 +500,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
logger.info("接收顺丰订单完成回调返回的 JSON 数据:{}", jsonData);
// 更改顺丰同城订单状态
ShopStoreSfOrder shopStoreSfOrder = toShopStoreSfOrder(jsonData);
if ( shopStoreSfOrder == null) {
@ -474,18 +512,24 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
}
// 订单状态已经更改过无需更改
if (order.getSf_order_status().equals(17)){
if (order.getSf_order_status().equals(StateCode.SF_ORDER_STATUS_FINISH)){
return new SFExpressApiRes().success("success");
}
Boolean success = shopStoreSfOrderService.updateShopStoreSfOrderStatus(shopStoreSfOrder);
if (!success) {
return new SFExpressApiRes().fail(-1,"状态处理失败!");
throw new ApiException(I18nUtil._("状态处理失败!"));
// return new SFExpressApiRes().fail(-1,"状态处理失败!");
}
// TODO 更改商城订单状态为已完成注意事务问题
// 更改商城订单状态为已完成注意事务问题
// 配送员已取单配送中
// 商城订单状态 040-已发货/待收货确认 2060-已完成/已签收
success = shopOrderInfoService.changeOrderStatus(shopStoreSfOrder.getShop_order_id(), StateCode.ORDER_STATE_FINISH, 0, 0);
if (!success) {
throw new ApiException(I18nUtil._("状态处理失败!"));
}
return new SFExpressApiRes().success("success");
}

View File

@ -6,7 +6,9 @@ import com.suisung.mall.common.modules.account.AccountUserInfo;
import com.suisung.mall.common.modules.base.ShopBaseStoreCategory;
import com.suisung.mall.common.modules.store.ShopStoreBase;
import com.suisung.mall.common.modules.store.ShopStoreCompany;
import com.suisung.mall.common.pojo.dto.StandardAddressDTO;
import com.suisung.mall.core.web.service.IBaseService;
import org.springframework.data.util.Pair;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
@ -98,4 +100,11 @@ public interface ShopStoreBaseService extends IBaseService<ShopStoreBase> {
* @return
*/
ShopStoreBase getShopStoreBaseByStoreId(Integer store_id);
/**
* 检测店铺的地址是否有效返回规范全地址
* @param shopStoreBase
* @return
*/
Pair<Boolean, StandardAddressDTO> checkStoreAddress(ShopStoreBase shopStoreBase);
}

View File

@ -42,6 +42,7 @@ import com.suisung.mall.common.modules.product.ShopProductBase;
import com.suisung.mall.common.modules.product.ShopProductIndex;
import com.suisung.mall.common.modules.store.*;
import com.suisung.mall.common.modules.user.ShopUserFavoritesStore;
import com.suisung.mall.common.pojo.dto.StandardAddressDTO;
import com.suisung.mall.common.utils.CSVUtils;
import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.I18nUtil;
@ -69,6 +70,7 @@ import io.seata.spring.annotation.GlobalTransactional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.util.Pair;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.request.RequestContextHolder;
@ -2822,6 +2824,46 @@ public class ShopStoreBaseServiceImpl extends BaseServiceImpl<ShopStoreBaseMappe
return getOne(queryWrapper);
}
/**
* 检测店铺的地址是否有效返回规范全地址
*
* @param shopStoreBase
* @return
*/
@Override
public Pair<Boolean, StandardAddressDTO> checkStoreAddress(ShopStoreBase shopStoreBase) {
if (shopStoreBase == null) {
return Pair.of(false, new StandardAddressDTO());
}
StandardAddressDTO standardAddressDTO = new StandardAddressDTO();
if (StrUtil.isBlank(shopStoreBase.getStore_area()) || StrUtil.isBlank(shopStoreBase.getStore_address()) || StrUtil.isBlank(shopStoreBase.getStore_longitude()) || StrUtil.isBlank(shopStoreBase.getStore_latitude())) {
StringBuffer sb = new StringBuffer();
if(StrUtil.isNotBlank(shopStoreBase.getStore_area())){
sb.append(StrUtil.replace(shopStoreBase.getStore_area(), "/", ""));
}
if(StrUtil.isNotBlank(shopStoreBase.getStore_address())){
sb.append(shopStoreBase.getStore_address());
}
if(StrUtil.isNotBlank(shopStoreBase.getStore_longitude())){
shopStoreBase.setStore_longitude("0");
}
if(StrUtil.isNotBlank(shopStoreBase.getStore_latitude())){
shopStoreBase.setStore_latitude("0");
}
standardAddressDTO.setFullAddress(sb.toString());
standardAddressDTO.setLongitude(shopStoreBase.getStore_longitude());
standardAddressDTO.setLatitude(shopStoreBase.getStore_latitude());
return Pair.of(false, new StandardAddressDTO());
}
standardAddressDTO.setLongitude(shopStoreBase.getStore_longitude());
standardAddressDTO.setLatitude(shopStoreBase.getStore_latitude());
standardAddressDTO.setFullAddress(StrUtil.format("%s%s", StrUtil.replace(shopStoreBase.getStore_area(), "/", ""), shopStoreBase.getStore_address()));
return Pair.of(true, standardAddressDTO);
}
/**
* 处理 store_slide 字段
*