Commit d75710c0 by yink

fix: 修复订单状态、积分解冻及分账逻辑

- 在`OrderInfo.php`中取消注释已退款状态
- 在`UserPointChangeRec.php`中移除多余的`updated_at`更新
- 在`UserPointChangeRecController.php`中添加按创建时间排序
- 在`Adapay.php`中注释掉未使用的解冻逻辑
- 在`OrderDivideRecordController.php`中调整分账查询逻辑,使用`freeze_end_date`代替`start_freeze_time`
- 在`StoreAdminUsersController.php`中修正订单查询条件和分佣金额计算精度
- 在`OrderController.php`中优化订单取消逻辑,增加退款状态处理和积分返还逻辑
parent c360f1d5
...@@ -20,6 +20,7 @@ protected function grid() ...@@ -20,6 +20,7 @@ protected function grid()
return Grid::make(UserPointChangeRec::with('user'), function (Grid $grid) { return Grid::make(UserPointChangeRec::with('user'), function (Grid $grid) {
$grid->model()->orderBy('created_at', 'DESC');
$grid->column('id', 'ID')->sortable(); $grid->column('id', 'ID')->sortable();
$grid->column('user_id', '用户ID'); $grid->column('user_id', '用户ID');
// 添加用户昵称字段 // 添加用户昵称字段
......
...@@ -376,6 +376,8 @@ public function pay(Request $request) ...@@ -376,6 +376,8 @@ public function pay(Request $request)
$order_amount = $order_amount - $userObj->balance; $order_amount = $order_amount - $userObj->balance;
$order->point_amount = $userObj->balance; //积分抵扣金额 $order->point_amount = $userObj->balance; //积分抵扣金额
$order->order_amount = $order_amount; $order->order_amount = $order_amount;
$order->save();
} }
$res = ''; $res = '';
...@@ -415,10 +417,10 @@ public function orderList(Request $request) ...@@ -415,10 +417,10 @@ public function orderList(Request $request)
$limit = $request->limit ?? 10; $limit = $request->limit ?? 10;
$user_id = $request->user_id ; $user_id = $request->user_id;
//如果传入user_id 则查询该用户的订单,验证当前用户是否核销员 //如果传入user_id 则查询该用户的订单,验证当前用户是否核销员
if (!$user_id) { if (!$user_id) {
$user_id =$request->user()->id; $user_id = $request->user()->id;
} }
$sql = OrderInfoModel::where(['user_id' => $user_id, 'deleted_at' => null]); $sql = OrderInfoModel::where(['user_id' => $user_id, 'deleted_at' => null]);
...@@ -478,12 +480,12 @@ public function canceOrder(Request $request) ...@@ -478,12 +480,12 @@ public function canceOrder(Request $request)
if ($model->user_id != $request->user()->id) { if ($model->user_id != $request->user()->id) {
return $this->JsonResponse('', '非本人订单', 201); return $this->JsonResponse('', '非本人订单', 201);
} }
//前端只能取消待支付、待发货订单
if (!in_array($model->order_status, [0, 1])) { if (!in_array($model->order_status, [0, 1])) {
return $this->JsonResponse('', '不满足取消条件' . $model->order_status, 500); return $this->JsonResponse('', '不满足取消条件' . $model->order_status, 500);
} }
$this->canceOrderFunc($model); $this->canceOrderFunc($model);
return $this->JsonResponse(''); return $this->JsonResponse('');
} }
...@@ -496,32 +498,54 @@ public static function canceOrderFunc($order) ...@@ -496,32 +498,54 @@ public static function canceOrderFunc($order)
//未分账才可以退款 //未分账才可以退款
if ($order->is_div == 1) { if ($order->is_div == 1) {
return $this->JsonResponse('', '订单已分账,无法取消!', 500); return (new self())->JsonResponse('', '订单已完成分账,无法取消!', 500);
} }
$Adapay = new Adapay(); $Adapay = new Adapay();
//代到货订单--退库存
if ($order->order_status == 1) { //未支付订单--改状态直接退出
$Adapay->updateGoodsStock($order); if ($order->order_status == 0) {
$order->order_status = 7;
$order->save();
DB::commit();
//未支付直接取消
Log::info($order->id);
return (new self())->JsonResponse('');
}
//判断状态是否正常;订单状态 0:待付款 1:待到货 2:待领取 3: 待评价 4:已完成 7:已取消 8:已退款
if (!in_array($order->order_status, [1, 2,3,4]) ) {
return (new self())->JsonResponse('', '订单状态不可退款!', 500);
} }
$Adapay->updateGoodsStock($order);
//判断支付方式现金还是积分, 1:微信,2:积分,3:微信+积分
//判断是否现金支付,查询是否需要收回冻结中的积分
if ($order->pay_type == 1 || $order->pay_type == 3) {
//未分账订单,退款 //未分账订单,退款
if ($order->order_amount > 0) { if ($order->order_amount > 0) {
$order_sn = $order->order_sn; $order_sn = $order->order_sn;
$refund_no = "R" . date("YmdHis") . rand(100000, 999999); //退单号 $refund_no = "R" . date("YmdHis") . rand(100000, 999999); //退单号
$result = $Adapay->refund($order_sn, $refund_no); $result = $Adapay->refund($order_sn, $refund_no);
Log::info($result); Log::add('refund_result',$result);
} }
//判断是否现金支付,查询是否需要收回冻结中的积分 $order->order_status = 8; //已退款
if ($order->pay_type == 1) { $order->save();
// 先获取结果集再操作
// 先获取结果集再操作,通过这笔订单增加的积分,并且状态为冻结中的记录
$userPointChangeRecs = UserPointChangeRec::where([ $userPointChangeRecs = UserPointChangeRec::where([
'order_id' => $order->id, 'order_id' => $order->id,
'point_state' => '<>1', 'point_state' => '<>1',
'change_type' => 1 'change_type' => 1
])->get(); ])->get();
//后期可以把这些记录存入数据库,方便后续操作
Log::Add('canceOrderFunc', '冻结积分删除记录:' . json_encode($userPointChangeRecs->toArray())); Log::Add('canceOrderFunc', '冻结积分删除记录:' . json_encode($userPointChangeRecs->toArray()));
// 批量删除冻结中的积分 // 批量删除冻结中的积分
...@@ -530,13 +554,23 @@ public static function canceOrderFunc($order) ...@@ -530,13 +554,23 @@ public static function canceOrderFunc($order)
'point_state' => '<>1', 'point_state' => '<>1',
'change_type' => 1 'change_type' => 1
])->delete(); ])->delete();
//查询是否需要退用户积分
if ($order->point_amount > 0) {
//新增积分
if (!UserPointChangeRec::pointChangeRecord($order->user_id, $order->point_amount, 1, 4, 1, $order->id)) {
return (new self())->JsonResponse('', '网络异常,积分返还失败!003', 500);
} }
}
} else {
//查询是否需要退用户积分 //查询是否需要退用户积分
if ($order->point_amount > 0) { if ($order->point_amount > 0) {
//新增积分 //新增积分
if (!UserPointChangeRec::pointChangeRecord($order->user_id, $order->point_amount, 1, 4, 1, $order->id)) { if (!UserPointChangeRec::pointChangeRecord($order->user_id, $order->point_amount, 1, 4, 1, $order->id)) {
return $this->JsonResponse('', '网络异常,积分返还失败!002', 500); return (new self())->JsonResponse('', '网络异常,积分返还失败!004', 500);
}
} }
} }
...@@ -547,9 +581,9 @@ public static function canceOrderFunc($order) ...@@ -547,9 +581,9 @@ public static function canceOrderFunc($order)
} catch (\Exception $exception) { } catch (\Exception $exception) {
DB::rollBack(); DB::rollBack();
Log::add('取消订单失败', $exception->getMessage()); Log::add('取消订单失败', $exception->getMessage());
return $this->JsonResponse('', '取消订单失败', 201); return (new self())->JsonResponse('', '取消订单失败', 201);
} }
return $this->JsonResponse(''); return (new self())->JsonResponse('');
} }
...@@ -659,8 +693,8 @@ public function scanCodeVerifi(Request $request) ...@@ -659,8 +693,8 @@ public function scanCodeVerifi(Request $request)
$orderObj->shipping_goods = $ogItem->shipping_goods; $orderObj->shipping_goods = $ogItem->shipping_goods;
$orderObj->shipping_at = date("Y-m-d H:i:s"); $orderObj->shipping_at = date("Y-m-d H:i:s");
//更新订单状态为解冻中,解冻7天,到期后分发佣金 //更新订单状态为解冻中,解冻7天(汇付会冻结1天),到期后分发佣金
$orderObj->start_freeze_time = date('Y-m-d H:i:s'); $orderObj->freeze_end_date = date('Y-m-d H:i:s', strtotime('+6 day'));
$orderObj->save(); $orderObj->save();
//更新积分状态为解冻中,解冻7天,到期后发放积分到账户积分余额 //更新积分状态为解冻中,解冻7天,到期后发放积分到账户积分余额
...@@ -743,10 +777,10 @@ public function OrderInfo(Request $request) ...@@ -743,10 +777,10 @@ public function OrderInfo(Request $request)
} }
$user_id = $request->user_id ; $user_id = $request->user_id;
//如果传入user_id 则查询该用户的订单,验证当前用户是否核销员 //如果传入user_id 则查询该用户的订单,验证当前用户是否核销员
if (!$user_id) { if (!$user_id) {
$user_id =$request->user()->id; $user_id = $request->user()->id;
} }
// if ($orderObj->user_id != $user_id) { // if ($orderObj->user_id != $user_id) {
......
...@@ -128,13 +128,14 @@ public function manualDivide(Request $request) ...@@ -128,13 +128,14 @@ public function manualDivide(Request $request)
public function updateOrderStatusToDiv(Request $request) public function updateOrderStatusToDiv(Request $request)
{ {
//查询完成冻结的订单,分账 //查询完成冻结的订单,分账
$orderList = DB::select('SELECT id,order_sn,user_id,order_amount,start_freeze_time $orderList = DB::select('SELECT id,order_sn,user_id,order_amount,freeze_end_date
FROM li_order_info FROM li_order_info
WHERE deleted_at IS NULL WHERE deleted_at IS NULL
AND pay_status = 1 AND pay_status = 1
AND is_div = 0 AND is_div = 0
AND start_freeze_time is not null AND order_amount > 0
AND start_freeze_time < NOW() - INTERVAL 6 DAY AND freeze_end_date is not null
AND freeze_end_date < NOW()
AND order_status IN (3, 4); AND order_status IN (3, 4);
'); ');
......
...@@ -257,7 +257,7 @@ public function getCommissionAmount($type, $obj_id) ...@@ -257,7 +257,7 @@ public function getCommissionAmount($type, $obj_id)
//查询该对象所有已支付,未分佣的订单 //查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select(' $orderObjList = DB::select('
SELECT SELECT
log.id, loi.id,
loi.pay_type, loi.pay_type,
log.goods_id, log.goods_id,
loi.order_amount, loi.order_amount,
...@@ -280,7 +280,7 @@ public function getCommissionAmount($type, $obj_id) ...@@ -280,7 +280,7 @@ public function getCommissionAmount($type, $obj_id)
LEFT JOIN LEFT JOIN
li_goods lg ON lg.id = log.goods_id li_goods lg ON lg.id = log.goods_id
WHERE WHERE
loi.pay_type<>2 and loi.is_div=0 and loi.merchant_id = ?; ', [$obj_id]); loi.pay_type<>2 and loi.is_div=0 and (loi.order_status =3 || loi.order_status =4) and loi.merchant_id = ?; ', [$obj_id]);
// Log::add('zhu3',$obj_id); // Log::add('zhu3',$obj_id);
// Log::add('zhu2',$orderObjList); // Log::add('zhu2',$orderObjList);
...@@ -291,7 +291,7 @@ public function getCommissionAmount($type, $obj_id) ...@@ -291,7 +291,7 @@ public function getCommissionAmount($type, $obj_id)
//查询该对象所有已支付,未分佣的订单 //查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select(' $orderObjList = DB::select('
SELECT SELECT
log.id, loi.id,
loi.pay_type, loi.pay_type,
log.goods_id, log.goods_id,
loi.order_amount, loi.order_amount,
...@@ -312,7 +312,7 @@ public function getCommissionAmount($type, $obj_id) ...@@ -312,7 +312,7 @@ public function getCommissionAmount($type, $obj_id)
LEFT JOIN LEFT JOIN
store_admin_users sau ON sau.id = ? store_admin_users sau ON sau.id = ?
WHERE WHERE
loi.pay_type<>2 and loi.is_div=0 and loi.user_id loi.pay_type<>2 and loi.is_div=0 and (loi.order_status =3 || loi.order_status =4) and loi.user_id
in ( in (
select user_id from store_employee_user_rec where employee_id=? select user_id from store_employee_user_rec where employee_id=?
); ', [$obj_id, $obj_id]); ); ', [$obj_id, $obj_id]);
...@@ -332,10 +332,10 @@ public function getCommissionAmount($type, $obj_id) ...@@ -332,10 +332,10 @@ public function getCommissionAmount($type, $obj_id)
$cash_ratio = number_format(($orderObj->order_amount / $orderObj->total_price) , 4); //保留4位小数 $cash_ratio = number_format(($orderObj->order_amount / $orderObj->total_price) , 4); //保留4位小数
} }
//应该分给商家的金额 //应该分给商家的金额
$merchant_divide_price = number_format($orderObj->total_merchant_commission * $cash_ratio, 2); $merchant_divide_price = number_format($orderObj->total_merchant_commission * $cash_ratio, 4);
//应该分给员工的金额 //应该分给员工的金额
$employee_divide_price =number_format($merchant_divide_price * ($objUser->employee_commission / 100), 2); $employee_divide_price =number_format($merchant_divide_price * ($objUser->employee_commission / 100), 4);
Log::add('zhu7',$employee_divide_price); Log::add('zhu7',$employee_divide_price);
//判断计算商家还是员工 //判断计算商家还是员工
......
...@@ -182,7 +182,20 @@ public function payNotify($params = []) ...@@ -182,7 +182,20 @@ public function payNotify($params = [])
} }
$orderObj->freeze_stat = 'UNFREEZE'; $orderObj->freeze_stat = 'UNFREEZE';
$orderObj->save(); //在核销成功后,执行下面逻辑
// //确认收货后,开始解冻,设置当前时间+6天为解冻结束时间,6天后解冻
// $orderObj->freeze_end_date = date('Y-m-d H:i:s', strtotime('+6 day'));
// $orderObj->save();
// //将该笔订单的积分列表改成解冻中
// $pointList = UserPointChangeRec::where(['order_id' => $orderObj->id])->get();
// if ($pointList) {
// foreach ($pointList as $kk => $vv) {
// $vv->point_state = 2; //解冻中
// $vv->freeze_end_date = date('Y-m-d H:i:s', strtotime('+6 day'));
// $vv->save();
// }
// }
// 调用汇付接口分账-6天后在解冻分账--》【改到updateOrderStatusToDiv里面去了】 // 调用汇付接口分账-6天后在解冻分账--》【改到updateOrderStatusToDiv里面去了】
//$this->handlePaymentConfirmAndDivide($order_no, $orderObj, $payment_confirm); //$this->handlePaymentConfirmAndDivide($order_no, $orderObj, $payment_confirm);
......
...@@ -22,7 +22,7 @@ class OrderInfo extends Model ...@@ -22,7 +22,7 @@ class OrderInfo extends Model
3 => '待评价', 3 => '待评价',
4 => '已完成', 4 => '已完成',
7 => '已取消', 7 => '已取消',
//8 => '已退款', 8 => '已退款',
//9 => '已收货',//分账资金冻结7天,用户确认收货后汇付会立即解冻资金,t+1后资金分账,所以需要平台自己控制6天冻结,不分账,这期间可以退款 //9 => '已收货',//分账资金冻结7天,用户确认收货后汇付会立即解冻资金,t+1后资金分账,所以需要平台自己控制6天冻结,不分账,这期间可以退款
]; ];
......
...@@ -173,8 +173,7 @@ public static function pointUnfreezeimg($orderObj) ...@@ -173,8 +173,7 @@ public static function pointUnfreezeimg($orderObj)
->where('id', $records[0]->id) ->where('id', $records[0]->id)
->update([ ->update([
'point_state' => 2, // 解冻中 'point_state' => 2, // 解冻中
'freeze_end_date' => $freezeEndDate, 'freeze_end_date' => $freezeEndDate
'updated_at' => date('Y-m-d H:i:s')
]); ]);
DB::commit(); DB::commit();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment