model = new PayDetail(); } public function select(Request $request): Response { [$where, $format, $limit, $field, $order] = $this->selectInput($request); $order = $request->get('order', 'desc'); $field = $field ?? 'pay_addtimes'; // $where['pay_status'] = 'SUCCESS'; if ($where['pay_category'] == 'OTHER') { $where['pay_status'] = 'SUCCESS'; $where['pay_category'] = ['<>', 'RECHARGE']; } elseif ($where['pay_category'] == 'RECHARGE') { $where['pay_category'] = ['in', ['RECHARGE', 'VIP']]; } if (!empty($where['pay_addtimes'])) { $where['pay_addtimes'][0] = !empty($where['pay_addtimes'][0]) ? strtotime($where['pay_addtimes'][0]) : ''; $where['pay_addtimes'][1] = !empty($where['pay_addtimes'][1]) ? strtotime($where['pay_addtimes'][1]) : ''; } if (!empty($request->get('premises_id'))) { $payIds = PayDetail::whereJsonContains('pay_extend_json->remark->premises_id', intval($request->get('premises_id'))) ->pluck('pay_id') ->toArray(); $where['pay_id'] = ''; if (!empty($payIds)) { $where['pay_id'] = ['in', $payIds]; } } // else if ($where['pay_category'] == 'RECHARGE') { // $where['pay_status'] = 'SUCCESS'; // $where['pay_category'] = 'RECHARGE'; // $where['pay_prepayid'] = ['in','WXPAY,ALIPAY']; // } $query = $this->doSelect($where, $field, $order, $request->get()); return $this->doFormat($query, $format, $limit); } protected function doSelect(array $where, string $field = null, string $order = 'desc', $params = []) { $model = $this->model->with(['member', 'cert', 'memberAccount']); foreach ($where as $column => $value) { if (is_array($value)) { if ($value[0] === 'like' || $value[0] === 'not like') { $model = $model->where($column, $value[0], "%$value[1]%"); } elseif (in_array($value[0], ['>', '=', '<', '<>'])) { $model = $model->where($column, $value[0], $value[1]); } elseif ($value[0] == 'in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereIn($column, $valArr); } elseif ($value[0] == 'not in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereNotIn($column, $valArr); } elseif ($value[0] == 'null') { $model = $model->whereNull($column); } elseif ($value[0] == 'not null') { $model = $model->whereNotNull($column); } elseif ($value[0] !== '' || $value[1] !== '') { $model = $model->whereBetween($column, $value); } } else { $model = $model->where($column, $value); } } if (empty($params['type'])) { $model = $model->where(function ($query) { $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY', 'OFFLINE', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY']) ->orWhere('pay_prepayid', 'like', '%CASH%') ->orWhere('pay_prepayid', 'like', '%WELFARE%'); }); } else { if ($params['type'] == 'NORMAL') { $model = $model->where(function ($query) { $query->whereIn('pay_prepayid', ['ALIPAY', 'WXPAY', 'OFFLINE_WXPAY', 'OFFLINE_ALIPAY', 'MONEY']) ->orWhere('pay_prepayid', 'like', '%CASH%'); }); } else if ($params['type'] == 'VIP') { $model = $model->where(function ($query) { $query->orWhere('pay_category', 'VIP'); }); } else { $model = $model->where(function ($query) { $query->orWhere('pay_prepayid', 'like', '%WELFARE%'); }); } } if (!empty($params['order_type'])) { if ($params['order_type'] == 'COMBINE') { $model = $model->where('join_pay_order_id', 'COMBINE'); } elseif ($params['order_type'] == 'PARTNER') { $model = $model->where('join_pay_order_id', 'PARTNER'); } elseif ($params['order_type'] == 'VIP') { $model = $model->where('pay_category', 'VIP'); } elseif ($params['order_type'] == 'RECHARGE') { $model = $model->where('join_pay_order_id', '<>', 'PARTNER') ->where('join_pay_order_id', '<>', 'COMBINE') ->where('pay_category', '<>', 'VIP'); } } if ($field) { $model = $model->orderBy($field, $order); } return $model; } public function selectWelfare(Request $request): Response { [$where, $format, $limit, $field, $order] = $this->selectInput($request); $order = $request->get('order', 'desc'); $field = $field ?? 'pay_addtimes'; // $where['pay_status'] = 'SUCCESS'; if ($where['pay_category'] == 'OTHER') { $where['pay_status'] = 'SUCCESS'; $where['pay_category'] = ['<>', 'RECHARGE']; } // else if ($where['pay_category'] == 'RECHARGE') { // $where['pay_status'] = 'SUCCESS'; // $where['pay_category'] = 'RECHARGE'; // $where['pay_prepayid'] = ['in','WXPAY,ALIPAY']; // } $query = $this->doSelectWelfare($where, $field, $order); return $this->doFormat($query, $format, $limit); } protected function doSelectWelfare(array $where, string $field = null, string $order = 'desc') { $model = $this->model->with(['member', 'cert', 'memberAccount']); foreach ($where as $column => $value) { if (is_array($value)) { if ($value[0] === 'like' || $value[0] === 'not like') { $model = $model->where($column, $value[0], "%$value[1]%"); } elseif (in_array($value[0], ['>', '=', '<', '<>'])) { $model = $model->where($column, $value[0], $value[1]); } elseif ($value[0] == 'in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereIn($column, $valArr); } elseif ($value[0] == 'not in' && !empty($value[1])) { $valArr = $value[1]; if (is_string($value[1])) { $valArr = explode(",", trim($value[1])); } $model = $model->whereNotIn($column, $valArr); } elseif ($value[0] == 'null') { $model = $model->whereNull($column); } elseif ($value[0] == 'not null') { $model = $model->whereNotNull($column); } elseif ($value[0] !== '' || $value[1] !== '') { $model = $model->whereBetween($column, $value); } } else { $model = $model->where($column, $value); } } $model = $model->where(function ($query) { $query->Where('pay_prepayid', 'like', '%WELFARE%'); }); if ($field) { $model = $model->orderBy($field, $order); } return $model; } public function afterQuery($items) { foreach ($items as &$item) { $prepayId = explode('-', $item->pay_prepayid); $item->order_classify = $item->pay_category; if (count($prepayId) > 1) { $item->pay_prepayid = $prepayId[1]; } $item->type = 'NORMAL'; if (isset($prepayId[1]) && $prepayId[1] == 'WELFARE') { $item->type = 'WELFARE'; } else if ($item->pay_category == 'VIP') { $item->type = 'VIP'; } $memberAccount = []; if (!empty($item->memberAccount)) { foreach ($item->memberAccount as $account) { $memberAccount[strtolower($account->member_account_classify)] = $account; } $item->memberAccount = $memberAccount; } if (!empty($item->pay_extend_json)) { $payExtendJson = json_decode($item->pay_extend_json, true); if (isset($payExtendJson['remark'])) { $item->service = $payExtendJson['remark']['service'] ?? ''; $item->business = $payExtendJson['remark']['business'] ?? ''; $item->premises_id = $payExtendJson['remark']['premises_id'] ?? ''; $item->premises_name = $payExtendJson['remark']['premises_name'] ?? ''; } } $item->to_account_amount = $item->pay_amount; if (in_array($item['join_pay_order_id'], ['COMBINE', 'PARTNER']) && !empty($item->join_pay_object_json)) { $item->order_classify = $item['join_pay_order_id']; $payObjectJson = json_decode($item->join_pay_object_json, true); if (isset($payObjectJson['recharge_order_id'])) { $payDetails = PayDetail::whereJsonContains('join_pay_object_json->order_id', $payObjectJson['recharge_order_id']) ->where('pay_status', 'SUCCESS') ->get() ->toArray(); if (count($payDetails) > 1) { $item->pay_prepayid = 'BY_STAGES'; } else if (count($payDetails) == 1) { $item->pay_prepayid = $payDetails[0]['pay_prepayid']; } $item->pay_amount = PayDetail::whereJsonContains('join_pay_object_json->order_id', $payObjectJson['recharge_order_id']) ->where('pay_status', 'SUCCESS') ->sum('pay_amount'); $orderStatus = OrderSheet::where('join_sheet_order_id', $payObjectJson['recharge_order_id'])->value('order_sheet_status'); if ($orderStatus == 'BEING') { $item->pay_status = 'BEING'; } } // $payDetail = PayDetail::where('join_pay_member_id', $item->join_pay_member_id) // ->where('pay_category', $item['join_pay_order_id']) // ->select('pay_amount', 'join_pay_object_json') // ->first(); // $item->pay_amount = $payDetail->pay_amount ?? 0; // if (!empty($payDetail->join_pay_object_json)) { // $payObjectJson = json_decode($payDetail->join_pay_object_json, true); // if (isset($payObjectJson['order_id'])) { // $orderStatus = OrderSheet::where('join_sheet_order_id', $payObjectJson['order_id'])->value('order_sheet_status'); // if ($orderStatus == 'BEING') { // $item->pay_status = 'BEING'; // } // } // } } if ($item->pay_category == 'VIP') { $payObjectJson = json_decode($item->join_pay_object_json, true); if (isset($payObjectJson['order_id'])) { $orderStatus = OrderSheet::where('join_sheet_order_id', $payObjectJson['order_id'])->value('order_sheet_status'); if ($orderStatus == 'BEING') { $item->pay_status = 'BEING'; } } } } return $items; } /** * @Desc 产品订单 * @Author Gorden * @Date 2024/6/5 10:10 * * @param Request $request * @return Response */ public function goodsOrder(Request $request) { $orderId = $request->get('order_id', ''); $memberId = $request->get('member_id', ''); if (!$orderId || !$memberId) { return json_fail('参数异常'); } $orderSheet = OrderSheet::with([ 'order' => function ($query) { $query->select('order_id', 'order_amount_total', 'order_amount_pay', 'order_is_complete', 'order_category', 'order_status_system', 'order_status_payment', 'order_status_storage', 'order_addtimes'); }, 'goods' => function ($query) { $query->select('goods_id', 'goods_name', 'goods_status', 'goods_market_price', 'goods_sales_price', 'goods_addtimes'); }, 'sku' => function ($query) { $query->select('goods_sku_id', 'goods_sku_specs_json', 'goods_sku_market_price', 'goods_sku_sales_price'); } ])->where('join_sheet_order_id', $orderId) ->get() ->toArray(); $member = Member::with([ 'cert' => function ($query) { $query->select('join_cert_member_id', 'member_cert_name'); }, 'info' => function ($query) { $query->select('join_info_member_id', 'member_info_nickname', 'member_info_headimg'); } ])->where('member_id', $memberId) ->select('member_id', 'member_mobile', 'join_member_role_id', 'member_is_owner', 'member_is_vip', 'member_is_partner', 'member_is_referrer') ->first(); if (!$member){ return json_fail('数据异常'); } $member = $member->toArray(); $certName = $member['cert']['member_cert_name'] ?? ''; $nickname = $member['info']['member_info_nickname'] ?? ''; $mobile = $member['member_mobile'] ?? ''; $member['member_name'] = MemberService::getMemberCertName($mobile, $certName, $nickname); $member['info']['member_info_headimg'] = MemberService::getAvatarUrl($member['info']['member_info_headimg'] ?? ''); $member['level'] = MemberService::getRoleName($member['join_member_role_id']); $payDetails = PayDetail::whereJsonContains('join_pay_object_json->order_id', $orderId) ->where('pay_status', 'SUCCESS') ->select('pay_status', 'pay_amount', 'pay_paytimes', 'pay_prepayid') ->get(); $data = [ 'payDetails' => $payDetails, 'goodsOrder' => $orderSheet, 'member' => $member ]; return json_success('', $data); } /** * 余额账户充值 */ public function insertRecharge(Request $request): Response { if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) { return json_fail($this->validateClass->getError()); } $password = $request->post('recharge_password', ''); if (!$password || $password != '123456') { return json_fail('充值密码错误'); } Db::beginTransaction(); try { $data = $this->insertRechargeInput($request); $data['pay_prepayid'] = $request->post('pay_prepayid', ''); unset($data['orderId']); $payDetailId = $this->doInsert($data); (new RechargeController)->disposePaySuccess($payDetailId); Db::commit(); } catch (BusinessException $customException) { Db::rollBack(); return json_fail($customException->getMessage()); } catch (\Exception $e) { Db::rollBack(); dump($e->getMessage()); return json_fail('数据写入失败11'); } return json_success('success'); } /** * 余额账户赠送 */ public function insertGive(Request $request): Response { if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) { return json_fail($this->validateClass->getError()); } $password = $request->post('recharge_password', ''); if (!$password || $password != '123456') { return json_fail('赠送密码错误'); } Db::beginTransaction(); try { $data = $this->insertGiveInput($request); $data['pay_prepayid'] = $data['join_pay_member_id'] . '-CASH'; // 金额累加到福利账户 $memberAccount = MemberAccount::where('join_account_member_id', $data['join_pay_member_id'])->where('member_account_classify', 'CASH')->first(); $memberAccount->member_account_income = $memberAccount->member_account_income + $data['pay_amount']; $memberAccount->member_account_surplus = $memberAccount->member_account_surplus + $data['pay_amount']; $memberAccount->save(); $data['pay_amount'] = 0; $this->doInsert($data); Db::commit(); } catch (BusinessException $customException) { Db::rollBack(); return json_fail($customException->getMessage()); } catch (\Exception $e) { Db::rollBack(); dump($e->getMessage()); return json_fail('数据写入失败11'); } return json_success('success'); } /** * 福利账户充值 */ public function insertRechargeWelfare(Request $request): Response { if ($this->validate && !$this->validateClass->scene('add')->check($request->post())) { return json_fail($this->validateClass->getError()); } $password = $request->post('recharge_password', ''); if (!$password || $password != '123456') { return json_fail('充值密码错误'); } Db::beginTransaction(); try { $data = $this->insertRechargeInput($request, 'WELFARE'); $orderId = $data['orderId']; unset($data['orderId']); $data['pay_prepayid'] = $data['join_pay_member_id'] . '-WELFARE'; $memberAccount = MemberAccount::where('join_account_member_id', $data['join_pay_member_id']) ->where('member_account_classify', 'WELFARE') ->first(); if ($memberAccount->member_account_status != 'ACTIVED') { throw new BusinessException('福利账户未开启'); } $this->doInsert($data); // 金额累加到福利账户 $memberAccount->member_account_income = $memberAccount->member_account_income + $data['pay_amount']; $memberAccount->member_account_surplus = $memberAccount->member_account_surplus + $data['pay_amount']; $memberAccount->save(); Db::commit(); // 入收支明细表 $params['orderId'] = $orderId; $params['inout_category'] = '会员充值订单收入'; Event::dispatch('statistics.inout.in', $params); } catch (BusinessException $customException) { Db::rollBack(); return json_fail($customException->getMessage()); } catch (\Exception $e) { Db::rollBack(); dump($e->getMessage()); return json_fail('数据写入失败11'); } return json_success('success'); } /** * @Desc * @Author Gorden * @Date 2024/6/5 13:39 * * @param Request $request * @return array * @throws BusinessException */ protected function insertRechargeInput(Request $request, $type = "CASH"): array { $params = $request->post(); $data = $this->inputFilter($params); $goods = Goods::find($params['goods_id']); $extendJson = []; // if (!$params['is_custom']) { // Db::beginTransaction(); try { if (!$params['is_custom']) { $data['pay_amount'] = $goods->goods_sales_price; } $orderId = "OD" . date('ymdHi') . random_string(4, 'up'); $orderGroupId = "OD" . date('ymdHi') . random_string(4, 'up'); $orderData = [ 'order_id' => $orderId, 'order_groupby' => $orderGroupId, 'join_order_member_id' => $data['join_pay_member_id'], 'order_name' => date('Y-m-d H:i:s') . '-订单', 'order_amount_total' => $data['pay_amount'], 'order_amount_pay' => $data['pay_amount'], 'order_amount_json' => '{"tax": 0, "freight": 0}', 'order_status_payment' => 'SUCCESS', 'order_classify' => 'RECHARGE', 'order_category' => 'RECHARGE', 'order_status_system' => 'PAYING', 'order_status_storage' => 'PENDING', 'order_addtimes' => time() ]; if ($type == 'WELFARE') { $orderData['order_is_complete'] = 'Y'; $orderData['order_status_system'] = 'DONE'; $orderData['order_status_storage'] = 'DONE'; } $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first(); Order::insert($orderData); $orderSheetData = [ 'join_sheet_member_id' => $data['join_pay_member_id'], 'join_sheet_order_id' => $orderId, 'join_sheet_goods_id' => $params['goods_id'], 'join_sheet_goods_sku_id' => $sku ? $sku->goods_sku_id : 0, 'order_sheet_status' => 'DONE', 'order_sheet_category' => 'RECHARGE', 'order_sheet_num' => 1, 'order_sheet_price' => $data['pay_amount'], 'order_sheet_amount' => $data['pay_amount'], 'order_sheet_pay' => $data['pay_amount'], 'order_sheet_addtimes' => time() ]; OrderSheet::insert($orderSheetData); // Db::commit(); } catch (\Exception $e) { // Db::rollBack(); throw new BusinessException("数据错误"); } $data['orderId'] = $orderId; $data['join_pay_order_id'] = $orderGroupId; $data['join_pay_object_json'] = json_encode(['order_id' => $orderId]); $rate = 0; if (!empty($goods->goods_attribute_json) && $type == "CASH") { $attributeJson = json_decode($goods->goods_attribute_json, true); if (isset($attributeJson['added'])) { $rate = $attributeJson['added'] ? $attributeJson['added']['nbr'] : 0; } } $extendJson['added_amount'] = number_format($data['pay_amount'] * $rate, 2, '.', ''); $extendJson['added_rate'] = $rate; // } else { // // $extendJson['notify'] = 'success'; // $extendJson['is_custom'] = $params['is_custom']; // } $data['pay_extend_json'] = json_encode($extendJson); $data['pay_paytimes'] = date('Y-m-d H:i:s', strtotime($data['pay_paytimes'])); $data['pay_prepayid'] = 0; return $data; } /** * @Desc * @Author Gorden * @Date 2024/6/5 13:39 * * @param Request $request * @return array * @throws BusinessException */ protected function insertGiveInput(Request $request, $type = "CASH"): array { $params = $request->post(); $data = $this->inputFilter($params); $goods = Goods::find($params['goods_id']); $extendJson = []; // if (!$params['is_custom']) { Db::beginTransaction(); try { if (!$params['is_custom']) { $data['pay_amount'] = $goods->goods_sales_price; } // $orderId = "OD" . date('ymdHi') . random_string(4, 'up'); // $orderGroupId = "OD" . date('ymdHi') . random_string(4, 'up'); // $orderData = [ // 'order_id' => $orderId, // 'order_groupby' => $orderGroupId, // 'join_order_member_id' => $data['join_pay_member_id'], // 'order_name' => date('Y-m-d H:i:s') . '-订单', // 'order_amount_total' => $data['pay_amount'], // 'order_amount_pay' => $data['pay_amount'], // 'order_amount_json' => '{"tax": 0, "freight": 0}', // 'order_status_payment' => 'SUCCESS', // 'order_classify' => 'RECHARGE', // 'order_category' => 'RECHARGE', // 'order_status_system' => 'PAYING', // 'order_status_storage' => 'PENDING', // 'order_addtimes' => time() // ]; // if ($type == 'WELFARE') { // $orderData['order_is_complete'] = 'Y'; // $orderData['order_status_system'] = 'DONE'; // $orderData['order_status_storage'] = 'DONE'; // } // $sku = GoodsSku::where('join_sku_goods_id', $params['goods_id'])->first(); // // Order::insert($orderData); // $orderSheetData = [ // 'join_sheet_member_id' => $data['join_pay_member_id'], // 'join_sheet_order_id' => $orderId, // 'join_sheet_goods_id' => $params['goods_id'], // 'join_sheet_goods_sku_id' => $sku ? $sku->goods_sku_id : 0, // 'order_sheet_status' => 'DONE', // 'order_sheet_category' => 'RECHARGE', // 'order_sheet_num' => 1, // 'order_sheet_price' => $data['pay_amount'], // 'order_sheet_amount' => $data['pay_amount'], // 'order_sheet_pay' => $data['pay_amount'], // 'order_sheet_addtimes' => time() // ]; // // OrderSheet::insert($orderSheetData); Db::commit(); } catch (\Exception $e) { dump($e->getMessage()); Db::rollBack(); throw new BusinessException("数据错误"); } $data['join_pay_order_id'] = "SYSTEM"; $data['join_pay_object_json'] = json_encode(['order_id' => 'SYSTEM']); $rate = 0; $extendJson['added_amount'] = $data['pay_amount']; $extendJson['added_rate'] = $rate; $data['pay_extend_json'] = json_encode($extendJson); $data['pay_paytimes'] = date('Y-m-d H:i:s', strtotime($data['pay_paytimes'])); $data['pay_prepayid'] = 0; return $data; } /** * @Desc 加备注-门店、服务人员、业务人员 * @Author Gorden * @Date 2024/8/29 16:14 * * @param Request $request * @return Response */ public function remark(Request $request) { $payId = $request->post('pay_id', ''); if (!$payId) { return json_fail('参数异常'); } $payDetail = PayDetail::where('pay_id', $payId)->first(); if (!$payDetail) { return json_fail("数据异常"); } try { $data = [ 'premises_id' => $request->post('premises_id', ''), 'premises_name' => $request->post('premises_name', ''), 'business' => $request->post('business', ''), 'service' => $request->post('service', '') ]; $payExtendJson = []; if (!empty($payDetail->pay_extend_json)) { $payExtendJson = json_decode($payDetail->pay_extend_json, true); } $payExtendJson['remark'] = $data; $payDetail->pay_extend_json = json_encode($payExtendJson, JSON_UNESCAPED_UNICODE); $payDetail->save(); return json_success('success'); } catch (\Exception $e) { return json_fail('备注保存失败'); } } }