function userActionUpdate($user_code, $action_code, $action_value) { // 取行为规则 $action = M(TB_DET_USER_ACTION_CONFIG)->where("action_code = {$action_code}")->select(); for ($i = 0; $i < count($action); $i++) { // 可变更新值取对应的实际值 if (!$action[$i]['update_value']) { $condition = $action[$i]['code_column'] . ' = ' . $action_value; $value = M($action[$i]['table_name'])->where("{$condition}")->find(); $action[$i]['update_value'] = $value[$action[$i]['value_column']]; } // 计算需要更新的值 $data[$action[$i]['update_type']] = $action[$i]['update_value'] * $action[$i]['update_logic']; } // 更新用户账户信息表中的金币积分等级 if (userAccoutUpdate($user_code, $data)) { // 写日志必要字段赋值 $log['user_code'] = $user_code; // 用户编码 $log['action_time'] = date('Y-m-d H:i:s'); // 行为发生时间 $log['action_code'] = $action_code; // 行为编码 $log['action_value'] = $action_value; // 行为值 // 对需要写日志的行为做处理 for ($i = 0; $i < count($action); $i++) { if ($action[$i]['write_log'] == 1) { $condition = $action[$i]['code_column'] . ' = ' . $action_value; $value = M($action[$i]['table_name'])->where("{$condition}")->find(); $log['action_name'] = $value[$action[$i]['desc_column']]; // 行为名称 $log['action_type'] = $action[$i]['update_type']; // 行为类型 $log['change_value'] = $action[$i]['update_value'] * $action[$i]['update_logic']; // 数据写入日志表 if (!insertTable(TB_BAS_USER_ACTION_LOG, $log)) { return false; } } } // 判断是否需要更新用户等级 $userAccout = M(TB_BAS_USER_ACCOUT)->where("user_code = '{$user_code}'")->find(); // 取当前用户账户信息 $condition = "score_lower_value <= " . $userAccout['user_score'] . " and score_upper_value >= " . $userAccout['user_score']; $level = M(TB_DET_USER_LEVEL)->where($condition)->find(); // 取需要的积分规则 // 如果计算出的最新等级与之前等级不同,更新用户最新等级 if ($level['user_level_value'] != $userAccout['user_level']) { $accout['user_level'] = $level['user_level_value']; if (!userAccoutAlter($user_code, $accout)) { return false; } } } else { return false; } // 所有更新顺利完成返回true return true; }
function api_user_accout_update() { $action = func_get_args()[0]['action']; // 取参数:用户行为 $times_type = func_get_args()[0]['times_type']; // 取参数:次数类型 $times_type = $_POST['times_type']; $action = json_decode($_POST['action'], true); // 用户行为信息 $action['action_time'] = date('Y-m-d H:i:s'); // 行为发生时间 $user_code = $action['user_code']; $action_code = $action['action_code']; if ($times_type) { $times_type = $times_type . '_times'; } // 取行为编码对应行为规则信息合并到用户行为信息数据中 $actionConfig = M(TB_DET_USER_ACTION_CONFIG)->where("action_code = '{$action_code}'")->find(); $action = array_merge($actionConfig, $action); // 生成行为名称$action['action_name'] $condition = $action['action_column'] . '=' . $action['action_value']; $dtAction = M($action['action_table'])->where("{$condition}")->find(); $target = $action['action_target']; $action['action_name'] = $dtAction[$target]; // 取两个行为日志表表结构 $keyBasScoreActionLog = M(TB_BAS_SCORE_ACTION_LOG)->getDbFields(); $keyBasCoinsActionLog = M(TB_BAS_COINS_ACTION_LOG)->getDbFields(); // 生成两个行为日志表对应字段的数据 $action_score = arrayExtract($action, $keyBasScoreActionLog); $action_coins = arrayExtract($action, $keyBasCoinsActionLog); // 计算需要更新的用户积分值和金币值 $accout_add['user_score'] = $action['score_value'] * $action['score_logic']; $accout_add['user_coins'] = $action['coins_value'] * $action['coins_logic']; if ($times_type) { $accout_add["{$times_type}"] = 1; } // 更新用户账户信息表中的金币积分等级 if (userAccoutUpdate($user_code, $accout_add)) { if ($action_score['score_value']) { $res_sc = userActionAdd($action_score, 'score'); // 用户积分累计日志 // 如果更新过用户积分,再判断是否需要更新用户等级 $userAccout = M(TB_BAS_USER_ACCOUT)->where("user_code = '{$user_code}'")->find(); // 取当前用户账户信息 $condition = "score_lower_value <= " . $userAccout['user_score'] . " and score_upper_value >= " . $userAccout['user_score']; $userLvl = M(TB_DET_USER_LEVEL)->where($condition)->find(); // 取需要的积分规则 // 如果计算出的最新等级与之前等级不同,更新用户最新等级 if ($userLvl['user_level_value'] != $userAccout['user_level']) { $userAc['user_level'] = $userLvl['user_level_value']; alterUserAccout($user_code, $userAc); } } if ($action_coins['coins_value']) { $res_co = userActionAdd($action_coins, 'coins'); // 用户金币使用日志 } } if ($res_sc && $res_co) { $this->ajaxReturn(1, "success", 1); } else { $this->ajaxReturn(0, "failed", 0); } }