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'], "验证成功"); } }