1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228 |
- <?php
- namespace JinDouYun\Model\Cashier;
- use JinDouYun\Cache\ActivityLimitCache;
- use JinDouYun\Cache\GoodsBasicRelevant;
- use JinDouYun\Controller\Common\Logger;
- use JinDouYun\Dao\Cashier\DCashierCart;
- use JinDouYun\Dao\Cashier\DCashierCustomerPrice;
- use JinDouYun\Model\Customer\MCustomer;
- use JinDouYun\Model\Goods\MGoods;
- use JinDouYun\Model\GoodsManage\MSku;
- use JinDouYun\Model\Market\MActivity;
- use JinDouYun\Model\Market\MUserCoupon;
- use JinDouYun\Model\Price\MPrice;
- use JinDouYun\Model\Shop\MShop;
- use JinDouYun\Model\Stock\MInventory;
- use Mall\Framework\Core\ErrorCode;
- use Mall\Framework\Core\ResultWrapper;
- use Mall\Framework\Core\StatusCode;
- class MCashierCart
- {
- /**
- * @var int
- */
- private $onlineUserId;
- /**
- * @var int
- */
- private $onlineEnterpriseId;
- /**
- * @var int
- */
- private $cashierUid;
- /**
- * @var MGoods
- */
- private $objMGoods;
- /**
- * @var DCashierCart
- */
- private $objDCashierCart;
- /**
- * @var ActivityLimitCache
- */
- private $objActivityLimitCache;
- /**
- * @var MSku
- */
- private $objMSku;
- /**
- * @var int
- */
- private $customerId;
- /**
- * @var MCustomer
- */
- private $objMCustomer;
- /**
- * @var DCashierCustomerPrice
- */
- private $objDCashierCustomerPrice;
- /**
- * @var array 失效商品集合
- */
- private $invalidData = [];
- /**
- * @var array 操作类型
- */
- private static $type = [
- 'single' => 1,//单个商品
- 'shop' => 2,//按店铺
- 'all' => 3,//全选
- ];
- /**
- * @var array 阶梯价
- */
- private static $enabledLadder = [
- 'open' => 1,//启用阶梯价
- 'close' => 0,//未启用阶梯价
- ];
- /**
- * @var MCashierSettings
- */
- private $objMCashierSettings;
- /**
- * MCashierCart constructor.
- * @param $onlineUserId
- * @param $onlineEnterpriseId
- * @param $cashierUid
- * @throws \Exception
- */
- public function __construct($onlineUserId, $onlineEnterpriseId,$cashierUid)
- {
- $this->onlineUserId = $onlineUserId;
- $this->onlineEnterpriseId = $onlineEnterpriseId;
- $this->cashierUid = $cashierUid;
- $this->objMGoods = new MGoods($this->onlineEnterpriseId,true,$this->onlineUserId);
- $this->objDCashierCart = new DCashierCart();
- $this->objDCashierCart->setTable('qianniao_cashier_cart_'.$this->onlineEnterpriseId);
- $this->objActivityLimitCache = new ActivityLimitCache($this->onlineEnterpriseId);
- $this->objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
- $this->objMCustomer = new MCustomer($this->onlineEnterpriseId,$this->onlineUserId);
- $this->objDCashierCustomerPrice = new DCashierCustomerPrice();
- $this->objDCashierCustomerPrice->setTable('qianniao_cashier_customer_price_'.$this->onlineEnterpriseId);
- $this->objMCashierSettings = new MCashierSettings($this->onlineUserId,$this->onlineEnterpriseId);
- }
- /**
- * 获取客户id,匿名用户使用匿名客户id
- */
- private function getCustomerInfo()
- {
- if ($this->onlineUserId == StatusCode::$noneUserCenter){
- $this->customerId = StatusCode::$noneCustomer;
- }else{
- $this->customerId = $this->objMCustomer->getCustomerIdByUserCenterId($this->onlineUserId);
- }
- }
- /**
- * Doc: (des="收银台加入购物车")
- * User: XMing
- * Date: 2020/9/17
- * Time: 2:24 下午
- * @param array $params
- * @return ResultWrapper
- * @throws \Exception
- */
- public function addCartApi($params)
- {
- $data = $params['goodsData'];
- if (empty($data)){
- return ResultWrapper::fail('加入购物车数据为空',ErrorCode::$paramError);
- }
- $data = array_shift($data);//小程序端加入购物车都是单个
- //验证此商品是否有效
- $goodsInfoResult = $this->objMGoods->getGoodsInfo($data['goodsId']);
- if (!$goodsInfoResult->isSuccess()){
- return ResultWrapper::fail($goodsInfoResult->getData(),$goodsInfoResult->getErrorCode());
- }
- $goodsInfo = $goodsInfoResult->getData();
- $checkResult = self::checkGoods($goodsInfo,$data);
- unset($data);
- if (!$checkResult->isSuccess()){
- return ResultWrapper::fail($checkResult->getData(),$checkResult->getErrorCode());
- }
- $data = $checkResult->getData();
- $addMap = [
- 'cashierUid' => $this->cashierUid,
- 'goodsBasicId' => $data['goodsBasicId'],
- 'goodsId' => $data['goodsId'],
- 'skuId' => $data['skuId'],
- 'buyNum' => $data['buyNum'],
- 'shopId' => $data['shopId'],
- 'source' => $data['source'],
- 'setNum' => $data['setNum'],
- 'activityId' => 0,
- 'goodsCode' => $data['goodsCode'],
- 'warehouseId' => $data['warehouseId']
- ];
- $groupResult = self::existCartAndGroup([$addMap]);
- if (!$groupResult->isSuccess()){
- return ResultWrapper::fail($groupResult->getData(),$groupResult->getErrorCode());
- }
- $groupData = $groupResult->getData();
- if (empty($groupData)){
- return ResultWrapper::fail('数组分组失败',ErrorCode::$paramError);
- }
- Logger::logs(E_USER_ERROR,'收银台加入购物车数据',__CLASS__,__LINE__,$groupData);
- $updates = isset($groupData['old']) ? $groupData['old'] : [];
- $inserts = isset($groupData['now']) ? $groupData['now'] : [];
- //操作数据库
- $this->objDCashierCart->beginTransaction();
- //需要更新的数据
- if (!empty($updates)){
- $update = array_shift($updates);
- $tableName = 'qianniao_cashier_cart_'.$this->onlineEnterpriseId;
- $sql = 'UPDATE '.$tableName.' SET buyNum = buyNum+'.$update['buyNum'].'
- WHERE goodsId = '.$update['goodsId'].' AND
- skuId = '.$update['skuId'].' AND
- activityId = '.$update['activityId'] .' AND
- cashierUid = '.$update['cashierUid'];
- $updateRes = $this->objDCashierCart->query($sql);
- if ($updateRes === false){
- $this->objDCashierCart->rollBack();
- return ResultWrapper::fail($this->objDCashierCart->error(),ErrorCode::$dberror);
- }
- }
- //需要插入的数据
- if (!empty($inserts)){
- $insert = array_shift($inserts);
- $insertMap = [
- 'cashierUid' => $this->cashierUid,
- 'selection' => StatusCode::$standard,
- 'goodsBasicId' => $insert['goodsBasicId'],
- 'goodsId' => $insert['goodsId'],
- 'skuId' => $insert['skuId'],
- 'buyNum' => $insert['buyNum'],
- 'shopId' => $insert['shopId'],
- 'source' => $insert['source'],
- 'activityId' => $insert['activityId'],
- 'goodsCode' => $insert['goodsCode'],
- 'warehouseId' => $insert['warehouseId']
- ];//要插入的数据
- $insertRes = $this->objDCashierCart->insert($insertMap);
- if ($insertRes === false){
- $this->objDCashierCart->rollBack();
- return ResultWrapper::fail($this->objDCashierCart->error(),ErrorCode::$dberror);
- }
- }
- $this->objDCashierCart->commit();
- return ResultWrapper::success('加入成功');
- }
- /**
- * Doc: (des="更新购车商品数量")
- * User: XMing
- * Date: 2020/8/6
- * Time: 9:43 上午
- * @param array $params
- * @return ResultWrapper
- * @throws \Exception
- */
- public function updateBuyNumApi($params)
- {
- if ($params['buyNum'] == 0){
- $dbResult = $this->objDCashierCart->delete(['id' => $params['cartId']]);
- if ($dbResult === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- return ResultWrapper::success('操作成功');
- }
- $dbResult = $this->objDCashierCart->update(['buyNum' => $params['buyNum']], $params['cartId']);
- if ($dbResult === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- return ResultWrapper::success('操作成功');
- }
- /**
- * 删除购物车中商品(可批量)
- * @param $ids
- * @param boolean $order 是否是来自订单
- * @return ResultWrapper
- */
- public function delCart($ids, $order = false)
- {
- $dbResult = $this->objDCashierCart->select($ids, 'id,goodsId,buyNum,skuId,activityId');
- if ($dbResult === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- //限购减对应数据
- if ($order === true) {
- foreach ($dbResult as $goods) {
- if ($goods['activityId'] != 0) {
- $userSurplusNum = $this->objActivityLimitCache->getLimit($goods['activityId'], $goods['goodsId'], $goods['skuId'], $this->onlineUserId);
- $mapping[] = [
- 'activityId' => $goods['activityId'],
- 'goodsId' => $goods['goodsId'],
- 'skuId' => $goods['skuId'],
- 'buyNum' => $userSurplusNum + $goods['buyNum'],
- ];
- self::userLimit($mapping);
- }
- }
- }
- $dbResult = $this->objDCashierCart->delete($ids);
- if ($dbResult === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- return ResultWrapper::success($dbResult);
- }
- /**
- * Doc: (des="收银台购物车数据")
- * User: XMing
- * Date: 2020/9/16
- * Time: 4:02 下午
- * @param int $isZero
- * @param string $userCouponId
- * @return ResultWrapper
- * @throws \Exception
- */
- public function getCashierCartByUserCenterIdApi($isZero = 4,$userCouponId = '')
- {
- $cartList = $this->objDCashierCart->select(['cashierUid' => $this->cashierUid], 'id,goodsId,goodsCode,buyNum,shopId,source,goodsBasicId,selection,skuId,warehouseId,activityId,cashierUid', 'createTime DESC');
- if ($cartList === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- if(empty($cartList)){
- return ResultWrapper::success(['data' => [],'total' => 0]);
- }
- $data = self::formatGoodsAndShop($cartList,$userCouponId);
- //是否有改价操作,收银台,操作
- $formatResult = self::buildSetPriceCart($data);
- if (!$formatResult->isSuccess()){
- return ResultWrapper::fail($formatResult->getData(),$formatResult->getErrorCode());
- }
- $data = $formatResult->getData();//最终数据
- $zeroResult = $this->buildZero($data,$isZero);
- if (!$zeroResult->isSuccess()){
- return ResultWrapper::fail($zeroResult->getData(),$zeroResult->getErrorCode());
- }
- $data = $zeroResult->getData();//最终数据
- //订单使用的优惠券
- $userCouponInfo = [];
- if (!empty($userCouponId)) {
- $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
- $dbResult = $objMUserCoupon->getUserCoupon(['id' => $userCouponId]);
- if ($dbResult->isSuccess()) $userCouponInfo = $dbResult->getData();
- $userCouponInfo = isset($userCouponInfo[0]) ? $userCouponInfo[0] : [];
- }
- $data['useCoupon'] = $userCouponInfo;
- //优惠券数据
- $data = self::findCoupon($data);
- $return = [
- 'data' => $data,
- 'total' => empty($data) ? 0 : count($data),
- ];
- return ResultWrapper::success($return);
- }
- /**
- * Doc: (des="判断字符串是否是一个整数")
- * User: XMing
- * Date: 2020/10/12
- * Time: 10:29 上午
- * @param $num
- * @return bool
- */
- private static function isInteger($num)
- {
- if ($num - floor($num) != 0){
- return false;
- }
- return true;
- }
- /**
- * 后台--清空用户购物车
- */
- public function clearCart()
- {
- $where['cashierUid'] = $this->cashierUid;
- $dbResult = $this->objDCashierCart->delete($where);
- if ($dbResult === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- return ResultWrapper::success($dbResult);
- }
- /**
- * 判断在使用范围的店铺,指定商品是否满足最小金额
- * 查询可用的优惠券
- * @param $data
- * @return mixed
- * @throws \Exception
- */
- private function findCoupon($data)
- {
- $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
- $objGoodsBasicRelevant = new GoodsBasicRelevant($this->onlineEnterpriseId);
- $payAmount = $data['payMoney'];
- if ($data['activityMoney'] != 0) {
- $payAmount = bcsub($payAmount, $data['activityMoney'], 2);
- }
- $dbResult = $objMUserCoupon->availableCoupon([
- 'payAmount' => $payAmount
- ]);
- if (!$dbResult->isSuccess()) {
- return ResultWrapper::fail($dbResult->getData(), ErrorCode::$dberror);
- }
- $coupon = $dbResult->getData();
- foreach ($coupon as $key => $val) {
- $useShop = explode(',', $val['useShop']);//此优惠券可以使用的店铺
- $applyRange = $val['applyRange'];//优惠券使用范围
- $cart[$val['id']]['money'] = 0;
- foreach ($data['goodsData'] as $shopGoodsData) {
- foreach ($shopGoodsData['shopGoodsData'] as $goodsDetail) {
- $categoryId = $objGoodsBasicRelevant->getNameByBasicId($goodsDetail['goodsBasicId'], 'categoryId');
- $brandId = $objGoodsBasicRelevant->getNameByBasicId($goodsDetail['goodsBasicId'], 'brandId');
- if ( in_array($shopGoodsData['shopId'], $useShop) &&
- ($applyRange == StatusCode::$applyRange['allGoods'] ||
- in_array($categoryId, explode(',', $val['categoryCollect'])) ||
- in_array($goodsDetail['goodsId'],explode(',',$val['goodsCollect'])) )
- ) {
- $cart[$val['id']]['money'] = bcadd($cart[$val['id']]['money'], $goodsDetail['totalMoney']);//规定范围内的商品总金额
- }
- }
- }
- if ($val['minPrice'] != 0 && $cart[$val['id']]['money'] < $val['minPrice']) {
- unset($coupon[$key]);//不符合要求
- }
- }
- $data['coupon'] = array_values($coupon);
- return $data;
- }
- /**
- * Doc: (des="抹零操作")
- * User: XMing
- * Date: 2020/9/12
- * Time: 7:08 下午
- * @param array $data
- * @param int $isZero
- * @return ResultWrapper
- */
- private function buildZero($data,$isZero)
- {
- //是否开启抹零
- $data['rem_money'] = '0.00';
- $settingResult = $this->objMCashierSettings->get();
- if (!$settingResult->isSuccess()){
- return ResultWrapper::fail($settingResult->getData(),$settingResult->getErrorCode());
- }
- $setting = $settingResult->getData();
- if (!is_array($setting)){
- //不是数组时,说明未配置
- return ResultWrapper::success($data);
- }
- if (!isset($setting['add_form'])){
- return ResultWrapper::fail('收银台配置错误',ErrorCode::$paramError);
- }
- if (!isset($setting['add_form']['zero_set'])){
- return ResultWrapper::fail('收银台参数配置错误',ErrorCode::$paramError);
- }
- $zeroSet = $setting['add_form']['zero_set'];
- if ($zeroSet['status'] == StatusCode::$delete){
- //没有开启抹零,前台需要在抹零那判断是否开启
- return ResultWrapper::success($data);
- }
- $payMoney = $data['payMoney'];
- if ($zeroSet['auto_zero'] == StatusCode::$standard){
- //开启了自动抹零
- switch ($zeroSet['type']){
- case 1:
- //分
- $newPatMoney = bcadd($payMoney,0,1);
- break;
- case 2:
- //角
- $newPatMoney = bcadd($payMoney,0,0);
- break;
- case 3:
- //到角
- $newPatMoney = round($payMoney, 1);
- break;
- case 4:
- //到元
- $newPatMoney = round($payMoney, 0);
- break;
- default:
- $newPatMoney = 0;
- break;
- }
- $rem_money = bcsub($payMoney,$newPatMoney,2);
- $data['payMoney'] = $newPatMoney;
- $data['rem_money'] = $rem_money;
- }else{
- if ($isZero == StatusCode::$standard){
- //手动抹零
- switch ($zeroSet['type']){
- case 1:
- //分
- $newPatMoney = bcadd($payMoney,0,1);
- break;
- case 2:
- //角
- $newPatMoney = bcadd($payMoney,0,0);
- break;
- case 3:
- //到角
- $newPatMoney = round($payMoney, 1);
- break;
- case 4:
- //到元
- $newPatMoney = round($payMoney, 0);
- break;
- default:
- $newPatMoney = 0;
- break;
- }
- $rem_money = bcsub($payMoney,$newPatMoney,2);
- $data['payMoney'] = $newPatMoney;
- $data['rem_money'] = $rem_money;
- }
- }
- return ResultWrapper::success($data);
- }
- /**
- * Doc: (des="修改价格")
- * User: XMing
- * Date: 2020/9/12
- * Time: 2:48 下午
- * @param $data
- * @return ResultWrapper
- */
- private function buildSetPriceCart($data)
- {
- $allGoodsData = $data['goodsData'];
- $goodsData = array_shift($allGoodsData);
- $shopGoodsData = $goodsData['shopGoodsData'];
- $skuIds = [];
- foreach ($shopGoodsData as $item){
- $skuIds[] = $item['skuId'];
- }
- if (empty($skuIds)){
- return ResultWrapper::success($data);
- }
- //获取本收银员有没有对商品设置过价格
- $priceLists = $this->objDCashierCustomerPrice->select(
- [
- 'skuId' => $skuIds,
- 'cashierUid' => $this->cashierUid,
- 'customerUid' => $this->onlineUserId
- ],
- 'price,skuId'
- );
- if ($priceLists === false){
- return ResultWrapper::fail($this->objDCashierCustomerPrice->error(),ErrorCode::$dberror);
- }
- if (empty($priceLists)){
- return ResultWrapper::success($data);
- }
- $customerPriceMap = [];
- foreach ($priceLists as $val){
- $customerPriceMap[$val['skuId']] = $val['price'];
- }
- if (empty($customerPriceMap)){
- return ResultWrapper::success($data);
- }
- foreach ($shopGoodsData as $key => &$item){
- $item['subPrice'] = 0;
- if (!isset($customerPriceMap[$item['skuId']])){
- //没有修改价格
- continue;
- }
- $oldPrice = $item['price'];
- $changePrice = $customerPriceMap[$item['skuId']];
- $item['price'] = $changePrice;
- $item['subUnitPrice'] = bcsub($oldPrice,$changePrice,2);
- $item['subPrice'] = bcmul($item['subUnitPrice'],$item['buyNum'],2);
- $item['totalMoney'] = bcmul($item['price'],$item['buyNum'],2);
- }
- $totalMoney = array_sum(array_column($shopGoodsData,'totalMoney'));
- $setPriceSubMoney = bcadd(array_sum(array_column($shopGoodsData,'subPrice')),0,2);
- $goodsData['totalMoney'] = $totalMoney;
- $goodsData['subPrice'] = $setPriceSubMoney;
- $goodsData['payMoney'] = $totalMoney;
- $goodsData['shopGoodsData'] = array_values($shopGoodsData);
- $data['totalMoney'] = $totalMoney;
- $data['subPrice'] = $setPriceSubMoney;
- $data['payMoney'] = $totalMoney;
- $data['goodsData'] = [$goodsData];
- return ResultWrapper::success($data);
- }
- /**
- * 拼装购物车数据(商铺->商品->规格->库存->价格->分组)
- * 此方法正在修改,勿动
- * @param $data
- * @param $userCouponId
- * @param $vipCardId
- * @return array|mixed
- * @throws \Exception
- */
- private function formatGoodsAndShop($data, $userCouponId = null, $vipCardId = null)
- {
- foreach ($data as &$value){
- $value['buyNum'] = self::isInteger($value['buyNum']) ? (int)$value['buyNum'] : $value['buyNum'];
- }
- unset($value);
- $result = self::formatShop($data);//格式化店铺数据
- $result = self::formatGoods($result);//格式化商品数据
- /*if ($this->isFront === true){
- $result = self::calExpress($result);
- if(!$result->isSuccess()){
- return ResultWrapper::fail($result->getData(),$result->getErrorCode());
- }
- $result = $result->getData();
- }*/
- $result = self::formatPrice($result);//处理价格
- $result = self::formatSkuInventory($result);//处理库存
- $result = self::formatGroup($result, $userCouponId, $vipCardId);
- /**foreach ($result as &$row){
- * $row['basicGoodsId'] = $row['goodsBasicId'];
- * $row = $objMGoods->formatMultipleSkuMapping($row, StatusCode::$standard);//处理属性
- * $row['skuData'] = $row['specMultiple'];
- * //unset($row['specMultiple']);
- * }**/
- return $result;
- }
- /**
- * 数据分组
- *
- * @param $data
- * @param null $userCouponId
- * @param null $vipCardId
- * @return array
- * @throws \Exception
- */
- private function formatGroup($data, $userCouponId = null, $vipCardId = null)
- {
- static $checkNum = 0;//购物车中选中商品数量
- static $totalMoney = 0;//原总额
- static $payMoney = 0;//实际支付金额
- static $preferential = 0;//优惠券优惠
- static $cartNum = 0;
- static $goodsNum = 0;//购物车商品数量
- static $vipDiscount = 0;//会员卡优惠金额
- static $vipDoubleDiscount = 0;//会员卡折上折优惠金额
- static $activityMoney = 0;//互斥活动商品总金额
- static $expressMoney = 0;//运费
- $goodsData = [];
- foreach ($data as $key => $val) {
- if (!isset($val['expressMoney'])){
- $val['expressMoney'] = '0.00';
- }
- $shopGoodsData[$val['shopId']][] = $val;
- if (!isset($goodsData[$val['shopId']]['totalMoney'])) {
- $goodsData[$val['shopId']]['totalMoney'] = '0.00';
- }
- if (!isset($goodsData[$val['shopId']]['preferential'])) {
- $goodsData[$val['shopId']]['preferential'] = '0.00';
- }
- if (!isset($goodsData[$val['shopId']]['expressMoney'])){
- $goodsData[$val['shopId']]['expressMoney'] = '0.00';
- }
- $goodsData[$val['shopId']] = [
- 'shopId' => $val['shopId'],
- 'shopName' => $val['shopName'],
- 'shopLogo' => $val['shopLogo'],
- 'expressMoney' => bcadd($goodsData[$val['shopId']]['expressMoney'],$val['expressMoney'],2),
- 'totalMoney' => bcadd($goodsData[$val['shopId']]['totalMoney'], $val['totalMoney'], 2),//(购物车总金额)
- 'preferential' => bcadd($goodsData[$val['shopId']]['preferential'], bcmul($val['preferential'], $val['buyNum']), 2),//店铺总优惠金额
- 'payMoney' => bcsub(bcadd($goodsData[$val['shopId']]['totalMoney'], $val['totalMoney']), bcadd($goodsData[$val['shopId']]['preferential'], bcmul($val['preferential'], $val['buyNum'])), 2),//(购物实付金额)
- 'shopGoodsData' => $shopGoodsData[$val['shopId']],//商品数据
- ];
- //统计选中商品总数
- if ($val['selection'] == StatusCode::$standard) {
- $checkNum = bcadd($checkNum, 1);
- $totalMoney = bcadd($totalMoney, $val['totalMoney'], 2);
- $payMoney =bcadd(bcadd($expressMoney,$val['expressMoney'],2),bcadd($payMoney, bcsub($val['totalMoney'], bcmul($val['buyNum'], $val['preferential'])), 2),2);
- $preferential = bcadd($preferential, bcmul($val['buyNum'], $val['preferential']), 2);
- $activityMoney = bcadd($activityMoney, $val['activityMoney'], 2);//互斥商品总金额
- $expressMoney = bcadd($expressMoney,$val['expressMoney'],2);
- }
- $cartNum = bcadd($cartNum, 1);
- $goodsNum = bcadd($goodsNum, $val['buyNum']);
- }
- //处理运费
- if (!empty($this->startDeliveryPrice) && $expressMoney != 0 && $this->startDeliveryPrice <= $payMoney && $this->startDeliveryPrice > 0.01){
- $payMoney = bcsub($payMoney,$expressMoney,2);
- foreach($goodsData as &$datum){
- $datum['expressMoney'] = '0.00';
- $shopGoodsLists = $datum['shopGoodsData'];
- foreach ($shopGoodsLists as &$val){
- $val['expressMoney'] = '0.00';
- }
- $datum['shopGoodsData'] = $shopGoodsLists;
- }
- $expressMoney = '0.00';
- }
- unset($datum);
- unset($val);
- $result = [
- 'totalMoney' => $totalMoney,
- 'payMoney' => $payMoney,
- 'preferential' => $preferential,
- 'vipDiscount' => $vipDiscount,
- 'vipDoubleDiscount' => $vipDoubleDiscount,
- 'activityMoney' => $activityMoney,
- 'expressMoney' => $expressMoney,
- 'checkNum' => (int)$checkNum,
- 'cartNum' => (int)$cartNum,
- 'goodsNum' => (int)$goodsNum,
- 'goodsData' => array_values($goodsData),
- 'invalidData' => array_values($this->invalidData)
- ];
- //会员卡计算
- //if (!empty($vipCardId) && $vipCardId != 0) $result = self::vipCardRec($result, $vipCardId);
- //优惠券计算
- if (!empty($userCouponId) && $userCouponId != 0) $result = self::couponRec($result, $userCouponId);
- if (
- (!empty($vipCardId) && $vipCardId != 0)
- || (!empty($userCouponId) && $userCouponId != 0)
- ) {
- //优惠券优惠,会员卡优惠分摊到商品
- $result = self::calAvg($result);
- }
- return $result;
- }
- /**
- * 获取商品价格,及计算价格 ,(有促销活动的用促销价)
- * (原数据+price+originPrice+preferential+totalMoney)
- * @param $data
- * @return mixed
- * @throws \Exception
- */
- private function formatPrice($data)
- {
- if (empty($data)) return $data;
- $objMPrice = new MPrice($this->onlineUserId, $this->onlineEnterpriseId);
- $objMActivity = new MActivity($this->onlineUserId, $this->onlineEnterpriseId);
- $objMCustomer = new MCustomer($this->onlineEnterpriseId, $this->onlineUserId);
- $selectParam['material'] = [];
- $allGoodsId = [];
- foreach ($data as &$goods) {
- $allGoodsId[] = $goods['goodsId'];
- $selectParam['material'][$goods['shopId']][] = $goods['goodsId'];
- $goods['originPrice'] = 0;//原价
- $goods['price'] = 0;//单价
- $goods['preferential'] = 0;//优惠差价
- $goods['totalMoney'] = 0;//小计(unitPrice*buyNum)
- $goods['activityMoney'] = 0;//互斥活动商品总金额
- $goods['isMutex'] = StatusCode::$delete;//初始化互斥状态
- }
- unset($goods);
- $selectParam['customerId'] = $this->customerId;
- $dbResult = $objMPrice->getPrice($selectParam);
- if (!$dbResult->isSuccess()) {
- return $data;
- }
- $priceResult = $dbResult->getData();
- unset($dbResult);
- $customerResult = $objMCustomer->getCustomerInfoByUserCenterId($this->onlineUserId);
- $activityArr = [];
- if ($customerResult->isSuccess()) {
- $customer = $customerResult->getData();
- //获取促销活动价格
- $dbResult = $objMActivity->getActivity([
- 'goodsId' => implode(',', $allGoodsId),
- 'customerType' => isset($customer['type']) ? $customer['type'] : 0,
- ]);//TODO
- $activityResult = $dbResult->getData();
- unset($dbResult);
- foreach ($activityResult as $activity) {
- $activityArr[$activity['goodsId'] . $activity['skuId']] = $activity;
- }
- }
- //print_r($activityArr);
- //商品价格信息
- $goodsArr = [];
- foreach ($priceResult as $shopPriceArr) {
- foreach ($shopPriceArr as $goodsId => $goodsSkuArr) {
- $goodsArr[$goodsId] = $goodsSkuArr;
- }
- }
- //print_r($data);die;
- foreach ($data as &$goods) {
- //此商品存在促销价
- if (isset($activityArr[$goods['goodsId'] . $goods['skuId']])) {
- $price = $goodsArr[$goods['goodsId']][$goods['skuId']]['salePrice'];//商品正常销售价格
- //从缓存中获取活动详情
- if (isset($goods['activityId']) && !empty($goods['activityId'])) {
- $price = $activityArr[$goods['goodsId'] . $goods['skuId']]['price'];//商品活动价格
- $activityDetail = $this->objActivityLimitCache->getActivity($goods['activityId']);
- if (!empty($activityDetail) && $activityDetail['isMutex'] == StatusCode::$standard) {
- //开启互斥商品的总金额
- $goods['activityMoney'] = bcmul($price, $goods['buyNum'], 2);
- $goods['isMutex'] = StatusCode::$standard;
- }
- }
- } else {
- if (isset($goodsArr[$goods['goodsId']][$goods['skuId']])) {
- $priceInfo = $goodsArr[$goods['goodsId']][$goods['skuId']];//此商品规格的价格信息
- $price = isset($priceInfo['salePrice']) ? $priceInfo['salePrice'] : 0;
- // 开启阶梯价
- if ($priceInfo['enabledLadder']) {
- foreach ($priceInfo['ladderPrice'] as $ladder) {
- if ($goods['buyNum'] >= $ladder['from'] && $goods['buyNum'] <= $ladder['to']) {
- $price = isset($ladder['price']) ? $ladder['price'] : 0;
- }
- }
- }
- }
- }
- if (!isset($price)) $price = 0;
- $price = floatval($price);
- $goods['price'] = sprintf("%.2f", $price);
- $goods['originPrice'] = sprintf("%.2f", $price);//没有优惠活动暂时原价=销售价
- $goods['preferential'] = 0;//优惠券优惠金额
- $goods['totalMoney'] = bcmul($price, $goods['buyNum'], 2);//商品小计金额
- $goods['vipDiscount'] = 0;//会员卡优惠金额
- }
- return $data;
- }
- /**
- * 获取店铺信息
- * (原数据上+店铺名称+店铺logo)
- * @param $data
- * @return mixed
- * @throws \Exception
- */
- private function formatShop($data)
- {
- if (empty($data)) return $data;
- $objMGoods = new MShop($this->onlineEnterpriseId, $this->onlineUserId);
- $shopData = $objMGoods->getShopName(array_unique(array_column($data, 'shopId')));
- if (!empty($shopData)) {
- foreach ($data as &$shop) {
- $shop['shopName'] = isset($shopData[$shop['shopId']]['name']) ? $shopData[$shop['shopId']]['name'] : '';
- $shop['shopLogo'] = isset($shopData[$shop['shopId']]['logo']) ? $shopData[$shop['shopId']]['logo'] : '';
- $shop['cartId'] = $shop['id'];
- }
- }
- return $data;
- }
- /**
- * 商品信息
- * (原数据基础上+商品名称+商品图片)商品的状态 下架商品计入失效
- * @param $data
- * @return mixed
- * @throws \Exception
- */
- private function formatGoods($data)
- {
- if (empty($data)) return $data;
- $objGoodsBasicRelevantCache = new GoodsBasicRelevant($this->onlineEnterpriseId);
- $objMGoods = new MGoods($this->onlineEnterpriseId, false, $this->onlineUserId);
- $goodsData = $objMGoods->getGoodsNames(array_unique(array_column($data, 'goodsId')));
- if (!empty($goodsData)) {
- $dbResult = $objMGoods->getNameByGoodsIds(array_values(array_unique(array_column($goodsData, 'basicGoodsId'))));
- if ($dbResult->isSuccess()) {
- $basicData = $dbResult->getData();
- foreach ($goodsData as &$goods) {
- $goods['goodsName'] = isset($basicData[$goods['basicGoodsId']]['title']) ? $basicData[$goods['basicGoodsId']]['title'] : '';
- $goods['describe'] = isset($basicData[$goods['basicGoodsId']]['describe']) ? $basicData[$goods['basicGoodsId']]['describe'] : '';
- $goods['categoryId'] = isset($basicData[$goods['basicGoodsId']]['categoryId']) ? $basicData[$goods['basicGoodsId']]['categoryId'] : '';
- $goods['brandId'] = isset($basicData[$goods['basicGoodsId']]['brandId']) ? $basicData[$goods['basicGoodsId']]['brandId'] : '';
- $goods['categoryPath'] = isset($basicData[$goods['basicGoodsId']]['categoryPath']) ? $basicData[$goods['basicGoodsId']]['categoryPath'] : '';
- $goods['specType'] = isset($basicData[$goods['basicGoodsId']]['specType']) ? $basicData[$goods['basicGoodsId']]['specType'] : StatusCode::$specType['single'];
- $goods['storageCode'] = isset($basicData[$goods['basicGoodsId']]['storageCode']) ? $basicData[$goods['basicGoodsId']]['storageCode'] : '';
- $goods['categoryName'] = empty($goods['categoryId']) ? '' : $objGoodsBasicRelevantCache->getNameByCategoryId($goods['categoryId']);
- $goods['brandName'] = empty($goods['brandId']) ? '' : $objGoodsBasicRelevantCache->getNameByBrandId($goods['brandId']);
- }
- }
- }
- $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
- $specNameMapping = $objMSku->getSpecNameBySkuId(array_column($data, 'skuId'));
- if (!$specNameMapping->isSuccess()) {
- Logger::logs(E_USER_ERROR,'获取sku错误',__CLASS__,__LINE__,$specNameMapping->getData());
- $specNameMapping = [];
- } else {
- $specNameMapping = $specNameMapping->getData();
- }
- foreach ($data as $key => &$val) {
- $val['brandName'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['brandName'] : '';
- $val['categoryName'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['categoryName'] : '';
- $val['barCode'] = isset($specNameMapping[$val['skuId']]) ? $specNameMapping[$val['skuId']]['barCode'] : '';
- $val['storageCode'] = isset($goodsData[$val['goodsId']]['storageCode']) ? $goodsData[$val['goodsId']]['storageCode'] : '';
- $val['goodsName'] = isset($goodsData[$val['goodsId']]['goodsName']) ? $goodsData[$val['goodsId']]['goodsName'] : '';
- $images = isset($goodsData[$val['goodsId']]['images']) ? json_decode($goodsData[$val['goodsId']]['images'], true) : '';
- $val['goodsImages'] = empty($images) ? '' : $images[0];
- $val['isInvalid'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['enableStatus'] : StatusCode::$delete;//4=>失效商品
- $val['describe'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['describe'] : '';
- $val['categoryId'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['categoryId'] : '';
- $val['brandId'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['brandId'] : '';
- $val['categoryPath'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['categoryPath'] : '';
- $val['isActivity'] = empty($val['activityId']) ? StatusCode::$delete : StatusCode::$standard;//是否是活动商品
- $val['specType'] = isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['specType'] : StatusCode::$specType['single'];
- $val['unitName'] = isset($specNameMapping[$val['skuId']]) ? $specNameMapping[$val['skuId']]['unitName'] : '';
- $val['specGroup'] = isset($specNameMapping[$val['skuId']]) ? $specNameMapping[$val['skuId']]['specGroup'] : [];
- $val['notExpress'] = StatusCode::$standard;
- $val['express'] = [
- 'weight' => isset($specNameMapping[$val['skuId']]) ? $specNameMapping[$val['skuId']]['weight'] : 0,
- 'expressType' => isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['expressType'] : 0,
- 'ruleId' => isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['ruleId'] : 0,
- 'expressFee' => isset($goodsData[$val['goodsId']]) ? $goodsData[$val['goodsId']]['expressFee'] : 0,
- ];
- if (isset($goodsData[$val['goodsId']]) && ($goodsData[$val['goodsId']]['enableStatus'] == StatusCode::$delete || $goodsData[$val['goodsId']]['deleteStatus'] == StatusCode::$delete)) {
- $val['invalidMsg'] = '此商品已下架';
- $this->invalidData[] = $val;//失效商品集合
- unset($data[$key]);
- }
- }
- return $data;
- }
- /**
- * 查询库存以及成本(*goodsBasicId *warehouseId) 库存不足的商品计入失效
- * (原数据+costPrice+inventoryNum)
- * @param $data
- * @return mixed
- * @throws \Exception
- */
- private function formatSkuInventory($data)
- {
- $inventorySelectParams = [];
- $skuIds = [];
- foreach ($data as &$goods) {
- $skuIds[] = $goods['skuId'];
- $goods['inventory'] = 0;
- $inventorySelectParams[$goods['shopId']][] = $goods['skuId'];
- }
- unset($goods);
- $objMInventory = new MInventory($this->onlineEnterpriseId, $this->onlineUserId);
- $inventoryMap = [];
- foreach ($inventorySelectParams as $shopId => $skuIds){
- $inventoryResult = $objMInventory->getInventoryByShopIdAndSkuIds($shopId,$skuIds);
- if (!$inventoryResult->isSuccess()) {
- return $data;
- }
- $inventoryMap[$shopId] = $inventoryResult->getData();
- }
- $objMSku = new MSku($this->onlineUserId, $this->onlineEnterpriseId);
- foreach ($data as $key => &$goods) {
- $h=['id'=>$goods['skuId']];
- $specNameMapping = $objMSku->getSpecNameBySkuId($h);
- $specNameMapping = $specNameMapping->getData();
- foreach ($specNameMapping as $v){
- $thisSku=$v;
- }
- //兼容带属性的
- $goods['costPrice'] = 0;
- $goods['inventoryNum'] = isset($inventoryMap[$goods['shopId']][$goods['skuId']]['num']) ? $inventoryMap[$goods['shopId']][$goods['skuId']]['num'] : 0;
- $goods['conversion'] = $thisSku['conversion'];//换算比例
- if ($goods['inventoryNum'] < $goods['buyNum']) {
- $goods['isInvalid'] = StatusCode::$delete;
- $goods['invalidMsg'] = '商品库存不足';
- $this->invalidData[] = $goods;
- unset($data[$key]);
- }
- }
- return $data;
- }
- /**
- * 缓存用户限购
- * @param $data
- * @return mixed
- */
- private function userLimit($data)
- {
- $result = false;
- foreach ($data as $goods) {
- $result = $this->objActivityLimitCache->writeLimit($goods['activityId'], $goods['goodsId'], $goods['skuId'], $this->onlineUserId, $goods['buyNum']);
- }
- return $result;
- }
- /**
- * Doc: (des="检测商品")
- * User: XMing
- * Date: 2020/8/4
- * Time: 3:21 下午
- * @param array $goodsData
- * @param array $addCart
- * @return ResultWrapper
- */
- private static function checkGoods(array $goodsData,array $addCart)
- {
- if (empty($goodsData)){
- return ResultWrapper::fail('商品信息为空',ErrorCode::$paramError);
- }
- //验证商品的状态以及库存
- if ($goodsData['enableStatus'] == StatusCode::$delete || $goodsData['deleteStatus'] == StatusCode::$delete){
- return ResultWrapper::fail('商品已下架',ErrorCode::$paramError);
- }
- $specMultiple = $goodsData['specMultiple'];//spec数据
- if (empty($specMultiple)){
- return ResultWrapper::fail('商品规格信息获取失败',ErrorCode::$paramError);
- }
- $specMultipleMap = [];//商品规格映射数据
- foreach ($specMultiple as $value){
- $specMultipleMap[$value['id']] = $value;
- }
- if (!isset($specMultipleMap[$addCart['skuId']])) {
- return ResultWrapper::fail('规格信息不存在', ErrorCode::$paramError);
- }
- if ($specMultipleMap[$addCart['skuId']]['inventory'] < $addCart['buyNum']) {
- return ResultWrapper::fail('商品库存不足', ErrorCode::$paramError);
- }
- $addCart['isActivity'] = $specMultipleMap[$addCart['skuId']]['isActivity'];//是否是活动商品
- $addCart['setNum'] = $specMultipleMap[$addCart['skuId']]['setNum'];//起订数量
- $addCart['warehouseId'] = $addCart['warehouseId'];
- switch ($specMultipleMap[$addCart['skuId']]['isActivity']){
- case StatusCode::$standard:
- $addCart['activityId'] = $specMultipleMap[$addCart['skuId']]['activity']['activityId'];
- $addCart['limitNum'] = $specMultipleMap[$addCart['skuId']]['activity']['limitNum'];//商品活动限购数量
- break;
- case StatusCode::$delete:
- $addCart['activityId'] = 0;
- break;
- }
- return ResultWrapper::success($addCart);
- }
- /**
- * 将加入购物车的数据进行分组[old=>在购物车中已存在,now=>新加入购物车商品]
- * @param $nowData [加入购物车的数据]
- * @return ResultWrapper
- */
- private function existCartAndGroup($nowData)
- {
- $dbResult = self::getCartByUid();
- if (!$dbResult->isSuccess()) {
- return ResultWrapper::fail('获取购物车数据失败', ErrorCode::$dberror);
- }
- $oldCartData = $dbResult->getData();
- $allHash = [];
- foreach ($oldCartData as $key => $val) {
- $allHash[] = md5($val['goodsId'] . $val['shopId'] . $val['skuId'] . $val['activityId']);
- }
- $old = [];//旧的数据
- $now = [];//新的数据
- foreach ($nowData as $key => &$val) {
- $md5 = md5($val['goodsId'] . $val['shopId'] . $val['skuId'] . $val['activityId']);
- if (in_array($md5, $allHash)) {
- $old[] = $val;
- } else {
- //之前购物车中没有此商品,检查起订量
- if ($val['setNum'] != 0) {
- //具有起订量
- if ($val['buyNum'] < $val['setNum']){
- $val['buyNum'] = $val['setNum'];
- }
- }
- $now[] = $val;
- }
- }
- $groupData = [
- 'old' => $old,
- 'now' => $now
- ];
- return ResultWrapper::success($groupData);
- }
- /**
- * 获取当前用户的购物车数据
- */
- private function getCartByUid()
- {
- $result = $this->objDCashierCart->select(['cashierUid' => $this->cashierUid], 'id,goodsId,goodsCode,buyNum,shopId,goodsBasicId,selection,skuId,warehouseId,activityId,cashierUid', 'createTime DESC');
- if ($result === false) {
- return ResultWrapper::fail($this->objDCashierCart->error(), ErrorCode::$dberror);
- }
- return ResultWrapper::success($result);
- }
- /**
- *
- * 优惠计算分摊规则
- * A商品 100元
- * B商品 300元
- * 商品总价 400元
- *
- * A商品享受的优惠 = 优惠券金额*(A商品原价/商品总价)
- * B商品享受的优惠 = 优惠券金额*(B商品原价/商品总价)
- *
- * 5折会员卡 400*0.5=200元 -200
- * 优惠券(满100减20) -20
- * 共 -220
- * 实际付款 180
- * A总(220*(100/400)=55) 优惠券(20*(100/400)=5) 会员卡(200*(100/400)=50)
- * B总(220*(300/400)=165) 优惠券(20*(300/400)=15) 会员卡(200*(300/400)=150)
- * @param $data
- * @return mixed
- */
- private function calAvg($data)
- {
- $account = 0;
- $vipAccount = 0;
- foreach ($data['goodsData'] as &$shops) {
- $count = count($shops['shopGoodsData']);
- foreach ($shops['shopGoodsData'] as $key => &$goods) {
- if ($goods['isMutex'] == StatusCode::$delete) {
- //活动商品不分摊
- if ($data['preferential'] != 0) {
- //有优惠券优惠,分摊金额
- if ($key+1 != $count) {
- $goods['preferential'] = bcmul($data['preferential'], bcdiv($goods['totalMoney'], $data['totalMoney'], 2), 2);
- $account = bcadd($account,$goods['preferential'],2);
- }else{
- //最后一个商品分摊金额=总优惠-其他均摊
- $goods['preferential'] = bcsub($data['preferential'],$account,2);
- }
- }
- }
- if ($data['vipDiscount'] != 0) {
- //有会员卡折扣,分摊金额
- if ($key+1 != $count){
- $goods['vipDiscount'] = bcmul($data['vipDiscount'], bcdiv($goods['totalMoney'], $data['totalMoney'], 2), 2);
- $vipAccount = bcadd($vipAccount,$goods['vipDiscount'],2);
- }else{
- $goods['vipDiscount'] = bcsub($data['vipDiscount'],$vipAccount,2);
- }
- }
- }
- }
- return $data;
- }
- /**
- * 优惠券优惠
- * @param $data
- * @param $userCouponId
- * @return mixed
- * @throws \Exception
- */
- private function couponRec($data, $userCouponId)
- {
- //优惠券
- $userCouponInfo = [];
- if (!empty($userCouponId)) {
- $objMUserCoupon = new MUserCoupon($this->onlineUserId, $this->onlineEnterpriseId);
- $dbResult = $objMUserCoupon->getUserCoupon(['id' => $userCouponId]);
- if ($dbResult->isSuccess()) $userCouponInfo = $dbResult->getData();
- $userCouponInfo = isset($userCouponInfo[0]) ? $userCouponInfo[0] : [];
- $isMutex = $userCouponInfo['isMutex'];//是否与活动互斥
- if ($userCouponInfo['applyRange'] == StatusCode::$applyRange['allGoods']) {
- //优惠券的使用范围所有商品
- if ($userCouponInfo['minPrice'] == 0 || $data['payMoney'] >= $userCouponInfo['minPrice']) {
- //满足最低消费金额
- $data['payMoney'] = bcsub($data['payMoney'], $userCouponInfo['reducePrice'], 2);
- if ($data['payMoney'] < 0) {
- $data['payMoney'] = 0;//优惠券面值不合理导致优惠后价格小于0
- }
- $data['preferential'] = bcadd($data['preferential'], $userCouponInfo['reducePrice'], 2);
- }
- } else if ($userCouponInfo['applyRange'] == StatusCode::$applyRange['appointCategory']) {
- //优惠券使用范围指定分类
- $couponCategory = $userCouponInfo['categoryCollect'];
- if (!empty($couponCategory)) {
- $goodsAmount = 0; //满足特定商品分类的(商品总额),初始化
- $couponCategory = explode(',', $couponCategory);
- //计算符合分类中商品价格总和
- foreach (array_values($data['goodsData']) as $shop) {
- foreach ($shop['shopGoodsData'] as $value) {
- //$value['categoryId']
- if (in_array($value['categoryId'], $couponCategory)) {
- //满足特定商品分类的(商品总额)
- $goodsAmount = bcadd($goodsAmount, $value['totalMoney']);
- }
- }
- }
- //商品总额是否满足最低金额
- if ($userCouponInfo['minPrice'] == 0 || $goodsAmount >= $userCouponInfo['minPrice']) {
- $data['payMoney'] = bcsub($data['payMoney'], $userCouponInfo['reducePrice'], 2);
- if ($data['payMoney'] < 0) {
- $data['payMoney'] = 0;//优惠券面值不合理导致优惠后价格小于0
- }
- $data['preferential'] = bcadd($data['preferential'], $userCouponInfo['reducePrice'], 2);
- }
- }
- } else if ($userCouponInfo['applyRange'] == StatusCode::$applyRange['appointBrand']) {
- //优惠券使用范围指定品牌
- $couponBrand = $userCouponInfo['brandCollect'];
- if (!empty($couponBrand)) {
- $goodsAmount = 0; //满足特定商品品牌的(商品总额),初始化
- $couponBrand = explode(',', $couponBrand);
- //计算符合品牌中商品价格总和
- foreach (array_values($data['goodsData']) as $shop) {
- foreach ($shop['shopGoodsData'] as $value) {
- //$value['categoryId']
- if (in_array($value['brandId'], $couponBrand)) {
- //满足特定商品品牌的(商品总额)
- $goodsAmount = bcadd($goodsAmount, $value['totalMoney']);
- }
- }
- }
- //商品总额是否满足最低金额
- if ($userCouponInfo['minPrice'] == 0 || $goodsAmount >= $userCouponInfo['minPrice']) {
- $data['payMoney'] = bcsub($data['payMoney'], $userCouponInfo['reducePrice'], 2);
- if ($data['payMoney'] < 0) {
- $data['payMoney'] = 0;//优惠券面值不合理导致优惠后价格小于0
- }
- $data['preferential'] = bcadd($data['preferential'], $userCouponInfo['reducePrice'], 2);
- }
- }
- }
- unset($dbResult);
- }
- return $data;
- }
- }
|