'无纠纷', self::STATUS_WAITING => '待处理', self::STATUS_PROCESSING => '处理中', self::STATUS_FINISH => '处理完成', self::STATUS_CANCEL => '取消', ]; const RESULT_STATUS_SELLER_RESPLITY = 1; const RESULT_STATUS_BUYER_RESPLITY = 2; const RESULT_STATUS_EACH_RESPLITY = 3; const RESULT_STATUS_OVERRULE = 4; const RESULT_STATUS = [ self::RESULT_STATUS_SELLER_RESPLITY => '卖家责任', self::RESULT_STATUS_BUYER_RESPLITY => '买家责任', self::RESULT_STATUS_EACH_RESPLITY => '双方责任', self::RESULT_STATUS_OVERRULE => '驳回', ]; const PAY_DISPUTE_STATUS_WAITING = 1; const PAY_DISPUTE_STATUS_SUCCESS = 2; const PAY_DISPUTE_STATUS_FAIL = 3; const PAY_DISPUTE_STATUS = [ self::PAY_DISPUTE_STATUS_WAITING => '待处理', self::PAY_DISPUTE_STATUS_SUCCESS => '成功', self::PAY_DISPUTE_STATUS_FAIL => '失败', ]; const BUYER_DISPUTE_FEE_PAY_STATUS_NO = 1; const BUYER_DISPUTE_FEE_PAY_STATUS_YES = 2; const BUYER_DISPUTE_FEE_PAY_STATUS = [ self::BUYER_DISPUTE_FEE_PAY_STATUS_NO => '未支付', self::BUYER_DISPUTE_FEE_PAY_STATUS_YES => '已支付', ]; //纠纷管理员接单 public function disputeAdminAccept($dispute_id, $admin_uid, $is_change_admin = false): bool|int { try { $datetimeNow = Times::getNowDateTime(); DB::beginTransaction(); $resModel = $this->findItem($dispute_id); if (!$resModel) throw new ModelException('dispute not found'); if ($resModel->status != self::STATUS_WAITING) throw new ModelException('dispute status error'); if (!empty($resModel->admin_uid) && !$is_change_admin) throw new ModelException('already have admin'); $updateItem = [ 'id' => $resModel->id, 'status' => self::STATUS_PROCESSING, 'admin_uid' => $admin_uid, 'updated_at' => $datetimeNow, ]; $res = $this->updateItem($updateItem); if (!$res) throw new ModelException('update dispute status fail'); DB::commit(); Logs::SuccLog(__FUNCTION__, func_get_args()); return true; } catch (\Exception $e) { DB::rollBack(); Logs::ErrLog(__FUNCTION__ . ' ' . 'rollBack', $e, func_get_args()); return false; } } //创建纠纷 public function createDispute($post_order_id) { try { $datetimeNow = Times::getNowDateTime(); DB::beginTransaction(); $oCustomerUserPostOrderModel = new CustomerUserPostOrderModel(); $resCustomerUserPostOrderModel = $oCustomerUserPostOrderModel->findItem($post_order_id); if (!$resCustomerUserPostOrderModel) throw new \Exception('order not found'); if ($resCustomerUserPostOrderModel->pay_status != CustomerUserPostOrderModel::PAY_STATUS_PAID) throw new ModelException('order already in dispute'); if ($resCustomerUserPostOrderModel->dispute_status != CustomerUserPostOrderModel::DISPUTE_STATUS_UN_DISPUTE) throw new ModelException('order already in dispute'); //更新订单纠纷状态 $updateItem = [ 'id' => $resCustomerUserPostOrderModel->id, 'dispute_status' => CustomerUserPostOrderModel::DISPUTE_STATUS_WAITING, 'updated_at' => $datetimeNow, ]; $res = $oCustomerUserPostOrderModel->updateItem($updateItem); if (!$res) throw new ModelException('update order dispute status fail'); //创建纠纷 $bean = new CustomerUserPostOrderDisputeBean(); $bean->setBuyerUid($resCustomerUserPostOrderModel->buyer_uid); $bean->setSellerUid($resCustomerUserPostOrderModel->seller_uid); $bean->setPostOrderId($post_order_id); $bean->setStatus(self::STATUS_WAITING); $bean->setBuyerDisputeFeePayStatus(self::BUYER_DISPUTE_FEE_PAY_STATUS_NO); //@@计算纠纷申诉费用 $bean->setBuyerDisputeFeeAmount(5); //默认5u $bean->setCreatedAt($datetimeNow); $bean->setUpdatedAt($datetimeNow); $resModel = $this->addItem($bean->toArrayNotNull()); if (!$resModel) throw new ModelException('create dispute fail'); //创建聊天群组 $chat_id = $this->createChatGroupForDispute($resModel->id); if (!$chat_id) throw new ModelException('create chat group fail'); $updateItem = [ 'id' => $resModel->id, 'chat_group_id' => $chat_id, ]; $res = $this->updateItem($updateItem); if (!$res) throw new ModelException('update chat group id fail'); DB::commit(); Logs::SuccLog(__FUNCTION__, func_get_args()); return $resModel->id; } catch (\Exception $e) { DB::rollBack(); Logs::ErrLog(__FUNCTION__ . ' ' . 'rollBack', $e, func_get_args()); return false; } } //@@创建聊天群组用于纠纷 function createChatGroupForDispute($dispute_id) { return 1; } //纠纷判罚 public function disputePenalty($dispute_id, $result_status, $buyer_amount, $seller_amount, $admin_uid, $admin_remark): bool|int { try { if ( !in_array( $result_status, [self::RESULT_STATUS_SELLER_RESPLITY, self::RESULT_STATUS_BUYER_RESPLITY, self::RESULT_STATUS_EACH_RESPLITY, self::RESULT_STATUS_OVERRULE] ) ) throw new ModelException('result_status error'); $datetimeNow = Times::getNowDateTime(); DB::beginTransaction(); $resModel = $this->findItem($dispute_id); if (!$resModel) throw new ModelException('dispute not found'); if ($resModel->status != self::STATUS_PROCESSING) throw new ModelException('dispute status error'); if ($resModel->admin_uid != $admin_uid) throw new ModelException('admin_uid error'); $oCustomerUserPostOrderModel = new CustomerUserPostOrderModel(); $resCustomerUserPostOrderModel = $oCustomerUserPostOrderModel->findItem($resModel->post_order_id); if (!$resCustomerUserPostOrderModel) throw new ModelException('order not found'); if ($resCustomerUserPostOrderModel->dispute_status != CustomerUserPostOrderModel::DISPUTE_STATUS_PROCESSING) throw new ModelException('order dispute status error'); //更新订单状态 $updateItem = [ 'id' => $resCustomerUserPostOrderModel->id, 'dispute_status' => CustomerUserPostOrderModel::DISPUTE_STATUS_FINISH, 'dispute_result_status' => $result_status, 'updated_at' => $datetimeNow, ]; $res = $oCustomerUserPostOrderModel->updateItem($updateItem); if (!$res) throw new ModelException('update order dispute status fail'); //执行金额处理 $oCustomerWalletBalanceTransactionModel = new CustomerWalletBalanceTransactionModel(); $buyer_pay_status = self::PAY_DISPUTE_STATUS_SUCCESS; $seller_pay_status = self::PAY_DISPUTE_STATUS_SUCCESS; //执行买家 $resBuyerTrsId = $this->changeUserAmountDispute( $resCustomerUserPostOrderModel->buyer_uid, $resCustomerUserPostOrderModel->buyer_currency_code, $buyer_amount, $resModel->id, ); if (!$resBuyerTrsId) { $buyer_pay_status = self::PAY_DISPUTE_STATUS_FAIL; $this->changeUserAmountNotEnough($resCustomerUserPostOrderModel->buyer_uid, $resCustomerUserPostOrderModel->buyer_currency_code, $buyer_amount); } //执行卖家 $resSellerTrsId = $this->changeUserAmountDispute( $resCustomerUserPostOrderModel->seller_uid, $resCustomerUserPostOrderModel->seller_currency_code, $seller_amount, $resModel->id, ); if (!$resSellerTrsId) { $seller_pay_status = self::PAY_DISPUTE_STATUS_FAIL; $this->changeUserAmountNotEnough($resCustomerUserPostOrderModel->seller_uid, $resCustomerUserPostOrderModel->seller_currency_code, $seller_amount); } //更新纠纷 $updateItem = [ 'status' => self::STATUS_FINISH, 'result_status' => $result_status, 'admin_remark' => $admin_remark, 'updated_at' => $datetimeNow, 'buyer_pay_amount' => $buyer_amount, 'buyer_pay_dispute_status' => $buyer_pay_status, 'seller_pay_amount' => $seller_amount, 'seller_pay_dispute_status' => $seller_pay_status, ]; if ($buyer_pay_status == self::PAY_DISPUTE_STATUS_SUCCESS) $updateItem['buyer_pay_transaction_id'] = $resBuyerTrsId; if ($seller_pay_status == self::PAY_DISPUTE_STATUS_SUCCESS) $updateItem['seller_pay_transaction_id'] = $resSellerTrsId; $res = $this->updateItem($updateItem); if (!$res) throw new ModelException('update dispute status fail'); DB::commit(); Logs::SuccLog(__FUNCTION__, func_get_args()); return true; } catch (\Exception $e) { DB::rollBack(); Logs::ErrLog(__FUNCTION__ . ' ' . 'rollBack', $e, func_get_args()); return false; } } //@@金额不足处理 function changeUserAmountNotEnough($uid, $currency_code, $amount, $remark = '') { //@@冻结用户提款功能 //@@提交到定期扣款任务 } //纠纷金额处理 function changeUserAmountDispute($uid, $currency_code, $amount, $dispute_id, $remark = ''): bool|int { if ($amount == 0) return true; $oCustomerWalletBalanceTransactionModel = new CustomerWalletBalanceTransactionModel(); if ($amount > 0) { $res = $oCustomerWalletBalanceTransactionModel->typeDisputeAdd($uid, $currency_code, $amount, $dispute_id, $remark); } else { $res = $oCustomerWalletBalanceTransactionModel->typeDisputeSub($uid, $currency_code, $amount, $dispute_id, $remark); } return $res; } }