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 .= <<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); } } } $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 .= << 0) $sm->addSysSummary(0, $unConv, 1, "加入系统未转换值"); Db::startTrans(); // 每次所得值(费、税前)同时扣减“助购预获”值和“预获产品券”值,直至减为负数为止,负数部分按每天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 .= "=========当前用户#【{$v['userId']}】结束========".PHP_EOL; } $LOG .= "=============循环结束=============".PHP_EOL; Db::commit(); \think\Log::write($LOG); \think\Log::write(<<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); } } }