商家异常订单手动发货功能新增

This commit is contained in:
liyj 2025-10-22 15:16:32 +08:00
parent 1112033ed8
commit 20cab88cf9
8 changed files with 130 additions and 1 deletions

View File

@ -67,6 +67,9 @@ public class ShopOrderBase implements Serializable {
@ApiModelProperty(value = "订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废;") @ApiModelProperty(value = "订单状态(LIST):2011-待订单审核;2013-待财务审核;2020-待配货/待出库审核;2030-待发货;2040-已发货/待收货确认;2060-已完成/已签收;2070-已取消/已作废;")
private Integer order_state_id; private Integer order_state_id;
@ApiModelProperty(value = "异常订单操作流程,0-可操作自行发货1-可操作订单完成2-订单完成不可操作")
private String operate_flag;
// @ApiModelProperty(value = "easy支付id存储") // @ApiModelProperty(value = "easy支付id存储")
// private String easy_pay_id; // private String easy_pay_id;

View File

@ -93,4 +93,6 @@ public class MchOrderInfoDTO implements Serializable {
private Integer distance; private Integer distance;
@ApiModelProperty(value = "是否禁止退款1-是2-否;") @ApiModelProperty(value = "是否禁止退款1-是2-否;")
private Integer is_deny_return; private Integer is_deny_return;
@ApiModelProperty(value = "异常订单操作流程,0-可操作自行发货1-可操作订单完成2-订单完成不可操作")
private String operate_flag;
} }

View File

@ -15,6 +15,7 @@ import com.suisung.mall.common.modules.order.*;
import com.suisung.mall.common.modules.order.dto.MchOrderInfoDTO; import com.suisung.mall.common.modules.order.dto.MchOrderInfoDTO;
import com.suisung.mall.common.service.impl.BaseControllerImpl; import com.suisung.mall.common.service.impl.BaseControllerImpl;
import com.suisung.mall.common.utils.CheckUtil; import com.suisung.mall.common.utils.CheckUtil;
import com.suisung.mall.common.utils.ContextUtil;
import com.suisung.mall.common.utils.I18nUtil; import com.suisung.mall.common.utils.I18nUtil;
import com.suisung.mall.shop.order.service.*; import com.suisung.mall.shop.order.service.*;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -308,7 +309,7 @@ public class ShopOrderBaseController extends BaseControllerImpl {
@RequestMapping(value = "/mch/order/list", method = RequestMethod.POST) @RequestMapping(value = "/mch/order/list", method = RequestMethod.POST)
public CommonResult selectMchOrderPageList(@RequestBody JSONObject params) { public CommonResult selectMchOrderPageList(@RequestBody JSONObject params) {
// === 用户验证 === // === 用户验证 ===
UserDto userDto = getCurrentUser(); UserDto userDto = ContextUtil.getCurrentUser();
if (userDto == null) { if (userDto == null) {
return CommonResult.failed(ResultCode.NEED_LOGIN); return CommonResult.failed(ResultCode.NEED_LOGIN);
} }

View File

@ -106,6 +106,18 @@ public class SFExpressController {
return sfExpressApiService.notifyProductReady(params); return sfExpressApiService.notifyProductReady(params);
} }
@ApiOperation(value = "商家自行发货", notes = "商家自行发货,顺丰不接单导致异常订单之后商家自行配送,手动发货")
@RequestMapping(value = "/selDelivery", method = RequestMethod.POST)
public CommonResult selDelivery(@RequestParam(name = "order_id", defaultValue = "") String orderId) {
return sfExpressApiService.selDelivery(orderId);
}
@ApiOperation(value = "商家配送完成", notes = "商家配送完成,顺丰不接单导致异常订单之后商家自行配送,手动配送完成")
@RequestMapping(value = "/selFinishOrder", method = RequestMethod.POST)
public CommonResult selFinishOrder(@RequestParam(name = "order_id", defaultValue = "") String orderId) {
return sfExpressApiService.selFinishOrder(orderId);
}
/** /**
* 顺丰同城订单状态监听 SSE 服务 * 顺丰同城订单状态监听 SSE 服务
* *

View File

@ -8,6 +8,7 @@
package com.suisung.mall.shop.sfexpress.service; package com.suisung.mall.shop.sfexpress.service;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.pojo.res.ThirdApiRes; import com.suisung.mall.common.pojo.res.ThirdApiRes;
import org.springframework.data.util.Pair; import org.springframework.data.util.Pair;
@ -186,4 +187,20 @@ public interface SFExpressApiService {
// * @return // * @return
// */ // */
// void pushMessageToStoreEmployee(Integer storeId, String orderId, String message, String payloadJson); // void pushMessageToStoreEmployee(Integer storeId, String orderId, String message, String payloadJson);
/**
* 商家自行配送发货
* @param orderId
* @return
*/
CommonResult selDelivery( String orderId);
/**
* 商家手动完成订单
* @param shopOrderId
* @return
*/
CommonResult selFinishOrder(String shopOrderId);
} }

