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()
return Grid::make(UserPointChangeRec::with('user'), function (Grid $grid) {
$grid->model()->orderBy('created_at', 'DESC');
$grid->column('id', 'ID')->sortable();
$grid->column('user_id', '用户ID');
// 添加用户昵称字段
......
......@@ -376,6 +376,8 @@ public function pay(Request $request)
$order_amount = $order_amount - $userObj->balance;
$order->point_amount = $userObj->balance; //积分抵扣金额
$order->order_amount = $order_amount;
$order->save();
}
$res = '';
......@@ -414,11 +416,11 @@ public function orderList(Request $request)
$page = $request->page ?? 1;
$limit = $request->limit ?? 10;
$user_id = $request->user_id ;
$user_id = $request->user_id;
//如果传入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]);
......@@ -478,12 +480,12 @@ public function canceOrder(Request $request)
if ($model->user_id != $request->user()->id) {
return $this->JsonResponse('', '非本人订单', 201);
}
//前端只能取消待支付、待发货订单
if (!in_array($model->order_status, [0, 1])) {
return $this->JsonResponse('', '不满足取消条件' . $model->order_status, 500);
}
$this->canceOrderFunc($model);
return $this->JsonResponse('');
}
......@@ -496,32 +498,54 @@ public static function canceOrderFunc($order)
//未分账才可以退款
if ($order->is_div == 1) {
return $this->JsonResponse('', '订单已分账,无法取消!', 500);
return (new self())->JsonResponse('', '订单已完成分账,无法取消!', 500);
}
$Adapay = new Adapay();
//代到货订单--退库存
if ($order->order_status == 1) {
$Adapay->updateGoodsStock($order);
}
//未分账订单,退款
if ($order->order_amount > 0) {
$order_sn = $order->order_sn;
$refund_no = "R" . date("YmdHis") . rand(100000, 999999); //退单号
$result = $Adapay->refund($order_sn, $refund_no);
Log::info($result);
//未支付订单--改状态直接退出
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) {
// 先获取结果集再操作
if ($order->pay_type == 1 || $order->pay_type == 3) {
//未分账订单,退款
if ($order->order_amount > 0) {
$order_sn = $order->order_sn;
$refund_no = "R" . date("YmdHis") . rand(100000, 999999); //退单号
$result = $Adapay->refund($order_sn, $refund_no);
Log::add('refund_result',$result);
}
$order->order_status = 8; //已退款
$order->save();
// 先获取结果集再操作,通过这笔订单增加的积分,并且状态为冻结中的记录
$userPointChangeRecs = UserPointChangeRec::where([
'order_id' => $order->id,
'point_state' => '<>1',
'change_type' => 1
])->get();
//后期可以把这些记录存入数据库,方便后续操作
Log::Add('canceOrderFunc', '冻结积分删除记录:' . json_encode($userPointChangeRecs->toArray()));
// 批量删除冻结中的积分
......@@ -530,13 +554,23 @@ public static function canceOrderFunc($order)
'point_state' => '<>1',
'change_type' => 1
])->delete();
}
//查询是否需要退用户积分
if ($order->point_amount > 0) {
//新增积分
if (!UserPointChangeRec::pointChangeRecord($order->user_id, $order->point_amount, 1, 4, 1, $order->id)) {
return $this->JsonResponse('', '网络异常,积分返还失败!002', 500);
//查询是否需要退用户积分
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 (!UserPointChangeRec::pointChangeRecord($order->user_id, $order->point_amount, 1, 4, 1, $order->id)) {
return (new self())->JsonResponse('', '网络异常,积分返还失败!004', 500);
}
}
}
......@@ -547,9 +581,9 @@ public static function canceOrderFunc($order)
} catch (\Exception $exception) {
DB::rollBack();
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)
$orderObj->shipping_goods = $ogItem->shipping_goods;
$orderObj->shipping_at = date("Y-m-d H:i:s");
//更新订单状态为解冻中,解冻7天,到期后分发佣金
$orderObj->start_freeze_time = date('Y-m-d H:i:s');
//更新订单状态为解冻中,解冻7天(汇付会冻结1天),到期后分发佣金
$orderObj->freeze_end_date = date('Y-m-d H:i:s', strtotime('+6 day'));
$orderObj->save();
//更新积分状态为解冻中,解冻7天,到期后发放积分到账户积分余额
......@@ -742,11 +776,11 @@ public function OrderInfo(Request $request)
return $this->JsonResponse('', '参数错误', 201);
}
$user_id = $request->user_id ;
$user_id = $request->user_id;
//如果传入user_id 则查询该用户的订单,验证当前用户是否核销员
if (!$user_id) {
$user_id =$request->user()->id;
$user_id = $request->user()->id;
}
// if ($orderObj->user_id != $user_id) {
......
......@@ -128,13 +128,14 @@ public function manualDivide(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
WHERE deleted_at IS NULL
AND pay_status = 1
AND is_div = 0
AND start_freeze_time is not null
AND start_freeze_time < NOW() - INTERVAL 6 DAY
AND order_amount > 0
AND freeze_end_date is not null
AND freeze_end_date < NOW()
AND order_status IN (3, 4);
');
......
......@@ -257,7 +257,7 @@ public function getCommissionAmount($type, $obj_id)
//查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select('
SELECT
log.id,
loi.id,
loi.pay_type,
log.goods_id,
loi.order_amount,
......@@ -280,7 +280,7 @@ public function getCommissionAmount($type, $obj_id)
LEFT JOIN
li_goods lg ON lg.id = log.goods_id
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('zhu2',$orderObjList);
......@@ -291,7 +291,7 @@ public function getCommissionAmount($type, $obj_id)
//查询该对象所有已支付,未分佣的订单
$orderObjList = DB::select('
SELECT
log.id,
loi.id,
loi.pay_type,
log.goods_id,
loi.order_amount,
......@@ -312,7 +312,7 @@ public function getCommissionAmount($type, $obj_id)
LEFT JOIN
store_admin_users sau ON sau.id = ?
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 (
select user_id from store_employee_user_rec where employee_id=?
); ', [$obj_id, $obj_id]);
......@@ -332,10 +332,10 @@ public function getCommissionAmount($type, $obj_id)
$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);
//判断计算商家还是员工
......
......@@ -182,7 +182,20 @@ public function payNotify($params = [])
}
$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里面去了】
//$this->handlePaymentConfirmAndDivide($order_no, $orderObj, $payment_confirm);
......
......@@ -22,7 +22,7 @@ class OrderInfo extends Model
3 => '待评价',
4 => '已完成',
7 => '已取消',
//8 => '已退款',
8 => '已退款',
//9 => '已收货',//分账资金冻结7天,用户确认收货后汇付会立即解冻资金,t+1后资金分账,所以需要平台自己控制6天冻结,不分账,这期间可以退款
];
......
......@@ -173,8 +173,7 @@ public static function pointUnfreezeimg($orderObj)
->where('id', $records[0]->id)
->update([
'point_state' => 2, // 解冻中
'freeze_end_date' => $freezeEndDate,
'updated_at' => date('Y-m-d H:i:s')
'freeze_end_date' => $freezeEndDate
]);
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