// +---------------------------------------------------------------------- namespace app\common\repositories\user; use app\common\dao\user\AwardIntegralPriceDao; use app\common\dao\user\AwardIntegralPriceDayDao; use app\common\dao\user\AwardLakeDao; use app\common\dao\user\AwardLakeLogDao; use app\common\model\store\order\StoreOrder; use app\common\model\user\AwardIntegralPrice; use app\common\model\user\AwardIntegralPriceDay; use app\common\model\user\AwardLakeLog; use app\common\model\user\User; use app\common\model\user\UserExtract; use app\common\repositories\BaseRepository; class AwardIntegralPriceRepository extends BaseRepository { /** * @var AwardIntegralPriceDao */ protected $dao; /** * UserSignRepository constructor. * @param AwardIntegralPriceDao $dao */ public function __construct(AwardIntegralPriceDao $dao) { $this->dao = $dao; } public function awardIntegralPrice($day = '') { try { if (!$day) { $day = date('Y-m-d', strtotime('-1 day')); } if ($info = $this->dao->search(['day' => $day])->find()) { return $info->toArray(); } // @file_put_contents('yesterday.txt', AwardIntegralPrice::getLastSql() . PHP_EOL, FILE_APPEND); $yesterday_price = $this->dao->search(['day' => date('Y-m-d', strtotime('-1 day', strtotime($day)))])->find(); if ($yesterday_price) { $basePrice = $yesterday_price->price; } else { $basePrice = systemConfig('award_integral_price', 0.1); } $time_start = strtotime($day); $time_end = strtotime($day) + 86400; //todo 业绩 $achievement = StoreOrder::where('paid', 1) ->whereBetween('create_time', [$day . ' 00:00:00', $day . ' 23:59:59']) ->where('is_del', 0)->where('is_system_del', 0) ->where('status', '>=', 0) ->sum('total_price'); @file_put_contents('yesterday.txt', StoreOrder::getLastSql() . PHP_EOL, FILE_APPEND); $achievement = bcmul((string)$achievement, '0.15', 8); //从总业绩的5%上涨到10%,在上涨到15% /** @var UserExtractRepository $extractRepositories */ $extractRepositories = app()->make(UserExtractRepository::class); $commission = $extractRepositories->search(['status' => 1])->whereBetween('check_time', [$time_start, $time_end])->sum('commission'); @file_put_contents('yesterday.txt', UserExtract::getLastSql() . PHP_EOL, FILE_APPEND); $userService = app()->make(UserRepository::class); $num = $userService->search(['status' => 1])->sum('award_integral'); $sum_achievement = bcadd((string)$commission, (string)$achievement, 8); $rise = $num > 0 ? bcdiv($sum_achievement, $num, 8) : 0; $add_price = 0; if ($rise > 0) { @file_put_contents('quanju4.txt', $rise . "-123\r\n", 8); // 增长值分成25份 $day_25_rise = bcdiv($rise, 25, 8); } else { $day_25_rise = 0; } // @file_put_contents('quanju4.txt', $day_25_rise . "-456\r\n", 8); /** @var AwardIntegralPriceDayDao $AwardIntegralPriceDayDao */ $AwardIntegralPriceDayDao = app()->make(AwardIntegralPriceDayDao::class); $AwardIntegralPriceDayDao->create(['day' => time(), 'all_add_price' => $rise, 'day_add_price' => $day_25_rise]); //保存今天增长的总价格和每日增长价格 $day_25 = strtotime('-25 day'); // @file_put_contents('quanju4.txt', $day_25 . "-25天前的时间\r\n", 8); // $add_price = $AwardIntegralPriceDayDao->search([])->where('day','>' ,$day_25)->sum('day_add_price'); $add_price = AwardIntegralPriceDay::where('day', '>', $day_25)->sum('day_add_price'); // @file_put_contents('quanju4.txt', sprintf("%.8f", $add_price) . "-789\r\n", 8); // @file_put_contents('quanju4.txt', AwardIntegralPriceDay::getLastSql() . "-91110212\r\n", 8); // @file_put_contents('quanju4.txt', $basePrice . "-之前的总价总价\r\n", 8); // @file_put_contents('quanju4.txt', $add_price . "-963\r\n", 8); // $price = bcadd(sprintf("%.8f", $add_price), (string)$basePrice, 8); $price = $add_price + $basePrice; // @file_put_contents('quanju4.txt', time() . "-正常获取走的到这里吗\r\n", 8); // @file_put_contents('quanju4.txt', $price . "-总价\r\n", 8); } catch (\Exception $e) { @file_put_contents('quanju4.txt', $e->getMessage() . "-积分价格报错内容\r\n", 8); @file_put_contents('quanju4.txt', $e->getFile() . "-文件\r\n", 8); @file_put_contents('quanju4.txt', $e->getLine() . "-位置\r\n", 8); } return compact('basePrice', 'price', 'rise', 'achievement', 'commission', 'num', 'add_price'); } public static function userIntegralValue($price){ $user_lst = User::where('status',1)->where('award_integral','>',0)->select(); //获取所有有效用户 if (!empty($user_lst)){ $user_lst = $user_lst->toArray(); } $userBillRepository = app()->make(UserBillRepository::class); $userRepository = app()->make(UserRepository::class); try { foreach ($user_lst as $user){ $user_price = bcmul($price, $user['award_integral'], 8); //用户积分总价值 @file_put_contents('quanju4.txt', $user_price . "-用户积分总价值\r\n", 8); if ($user_price > $user['award_range']){ $num = bcsub($user_price, $user['award_range'], 8); //超出额度的金额 @file_put_contents('quanju4.txt', $num . "-超出额度的金额\r\n", 8); if ($num > 0.01){ $num_integral = bcdiv($num, $price, 8); //金额除以价格得到超出额度的积分 @file_put_contents('quanju4.txt', $num_integral . "-金额除以价格得到超出额度的积分\r\n", 8); $userBillRepository->decBill($user['uid'], 'award_integral', 'extract_award', [ 'link_id' => 0, 'status' => 1, 'title' => '提取分红积分', 'number' => $num_integral, 'mark' => '自动提取' . floatval($num_integral) . '分红积分', 'balance' => bcsub($user['award_integral'], $num_integral, 2) ]); $userRepository->decField($user['uid'], 'award_integral', $num_integral); $userRepository->incBrokerage($user['uid'], $num); $userRepository->incField($user['uid'], 'brokerage_price', $num); } } } } catch (\Exception $e) { @file_put_contents('quanju4.txt', $e->getMessage() . "-计算超出额度的积分报错内容\r\n", 8); @file_put_contents('quanju4.txt', $e->getFile() . "-文件\r\n", 8); @file_put_contents('quanju4.txt', $e->getLine() . "-位置\r\n", 8); } return true; } // 订单上涨10%就进行一次分红 public static function orderIntegralUp($price){ //传入当天价格 $order_lst = StoreOrder::where('paid',1)->where('is_del',0)->where('is_system_del',0)->where('status','=',0)->select(); //获取所有有效订单 try { foreach ($order_lst as $item){ $user = User::where('uid',$item['uid'])->where('status',1)->find(); if ($user) { // 订单购买当天价格 list($startOfDay, $endOfDay) = self::getStartAndEndOfDay($item['pay_time']); $order_price = AwardIntegralPrice::where('add_time','>',$startOfDay)->where('add_time','<',$endOfDay)->value('price'); //购买当时价格 $points_up_num = bcadd($item['points_up_num'],1,0); //订单触发次数+1 $up_radio = bcmul($points_up_num, 0.1, 2); //触发需要增长的比例 $up_num= bcadd(1,$up_radio,2); //比例加+1 1+10% $up_price = bcmul($order_price,$up_num ,8); //购买时积分价格乘以比例得到增长的价格 if($price>$up_price){ //如果当天价格超过触发增长价格 // 订单触发分红,计算该订单的分红额度 $range = bcmul($item['pay_price'],0.8,2); $down_range = bcmul($range,0.1,2); //要扣除的10%额度 这分钱要加到奖金里 if ($item['product_type'] == 1) { // $mark = '节能油'; // $range_type = 'energy_saving_oil'; // $integral_type = 'spread_oil_integral'; // 发放分红积分 $number2 = systemConfig('award_integral_ordinary', 6); } elseif ($item['product_type'] == 0) { // $mark = '普通'; // $range_type = 'ordinary'; // $integral_type = 'ordinary_integral'; $number2 = systemConfig('award_integral_ordinary', 6); } elseif ($item['product_type'] == 2) { // $mark = '礼包'; // $range_type = 'award_gift_pack'; // $integral_type = 'spread_pack_integral'; $number2 = systemConfig('award_integral_gift_pack', 1); } $number2 = bcmul($number2, 0.01, 2); $order_award_range = bcmul($item['pay_price'], $number2, 2); $award_integral = bcdiv($order_award_range, $order_price, 2); //订单除以积分价格得到分红积分 $award_integral= bcmul($award_integral,0.1,2); //要扣除的10%积分 $make = app()->make(UserBillRepository::class); $userRepository = app()->make(UserRepository::class); $make->decBill($item['uid'], 'award_range', 'extract_award', [ 'link_id' => $item['order_id'], 'status' => 1, 'title' => '获取分红利润扣除分红额度', 'number' => $down_range, 'mark' => $user['nickname'] . '获取订单分红利润,减少分红额度', 'balance' => bcsub($user['award_range'], $down_range, 2) ]); $userRepository->decField($item['uid'], 'award_range', $down_range); $make->decBill($item['uid'], 'award_integral', 'extract_award', [ 'link_id' => $item['order_id'], 'status' => 1, 'title' => '获取分红利润扣除分红积分', 'number' => $award_integral, 'mark' => $user['nickname'] . '获取订单分红利润,减少分红积分', 'balance' => bcsub($user['award_integral'], $award_integral, 2) ]); $userRepository->decField($item['uid'], 'award_integral', $award_integral); $make->incBill($item['uid'], 'brokerage', 'order_one', [ 'link_id' => $item['order_id'], 'status' => 1, 'title' => '获取分红利润', 'number' => $down_range, 'mark' => $user['nickname'] . '获取订单分红利润', 'balance' => 0 ]); $userRepository->incBrokerage($item['uid'], $down_range); // $userRepository->incField($item['uid'], 'brokerage_price', $all_price); } } } } catch (\Exception $e) { @file_put_contents('quanju4.txt', $e->getMessage() . "-计算订单价格增长报错内容\r\n", 8); @file_put_contents('quanju4.txt', $e->getFile() . "-文件\r\n", 8); @file_put_contents('quanju4.txt', $e->getLine() . "-位置\r\n", 8); } return true; } public static function getStartAndEndOfDay($dateTimeString) { // 将日期时间字符串转换为日期时间对象 $date = new \DateTime($dateTimeString); // 设置时间为当天的0点0分0秒 $date->setTime(0, 0, 0); $startOfDay = $date->getTimestamp(); // 设置时间为当天的23点59分59秒 $date->setTime(23, 59, 59); $endOfDay = $date->getTimestamp(); return [$startOfDay, $endOfDay]; } public function setPrice($day, $price, $commission, $achievement, $num, $add_price) { $add_time = time(); // @file_put_contents('quanju4.txt', $add_price . "-我add_price呢\r\n", 8); return $this->dao->create(compact('day', 'price', 'commission', 'achievement', 'num', 'add_time', 'add_price')); } /** * 列表搜索 * @param int $merId * @param array $where * @param $page * @param $limit * @return array * @author Qinii */ public function search(int $merId, array $where, $page, $limit) { $query = $this->dao->search($merId, $where)->order('add_time DESC'); $count = $query->count($this->dao->getPk()); $list = $query->page($page, $limit)->hidden(['update_time'])->select(); return compact('count', 'list'); } /** * 根据条件获取列表数据 * * 每日分红价格列表 * @param array $where 查询条件数组,用于指定数据库查询的条件。 * @param int $page 当前页码,用于指定要返回的页码。 * @param int $limit 每页的数据数量,用于指定每页返回的数据条数。 * @return array 返回包含 'count' 和 'list' 两个元素的数组,'count' 为数据总数,'list' 为数据列表。 */ public function getList(array $where, $page, $limit) { // 根据条件查询数据,$where 为查询条件数组 $query = $this->dao->search($where); // 统计满足条件的数据总数 $count = $query->count(); // 查询满足条件的数据列表,带有 'label' 关联数据,按 'label_rule_id' 倒序排列 // 分页查询,返回当前页码的 $limit 条数据,并将结果转换为数组形式 $list = $query->page($page, $limit)->order('day DESC')->select()->toArray(); // 返回包含数据总数和数据列表的数组 return compact('count', 'list'); } /** * 根据条件获取列表数据 * * 每日奖池列表 * @param array $where 查询条件数组,用于指定数据库查询的条件。 * @param int $page 当前页码,用于指定要返回的页码。 * @param int $limit 每页的数据数量,用于指定每页返回的数据条数。 * @return array 返回包含 'count' 和 'list' 两个元素的数组,'count' 为数据总数,'list' 为数据列表。 */ public function getLakeList(array $where, $page, $limit) { // 根据条件查询数据,$where 为查询条件数组 $mark = app()->make(AwardLakeDao::class); $query = $mark->search($where); // 统计满足条件的数据总数 $count = $query->count(); // 查询满足条件的数据列表,带有 'label' 关联数据,按 'label_rule_id' 倒序排列 // 分页查询,返回当前页码的 $limit 条数据,并将结果转换为数组形式 $list = $query->page($page, $limit)->order('level asc')->select()->toArray(); // 返回包含数据总数和数据列表的数组 return compact('count', 'list'); } /** * 根据条件获取列表数据 * * 每日奖池列表 * @param array $where 查询条件数组,用于指定数据库查询的条件。 * @param int $page 当前页码,用于指定要返回的页码。 * @param int $limit 每页的数据数量,用于指定每页返回的数据条数。 * @return array 返回包含 'count' 和 'list' 两个元素的数组,'count' 为数据总数,'list' 为数据列表。 */ public function getLakeLogList(array $where, $page, $limit) { // 根据条件查询数据,$where 为查询条件数组 $mark = app()->make(AwardLakeLogDao::class); $query = $mark->search($where); // 统计满足条件的数据总数 $count = $query->count(); // 查询满足条件的数据列表,带有 'label' 关联数据,按 'label_rule_id' 倒序排列 // 分页查询,返回当前页码的 $limit 条数据,并将结果转换为数组形式 $list = $query->page($page, $limit)->order('add_time DESC')->select()->toArray(); // 返回包含数据总数和数据列表的数组 return compact('count', 'list'); } public function getPrice() { $mark = app()->make(AwardIntegralPriceDao::class); $price = $mark->search([])->order('add_time DESC')->value('price'); return $price; } }