/**
* 领取优惠券
* @param array $params
* @return void
* @throws \Es3\Exception\ErrorException
* Created by PhpStorm
* User:jill
* Date:2022/11/10
* Time:13:27
*/
public function addCoupon(array $params): void
{
/** 声明变量 **/
$couponIds = $params['coupon_ids'] ?? [];
$customerId = $params['customer_id'] ?? 0;
$storeId = $params['store_id'] ?? 0;
$couponDetails = []; //领取的数量集合
$endIds = []; //记录发放完毕
/**获取优惠券**/
$where = ['id' => $couponIds, 'activity_status' => 'ING', 'store_id' => $storeId];
$coupons = $this->getDao()->getCouponList($where);
$couponsGroup = ArrayUtility::groupBy($coupons, 'id');
/** 获取这个客户领取记录 **/
$logs = (new CouponDetailDao())->getCouponDetailLogsCountGroup(['marketing_coupon_id' => $couponIds, 'store_id' => $storeId, 'customer_id' => $customerId]);
$logsGroup = ArrayUtility::groupByArray($logs, ['marketing_coupon_id', 'store_id', 'customer_id']);
/** 查询用户使用量 **/
$details = (new CouponDetailDao())->getCouponDetailCountGroup(['marketing_coupon_id' => $couponIds]);
$detailsGroup = ArrayUtility::groupBy($details, 'marketing_coupon_id');
/** 遍历要领取的优惠券 **/
foreach ($couponIds as $couponId) {
/** 防止刷券 **/
if (superEmpty($couponsGroup[$couponId][0])) {
Logger::getInstance()->console("{$couponId}_不好意思 你是来刷券的吧 !!!!");
continue;
}
/** 声明变量 **/
$circulation = $couponsGroup[$couponId][0]['circulation'] ?? 0;//发行量
$eachLimit = $couponsGroup[$couponId][0]['each_limit'] ?? 0;//每人限制领取数量
$useCount = $detailsGroup[$couponId][0]['count'] ?? 0; //领取量
$surplus = $circulation - $useCount; //剩余数量
$key = $couponId . "_" . $storeId . "_" . $customerId;
$logNum = $logsGroup[$couponId . "_" . $storeId . "_" . $customerId] [0]['count']; //领取过的数量
/** 剩余量小于1 不在领取该优惠券**/
if ($surplus < 1) {
$endIds[] = $couponId;
Logger::getInstance()->console("{$key}剩余量小于1 不在领取该优惠券");
continue;
}
/** 剩余量小于限购数量领取量等于剩余数量 **/
if ($surplus < $eachLimit) {
$eachLimit = $surplus;
}
/** 领取过的数量大于领取数量则不在领取 **/
if ($logNum > $eachLimit) {
Logger::getInstance()->console("{$key}领取过的数量{$logNum}大于领取数量{$eachLimit}则不在领取");
continue;
}
/** 把限制领取数量的优惠券直接全部发给用户 **/
for ($i = 0; $i < $eachLimit; $i++) {
$couponDetails[] = [
"marketing_coupon_id" => $couponId,
"app_code" => $params['app_code'],
"customer_id" => $customerId,
"store_id" => $storeId,
];
}
}
/** 发放完毕记录一下 **/
if ($endIds) {
$this->update(['is_surplus' => 1], ["id" => [$endIds, "IN"]]);
}
/** 用户真实领取优惠券 **/
if ($couponDetails) {
(new CouponDetailDao())->insertAll($couponDetails);
}
}
`
/**
* 领取优惠券
* GET /app/coupon/add
* @throws \Throwable
*/
public function addCoupon(): void
{
/** @var $result Result */
$result = ContextManager::getInstance()->get(AppConst::DI_RESULT);
/** 获取参数 */
$params = $this->getParams();
/** 增加业务锁 **/
Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids']);
/** 开启事务 */
DbManager::getInstance()->startTransaction();
try {
/** 业务逻辑 */
$this->getService()->addCoupon($params);
/** 提交事物 */
DbManager::getInstance()->commit();
/** 解除业务锁 **/
Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids'], false);
/** 成功返回 */
$result->set(ResultConst::RESULT_DATA_KEY, []);
Json::success();
} catch (Throwable $throwable) {
/** 事务回滚 */
DbManager::getInstance()->rollback();
/** 解除业务锁 **/
Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids'], false);
/** 失败返回 */
Json::fail($throwable, $throwable->getCode(), $throwable->getMessage());
}
}