* @version : Huosdk 8.0 */ namespace huoRebate\logic; use huo\controller\member\MemCache; use huo\controller\wap\Option; use huo\logic\member\CpLogic; use huo\logic\member\MemberLogic; use huo\model\game\GameModel; use huo\model\member\MemberModel; use huo\model\member\MemGameModel; use huo\model\member\MgRoleModel; use huo\model\order\OrderModel; use huolib\constant\CommonConst; use huolib\constant\OptionConst; use huolib\constant\OrderConst; use huolib\constant\PaywayConst; use huolib\constant\WalletConst; use huolib\tool\StrUtils; use huoRebate\model\RebateOrderModel; use huoRebate\model\RebateOrderPayModel; class RebateLogic { /** * 获取未返利的订单 * * @param int $mem_id 玩家ID * @param int $app_id 应用ID * @param int $start_time 开始时间戳 * @param int $end_time 结束时间戳 * * @return array */ public function getNotRebateOrders($mem_id, $app_id = 0, $start_time = 0, $end_time = 0) { $_o_map['mem_id'] = $mem_id; if (!empty($app_id)) { $_o_map['app_id'] = $app_id; } if (!empty($start_time)) { $_o_map['create_time'] = ['gt', $start_time]; } if (!empty($end_time)) { $_o_map['create_time'] = ['lt', $end_time]; } $_o_map['status'] = OrderConst::PAY_STATUS_SUC; $_pay_orders = (new OrderModel())->where($_o_map)->column('order_id'); if (empty($_pay_orders)) { return []; } $_rop_orders = (new RebateOrderPayModel())->getOrdersByMemApp($mem_id, $app_id); $_orders = array_diff($_pay_orders, $_rop_orders); if (empty($_orders)) { return []; } return $_orders; } /** * 获取游戏金额 * * @param int $mem_id 玩家ID * * @param int $app_id 应用ID * * @param int $start_time 开始时间戳 * @param int $end_time 结束时间戳 * * @return array */ public function getGameAmount($mem_id, $app_id = 0, $start_time = 0, $end_time = 0) { $_orders = $this->getNotRebateOrders($mem_id); if (empty($_orders)) { return []; } $_map['order_id'] = ['in', $_orders]; if (!empty($app_id)) { $_map['app_id'] = $app_id; } if (!empty($start_time)) { $_map['create_time'] = ['gt', $start_time]; } if (!empty($end_time)) { $_map['create_time'] = ['lt', $end_time]; } if (!empty($app_id)) { $_rdata = (new OrderModel())->where($_map)->column('sum(amount) amount,id,app_id', 'app_id'); } else { $_rdata = (new OrderModel())->where($_map)->group('app_id')->column( 'sum(amount) amount,id,app_id', 'app_id' ); } if (empty($_rdata)) { return []; } $_rdata = array_values($_rdata); if (empty($_rdata[0]['app_id'])) { return []; } return $_rdata; } /** * 获取可返利的游戏ID * * @param int $mem_id 玩家ID * * @return array */ public function getGames($mem_id) { $_o_map['mem_id'] = $mem_id; $_o_map['status'] = OrderConst::PAY_STATUS_SUC; $_app_ids = (new OrderModel())->where($_o_map)->column('distinct(app_id)'); if (empty($_app_ids)) { return []; } return $_app_ids; } /** * 获取区服角色 * * @param int $mem_id 玩家ID * @param int $app_id 应用ID * * @return array */ public function getServerRoles($mem_id, $app_id) { $_map['mem_id'] = $mem_id; $_map['app_id'] = $app_id; $_mg_mem_ids = (new MemGameModel())->where($_map)->column('id'); if (empty($_mg_mem_ids)) { return []; } $_mgr_map['app_id'] = $app_id; $_mgr_map['mg_mem_id'] = ['in', $_mg_mem_ids]; $_sr_list = (new MgRoleModel())->getServerRoles($_mgr_map); if (empty($_sr_list)) { return []; } $_list = []; foreach ($_sr_list as $_k => $_v) { $_role_list = []; if (in_array($_v['server_id'], $_list)) { $_role_list['mg_mem_id'] = $_v['mg_mem_id']; $_role_list['role_id'] = $_v['role_id']; $_role_list['role_name'] = $_v['role_name']; $_list[$_v['server_id']]['role_list'][] = $_role_list; } else { $_list[$_v['server_id']]['server_id'] = $_v['server_id']; $_list[$_v['server_id']]['server_name'] = $_v['server_name']; $_role_list['mg_mem_id'] = $_v['mg_mem_id']; $_role_list['role_id'] = $_v['role_id']; $_role_list['role_name'] = $_v['role_name']; $_list[$_v['server_id']]['role_list'][] = $_role_list; } } return array_values($_list); } /** * 获取返利订单列表 * * @param array $where * @param string $page * @param string $order * @param array $field * * @return array */ public function getList($where = [], $page = '1,10', $order = 'create_time desc', $field = []) { $_map = $where; $_ro_model = new RebateOrderModel(); $_count = $_ro_model->where($where)->count(); if (empty($_count)) { $_rdata['count'] = 0; $_rdata['list'] = []; return $_rdata; } $_field = [ 'id' => 'id', 'app_id' => 'app_id', 'order_id' => 'order_id', 'amount' => 'amount', 'status' => 'status', '`status`' => 'status_txt', 'create_time' => 'apply_time', ]; if (!empty($field)) { $_field = array_merge($_field, $field); } $_order = $order; $_datas = $_ro_model ->with('game') ->field($_field) ->where($_map) ->order($_order) ->page($page) ->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } $_list = []; foreach ($_datas as $_k => $_v) { $_data = []; $_data['id'] = $_v['id']; $_data['order_id'] = $_v['order_id']; $_data['game_id'] = isset($_v['game']) ? $_v['game']['id'] : 0; $_data['gamename'] = isset($_v['game']) ? $_v['game']['name'] : ''; $_data['icon'] = isset($_v['game']) ? $_v['game']['icon'] : ''; $_data['amount'] = $_v['amount']; $_data['status'] = $_v['status']; $_data['status_txt'] = $_v['status_txt']; $_data['apply_time'] = $_v['apply_time']; $_list[] = $_data; } if (empty($_list)) { $_list = null; } $_rdata['count'] = $_count; $_rdata['list'] = $_list; return $_rdata; } /** * 获取返利详情 * * @param int $mem_id 玩家ID * @param int $ro_id 返利ID * * @return array */ public function getRoDetail($mem_id, $ro_id) { $_map['mem_id'] = $mem_id; $_map['ro_id'] = $ro_id; $_orders = (new RebateOrderPayModel())->where($_map)->column('order_id'); if (empty($_orders)) { $_rdata['count'] = 0; $_rdata['list'] = null; return $_rdata; } $_o_map['order_id'] = ['in', $_orders]; $_field = [ 'order_id' => 'order_id', 'amount' => 'amount', 'real_amount' => 'real_amount', 'create_time' => 'create_time', 'payway' => 'payway', ]; $_datas = (new OrderModel())->field($_field)->where($_o_map)->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } if (empty($_datas)) { $_rdata['count'] = 0; $_rdata['list'] = null; return $_rdata; } $_rdata['count'] = count($_datas); $_list = []; foreach ($_datas as $_k => $_v) { $_data['order_id'] = $_v['order_id']; $_data['amount'] = $_v['amount']; $_data['real_amount'] = $_v['real_amount']; $_data['create_time'] = $_v['create_time']; $_data['payname'] = PaywayConst::getMsg($_v['payway']); $_list[] = $_data; } $_rdata['list'] = $_list; return $_rdata; } /** * 后台获取返利订单列表 * * @param array $param * @param string $page * @param string $order * * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getAdminList($param = [], $page = '1,10', $order = 'create_time desc') { $_rdata = ['count' => 0, 'list' => [], 'sum' => 0, 'members' => []]; $_map = []; if (!empty($param['start_time']) && !empty($param['end_time'])) { $_map['create_time'] = [ 'between', [ strtotime($param['start_time']), CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time']) ] ]; } elseif (!empty($param['start_time'])) { $_map['create_time'] = ['egt', strtotime($param['start_time'])]; } elseif (!empty($param['end_time'])) { $_map['create_time'] = ['elt', CommonConst::CONST_DAY_SECONDS + strtotime($param['end_time'])]; } if (!empty($param['order_id'])) { $_map['order_id'] = $param['order_id']; } if (!empty($param['username'])) { $_mem_id = (new MemberLogic())->getIdByName($param['username']); if (empty($_mem_id)) { //没有玩家返回空数据 return $_rdata; } $_map['mem_id'] = $_mem_id; } if (!empty($param['status'])) { $_map['status'] = $param['status']; } if (!empty($param['cp'])) { /*获取CP下的所有游戏id*/ $_ids = (new GameModel())->where(['cp_id' => $param['cp']])->column('id'); if (empty($_ids)) { return $_rdata; } $_map['app_id'] = ['in', $_ids]; } if (!empty($param['app_id'])) { $_map['app_id'] = $param['app_id']; } if (!empty($param['mg_mem_id'])) { $_map['mg_mem_id'] = $param['mg_mem_id']; } $_ro_model = new RebateOrderModel(); $_count = $_ro_model->where($_map)->count(); if (empty($_count)) { return $_rdata; } $_sum = $_ro_model->where($_map)->value('sum(amount)'); $_field = [ 'id' => 'id', 'order_id' => 'order_id', 'app_id' => 'app_id', 'mem_id' => 'mem_id', 'server_name' => 'server_name', 'role_id' => 'role_id', 'role_name' => 'role_name', 'amount' => 'amount', 'status' => 'status', '`status`' => 'status_txt', 'create_time' => 'apply_time', 'remark' => 'remark', 'mg_mem_id' => 'mg_mem_id', ]; if (!empty($field)) { $_field = array_merge($_field, $field); } $_order = $order; $_datas = $_ro_model ->with('game') ->field($_field) ->where($_map) ->order($_order) ->page($page) ->select(); if (is_object($_datas)) { $_datas = $_datas->toArray(); } $_list = []; $_mem_ids = []; foreach ($_datas as $_k => $_v) { $_data = []; $_data['id'] = $_v['id']; $_data['order_id'] = $_v['order_id']; $_data['mem_id'] = $_v['mem_id']; array_push($_mem_ids, $_data['mem_id']); $_data['server_name'] = $_v['server_name']; $_data['role_id'] = $_v['role_id']; $_data['role_name'] = $_v['role_name']; //$_data['game_id'] = isset($_v['game']) ? $_v['game']['id'] : 0; $_data['gamename'] = isset($_v['game']) ? $_v['game']['name'] : ''; //$_data['icon'] = isset($_v['game']) ? $_v['game']['icon'] : ''; $_data['cp_id'] = isset($_v['game']) ? $_v['game']['cp_id'] : 0; $_data['amount'] = $_v['amount']; $_data['status'] = $_v['status']; $_data['status_txt'] = $_v['status_txt']; $_data['apply_time'] = $_v['apply_time']; $_data['remark'] = $_v['remark']; $_data['mg_mem_id'] = $_v['mg_mem_id']; $_list[] = $_data; } if (empty($_list)) { $_list = null; } $_members = []; if (!empty($_mem_ids)) { $_mem_ids = array_unique($_mem_ids); $_members = (new MemberModel())->where(['id' => ['in', $_mem_ids]])->column('username', 'id'); } $_rdata['count'] = $_count; $_rdata['list'] = $_list; $_rdata['members'] = $_members; $_rdata['sum'] = $_sum; return $_rdata; } /** * 添加返利 * * @param $mem_id * @param $amount * @param array $orders 订单数组 * @param array $param 参数 * * @return bool */ public function addRebate($mem_id, $amount, $orders = [], $param = []) { $_agent_id = MemCache::ins()->getAgentIdByMemId($mem_id); $_ro_data['order_id'] = StrUtils::genOrderId( $_agent_id, $_agent_id, $mem_id, WalletConst::WALLET_ORDER_PREFIX_REBATE ); $_ro_data['mem_id'] = $mem_id; $_ro_data['mobile'] = $param['mobile']; $_ro_data['mg_mem_id'] = $param['mg_mem_id']; $_ro_data['agent_id'] = $_agent_id; $_ro_data['app_id'] = $param['app_id']; $_ro_data['amount'] = $amount; $_ro_data['status'] = OrderConst::REBATE_STATUS_NOT; $_ro_data['server_id'] = $param['server_id']; $_ro_data['server_name'] = $param['server_name']; $_ro_data['role_id'] = $param['role_id']; $_ro_data['role_name'] = $param['role_name']; $_ro_data['start_time'] = $param['start_time']; $_ro_data['end_time'] = $param['end_time']; $_ro_data['remark'] = $param['remark']; $_ro_id = (new RebateOrderModel())->add($_ro_data); if (false == $_ro_id) { return false; } $_rop_datas = []; foreach ($orders as $_order_id) { $_rop_data = []; $_rop_data['ro_id'] = $_ro_id; $_rop_data['mem_id'] = $mem_id; $_rop_data['app_id'] = $param['app_id'];; $_rop_data['order_id'] = $_order_id; $_rop_data['status'] = OrderConst::REBATE_STATUS_NOT; $_rop_data['create_time'] = time(); $_rop_data['update_time'] = $_rop_data['create_time']; $_rop_datas[] = $_rop_data; } $_rs = (new RebateOrderPayModel())->insertAll($_rop_datas); if (false == $_rs) { return false; } return true; } /** * 订单审核 * * @param $id * @param $status * * @param string $remark * * @return bool * @throws \think\exception\PDOException */ public function setStatus($id, $status, $remark = '') { $_ro_data['status'] = $status; if (!empty($remark)) { $_ro_data['remark'] = $remark; } $_ro_data['update_time'] = time(); $_rop_data['status'] = $status; $_rop_data['update_time'] = time(); $_ro_map = ['id' => $id]; $_rop_map = ['ro_id' => $id]; // 启动事务 $_ro_model = new RebateOrderModel(); $_rop_model = new RebateOrderPayModel(); $_ro_model->startTrans(); try { $_ro_model->update($_ro_data, $_ro_map); $_rop_model->update($_rop_data, $_rop_map); // 提交事务 $_ro_model->commit(); return true; } catch (\Exception $e) { // 回滚事务 $_ro_model->rollback(); return false; } } /*** * 获取返利详情 * * @param $ro_id * * @return bool|array * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getRoInfo($ro_id) { $_map = ['id' => $ro_id]; $_data = (new RebateOrderModel())->with('game') ->where($_map) ->find(); if (is_object($_data)) { $_data = $_data->toArray(); } if (empty($_data)) { return false; } $_ro_info = []; $_ro_info['id'] = $_data['id']; $_ro_info['order_id'] = $_data['order_id']; $_ro_info['mem_id'] = $_data['mem_id']; $_ro_info['server_name'] = $_data['server_name']; $_ro_info['role_id'] = $_data['role_id']; $_ro_info['role_name'] = $_data['role_name']; $_ro_info['gamename'] = isset($_data['game']) ? $_data['game']['name'] : ''; $_ro_info['cp_id'] = isset($_data['game']) ? $_data['game']['cp_id'] : 0; $_ro_info['amount'] = $_data['amount']; $_ro_info['status'] = $_data['status']; $_ro_info['apply_time'] = $_data['create_time']; $_ro_info['remark'] = $_data['remark']; $_ro_info['mg_mem_id'] = $_data['mg_mem_id']; $_ro_info['cp'] = ''; $_ro_info['mem'] = ''; if (!empty($_ro_info['cp_id'])) { $_ro_info['cp'] = (new CpLogic())->getCpNameById($_ro_info['cp_id']); } if (!empty($_ro_info['mem_id'])) { $_ro_info['mem'] = (new MemberLogic())->getNameById($_ro_info['mem_id']); } $_ro_list = $this->getRoDetail($_ro_info['mem_id'], $_ro_info['id']); return ['ro_info' => $_ro_info, 'ro_list' => $_ro_list]; } /** * 获取最小值设定 * return int */ public function getMinSet() { $_setting_name = OptionConst::REBATE_MIN_SET; $_item = (new Option())->getOptionData($_setting_name, 1, true); if (!empty($_item['option_value'])) { return $_item['option_value']; } return 0; } public function setMinSet($setting_name, $_option_vale) { $_res = (new Option())->saveOptionData($setting_name, json_encode($_option_vale)); return $_res; } }