123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?php
- namespace JinDouYun\Model\Cart;
- use Mall\Framework\Core\ErrorCode;
- use Mall\Framework\Core\ResultWrapper;
- use Mall\Framework\Core\StatusCode;
- use JinDouYun\Model\Market\MUserCoupon;
- use JinDouYun\Model\Market\MVipCard;
- class MPreferentialProcess{
- private $onlineUserCenterid;
- private $onlineEnterPriseId;
- private $userCouponIsMutex;
- public function __construct($onlineUserCenterid, $onlineEnterPriseId)
- {
- $this->onlineUserCenterid = $onlineUserCenterid;
- $this->onlineEnterPriseId = $onlineEnterPriseId;
- }
-
- public function Preferential($cartGoodsData, $vipCardId, $userCouponId)
- {
- $tmpCartGoodsData = $cartGoodsData;
-
- if( !$vipCardId && !$userCouponId ) {
- return ResultWrapper::success($cartGoodsData);
- }
- $vipCartData = [];
-
- if( $vipCardId ){
-
- $vipCartData = self::vipCartData($vipCardId);
- if(!$vipCartData->isSuccess()){
- return ResultWrapper::fail($vipCartData->getData(), $vipCartData->getErrorCode());
- }
- $vipCartData = $vipCartData->getData();
-
- if($vipCartData['vipDiscount'] == StatusCode::$delete){
- return ResultWrapper::success($cartGoodsData);
- }
-
- $cartGoodsData = self::vipCartCompute($cartGoodsData, $vipCartData);
- if(!$cartGoodsData->isSuccess()){
- return ResultWrapper::fail($cartGoodsData->getData(), $cartGoodsData->getErrorCode());
- }
- $cartGoodsData = $cartGoodsData->getData();
- }
-
- if( $userCouponId ){
-
- $userCouponData = self::couponData($userCouponId);
- if(!$userCouponData->isSuccess()){
- return ResultWrapper::fail($userCouponData->getData(), $userCouponData->getErrorCode());
- }
- $userCouponData = $userCouponData->getData();
- $this->userCouponIsMutex = $userCouponData['isMutex'];
-
-
- if( $cartGoodsData['vipDiscount'] > 0 && ($cartGoodsData['payMoney'] < $userCouponData['reducePrice']) ) {
-
- $tmpCartGoodsData = self::userCouponCompute($tmpCartGoodsData, $userCouponData);
- if(!$tmpCartGoodsData->isSuccess()){
- return ResultWrapper::fail($tmpCartGoodsData->getData(), $tmpCartGoodsData->getErrorCode());
- }
- $tmpCartGoodsData = $tmpCartGoodsData->getData();
-
- $tmpCartGoodsData = self::vipCartCompute($tmpCartGoodsData, $vipCartData);
- if(!$tmpCartGoodsData->isSuccess()){
- return ResultWrapper::fail($tmpCartGoodsData->getData(), $tmpCartGoodsData->getErrorCode());
- }
- $cartGoodsData = $tmpCartGoodsData->getData();
- }else{
-
- $cartGoodsData = self::userCouponCompute($cartGoodsData, $userCouponData);
- if(!$cartGoodsData->isSuccess()){
- return ResultWrapper::fail($cartGoodsData->getData(), $cartGoodsData->getErrorCode());
- }
- $cartGoodsData = $cartGoodsData->getData();
- }
- }
- return ResultWrapper::success($cartGoodsData);
- }
-
- public function userCouponCompute($cartGoodsData, $userCouponData)
- {
- switch ($userCouponData['applyRange']){
- case StatusCode::$applyRange['allGoods']:
-
- if( $userCouponData['minPrice'] == 0 || $cartGoodsData['payMoney'] >= $userCouponData['minPrice'] ){
- $result = self::userCouponDiscountCommon($cartGoodsData['payMoney'], $userCouponData['reducePrice']);
- $cartGoodsData['payMoney'] = $result['discountEndPayMoney'];
- $cartGoodsData['preferential'] = $result['discountIngPayMoney'];
- }
- break;
- case StatusCode::$applyRange['appointCategory']:
- $result = self::userCouponDiscountByGoods('categoryId', 'categoryCollect', $cartGoodsData,$userCouponData);
- if(!$result->isSuccess()){
- return ResultWrapper::fail($result->getErrorCode(), $result->getData());
- }
- $cartGoodsData = $result->getData();
- break;
- case StatusCode::$applyRange['appointBrand']:
- $result = self::userCouponDiscountByGoods('brandId', 'brandCollect', $cartGoodsData,$userCouponData);
- if(!$result->isSuccess()){
- return ResultWrapper::fail($result->getErrorCode(), $result->getData());
- }
- $cartGoodsData = $result->getData();
- break;
- case StatusCode::$applyRange['goodsCollect']:
- $result = self::userCouponDiscountByGoods('goodsId', 'goodsCollect', $cartGoodsData, $userCouponData);
- if(!$result->isSuccess()){
- return ResultWrapper::fail($result->getErrorCode(), $result->getData());
- }
- $cartGoodsData = $result->getData();
- break;
- }
- if ($cartGoodsData['payMoney'] < 0) {
- $cartGoodsData['payMoney'] = 0;
- }
- return ResultWrapper::success($cartGoodsData);
- }
-
- public function userCouponDiscountByGoods($type, $typeField, $cartGoodsData, $userCouponData)
- {
- if( empty($userCouponData[$typeField]) ){
- return ResultWrapper::success($cartGoodsData);
- }
- $goodsAmount = 0;
- $couponBrand = explode(',', $userCouponData[$typeField]);
-
- foreach ($cartGoodsData['goodsData'] as $shop) {
- foreach ($shop['shopGoodsData'] as $value) {
- if (in_array($value[$type], $couponBrand)) {
- $goodsAmount = bcadd($goodsAmount, $value['totalMoney']);
- }
- }
- }
- if( $goodsAmount <= 0 ){
- return ResultWrapper::fail('参与优惠劵优惠的商品总金额异常', ErrorCode::$notAllowAccess);
- }
-
- if( $userCouponData['minPrice'] == 0 || $goodsAmount >= $userCouponData['minPrice'] ){
- $result = self::userCouponDiscountCommon($goodsAmount, $userCouponData['reducePrice']);
- $cartGoodsData['payMoney'] = bcsub($cartGoodsData['payMoney'], $result['discountIngPayMoney'], 2);
- $cartGoodsData['preferential'] = $result['discountIngPayMoney'];
- }
- return ResultWrapper::success($cartGoodsData);
- }
-
- public function userCouponDiscountCommon($discountBeforePayMoney, $discountMoney)
- {
- $discountEndPayMoney = bcsub($discountBeforePayMoney, $discountMoney, 2);
-
- $discountIngPayMoney = ($discountEndPayMoney < 0 ) ? $discountBeforePayMoney : $discountMoney;
- return [
- 'discountEndPayMoney' => ($discountEndPayMoney < 0) ? 0 : $discountEndPayMoney,
- 'discountIngPayMoney' => $discountIngPayMoney,
- ];
- }
-
- public function vipCartCompute($cartGoodsData, $vipCartData)
- {
- $discount = bcdiv($vipCartData['discount'], 10, 2);
-
- if ($vipCartData['mode'] == StatusCode::$standard) {
- $result = self::vipCartDiscountCommon($cartGoodsData['payMoney'], $discount);
- $cartGoodsData['payMoney'] = $result['discountEndPayMoney'];
- $cartGoodsData['vipDiscount'] = $result['discountIngPayMoney'];
-
-
- }else{
- if( empty($vipCartData['goodsIds']) ){
- return ResultWrapper::success($cartGoodsData);
- }
- $goodsAmount = 0;
- $vipGoodsIds = explode(',', $vipCartData['goodsIds']);
-
- foreach ($cartGoodsData['goodsData'] as $shop) {
- foreach ($shop['shopGoodsData'] as $value) {
- if (in_array($value['goodsId'], $vipGoodsIds)) {
- $goodsAmount = bcadd($goodsAmount, $value['totalMoney']);
- }
- }
- }
- if( $goodsAmount <= 0 ){
- return ResultWrapper::fail('参与会员卡优惠的商品总金额异常', ErrorCode::$notAllowAccess);
- }
- $result = self::vipCartDiscountCommon($goodsAmount, $discount);
- $cartGoodsData['payMoney'] = bcsub($cartGoodsData['payMoney'], $result['discountIngPayMoney']);
- $cartGoodsData['vipDiscount'] = $result['discountIngPayMoney'];
-
-
- }
- if ($cartGoodsData['payMoney'] < 0) {
- $cartGoodsData['payMoney'] = 0;
- }
- return ResultWrapper::success($cartGoodsData);
- }
-
- public function vipCartDiscountCommon($discountBeforePayMoney, $discount)
- {
- $discountEndPayMoney = bcmul( $discountBeforePayMoney, $discount, 2);
- $discountIngPayMoney = bcsub($discountBeforePayMoney, $discountEndPayMoney, 2);
- return [
- 'discountEndPayMoney' => ($discountEndPayMoney < 0) ? 0 : $discountEndPayMoney,
- 'discountIngPayMoney' => ($discountIngPayMoney < 0) ? 0 : $discountIngPayMoney,
- ];
- }
-
- public function vipCartData($vipCardId)
- {
- $objMVipCard = new MVipCard($this->onlineEnterPriseId, $this->onlineUserCenterid, true);
- $dbResult = $objMVipCard->getVipCardInfo($vipCardId);
- if(!$dbResult->isSuccess()){
- return ResultWrapper::fail($dbResult->getData(), $dbResult->getErrorCode());
- }
- $vipCartData = $dbResult->getData();
- if( empty($vipCardId) ){
- return ResultWrapper::fail('要使用的会员卡不存在', ErrorCode::$contentNotExists);
- }
-
- if($vipCartData['deleteStatus'] == StatusCode::$delete){
- return ResultWrapper::fail('当前购买的vip会员卡被删除了', ErrorCode::$notAllowAccess);
- }
-
- if($vipCartData['enableStatus'] == StatusCode::$delete){
- return ResultWrapper::fail('当前购买的vip会员卡被禁用了', ErrorCode::$notAllowAccess);
- }
- return ResultWrapper::success($vipCartData);
- }
-
- public function couponData($userCouponId)
- {
-
- $objMUserCoupon = new MUserCoupon($this->onlineUserCenterid, $this->onlineEnterPriseId);
- $condition = [
- 'id' => $userCouponId,
- ];
- $userCouponData = $objMUserCoupon->getUserCoupon($condition);
- if(!$userCouponData->isSuccess()){
- return ResultWrapper::fail($userCouponData->getData(), $userCouponData->getErrorCode());
- }
- $userCouponData = $userCouponData->getData();
- if(empty($userCouponData)){
- return ResultWrapper::fail('要使用的优惠劵不存在', ErrorCode::$contentNotExists);
- }
- $userCouponData = array_pop($userCouponData);
-
- if($userCouponData['isUse'] == StatusCode::$delete){
- return ResultWrapper::fail('当前领取的优惠券已经使用过了', ErrorCode::$notAllowAccess);
- }
-
- if (time() <= $userCouponData['startTime'] || time() >= $userCouponData['endTime']){
- return ResultWrapper::fail('当前领取的优惠券已经过期了', ErrorCode::$notAllowAccess);
- }
- return ResultWrapper::success($userCouponData);
- }
- }
|