View File

@ -16,10 +16,13 @@ import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.suisung.mall.common.api.CommonResult;
import com.suisung.mall.common.api.StateCode; import com.suisung.mall.common.api.StateCode;
import com.suisung.mall.common.constant.CommonConstant; import com.suisung.mall.common.constant.CommonConstant;
import com.suisung.mall.common.constant.SFExpressConstant; import com.suisung.mall.common.constant.SFExpressConstant;
import com.suisung.mall.common.domain.UserDto;
import com.suisung.mall.common.exception.ApiException; import com.suisung.mall.common.exception.ApiException;
import com.suisung.mall.common.modules.order.ShopOrderBase;
import com.suisung.mall.common.modules.order.ShopOrderItem; import com.suisung.mall.common.modules.order.ShopOrderItem;
import com.suisung.mall.common.modules.store.ShopMchEntry; import com.suisung.mall.common.modules.store.ShopMchEntry;
import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase; import com.suisung.mall.common.modules.store.ShopStoreSameCityTransportBase;
@ -1069,6 +1072,7 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return new ThirdApiRes().success("success"); return new ThirdApiRes().success("success");
} }
/** /**
* 接收顺丰订单完成回调 * 接收顺丰订单完成回调
* *
@ -1160,9 +1164,92 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return new ThirdApiRes().success("success"); return new ThirdApiRes().success("success");
} }
/**
* 自行发货
* @param orderId
* @return
*/
@Override
public CommonResult selDelivery(String orderId) {
ShopOrderBase shopOrderBase = checkedOrder(orderId);
if(!shopOrderBase.getOperate_flag().equals("0")){
return CommonResult.failed("该状态不允许发货操作");
}
Pair<Boolean, String> pair= wxOrderShippingService.uploadShippingInfoToWx(2,shopOrderBase.getOrder_id());
if(pair.getFirst()){
//完成订单后修改订单异常操作流程进入完成订单环节
shopOrderBase.setOperate_flag("1");
shopOrderBaseService.updateById(shopOrderBase);
//出库扣减思迅库存star
// RMK 第三方数据同步相关redis 给这个商品减去对应的库存
QueryWrapper<ShopOrderItem> itemQueryWrapper = new QueryWrapper<>();
itemQueryWrapper.eq("order_id", orderId);
List<ShopOrderItem> order_item_rows = shopOrderItemService.find(itemQueryWrapper);
if(!order_item_rows.isEmpty()){
for (ShopOrderItem shopOrderItem : order_item_rows) {
Map<String, Integer> stockDeltaMap = new HashMap<>();
String item_src_id= shopOrderItem.getItem_src_id();
Integer order_item_quantity=shopOrderItem.getOrder_item_quantity();
stockDeltaMap.put(item_src_id + "-" + shopOrderItem.getOrder_id(), -order_item_quantity);
syncThirdDataService.incrProductStockToRedis(stockDeltaMap);
}
}
//出库扣减思迅库存end
}
return CommonResult.success("操作成功");
}
/**
* 商家自行配送完成订单
* @param shopOrderId
*/
public CommonResult selFinishOrder(String shopOrderId) {
Integer orderStatus = StateCode.ORDER_STATE_RECEIVED; //已签收
ShopOrderBase shopOrderBase = checkedOrder(shopOrderId);
if(!shopOrderBase.getOperate_flag().equals("1")){
return CommonResult.failed("该状态不允许完成订单操作");
}
// 送达后发出催促微信用户确认收货通知 (同城配送不能调用微信的确认收货)
wxOrderShippingService.notifyConfirmReceive(shopOrderBase.getOrder_id());
shopOrderInfoService.changeOrderStatus(shopOrderId, orderStatus, 0, 0);
//完成订单后修改订单异常操作流程
shopOrderBase.setOperate_flag("2");
shopOrderBaseService.updateById(shopOrderBase);
return CommonResult.success("操作成功");
}
// 私有方法 // 私有方法
/**
* 校验订单是否正确
* @param shopOrderId
* @return
*/
private ShopOrderBase checkedOrder(String shopOrderId){
if(StringUtils.isBlank(shopOrderId)){
logger.info("订单号不能为空");
throw new ApiException("订单号不能为空");
}
UserDto userDto= ContextUtil.getCurrentUser();
if(userDto==null){
logger.info("用户不能为空");
throw new ApiException("用户不能为空");
}
if(userDto.getRole_id()!=2){
throw new ApiException("用户无权限");
}
QueryWrapper<ShopOrderBase> shopOrderBaseQueryWrapper = new QueryWrapper<>();
shopOrderBaseQueryWrapper.eq("order_id", shopOrderId);
shopOrderBaseQueryWrapper.eq("store_id", Integer.valueOf(userDto.getStore_id()));
List<ShopOrderBase> shopOrderBaseList= shopOrderBaseService.list(shopOrderBaseQueryWrapper);
if(shopOrderBaseList.isEmpty()){
logger.info("订单号不存在");
throw new ApiException("订单号不存在");
}
return shopOrderBaseList.get(0);
}
/** /**
* 生成顺丰同城请求签名参考官网https://commit-openic.sf-express.com/#/apidoc * 生成顺丰同城请求签名参考官网https://commit-openic.sf-express.com/#/apidoc
* *
@ -1218,4 +1305,6 @@ public class SFExpressApiServiceImpl implements SFExpressApiService {
return JSONUtil.toBean(resultJSON, ShopStoreSfOrder.class); return JSONUtil.toBean(resultJSON, ShopStoreSfOrder.class);
} }
} }

View File

@ -578,6 +578,7 @@
<result property="order_shipping_fee_inner" column="order_shipping_fee_inner"/> <result property="order_shipping_fee_inner" column="order_shipping_fee_inner"/>
<result property="lkl_fee" column="lkl_fee"/> <result property="lkl_fee" column="lkl_fee"/>
<result property="packing_fee" column="packing_fee"/> <result property="packing_fee" column="packing_fee"/>
<result property="operate_flag" column="operate_flag"/>
<!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee--> <!--总计优惠金额 order_discount_amount + order_voucher_price + order_points_fee + order_adjust_fee-->
<result property="total_discount_amount" column="total_discount_amount"/> <result property="total_discount_amount" column="total_discount_amount"/>
<result property="order_income_amount" column="order_income_amount"/> <result property="order_income_amount" column="order_income_amount"/>
@ -769,6 +770,7 @@
ob.order_payment_amount, ob.order_payment_amount,
ob.currency_id, ob.currency_id,
ob.order_state_id, ob.order_state_id,
ob.operate_flag,
ST_Distance_Sphere( ST_Distance_Sphere(
POINT(sb.store_longitude, sb.store_latitude), POINT(sb.store_longitude, sb.store_latitude),
POINT(oda.da_longitude, oda.da_latitude) POINT(oda.da_longitude, oda.da_latitude)

View File

@ -0,0 +1,3 @@
alter table shop_order_base add column operate_flag varchar(1) not null default '0' comment '异常订单操作流程,0-可操作自行发货1-可操作订单完成2-订单完成不可操作';
update shop_order_base set operate_flag='2';