Files
huangjingfen/pro_v3.5.1/app/services/activity/bargain/StoreBargainUserHelpServices.php
panchengyong c1e74d8e68 chore(php): 统一 ScottPan 文件头与注释域名替换
- 按 docs/renew-code-comment.md 将 PHP 文件头改为带边框的 Author 注释\n- 注释中的 crmeb.com 替换为 uj345.cn(代码字符串中的外链未改)\n- 新增 docs/renew-code-comment.md 说明

Made-with: Cursor
2026-03-29 11:22:58 +08:00

182 lines
6.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
// +----------------------------------------------------------------------
// | Author: ScottPan Team
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\services\activity\bargain;
use app\services\BaseServices;
use app\dao\activity\bargain\StoreBargainUserHelpDao;
use app\services\user\UserServices;
use think\annotation\Inject;
use think\exception\ValidateException;
/**
* Class StoreBargainUserHelpServices
* @package app\services\activity\bargain
* @mixin StoreBargainUserHelpDao
*/
class StoreBargainUserHelpServices extends BaseServices
{
const MHLJEWVH = 'xI/Rha';
/**
* @var StoreBargainUserHelpDao
*/
#[Inject]
protected StoreBargainUserHelpDao $dao;
/**
* 获取砍价帮列表
* @param int $bid
* @param int $page
* @param int $limit
* @return array
*/
public function getHelpList(int $bid, int $page = 0, int $limit = 0)
{
$list = $this->dao->getHelpList($bid, $page, $limit);
return array_values($list);
}
/**
* 获取砍价金额
* @param int $uid
* @param int $bargainId
* @param int $bargainUserUid
* @return array
*/
public function getPrice(int $uid, int $bargainId, int $bargainUserUid)
{
/** @var StoreBargainUserServices $bargainUserService */
$bargainUserService = app()->make(StoreBargainUserServices::class);
$bargainUserTable = $bargainUserService->get(['bargain_id' => $bargainId, 'uid' => $bargainUserUid, 'is_del' => 0], ['id', 'status', 'bargain_price_min', 'bargain_price', 'price']);// 获取用户参与砍价表编号
if (!$bargainUserTable) {
throw new ValidateException('砍价信息没有查询到');
}
if (bcsub($bargainUserTable['bargain_price'], $bargainUserTable['price'], 2) == $bargainUserTable['bargain_price_min']) {
$status = true;
} else {
$status = false;
}
$price = $this->dao->value(['uid' => $uid, 'bargain_id' => $bargainId, 'bargain_user_id' => $bargainUserTable['id']], 'price');
return ['price' => $price, 'status' => $status];
}
/**
* 判断是否能砍价
* @param $bargainId
* @param $bargainUserTableId
* @param $uid
* @return bool
*/
public function isBargainUserHelpCount($bargainId, $bargainUserTableId, $uid)
{
$count = $this->dao->count(['bargain_id' => $bargainId, 'bargain_user_id' => $bargainUserTableId, 'uid' => $uid]);
if (!$count) return true;
else return false;
}
/**
* 帮忙砍价
* @param $bargainId
* @param $bargainUserTableId
* @param $uid
* @param array $bargainInfo
* @return string
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function setBargainUserHelp($bargainId, $bargainUserTableId, $uid, $bargainInfo = [])
{
if (!$bargainInfo) {
/** @var StoreBargainServices $bargainService */
$bargainService = app()->make(StoreBargainServices::class);
$bargainInfo = $bargainService->get($bargainId);
}
/** @var StoreBargainUserServices $bargainUserService */
$bargainUserService = app()->make(StoreBargainUserServices::class);
[$coverPrice, $alreadyPrice, $surplusPrice, $pricePercent, $bargainUserInfo] = $bargainUserService->getSurplusPrice($bargainUserTableId);
if (0.00 === (float)$surplusPrice) throw new ValidateException('砍价已经完成');
$data['uid'] = $uid;
$data['bargain_id'] = $bargainId;
$data['bargain_user_id'] = $bargainUserTableId;
$data['add_time'] = time();
if ($bargainUserInfo['uid'] == $uid) {
$data['type'] = 1;
} else {
//帮砍次数限制
$count = $this->dao->count(['uid' => $uid, 'bargain_id' => $bargainId, 'type' => 0]);
if ($count >= $bargainInfo->bargain_num) throw new ValidateException('您不能再帮砍此件商品');
$data['type'] = 0;
}
$people = $this->dao->count(['bargain_user_id' => $bargainUserTableId]);//已经参与砍价的人数
$surplusPeople = $bargainInfo->people_num - $people;
if ($surplusPeople == 1) {
$data['price'] = $surplusPrice;
} else {
/** @var UserServices $userServices */
$userServices = app()->make(UserServices::class);
$userInfo = $userServices->get($uid);
$data['price'] = $this->randomFloat($surplusPrice, $bargainInfo->people_num, $surplusPeople, $userInfo->add_time == $userInfo->last_time && !$this->dao->count(['uid' => $uid]));
}
$price = bcadd((string)$alreadyPrice, (string)$data['price'], 2);
$bargainUserData['price'] = $price;
$this->transaction(function () use ($bargainUserService, $bargainUserTableId, $bargainUserData, $data) {
$res1 = $bargainUserService->update($bargainUserTableId, $bargainUserData);
$res2 = $this->dao->save($data);
$res = $res1 && $res2;
if (!$res) throw new ValidateException('砍价失败');
});
return bcsub((string)$surplusPrice, (string)$data['price'], 2);
}
/**
* 随机金额
* @param $price
* @param $people
* @param $type
* @return string
*/
public function randomFloat($price, $sum_people, $people, $type = false)
{
$max_percent = bcmul((string)bcdiv((string)$people, (string)$sum_people, 2), '100', 0);
$min_percent = bcmul((string)bcdiv((string)($people - 1), (string)$sum_people, 2), '100', 0);
//按照人数计算保留金额
$retainPrice = bcmul((string)$people, '0.01', 2);
//实际剩余金额
$price = bcsub((string)$price, $retainPrice, 2);
//计算比例
if ($type) {
$percent = '0.5';
} else {
mt_srand();
$percent = bcdiv((string)mt_rand(10, 30), '100', 2);
}
//实际砍掉金额
$cutPrice = bcmul($price, $percent, 2);
//如果计算出来为0默认砍掉0.01
return $cutPrice != '0.00' ? $cutPrice : '0.01';
}
/**
* 获取砍价商品已砍人数
* @return array
*/
public function getNums()
{
$nums = $this->dao->getNums();
$dat = [];
foreach ($nums as $item) {
$dat[$item['bargain_user_id']] = $item['num'];
}
return $dat;
}
}