Commit a1a99506 by yink

fix: 修复订单退款和库存管理问题

修复订单退款时未返回结果的问题
调整库存管理逻辑,支持增加和减少库存
修复支付回调中积分记录的条件判断
优化积分解冻逻辑,支持批量处理记录
parent 762c96ed
...@@ -374,9 +374,11 @@ public function OrderAdminRefund() ...@@ -374,9 +374,11 @@ public function OrderAdminRefund()
} }
if ($orderObj->is_div == 0) { if ($orderObj->is_div == 0) {
OrderController::canceOrderFunc($orderObj); return OrderController::canceOrderFunc($orderObj);
} else { } else {
return response()->json(['status' => false, 'message' => '已分账,不允许退款!']); return response()->json(['status' => false, 'message' => '已分账,不允许退款!']);
} }
//return response()->json(['status' => true, 'message' => '退款成功']);
} }
} }
...@@ -113,9 +113,20 @@ public function goodsUpload() ...@@ -113,9 +113,20 @@ public function goodsUpload()
{ {
$aliOss = new AliOss(); $aliOss = new AliOss();
// 判断是否是删除文件请求
if ($this->isDeleteRequest()) {
// 删除文件并响应
return $this->deleteFileAndResponse();
}
// 获取上传的文件 // 获取上传的文件
$file = $this->file(); $file = $this->file();
// 检查文件是否存在
if (!$file) {
return $this->responseErrorMessage('文件不存在');
}
$ext = $file->getClientOriginalExtension(); $ext = $file->getClientOriginalExtension();
Image::make($file->getRealPath()) Image::make($file->getRealPath())
->resize(640, null, function ($constraint) { ->resize(640, null, function ($constraint) {
......
...@@ -154,7 +154,7 @@ public function getIndexGoods(Request $request) ...@@ -154,7 +154,7 @@ public function getIndexGoods(Request $request)
// } // }
$model = GoodModel::select(['id', 'goods_name', 'is_hot', 'cover_img', 'goods_brief', 'sku', 'tags']) $model = GoodModel::select(['id', 'goods_name', 'is_hot', 'cover_img', 'goods_brief', 'sku', 'tags'])
->where(['is_show' => 1]); ->where(['is_show' => 1, 'is_hot' => 1]);
if ($kw) { if ($kw) {
$model = $model->where("goods_name", 'like', "%" . $kw . "%"); $model = $model->where("goods_name", 'like', "%" . $kw . "%");
} }
......
...@@ -369,6 +369,10 @@ public function pay(Request $request) ...@@ -369,6 +369,10 @@ public function pay(Request $request)
$order->pay_status = 1; //支付状态 $order->pay_status = 1; //支付状态
$order->order_status = 1; //订单状态 $order->order_status = 1; //订单状态
//更新商品库存
$Adapay = new Adapay();
$Adapay->updateGoodsStock($order);
$order->save(); $order->save();
DB::commit(); DB::commit();
...@@ -378,6 +382,11 @@ public function pay(Request $request) ...@@ -378,6 +382,11 @@ public function pay(Request $request)
return $this->JsonResponse('', '积分充足,可选择积分支付!', 500); return $this->JsonResponse('', '积分充足,可选择积分支付!', 500);
} }
//判断是否有足够的积分支付
if ($userObj->balance < $order_amount) {
return $this->JsonResponse('', '积分不足!', 500);
}
//扣除积分 //扣除积分
if (!UserPointChangeRec::pointChangeRecord($userObj->id, $userObj->balance, 0, 3, 1, $order_id)) { if (!UserPointChangeRec::pointChangeRecord($userObj->id, $userObj->balance, 0, 3, 1, $order_id)) {
return $this->JsonResponse('', '网络异常,积分抵扣失败!003', 500); return $this->JsonResponse('', '网络异常,积分抵扣失败!003', 500);
...@@ -533,7 +542,7 @@ public static function canceOrderFunc($order) ...@@ -533,7 +542,7 @@ public static function canceOrderFunc($order)
} }
$Adapay->updateGoodsStock($order); $Adapay->updateGoodsStock($order, true);
//判断支付方式现金还是积分, 1:微信,2:积分,3:微信+积分 //判断支付方式现金还是积分, 1:微信,2:积分,3:微信+积分
//判断是否现金支付,查询是否需要收回冻结中的积分 //判断是否现金支付,查询是否需要收回冻结中的积分
...@@ -593,7 +602,7 @@ public static function canceOrderFunc($order) ...@@ -593,7 +602,7 @@ public static function canceOrderFunc($order)
Log::add('取消订单失败', $exception->getMessage()); Log::add('取消订单失败', $exception->getMessage());
return (new self())->JsonResponse('', '取消订单失败', 201); return (new self())->JsonResponse('', '取消订单失败', 201);
} }
return (new self())->JsonResponse(''); return (new self())->JsonResponse('成功');
} }
......
...@@ -65,8 +65,39 @@ public function checkDistance(Request $request) ...@@ -65,8 +65,39 @@ public function checkDistance(Request $request)
return $this->JsonResponse(['flag' => $flag, 'delivery_store_id' => $store_id]); return $this->JsonResponse(['flag' => $flag, 'delivery_store_id' => $store_id]);
} }
//// 测试-距离判断
public function testHaversineDistance(Request $request)
{
$mid = 25;
$lat1 = $request->lat ?? '';
$lng1 = $request->lng ?? '';
$list = [];
if ($mid) {
$list = Store::where(['merchant_id' => $mid])
->select(['id', 'title', 'lat_lng', 'address', 'contacts', 'phone'])->get();
foreach ($list as $key => $val) {
$atng = $val->lat_lng ? explode(',', $val->lat_lng) : [];
$lat2 = $atng[0]; // 修正:第一个元素是纬度
$lng2 = $atng[1]; // 修正:第二个元素是经度
$list[$key]['distance'] = ($lat1 && $lat2) ? $this->haversineDistance($lat1, $lng1, $lat2, $lng2) : '';
}
}
return $this->JsonResponse($list);
}
function haversineDistance($lat1, $lng1, $lat2, $lng2) function haversineDistance($lat1, $lng1, $lat2, $lng2)
{ {
// 地球半径(单位:千米) // 地球半径(单位:千米)
$radius = 6371; $radius = 6371;
......
...@@ -95,6 +95,8 @@ public function payNotify($params = []) ...@@ -95,6 +95,8 @@ public function payNotify($params = [])
if ($message['status'] == "succeeded" && $orderObj->pay_status == 0) { if ($message['status'] == "succeeded" && $orderObj->pay_status == 0) {
DB::beginTransaction(); DB::beginTransaction();
try { try {
//Log::add('支付回调', [$order_no]);
//更新订单 //更新订单
if ($orderObj->pay_status == 0) { if ($orderObj->pay_status == 0) {
$orderObj->order_status = 1; $orderObj->order_status = 1;
...@@ -102,7 +104,7 @@ public function payNotify($params = []) ...@@ -102,7 +104,7 @@ public function payNotify($params = [])
$orderObj->freeze_stat = $message['freeze_stat']; $orderObj->freeze_stat = $message['freeze_stat'];
if ($orderObj->save()) { if ($orderObj->save()) {
if ($orderObj->pay_type = 1) { //纯现金支付才返积分 if ($orderObj->pay_type == 1) { //纯现金支付才返积分
//创建直推分积分记录 //创建直推分积分记录
$this->createPointRecordByOrder($orderObj->id); $this->createPointRecordByOrder($orderObj->id);
} }
...@@ -110,7 +112,7 @@ public function payNotify($params = []) ...@@ -110,7 +112,7 @@ public function payNotify($params = [])
//更新商品销量、库存 //更新商品销量、库存
$this->updateGoodsStock($orderObj); $this->updateGoodsStock($orderObj);
// //更新商品销量、库存 // //更新商品销量、库存【上方已更新】
// $goodsList = OrderGoods::where("order_id", $orderObj->id)->get(); // $goodsList = OrderGoods::where("order_id", $orderObj->id)->get();
// foreach ($goodsList as $item) { // foreach ($goodsList as $item) {
// //Log::add('--订单商品对象--', $item); // //Log::add('--订单商品对象--', $item);
...@@ -637,7 +639,7 @@ public static function createPointRecordByOrder($order_id) ...@@ -637,7 +639,7 @@ public static function createPointRecordByOrder($order_id)
//判断直推是否存在 //判断直推是否存在
if ($spuid) { if ($spuid) {
// 计算直推用户的积分 // 计算直推用户的积分
$total_first_commission = number_format($goodsObj->total_first_commission , 2); $total_first_commission = number_format($goodsObj->total_first_commission, 2);
// 为直推用户创建积分记录 // 为直推用户创建积分记录
UserPointChangeRec::pointChangeRecord($spuid, $total_first_commission, 1, 1, 3, $order_id); // UserPointChangeRec::pointChangeRecord($spuid, $total_first_commission, 1, 1, 3, $order_id); //
...@@ -676,6 +678,7 @@ public static function createPointRecordByOrder($order_id) ...@@ -676,6 +678,7 @@ public static function createPointRecordByOrder($order_id)
* *
* 参数说明: * 参数说明:
* @param OrderInfo $orderObj 订单对象 * @param OrderInfo $orderObj 订单对象
* @param bool $isIncreaseStock 是否增加库存,默认false(减少库存)
* *
* 返回值说明: * 返回值说明:
* @return bool 更新成功返回true,失败返回false * @return bool 更新成功返回true,失败返回false
...@@ -685,13 +688,14 @@ public static function createPointRecordByOrder($order_id) ...@@ -685,13 +688,14 @@ public static function createPointRecordByOrder($order_id)
* *
* 使用示例: * 使用示例:
* $order = OrderInfo::find(123); * $order = OrderInfo::find(123);
* Adapay::updateGoodsStock($order); * Adapay::updateGoodsStock($order); // 默认减少库存
* Adapay::updateGoodsStock($order, true); // 增加库存
* *
* 注意事项: * 注意事项:
* 1. 需要在事务中调用此方法 * 1. 需要在事务中调用此方法
* 2. 会同时更新商品规格库存、商品SKU和商户规格库存 * 2. 会同时更新商品规格库存、商品SKU和商户规格库存
*/ */
public static function updateGoodsStock($orderObj) public static function updateGoodsStock($orderObj, $isIncreaseStock = false)
{ {
if (!$orderObj || !$orderObj->id) { if (!$orderObj || !$orderObj->id) {
throw new Exception('订单对象无效'); throw new Exception('订单对象无效');
...@@ -716,7 +720,14 @@ public static function updateGoodsStock($orderObj) ...@@ -716,7 +720,14 @@ public static function updateGoodsStock($orderObj)
continue; continue;
} }
$attr_stock = ($attrObj->stock - $item->goods_number) >= 0 ? $attrObj->stock - $item->goods_number : 0; // 根据参数决定是增加还是减少库存
if ($isIncreaseStock) {
// 增加库存:原库存加上购买数量
$attr_stock = $attrObj->stock + $item->goods_number;
} else {
// 减少库存:原库存减去购买数量,确保库存不为负数
$attr_stock = ($attrObj->stock - $item->goods_number) >= 0 ? $attrObj->stock - $item->goods_number : 0;
}
$attrObj->stock = $attr_stock; $attrObj->stock = $attr_stock;
$attrObj->save(); $attrObj->save();
...@@ -739,8 +750,16 @@ public static function updateGoodsStock($orderObj) ...@@ -739,8 +750,16 @@ public static function updateGoodsStock($orderObj)
'merchant_id' => $orderObj->merchant_id 'merchant_id' => $orderObj->merchant_id
])->first(); ])->first();
// 如果订单有商户ID且找到对应的商户规格库存记录,则更新商户规格库存
if ($orderObj->merchant_id && $mgsObj) { if ($orderObj->merchant_id && $mgsObj) {
$changeStock = ($mgsObj->stock >= $item->goods_number) ? $mgsObj->stock - $item->goods_number : 0; // 根据参数决定是增加还是减少库存
if ($isIncreaseStock) {
// 增加库存:原库存加上购买数量
$changeStock = $mgsObj->stock + $item->goods_number;
} else {
// 减少库存:原库存减去购买数量,确保库存不为负数
$changeStock = ($mgsObj->stock >= $item->goods_number) ? $mgsObj->stock - $item->goods_number : 0;
}
$mgsObj->stock = $changeStock; $mgsObj->stock = $changeStock;
$mgsObj->save(); $mgsObj->save();
} }
......
...@@ -163,23 +163,30 @@ public static function pointUnfreezeimg($orderObj) ...@@ -163,23 +163,30 @@ public static function pointUnfreezeimg($orderObj)
'order_id' => $orderObj->id, 'order_id' => $orderObj->id,
'msg' => '没有找到可解冻的积分记录' 'msg' => '没有找到可解冻的积分记录'
]); ]);
DB::commit();
return true;
} }
// 设置7天后的解冻结束日期 // 设置7天后的解冻结束日期
$freezeEndDate = date('Y-m-d H:i:s', strtotime('+7 days')); $freezeEndDate = date('Y-m-d H:i:s', strtotime('+7 days'));
// 更新积分记录状态为解冻中 // 遍历所有记录,更新每条积分记录状态为解冻中
DB::table('user_point_change_rec') $totalPointAmount = 0;
->where('id', $records[0]->id) foreach ($records as $record) {
->update([ DB::table('user_point_change_rec')
'point_state' => 2, // 解冻中 ->where('id', $record->id)
'freeze_end_date' => $freezeEndDate ->update([
]); 'point_state' => 2, // 解冻中
'freeze_end_date' => $freezeEndDate
]);
$totalPointAmount += $record->point_amount;
}
DB::commit(); DB::commit();
Log::add('point_unfreeze', [ Log::add('point_unfreeze', [
'order_id' => $orderObj->id, 'order_id' => $orderObj->id,
'point_amount' => $records[0]->point_amount, 'total_point_amount' => $totalPointAmount,
'record_count' => count($records),
'freeze_end_date' => $freezeEndDate 'freeze_end_date' => $freezeEndDate
]); ]);
return true; return true;
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
//调试路由 //调试路由
Route::post('simulate-login','LoginController@simulateLogin'); //模拟登陆 Route::post('simulate-login','LoginController@simulateLogin'); //模拟登陆
Route::get('test1','LoginController@test'); //测试内容-什么都测 Route::get('test1','StoreController@testHaversineDistance'); //测试内容-什么都测
Route::get('test-order-div','CarouselController@orderDiv'); //测试订单分佣 Route::get('test-order-div','CarouselController@orderDiv'); //测试订单分佣
Route::get('test-order-div-point','CarouselController@orderDivByPoint'); //测试订单积分生成 Route::get('test-order-div-point','CarouselController@orderDivByPoint'); //测试订单积分生成
......
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