qlg.tsgz.moe/hyhproject/common/model/UserVouchers.php
2021-07-16 23:22:22 +08:00

408 lines
22 KiB
PHP
Executable File
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
namespace wstmart\common\model;
use think\Db;
/**
* ============================================================================
* 券数据
*/
class UserVouchers extends Base{
public function startRevokeVouchers(){
$LOG = "=========================================".PHP_EOL;
if('127.0.0.1' != $ip = request()->ip(0) ) return $ip;
set_time_limit(0);
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
Db::startTrans();
try{
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
if(1 == date('j')){
//每月损耗
$monthScale = round((100-dataConf('couponsNextMonthInitSacle'))*0.01,5);
$giveList = $m->getList([],'id, userId, expectedProductNum, expectedCouponsNum');
foreach ($giveList as &$g) {
if($g['expectedProductNum'] > 0){
$decNum = $g['expectedProductNum'] * $monthScale;
$this->insertVouchersNotice($g['userId'],0,$decNum,0,$desc='月损耗所扣',0,1);
}
if($g['expectedCouponsNum'] > 0){
$decNum = $g['expectedCouponsNum'] * $monthScale;
$this->insertVouchersNotice($g['userId'],0,0,$decNum,$desc='预获优惠券月损耗所扣',0,1);
}
}
}
// 每次所得值费、税前同时扣减“助购预获”值和“购物股”值直至减为负数为止负数部分按每天0.1%耗损。
// A、当“助购预获”值为负数时每天0.1%耗损在“购物股”值扣减。
// B、当“购物股”值为负数时每天0.1%耗损在“预获优惠券”值扣减。
// C、当“助购预获”值和“购物股”值同为负数时每天0.1%耗损在“预获优惠券”值同时扣减。
$data = Db::name('user_vouchers_summary')->whereOr(["helpSaleNum"=>["lt", 0]])->whereOr(["expectedProductNum"=>["lt", 0]])->select();
$LOG .= "=============开始循环=============".PHP_EOL;
foreach ($data as $_each){
if ($_each['userId'] == 0) continue;
$LOG .= "===========当前用户#【{$_each['userId']}】==========".PHP_EOL;
$LOG .= "当前用户预获优惠券:{$_each['expectedCouponsNum']};购物股:{$_each['expectedProductNum']};助购券值:{$_each["helpSaleNum"]}".PHP_EOL;
if($_each["expectedProductNum"]<0){
$LOG .= "17.1、成立".PHP_EOL;
$count = abs((float)$_each["expectedProductNum"]);
$LOG .= "17.1、负数值:{$count}".PHP_EOL;
if($_each["helpSaleNum"] < 0) {
$LOG .= "17.2、成立".PHP_EOL;
$count += abs((float)$_each["helpSaleNum"]);
$LOG .= "17.2、负数值:{$count}".PHP_EOL;
}
$val = $count*((float)dataConf("deductionRateWhennegPreCoupons")/100);
$LOG .= "17.3、:扣除预获优惠券:{$val}【助购券负值日损耗所扣】".PHP_EOL;
model('common/UserVouchers')->insertVouchersNotice($_each["userId"], 0, 0, $val,
"助购券负值日损耗所扣", 0);
}else{
$LOG .= "17.4、成立".PHP_EOL;
$count = abs((float)$_each["helpSaleNum"]);
$LOG .= "17.4、负数值:{$count}".PHP_EOL;
$val = $count*((float)dataConf("deductionRateWhennegPreCoupons")/100);
$LOG .= "17.5、:扣除预获优惠券:{$val}【助购券负值日损耗所扣】".PHP_EOL;
model('common/UserVouchers')->insertVouchersNotice($_each["userId"], 0, $val,
0, "助购券负值日损耗所扣", 0);
}
$LOG .= "=========当前用户#【{$_each['userId']}】结束========".PHP_EOL;
}
$LOG .= "=============循环结束=============".PHP_EOL;
Db::commit();
\think\Log::write($LOG);
return WSTReturn("ok", 1);
}catch (\Exception $e) {
dump($e);
Db::rollback();errLog($e);
return WSTReturn($e->getMessage(),-1);
}
}
public function startGiveVouchers(){
$LOG = "=========================================".PHP_EOL;
if('127.0.0.1' != $ip = request()->ip(0) ) return $ip;
set_time_limit(0);
$sm = Model('common/SysSummary');
$sysData= $sm->getInfo('toPayFast,toPaySlow');
//获取代快付值
$toPayFast = $sysData['toPayFast'];
$HistoryToPayFast = $sysData['toPayFast'];
//今日代快付释放值
$payFast = round($toPayFast * (dataConf('fastPayDayScale')*0.01),5);
//获取代慢付值
$toPaySlow = $sysData['toPaySlow'];
$HistoryToPaySlow = $sysData['toPaySlow'];
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
$HistoryVouchersSummarySum = $m->getSum(['isDisabled'=>0],'expectedProductNum+expectedCouponsNum');
//今日付慢付释放值
$paySlow = round($toPaySlow * (dataConf('slowPayDayScale')*0.01),5);
//应释放总额
$toPaySum = $payFast + $paySlow;
$LOG .= <<<TXT
---当前代快付值:{$HistoryToPayFast}
1、代快付释放值{$payFast}
---当前代慢付值:{$HistoryToPaySlow}
2、代慢付释放值{$paySlow}
5、释放总额{$toPaySum}
TXT;
Db::startTrans();
try{
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
$where['isDisabled'] = 0;
//总购物股
$allPreProduct = $m->getSum($where,'expectedProductNum');
//总预获优惠券
$allPreCoupons = $m->getSum($where,'expectedCouponsNum');
//最大释放总额 预代付值 * 比例
$maxPayNum = ($allPreProduct + $allPreCoupons) * (dataConf('couponsMaxGiveSacle')*0.01);
$LOG .= "3、最大释放总额{$maxPayNum}".PHP_EOL;
$LOG .= "4、转换前预代付值".($allPreProduct + $allPreCoupons).PHP_EOL;
if($toPaySum > $maxPayNum){
//加入代慢付值
$LOG .= "6、成立".PHP_EOL;
$addPaySlow = round($toPaySum - $maxPayNum,5);
$LOG .= "6、代慢付增加{$addPaySlow}【应释放总额大于最大释放总额】".PHP_EOL;
$sm->addSysSummary(0,$addPaySlow,1,'应释放总额大于最大释放总额');
}
//扣减系统释放值
if ($paySlow < 0) $paySlow = 0;
if ($payFast < 0) $payFast = 0;
$minusSysNum = $payFast+$paySlow;
$LOG .= "---系统扣除:快:{$payFast};慢:{$paySlow}【扣减系统释放值】".PHP_EOL;
$sm->addSysSummary($payFast,$paySlow,2,'扣减系统释放值');
//取最小值作为总释放额
$payNum = min($maxPayNum,$toPaySum);
if($payNum==0) return;
//每人应释放数
$personNum = $payNum / ($allPreProduct + $allPreCoupons);
$LOG .= "8、计算基数1{$personNum}".PHP_EOL;
//将所有未释放的的isGive设为0
//获取今日0点时间戳
$today = strtotime(date("Y-m-d"),time());
$m->updateInfo('giveDate < '.$today,['isGive'=>0]);
$list = $m->getList(['isDisabled'=>0,'isGive'=>0],'
id,
userId,
expectedProductNum,
expectedCouponsNum,
alreadyProductNum,
alreadyCouponsNum,
giveDay
');
$time = time();
$LOG .= "=============开始循环=============".PHP_EOL;
foreach ($list as &$v) {
if ($v['userId'] == 0) continue;
$LOG .= "===========当前用户#【{$v['userId']}】==========".PHP_EOL;
$LOG .= "当前用户预获优惠券:{$v['expectedCouponsNum']};购物股:{$v['expectedProductNum']}".PHP_EOL;
unset($data);
$minNumer = 15;
//都小于15不统计直接加入代慢付
// 原当购户“预获优惠券”、“购物股”的值同时≤15元时所获“已获优惠券”、“已获产品券”转入代快付值
// 改为当购户“预获优惠券”、“购物股”的值同时≤15元时所获“已获优惠券”、“已获产品券”转入代慢付值
$couponsScale = dataConf('hasCoupousScale');//优惠券比例
$productScale = 100 - $couponsScale;//产品券比例
if($v['expectedProductNum'] <= $minNumer && $v['expectedCouponsNum'] <= $minNumer){
$LOG .= "9、预获优惠券{$v['expectedCouponsNum']};购物股:{$v['expectedProductNum']}均小于15".PHP_EOL;
$toSlowNum = round($personNum * ($v['expectedProductNum'] + $v['expectedCouponsNum']),5);
$LOG .= "9、退回系统慢值{$toSlowNum}".PHP_EOL;
$sm->addSysSummary(0,$toSlowNum,1,'用户ID['.$v['userId'].']双预获券都小于15/日转换退回');
$LOG .= "=========当前用户#【{$v['userId']}】结束========".PHP_EOL;
continue;
}else if($v['expectedProductNum'] <= $minNumer){//购物股小于15;
$LOG .= "10、购物股{$v['expectedProductNum']}小于15".PHP_EOL;
$personAlreadyProductNum = 0;
$personAlreadyCouponsNum = $personNum * ($v['expectedProductNum'] + $v['expectedCouponsNum']);
$LOG .= "10、用户需要获得的已获产品券{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "10、用户需要获得的已获优惠券{$personAlreadyCouponsNum}".PHP_EOL;
}else if($v['expectedCouponsNum'] <= $minNumer){//预获优惠券小于15
$LOG .= "11、预获优惠券{$v['expectedCouponsNum']}小于15".PHP_EOL;
$personAlreadyCouponsNum = 0;
$personAlreadyProductNum = $personNum * ($v['expectedProductNum'] + $v['expectedCouponsNum']);
$LOG .= "11、用户需要获得的已获产品券{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "11、用户需要获得的已获优惠券{$personAlreadyCouponsNum}".PHP_EOL;
}else{//都大于15
$LOG .= "---优惠券比例:{$couponsScale}".PHP_EOL;
$LOG .= "---产品券比例:{$productScale}".PHP_EOL;
$personAlreadyProductNum = $personNum * ($v['expectedProductNum'] + $v['expectedCouponsNum']) * ($productScale*0.01);
$personAlreadyCouponsNum = $personNum * ($v['expectedProductNum'] + $v['expectedCouponsNum']) * ($couponsScale*0.01);
$LOG .= "8.1、用户需要获得的已获产品券:{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "8.2、用户需要获得的已获优惠券:{$personAlreadyCouponsNum}".PHP_EOL;
}
//都小于就算了
if($v['expectedProductNum'] < $personAlreadyProductNum && $v['expectedCouponsNum'] < $personAlreadyCouponsNum){
$LOG .= "12、用户需要获得的已获产品券{$personAlreadyProductNum} < 购物股:{$v['expectedProductNum']}".PHP_EOL;
$LOG .= "12、用户需要获得的已获优惠券{$personAlreadyCouponsNum} < 预获优惠券:{$v['expectedCouponsNum']}".PHP_EOL;
$personAlreadyProductNum = 0;
$personAlreadyCouponsNum = 0;
$LOG .= "---用户需要获得的已获产品券:{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "---用户需要获得的已获优惠券:{$personAlreadyCouponsNum}".PHP_EOL;
}
//实际有购物股小于应给值
if($v['expectedProductNum'] < $personAlreadyProductNum){
$LOG .= "13、用户需要获得的已获产品券{$personAlreadyProductNum} < 购物股:{$v['expectedProductNum']}".PHP_EOL;
$personAlreadyCouponsNum += $personAlreadyProductNum;
$personAlreadyProductNum = 0;
$LOG .= "---用户需要获得的已获产品券:{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "---用户需要获得的已获优惠券:{$personAlreadyCouponsNum}".PHP_EOL;
}
//实际有预获优惠券小于应给值
if($v['expectedCouponsNum'] < $personAlreadyCouponsNum){
$LOG .= "14、用户需要获得的已获优惠券{$personAlreadyCouponsNum} < 预获优惠券:{$v['expectedCouponsNum']}".PHP_EOL;
$personAlreadyProductNum += $personAlreadyCouponsNum;
$personAlreadyCouponsNum = 0;
$LOG .= "---用户需要获得的已获产品券:{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "---用户需要获得的已获优惠券:{$personAlreadyCouponsNum}".PHP_EOL;
}
$LOG .= "最终:用户需要获得的已获产品券:{$personAlreadyProductNum}".PHP_EOL;
$LOG .= "最终:用户需要获得的已获优惠券:{$personAlreadyCouponsNum}".PHP_EOL;
if($personAlreadyProductNum >= 0.01){
$LOG .= "用户扣购物股:{$personAlreadyProductNum}【购物股日转换所扣】".PHP_EOL;
$this->insertVouchersNotice($v['userId'],0,$personAlreadyProductNum,0,$desc='购物股日转换所扣',0,0);//购物股减
//加入变动记录,最后一位//1产品券2优惠券3旺旺券4现金券
$LOG .= "用户加已获产品券:{$personAlreadyProductNum}【日转换所得】".PHP_EOL;
$this->insertAlreadyVouchersNotice($v['userId'],0,$personAlreadyProductNum,0,'日转换所得',1,1);
// Model('common/LogMoneys')->addMoneyLog(0,$v['userId'],0,2,'购物股日转换所得',1,$personAlreadyProductNum,'dayPay',1);
$data['alreadyProductNum'] = $v['alreadyProductNum'] + $personAlreadyProductNum;//已获产品券加
}
if($personAlreadyCouponsNum >= 0.01){
$LOG .= "用户扣预获优惠券:{$personAlreadyCouponsNum}【预获优惠券日转换所扣】".PHP_EOL;
$this->insertVouchersNotice($v['userId'],0,0,$personAlreadyCouponsNum,$desc='预获优惠券日转换所扣',0,0);//预获优惠券减
//加入变动记录,最后一位//1产品券2优惠券3旺旺券4现金券
$LOG .= "用户加已获优惠券:{$personAlreadyCouponsNum}【预获优惠券日转换所得】".PHP_EOL;
$this->insertAlreadyVouchersNotice($v['userId'],0,0,$personAlreadyCouponsNum,'预获优惠券日转换所得',1,1);
// Model('common/LogMoneys')->addMoneyLog(0,$v['userId'],0,2,'预获优惠券日转换所得',1,$personAlreadyCouponsNum,'dayPay',2);
$data['alreadyCouponsNum'] = $v['alreadyCouponsNum'] + $personAlreadyCouponsNum;//已获优惠券加
}
$data['isGive'] = 1;
$data['giveDate'] = $time;
$data['giveDay'] = $v['giveDay'] + 1;
Db::name('user_vouchers_summary')->where(['id'=>$v['id']])->update($data);
$LOG .= "=========当前用户#【{$v['userId']}】结束========".PHP_EOL;
}
Db::commit();
$LOG .= "=============循环结束=============".PHP_EOL;
$sm = Model('common/SysSummary');
$sysData= $sm->getInfo('toPayFast,toPaySlow');
$toPayFast = $sysData['toPayFast'];
$toPaySlow = $sysData['toPaySlow'];
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
$vouchersSummarySum = $m->getSum(['isDisabled'=>0],'expectedProductNum+expectedCouponsNum');
$deltaFast = $HistoryToPayFast - $toPayFast;
$deltaSlow = $HistoryToPaySlow - $toPaySlow;
$deltaConv = $HistoryVouchersSummarySum - $vouchersSummarySum;
$unConv = $deltaFast + $deltaSlow - $deltaConv;
$LOG .= <<<TXT
---当前代快付值:{$toPayFast}
---当前代慢付值:{$toPaySlow}
18、转换后预代付值{$vouchersSummarySum}
19、预代付值差值{$deltaConv}
---代快付值差值:{$deltaFast}
---代慢付值差值:{$deltaSlow}
---未转换值:{$unConv}
TXT;
if ($unConv > 0) $sm->addSysSummary(0, $unConv, 1, "加入系统未转换值");
\think\Log::write($LOG);
\think\Log::write(<<<TEXT
系统未转换值调试内容:
hpf={$HistoryToPayFast}
hps={$HistoryToPaySlow}
hvs={$HistoryVouchersSummarySum}
tpf={$toPayFast}
tps={$toPaySlow}
pf={$payFast}
ps={$paySlow}
vs={$vouchersSummarySum}
ms={$minusSysNum}
df={$deltaFast}
ds={$deltaSlow}
dc={$deltaConv}
uc={$unConv}
TEXT
);
return WSTReturn("ok", 1);
}catch (\Exception $e) {
dump($e);
Db::rollback();errLog($e);
return WSTReturn($e->getMessage(),-1);
}
}
/**
* 插入已获会员券值记录
* @param [type] $userId [会员ID]
* @param [type] $orderId [订单ID]
* @param integer $expectedProductNum [购物股]
* @param integer $expectedCouponsNum [预获优惠券]
* @param string $desc [备注]
* @param string $isAdd [1增加0扣除]
* @return [type] [description]
*/
public function insertAlreadyVouchersNotice($userId,$orderId,$alreadyProductNum=0,$alreadyCouponsNum=0,$desc='',$isAdd=1,$isShow=1){
//插入详细表
$m = Model('common/Table');
$m->setTable('log_moneys');
if($alreadyProductNum>0){
$m->insertInfo(['targetType'=>0,'targetId'=>$userId, 'dataId'=>$orderId,'dataSrc'=>1,'money'=>$alreadyProductNum,'moneyName'=>1,'remark'=>$desc,'moneyType'=>$isAdd,'payType'=>'qlgpay','createTime'=>date('Y/m/d H:i:s')]);
}
if($alreadyCouponsNum>0){
$m->insertInfo(['targetType'=>0,'targetId'=>$userId, 'dataId'=>$orderId,'dataSrc'=>1,'money'=>$alreadyCouponsNum,'moneyName'=>2,'remark'=>$desc,'moneyType'=>$isAdd,'payType'=>'qlgpay','createTime'=>date('Y/m/d H:i:s')]);
}
//插入或更新详细表
$m->setTable('users');
$summaryInfo = $m->getInfo(['userId'=>$userId],'userId,productNum,couponsNum');
if(1 == $isAdd){
$data['productNum'] = $summaryInfo['productNum'] + $alreadyProductNum;
$data['couponsNum'] = $summaryInfo['couponsNum'] + $alreadyCouponsNum;
}else{
$data['productNum'] = $summaryInfo['productNum'] - $alreadyProductNum;
$data['couponsNum'] = $summaryInfo['couponsNum'] - $alreadyCouponsNum;
}
$m->updateInfo(['userId'=>$userId],$data);
}
/**
* 插入已获会员券值记录
* @param [type] $userId [会员ID]
* @param [type] $orderId [订单ID]
* @param integer $expectedProductNum [购物股]
* @param integer $expectedCouponsNum [预获优惠券]
* @param string $desc [备注]
* @param string $isAdd [1增加0扣除]
* @return [type] [description]
*/
public function insertHelpSaleNotice($userId,$orderId,$helpSaleNum=0,$desc='',$isAdd=1,$isShow=1){
//插入详细表
$m = Model('common/Table');
$m->setTable('user_help_get_notice');
$m->insertInfo(['userId'=>$userId,'orderId'=>$orderId,'helpGet'=>$helpSaleNum,'remark'=>$desc,'isAdd'=>$isAdd,'isShow'=>$isShow,'createTime'=>time()]);
$m = Model('common/Table');
$m->setTable('user_vouchers_summary');
if($summaryInfo = $m->getInfo(['userId'=>$userId],'id,helpSaleNum')){
if(1 == $isAdd){
$data['helpSaleNum'] = $summaryInfo['helpSaleNum'] + $helpSaleNum;
}else{
$data['helpSaleNum'] = $summaryInfo['helpSaleNum'] - $helpSaleNum;
}
$m->updateInfo(['id'=>$summaryInfo['id']],$data);
}else{
if(0 == $isAdd){
$helpSaleNum *= -1;
}
$data = compact('userId','helpSaleNum');
$m->insertInfo($data);
}
}
/**
* 插入会员券值记录
* @param [type] $userId [会员ID]
* @param [type] $orderId [订单ID]
* @param integer $expectedProductNum [购物股]
* @param integer $expectedCouponsNum [预获优惠券]
* @param string $desc [备注]
* @param string $isAdd [1增加0扣除]
* @return [type] [description]
*/
public function insertVouchersNotice($userId,$orderId,$expectedProductNum=0,$expectedCouponsNum=0,$desc='',$isAdd=1,$isShow=1){
//插入详细表
$m = Model('common/Table');
$m->setTable('user_vouchers_notice');
$m->insertInfo(['userId'=>$userId,'orderId'=>$orderId,'expectedProductNum'=>$expectedProductNum,'expectedCouponsNum'=>$expectedCouponsNum,'remark'=>$desc,'moneyType'=>$isAdd,'isShow'=>$isShow,'createTime'=>time()]);
//插入或更新详细表
$m->setTable('user_vouchers_summary');
if($summaryInfo = $m->getInfo(['userId'=>$userId],'id,expectedProductNum,expectedCouponsNum')){
if(1 == $isAdd){
$data['expectedProductNum'] = $summaryInfo['expectedProductNum'] + $expectedProductNum;
$data['expectedCouponsNum'] = $summaryInfo['expectedCouponsNum'] + $expectedCouponsNum;
}else{
$data['expectedProductNum'] = $summaryInfo['expectedProductNum'] - $expectedProductNum;
$data['expectedCouponsNum'] = $summaryInfo['expectedCouponsNum'] - $expectedCouponsNum;
}
$m->updateInfo(['id'=>$summaryInfo['id']],$data);
}else{
if(0 == $isAdd){
$expectedProductNum *= -1;
$expectedCouponsNum *= -1;
}
$data = compact('userId','expectedProductNum','expectedCouponsNum');
$data['alreadyProductNum'] = 0;
$data['alreadyCouponsNum'] = 0;
$data['isGive'] = 1;
$data['giveDate'] = time();
$data['giveDay'] = 0;
$m->insertInfo($data);
}
}
}