|
@@ -7,6 +7,7 @@ use app\admin\validate\order\ReturnValidate;
|
|
|
use app\controller\Curd;
|
|
|
use app\model\CouponDetail;
|
|
|
use app\model\GoodsComponent;
|
|
|
+use app\model\Member;
|
|
|
use app\model\MemberAccount;
|
|
|
use app\model\Order;
|
|
|
use app\model\OrderExpress;
|
|
@@ -39,7 +40,7 @@ class RefundController extends Curd
|
|
|
$order = $request->get('order', 'desc');
|
|
|
$type = $request->get('type', '');
|
|
|
$field = $field ?? 'order_return_addtimes';
|
|
|
- $where['order_return_category'] = '退款';
|
|
|
+ $where['order_return_category'] = ['in', ['退款', '会员退款']];
|
|
|
if (!empty($where['order_return_addtimes'])) {
|
|
|
$where['order_return_addtimes'][0] = strtotime($where['order_return_addtimes'][0]);
|
|
|
$where['order_return_addtimes'][1] = strtotime($where['order_return_addtimes'][1]);
|
|
@@ -175,7 +176,7 @@ class RefundController extends Curd
|
|
|
$orderId = $request->get('order_id');
|
|
|
$orderSheet = OrderSheet::with([
|
|
|
'member' => function ($query) {
|
|
|
- $query->select('member_id', 'member_mobile','join_member_role_id','member_is_owner','member_is_vip','member_is_partner','member_is_referrer');
|
|
|
+ $query->select('member_id', 'member_mobile', 'join_member_role_id', 'member_is_owner', 'member_is_vip', 'member_is_partner', 'member_is_referrer');
|
|
|
},
|
|
|
'goods' => function ($query) {
|
|
|
$query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price', 'goods_classify');
|
|
@@ -192,6 +193,7 @@ class RefundController extends Curd
|
|
|
$member = [];
|
|
|
$cert = [];
|
|
|
$memberInfo = [];
|
|
|
+ $sheets = [];
|
|
|
foreach ($orderSheet as &$item) {
|
|
|
if (isset($item['member']) && empty($member)) {
|
|
|
$member = $item['member'];
|
|
@@ -262,14 +264,47 @@ class RefundController extends Curd
|
|
|
$return->userName = SysUser::where('user_id', $returnRefundJson['user_id'])->value('user_name');
|
|
|
}
|
|
|
}
|
|
|
+ if (!empty($return->order_return_apply_json)) {
|
|
|
+ $returnApplyJson = json_decode($return->order_return_apply_json, true);
|
|
|
+ if (!empty($returnApplyJson['order_id'])) {
|
|
|
+ $sheets = OrderSheet::with([
|
|
|
+ 'goods' => function ($query) {
|
|
|
+ $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price', 'goods_classify');
|
|
|
+ },
|
|
|
+ 'sku' => function ($query) {
|
|
|
+ $query->select('goods_sku_id', 'join_sku_goods_id', 'goods_sku_specs_json', 'goods_sku_sales_price');
|
|
|
+ },
|
|
|
+ ])->whereIn('join_sheet_order_id', $returnApplyJson['order_id'])
|
|
|
+ ->select('order_sheet_id', 'join_sheet_goods_id', 'join_sheet_goods_sku_id', 'order_sheet_num', 'order_sheet_price', 'order_sheet_amount')
|
|
|
+ ->get()
|
|
|
+ ->toArray();
|
|
|
+ foreach ($sheets as $key => $sheetsItem) {
|
|
|
+ $sheets[$key]['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $sheetsItem['goods']['goods_cover'];
|
|
|
+ if (!empty($sheetsItem['sku'])) {
|
|
|
+ if (!empty($item['sku']['goods_sku_specs_json'])) {
|
|
|
+ $specsJson = json_decode($item['sku']['goods_sku_specs_json'], true);
|
|
|
+ $skuName = '';
|
|
|
+ foreach ($specsJson as $specsKey => $skuSpecs) {
|
|
|
+ if (is_array($skuSpecs)) {
|
|
|
+ $skuName = $skuName . ' ' . implode(' ', $skuSpecs) . ';';
|
|
|
+ } else {
|
|
|
+ $skuName = $skuName . ' ' . $skuSpecs . ';';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $sheets[$key]['sku']['goods_sku_title'] = rtrim($skuName, ';');
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
$express = OrderExpress::where('join_express_order_id', $orderId)->first();
|
|
|
- $payDetails = PayDetail::where('join_pay_order_id',$order->order_groupby)
|
|
|
- ->whereJsonContains('join_pay_object_json->order_id',$orderId)
|
|
|
- ->where('pay_status','SUCCESS')
|
|
|
+ $payDetails = PayDetail::where('join_pay_order_id', $order->order_groupby)
|
|
|
+ ->whereJsonContains('join_pay_object_json->order_id', $orderId)
|
|
|
+ ->where('pay_status', 'SUCCESS')
|
|
|
->where('pay_category', '<>', 'REFUND')
|
|
|
->get()
|
|
|
->toArray();
|
|
|
- if (count($payDetails) > 1){
|
|
|
+ if (count($payDetails) > 1) {
|
|
|
$order->pay_category = 'CONSTITUTE';
|
|
|
}
|
|
|
$payDetail = !empty($payDetails) && count($payDetails) > 0 ? $payDetails[0] : [];
|
|
@@ -289,6 +324,7 @@ class RefundController extends Curd
|
|
|
'order' => $order,
|
|
|
'refund' => $return,
|
|
|
'sheet' => $orderSheet,
|
|
|
+ 'sheets' => $sheets,
|
|
|
'express' => $express,
|
|
|
'payDetail' => json_decode(json_encode($payDetail)),
|
|
|
'payDetails' => json_decode(json_encode($payDetails))
|
|
@@ -422,7 +458,7 @@ class RefundController extends Curd
|
|
|
// 退款入收支
|
|
|
$params['orderId'] = $orderId;
|
|
|
$params['type'] = 'refund';
|
|
|
- Event::dispatch('statistics.inout.out',$params);
|
|
|
+ Event::dispatch('statistics.inout.out', $params);
|
|
|
|
|
|
return json_success('success');
|
|
|
} catch (BusinessException $e) {
|
|
@@ -675,4 +711,132 @@ class RefundController extends Curd
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Desc 充值退款详情
|
|
|
+ * @Author Gorden
|
|
|
+ * @Date 2024/10/16 11:40
|
|
|
+ *
|
|
|
+ * @param Request $request
|
|
|
+ * @return Response
|
|
|
+ */
|
|
|
+ public function rechargeSheet(Request $request)
|
|
|
+ {
|
|
|
+ $refundId = $request->get('return_id');
|
|
|
+ if (!$refundId) {
|
|
|
+ return json_fail("参数异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ $refund = OrderReturn::where('orders_return_id', $refundId)
|
|
|
+ ->first();
|
|
|
+ if (!empty($refund->order_return_apply_json)) {
|
|
|
+ $refund->order_return_apply_json = json_decode($refund->order_return_apply_json);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return json_success('', $refund);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @Desc 充值退款
|
|
|
+ * @Author Gorden
|
|
|
+ * @Date 2024/10/16 11:42
|
|
|
+ *
|
|
|
+ * @param Request $request
|
|
|
+ * @return Response
|
|
|
+ */
|
|
|
+ public function rechargeRefund(Request $request)
|
|
|
+ {
|
|
|
+ $memberId = $request->post('member_id');
|
|
|
+ $refundId = $request->post('return_id');
|
|
|
+ $password = $request->post('refund_password', '');
|
|
|
+ if (!$memberId) {
|
|
|
+ return json_fail('参数异常');
|
|
|
+ }
|
|
|
+ if ($password != '123456') {
|
|
|
+ return json_fail('支付密码错误');
|
|
|
+ }
|
|
|
+
|
|
|
+ $returnOrder = OrderReturn::where('orders_return_id', $refundId)
|
|
|
+ ->where('join_return_member_id', $memberId)
|
|
|
+ ->where('order_return_status', 'DOING')
|
|
|
+ ->where('order_return_category', '会员退款')
|
|
|
+ ->first();
|
|
|
+ if (!$returnOrder) {
|
|
|
+ return json_fail("退款数据异常");
|
|
|
+ }
|
|
|
+ $memberAccount = MemberAccount::where('join_account_member_id', $memberId)
|
|
|
+ ->where('member_account_classify', 'CASH')
|
|
|
+ ->where('member_account_status', 'ACTIVED')
|
|
|
+ ->first();
|
|
|
+ if (!$memberAccount) {
|
|
|
+ return json_fail('会员账户异常');
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ Db::beginTransaction();
|
|
|
+ $refundApplyJson = json_decode($returnOrder->order_return_apply_json, true);
|
|
|
+ $amount = $refundApplyJson['surplus'];
|
|
|
+ $addedAmount = $refundApplyJson['added'];
|
|
|
+ $refundApplyJson['amount'] = $amount;
|
|
|
+ $refundApplyJson['added_amount'] = $addedAmount;
|
|
|
+ $refundApplyJson['user_id'] = JwtToken::getCurrentId();
|
|
|
+ $refundApplyJson['datetime'] = date('Y-m-d H:i:s');
|
|
|
+ $returnOrder->order_return_refund_json = json_encode($refundApplyJson);
|
|
|
+ $returnOrder->order_return_status = 'DONE';
|
|
|
+ $returnOrder->order_return_remark = $request->post('refund_remark', '');
|
|
|
+ $returnOrder->save();
|
|
|
+ // 账户剩余
|
|
|
+ if ($memberAccount->member_account_surplus < $amount) {
|
|
|
+ throw new BusinessException("账户本金余额不足");
|
|
|
+ }
|
|
|
+ if ($memberAccount->member_account_added < $addedAmount) {
|
|
|
+ throw new BusinessException("账户增值余额不足");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 本金
|
|
|
+ $memberAccount->member_account_surplus = $memberAccount->member_account_surplus - $amount;
|
|
|
+ // 增值
|
|
|
+ $memberAccount->member_account_added = $memberAccount->member_account_added - $addedAmount;
|
|
|
+ $memberAccount->save();
|
|
|
+ // 删除会员身份
|
|
|
+ Member::where('member_id', $memberId)
|
|
|
+ ->update([
|
|
|
+ 'join_member_role_id' => '',
|
|
|
+ 'member_role_begintime' => '',
|
|
|
+ 'member_role_config_json' => '[]'
|
|
|
+ ]);
|
|
|
+ // 没用的优惠券失效
|
|
|
+ CouponDetail::where('join_coupon_detail_member_id', $memberId)
|
|
|
+ ->where('coupon_detail_status', '<>', 'USED')
|
|
|
+ ->whereJsonContains('coupon_detail_extend_json->gettype', 'ROLE')
|
|
|
+ ->update([
|
|
|
+ 'coupon_detail_status' => 'DISABLED'
|
|
|
+ ]);
|
|
|
+
|
|
|
+ // 产生一条退款记录 (pay_detail)
|
|
|
+ PayDetail::insert([
|
|
|
+ 'join_pay_member_id' => $memberId,
|
|
|
+ 'join_pay_order_id' => 'ROLE_REFUND',
|
|
|
+ 'join_pay_object_json' => '[]',
|
|
|
+ 'pay_status' => 'SUCCESS',
|
|
|
+ 'pay_category' => 'ROLE_REFUND',
|
|
|
+ 'pay_amount' => $amount + $addedAmount,
|
|
|
+ 'pay_paytimes' => date('Y-m-d H:i:s'),
|
|
|
+ 'pay_prepayid' => $memberId . '-CASH',
|
|
|
+ 'pay_addtimes' => time()
|
|
|
+ ]);
|
|
|
+
|
|
|
+ Db::commit();
|
|
|
+
|
|
|
+ return json_success('success');
|
|
|
+ } catch (BusinessException $e) {
|
|
|
+ Db::rollBack();
|
|
|
+
|
|
|
+ return json_fail($e->getMessage());
|
|
|
+ } catch (\Exception $e) {
|
|
|
+ Db::rollBack();
|
|
|
+
|
|
|
+ return json_fail('退款失败');
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|