find($user_id); $balance = $userModel['balance']; $zoneGoodsModel = ZoneGoods::field('price')->find($zoneGoodsId); $price = $zoneGoodsModel['price']; return $balance < $price; } /** * 余额扣减后 生成订单 * @param $user_id * @param $zone_goods_id * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function createOrder($user_id,$zone_goods_id) { # 获取奖项个参数 $zoneParamArr = ZoneGoodsParam::getList(['zone_goods_id' => $zone_goods_id]); # 获取刮刮乐信息 $data = self::getWinningPrize($zoneParamArr); # 扣除余额 $zoneGoodsModel = ZoneGoods::field('price')->find($zone_goods_id); $price = $zoneGoodsModel['price']; $balance = User::decrBalance($user_id,$price); # 消费记录 $c_r_id = ConsumptionRecords::createRecords($user_id,$zone_goods_id,$price,$price,$balance,$data); # 返回刮刮乐图标、金额、订单id return [ 'data' => $data, 'c_r_id' => $c_r_id ]; } /** * 刮奖完成 * @param $user_id * @param $c_r_id * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function endOrder($user_id,$c_r_id) { # 验证 $queryWhere = ['status' => 0, 'user_id' => $user_id, 'id' => $c_r_id]; $zoneOrderModel = new ConsumptionRecords(); $query = $zoneOrderModel->where($queryWhere)->field('data,zone_goods_id')->find(); if (!$query) return ['status' => 0, 'msg' => '刮奖异常']; # 解密 $data = unserialize($query['data']); # 解析是否中奖 $awards_amount = 0; foreach ($data as $goodsParam) { $awardsAmountRes = ZoneGoodsParam::getAwardsAmount($goodsParam['id']); if ($awardsAmountRes) { $awards_amount += $goodsParam['amount']; } } # 判断是否中奖 if ($awards_amount > 0) { # 修改用户余额 $balance = User::IncrBalance($user_id,$awards_amount); # 中奖做记录 AwardsRecords::createRecords($user_id,$c_r_id,$awards_amount,$balance); } # 完成订单 ConsumptionRecords::endOrder($c_r_id); return ['status' => 1, 'msg' => '完成']; } /** * 获取刮刮乐信息(概率算法) * @return array */ protected static function getWinningPrize($patterns) { // $patterns = [ // ['image' => 'prize1.png', 'probability' => 0.3], // 奖项图案,概率为30% // ['image' => 'prize2.png', 'probability' => 0.2], // 奖项图案,概率为20% // ['image' => 'no_prize1.png', 'probability' => 0.1], // 奖项图案,概率为10% // ['image' => 'no_prize2.png', 'probability' => 0.32], // 奖项图案,概率为32% // ['image' => 'test1.png', 'probability' => 0.07], // 奖项图案,概率为7% // ['image' => 'test2.png', 'probability' => 0.002], // 奖项图案,概率为0.2% // ['image' => 'test3.png', 'probability' => 0.003], // 奖项图案,概率为0.3% // ['image' => 'test4.png', 'probability' => 0.004], // 奖项图案,概率为0.4% // ['image' => 'test5.png', 'probability' => 0.001], // 奖项图案,概率为0.1% // ]; // 计算概率总和 $totalProbability = 0; foreach ($patterns as $pattern) { $totalProbability += $pattern['probability']; } // 归一化处理,并计算累积概率 $accumulatedProbability = 0; foreach ($patterns as &$pattern) { $pattern['probability'] /= $totalProbability; // 归一化处理 $accumulatedProbability += $pattern['probability']; $pattern['accumulatedProbability'] = $accumulatedProbability; // 累积概率 } unset($pattern); $numberOfGroups = 3; // 要生成的图案组数 $groupNum = 4; // 要生成的图案组数 $data = []; for ($i = 0; $i < $numberOfGroups; $i++) { for ($j = 0; $j < $groupNum; $j++) { // 每组生成 3 个图案 $selectedPattern = null; $randomNumber = mt_rand() / mt_getrandmax(); // 生成 0 到 1 之间的随机数 foreach ($patterns as $pattern) { if ($randomNumber <= $pattern['accumulatedProbability']) { $selectedPattern = $pattern; break; } } $data[$i] = [ 'id' => $selectedPattern['id'], 'amount' => $selectedPattern['amount'], 'image' => get_image_url($selectedPattern['image']) ]; } } return $data; } }