很多人会问我店铺申请删单之后,店铺分数就被扣完了,导致店铺只能暂时性关闭,那么这就是犯了常见的错误。京东删单是商家由于各种原因向后台提出删单申请,删除订单可以更好的保障店铺运营基本不受影响。但是具体哪些情况下能删单,删单时会遇到哪些疑问,这些都是很大问题。都知道当遇到批量下单、敲诈勒索、差价/运费/赠品链接、套取利益这四类场景情况时,自然能提交异常订单删除。如果不是这些情况,还能有什么方法删单呢。
1、除京东异常删单,还有什么情况能删单?
还有一种情况是协商删单,这种仅限货到付款订单。使用场景有4种,下面分别举例。
第一种,商家联系客户,客户同意取消订单。例如商品脱销/超卖/有瑕疵,商家可预先联系客户解释,征得客户同意的前提下,提交删单申请,并注明删单原因。第二种,商家联系客户,客户同意取消订单。例如:货到付款订单用户拒收,卖家联系用户,确认商品拒收取消后提交删单申请。第三种,联系不上客户或客户同意取消订单。例如:用户下单不符合购买规则或地址不详无法配送,商家联系用户确认订单异常点,是否可以修改订单,如无法修改是否同意取消订单。第四种,客户要求取消订单。例如:用户原因取消订单申请删单,用户通过咚咚/400电话联系商家告知要求取消订单。
2、京东协商删单具体怎么操作?
具体操作路径:权益服务 >维权管理>删单申请 > 协商删单>添加删单。
3、申请京东删单后,订单多久之后就会删除?
商家提交删单申请后,系统自动触发短信至消费者,告知订单已被申请删除。如消费者反馈未与商家达成一致,则删单申请被驳回;如消费者未提出异议,订单在48小时后自动删除。
4、京东恶意订单申请删单记录在哪里查?
商家登录商家后台—权益服务—维权管理—申请删单—异常删单/协商删单内,默认展示申请删单历史记录,或者您也可以选择对应的筛选框选项进行查询。
5、违规申请删单,平台将会给予哪种处罚?
对未经消费者同意申请协商删单、遭消费者投诉的的商家,平台将按《京东开放平台商家积分管理规则》中“违背承诺”进行处理,每次扣12分。
ttps://v.qq.com/x/page/k3208z8fdh6.html
乘客取消订单的原因有千千万
责任划分怎么算
跟乘客沟通的过程很重要
有一些字眼千万不能说
否则无责变有责
【那你取消吧】
但凡是你给乘客传达出这样的语句
那么一定是司机有责
而且!
乘客看到取消后要付空接费后更不爽,随便找个理由去投诉,结果服务分被扣了,你说冤不冤呢?
还有一些情况,也属于诱导乘客取消的行为
以下语句都会被判有责
以临时有事为由
你好,我是咱们滴滴司机,我要去吃饭呢,要不您换个车?
以车有问题为由
你好,我是咱们滴滴司机,我车出现一点问题,不能去接您,要不您换个车?
以车有问题为由而实际上车并没问题,这个理由也是不成立的。
以距离太远为由
你好,我是咱们滴滴司机,我距离你那里太远了,你重新叫一辆车吧。
以堵车为由
你好,我是咱们滴滴司机,这会儿很堵车,我过去接您估计要半个小时,要不您重新叫一辆车?
要求加价
你好,我是滴滴司机,我接你这一单不赚钱还得空跑回来,你看我去接你的话能不能加一下空驶补偿和过路费。
所以,各位司机师傅们,沟通过程中
要【表达自己的接驾意愿】
不要【说出诱导乘客取消订单的话】
记住了吗
skr~
态机简介:
状态机是有限状态自动机的简称,是现实事物运行规则抽象而成的一个数学模型。【规则的抽象】
有限状态机一般都有以下特点:
(1)可以用状态来描述事物,并且任一时刻,事物总是处于一种状态;
(2)事物拥有的状态总数是有限的;
(3)通过触发事物的某些行为,可以导致事物从一种状态过渡到另一种状态;
(4)事物状态变化是有规则的,A状态可以变换到B,B可以变换到C,A却不一定能变换到C;
(5)同一种行为,可以将事物从多种状态变成同种状态,但是不能从同种状态变成多种状态。
状态机这种描述客观世界的方式就是将事物抽象成若干状态,然后所有的事件和规则导致事物在这些状态中游走。最终使得事物“自圆其说”。
很多通信协议的开发都必须用到状态机;一个健壮的状态机可以让你的程序,不论发生何种突发事件都不会突然进入一个不可预知的程序分支。
四大概念:
状态(state)
一个状态机至少要包含两个状态。
分为:现态(源状态)、次态(目标状态)
状态可以理解为一种结果,一种稳态形式,没有扰动会保持不变的。
状态命名形式:
1.副词+动词;例如:待审批、待支付、待收货
这种命名方式体现了:状态机就是事件触发状态不断迁徙的本质。表达一种待触发的感觉。
2.动词+结果;例如:审批完成、支付完成
3.已+动词形式;例如:已发货、已付款
以上两种命名方式体现了:状态是一种结果或者稳态的本质。表达了一种已完成的感觉。
角色很多的时候,为了表示清晰,可以加上角色名:例如:待财务审批、主管批准
命名考虑从用户的理解的角度出发。
事件(event)
or
触发条件
又称为“条件”,就是某个操作动作的触发条件或者口令。当一个条件满足时,就会触发一个动作,或者执行一次状态迁徙
这个事件可以是外部调用、监听到消息、或者各种定时到期等触发的事件。
对于灯泡,“打开开关”就是一个事件。
条件命名形式:动词+结果;例如:支付成功、下单时间>5分钟
动作(action)
事件发生以后要执行动作。例如:事件=“打开开关指令”,动作=“开灯”。一般就对应一个函数。
条件满足后执行动作。动作执行完毕后,可以迁移到新的状态,也可以仍旧保持原状态。
动作不是必需的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
那么如何区分“动作”和“状态”?
“动作”是不稳定的,即使没有条件的触发,“动作”一旦执行完毕就结束了;
而“状态”是相对稳定的,如果没有外部条件的触发,一个状态会一直持续下去。
变换(transition)
即从一个状态变化到另外一个状态
例如:“开灯过程”就是一个变化
状态机其他表达方式:
状态机的设计:
信息系统中有很多状态机,例如:业务订单的状态。
状态机的设计存在的问题:什么是状态?到底有多少个状态?要细分到什么程度?
信息系统是现实世界的一种抽象和描述。而业务领域中那些已经发生的事件就是事实,信息系统就是将这些事实以信息的形式存储到数据库中,即:信息就是一组事实
信息系统就是存储这些事实,对这些事实进行管理与追踪,进而起到提高工作效率的作用。
信息系统就是记录已经发生的事实,信息系统中的状态基本和事实匹配。即:标识某个事实的完成度。
业务系统,根据实际业务,具体会有哪些发生的事实需要记录,基本上这些事实就至少对应一个状态。需要记录的事实就是一种稳态,一种结果。
例如:【待支付】->【已支付】->【已收货】->【已评价】
这些都是系统需要记录的已发生的客观事实。而这些事实就对应了状态,而发生这些事实的事件就对应了触发状态机的转换的事件。
根据自己的业务实际进行分析,并画出状态图即可。
状态机实现方式:状态模式
下面是经典的自动贩卖机例子来说明状态模式的用法,状态图如下:
分析一个这个状态图:
a、包含4个状态(我们使用4个int型常量来表示)
b、包含3个暴露在外的方法(投币、退币、转动手柄、(发货动作是内部方法,售卖机未对外提供方法,售卖机自动调用))
c、我们需要处理每个状态下,用户都可以触发这三个动作。
我们可以做没有意义的事情,在【未投币】状态,试着退币,或者同时投币两枚,此时机器会提示我们不能这么做。
实现逻辑:
任何一个可能的动作,我们都要检查,看看我们所处的状态和动作是否合适。
状态机使用if-else或switch实现
测试自动售卖机
使用if-else/switch的方式实现状态有如下问题:
例如:现在增加一个状态。每个方法都需要添加if-else语句。
升级策略:
【封装变化】,局部化每个状态的行为,将每个状态的行为放到各自类中,每个状态只要实现自己的动作就可以了。
贩卖机只要将动作委托给代表当前状态的状态对象即可。
public interface State
{
/**
* 放钱
*/
public void insertMoney();
/**
* 退钱
*/
public void backMoney();
/**
* 转动曲柄
*/
public void turnCrank();
/**
* 出商品
*/
public void dispense();
}
public class NoMoneyState implements State
{
private VendingMachine machine;
public NoMoneyState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
System.out.println("投币成功");
machine.setState(machine.getHasMoneyState());
}
@Override
public void backMoney()
{
System.out.println("您未投币,想退钱?...");
}
@Override
public void turnCrank()
{
System.out.println("您未投币,想拿东西么?...");
}
@Override
public void dispense()
{
throw new IllegalStateException("非法状态!");
}
}
public class HasMoneyState implements State
{
private VendingMachine machine;
public HasMoneyState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
System.out.println("您已经投过币了,无需再投....");
}
@Override
public void backMoney()
{
System.out.println("退币成功");
machine.setState(machine.getNoMoneyState());
}
@Override
public void turnCrank()
{
System.out.println("你转动了手柄");
machine.setState(machine.getSoldState());
}
@Override
public void dispense()
{
throw new IllegalStateException("非法状态!");
}
}
public class SoldOutState implements State
{
private VendingMachine machine;
public SoldOutState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
System.out.println("投币失败,商品已售罄");
}
@Override
public void backMoney()
{
System.out.println("您未投币,想退钱么?...");
}
@Override
public void turnCrank()
{
System.out.println("商品售罄,转动手柄也木有用");
}
@Override
public void dispense()
{
throw new IllegalStateException("非法状态!");
}
}
public class SoldState implements State
{
private VendingMachine machine;
public SoldState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
System.out.println("正在出货,请勿投币");
}
@Override
public void backMoney()
{
System.out.println("正在出货,没有可退的钱");
}
@Override
public void turnCrank()
{
System.out.println("正在出货,请勿重复转动手柄");
}
@Override
public void dispense()
{
machine.releaseBall();
if (machine.getCount() > 0)
{
machine.setState(machine.getNoMoneyState());
} else
{
System.out.println("商品已经售罄");
machine.setState(machine.getSoldOutState());
}
}
}
public class VendingMachine
{
private State noMoneyState;
private State hasMoneyState;
private State soldState;
private State soldOutState;
private State winnerState ;
private int count=0;
private State currentState=noMoneyState;
public VendingMachine(int count)
{
noMoneyState=new NoMoneyState(this);
hasMoneyState=new HasMoneyState(this);
soldState=new SoldState(this);
soldOutState=new SoldOutState(this);
winnerState=new WinnerState(this);
if (count > 0)
{
this.count=count;
currentState=noMoneyState;
}
}
//将这些动作委托给当前状态.
public void insertMoney()
{
currentState.insertMoney();
}
public void backMoney()
{
currentState.backMoney();
}
// 机器不用提供dispense动作,因为这是一个内部动作.用户不可以直
//接要求机器发放糖果.我们在状态对象的turnCrank()方法中调用
//dispense方法;
//dispense无论如何,即使在nomoney状态也会被执行.
//让不合法的情形下,dispense抛出异常处理。
public void turnCrank()
{
currentState.turnCrank();
currentState.dispense();
}
public void releaseBall()
{
System.out.println("发出一件商品...");
if (count !=0)
{
count -=1;
}
}
public void setState(State state)
{
this.currentState=state;
}
//getter setter omitted ...
}
我们之前说过,if-else/switch实现方式没有弹性,那现在按照这种实现模式,需求变更修改起来会轻松点吗?
红色部分标记了我们的需求变更:当用户每次转动手柄的时候,有10%的几率赠送一瓶。
实现方式:
我们遵守了【开闭】原则,只要新建一个WinnerState的类即可。然后有限的修改has_money的转向即可。
为什么WinnerState要独立成一个状态,其实它和sold状态一模一样。我把代码写在SoldState中不行吗?
如果sold需求变化不一定影响到winner代码实现,winner需求变化时,也不一定要修改sold,比如促销方案结束了,中奖概率变了等。
如果他们的变化不是一定互相影响到彼此的,那我们就该将他们分离,即是【隔离变化】也是遵守【单一职责】的原则。
public class WinnerState implements State
{
private VendingMachine machine;
public WinnerState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
throw new IllegalStateException("非法状态");
}
@Override
public void backMoney()
{
throw new IllegalStateException("非法状态");
}
@Override
public void turnCrank()
{
throw new IllegalStateException("非法状态");
}
@Override
public void dispense()
{
System.out.println("你中奖了,恭喜你,将得到2件商品");
machine.releaseBall();
if (machine.getCount()==0)
{
System.out.println("商品已经售罄");
machine.setState(machine.getSoldOutState());
} else
{
machine.releaseBall();
if (machine.getCount() > 0)
{
machine.setState(machine.getNoMoneyState());
} else
{
System.out.println("商品已经售罄");
machine.setState(machine.getSoldOutState());
}
}
}
}
public class HasMoneyState implements State
{
private VendingMachine machine;
private Random random=new Random();
public HasMoneyState(VendingMachine machine)
{
this.machine=machine;
}
@Override
public void insertMoney()
{
System.out.println("您已经投过币了,无需再投....");
}
@Override
public void backMoney()
{
System.out.println("退币成功");
machine.setState(machine.getNoMoneyState());
}
@Override
public void turnCrank()
{
System.out.println("你转动了手柄");
int winner=random.nextInt(10);
if (winner==0 && machine.getCount() > 1)
{
machine.setState(machine.getWinnerState());
} else
{
machine.setState(machine.getSoldState());
}
}
@Override
public void dispense()
{
throw new IllegalStateException("非法状态!");
}
}
总结状态模式:
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了他的类。
解释:
状态模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象。
所以行为会随着内部状态改变而改变。
我们通过组合简单引用不同状态对象来造成类改变的假象.
状态模式策略模式
1.行为封装的n个状态中,不同状态不用行为。
2.context的行为委托到不同状态中。
3.[当前状态]在n个状态中游走,context的行为也随之[当前状态]的改变而改变。
4.用户对context的状态改变浑然不知。
5.客户不会直接和state交互,只能通过context暴露的方法交互,state转换是context内部事情。
6.state可以是接口也可以是抽象类,取决于有没公共功能可以放进抽象类中。抽象类方便,因为可以后续加方法。
可以将重复代码放入抽象类中。例如:"你已投入25元,不能重复投" 这种通用代码放入抽象类中。
7.context可以决定状态流转,如果这个状态流转是固定的,就适合放在context中进行。但是如果状态流转是动态的就适合放在状态中进行。
例如通过商品的剩余数目来决定流向[已售完]或[等待投币],这个时候放在状态类中,因为dispense要根据状态判断流转。
这个写法决定了,有新需求时候,你是改context还是改state类。
8.可以共享所有的state对象,但是需要修改context的时候时候,需要handler中传入context引用
1.context主动指定需要组合的策略对象是哪一个。
2.可以在启动的时候通过工厂动态指定具体是哪个策略对象,但是没有在策略对象之间游走,即:只组合了一个策略对象。
3.策略作为继承之外一种弹性替代方案。因为继承导致子类继承不适用的方法,且每个类都要维护,策略模式通过不同对象组合来改变行为。
4.策略模式聚焦的是互换的算法来创建业务。
状态机典型应用:订单状态控制
建表语句
如上图所示:
一种典型的订单设计。业务订单和支付退款订单组合,他们分别有自己的状态机。
状态机模式实现订单状态机:
日常开发过程中,状态机模式应用场景之一的就是订单模型中的状态控制。但是区别于状态模式的点有以下几个:
以支付订单为例:
/*
Title: PaymentInfo Description:
支付订单状态机
该类不可被spring管理,需要new出来,一个类就对应一条数据库中支付订单记录
本文来自博客园,作者:wanglifeng,转载请注明原文链接:https://www.cnblogs.com/wanglifeng717/p/16214122.html
@author wanglifeng
*/
public class PaymentStateMachine {
// 数据库中当前支付订单实体
private SapoPayment payment;
// 当前状态
private PaymentState currentState;
// 需要更新入库的支付订单实体。与payment属性配合,payment为当前数据库中订单实体,用于乐观锁的前置内容校验。
private SapoPayment paymentForUpdate;
/* 将最新内容(含状态)更新入库,并当前状态机状态 */
public void updateStateMachine() {
// 从Spring容器中获取操作数据的dao
SapoDao dao=SpringUtil.getBean(SapoDao.class);
// 更新数据库,乐观锁机制:带前置内容数据校验,其中payment为前置内容,paymentForUpdate为要更新的内容,如果更新结果=0,说明该订单被其他线程修改过。抛异常,放弃此次修改。
dao.updateSapoPaymentByNull(paymentForUpdate, payment);
// 记录订单操作流水
dao.insertSapoOrderStatusLog(SapoOrderStatusLog.getInstance().setOrderId(paymentForUpdate.getId())
.setOrderType(SapoOrderStatusLog.ORDER_TYPE_PAYMENT).setStatus(paymentForUpdate.getStatus()));
// 更新当前PaymentStateMachine状态机
this.setPayment(paymentForUpdate);
this.setCurrentState(paymentForUpdate.getStatus());
}
// 通过条件获取一个支付订单PaymentStateMachine实体
public static PaymentStateMachine getInstance(SapoPayment sapoPaymentForQuery) {
// 1.从spring容器中获取dao;
SapoDao dao=SpringUtil.getBean(SapoDao.class);
// 2.查出该支付订单
SapoPayment paymentResult=dao.getSapoPayment(sapoPaymentForQuery);
// 3.初始化订单状态机
PaymentStateMachine paymentStateMachine=new PaymentStateMachine();
paymentStateMachine.setPayment(paymentResult);
paymentStateMachine.setCurrentState(paymentResult.getStatus());
paymentStateMachine.setPaymentForUpdate(SapoPayment.getInstance(paymentResult));
return paymentStateMachine;
}
// 设置当前状态机的状态。输入数据库中status字段,映射成对应的状态类实体。
public void setCurrentState(Integer status) {
PaymentState currentState=null;
// status数字,映射成对应的状态类实体
if (SapoPayment.STATUS_APPLY.equals(status)) {
currentState=SpringUtil.getBean(PaymentStateApply.class);
} else if (SapoPayment.STATUS_WAIT_PAY.equals(status)) {
currentState=SpringUtil.getBean(PaymentStateWaitPay.class);
} else if (SapoPayment.STATUS_PAY_FINISH.equals(status)) {
currentState=SpringUtil.getBean(PaymentStatePayFinish.class);
} else if (SapoPayment.STATUS_FAIL.equals(status)) {
currentState=SpringUtil.getBean(PaymentStateFail.class);
} else if (SapoPayment.STATUS_CANCEL.equals(status)) {
currentState=SpringUtil.getBean(PaymentStateCancel.class);
} else {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
"status not in state machine ,status: " + status);
}
this.currentState=currentState;
}
// TODO 待实现,申请支付订单
public void apply() {
// 委托给当前状态执行,将当前订单状态机对象传进去,使用状态对象处理订单
currentState.apply(this);
}
// TODO 待实现,通知支付结果
public void resultNotify() {
// 委托给当前状态执行
currentState.resultNotify(this);
}
// TODO 同步给当前状态执行
public void sync() {
// 委托给当前状态执行
currentState.sync(this);
}
// 取消订单
public void cancel() {
// 委托给当前状态执行
currentState.cancel(this);
}
}
public interface PaymentState {
public void apply(PaymentStateMachine paymentStateMachine);
public void resultNotify(PaymentStateMachine paymentStateMachine);
public void sync(PaymentStateMachine paymentStateMachine);
public void cancel(PaymentStateMachine paymentStateMachine);
}
@Service
public class PaymentStateApply extends BaseLogger implements PaymentState {
@Autowired
FmPayClientService fmPayClientService;
@Autowired
SapoDao dao;
@Autowired
private JacksonComponent jacksonComponent;
public void apply(PaymentStateMachine paymentStateMachine) {
}
public void sync(PaymentStateMachine paymentStateMachine) {
}
public void resultNotify(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void cancel(PaymentStateMachine paymentStateMachine) {
SapoPayment sapoPaymentForUpdate=paymentStateMachine.getPaymentForUpdate();
sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_CANCEL);
sapoPaymentForUpdate.setExpireTime(null);
paymentStateMachine.updateStateMachine();
}
}
@Service
public class PaymentStateCancel extends BaseLogger implements PaymentState {
public void apply(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void resultNotify(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void sync(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void cancel(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
}
@Service
public class PaymentStateFail extends BaseLogger implements PaymentState {
public void apply(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void resultNotify(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void sync(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void cancel(PaymentStateMachine paymentStateMachine) {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "fail status can not cancel");
}
}
@Service
public class PaymentStatePayFinish extends BaseLogger implements PaymentState {
public void apply(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void resultNotify(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void sync(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void cancel(PaymentStateMachine paymentStateMachine) {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "payfinish status can not cancel");
}
}
@Service
public class PaymentStateWaitPay extends BaseLogger implements PaymentState {
@Autowired
FmPayClientService fmPayClientService;
@Autowired
SapoDao dao;
@Autowired
private JacksonComponent jacksonComponent;
public void payResultNotify() {
// TODO implement here
}
public void apply(PaymentStateMachine paymentStateMachine) {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
"applyPayPlatform not match payment state machine,currentStatus:"
+ paymentStateMachine.getPayment().getStatus());
}
public void sync(PaymentStateMachine paymentStateMachine) {
// TODO 过期去统一支付查询
String payStatus=queryPayResultResponse.getPayStatus();
// 1:初始化输入 2:支付中 3:支付成功 4:支付失败 5:撤销
if (QueryPayResultResponse.PAY_STATUS_INIT.equals(payStatus)) {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(),
"FMpay queryPay return init status ,we are waitpay");
}
if (QueryPayResultResponse.PAY_STATUS_ING.equals(payStatus)) {
return;
}
SapoPayment sapoPaymentForUpdate=paymentStateMachine.getPaymentForUpdate();
if (QueryPayResultResponse.PAY_STATUS_CANCEL.equals(payStatus)) {
sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_CANCEL);
} else if (QueryPayResultResponse.PAY_STATUS_FAIL.equals(payStatus)) {
sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_FAIL);
} else if (QueryPayResultResponse.PAY_STATUS_SUCCESS.equals(payStatus)) {
sapoPaymentForUpdate.setStatus(SapoPayment.STATUS_PAY_FINISH);
}
sapoPaymentForUpdate.setExpireTime(null);
paymentStateMachine.updateStateMachine();
}
public void resultNotify(PaymentStateMachine paymentStateMachine) {
// TODO Auto-generated method stub
}
public void cancel(PaymentStateMachine paymentStateMachine) {
throw new BusinessException(ResultInfo.SYS_INNER_ERROR.getCode(), "wait pay status can not cancel");
}
}
文章来自https://www.cnblogs.com/wanglifeng717/p/16214122.html
*请认真填写需求信息,我们会在24小时内与您取得联系。