文件
mashangyoujiu/Application/Common/Business/CouponOperation.class.php

1280 行
52 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Common\Business;
use Common\Model\RetailMCouponGroupModel;
use Common\Model\RetailMCouponModel;
use Common\Model\RetailMessageModel;
use Common\Model\RetailSmallProgramUserModel;
use Common\Model\RetailVipMCouponModel;
//[1.7.90]
/**
* 优惠券操作类
* Class CouponOperation
* [
* 优惠券充值设置 rechargeSet
* 优惠券支付设置 paySet
* 优惠券使失效 couponInvalid
* 批量发放优惠券 BatchGrantCoupon
* 发放优惠券操作 grantOperation
* 编辑券包 editPackage
* 创建券包 createCouponPackage
* 编辑优惠券 editCoupon
* 创建优惠券 createCoupon
* 创建优惠券参数验证 createCouponVerify
* 创建优惠券局部参数验证 createCouponPartVerify
* ]
* @package Common\Business
*/
class CouponOperation
{
/**
* 充值设置
* @param $param
* [
* user_type 3商户 4门店
* merchant_id
* store_id
* id 券id
* recharge_state 充值赠送(无关优惠券类型) 0.关闭 1.开启
* money 充值赠送的金额门槛
* ]
* @return mixed
*/
public function rechargeSet($param)
{
$verifyClass = new VerifyParam();
$verifyResult = $verifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (empty($param['id'])) {
return callBack(statusCode()['error'], '缺少优惠券id');
}
if ($param['recharge_state'] == 1) {
$reg = "/^[0-9]+(.[0-9]{1,2})?$/";
if (empty($param['money']) || !preg_match($reg, $param['money'])) {
return callBack(statusCode()['error'], "请输入正确的金额");
}
}
try {
$CouponModel = new RetailMCouponModel();
$save = $CouponModel->updateOrder([
'id' => $param['id'],
'merchantid' => $param['merchant_id']
], [
'recharge_state' => $param['recharge_state'] ? $param['recharge_state'] : 0,
'money' => $param['money'] ? $param['money'] : 0
]);
if ($save) {
return callBack(statusCode()['success'], "操作成功");
} else {
return callBack(statusCode()['error'], "暂无修改");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "暂无修改");
}
}
/**
* 支付设置
* @param $param
* [
* user_type 3商户 4门店
* merchant_id
* store_id
* id 优惠券id
* payment_state 支付设置 0 关闭 1开启
* payment_money 满足支付发放的支付金额
* ]
* @return mixed
*/
public function paySet($param)
{
$verifyClass = new VerifyParam();
$verifyResult = $verifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (empty($param['id'])) {
return callBack(statusCode()['error'], '缺少优惠券id');
}
$reg = "/^[0-9]+(.[0-9]{1,2})?$/";
if (empty($param['payment_money']) || !preg_match($reg, $param['payment_money'])) {
return callBack(statusCode()['error'], "请输入正确的金额");
}
try {
$CouponModel = new RetailMCouponModel();
$save = $CouponModel->updateOrder([
'id' => $param['id'],
'merchantid' => $param['merchant_id']
], [
'payment_state' => $param['payment_state'] ? $param['payment_state'] : 0,
'payment_money' => $param['payment_money']
]);
if ($save) {
return callBack(statusCode()['success'], "操作成功");
} else {
return callBack(statusCode()['error'], "暂无修改");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "暂无修改");
}
}
/**
* 优惠券失效
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* user_type 3商户 4门店
* merchant_id
* store_id
* coupon_type 1优惠券 2券包
* id
* ]
* @return mixed
*/
public function couponInvalid($param)
{
$verifyClass = new VerifyParam();
$verifyResult = $verifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (!in_array($param['coupon_type'], ['1', '2'])) {
return callBack(statusCode()['error'], "缺少券类型");
}
if (empty($param['id'])) {
return callBack(statusCode()['error'], "缺少券ID");
}
try {
$CouponModel = new RetailMCouponModel();
switch ($param['coupon_type']) {
case 1:
//优惠券
$save = $CouponModel->updateOrder([
'id' => $param['id']
], [
'status' => 2
]);
break;
case 2:
//券包
$save_coupon = $CouponModel->updateOrder([
'mcoupon_group_id' => $param['id'],
'type' => 2
], [
'status' => 2
]);
if ($save_coupon) {
$PackageCouponModel = new RetailMCouponGroupModel();
$save_package = $PackageCouponModel->updateOrder([
'id' => $param['id']
], [
'status' => 2
]);
}
break;
}
if ($save || $save_package) {
return callBack(statusCode()['success'], '操作成功');
} else {
return callBack(statusCode()['error'], '暂无修改');
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], '暂无修改');
}
}
/**
* 批量发放优惠券
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* batch_type 1优惠券 2券包
* grant_type 1批量 2指定
* vip_id_arr 指定的会员id ,拼接
* id 优惠券或券包id
* page
* limit
* ]
* @return mixed
*/
public function batchGrantCoupon($param)
{
$verifyClass = new VerifyParam();
$verifyResult = $verifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (!in_array($param['batch_type'], ['1', '2'])) {
return callBack(statusCode()['error'], "缺少券类型");
}
if (!in_array($param['grant_type'], ['1', '2'])) {
return callBack(statusCode()['error'], "缺少发放类型");
}
if (empty($param['id'])) {
return callBack(statusCode()['error'], "缺少券ID");
}
if (C('IS_SET_REDIS')) {
if ($param['batch_type'] == 1) {
//优惠券
$redis_key = 'retail_merchant_id_' . $param['merchant_id'] . '_coupon_type_2_coupon_id_' . $param['id'];
} else if ($param['batch_type'] == 2) {
//券包
$redis_key = 'retail_merchant_id_' . $param['merchant_id'] . '_coupon_package_id_' . $param['id'];
}
$CacheClass = new CacheHandle();
$CacheClass->testingKey($redis_key);
$keyState = $CacheClass->isExists($redis_key);
if ($keyState == 1) {
return callBack(statusCode()['error'], "该券正在操作中,请稍候");
}
$CacheClass->startAffair();
$CacheClass->addTimeCache($redis_key, 60, $param['id']);
}
$CouponModel = new RetailMCouponModel();
$time = $_SERVER['REQUEST_TIME'];
$where = [
'id' => $param['id'],
];
switch ($param['batch_type']) {
case 1:
//优惠券
$fields = [
'id',
'coupon_name',
'starttime',
'endtime',
'needmoney',
'reducemoney',
'storeids',
'type',
'coupon_gradeid',
'status',
'coupon_num',
'coupontype',
'daynum',
'merchantid',
'mcoupon_group_id',
];
try {
$coupon_info = $CouponModel->getFind($where, $fields);
} catch (\Exception $e) {
return callBack(statusCode()['error'], "未找到该优惠券");
}
if (empty($coupon_info)) {
return callBack(statusCode()['error'], "未找到该优惠券");
}
if ($coupon_info['status'] != 1) {
return callBack(statusCode()['error'], "该优惠券已下架");
}
if ($coupon_info['coupon_num'] <= 0 && $param['page'] == 1) {
return callBack(statusCode()['error'], "该优惠券库存不足");
}
if ($coupon_info['coupontype'] == 1) {
if ($coupon_info['endtime'] < $time) {
return callBack(statusCode()['error'], "该优惠券已过期");
}
}
$store_id_arr = $coupon_info['storeids'];
$grade_id_arr = $coupon_info['coupon_gradeid'];
$grant_num = $coupon_info['coupon_num'];
$coupon_list[] = $coupon_info;
break;
case 2:
//券包
$fields = [
'id',
'coupon_group_num',
'storeids',
'gradeids',
'status'
];
try {
$PackageCouponModel = new RetailMCouponGroupModel();
$package_info = $PackageCouponModel->getFind($where, $fields);
} catch (\Exception $e) {
return callBack(statusCode()['error'], "未找到该券包");
}
if (empty($package_info)) {
return callBack(statusCode()['error'], "未找到该券包");
}
if ($package_info['status'] != 1) {
return callBack(statusCode()['error'], "该券包已下架");
}
if ($package_info['coupon_group_num'] <= 0) {
return callBack(statusCode()['error'], "该券包库存不足");
}
$map = [
'type' => 2,
'mcoupon_group_id' => $param['id'],
'merchantid' => $param['merchant_id'],
[
[
'coupontype' => 1,
'endtime' => ['gt', $time]
],
'coupontype' => ['neq', 1],
'_logic' => 'OR'
]
];
$fields = [
'id',
'coupon_name',
'starttime',
'endtime',
'needmoney',
'reducemoney',
'storeids',
'type',
'coupon_gradeid',
'status',
'coupon_num',
'coupontype',
'merchantid',
'mcoupon_group_id',
'daynum',
];
try {
$coupon_list = $CouponModel->getSelect($map, $fields, 'id asc');
} catch (\Exception $e) {
return callBack(statusCode()['error'], "暂无可用优惠券");
}
if (empty($coupon_list)) {
return callBack(statusCode()['error'], "暂无可用优惠券");
}
$store_id_arr = $package_info['storeids'];
$grade_id_arr = $package_info['gradeids'];
$grant_num = $package_info['coupon_group_num'];
break;
}
switch ($param['grant_type']) {
case 1:
//批量
if ($grade_id_arr == '-1') {
$fields = ['v.id'];
} else {
$fields = ['id'];
}
$VipClass = new VipInfo();
$vipResult = $VipClass->basisStoreGetVip([
'user_type' => $param['user_type'],
'merchant_id' => $param['merchant_id'],
'store_id_str' => $store_id_arr,
'grade_id_str' => $grade_id_arr,
'fields' => $fields,
'page' => $param['page'],
'limit' => $param['limit']
]); //获取会员集合
if ($vipResult['status'] != 1) {
return $vipResult;
}
$vip_id_arr = $vipResult['data']['vip_id_arr'];
$vip_count = count($vip_id_arr);
$vip_id_arr = array_column($vip_id_arr, 'id');
if (empty($vip_id_arr)) {
if ($param['page'] == 1) {
return callBack(statusCode()['error'], "未找到符合条件的会员", [
'vip_count' => 0
]);
} else {
return callBack(statusCode()['success'], "发放成功", [
'vip_count' => 0
]);
}
}
break;
case 2:
//指定
if (empty($param['vip_id_arr'])) {
return callBack(statusCode()['error'], '请选择会员');
}
$vip_id_arr = $param['vip_id_arr'];
$vip_id_arr = explode(',', $vip_id_arr);
if (empty($vip_id_arr)) {
return callBack(statusCode()['error'], "暂无可以发放的会员");
}
break;
}
$result = $this->grantOperation([
'grant_num' => $grant_num,
'vip_id_arr' => $vip_id_arr,
'coupon_list' => $coupon_list,
'batch_type' => $param['batch_type'],
'id' => $param['id'],
'operator_id' => $param['operator_id'],
'user_type' => $param['user_type']
]);
if ($param['grant_type'] == 1) {
if ($grant_num < $vip_count) {
$vip_count = $grant_num;
}
$result['data'] = [
'vip_count' => $vip_count ? intval($vip_count) : 0
];
}
return $result;
}
/**
* 发放优惠券操作
* @param $param
* [
* grant_num 发放的数量
* vip_id_arr 会员id集合
* coupon_list 优惠券集合
* batch_type 1优惠券 2券包
* operator_id 操作人id
* user_type 3商户 4门店
* id 券包id
* ]
* @return mixed
*/
public function grantOperation($param)
{
$time = $_SERVER['REQUEST_TIME'];
$vip_id_arr = $param['vip_id_arr'];
$coupon_list = $param['coupon_list'];
$grant_num = $param['grant_num'];
$id = $param['id'];
$operator_id = $param['operator_id'];
$user_type = $param['user_type'];
$batch_type = $param['batch_type'];
$VipCouponRecordModel = new RetailVipMCouponModel();
$CouponModel = new RetailMCouponModel();
$PackageCouponModel = new RetailMCouponGroupModel();
$XcxUserModel = new RetailSmallProgramUserModel();
//发放优惠券
$num = 0;
$grant_vip_num = 0; //发放的会员数
try {
foreach ($vip_id_arr as $key => $value) {
if (($key + 1) > $grant_num) {
return callBack(statusCode()['success'], '优惠券发放完毕');
} else {
$uid = $XcxUserModel->getFindField(['vid' => $value], 'id');
$isVip = $uid ? true : false;
$grant_vip_num++;
foreach ($coupon_list as $val) {
$data = [
'vid' => $value,
'mcouponid' => $val['id'],
'starttime' => $val['starttime'],
'endtime' => $val['endtime'],
'needmoney' => $val['needmoney'],
'reducemoney' => $val['reducemoney'],
'isuse' => 1,
'canusestoreids' => $val['storeids'],
'merchantid' => $val['merchantid'],
'addtime' => $time,
'status' => 2,
'type' => $val['type'],
'mcoupon_group_id' => $val['mcoupon_group_id'] ? $val['mcoupon_group_id'] : null,
'operator_id' => $operator_id,
'user_type' => $user_type
];
$record_id = $VipCouponRecordModel->addOrder($data);
if ($record_id) {
if ($isVip) {
$RetailMessageModel = new RetailMessageModel();
$RetailMessageModel->couponSkipAdd($uid, $val['id']);
}
//发放成功
$CouponModel->toSetDec([
'id' => $val['id']
], 'coupon_num', 1);
$num++;
$fisrt = "尊敬的用户,赠送您一张" . $val['coupon_name'];
switch ($val['coupontype']) {
case 1:
$remark = '提示:优惠券在' . date('Y-m-d', $val['starttime']) . '到' . date('Y-m-d', $val['endtime']) . '有效期内可以使用';
break;
case 2:
$remark = '提示:优惠券在领取日当日开始' . $val['daynum'] . '天内有效';
break;
case 3:
$remark = '提示:优惠券在领取后次日开始' . $val['daynum'] . '天内有效';
break;
}
A('Vip/Mark')->launchcoupon($value, $fisrt, $remark, $data);
}
}
if ($batch_type == 2) {
$PackageCouponModel->toSetDec(['id' => $id], 'coupon_group_num', 1);
}
}
}
if ($num > 0) {
return callBack(statusCode()['success'], "发放成功", [
'grant_vip_num' => $grant_vip_num
]);
} else {
return callBack(statusCode()['error'], "发放失败");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "发放失败");
}
}
/**
* 券包编辑
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* coupon json字符串=>[
* id 券id
* coupon_name 名称
* coupon_amount 券包数量
* coupon_list=>[
* id
* coupon_name 优惠券名称
* explain 说明
* ]
* ]
* @return mixed
*/
public function editPackage($param)
{
$VerifyClass = new VerifyParam(); //参数验证
$verifyResult = $VerifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$coupon = json_decode($param['coupon'], true);
$coupon_list = $coupon['coupon_list'];
if (empty($coupon) || empty($coupon['id'])) {
return callBack(statusCode()['error'], "登录超时");
}
if (empty($coupon_list)) {
return callBack(statusCode()['error'], "缺少优惠券信息");
}
$CouponPackageModel = new RetailMCouponGroupModel();
$package_info = $CouponPackageModel->getFind([
'id' => $coupon['id']
], 'coupon_group_allnum,coupon_group_num,id');
if (empty($package_info)) {
return callBack(statusCode()['error'], "未找到该券包");
}
$reg1 = "/^\+?[0-9][0-9]*$/";
if ($coupon['coupon_amount'] < ($package_info['coupon_group_allnum'] - $package_info['coupon_group_num']) || !preg_match($reg1, $coupon['coupon_amount'])) {
return callBack(statusCode()['error'], "请输入正确的发放数量,且不能小于已发数量" . $package_info['coupon_amount']);
}
if ($coupon['coupon_amount'] > 10000000) {
return callBack(statusCode()['error'], "券包发放总量不能超过一千万");
}
if (mb_strlen($coupon['coupon_name'], 'UTF8') > 120) {
return callBack(statusCode()['error'], "优惠券名称不能超过120个字符");
}
foreach ($coupon_list as $val) {
if (empty($val['id'])) {
return callBack(statusCode()['error'], $val['coupon_name'] . "缺少优惠券ID");
}
if (mb_strlen($val['coupon_name'], 'UTF8') > 120 || empty($val['coupon_name'])) {
return callBack(statusCode()['error'], $val['coupon_name'] . "优惠券名称不能为空且超过120个字符");
}
if (mb_strlen($val['explain'], 'UTF8') > 500) {
return callBack(statusCode()['error'], $val['coupon_name'] . "使用说明不得超过500个字符");
}
}
try {
$package = [
'coupon_group_name' => $coupon['coupon_name'],
'coupon_group_allnum' => $coupon['coupon_amount'],
'edit_time' => $_SERVER['REQUEST_TIME'],
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id']
];
$package_save = $CouponPackageModel->updateOrder([
'id' => $coupon['id']
], $package);
$coupon_group_num = $coupon['coupon_amount'] - $package_info['coupon_group_allnum'];
if ($coupon_group_num > 0) {
$num_save = $CouponPackageModel->toSetInc(['id' => $coupon['id']], 'coupon_group_num', $coupon_group_num);
} else if ($coupon_group_num < 0) {
$num_save = $CouponPackageModel->toSetDec(['id' => $coupon['id']], 'coupon_group_num', abs($coupon_group_num));
}
$CouponModel = new RetailMCouponModel();
$coupon_save_num = 0;
foreach ($coupon_list as $val) {
$data = [
'coupon_name' => $val['coupon_name'],
'detailmsg' => $val['explain'],
'coupon_allnum' => $coupon['coupon_amount'],
'edit_time' => $_SERVER['REQUEST_TIME'],
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id']
];
$coupon_save = $CouponModel->updateOrder([
'id' => $val['id']
], $data);
if ($coupon_group_num > 0) {
$coupon_num_save = $CouponModel->toSetInc(['id' => $val['id']], 'coupon_num', $coupon_group_num);
} else if ($coupon_group_num < 0) {
$coupon_num_save = $CouponModel->toSetDec(['id' => $val['id']], 'coupon_num', abs($coupon_group_num));
}
if ($coupon_save || $coupon_num_save) {
$coupon_save_num++;
}
}
if (empty($package_save) && empty($num_save) && $coupon_save_num == 0) {
return callBack(statusCode()['error'], "暂无修改");
} else {
return callBack(statusCode()['success'], "修改成功");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "暂无修改");
}
}
/**
* 创建券包
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* type 1优惠券 2券包
* coupon json字符串 优惠券信息=>
* [
* coupon_name 名称
* coupon_amount 优惠券数量
* grant_type 发放类型 1. 自主发放 2. 充值赠送 3支付成功后发放
* choose_store 指定门店类型 0所有门店 1指定门店
* store_id_arr 指定的门店id 集合
* choose_grade 指定会员等级 0所有等级 1指定等级 -1plus会员
* vip_grade_id 优惠券发放用户vip等级:-1、plus会员 0、所有用户;其他:以等级id连接
* coupon_list=>[
* coupon_name 优惠券名称
* consumption_threshold 消费门槛
* discount_amount 优惠金额
* explain 说明
* validity_time_type 有效期类型:1,开始---结束。2,领取日后N天,3,领取日次日后N天。
* appoint_type 1 全部商品 2指定分类 3指定商品
* appoint_id_arr 指定分类或商品id的集合
* start_time 有效期的开始时间
* end_time 有效期的结束时间
* day_num 领取后的有效天数
* ]
* ]
* ]
* @return mixed
*/
public function createCouponPackage($param)
{
$verifyResult = $this->createCouponVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$time = $_SERVER['REQUEST_TIME'];
$coupon = $param['coupon']; //券包信息
$couponList = $coupon['coupon_list']; //优惠券信息
$data = [
'merchantid' => $param['merchant_id'],
'coupon_group_name' => $coupon['coupon_name'],
'coupon_group_allnum' => $coupon['coupon_amount'],
'coupon_group_num' => $coupon['coupon_amount'],
'give_status' => $coupon['grant_type'],
'status' => 3,
'addtime' => $time,
'edit_time' => $time,
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id'],
'user_type' => $param['user_type']
]; //券包信息
$single_coupon = [
'merchantid' => $param['merchant_id'],
'coupon_allnum' => $coupon['coupon_amount'],
'coupon_num' => $coupon['coupon_amount'],
'give_status' => $coupon['grant_type'],
'type' => 2,
'maxnum' => 0,
'status' => 1,
'addtime' => $time,
'user_type' => $param['user_type'],
'edit_time' => $time,
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id'],
]; //单张优惠券信息
switch ($coupon['grant_type']) {
case '1':
// 1. 自主发放
if (($coupon['choose_store'] == 1 && $param['user_type'] == 3)) {
$data['storeids'] = $coupon['store_id_arr'];
$single_coupon['storeids'] = $data['storeids'];
} else if ($param['user_type'] == 4) {
$data['storeids'] = $param['store_id'];
$single_coupon['storeids'] = $param['store_id'];
} else {
$data['storeids'] = 0;
$single_coupon['storeids'] = 0;
}
switch ($coupon['choose_grade']) {
case '-1':
$data['gradeids'] = '-1';
$single_coupon['coupon_gradeid'] = '-1';
break;
case '0':
$data['gradeids'] = '0';
$single_coupon['coupon_gradeid'] = '0';
break;
case '1':
$data['gradeids'] = $coupon['vip_grade_id'];
$single_coupon['coupon_gradeid'] = $data['coupon_gradeid'];
break;
}
break;
case '2':
//充值
$data['gradeids'] = '0';
$single_coupon['coupon_gradeid'] = '0';
if (($coupon['choose_store'] == 1 && $param['user_type'] == 3)) {
$data['storeids'] = $coupon['store_id_arr'];
$single_coupon['storeids'] = $data['storeids'];
} else if ($param['user_type'] == 4) {
$data['storeids'] = $param['store_id'];
$single_coupon['storeids'] = $param['store_id'];
} else {
$data['storeids'] = 0;
$single_coupon['storeids'] = 0;
}
break;
}
try {
M()->startTrans();
$MCouponGroupModel = new RetailMCouponGroupModel();
$package_id = $MCouponGroupModel->addOrder($data);
if (empty($package_id)) {
M()->rollback();
return callBack(statusCode()['error'], "券包创建失败");
}
$single_coupon['mcoupon_group_id'] = $package_id;
$z_single_coupon = []; //单张优惠券集合
$package_coupon_money = 0;
foreach ($couponList as $val) {
$package_coupon_money += $val['discount_amount'];
$single_coupon['coupon_name'] = $val['coupon_name'];
$single_coupon['detailmsg'] = $val['explain'] ? $val['explain'] : '';
$single_coupon['needmoney'] = $val['consumption_threshold'];
$single_coupon['reducemoney'] = $val['discount_amount'];
$single_coupon['coupontype'] = $val['validity_time_type'];
switch ($val['validity_time_type']) {
case '1':
$single_coupon['starttime'] = strtotime($val['start_time']);
$single_coupon['endtime'] = strtotime($val['end_time']);
$single_coupon['daynum'] = 1; //默认值
break;
case '2':
case '3':
$single_coupon['starttime'] = ''; //默认值
$single_coupon['endtime'] = '';
$single_coupon['daynum'] = $val['day_num'];
break;
}
if (($coupon['choose_store'] == 1 && count($data['storeids']) == 1 && $param['user_type'] == 3) || $param['user_type'] == 4) {
$single_coupon['appoint_type'] = $val['appoint_type'] ? $val['appoint_type'] : 1;
if ($val['appoint_type'] == 2 || $val['appoint_type'] == 3) {
$single_coupon['appoint_id_str'] = $val['appoint_id_arr'];
}
}
$single_coupon['appoint_type'] = $single_coupon['appoint_type'] ? $single_coupon['appoint_type'] : 1;
$single_coupon['appoint_id_str'] = $single_coupon['appoint_id_str'] ? $single_coupon['appoint_id_str'] : null;
$z_single_coupon[] = $single_coupon;
unset($single_coupon['starttime']);
unset($single_coupon['endtime']);
unset($single_coupon['daynum']);
unset($single_coupon['appoint_type']);
unset($single_coupon['appoint_id_str']);
}
$CouponModel = new RetailMCouponModel();
$single_id = $CouponModel->addAll($z_single_coupon);
if (empty($single_id)) {
M()->rollback();
return callBack(statusCode()['error'], "创建失败");
}
$save = $MCouponGroupModel->updateOrder([
'id' => $package_id
], [
'status' => 1,
'coupon_group_money' => $package_coupon_money
]);
if ($save) {
M()->commit();
return callBack(statusCode()['success'], "创建成功");
} else {
M()->rollback();
return callBack(statusCode()['error'], "创建失败");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "创建失败");
}
}
/**
* 编辑优惠券
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* coupon json字符串=>[
* id 券id
* coupon_name 名称
* coupon_amount 优惠券数量
* explain 说明
* ]
* ]
* @return mixed
*/
public function editCoupon($param)
{
$VerifyClass = new VerifyParam();
$verifyResult = $VerifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$coupon = json_decode($param['coupon'], true);
if (empty($coupon) || empty($coupon['id'])) {
return callBack(statusCode()['error'], "登录超时");
}
$where = [
'id' => $coupon['id']
];
try {
$CouponModel = new RetailMCouponModel();
$coupon_info = $CouponModel->getFind($where, "coupon_allnum,id,coupon_num");
if (empty($coupon_info)) {
return callBack(statusCode()['error'], "未找到该优惠券");
}
if ($coupon['coupon_amount'] < ($coupon_info['coupon_allnum'] - $coupon_info['coupon_num'])) {
return callBack(statusCode()['error'], "优惠券发放总量不能小于已发数量" . $coupon_info['coupon_allnum']);
}
if (mb_strlen($coupon['coupon_name'], 'UTF8') > 120) {
return callBack(statusCode()['error'], "优惠券名称不能超过120个字符");
}
if ($coupon['coupon_amount'] > 10000000 || $coupon['coupon_amount'] <= 0) {
return callBack(statusCode()['error'], "优惠券发放总量不能超过一千万");
}
if (mb_strlen($coupon['explain'], 'UTF8') > 500) {
return callBack(statusCode()['error'], "使用说明不得超过500个字符");
}
$data = [
'coupon_name' => $coupon['coupon_name'],
'coupon_allnum' => $coupon['coupon_amount'],
'detailmsg' => $coupon['explain'],
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id'],
'edit_time' => $_SERVER['REQUEST_TIME'],
];
$result = $CouponModel->updateOrder($where, $data);
$coupon_num = $coupon['coupon_amount'] - $coupon_info['coupon_allnum'];
if ($coupon_num > 0) {
$save_num = $CouponModel->toSetInc($where, 'coupon_num', $coupon_num);
} else if ($coupon_num < 0) {
$save_num = $CouponModel->toSetDec($where, 'coupon_num', $coupon_num);
}
if ($result || $save_num) {
return callBack(statusCode()['success'], "修改成功");
} else {
return callBack(statusCode()['error'], "暂无修改");
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "暂无修改");
}
}
/**
* 创建优惠券
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* type 1优惠券 2券包
* coupon json字符串 优惠券信息=>
* [
* coupon_name 名称
* coupon_amount 优惠券数量
* consumption_threshold 消费门槛
* discount_amount 优惠金额
* explain 说明
* grant_type 发放类型 1. 自主发放 2. 充值赠送 3支付成功后发放
* validity_time_type 有效期类型:1,开始---结束。2,领取日后N天,3,领取日次日后N天。
* choose_store 指定门店类型 0所有门店 1指定门店
* store_id_arr 指定的门店id 集合
* appoint_type 1 全部商品 2指定分类 3指定商品
* appoint_id_arr 指定分类或商品id的集合
* choose_grade 指定会员等级 0所有等级 1指定等级 -1plus会员
* vip_grade_id 优惠券发放用户vip等级:-1、plus会员 0、所有用户;其他:以等级id连接
* start_time 有效期的开始时间
* end_time 有效期的结束时间
* day_num 领取后的有效天数
* ]
* ]
* @return mixed
*/
public function createCoupon($param)
{
$verifyResult = $this->createCouponVerify($param); //参数验证
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
$coupon = $param['coupon'];
$data = [
'merchantid' => $param['merchant_id'],
'coupon_name' => $coupon['coupon_name'],
'coupon_allnum' => $coupon['coupon_amount'],
'coupon_num' => $coupon['coupon_amount'],
'needmoney' => $coupon['consumption_threshold'],
'reducemoney' => $coupon['discount_amount'],
'detailmsg' => $coupon['explain'] ? $coupon['explain'] : '',
'give_status' => $coupon['grant_type'],
'coupontype' => $coupon['validity_time_type'],
'type' => 1,
'status' => 1,
'maxnum' => 0,
'addtime' => $_SERVER['REQUEST_TIME'],
'edit_time' => $_SERVER['REQUEST_TIME'],
'operator_type' => $param['operator_type'],
'operator_id' => $param['operator_id'],
'user_type' => $param['user_type']
];
//处理门店限制、商品限制
if ($coupon['choose_store'] == 1) {
if ($param['user_type'] == 3) {
$data['storeids'] = $coupon['store_id_arr'];
} else if ($param['user_type'] == 4) {
$data['storeids'] = $param['store_id'];
}
//商品限制
if (count($data['storeids']) == 1 && ($coupon['appoint_type'] == 2 || $coupon['appoint_type'] == 3)) {
$data['appoint_id_str'] = $coupon['appoint_id_arr'];
}
} else {
//门店端创建则限制为该门店
$data['storeids'] = $param['user_type'] == 4 ? $param['store_id'] : 0;
}
//处理发放类型 1自主发放 2充值赠送 3支付成功后发放
switch ($coupon['grant_type']) {
case '1':
case '3':
// (1自主发放 3支付成功后发放—) 可限制会员等级
switch ($coupon['choose_grade']) {
case '-1':
$data['coupon_gradeid'] = '-1';
break;
case '0':
$data['coupon_gradeid'] = '0';
break;
case '1':
$data['coupon_gradeid'] = $coupon['vip_grade_id'];
break;
}
break;
case '2':
//充值-不限制会员等级
$data['coupon_gradeid'] = '0';
break;
}
switch ($coupon['validity_time_type']) {
case '1':
$data['starttime'] = strtotime($coupon['start_time']);
$data['endtime'] = strtotime($coupon['end_time']);
break;
case '2':
case '3':
$data['daynum'] = $coupon['day_num'];
break;
}
$data['appoint_id_str'] = $data['appoint_id_str'] ? $data['appoint_id_str'] : null;
$data['appoint_type'] = $coupon['appoint_type'] ? $coupon['appoint_type'] : 1;
try {
$CouponModel = new RetailMCouponModel();
$id = $CouponModel->addOrder($data);
if (empty($id)) {
return callBack(statusCode()['error'], "创建失败");
} else {
return callBack(statusCode()['success'], "创建成功", ['coupon_id' => $id]);
}
} catch (\Exception $e) {
return callBack(statusCode()['error'], "创建失败");
}
}
/**
* 创建优惠券参数验证
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* type 1优惠券 2券包
* coupon json字符串 优惠券信息=>
* [
* coupon_name 名称
* coupon_amount 优惠券数量
* consumption_threshold 消费门槛
* discount_amount 优惠金额
* explain 说明
* grant_type 发放类型 1. 自主发放 2. 充值赠送 3支付成功后发放
* validity_time_type 有效期类型:1,开始---结束。2,领取日后N天,3,领取日次日后N天。
* choose_store 指定门店类型 0所有门店 1指定门店
* store_id_arr 指定的门店id 集合
* appoint_type 1 全部商品 2指定分类 3指定商品
* appoint_id_arr 指定分类或商品id的集合
* choose_grade 指定会员等级 0所有等级 1指定等级 -1plus会员
* vip_grade_id 优惠券发放用户vip等级:-1、plus会员 0、所有用户;其他:以等级id连接
* start_time 有效期的开始时间
* end_time 有效期的结束时间
* day_num coupontype:为2/3时有效。领取后的有效天数
* ]
* coupon json字符串 券包=>
* [
* coupon_name 名称
* coupon_amount 优惠券数量
* grant_type 发放类型 1. 自主发放 2. 充值赠送 3支付成功后发放
* choose_store 指定门店类型 0所有门店 1指定门店
* store_id_arr 指定的门店id 集合
* choose_grade 指定会员等级 0所有等级 1指定等级 -1plus会员
* vip_grade_id 优惠券发放用户vip等级:-1、plus会员 0、所有用户;其他:以等级id连接
* coupon_list=>[
* coupon_name 名称
* consumption_threshold 消费门槛
* discount_amount 优惠金额
* explain 说明
* validity_time_type 有效期类型:1,开始---结束。2,领取日后N天,3,领取日次日后N天。
* appoint_type 1 全部商品 2指定分类 3指定商品
* appoint_id_arr 指定分类或商品id的集合
* start_time 有效期的开始时间
* end_time 有效期的结束时间
* day_num coupontype:为2/3时有效。领取后的有效天数
* ]
* ]
* ]
* @return mixed
*/
public function createCouponVerify(&$param)
{
$verifyClass = new VerifyParam();
$verifyResult = $verifyClass->identityVerify($param);
if ($verifyResult['status'] != 1) {
return $verifyResult;
}
if (empty($param['operator_id'])) {
return callBack(statusCode()['error'], "登录超时");
}
$coupon = json_decode($param['coupon'], true);
if (empty($coupon) || !in_array($param['type'], ['1', '2'])) {
return callBack(statusCode()['error'], "请输入正确的优惠券信息");
}
$param['coupon'] = $coupon;
if ($param['type'] == 2) {
$name = '券包';
if (count($coupon['coupon_list']) > 20) {
return callBack(statusCode()['error'], "一个券包最多只能含有20张优惠券");
}
if (count($coupon['coupon_list']) <= 0) {
return callBack(statusCode()['error'], "请创建优惠券");
}
} else {
$name = '优惠券';
}
if (empty($coupon['coupon_amount'])) {
return callBack(statusCode()['error'], '请输入' . $name . '数量');
}
if ($coupon['coupon_amount'] > 10000000 || $coupon['coupon_amount'] <= 0) {
return callBack(statusCode()['error'], $name . '发放总量不能超过一千万');
}
if (!in_array($coupon['grant_type'], ['1', '2', '3'])) {
return callBack(statusCode()['error'], "请选择正确的发放类型");
}
switch ($coupon['grant_type']) {
case '1':
case '3':
//自主发放 支付发放
if ($param['user_type'] == 3) {
//商户后台
if (!in_array($coupon['choose_store'], ['0', '1'])) {
return callBack(statusCode()['error'], "请选择门店");
}
if ($coupon['choose_store'] == 1 && empty($coupon['store_id_arr'])) {
return callBack(statusCode()['error'], "请指定门店");
}
}
if (!in_array($coupon['choose_grade'], ['0', '1', '-1'])) {
return callBack(statusCode()['error'], "请选择指定会员等级");
}
if ($coupon['choose_grade'] == 1 && empty($coupon['vip_grade_id'])) {
return callBack(statusCode()['error'], "请选择指定等级会员");
}
break;
}
switch ($param['type']) {
case 1:
//优惠券
$PartVerifyResult = $this->createCouponPartVerify($param); //局部参数验证
return $PartVerifyResult;
break;
case 2:
//券包
if (empty($coupon['coupon_name'])) {
return callBack(statusCode()['error'], "请输入券包名称");
}
if (mb_strlen($coupon['coupon_name'], 'UTF8') > 120) {
return callBack(statusCode()['error'], "券包名称不能超过120个字符");
}
$coupon_list = $coupon['coupon_list'];
if (empty($coupon_list)) {
return callBack(statusCode()['error'], "请创建优惠券");
}
foreach ($coupon_list as $key => $val) {
$PartVerifyResult = $this->createCouponPartVerify(['coupon' => $val]);
if ($PartVerifyResult['status'] != 1) {
$PartVerifyResult['message'] = '第' . ($key + 1) . '张' . $PartVerifyResult['message'];
return $PartVerifyResult;
}
}
return callBack(statusCode()['success'], "验证成功");
break;
}
}
/**
* 创建优惠券局部参数验证
* @param $param
* [
* operator_type 1后台 2收银端 3助手端
* operator_id 操作人id
* user_type 3商户 4门店
* merchant_id
* store_id
* coupon json字符串 优惠券信息=>
* [
* coupon_name 名称
* grant_type 发放类型 1. 自主发放 2. 充值赠送 3支付成功后发放
* validity_time_type 有效期类型:1,开始---结束。2,领取日后N天,3,领取日次日后N天。
* choose_store 指定门店类型 0所有门店 1指定门店
* store_id_arr 指定的门店id 集合
* appoint_type 1 全部商品 2指定分类 3指定商品
* appoint_id_arr 指定分类或商品id的集合
* choose_grade 指定会员等级 0所有等级 1指定等级 -1plus会员
* vip_grade_id 优惠券发放用户vip等级:-1、plus会员 0、所有用户;其他:以等级id连接
* start_time 有效期的开始时间
* end_time 有效期的结束时间
* day_num 领取后的有效天数
* ]
* ]
* @return mixed
*/
public function createCouponPartVerify($param)
{
$coupon = $param['coupon'];
$reg1 = "/^\+?[0-9][0-9]*$/";
$reg2 = "/^[0-9]+(.[0-9]{1,2})?$/";
$time = $_SERVER['REQUEST_TIME'];
if (empty($coupon['coupon_name']) || empty($coupon['discount_amount']) || empty($coupon['consumption_threshold'])) {
return callBack(statusCode()['error'], "请完善表单");
}
if (mb_strlen($coupon['coupon_name'], 'UTF8') > 120) {
return callBack(statusCode()['error'], "优惠券名称不能超过120个字符");
}
if (!preg_match($reg2, $coupon['discount_amount'])) {
return callBack(statusCode()['error'], "请输入正确的优惠金额");
}
if (!preg_match($reg2, $coupon['consumption_threshold']) || $coupon['consumption_threshold'] > 10000000) {
return callBack(statusCode()['error'], "请输入正确的消费门槛,消费门槛最高一千万");
}
if ($coupon['discount_amount'] >= $coupon['consumption_threshold']) {
return callBack(statusCode()['error'], "优惠金额必须小于消费门槛");
}
if (mb_strlen($coupon['explain'], 'UTF8') > 500) {
return callBack(statusCode()['error'], "使用说明不得超过500个字符");
}
if (!in_array($coupon['validity_time_type'], ['1', '2', '3'])) {
return callBack(statusCode()['error'], "请选择正确的有效期");
}
switch ($coupon['validity_time_type']) {
case '1':
//固定日期
if (empty($coupon['start_time']) || empty($coupon['end_time'])) {
return callBack(statusCode()['error'], "请选择优惠券的有效期");
}
$start_time = strtotime($coupon['start_time']);
$end_time = strtotime($coupon['end_time']);
if ($start_time < $time) {
return callBack(statusCode()['error'], "开始时间不得早于当前时间");
}
$cha = ($start_time - $time) / 86400;
if ($cha > 60) {
return callBack(statusCode()['error'], "开始时间不得晚于当前时间后60天");
}
if ($end_time <= $start_time) {
return callBack(statusCode()['error'], "结束时间必须大于开始时间");
}
$cha = ($end_time - $start_time) / 86400;
if ($cha > 90) {
return callBack(statusCode()['error'], "领取时间不能超过90天");
}
break;
case '2':
case '3':
//领到券当日开始或次日开始
if (empty($coupon['day_num']) || !preg_match($reg1, $coupon['day_num'])) {
return callBack(statusCode()['error'], "请输入正确的有效期");
}
if ($coupon['day_num'] > 90) {
return callBack(statusCode()['error'], "有效期最长90天内有效");
}
break;
}
switch ($coupon['grant_type']) {
case '1':
case '3':
//自主发放 支付发放
if ((count($coupon['store_id_arr']) == 1 && $param['user_type'] == 3 && $param['choose_store'] == 1) || $param['user_type'] == 4) {
if (!in_array($coupon['appoint_type'], ['1', '2', '3'])) {
return callBack(statusCode()['error'], "请指定可使用类型");
}
if ($coupon['appoint_type'] == 2 && empty($coupon['appoint_id_arr'])) {
return callBack(statusCode()['error'], "请指定分类");
}
if ($coupon['appoint_type'] == 3 && empty($coupon['appoint_id_arr'])) {
return callBack(statusCode()['error'], "请指定商品");
}
}
break;
}
return callBack(statusCode()['success'], "验证成功");
}
}