getFind(array($BillModel::ID => $bill)); } if (empty($billOrder)) { return array('status' => 0, 'msg' => '订单不存在'); } // 防止重复处理已支付订单(避免重复打印) if ($billOrder[$BillModel::PAY_STATE] == 1) { return array('status' => 1, 'msg' => '订单已支付,无需重复处理'); } // file_put_contents('./xcxNotify.txt', 'billOrder: ' . json_encode($billOrder) . "\r\n", FILE_APPEND); $integral = 0; //送会员的总积分 $sellIntegral = 0; //记录sell已经送会员的积分 //整单送积分、会员消费赠送积分 $percent_state = false; //判断商户是否开启整单会员送积分 $VipModel = D('RetailVip'); $VipConfigModel = D('RetailVipConfig'); $vip = array(); if (!empty($billOrder[$BillModel::VID])) { $vip = $VipModel->getFind(array($VipModel::ID => $billOrder[$BillModel::VID])); $plus_type = $vip[$VipModel::PLUS_TYPE]; $fields = array( $VipConfigModel::PERCENT_STATE, $VipConfigModel::PERCENT, $VipConfigModel::PLUS_PERCENT_STATE, $VipConfigModel::PLUS_PERCENT, $VipConfigModel::GOODS_INTEGRAL_STATE, $VipConfigModel::GOODS_INTEGRAL_PLUS_STATE, $VipConfigModel::GOODS_INTEGRAL_MULTIPLE, 'flower_price', 'plus_flower_type', 'plus_flower_price', 'plus_flower_percent' ); $vipConfig = $VipConfigModel->getFind(array($VipConfigModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID]), $fields); if ($vipConfig) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig ); $percent_state = $VipConfigModel->buy_integral_config($parameter); } } $SellModel = D('RetailSell'); $GoodsModel = D('RetailGoods'); $fields = array( 's.*', 'g.' . $GoodsModel::INTEGRAL_MEM_STATUS, 'g.' . $GoodsModel::INTEGRAL . ' as g_integral', ); $map = array( 's.' . $SellModel::BILL_ID => $billOrder[$BillModel::ID] ); $sellOrder = $SellModel->getSelectAndGoods($map, $fields, 's.' . $SellModel::ORIGINAL_PRICE . ' asc'); // file_put_contents('./xcxNotify.txt', 'sellOrder: ' . json_encode($sellOrder) . "\r\n", FILE_APPEND); $sendIntegral = 0; //单品送积分 $successCount = 0; //记录sell表更新成功的数量 $BillOnlineModel = D('RetailBillOnline'); $oMap = array( $BillOnlineModel::BILL_ID => $billOrder[$BillModel::ID] ); if ($billOrder[$BillModel::TYPE] == 1) { $billOnline = $BillOnlineModel->getFind($oMap); } else { $billOnline = array(); } $goods_id = array(); //为了存储省级plus会员所用 $allGuideMoney = 0; foreach ($sellOrder as &$value) { $sku_id = ''; //规格id if (!empty($value[$SellModel::SKU_JSON_INFO])) { if ($billOrder[$BillModel::TYPE] == 2 || $billOnline[$BillOnlineModel::ORDER_GENRE] == 1) { // 非拼团秒杀 $sku = json_decode($value[$SellModel::SKU_JSON_INFO], true); $sku_id = $sku['id']; } } $save = array( $SellModel::PAY_STATE => 1, $SellModel::PAY_TYPE => $billOrder[$BillModel::PAY_TYPE] ); $value['integral_type'] = 1; //临时用来判断当前商品赠送积分类型 1整单送积分 2单品送积分 //非无码商品 if ($value[$SellModel::GOODS_TYPE] == 1) { $goods_id[] = $value[$SellModel::GOODS_ID]; $data = [ 'goods_id' => $value[$SellModel::GOODS_ID], 'sku_id' => $sku_id, 'num' => $value[$SellModel::NUM], 'all_money' => $value[$SellModel::ALL_MONEY], 'type' => $value[$SellModel::TYPE], 'original_price' => $value[$SellModel::ORIGINAL_PRICE] ]; $addLog = $this->quantityLogs($data); if (!$addLog) { $res['status'] = 0; $res['msg'] = '数据库发生错误,库存记录添加失败,请联系系统人员进行退款'; return $res; } //整单送积分不包含单品送积分,二者互斥 if (!empty($billOrder[$BillModel::VID]) && $value[$GoodsModel::INTEGRAL_MEM_STATUS] == 1 && !empty($value['g_integral'])) { //判断商户是否开启指定商品送积分 if ($vipConfig && $value['integral_mem_status'] == 1 && $value['integral'] > 0) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig, 'integral' => $value['g_integral'], 'num' => $value['num'] ); $get_integral = $VipConfigModel->buy_goods_get_integral($parameter); if ($get_integral > 0) { $value['integral_type'] = 2; $save[$SellModel::GET_INTEGRAL] = $get_integral; //获得积分 $sendIntegral += $get_integral; } } } } if ($percent_state && $value['integral_type'] == 1) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig, 'all_money' => $value[$SellModel::ALL_MONEY] ); $get_integral = $VipConfigModel->buy_get_integral($parameter); $save[$SellModel::GET_INTEGRAL] = $get_integral; } $sellIntegral += $save[$SellModel::GET_INTEGRAL] ? $save[$SellModel::GET_INTEGRAL] : 0; $upSell = $SellModel->updateOrder(array($SellModel::ID => $value[$SellModel::ID]), $save); if ($upSell) { $successCount++; } $allGuideMoney += $value[$SellModel::GUIDE_ROYALTY]; } //导购员提成 if (!empty($allGuideMoney)) { $retailGuideModel = D('RetailGuide'); $commission = $retailGuideModel->getFindField(array($retailGuideModel::ID => $billOrder[$BillModel::GUIDE_ID]), $retailGuideModel::COMMISSION); $GuideIncomeModel = D('RetailGuideIncome'); $guide[$GuideIncomeModel::BILL_ID] = $billOrder[$BillModel::ID]; $guide[$GuideIncomeModel::STORE_ID] = $billOrder[$BillModel::STORE_ID]; $guide[$GuideIncomeModel::VID] = $billOrder[$BillModel::VID]; $guide[$GuideIncomeModel::GUIDE_ID] = $billOrder[$BillModel::GUIDE_ID]; $guide[$GuideIncomeModel::ALL_MONEY] = $billOrder[$BillModel::ALL_MONEY]; $guide[$GuideIncomeModel::PAY_TYPE] = $billOrder[$BillModel::PAY_TYPE]; $guide[$GuideIncomeModel::PAY_TIME] = time(); $guide[$GuideIncomeModel::COMMISSION] = $commission; $guide[$GuideIncomeModel::INCOME] = round($allGuideMoney, 2); $guideIncomeAdd = $GuideIncomeModel->addOrder($guide); if (!$guideIncomeAdd) { $res['status'] = 0; $res['msg'] = '订单更新失败'; return $res; } } $DiscountModel = D('RetailBillDiscount'); $map = array( $DiscountModel::BILL_ID => $billOrder[$BillModel::ID] ); $billDiscount = $DiscountModel->getFind($map); //判断微信刷卡支付推送红包或大转盘(会员的所有支付方式,不是会员的微信支付) if ($billOrder[$BillModel::TYPE] == 2) { $PayOrderModel = D('RetailPayOrder'); if ($billOrder[$BillModel::PAY_TYPE] == 3 || $billOrder[$BillModel::PAY_TYPE] == 8) { $payOrder = $PayOrderModel->getFind(array($PayOrderModel::BILL_ID => $billOrder[$BillModel::ID], $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::PAY_TYPE => 1)); $extend_content = $payOrder[$PayOrderModel::EXTEND_CONTENT] ? json_decode($payOrder[$PayOrderModel::EXTEND_CONTENT], true) : ''; } else { $payOrder = $PayOrderModel->getFind(array($PayOrderModel::BILL_ID => $billOrder[$BillModel::ID], $PayOrderModel::ORDER_STATE => 'SUCCESS')); } if ((empty($billOrder[$BillModel::VID]) && $billOrder[$BillModel::PAY_TYPE] == 3 || $billOrder[$BillModel::PAY_TYPE] == 8 && !empty($extend_content)) || (!empty($billOrder[$BillModel::VID]))) { //微信支付 if (empty($billOrder[$BillModel::VID])) { $openid = $extend_content['sub_openid'] ? $extend_content['sub_openid'] : $extend_content['openid']; } else { $openid = $vip[$VipModel::OPEN_ID] ? $vip[$VipModel::OPEN_ID] : ''; } $payTypeOrder = $PayOrderModel->getSelect(array($PayOrderModel::BILL_ID => $billOrder[$BillModel::ID], $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::PAY_TYPE => array('in', array(1, 2)))); if (!empty($payTypeOrder) && $payOrder[$PayOrderModel::M_PAY_TYPE] == 3) { } else { A('Api/Vip')->toMark($openid, $billOrder['store_id'], $billOrder['id'], $billOrder['all_money']); } } } //会员支付 if (!empty($billOrder[$BillModel::VID])) { //会员积分抵现,减少积分并添加积分记录 if (!empty($billDiscount) && !empty($billDiscount[$DiscountModel::USE_INTEGRAL])) { $item = array( 'vip_id' => $billOrder[$BillModel::VID], 'store_id' => $billOrder[$BillModel::STORE_ID], 'integral' => $billDiscount[$DiscountModel::USE_INTEGRAL], 'bill_id' => $billOrder[$BillModel::ID], ); $lessIntegralRes = $this->lessIntegralOrderLog($item); } //单品送积分 if ($sendIntegral > 0) { $integral = $sendIntegral; } //整单送积分、会员消费赠送积分 //增加会员积分并添加积分记录 if ($integral > 0) { $item = array( 'vip_id' => $billOrder[$BillModel::VID], 'store_id' => $billOrder[$BillModel::STORE_ID], 'bill_id' => $billOrder[$BillModel::ID], 'integral' => $integral, 'remark' => '购买商品送积分,共获得' . $integral . '积分', ); $addIntegralRes = $this->addIntegralOrderLog($item); $upBill = $DiscountModel->updateOrder($map, array($DiscountModel::GET_INTEGRAL => $integral)); } //修改优惠券状态 if (!empty($billDiscount[$DiscountModel::COUPON_ID])) { if ($billDiscount[$DiscountModel::COUPON_TYPE] == 2) { //商户优惠券 $VipMCouponModel = D('RetailVipMCoupon'); $couponData[$VipMCouponModel::IS_USE] = 2; $couponData[$VipMCouponModel::USE_TIME] = time(); $couponData[$VipMCouponModel::STORE_ID] = $billOrder[$BillModel::STORE_ID]; $couponData[$VipMCouponModel::LESS_MONEY] = $billDiscount[$DiscountModel::COUPON_MONEY]; $upCoupon = $VipMCouponModel->updateOrder(array($VipMCouponModel::ID => $billDiscount[$DiscountModel::COUPON_ID]), $couponData); } } //存零 if (floatval($billOrder[$BillModel::ZERO_STORAGE]) > 0 && !empty($billOrder[$BillModel::VID])) { $map = array( $VipModel::ID => $billOrder[$BillModel::VID] ); $save = $VipModel->toSetInc($map, $VipModel::BALANCE, $billOrder[$BillModel::ZERO_STORAGE]); if ($save) { $RechargeOrderModel = D('RetailRechargeOrder'); $Ad[$RechargeOrderModel::STORE_ID] = $billOrder[$BillModel::STORE_ID]; $Ad[$RechargeOrderModel::VID] = $billOrder[$BillModel::VID]; $Ad[$RechargeOrderModel::TYPE] = 1; $Ad[$RechargeOrderModel::SCENE_TYPE] = 1; $Ad[$RechargeOrderModel::ADD_TIME] = time(); $Ad[$RechargeOrderModel::MONEY] = $billOrder[$BillModel::ZERO_STORAGE]; $Ad[$RechargeOrderModel::ALL_MONEY] = $billOrder[$BillModel::ZERO_STORAGE]; $Ad[$RechargeOrderModel::CASHIER_ID] = $billOrder[$BillModel::CASHIER_ID]; $Ad[$RechargeOrderModel::REMARK] = '现金支付存零' . $billOrder[$BillModel::ZERO_STORAGE] . '元'; $Ad[$RechargeOrderModel::USER_TYPE] = 3; $Ad[$RechargeOrderModel::MERCHANT_ID] = $billOrder[$BillModel::MERCHANT_ID]; $Ad[$RechargeOrderModel::BILL_ID] = $billOrder[$BillModel::ID]; $Ad[$RechargeOrderModel::PAY_TYPE] = 1; $ret2 = $RechargeOrderModel->addOrder($Ad); A('Vip/Mark')->rechargesuccess($billOrder[$BillModel::STORE_ID], $billOrder[$BillModel::VID], $billOrder[$BillModel::ZERO_STORAGE], $billOrder[$BillModel::ZERO_STORAGE]); } } $payInfo['ordernum'] = $billOrder[$BillModel::ORDER_NO]; $payInfo['integral'] = $integral; switch ($billOrder[$BillModel::PAY_TYPE]) { case '1': $payType = '现金支付'; break; case '2': $payType = '银行卡支付'; break; case '3': $payType = '微信支付'; break; case '4': $payType = '支付宝支付'; break; case '5': $payType = '余额支付'; break; case '6': $payType = '小程序商城微信支付'; break; case '7': $payType = '其他支付方式'; break; case '8': $payType = '组合支付'; break; } A('Vip/Mark')->paysuccess($billOrder[$BillModel::STORE_ID], $billOrder[$BillModel::VID], $billOrder[$BillModel::ALL_MONEY], $payType, $payInfo); // 判断是否为购买次卡 $CardOrder = D('RetailCardOrder'); $is_buy_card = false; $co_map = array( $CardOrder::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID], $CardOrder::STORE_ID => $billOrder[$BillModel::STORE_ID], $CardOrder::VIP_ID => $billOrder[$BillModel::VID], $CardOrder::BILL_ID => $billOrder[$BillModel::ID], ); $card_order = $CardOrder->getFind($co_map); if (!empty($card_order)) { $is_buy_card = true; } // 判断 $source = $billOrder[$BillModel::TYPE] == 1 ? 2 : 1; if ($is_buy_card == true) { $grant_res = A('Api/SubCard')->grantCard($card_order, $billOrder[$BillModel::VID]); if ($grant_res['status'] == 1) { $CardOrder->updateOrder(array($CardOrder::ID => $card_order[$CardOrder::ID]), array($CardOrder::STATE => 1)); } } else { // 消费送次卡 A('PayApi/VipCard')->rechargeGiveCard($billOrder[$BillModel::MERCHANT_ID], $billOrder[$BillModel::VID], $billOrder[$BillModel::ALL_MONEY], 3, $source); } } if ($billOrder[$BillModel::TYPE] == 1) { //商城,使用门店优惠券 if (!empty($billDiscount[$DiscountModel::COUPON_ID])) { if ($billDiscount[$DiscountModel::COUPON_TYPE] == 1) { //门店优惠券 $CouponLogsModel = D('RetailCouponLogs'); $cSave = array( $CouponLogsModel::STATUS => 2, $CouponLogsModel::USE_TIME => time() ); $CouponLogsModel->updateOrder(array($CouponLogsModel::ID => $billDiscount[$DiscountModel::COUPON_ID]), $cSave); } } // file_put_contents('./xcxNotify.txt', 'test: 4' . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'pay_type: ' . $billOrder[$BillModel::PAY_TYPE] . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'vip: ' . json_encode($vip) . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'upgrade_state: ' . $billOrder[$BillModel::UPGRADE_STATE] . "\r\n", FILE_APPEND); $SmallProgramUserModel = D('RetailSmallProgramUser'); $xcxVipInfo = $SmallProgramUserModel->getFind(array($SmallProgramUserModel::ID => $billOrder[$BillModel::UID])); if ($billOrder[$BillModel::PAY_TYPE] == 8) { //小程序组合支付 $vipPay = A('PayApi/VipPay')->pay($billOrder[$BillModel::ID], 4, 2); } else if ($billOrder[$BillModel::PAY_TYPE] == 6 && !empty($vip) && $billOrder[$BillModel::UPGRADE_STATE] == 1) { //file_put_contents('./xcxNotify.txt', 'xcxVip: ' . json_encode($xcxVipInfo) . "\r\n", FILE_APPEND); if ($xcxVipInfo[$SmallProgramUserModel::USER_TYPE] == 3 && empty($xcxVipInfo[$SmallProgramUserModel::PLUS_VIP_ID])) { //普通会员 $PlusSetModel = D('RetailPlusSet'); $plus_set = $PlusSetModel->getFind(array($PlusSetModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID])); //file_put_contents('./xcxNotify.txt', 'goods_switch_type: ' . $plus_set[$PlusSetModel::GOODS_SWITCH_TYPE] . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'goods_group_switch_type: ' . $plus_set[$PlusSetModel::GOODS_GROUP_SWITCH_TYPE] . "\r\n", FILE_APPEND); if ($plus_set[$PlusSetModel::GOODS_SWITCH_TYPE] == 2 || $plus_set[$PlusSetModel::GOODS_GROUP_SWITCH_TYPE] == 2) { $singe_status = false; //指定商品 if ($plus_set[$PlusSetModel::GOODS_SWITCH_TYPE] == 2) { $SinglePlusGoodsModel = D('RetailSinglePlusGoods'); $pMap = array( $SinglePlusGoodsModel::STATUS => 1, $SinglePlusGoodsModel::STORE_ID => $billOrder[$BillModel::STORE_ID], $SinglePlusGoodsModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID], ); $plus_goods_arr = $SinglePlusGoodsModel->getSelect($pMap, array($SinglePlusGoodsModel::ID, $SinglePlusGoodsModel::GOODS_ID)); // file_put_contents('./xcxNotify.txt', 'plus_goods_arr1: ' . json_encode($plus_goods_arr) . "\r\n", FILE_APPEND); if ($plus_goods_arr) { foreach ($plus_goods_arr as $pVal) { $difference = array_intersect($goods_id, array($pVal[$SinglePlusGoodsModel::GOODS_ID])); // file_put_contents('./xcxNotify.txt', 'difference1: ' . json_encode($difference) . "\r\n", FILE_APPEND); $difference_count = count($difference); if ($difference_count > 0) { $singe_status = true; $vItem = array( 'store_id' => $billOrder[$BillModel::STORE_ID], 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], 'bill_id' => $billOrder[$BillModel::ID], 'goods_id' => $difference[0], 'activity_id' => $pVal[$SinglePlusGoodsModel::ID], 'pay_type' => 6, 'type' => 1, 'uid' => $billOrder[$BillModel::UID], 'vid' => $billOrder[$BillModel::VID], 'all_money' => $billOrder[$BillModel::ALL_MONEY], ); $this->vipModify($vItem); break; } } } } //套餐 if (!$singe_status) { if ($plus_set[$PlusSetModel::GOODS_GROUP_SWITCH_TYPE] == 2) { $PlusMealGroupModel = D('RetailPlusMealGroup'); $mMap = array( $PlusMealGroupModel::STATUS => 1, $PlusMealGroupModel::STORE_ID => $billOrder[$BillModel::STORE_ID], $PlusMealGroupModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID] ); $group_id = $PlusMealGroupModel->getFindField($mMap, $PlusMealGroupModel::ID); if ($group_id) { $MealPlusGoodsModel = D('RetailMealPlusGoods'); $gMap = array( $MealPlusGoodsModel::STATUS => 1, $MealPlusGoodsModel::STORE_ID => $billOrder[$BillModel::STORE_ID], $MealPlusGoodsModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID], $MealPlusGoodsModel::GROUP_ID => $group_id, ); $plus_goods_arr = $MealPlusGoodsModel->getFindField($gMap, $MealPlusGoodsModel::GOODS_ID, true); if ($plus_goods_arr) { $difference = count(array_intersect($goods_id, $plus_goods_arr)); if ($difference == count($plus_goods_arr)) { $vItem = array( 'store_id' => $billOrder[$BillModel::STORE_ID], 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], 'bill_id' => $billOrder[$BillModel::ID], 'goods_id' => $plus_goods_arr, 'activity_id' => implode($plus_goods_arr), 'pay_type' => 6, 'type' => 2, 'uid' => $billOrder[$BillModel::UID], 'vid' => $billOrder[$BillModel::VID], 'all_money' => $billOrder[$BillModel::ALL_MONEY], ); $this->vipModify($vItem); } } } } } } } } // file_put_contents('./xcxNotify.txt', 'test: 5' . "\r\n", FILE_APPEND); $onlineSave[$BillOnlineModel::STATUS] = 1; if ($billOnline[$BillOnlineModel::PICKUP_TYPE] == 1) { //自提 $pick_code = getPickCode(); $res['pick_code'] = $pick_code; $onlineSave[$BillOnlineModel::PICK_CODE] = $pick_code; //服务通知 $StoreModel = D('RetailStore'); $store = $StoreModel->getFind(array($StoreModel::ID => $billOrder[$BillModel::STORE_ID])); $tempSend = array( 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], 'openid' => $xcxVipInfo[$SmallProgramUserModel::OPENID], 'form_id' => $billOnline[$BillOnlineModel::FORM_ID], 'type' => 1, //'1自提通知 2发货通知', 'sendData' => array( 'store_name' => $store[$StoreModel::STORE_NAME], 'order_no' => $billOrder[$BillModel::ORDER_NO], 'pick_code' => $pick_code, 'price' => $billOrder[$BillModel::ALL_MONEY], 'add_time' => date('Y-m-d H:i:s', $billOrder[$BillModel::ADD_TIME]), 'goods_name' => count($sellOrder) > 1 ? ($sellOrder[0]['goods_name'] . '等商品') : $sellOrder[0]['goods_name'], 'pick_time' => date('Y-m-d H:i:s', $billOnline[$BillOnlineModel::USER_SELECT_TIME]), 'user_phone' => $billOnline[$BillOnlineModel::USER_PHONE], 'username' => $billOnline[$BillOnlineModel::USER_NAME], 'user_remark' => $billOnline[$BillOnlineModel::REMARK], 'store_address' => $store[$StoreModel::ADDRESS], 'store_phone' => $store[$StoreModel::PHONE], 'order_type' => '普通订单', 'page' => 'pages/order/myOrderDetail/myOrderDetail?order_no=' . $billOrder[$BillModel::ORDER_NO] ), ); A('Api/XcxMark')->sendMark($tempSend); //小程序模板通知 } // file_put_contents('./xcxNotify.txt', 'test: 6' . "\r\n", FILE_APPEND); $upOnline = $BillOnlineModel->updateOrder($oMap, $onlineSave); if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 1) { $ShoppingModel = D('RetailShopping'); $sMAp = array($ShoppingModel::ID => array('in', $billOnline[$BillOnlineModel::SHOPPING_IDS])); $upShopping = $ShoppingModel->updateOrder($sMAp, array($ShoppingModel::STATE => 0)); } // file_put_contents('./xcxNotify.txt', 'test: 7' . "\r\n", FILE_APPEND); //新版推送 $content = array( 'login_string' => '', 'username' => '', 'type' => 1, 'order_no' => $billOrder[$BillModel::ORDER_NO], 'message' => "您有新的线上订单信息", ); sendSockets($billOrder[$BillModel::STORE_ID], $content, -1); if (C('IS_SET_REDIS')) { $redis_key = 'retail_*_' . $billOrder[$BillModel::UID] . '_' . $billOrder[$BillModel::ID]; $ApiRedis = new \Addons\Api\RedisController(); $redis_order = $ApiRedis::$redis->keys($redis_key); if (!empty($redis_order)) { $ApiRedis::$redis->delete($ApiRedis::$redis->keys($redis_key)); } } } $save = array( $BillModel::PAY_STATE => 1 ); if ($billOrder[$BillModel::TYPE] == 2) { $save[$BillModel::FINISH_TIME] = time(); } $upBill = $BillModel->updateOrder(array($BillModel::ID => $billOrder[$BillModel::ID]), $save); // file_put_contents('./xcxNotify.txt', 'm: ' . m()->_sql() . "\r\n", FILE_APPEND); if ($successCount == count($sellOrder) && $upBill) { $res['status'] = 1; $res['msg'] = '支付完成'; } else { $res['status'] = 0; $res['msg'] = '数据库发生错误,部分sell更新失败,请联系系统人员进行退款'; } A('PayApi/Printer')->linePrinting_v1($billOrder[$BillModel::STORE_ID], $billOrder[$BillModel::ID]); if (!empty($lessIntegralRes) && $lessIntegralRes['status'] == 0) { $res['msg'] .= ',' . $lessIntegralRes['msg']; } if (!empty($addIntegralRes) && $addIntegralRes['status'] == 0) { $res['msg'] .= ',' . $addIntegralRes['msg']; } if (!empty($billOrder[$BillModel::VID]) && !empty($billDiscount[$DiscountModel::COUPON_ID]) && empty($upCoupon)) { $res['msg'] .= ',优惠券更新失败'; } // 判断次卡 return $res; } /** * 添加出售库存记录 * @param $param * [ * $goods_id * $sku_id 规格id * $sell_id 出售记录id * serial_number_state 串号状态 0关闭 1开启 * $num 出库数量 * $all_money 出库价 * $type 1商城 2店内 * $goods_gifts_type null普通商品 0手动赠送 其他数字:促销赠送 * ] * @return array */ protected function quantityLogs($param) { $goods_id = $param['goods_id']; $sku_id = $param['sku_id']; $num = $param['num']; $all_money = $param['all_money']; $type = $param['type']; $original_price = $param['original_price']; $goods_gifts_type = $param['goods_gifts_type']; $sell_id = $param['sell_id']; $serial_number_state = $param['serial_number_state'] ? $param['serial_number_state'] : 0; if ($goods_gifts_type === null) { //非赠品的商品库存减少 $where = array(); if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $where['goods_id'] = $goods_id; $SSaleMGoods = new SSaleMGoodsModel(); $SSaleMGoods->updateSetDec($where, "goods_num", $num); } switch ($type) { case 1: //商城 if ($goods_gifts_type !== null) { //赠品 $stock_type = 17; $original_price = 0; } else { $stock_type = 8; } break; case 2: //门店 if ($goods_gifts_type !== null) { //赠品 $stock_type = 16; $original_price = 0; } else { //普通商品 $stock_type = 7; } break; } //串号信息 if ($serial_number_state == 1 && !empty($sell_id)) { $SerialClass = new SerialNumberGoods(); $serial_list = $SerialClass->sellSerialList([ 'id' => $sell_id ])['data']['list']; } $stock_data = [ 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'stock_price' => $original_price, 'stock_num' => $num, 'type' => $stock_type, 'all_money' => $all_money, 'sell_id' => $sell_id, 'serial_list' => $serial_list ? $serial_list : [] ]; $info = A('Api/Inventory')->goodsNumReduce($stock_data); $GoodsModel = D('RetailGoods'); $map = array( $GoodsModel::ID => $goods_id ); $success = $GoodsModel->toSetInc($map, $GoodsModel::SELL_NUM, $num); // 商品销售数量 $res = array( 'status' => 1, 'success' => $success, 'info' => $info['stock_arr'] ? $info['stock_arr'] : array() ); return $res; } /** * 扣除积分并添加积分记录 * @param $item vip_id integral store_id bill_id * @return mixed */ protected function lessIntegralOrderLog($item) { $VipModel = D('RetailVip'); $less = $VipModel->toSetDec(array($VipModel::ID => $item['vip_id']), $VipModel::INTEGRAL, $item['integral']); if ($less) { $IntegralOrderModel = D('RetailIntegralOrder'); $integralOrder = array( $IntegralOrderModel::VID => $item['vip_id'], $IntegralOrderModel::TYPE => 9, //'积分类型: 积分类型: 1签到获取 2消费获取 3使用积分 4后台充值 5后台扣除 6完善资料获取 7分享朋友赠送积分 8收银机充值 9积分抵现买单 $IntegralOrderModel::INTEGRAL => $item['integral'], $IntegralOrderModel::ADD_TIME => time(), $IntegralOrderModel::STORE_ID => $item['store_id'], $IntegralOrderModel::REMARK => '购买商品积分抵现扣除' . $item['integral'] . '积分', $IntegralOrderModel::BILL_ID => $item['bill_id'], ); $add = $IntegralOrderModel->addOrder($integralOrder); if ($add) { $res['status'] = 1; } else { $res['status'] = 0; $res['msg'] = '会员积分扣除成功,积分记录添加失败,请记住单号联系管理员修复'; } } else { $res['status'] = 0; $res['msg'] = '会员积分扣除失败'; } return $res; } /** * 增加积分并添加积分记录 * @param $item vip_id integral store_id bill_id remark * @return mixed */ protected function addIntegralOrderLog($item) { $VipModel = D('RetailVip'); $map = array( $VipModel::ID => $item['vip_id'] ); $inc = $VipModel->toSetInc($map, $VipModel::INTEGRAL, $item['integral']); if ($inc) { $addGradeIntegral = $VipModel->toSetInc($map, $VipModel::GRADE_INTEGRAL, $item['integral']); $IntegralOrderModel = D('RetailIntegralOrder'); $integralOrder = array( $IntegralOrderModel::VID => $item['vip_id'], $IntegralOrderModel::TYPE => 2, //'积分类型: 1签到获取 2消费获取 3使用积分 4后台充值 5后台扣除 6完善资料获取 7分享朋友赠送积分 8积分购买商品', $IntegralOrderModel::INTEGRAL => $item['integral'], $IntegralOrderModel::ADD_TIME => time(), $IntegralOrderModel::STORE_ID => $item['store_id'], $IntegralOrderModel::REMARK => $item['remark'], $IntegralOrderModel::BILL_ID => $item['bill_id'], ); $add = D('IntegralOrder')->addOrder($integralOrder); if ($add) { $res['status'] = 1; } else { $res['status'] = 0; $res['msg'] = '会员积分扣除成功,积分记录添加失败,请记住单号联系管理员修复。'; } if (!$addGradeIntegral) { $res['msg'] .= '会员等级积分记录添加失败。'; } } else { $res['status'] = 0; $res['msg'] = '会员积分添加失败'; } return $res; } /** * 新大陆普通购买支付完成 * @param $pay_order */ public function continent_pay_v1($pay_order) { $PayOrderModel = D('RetailPayOrder'); $pay = $this->paySuccess($pay_order[$PayOrderModel::BILL_ID]); } /** * 小程序购买商品升级身份 * @param array $item */ public function vipModify($item = array()) { // file_put_contents('./xcxNotify.txt', 'vipModify->item: ' . json_encode($item) . "\r\n", FILE_APPEND); $uid = $item['uid']; $merchant_id = $item['merchant_id']; $store_id = $item['store_id']; $time = time(); $PlusVipModel = D('RetailPlusVip'); $plusItem = array( $PlusVipModel::VIP_ID => $item['vid'], $PlusVipModel::XCX_VIP_ID => $uid, $PlusVipModel::MERCHANT_ID => $merchant_id, $PlusVipModel::STORE_ID => $store_id, $PlusVipModel::ADD_TIME => $time, $PlusVipModel::START_TIME => $time, $PlusVipModel::END_TIME => strtotime("+1 year"), $PlusVipModel::STATE => 1, ); $plus_vip_add = $PlusVipModel->addOrder($plusItem); //file_put_contents('./xcxNotify.txt', 'plus_vip_add->sql: ' . M()->_sql() . "\r\n", FILE_APPEND); if ($plus_vip_add) { $VipModel = D('RetailVip'); $vipSave = array( $VipModel::PLUS_ID => $plus_vip_add, $VipModel::PLUS_TYPE => 2, $VipModel::PLUS_STATE => 1, ); $VipModel->updateOrder(array($VipModel::ID => $item['vid']), $vipSave); $SmallProgramModel = D('RetailSmallProgramUser'); $sSave = array( $SmallProgramModel::PLUS_VIP_ID => $plus_vip_add, $SmallProgramModel::USER_TYPE => 2, ); $SmallProgramModel->updateOrder(array($SmallProgramModel::ID => $uid), $sSave); $PlusRecordModel = D('RetailPlusRecord'); $record = array( $PlusRecordModel::MERCHANT_ID => $merchant_id, $PlusRecordModel::STORE_ID => $store_id, $PlusRecordModel::XCX_UID => $uid, $PlusRecordModel::VIP_ID => $item['vid'], $PlusRecordModel::MONEY => $item['all_money'], $PlusRecordModel::PAY_STATE => 1, $PlusRecordModel::PAY_TYPE => 1, //微信 $PlusRecordModel::ACTIVITY_ID => $item['activity_id'], $PlusRecordModel::TYPE => $item['type'] == 1 ? 5 : 6, //5购买单个商品 6套餐组 $PlusRecordModel::GOODS_IDS => $item['goods_id'], $PlusRecordModel::ADD_TIME => $time, ); $PlusRecordModel->addOrder($record); } } /** * 获取骑手信息 * @param $order_no * @return mixed */ public function getRider($order_no) { //查询该订单 $BillModel = D('RetailBillOrder'); $bMap = array( $BillModel::ORDER_NO => strval($order_no), $BillModel::PAY_STATE => 1, //支付成功 $BillModel::TYPE => 1, //商城订单 $BillModel::ORDER_TYPE => array('in', '1,3'), //购买订单 换货订单 ); $billOrder = $BillModel->getFind($bMap); //主订单 if (empty($billOrder)) { $result['status'] = 0; $result['msg'] = '暂未查询到该订单'; return $result; } $merchant_id = $billOrder['merchant_id']; $OnlineModel = D('RetailBillOnline'); $oMap = array( $OnlineModel::BILL_ID => $billOrder[$BillModel::ID] ); $onlineOrder = $OnlineModel->getFind($oMap); //线上订单 if (empty($onlineOrder)) { $result['status'] = 0; $result['msg'] = '数据库操作有误'; return $result; } if ($onlineOrder[$OnlineModel::STATUS] == 3) { $result['status'] = 0; $result['msg'] = '订单已收货,请刷新页面查看'; return $result; } $type = $onlineOrder[$OnlineModel::DELIVERY_TYPE]; if ($type == 2 || $type == 3) { $DeliveryConfigModel = D('RetailDeliveryConfig'); $deliveryConfig = $DeliveryConfigModel->getFind(); if (empty($deliveryConfig)) { $result['status'] = 0; $result['msg'] = '请先联系合伙人完善开发者信息'; return $result; } } switch ($type) { case 2: //达达配送 $data['order_id'] = $billOrder[$BillModel::ID]; $DaMerchantModel = D('RetailDaMerchant'); $result_id = $DaMerchantModel->getFindField(array($DaMerchantModel::MERCHANT_ID => $merchant_id), $DaMerchantModel::RESULT_ID); if (empty($result_id)) { $result['status'] = 0; $result['msg'] = '请先在达达配送注册达达商户'; return $result; } $success = A('Retail/DadaCeshi')->rider($deliveryConfig[$DeliveryConfigModel::DA_APP_KEY], $deliveryConfig[$DeliveryConfigModel::DA_APP_SECRET], $result_id, $data); $success = json_decode($success, true); if ($success['status'] == 'success') { $result['status'] = 1; $result['msg'] = '获取成功'; $result['transporterName'] = $success['result']['transporterName']; $result['transporterPhone'] = $success['result']['transporterPhone']; $result['deliveryFee'] = $success['result']['deliveryFee']; $result['tips'] = $success['result']['tips']; $result['couponFee'] = $success['result']['couponFee'] ? $success['result']['couponFee'] : '无'; $result['actualFee'] = $success['result']['actualFee'] ? $success['result']['actualFee'] : '无'; $result['distance'] = $success['result']['distance']; $result['transporterLng'] = $success['result']['transporterLng']; $result['transporterLat'] = $success['result']['transporterLat']; } else { $result['status'] = 0; $result['msg'] = '骑手未开启定位系统,无法获取信息'; } break; case 3: //UU配送 $uu_app_id = $deliveryConfig[$DeliveryConfigModel::UU_APPID]; $uu_app_key = $deliveryConfig[$DeliveryConfigModel::UU_APP_KEY]; $UuOrderModel = D('RetailUuOrder'); $uuMap = array( $UuOrderModel::ID => $onlineOrder[$OnlineModel::DELIVERY_RECORD_ID] ); $uu_order = $UuOrderModel->getFind($uuMap); if (!$uu_order) { $result['status'] = 0; $result['msg'] = '未找到该uu订单'; return $result; } $UUMerchantModel = D('RetailUuMerchant'); $openid = $UUMerchantModel->getFindField(array($UUMerchantModel::MERCHANT_ID => $merchant_id), $UUMerchantModel::OPENID); $data['order_code'] = $uu_order['ordercode']; $data['origin_id'] = $uu_order['origin_id']; $data['openid'] = $openid; $data['appid'] = $uu_app_id; $content = A('Retail/Uudelivery')->getorderdetail($data, $uu_app_key); $content = json_decode($content, true); if ($content['return_code'] == 'ok' && $content['appid'] == $data['appid']) { $driver_lastloc = $content['driver_lastloc']; $driver_lastloc = explode(',', $driver_lastloc); $position = Convert_BD09_To_GCJ02($driver_lastloc[1], $driver_lastloc[0]); $result['status'] = 1; $result['msg'] = '获取成功'; $result['transporterName'] = $content['driver_name']; $result['transporterPhone'] = $content['driver_mobile']; $result['deliveryFee'] = $uu_order['total_money']; $result['tips'] = 0; $result['couponFee'] = $uu_order['total_priceoff']; $result['actualFee'] = $uu_order['need_paymoney']; $result['distance'] = $content['distance']; $result['transporterLng'] = $position['lng']; $result['transporterLat'] = $position['lat']; } else { $result['status'] = 0; $result['msg'] = $content['return_msg']; } break; case 5: //码科配送 $MakeClass = new Make(); $result = $MakeClass->order_info([ 'merchant_id' => $merchant_id, 'bill_id' => $billOrder['id'] ]); $result['msg'] = $result['message']; $info = $result['data']; //订单详情 $result['transporterName'] = $info['order_rider']['real_name']; $result['transporterPhone'] = $info['order_rider']['mobile']; $result['deliveryFee'] = $info['pay_price']; $result['distance'] = $info['distance']; $result['transporterLng'] = $info['order_rider']['longitude']; $result['transporterLat'] = $info['order_rider']['latitude']; $result['tips'] = 0; $result['couponFee'] = 0; $result['actualFee'] = 0; break; default: $result['status'] = 0; $result['msg'] = '商家配送暂无详细信息'; break; } return $result; } /** * 2019-11-12 普通购买支付完成 plus会员时长套餐自定义版 * @param $pay_order * @return mixed */ public function continent_pay_v2($pay_order) { $PayOrderModel = D('RetailPayOrder'); return $this->paySuccess_v1($pay_order[$PayOrderModel::BILL_ID]); } /** * 2019-11-12商城普通订单、店内订单支付成功回调 * @param $bill array|number bill_order表id或整条bill_order数据 * @return mixed */ public function paySuccess_v1($bill) { $StoreModel = D('RetailStore'); $BillModel = new RetailBillOrderModel(); if (is_array($bill)) { $billOrder = $bill; } else { $billOrder = $BillModel->getFind(array($BillModel::ID => $bill)); } if (empty($billOrder)) { return array('status' => 0, 'msg' => '订单不存在'); } // 防止重复处理已支付订单(避免重复打印) if ($billOrder[$BillModel::PAY_STATE] == 1) { return array('status' => 1, 'msg' => '订单已支付,无需重复处理'); } $supplier_type = D("RetailStore")->getFindField(array('id' => $billOrder['store_id']), "supplier_type"); //2寄售 // file_put_contents('./xcxNotify.txt', 'billOrder: ' . json_encode($billOrder) . "\r\n", FILE_APPEND); $integral = 0; //送会员的总积分 $orderIntegralMoney = 0; //整单送积分的钱 //整单送积分、会员消费赠送积分 $percent_state = false; //判断商户是否开启整单会员送积分 $balance_percent_state = false; //判断商户是否开启余额支付送积分 $VipModel = new RetailVipModel(); $VipConfigModel = new RetailVipConfigModel(); $vip = array(); if (!empty($billOrder['vid'])) { $vip = $VipModel->getFind(array('id' => $billOrder['vid'])); $plus_type = $vip[$VipModel::PLUS_TYPE]; // 查询等级 $Integral = new VipIntegralModel(); $grade_info = $Integral->getFindGrade(array('merchantid' => $billOrder['merchant_id'], 'min_integral' => array('elt', $vip[$VipModel::GRADE_INTEGRAL]))); $vip['grade_id'] = !empty($grade_info) ? $grade_info['id'] : 0; // 0 为无等级 $fields = array( $VipConfigModel::PERCENT_STATE, $VipConfigModel::PERCENT, $VipConfigModel::PLUS_PERCENT_STATE, $VipConfigModel::PLUS_PERCENT, $VipConfigModel::GOODS_INTEGRAL_STATE, $VipConfigModel::GOODS_INTEGRAL_PLUS_STATE, $VipConfigModel::GOODS_INTEGRAL_MULTIPLE, 'flower_price', 'plus_flower_type', 'plus_flower_price', 'plus_flower_percent', 'vip_pay_integral_state', 'plus_pay_integral_state', ); $vipConfig = $VipConfigModel->getFind(array($VipConfigModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID]), $fields); //商户开启买单送积分 if ($vipConfig) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig ); $percent_state = $VipConfigModel->buy_integral_config($parameter); if ($percent_state && $plus_type == 2) { $balance_percent_state = $vipConfig['plus_pay_integral_state'] == 1 ? true : false; } else if ($percent_state && $plus_type == 3) { $balance_percent_state = $vipConfig['vip_pay_integral_state'] == 1 ? true : false; } } } $SellModel = new RetailSellModel(); $fields = array( 's.*', 'g.integral_mem_status', 'g.integral as g_integral', 'g.integral' ); $map = array( 's.bill_id' => $billOrder['id'] ); $sellOrder = $SellModel->getSelectAndGoods($map, $fields, 's.original_price asc'); // file_put_contents('./xcxNotify.txt', 'sellOrder: ' . json_encode($sellOrder) . "\r\n", FILE_APPEND); $sendIntegral = 0; //单品送积分 $successCount = 0; //记录sell表更新成功的数量 $PayOrderModel = new RetailPayOrderModel(); $new_map = array( 'bill_id' => $billOrder['id'], 'order_state' => 'SUCCESS', 'pay_type' => array('neq', 6), ); $out_balance_money = $PayOrderModel->getSum($new_map, 'trade_amount'); //非余额支付的总金额,余额支付不赠积分 $BillOnlineModel = new RetailBillOnlineModel(); $oMap = array( 'bill_id' => $billOrder['id'] ); if ($billOrder['type'] == 1) { //商城订单 $billOnline = $BillOnlineModel->getFind($oMap); $verification_available_type = 1; } else { $billOnline = array(); $verification_available_type = 2; } $goods_id = []; //为了存储省级plus会员所用 $goods_info = []; //线下分销使用 $allGuideMoney = 0; $total_less_money = 0; foreach ($sellOrder as &$value) { //下单更新PLUS会员表total_less_money if ($value['plus_vip_price'] > 0 && $value['vip_less_money'] > 0) { $total_less_money = bcadd($total_less_money, $value['vip_less_money'], 2); } $sku_id = ''; //规格id if (!empty($value['sku_json_info'])) { if ($billOrder['type'] == 2 || $billOnline['order_genre'] == 1) { // 非拼团秒杀 $sku = json_decode($value['sku_json_info'], true); $sku_id = $sku['id']; } } $save = array( 'pay_state' => 1, 'pay_type' => $billOrder['pay_type'] ); $value['integral_type'] = 1; //临时用来判断当前商品赠送积分类型 1整单送积分 2单品送积分 //非无码商品 if ($value['goods_type'] == 1) { $goods_id[] = $value['goods_id']; $data = [ 'goods_id' => $value['goods_id'], 'sku_id' => $sku_id, 'num' => $value['num'], 'all_money' => $value['all_money'], 'type' => $value['type'], 'original_price' => $value['original_price'], 'goods_gifts_type' => $value['goods_gifts_type'], 'sell_id' => $value['id'], 'serial_number_state' => $value['serial_number_state'] ]; $addLog = $this->quantityLogs($data); if (!$addLog['success']) { $res['status'] = 0; $res['msg'] = '数据库发生错误,库存记录添加失败,请联系系统人员进行退款'; return $res; } //寄售供货商 if (!empty($addLog['info']) && $supplier_type == 2 && !empty($addLog['info']['supplier_json']) && !empty($addLog['info']['purchase_id_str'])) { $parameter = array( 'supplier_json' => $addLog['info']['supplier_json'], 'purchase_id_str' => $addLog['info']['purchase_id_str'], 'store_id' => $billOrder['store_id'] ); D("SPurchasePayable")->addPayableMoney($parameter); $save['supplier_json'] = json_encode($addLog['info']['supplier_json']); $save['purchase_id_str'] = $addLog['info']['purchase_id_str']; } //整单送积分不包含单品送积分,二者互斥 if (!empty($billOrder['vid']) && $value['integral_mem_status'] == 1 && !empty($value['g_integral']) && $value['goods_gifts_id'] == 0) { //判断商户是否开启指定商品送积分 if ($vipConfig && $value['integral_mem_status'] == 1 && $value['integral'] > 0) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig, 'integral' => $value['integral'], 'num' => $value['num'] ); $get_integral = $VipConfigModel->buy_goods_get_integral($parameter); if ($get_integral > 0) { $value['integral_type'] = 2; $save['get_integral'] = $get_integral; //获得积分 $sendIntegral += $get_integral; } } } //组成分销数组 $goods_info[] = [ 'sell_id' => $value['id'], 'goods_id' => $value['goods_id'], 'total_amount' => $value['all_money'], ]; } if ($percent_state && $value['integral_type'] == 1) { //整单送积分 $sell_all_money = $value['all_money']; //临时记录单种商品整单赠送积分金额的钱 if (!$balance_percent_state) { //余额支付不送积分 if (round($orderIntegralMoney + $sell_all_money - $out_balance_money, 2) >= 0) { $sell_all_money = round($out_balance_money - $orderIntegralMoney, 2); } } $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig, 'all_money' => $sell_all_money, ); $get_integral = $VipConfigModel->buy_get_integral($parameter); $save['get_integral'] = $get_integral; $sendIntegral += $get_integral; $orderIntegralMoney += $sell_all_money; } // 赠品库存更新 if ($value['goods_gifts_id']) { $GoodsGiftsModel = new RetailGoodsGiftsModel(); $GoodsGiftsModel->toSetDec(['id' => $value['goods_gifts_id']], 'remain_inventory', $value['num']); } $upSell = $SellModel->updateOrder(array('id' => $value['id']), $save); if ($upSell || $billOrder['settlement_type'] == 2) { //或者赊账订单 $successCount++; } $allGuideMoney += $value['guide_royalty']; } //下单更新PLUS会员表total_less_money if ($total_less_money && $billOrder['vid'] > 0) { $RetailPlusVip = D('RetailPlusVip'); $RetailPlusVip->toSetInc(['vip_id' => $billOrder['vid']], 'total_less_money', $total_less_money); } //导购员提成 if (!empty($allGuideMoney)) { $retailGuideModel = new RetailGuideModel(); $commission = $retailGuideModel->getFindField(array($retailGuideModel::ID => $billOrder[$BillModel::GUIDE_ID]), $retailGuideModel::COMMISSION); $GuideIncomeModel = new RetailGuideIncomeModel(); $guide[$GuideIncomeModel::BILL_ID] = $billOrder['id']; $guide[$GuideIncomeModel::STORE_ID] = $billOrder['store_id']; $guide[$GuideIncomeModel::VID] = $billOrder['vid']; $guide[$GuideIncomeModel::GUIDE_ID] = $billOrder['guide_id']; $guide[$GuideIncomeModel::ALL_MONEY] = $billOrder['all_money']; $guide[$GuideIncomeModel::PAY_TYPE] = $billOrder['pay_type']; $guide[$GuideIncomeModel::PAY_TIME] = time(); $guide[$GuideIncomeModel::COMMISSION] = $commission; $guide[$GuideIncomeModel::INCOME] = round($allGuideMoney, 2); $guide[$GuideIncomeModel::ORIGINAL_INCOME] = round($allGuideMoney, 2); $guideIncomeAdd = $GuideIncomeModel->addOrder($guide); if (!$guideIncomeAdd) { $res['status'] = 0; $res['msg'] = '订单更新失败'; return $res; } } $DiscountModel = new RetailBillDiscountModel(); $map = array( 'bill_id' => $billOrder['id'] ); $billDiscount = $DiscountModel->getFind($map); //会员支付 if (!empty($billOrder['vid'])) { //会员积分抵现,减少积分并添加积分记录 if (!empty($billDiscount) && !empty($billDiscount['use_integral']) && $billDiscount['use_integral'] > 0) { $item = array( 'vip_id' => $billOrder['vid'], 'store_id' => $billOrder['store_id'], 'integral' => $billDiscount['use_integral'], 'bill_id' => $billOrder['id'], ); $lessIntegralRes = $this->lessIntegralOrderLog($item); } //单品送积分 if ($sendIntegral > 0) { $integral = $sendIntegral; } //整单送积分、会员消费赠送积分大于每个商品商品计算的积分 if ($orderIntegralMoney > 0 && $percent_state) { $parameter = array( 'vip_type' => $plus_type, 'vip_config' => $vipConfig, 'all_money' => $orderIntegralMoney ); $orderIntegral = $VipConfigModel->buy_get_integral($parameter); if ($orderIntegral > 1 && $sendIntegral < $orderIntegral) { //整单送积分剩余 foreach ($sellOrder as $val_1) { if ($val_1['integral_type'] == 1) { $upSell = $SellModel->toSetInc(array($SellModel::ID => $val_1[$SellModel::ID]), $SellModel::GET_INTEGRAL, round($orderIntegral - $sendIntegral)); break; } } $integral += round($orderIntegral - $sendIntegral); } } //增加会员积分并添加积分记录 if ($integral > 0) { $item = array( 'vip_id' => $billOrder['vid'], 'store_id' => $billOrder['store_id'], 'bill_id' => $billOrder['id'], 'integral' => $integral, 'remark' => '购买商品送积分,共获得' . $integral . '积分', ); $addIntegralRes = $this->addIntegralOrderLog($item); $upBill = $DiscountModel->updateOrder($map, array('get_integral' => $integral)); } //修改优惠券状态 if (!empty($billDiscount['coupon_id'])) { if ($billDiscount['coupon_type'] == 2) { //商户优惠券 $VipMCouponModel = D('RetailVipMCoupon'); $couponData[$VipMCouponModel::IS_USE] = 2; $couponData[$VipMCouponModel::USE_TIME] = time(); $couponData[$VipMCouponModel::STORE_ID] = $billOrder[$BillModel::STORE_ID]; $couponData[$VipMCouponModel::LESS_MONEY] = $billDiscount[$DiscountModel::COUPON_MONEY]; $upCoupon = $VipMCouponModel->updateOrder(array($VipMCouponModel::ID => $billDiscount[$DiscountModel::COUPON_ID]), $couponData); } } //存零 if (floatval($billOrder['zero_storage']) > 0 && !empty($billOrder['vid'])) { $map = array( 'id' => $billOrder['vid'] ); $save = $VipModel->toSetInc($map, $VipModel::BALANCE, $billOrder['zero_storage']); if ($save) { $RechargeOrderModel = new RetailRechargeOrderModel(); $reItem = array( 'store_id' => $billOrder['store_id'], 'vid' => $billOrder['vid'], 'type' => 1, 'scene_type' => 1, 'add_time' => time(), 'money' => $billOrder['zero_storage'], 'all_money' => $billOrder['zero_storage'], 'cashier_id' => $billOrder['cashier_id'], 'remark' => '现金支付存零' . $billOrder['zero_storage'] . '元', 'user_TYPE' => 3, 'merchant_id' => $billOrder['merchant_id'], 'bill_id' => $billOrder['id'], 'pay_type' => 1, ); $ret2 = $RechargeOrderModel->addOrder($reItem); A('Vip/Mark')->rechargesuccess($billOrder['store_id'], $billOrder['vid'], $billOrder['zero_storage'], $billOrder['zero_storage']); } } $payInfo['ordernum'] = $billOrder['order_no']; $payInfo['integral'] = $integral; switch ($billOrder['pay_type']) { case '1': $payType = '现金支付'; break; case '2': $payType = '银行卡支付'; break; case '3': $payType = '微信支付'; break; case '4': $payType = '支付宝支付'; break; case '5': $payType = '余额支付'; break; case '6': $payType = '小程序商城微信支付'; break; case '7': $payType = '其他支付方式'; break; case '8': $payType = '组合支付'; break; } A('Vip/Mark')->paysuccess($billOrder['store_id'], $billOrder['vid'], $billOrder['all_money'], $payType, $payInfo); //支付赠送优惠券 $paymentGiveCoupon = $this->paymentGiveCoupon($billOrder['merchant_id'], $billOrder['store_id'], $billOrder['id'], $billOrder['all_money'], $billOrder['uid'], $vip); // 判断是否为购买次卡 $CardOrder = D('RetailCardOrder'); $is_buy_card = false; $co_map = array( $CardOrder::MERCHANT_ID => $billOrder['merchant_id'], $CardOrder::STORE_ID => $billOrder['store_id'], $CardOrder::VIP_ID => $billOrder['vid'], $CardOrder::BILL_ID => $billOrder['id'], ); $card_order = $CardOrder->getFind($co_map); if (!empty($card_order)) { $is_buy_card = true; } // 判断 $source = $billOrder['type'] == 1 ? 2 : 1; if ($is_buy_card == true) { $grant_res = A('Api/SubCard')->grantCard($card_order, $billOrder['vid']); if ($grant_res['status'] == 1) { $CardOrder->updateOrder(array($CardOrder::ID => $card_order[$CardOrder::ID]), array($CardOrder::STATE => 1)); } } else { // 消费送次卡 A('PayApi/VipCard')->rechargeGiveCard($billOrder['merchant_id'], $billOrder['vid'], $billOrder['all_money'], 3, $source, 0, $billOrder['id']); } } $SmallProgramUserModel = new RetailSmallProgramUserModel(); $xcxVipInfo = $SmallProgramUserModel->getFind(['id' => $billOrder['uid']]); if (!empty($billDiscount['coupon_id']) && $billDiscount['coupon_type'] == 3) { //商家券核销 $openid = $xcxVipInfo['openid']; //小程序用户openid $service_openid = $xcxVipInfo['service_openid']; //服务商下的openid $ordinary_openid = $xcxVipInfo['ordinary_openid']; //商户公众号下的openid if (empty($openid)) { //通过商家券用户id查询用户openid $xcxUserClass = new XcxUser(); $xcx_info = $xcxUserClass->basisCouponIdGetOpenid([ 'coupon_id' => $billDiscount['coupon_id'] ]); if (!empty($xcx_info)) { $openid = $xcx_info['data']['xcx_info']['openid']; $service_openid = $xcx_info['data']['xcx_info']['service_openid']; $ordinary_openid = $xcx_info['data']['xcx_info']['ordinary_openid']; } } $ShopCouponClass = new ShopCoupon(); $shopResult = $ShopCouponClass->verificationCoupon([ 'coupon_id' => $billDiscount['coupon_id'], 'merchant_id' => $billOrder['merchant_id'], 'verification_available_type' => $verification_available_type, 'verification_store_id' => $billOrder['store_id'], 'bill_id' => $billOrder['id'], 'openid' => $openid ? $openid : '', 'service_openid' => $service_openid ? $service_openid : '', 'ordinary_openid' => $ordinary_openid ? $ordinary_openid : '', 'operator_id' => $billOrder['cashier_id'] ]); $upCoupon = $shopResult['status']; } if ($billOrder['type'] == 1) { //商城,使用门店优惠券 if (!empty($billDiscount[$DiscountModel::COUPON_ID]) && $billDiscount[$DiscountModel::COUPON_TYPE] == 1) { //门店优惠券 $CouponLogsModel = D('RetailCouponLogs'); $cSave = array( $CouponLogsModel::STATUS => 2, $CouponLogsModel::USE_TIME => time() ); $upCoupon = $CouponLogsModel->updateOrder(array($CouponLogsModel::ID => $billDiscount[$DiscountModel::COUPON_ID]), $cSave); } // file_put_contents('./xcxNotify.txt', 'test: 4' . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'pay_type: ' . $billOrder[$BillModel::PAY_TYPE] . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'vip: ' . json_encode($vip) . "\r\n", FILE_APPEND); //file_put_contents('./xcxNotify.txt', 'upgrade_state: ' . $billOrder[$BillModel::UPGRADE_STATE] . "\r\n", FILE_APPEND); if ($billOrder[$BillModel::PAY_TYPE] == 8) { //小程序组合支付 $vipPay = A('PayApi/VipPay')->pay($billOrder[$BillModel::ID], 4, 2); } else if ($billOrder[$BillModel::PAY_TYPE] == 6 && $billOrder[$BillModel::UPGRADE_STATE] == 1) { //file_put_contents('./xcxNotify.txt', 'xcxVip: ' . json_encode($xcxVipInfo) . "\r\n", FILE_APPEND); if ($xcxVipInfo[$SmallProgramUserModel::USER_TYPE] == 1) { //普通会员升级为Plus会员 $vItem = array( 'store_id' => $billOrder[$BillModel::STORE_ID], 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], 'bill_id' => $billOrder[$BillModel::ID], 'uid' => $billOrder[$BillModel::UID], 'all_money' => $billOrder[$BillModel::ALL_MONEY], ); $this->vipModify_v1($vItem); } } else if (empty($vip)) { $rvItem = array( 'store_id' => $xcxVipInfo['store_id'] ? $xcxVipInfo['store_id'] : $billOrder['store_id'], 'nickname' => $xcxVipInfo['nickname'], 'mobile_phone' => $billOnline['user_phone'], 'avatar' => $xcxVipInfo['avatar'], 'uid' => $xcxVipInfo['id'], ); $this->registerVip($billOrder['merchant_id'], 1, $rvItem); } // file_put_contents('./xcxNotify.txt', 'test: 5' . "\r\n", FILE_APPEND); $onlineSave[$BillOnlineModel::STATUS] = 1; if ($billOnline[$BillOnlineModel::PICKUP_TYPE] == 1) { //自提 $pick_code = getPickCode(); $res['pick_code'] = $pick_code; $onlineSave[$BillOnlineModel::PICK_CODE] = $pick_code; //服务通知 $store = $StoreModel->getFind(array($StoreModel::ID => $billOrder[$BillModel::STORE_ID])); $tempSend = array( 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], 'openid' => $xcxVipInfo[$SmallProgramUserModel::OPENID], 'form_id' => $billOnline[$BillOnlineModel::FORM_ID], 'type' => 1, //'1自提通知 2发货通知', 'sendData' => array( 'store_name' => $store[$StoreModel::STORE_NAME], 'order_no' => $billOrder[$BillModel::ORDER_NO], 'pick_code' => $pick_code, 'price' => $billOrder[$BillModel::ALL_MONEY], 'add_time' => date('Y-m-d H:i:s', $billOrder[$BillModel::ADD_TIME]), 'goods_name' => count($sellOrder) > 1 ? ($sellOrder[0]['goods_name'] . '等商品') : $sellOrder[0]['goods_name'], 'pick_time' => date('Y-m-d H:i:s', $billOnline[$BillOnlineModel::USER_SELECT_TIME]), 'user_phone' => $billOnline[$BillOnlineModel::USER_PHONE], 'username' => $billOnline[$BillOnlineModel::USER_NAME], 'user_remark' => $billOnline[$BillOnlineModel::REMARK] ? $billOnline[$BillOnlineModel::REMARK] : '暂无备注', 'store_address' => $store[$StoreModel::ADDRESS], 'store_phone' => $store[$StoreModel::PHONE], 'order_type' => '普通订单', 'page' => 'pages/order/myOrderDetail/myOrderDetail?order_no=' . $billOrder[$BillModel::ORDER_NO] ), ); A('Api/XcxMark')->sendMark($tempSend); //小程序模板通知 } // file_put_contents('./xcxNotify.txt', 'test: 6' . "\r\n", FILE_APPEND); $upOnline = $BillOnlineModel->updateOrder($oMap, $onlineSave); if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 1) { $ShoppingModel = D('RetailShopping'); $sMAp = array($ShoppingModel::ID => array('in', $billOnline[$BillOnlineModel::SHOPPING_IDS])); $upShopping = $ShoppingModel->updateOrder($sMAp, array($ShoppingModel::STATE => 0)); } // file_put_contents('./xcxNotify.txt', 'test: 7' . "\r\n", FILE_APPEND); //新版推送 $content = array( 'login_string' => '', 'username' => '', 'type' => 1, 'order_no' => $billOrder[$BillModel::ORDER_NO], 'message' => "您有新的线上订单信息", ); sendSockets($billOrder[$BillModel::STORE_ID], $content, -1); if (C('IS_SET_REDIS')) { $redis_key = 'retail_*_' . $billOrder[$BillModel::UID] . '_' . $billOrder[$BillModel::ID]; $ApiRedis = new \Addons\Api\RedisController(); $redis_order = $ApiRedis::$redis->keys($redis_key); if (!empty($redis_order)) { $ApiRedis::$redis->delete($ApiRedis::$redis->keys($redis_key)); } } } if (C('IS_SET_REDIS') && !empty($billDiscount['coupon_id'])) { //清空优惠券redis $billOrder['uid'] = $billOrder['uid'] ? $billOrder['uid'] : 0; $ApiRedis = new \Addons\Api\RedisController(); $coupon_redis_key = 'retail_coupon_store_id_' . $billOrder['store_id'] . '_uid_' . $billOrder['uid'] . '_coupon_type_' . $billDiscount['coupon_type'] . '_coupon_id_' . $billDiscount['coupon_id']; $ApiRedis::$redis->delete($coupon_redis_key); } if ($billOrder['platform_type'] == 2) { //第三方平台 $ThirdOrderClass = new Order(); $thirdResult = $ThirdOrderClass->orderPayment([ 'merchant_id' => $billOrder['merchant_id'], 'third_order' => $billOrder['third_order'], 'pay_type' => $billOrder['pay_type'] ]); if ($thirdResult['status'] == 0) { $res['status'] = 0; $res['msg'] = '第三方平台订单状态修改失败' . $thirdResult['message']; } } $save = array( 'pay_state' => 1 ); if ($billOrder[$BillModel::TYPE] == 2) { $save[$BillModel::FINISH_TIME] = time(); } $upBill = $BillModel->updateOrder(array($BillModel::ID => $billOrder[$BillModel::ID]), $save); $BillModel->create_print_number($billOrder['id'], $billOrder['type'], $billOrder['store_id']); // 生成排序单号 if ($successCount == count($sellOrder) && $upBill) { $billOrder['goods'] = $sellOrder; Hook::listen('pay_success', $billOrder); $res['status'] = 1; $res['msg'] = '支付完成'; switch ($billOrder['type']) { case 1: //商城订单 //收银员推送 $CashierClass = new Cashier(); $CashierClass->pushCashier([ 'merchant_id' => $billOrder['merchant_id'], 'store_id' => $billOrder['store_id'], 'data' => [ 'order_number' => $billOrder['order_no'], 'flower_balance' => $billOrder['all_money'], 'add_time' => $billOrder['add_time'], 'pickup_type_name' => $billOnline['pickup_type'] == 1 ? '自提' : ($billOnline['pickup_type'] == 2 ? '配送' : '快递发货'), 'user_select_time' => $billOnline['user_select_time'], 'user_name' => $billOnline['user_name'], 'mobile_phone' => $billOnline['user_phone'], 'user_address' => $billOnline['pickup_type'] == 1 ? '自提' : $billOnline['user_address'] ] ]); $this->automaticDelivery($billOnline['bill_id']); break; case 2: //线下订单 //判断微信刷卡支付推送红包或大转盘(会员的所有支付方式,不是会员的微信支付) $PayOrderModel = new RetailPayOrderModel(); if ($billOrder[$BillModel::PAY_TYPE] == 3 || $billOrder[$BillModel::PAY_TYPE] == 8) { $payOrder = $PayOrderModel->getFind(array($PayOrderModel::BILL_ID => $billOrder[$BillModel::ID], $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::PAY_TYPE => 1)); $extend_content = $payOrder[$PayOrderModel::EXTEND_CONTENT] ? json_decode($payOrder[$PayOrderModel::EXTEND_CONTENT], true) : ''; } if ((empty($billOrder[$BillModel::VID]) && $billOrder[$BillModel::PAY_TYPE] == 3 || $billOrder[$BillModel::PAY_TYPE] == 8 && !empty($extend_content)) || (!empty($billOrder[$BillModel::VID]))) { //微信支付 if (empty($billOrder[$BillModel::VID])) { $openid = $extend_content['sub_openid'] ? $extend_content['sub_openid'] : $extend_content['openid']; //判断是否是会员、不是就注册 // $this->registerVip($billOrder['merchant_id'], 2, array('openid' => $openid, 'store_id' => $billOrder['store_id'])); } else { $openid = $vip[$VipModel::OPEN_ID] ? $vip[$VipModel::OPEN_ID] : ''; } } else if (!empty($billOrder['vid'])) { $openid = $vip[$VipModel::OPEN_ID] ? $vip[$VipModel::OPEN_ID] : ''; } if (!empty($openid)) { //推送红包大转盘 A('Api/Vip')->toMark($openid, $billOrder['store_id'], $billOrder['id'], $billOrder['all_money']); } break; } } else { $res['status'] = 0; $res['msg'] = '数据库发生错误,部分sell更新失败,请联系系统人员进行退款'; } $PrinterApi = new PrinterController(); $PrinterApi->linePrinting_v1($billOrder['store_id'], $billOrder['id']); if (!empty($lessIntegralRes) && $lessIntegralRes['status'] == 0) { $res['msg'] .= ',' . $lessIntegralRes['msg']; } if (!empty($addIntegralRes) && $addIntegralRes['status'] == 0) { $res['msg'] .= ',' . $addIntegralRes['msg']; } if (!empty($billOrder['vid']) && !empty($billDiscount['coupon_id']) && empty($upCoupon)) { $res['msg'] .= ',优惠券更新失败'; } // 分销佣金计算、分销回调--更新客户绑定信息 $Plug = new Plug(); $plugData = $Plug->PlugPermissions([ 'merchant_id' => $billOrder['merchant_id'], 'identification_arr' => [ 'malldistribution' ] ]);//查询是否拥有分销插件权限 if (isset($plugData['data']['plug']['malldistribution']) && $plugData['data']['plug']['malldistribution']) { if ($billOrder['type'] == 1) { $DisOrderModel = new \Distribution\Model\OrderModel(); $idDisBillId = $DisOrderModel->getFind(['bill_id' => $billOrder['id']]); if ($idDisBillId) { $LinkBusiness = new \Distribution\Business\Link(); try { $LinkBusiness->getDisLinkOperate($billOrder); } catch (\Exception $e) { } } } else if (!empty($billOrder['vid']) || !empty($openid)) { if (empty($billOrder['vid'])) { $vid = $VipModel->getFindField(['openid' => $openid, 'merchantid' => $billOrder['merchant_id']], 'id'); } else { $vid = $billOrder['vid']; } if ($vid) { $uid = $SmallProgramUserModel->getOrderFindField(['vid' => $vid], 'id', 'id desc'); if ($uid) { $BillModel->updateOrder(['id' => $billOrder['id']], ['uid' => $uid, 'vid' => $vid]); $StoreModel->updateOrder(['bill_id' => $billOrder['id']], ['uid' => $uid, 'vid' => $vid]); $calculate = [ 'merchant_id' => $billOrder['merchant_id'], 'bill_id' => $billOrder['id'], 'goods_id' => $goods_id, 'goods_info' => $goods_info, 'distributor_id' => '', 'uid' => $uid, ]; Hook::listen('calculate_commission', $calculate); } } } } // 判断次卡 return $res; } public function automaticDelivery($bill_id) { $StoreModel = D('RetailStore'); $RetailBillOnlineModel = D('RetailBillOnline'); $billOnline = $RetailBillOnlineModel->where(['bill_id' => $bill_id])->find(); if (!$billOnline) { return; } $RetailBillOrderModel = D('RetailBillOrder'); $billOrder = $RetailBillOrderModel->where(['id' => $billOnline['bill_id']])->find(); if (!$billOrder) { return; } $store = $StoreModel->where(['id' => $billOrder['store_id']])->find(); if (!$store) { return; } if ((int)$billOnline['pickup_type'] === 2 && (int)$store['automatic_delivery'] === 1) { return A("Api/Delivery")->deliveryOrder([ 'option_type' => 2, 'operation_id' => 0, 'merchant_id' => $billOrder['merchant_id'], 'store_id' => $billOrder['store_id'], 'store' => $store, 'order_no' => $billOrder['order_no'], 'type' => $store['default_delivery'], 'uu_phone' => $store['phone'], 'special_type' => 0, 'note' => "", 'total_price' => null, 'platform_type'=> 1 ]); } } /** * 支付成会员 * @param $merchant_id 商户id * @param $type 场景类型 1线上 2线下 * @param array $data */ protected function registerVip($merchant_id, $type, $data = array()) { if ($type == 2 && empty($data['openid'])) { return; } else if ($type == 1 && (empty($data['nickname']) || empty($data['avatar']))) { } $MerConfModel = D('MerchantConfig'); $m_map = array( 'merchant_id' => $merchant_id, ); $pay_to_vip_state = $MerConfModel->getFindField($m_map, 'pay_to_vip_state'); if ($pay_to_vip_state && $pay_to_vip_state == 1) { //商户开启支付成为会员功能 $VipModel = D('RetailVip'); $v_map = array( 'merchantid' => $merchant_id, 'status' => array('not in', array('1', '3', '4')), ); if (!empty($data['openid'])) { $v_map['openid'] = $data['openid']; } if (!empty($data['mobile_phone'])) { $v_map['mobile_phone'] = $data['mobile_phone']; } $vip = $VipModel->getFind($v_map); if (empty($vip)) { //该用户不是会员 $item = array( 'merchantid' => $merchant_id, 'storeid' => $data['store_id'], 'openid' => $data['openid'], 'is_register' => $data['openid'] ? 1 : 0, 'mobile_phone' => $data['mobile_phone'], 'nickname' => $data['nickname'], 'headimgurl' => $data['avatar'], 'addtime' => time(), ); $id = $VipModel->addOrder($item); if (!empty($data['uid'])) { $up = array( 'vid' => $id, 'type' => 3, ); D('RetailSmallProgramUser')->updateOrder(array('id' => $data['uid']), $up); } } } } /** * 2019-11-12 小程序购买商品升级Plus会员 * 'store_id' => $billOrder[$BillModel::STORE_ID], * 'merchant_id' => $billOrder[$BillModel::MERCHANT_ID], * 'bill_id' => $billOrder[$BillModel::ID], * 'uid' => $billOrder[$BillModel::UID], * 'all_money' => $billOrder[$BillModel::ALL_MONEY], * @param array $item */ public function vipModify_v1($item = array()) { //file_put_contents('./xcxNotify.txt', 'vipModify->item: ' . json_encode($item) . "\r\n", FILE_APPEND); $store_id = $item['store_id']; $merchant_id = $item['merchant_id']; $bill_id = $item['bill_id']; $uid = $item['uid']; $all_money = $item['all_money']; $time = time(); $PlusRecordModel = D('RetailPlusRecord'); $rMap = array( $PlusRecordModel::BILL_ID => $bill_id, $PlusRecordModel::PAY_STATE => 0, ); $record = $PlusRecordModel->getFind($rMap); //升级记录 if (!empty($record)) { if ($record[$PlusRecordModel::TYPE] == 5) { //购买单品 $PlusGoodsModel = D('RetailSinglePlusGoods'); $map = array( $PlusGoodsModel::STATUS => 1, $PlusGoodsModel::STORE_ID => $store_id, $PlusGoodsModel::ID => $record[$PlusRecordModel::ACTIVITY_ID], ); $activity = $PlusGoodsModel->getFind($map, array($PlusGoodsModel::GOODS_ID, $PlusGoodsModel::TIME)); $plus_goods_ids = $activity[$PlusGoodsModel::GOODS_ID]; $activity_time = $activity[$PlusGoodsModel::TIME]; //套餐时长 } else { //购买套餐 $MealGroupModel = D('RetailPlusMealGroup'); $map = array( $MealGroupModel::MERCHANT_ID => $merchant_id, $MealGroupModel::STORE_ID => $store_id, $MealGroupModel::ID => $record[$PlusRecordModel::ACTIVITY_ID], $MealGroupModel::STATUS => 1, ); $activity_time = $MealGroupModel->getFindField($map, $MealGroupModel::TIME); //套餐时长 $MealGoodsModel = D('RetailMealPlusGoods'); $map = array( $MealGoodsModel::MERCHANT_ID => $merchant_id, $MealGoodsModel::STORE_ID => $store_id, $MealGoodsModel::STATUS => 1, $MealGoodsModel::GROUP_ID => $record[$PlusRecordModel::ACTIVITY_ID] ); $plus_goods_ids = $MealGoodsModel->getFindField($map, $MealGoodsModel::GOODS_ID, true); $plus_goods_ids = implode(',', $plus_goods_ids); } $PlusVipModel = D('RetailPlusVip'); $plusItem = array( $PlusVipModel::XCX_VIP_ID => $uid, $PlusVipModel::MERCHANT_ID => $merchant_id, $PlusVipModel::STORE_ID => $store_id, $PlusVipModel::ADD_TIME => $time, $PlusVipModel::START_TIME => $time, $PlusVipModel::END_TIME => $time + $activity_time * 86400, $PlusVipModel::STATE => 1, ); $plus_vip_add = $PlusVipModel->addOrder($plusItem); //插入plus会员记录 //file_put_contents('./xcxNotify.txt', 'plus_vip_add->sql: ' . M()->_sql() . "\r\n", FILE_APPEND); if ($plus_vip_add) { //添加会员 $plus_phone = $record[$PlusRecordModel::PLUS_PHONE]; $plus_name = $record[$PlusRecordModel::PLUS_NAME]; $password = substr($plus_phone, -6); $VipModel = D('RetailVip'); $item = array( $VipModel::MOBILE_PHONE => $plus_phone, $VipModel::NAME => $plus_name, $VipModel::MERCHANT_ID => $merchant_id, $VipModel::STORE_ID => $store_id, $VipModel::ADD_TIME => $time, $VipModel::PASSWORD => createPassword($password, $time), $VipModel::PLUS_ID => $plus_vip_add, $VipModel::PLUS_TYPE => 2, $VipModel::PLUS_STATE => 1, ); $add_vip = $VipModel->addOrder($item); //添加会员 //PLUS购买记录更新 $recordUp = array( $PlusRecordModel::GOODS_IDS => $plus_goods_ids, $PlusRecordModel::PAY_STATE => 1, //更新支付状态 $PlusRecordModel::MONEY => $all_money, $PlusRecordModel::TIME => $activity_time, $PlusRecordModel::VIP_ID => $add_vip, ); $PlusRecordModel->updateOrder($rMap, $recordUp); //更新plus会员的会员id $PlusVipModel->updateOrder(array($PlusVipModel::ID => $plus_vip_add), array($PlusVipModel::VIP_ID => $add_vip)); $SmallProgramUserModel = D('RetailSmallProgramUser'); $sSave = array( $SmallProgramUserModel::PLUS_VIP_ID => $plus_vip_add, $SmallProgramUserModel::USER_TYPE => 2, $SmallProgramUserModel::VID => $add_vip, ); $SmallProgramUserModel->updateOrder(array($SmallProgramUserModel::ID => $uid), $sSave); //更新小程序用户类型 } } } /** * 计算总付款金额,拆单 2019-12-19 * @param array $item * @return mixed * $item['bill_order'] bill表 id、all_money、pay_money、order_id、merchant_id、store_id * $item['vid'] 会员id * $item['coupon_id'] 优惠券id * $item['discount'] 收银员手动打折折扣值 * $item['small_changes_money'] 抹零金额 * $item['guide_id'] 导购员id * $item['cashier_preferential_state'] 收银员打折权限 * $item['store_preferential_state'] 门店打折权限 * $item['guide_open_state'] 门店是否开启导购员分佣 */ public function calculationOrder_v1($item = array()) { $BillModel = D('RetailBillOrder'); $discount = 1; //收银员手动折扣 $v_discount = 1; //会员等级折扣 $vid = 0; //会员id $coupon = array(); //优惠券 $small_changes_money = 0; //抹零金额 $lessMoney = 0; //存储最终支付的金额 $use_integral = 0; //会员消费该扣除的积分 $vipLessMoney = 0; //会员价减少的金额 $vipDisMoney = 0; //会员折扣的金额 if (!empty($item['discount'])) { if (!verifyNumber($item['discount'], 3, 0.001, 1)) { $res['status'] = 0; $res['msg'] = '折扣值取值有误'; return $res; } if ($item['discount'] < 1) { if ($item['cashier_preferential_state'] != 1) { $res['status'] = 0; $res['msg'] = '您没有打折的权限'; return $res; } } $discount = $item['discount']; } $merchant_id = $item['bill_order'][$BillModel::MERCHANT_ID]; //查找会员 if (!empty($item['vid'])) { $VipModel = D('RetailVip'); $map = array( $VipModel::MERCHANT_ID => $merchant_id, $VipModel::STATUS => 1, $VipModel::ID => $item['vid'] ); $fields = array( $VipModel::ID, $VipModel::GRADE_INTEGRAL, $VipModel::INTEGRAL, $VipModel::PLUS_TYPE ); $vip = $VipModel->getFind($map, $fields); if (empty($vip)) { $res['status'] = 0; $res['msg'] = '会员信息有误'; return $res; } $vid = $item['vid']; //查找会员等级 if ($item['store_preferential_state'] == 1 || ($discount == 1 && $item['store_preferential_state'] != 1)) { //门店开启折上折 $VipIntegralModel = D('RetailVipIntegral'); $map = array( $VipIntegralModel::MERCHANT_ID => $merchant_id, $VipIntegralModel::DISCOUNT => array('gt', 0) ); if ($vip[$VipModel::PLUS_TYPE] == 2) { //plus会员 $grade = $VipIntegralModel->getOrderFind($map, '*', $VipIntegralModel::DISCOUNT . ' asc'); } else { //常规会员 $map[$VipIntegralModel::MIN_INTEGRAL] = array('ELT', $vip[$VipModel::GRADE_INTEGRAL]); $grade = $VipIntegralModel->getOrderFind($map, '*', $VipIntegralModel::MIN_INTEGRAL . ' desc'); } if (!empty($grade)) { $v_discount = $grade[$VipIntegralModel::DISCOUNT]; } if (!verifyNumber($v_discount, 3, 0.001, 1)) { $res['status'] = 0; $res['msg'] = '会员等级折扣值有误'; return $res; } } //判断优惠券 if (!empty($item['coupon_id'])) { if (empty($vip)) { $res['status'] = 0; $res['msg'] = '非会员请勿使用优惠券'; return $res; } $time = time(); $VipMCouponModel = D('RetailVipMCoupon'); $map = array( 'v.' . $VipMCouponModel::IS_USE => 1, 'v.' . $VipMCouponModel::VID => $vid, 'v.' . $VipMCouponModel::START_TIME => array("LT", $time), 'v.' . $VipMCouponModel::END_TIME => array("GT", $time), 'v.' . $VipMCouponModel::MERCHANT_ID => $merchant_id, 'v.' . $VipMCouponModel::ID => $item['coupon_id'], ); $fields = array( 'v.' . $VipMCouponModel::ID, 'v.' . $VipMCouponModel::NEED_MONEY, 'v.' . $VipMCouponModel::REDUCE_MONEY, 'v.' . $VipMCouponModel::ID, ); $couponRes = $VipMCouponModel->getFindUseCoupon($map, $item['bill_order'][$BillModel::STORE_ID], $fields); if ($couponRes['status'] == 1) { $coupon = $couponRes['coupon']; } else { return $couponRes; } } } //判断抹零 if (!empty($item['small_changes_money'])) { if (!verifyPrice($item['small_changes_money'])) { $res['status'] = 0; $res['msg'] = '抹零金额有误'; return $res; } $small_changes_money = $item['small_changes_money']; } $SellModel = D('RetailSell'); $map = array( 's.' . $SellModel::BILL_ID => $item['bill_order'][$BillModel::ID] ); $GoodsModel = D('RetailGoods'); $fields = array( 's.*', 's.' . $SellModel::ORIGINAL_PRICE . ' as before_price', 'g.' . $GoodsModel::STORE_MEM_STATUS, 'g.' . $GoodsModel::STORE_MEM_PRICE, 'g.' . $GoodsModel::VIP_RETAIL_STATE, 'g.' . $GoodsModel::PLUS_PRICE, 'g.' . $GoodsModel::PLUS_MEM_STATUS, 'g.' . $GoodsModel::GUIDE_ROYALTY_STATE, 'g.' . $GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE, 'g.' . $GoodsModel::GUIDE_ROYALTY_PRICE, 'g.' . $GoodsModel::ATTRIBUTE_STATE, ); //获取sell详情 $sellOrder = $SellModel->getSelectAndGoods($map, $fields, 's.' . $SellModel::ORIGINAL_PRICE . ' asc'); if (empty($sellOrder)) { $res['status'] = 0; $res['msg'] = '订单信息异常'; return $res; } //会员打折或者把价格改为会员价 $SkuModel = D('RetailSkuGoods'); foreach ($sellOrder as &$val) { $before_money = round($val[$SellModel::ORIGINAL_PRICE] * $val[$SellModel::NUM], 2); $price = $val[$SellModel::ORIGINAL_PRICE]; //原价 if (!empty($val[$SellModel::SKU_JSON_INFO])) { //存在商品规格 $sku = json_decode($val[$SellModel::SKU_JSON_INFO], true); if ($val[$GoodsModel::PLUS_MEM_STATUS] == 1) { //开启plus会员价 $val[$GoodsModel::PLUS_PRICE] = $sku[$SkuModel::PLUS_PRICE]; } if ($val[$GoodsModel::STORE_MEM_STATUS] == 1) { //开启普通会员价 $val[$GoodsModel::STORE_MEM_PRICE] = $sku[$SkuModel::STORE_MEM_PRICE]; } $val[$GoodsModel::GUIDE_ROYALTY_PRICE] = $sku[$SkuModel::GUIDE_ROYALTY_PRICE]; } if (!empty($vip) && $val[$GoodsModel::PLUS_MEM_STATUS] == 1 && round($val[$GoodsModel::PLUS_PRICE], 2) > 0 && $vip[$VipModel::PLUS_TYPE] == 2) { //开启plus会员价 //开启plus会员价并且价格设置正确并且用户是plus会员 $val[$SellModel::PLUS_VIP_PRICE] = $val[$GoodsModel::PLUS_PRICE]; //记录plus会员价 $price = $val[$SellModel::PLUS_VIP_PRICE]; } else if (!empty($vip) && $val[$GoodsModel::STORE_MEM_STATUS] == 1 && round($val[$GoodsModel::STORE_MEM_PRICE], 2) > 0) { //开启会员价并且价格设置正确 $val[$SellModel::VIP_PRICE] = $val[$GoodsModel::STORE_MEM_PRICE]; //记录会员价 $price = $val[$SellModel::VIP_PRICE]; } else { $val[$SellModel::PLUS_VIP_PRICE] = 0; $val[$SellModel::VIP_PRICE] = 0; } $center_money = round($price * $val[$SellModel::NUM], 2); //计算会员价优惠之后的价格 $val[$SellModel::VIP_LESS_MONEY] = round($before_money - $center_money, 2); //存储会员优惠价 $val[$SellModel::PRICE] = $price; if (!empty($item['vid']) && $v_discount < 1 && $val[$GoodsModel::VIP_RETAIL_STATE] == 1) { //有会员信息 + 有折扣 + 该商品允许vip线下会员打折 if (($vip[$VipModel::PLUS_TYPE] == 2 && $val[$GoodsModel::PLUS_MEM_STATUS] == 2) || ($vip[$VipModel::PLUS_TYPE] == 3)) { //开启会员打折 $price = round($price * $v_discount, 2); //计算打折之后的价格 $price = $price > 0.01 ? $price : 0.01; //打折之后单价最低为0.01元 $val[$SellModel::VIP_DISCOUNT] = $v_discount; //存储折扣值 } } $val[$SellModel::VID] = $vid; //存储会员id $money = round($price * $val[$SellModel::NUM], 2); //计算打折后总价 $val[$SellModel::VIP_DIS_MONEY] = round($center_money - $money, 2); //计算会员打折优惠的价格 $val[$SellModel::ALL_MONEY] = $money; $val[$SellModel::GET_INTEGRAL] = 0; $val[$SellModel::CASHIER_DIS_MONEY] = 0; $val[$SellModel::COUPON_MONEY] = 0; $val[$SellModel::INTEGRAL_DIS_MONEY] = 0; $val[$SellModel::SMALL_CHANGES_MONEY] = 0; $lessMoney += $val[$SellModel::ALL_MONEY]; //订单总价累加 $vipDisMoney += $val[$SellModel::VIP_DIS_MONEY]; //总打折优惠累加 $vipLessMoney += $val[$SellModel::VIP_LESS_MONEY]; //总打折优惠累加 } $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); //①减优惠券 if (!empty($coupon)) { if ($lessMoney < round($coupon[$VipMCouponModel::NEED_MONEY], 2)) { $res['status'] = 0; $res['msg'] = '当前订单未达到该优惠券门槛'; return $res; } $sellOrder = reduceOrderMoney($sellOrder, floatval($coupon[$VipMCouponModel::REDUCE_MONEY]), $lessMoney, $SellModel::COUPON_MONEY); $lessMoney = round($lessMoney - $coupon[$VipMCouponModel::REDUCE_MONEY], 2); //整单减掉优惠券后剩余金额 //按照单价重新排序 $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); } //②积分抵扣 $integralDisMoney = 0; if (!empty($vip) && $item['integral_cashing'] == 1 && $vip[$VipModel::INTEGRAL] > 0) { $ConfigModel = D('RetailMerchantConfig'); $Config = $ConfigModel->getFind(array($ConfigModel::MERCHANT_ID => $merchant_id)); if ($Config[$ConfigModel::INTEGRAL_ARRIVE_CASH] == 1 && $Config[$ConfigModel::INTEGRAL_ARRIVE_CASH_RATE] > 0 && $Config[$ConfigModel::INTEGRAL_ARRIVE_CASH_DATA] > 0 && $Config['marketing_methods'] == 1) { //执行积分抵扣 $integral_money_rate = round($Config['integral_arrive_cash_data'] / $Config['integral_arrive_cash_price']); //要乘以100 $integralDisMoney = round($lessMoney * $Config['integral_arrive_cash_rate'], 2); $needIntegral = round(($integralDisMoney / $Config['integral_arrive_cash_price']) * $Config['integral_arrive_cash_data']); //获取所需积分 if ($vip[$VipModel::INTEGRAL] >= $needIntegral) { $use_integral = $needIntegral; } else { $use_integral = $vip[$VipModel::INTEGRAL]; $integralDisMoney = round($use_integral / $Config['integral_arrive_cash_data'] * $Config['integral_arrive_cash_price'], 2); } $sellOrder = reduceOrderMoney($sellOrder, $integralDisMoney, $lessMoney, $SellModel::INTEGRAL_DIS_MONEY, $use_integral, $integral_money_rate); $lessMoney = round($lessMoney - $integralDisMoney, 2); $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); } } //③收银员打折 $cashierDiscountMoney = 0; if ($discount < 1) { $nowMoney = round($lessMoney * $discount, 2); $cashierDiscountMoney = round($lessMoney - $nowMoney, 2); $sellOrder = reduceOrderMoney($sellOrder, $cashierDiscountMoney, $lessMoney, $SellModel::CASHIER_DIS_MONEY); $lessMoney = round($lessMoney - $cashierDiscountMoney, 2); //整单减掉优惠券后剩余金额 $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); } //④抹零 if ($small_changes_money > 0) { $sellOrder = reduceOrderMoney($sellOrder, $small_changes_money, $lessMoney, $SellModel::SMALL_CHANGES_MONEY); $lessMoney = round($lessMoney - $small_changes_money, 2); //整单减掉优惠券后剩余金额 } //修改sell表 if (round($lessMoney - $item['allMoney'], 2) != 0) { $res['status'] = 0; $res['msg'] = '前后台计算价格不一致,请检查 ' . $lessMoney . ' ' . $item['allMoney']; return $res; } $GuideModel = D('RetailGuide'); if (!empty($item['guide_id'])) { $guide_commission = $GuideModel->getFindField(array($GuideModel::ID => $item['guide_id']), $GuideModel::COMMISSION); //导购员佣金比例 $guide_state = $item['guide_open_state']; //门店是否开启导购员分佣 } foreach ($sellOrder as $valueEnd) { $temp = $valueEnd; //更新该商品的导购员提成 if ($valueEnd[$GoodsModel::GUIDE_ROYALTY_STATE] == 1 && $guide_state == 1) { if ($valueEnd[$GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE] == 1) { $guide_royalty = $valueEnd[$GoodsModel::GUIDE_ROYALTY_PRICE] * $valueEnd[$SellModel::NUM]; } else { if (!empty($guide_commission)) { $guide_royalty = $valueEnd[$SellModel::ALL_MONEY] * $guide_commission / 100; } } if (!empty($guide_royalty)) { $temp[$SellModel::GUIDE_ROYALTY] = round($guide_royalty, 2); } } unset($temp[$GoodsModel::STORE_MEM_STATUS]); unset($temp[$GoodsModel::STORE_MEM_PRICE]); unset($temp[$GoodsModel::PLUS_MEM_STATUS]); unset($temp[$GoodsModel::PLUS_PRICE]); unset($temp[$GoodsModel::VIP_RETAIL_STATE]); unset($temp[$SellModel::ID]); unset($temp[$GoodsModel::GUIDE_ROYALTY_STATE]); unset($temp[$GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE]); unset($temp[$GoodsModel::GUIDE_ROYALTY_PRICE]); unset($temp['before_price']); if (!empty($valueEnd[$SellModel::ID])) { $up = $SellModel->updateOrder(array($SellModel::ID => $valueEnd[$SellModel::ID]), $temp); } else { $up = $SellModel->addOrder($temp); } if ($up) { } else if ($valueEnd['before_price'] != $valueEnd[$SellModel::ORIGINAL_PRICE]) { $res['status'] = 0; $res['msg'] = '订单更新失败'; return $res; } } $newBill = $item['bill_order']; $newBill[$BillModel::ALL_MONEY] = $lessMoney; $newBill[$BillModel::VID] = $vid ? $vid : 0; $newBill[$BillModel::GUIDE_ID] = $item['guide_id'] ? $item['guide_id'] : 0; $BillDisModel = D('RetailBillDiscount'); $dMap = array( $BillDisModel::BILL_ID => $item['bill_order'][$BillModel::ID], ); $billDis = array( $BillDisModel::USE_INTEGRAL => $use_integral, $BillDisModel::VIP_DIS_MONEY => $vipDisMoney, $BillDisModel::VIP_LESS_MONEY => $vipLessMoney, $BillDisModel::COUPON_ID => $item['coupon_id'] ? $item['coupon_id'] : 0, $BillDisModel::COUPON_TYPE => $item['coupon_id'] ? 2 : 0, $BillDisModel::SMALL_CHANGES_MONEY => $small_changes_money, $BillDisModel::COUPON_MONEY => $coupon ? $coupon[$VipMCouponModel::REDUCE_MONEY] : 0, $BillDisModel::DISCOUNT => $discount, $BillDisModel::CASHIER_DIS_MONEY => $cashierDiscountMoney, $BillDisModel::INTEGRAL_DIS_MONEY => $integralDisMoney ); $BillDisModel->updateOrder($dMap, $billDis); $res['status'] = 1; $res['order'] = $newBill; return $res; } /** * 计算总付款金额,积分抵现 商家券2020-8-18 商家券 2020 -8-24 * @param array $item * @return mixed * $item['bill_order'] bill表 id、all_money、pay_money、order_id、merchant_id、store_id * $item['vid'] 会员id * $item['coupon_id'] 优惠券id * $item['coupon_type'] 2商户优惠券 3商家券 * $item['discount'] 收银员手动打折折扣值 * $item['small_changes_money'] 抹零金额 * $item['guide_id'] 导购员id * $item['cashier_preferential_state'] 收银员打折权限 * $item['cashier_manual_discount_state'] 收银员-单品折扣权限 * $item['store_preferential_state'] 门店打折权限 * $item['store_manual_discount_state'] 单品打折权限-折上折 * $item['manual_min_discount_state'] 单品打折权限-手动折扣最低折扣 * $item['manual_max_amount_state'] 单品打折权限-折扣最多优惠金额 * $item['guide_open_state'] 门店是否开启导购员分佣 * $item['code_price_state'] 使用条码秤打印的条码价权限 0关闭 1开启 */ public function calculationOrder_v2($item = array()) { // var_dump($item); $BillModel = D('RetailBillOrder'); $MerchantConfigModel = new RetailMerchantConfigModel(); $discount = 1; //收银员手动折扣 $v_discount = 1; //会员等级折扣 $vid = 0; //会员id $coupon = array(); //优惠券 $small_changes_money = 0; //抹零金额 $lessMoney = 0; //存储最终支付的金额 $use_integral = $item['integral_dis_num'] ? $item['integral_dis_num'] : 0; //会员消费该扣除的积分;//会员消费该扣除的积分 $vipLessMoney = 0; //会员价减少的金额 $vipDisMoney = 0; //会员折扣的金额 $manualDisMoney = 0; //收银员手动单品打折优惠金额 $code_price_state = $item['code_price_state'] ? $item['code_price_state'] : 0; if (!empty($item['coupon_id'])) { $item['coupon_type'] = $item['coupon_type'] ? $item['coupon_type'] : 2; //默认是商户优惠券 } if (!empty($item['discount'])) { if (!verifyNumber($item['discount'], 3, 0.001, 1)) { $res['status'] = 0; $res['msg'] = '折扣值取值有误'; return $res; } if ($item['discount'] < 1) { if ($item['cashier_preferential_state'] != 1) { $res['status'] = 0; $res['msg'] = '您没有打折的权限'; return $res; } } $discount = $item['discount']; } // var_dump($discount); //特殊周的特殊折扣 // $WeekDiscount = new WeekDiscountModel(); // $DiscountData = $WeekDiscount->getData(); // $week = date("w"); // if($week == $DiscountData['week']){ // $discount = $DiscountData['discount']; // } $merchant_id = $item['bill_order'][$BillModel::MERCHANT_ID]; //查找会员 if (!empty($item['vid'])) { $VipModel = D('RetailVip'); $map = array( $VipModel::MERCHANT_ID => $merchant_id, $VipModel::STATUS => 1, $VipModel::ID => $item['vid'] ); $fields = array( $VipModel::ID, $VipModel::GRADE_INTEGRAL, $VipModel::INTEGRAL, $VipModel::PLUS_TYPE ); $vip = $VipModel->getFind($map, $fields); if (empty($vip)) { $res['status'] = 0; $res['msg'] = '会员信息有误'; return $res; } $vid = $item['vid']; //查找会员等级 if ($item['store_preferential_state'] == 1 || ($discount == 1 && $item['store_preferential_state'] != 1)) { //门店开启折上折 $VipIntegralModel = D('RetailVipIntegral'); $map = array( $VipIntegralModel::MERCHANT_ID => $merchant_id, $VipIntegralModel::DISCOUNT => array('gt', 0) ); if ($vip[$VipModel::PLUS_TYPE] == 2) { //plus会员 $grade = $VipIntegralModel->getOrderFind($map, '*', $VipIntegralModel::DISCOUNT . ' asc'); } else { //常规会员 $map[$VipIntegralModel::MIN_INTEGRAL] = array('ELT', $vip[$VipModel::GRADE_INTEGRAL]); $grade = $VipIntegralModel->getOrderFind($map, '*', $VipIntegralModel::MIN_INTEGRAL . ' desc'); } // var_dump($v_discount); // var_dump($grade); if (!empty($grade)) { //特殊周的特殊折扣 $WeekDiscount = new WeekDiscountModel(); $DiscountData = $WeekDiscount->getData(); $week = date("w"); if($week == $DiscountData['week']){ $v_discount = $DiscountData['discount']; }else{ $v_discount = $grade[$VipIntegralModel::DISCOUNT]; } } if (!verifyNumber($v_discount, 3, 0.001, 1)) { $res['status'] = 0; $res['msg'] = '会员等级折扣值有误'; return $res; } } } //判断抹零 if (!empty($item['small_changes_money'])) { if (!verifyPrice($item['small_changes_money'])) { $res['status'] = 0; $res['msg'] = '抹零金额有误'; return $res; } $small_changes_money = $item['small_changes_money']; } $SellModel = D('RetailSell'); $map = array( 's.' . $SellModel::BILL_ID => $item['bill_order'][$BillModel::ID] ); $GoodsModel = D('RetailGoods'); $fields = array( 's.*', 's.' . $SellModel::ORIGINAL_PRICE . ' as before_price', 's.' . $SellModel::CASHIER_MANUAL_DIS, 'g.' . $GoodsModel::STORE_MEM_STATUS, 'g.' . $GoodsModel::STORE_MEM_PRICE, 'g.' . $GoodsModel::VIP_RETAIL_STATE, 'g.' . $GoodsModel::PLUS_PRICE, 'g.' . $GoodsModel::PLUS_MEM_STATUS, 'g.' . $GoodsModel::GUIDE_ROYALTY_STATE, 'g.' . $GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE, 'g.' . $GoodsModel::GUIDE_ROYALTY_PRICE, 'g.' . $GoodsModel::ATTRIBUTE_STATE, 'g.store_mem_integral', 'g.plus_mem_integral', 'g.goods_class_id', ); //获取sell详情 $sellOrder = $SellModel->getSelectAndGoods($map, $fields, 's.' . $SellModel::ORIGINAL_PRICE . ' asc'); if (empty($sellOrder)) { $res['status'] = 0; $res['msg'] = '订单信息异常'; return $res; } //会员打折或者把价格改为会员价-- 手动打折 $SkuModel = D('RetailSkuGoods'); $Config = $MerchantConfigModel->getFind(array('merchant_id' => $merchant_id)); foreach ($sellOrder as &$val) { if ($val['goods_gifts_id']) { $money = 0; } else { // var_dump($val); // var_dump($GoodsModel::VIP_RETAIL_STATE); // var_dump($v_discount); $v_dis = $val[$GoodsModel::VIP_RETAIL_STATE] == 1 ? $v_discount : 1; //初始商品会员折扣 if ($val['cashier_manual_discount'] < 1) { if ($item['cashier_manual_discount_state'] != 1) { $res['status'] = 0; $res['msg'] = '您没有单品打折的权限'; return $res; } if ($item['manual_min_discount_state'] > $val['cashier_manual_discount']) { $res['status'] = 0; $res['msg'] = '商品-' . $val['goods_name'] . '-单品打折超过了最低折扣'; return $res; } } //条码秤价格 if ($code_price_state == 1 && $val['code_price_state'] == 1) { $before_money = $val['all_money']; } else { $before_money = round($val[$SellModel::ORIGINAL_PRICE] * $val[$SellModel::NUM], 2); //计算原价的总价 } $price = $val[$SellModel::ORIGINAL_PRICE]; //原价 if (!empty($val[$SellModel::SKU_JSON_INFO])) { //存在商品规格 $sku = json_decode($val[$SellModel::SKU_JSON_INFO], true); if ($val[$GoodsModel::PLUS_MEM_STATUS] == 1) { //开启plus会员价 $val[$GoodsModel::PLUS_PRICE] = $sku[$SkuModel::PLUS_PRICE]; //plus会员价赋值 $val[$GoodsModel::PLUS_MEM_INTEGRAL] = $sku[$SkuModel::PLUS_MEM_INTEGRAL]; //plus会员价赋值 } if ($val[$GoodsModel::STORE_MEM_STATUS] == 1) { //开启普通会员价 $val[$GoodsModel::STORE_MEM_PRICE] = $sku[$SkuModel::STORE_MEM_PRICE]; //常规会员价赋值 $val[$GoodsModel::STORE_MEM_INTEGRAL] = $sku[$SkuModel::STORE_MEM_INTEGRAL]; //常规会员价赋值 } $val[$GoodsModel::GUIDE_ROYALTY_PRICE] = $sku[$SkuModel::GUIDE_ROYALTY_PRICE]; //导购员佣金赋值 } if (!empty($vip) && $vip['plus_type'] == 2 && $val['plus_mem_status'] == 1) { //plus会员 if ($item['integral_cashing'] != 1 && $Config['integral_arrive_cash'] == 1 && $Config['marketing_methods'] == 2 && $val['plus_mem_integral'] > 0) { //积分基于商品且设置了积分并且放弃使用积分,使用原价购买 $val[$SellModel::PLUS_VIP_PRICE] = 0; $val[$SellModel::VIP_PRICE] = 0; } else { $val[$SellModel::PLUS_VIP_PRICE] = $val[$GoodsModel::PLUS_PRICE]; //记录plus会员价 $price = $val[$SellModel::PLUS_VIP_PRICE]; //非扫码价格 if (!($code_price_state == 1 && $val['code_price_state'] == 1)) { $v_dis = 1; //plus会员价不享受会员折扣 } } } else if (!empty($vip) && $val['store_mem_status'] == 1) { //常规会员 if ($item['integral_cashing'] != 1 && $Config['integral_arrive_cash'] == 1 && $Config['marketing_methods'] == 2 && $val['store_mem_integral'] > 0) { //积分基于商品且设置了积分并且放弃使用积分兑换 $val[$SellModel::PLUS_VIP_PRICE] = 0; $val[$SellModel::VIP_PRICE] = 0; } else { $val[$SellModel::VIP_PRICE] = $val[$GoodsModel::STORE_MEM_PRICE]; //记录会员价 $price = $val[$SellModel::VIP_PRICE]; } } else { $val[$SellModel::PLUS_VIP_PRICE] = 0; $val[$SellModel::VIP_PRICE] = 0; } //条码秤价格 if ($code_price_state == 1 && $val['code_price_state'] == 1) { $center_money = $val['all_money']; $val[$SellModel::VIP_LESS_MONEY] = 0; } else { $center_money = round($price * $val[$SellModel::NUM], 2); //计算会员价优惠之后的价格 $val[$SellModel::VIP_LESS_MONEY] = round($before_money - $center_money, 2); //存储会员优惠价 } if ($code_price_state == 1 && $val['code_price_state'] == 1) { $val[$SellModel::PRICE] = $val[$SellModel::ORIGINAL_PRICE]; } else { $val[$SellModel::PRICE] = $price; //存储购买原价格 } $cashier_manual_discount = $val['cashier_manual_discount']; //收银员单品折扣 if ($item['store_manual_discount_state'] != 1 && $cashier_manual_discount < 1 && $cashier_manual_discount > 0) { //未开启单品折上折并且进行了单品折扣 $v_dis = 1; //关闭会员打折 } if ($item['store_preferential_state'] != 1 && $discount < 1) { // 未开启整单折上折,且进行了整单打折 $cashier_manual_discount = 1; //关闭单品打折 $v_dis = 1; //关闭会员打折 } // var_dump($val); if (!empty($item['vid']) && $v_dis < 1 && $val[$GoodsModel::VIP_RETAIL_STATE] == 1) { //有会员信息 + 有折扣 + 该商品允许vip线下会员打折 //条码秤价格开启 if ($code_price_state == 1 && $val['code_price_state'] == 1) { $val['all_money'] = round($val['all_money'] * $v_dis, 2); $val['all_money'] = $val['all_money'] ? $val['all_money'] : 0.01; } else if (($vip[$VipModel::PLUS_TYPE] == 2 && $val[$GoodsModel::PLUS_MEM_STATUS] == 2) || ($vip[$VipModel::PLUS_TYPE] == 3)) { //开启会员打折 $price = round($price * $v_dis, 2); //计算打折之后的价格 $price = $price > 0.01 ? $price : 0.01; //打折之后单价最低为0.01元 } } $val[$SellModel::VID] = $vid; //存储会员id if ($code_price_state == 1 && $val['code_price_state'] == 1) { $vip_manual_money = $val['all_money']; $money = round($vip_manual_money * $cashier_manual_discount, 2); //总的单品打折优惠价格 if ($cashier_manual_discount < 1 && round($vip_manual_money - $money - $item['manual_max_amount_state'], 2) > 0 && $item['manual_max_amount_state'] > 0) { $res['status'] = 0; $res['msg'] = '折扣值过低,优惠金额过大!'; return $res; } } else { $vip_manual_money = round($price * $val[$SellModel::NUM], 2); //单品打折前的总价、会员折扣后总价 $manual_price = round($price * $cashier_manual_discount, 2); //单品打折后单价 if ($cashier_manual_discount < 1 && round($price - $manual_price - $item['manual_max_amount_state'], 2) > 0 && $item['manual_max_amount_state'] > 0) { $res['status'] = 0; $res['msg'] = '折扣值过低,优惠金额过大!'; return $res; } $manual_price = $manual_price > 0.01 ? $manual_price : 0.01; $money = round($manual_price * $val[$SellModel::NUM], 2); //计算单品打折后总价 } $val[$SellModel::VIP_DIS_MONEY] = round($center_money - $vip_manual_money, 2); //会员折扣优惠价格 $val[$SellModel::CASHIER_MANUAL_DIS_MONEY] = round($vip_manual_money - $money, 2); //计算收银员单品打折总优惠 $val[$SellModel::CASHIER_MANUAL_DIS] = $cashier_manual_discount; // 存储折扣值 $val[$SellModel::GET_INTEGRAL] = 0; $val[$SellModel::CASHIER_DIS_MONEY] = 0; $val[$SellModel::COUPON_MONEY] = 0; $val[$SellModel::INTEGRAL_DIS_MONEY] = 0; $val[$SellModel::SMALL_CHANGES_MONEY] = 0; $val[$SellModel::VIP_DISCOUNT] = $v_dis; //存储折扣值 } $val[$SellModel::ALL_MONEY] = $money; $lessMoney += $val[$SellModel::ALL_MONEY]; //订单总价累加 $vipDisMoney += $val[$SellModel::VIP_DIS_MONEY]; //总打折优惠累加 $vipLessMoney += $val[$SellModel::VIP_LESS_MONEY]; //总打折优惠累加 $manualDisMoney += $val[$SellModel::CASHIER_MANUAL_DIS_MONEY]; //收银员手动单品打折优惠金额 } $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); //①减优惠券 if (!empty($item['coupon_id']) && C('IS_SET_REDIS')) { $coupon_redis_key = 'retail_coupon_store_id_*_uid_*_coupon_type_' . $item['coupon_type'] . '_coupon_id_' . $item['coupon_id']; $ApiRedis = new \Addons\Api\RedisController(); $user_shop_coupon = $ApiRedis::$redis->mget($ApiRedis::$redis->keys($coupon_redis_key)); if (!empty($user_shop_coupon)) { $res['status'] = 0; $res['msg'] = '该优惠券正在使用中,请勿重复使用'; return $res; } } switch ($item['coupon_type']) { case 2: //会员优惠券 if (!empty($item['coupon_id'])) { if (empty($vip) && $item['coupon_type'] == 2) { $res['status'] = 0; $res['msg'] = '非会员请勿使用优惠券'; return $res; } //会员优惠券 $CouponUseClass = new CouponUse(); $couponResult = $CouponUseClass->PlaceOrderCoupon([ 'merchant_id' => $merchant_id, 'store_id' => $item['bill_order']['store_id'], 'vip_id' => $vid, 'coupon_id' => $item['coupon_id'], 'order_money' => $lessMoney, 'sellDataArray' => $sellOrder ]); if ($couponResult['status'] != 1) { $couponResult['msg'] = $couponResult['message']; return $couponResult; } $coupon = $couponResult['data']['coupon']; //优惠券信息 $discount_amount = $coupon['discount_amount']; //优惠金额 $goods_type = $coupon['appoint_type']; //1所有商品 2指定商品 3指定分类 $shop_coupon_goods = $couponResult['data']['activity_goods']; //参与优惠的商品信息 $goods_money = $couponResult['data']['activity_goods_money']; //参与优惠的商品总金额 } break; case 3: //商家券 $ShopCouponClass = new ShopCoupon(); $result = $ShopCouponClass->cashPlaceOrder([ 'coupon_id' => $item['coupon_id'], 'allMoney' => $lessMoney, 'store_id' => $item['bill_order']['store_id'], 'sellDataArray' => $sellOrder ]); if ($result['status'] != 1) { $result['msg'] = $result['message']; return $result; } $coupon = $result['data']['shop_coupon']; $discount_amount = $result['data']['discount_amount']; //优惠金额 $goods_money = $result['data']['goods_money']; //参与优惠的商品总金额 $shop_coupon_goods = $result['data']['goods']; //参与优惠的商品信息 $goods_type = $coupon['goods_type']; //1所有商品 2指定商品 break; } if (!empty($coupon)) { if (($item['coupon_type'] == 3 || $item['coupon_type'] == 2) && ($goods_type == 2 || $goods_type == 3) && count($shop_coupon_goods) != count($sellOrder)) { //优惠券指定商品或分类 $shop_coupon_goods = ascSortByFields($shop_coupon_goods, 'price'); $CouponClass = new CouponUse(); $sellDataArray_new = reduceOrderMoney($shop_coupon_goods, floatval($discount_amount), $goods_money, $SellModel::COUPON_MONEY); $sellOrder = $CouponClass->sellDataArrayReplace([ 'sellDataArray' => $sellOrder, 'sellDataArray_new' => $sellDataArray_new ]); } else { $sellOrder = reduceOrderMoney($sellOrder, $discount_amount, $lessMoney, $SellModel::COUPON_MONEY); } $lessMoney = round($lessMoney - $discount_amount, 2); //整单减掉优惠券后剩余金额 $lessMoney = $lessMoney >= 0.01 ? $lessMoney : 0.01; //按照单价重新排序 $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); } //②积分抵现基于订单 if ($item['integral_cashing'] == 1 && !empty($vip)) { //积分抵现 $vip['user_type'] = $vip['plus_type']; //转成公共判断身份字段 $parameter = array( 'vid' => $vid, 'merchant_id' => $merchant_id, 'all_money' => $lessMoney, 'vip_info' => $vip, 'integral_dis_money' => $item['integral_dis_money'], 'integral_dis_num' => $item['integral_dis_num'], 'sell_data_array' => $sellOrder, 'Config' => $Config, 'bill_type' => 2 ); $integral_cash_info = $MerchantConfigModel->integral_cash($parameter); if ($integral_cash_info['status'] != 1) { $this->ajaxReturn($integral_cash_info); } $vip_config = $integral_cash_info['data']['vip_config']; $sellOrder = $integral_cash_info['data']['sellDataArray']; $lessMoney = $integral_cash_info['data']['allMoney']; //抵现后的金额 $money_dis_integral = $integral_cash_info['data']['money_dis_integral']; //抵现的积分 } //③收银员打折 $cashierDiscountMoney = 0; if ($discount < 1) { // var_dump($lessMoney); $nowMoney = round($lessMoney * $discount, 2); $cashierDiscountMoney = round($lessMoney - $nowMoney, 2); $sellOrder = reduceOrderMoney($sellOrder, $cashierDiscountMoney, $lessMoney, $SellModel::CASHIER_DIS_MONEY); $lessMoney = round($lessMoney - $cashierDiscountMoney, 2); //整单减掉优惠券后剩余金额 $sellOrder = ascSortByFields($sellOrder, $SellModel::PRICE); } //④抹零 if ($small_changes_money > 0) { $sellOrder = reduceOrderMoney($sellOrder, $small_changes_money, $lessMoney, $SellModel::SMALL_CHANGES_MONEY); $lessMoney = round($lessMoney - $small_changes_money, 2); //整单减掉优惠券后剩余金额 } if (round($lessMoney - $item['allMoney'], 2) != 0) { $res['status'] = 0; $res['msg'] = '1order-前后台计算价格不一致,请检查 ' . $lessMoney . ' ' . $item['allMoney']; return $res; } $GuideModel = D('RetailGuide'); if (!empty($item['guide_id'])) { $guide_commission = $GuideModel->getFindField(array($GuideModel::ID => $item['guide_id']), $GuideModel::COMMISSION); //导购员佣金比例 $guide_state = $item['guide_open_state']; //门店是否开启导购员分佣 } foreach ($sellOrder as $valueEnd) { $temp = $valueEnd; //更新该商品的导购员提成 if ($valueEnd[$GoodsModel::GUIDE_ROYALTY_STATE] == 1 && $guide_state == 1) { if ($valueEnd[$GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE] == 1) { $guide_royalty = $valueEnd[$GoodsModel::GUIDE_ROYALTY_PRICE] * $valueEnd[$SellModel::NUM]; } else { if (!empty($guide_commission)) { $guide_royalty = $valueEnd[$SellModel::ALL_MONEY] * $guide_commission / 100; } } if (!empty($guide_royalty)) { $temp[$SellModel::GUIDE_ROYALTY] = round($guide_royalty, 2); } } unset($temp[$GoodsModel::STORE_MEM_STATUS]); unset($temp[$GoodsModel::STORE_MEM_PRICE]); unset($temp[$GoodsModel::PLUS_MEM_STATUS]); unset($temp[$GoodsModel::PLUS_PRICE]); unset($temp[$GoodsModel::VIP_RETAIL_STATE]); unset($temp[$SellModel::ID]); unset($temp[$GoodsModel::GUIDE_ROYALTY_STATE]); unset($temp[$GoodsModel::GUIDE_ROYALTY_CUSTOM_STATE]); unset($temp[$GoodsModel::GUIDE_ROYALTY_PRICE]); unset($temp['before_price']); if (!empty($valueEnd[$SellModel::ID])) { $up = $SellModel->updateOrder(array($SellModel::ID => $valueEnd[$SellModel::ID]), $temp); } else { $up = $SellModel->addOrder($temp); } if ($up) { } else if ($valueEnd['before_price'] != $valueEnd[$SellModel::ORIGINAL_PRICE]) { $res['status'] = 0; $res['msg'] = '订单更新失败'; return $res; } } $newBill = $item['bill_order']; $newBill[$BillModel::ALL_MONEY] = $lessMoney; $newBill[$BillModel::VID] = $vid ? $vid : 0; $newBill[$BillModel::GUIDE_ID] = $item['guide_id'] ? $item['guide_id'] : 0; $BillDisModel = D('RetailBillDiscount'); $dMap = array( $BillDisModel::BILL_ID => $item['bill_order'][$BillModel::ID], ); $billDis = array( $BillDisModel::USE_INTEGRAL => $use_integral, $BillDisModel::VIP_DIS_MONEY => $vipDisMoney, $BillDisModel::VIP_LESS_MONEY => $vipLessMoney, $BillDisModel::COUPON_ID => $item['coupon_id'] ? $item['coupon_id'] : 0, $BillDisModel::COUPON_TYPE => $item['coupon_type'] ? $item['coupon_type'] : 0, $BillDisModel::SMALL_CHANGES_MONEY => $small_changes_money, $BillDisModel::COUPON_MONEY => $coupon ? $discount_amount : 0, $BillDisModel::DISCOUNT => $discount, $BillDisModel::CASHIER_DIS_MONEY => $cashierDiscountMoney, $BillDisModel::INTEGRAL_DIS_MONEY => $item['integral_dis_money'], $BillDisModel::CASHIER_MANUAL_MONEY => $manualDisMoney, 'money_dis_integral' => $money_dis_integral ? $money_dis_integral : 0, 'integral_marketing' => $vip_config ? $vip_config['marketing_methods'] : 1 ); $BillDisModel->updateOrder($dMap, $billDis); $res['status'] = 1; $res['order'] = $newBill; return $res; } /** * 支付送优惠券(公共方法) * @param array $vip_info 会员信息 * @param array $money 支付金额 * @param array $merchant_id 商户id * @param array $store_id 门店id * @param array $bill_id 订单id * @param string $uid 用户uid * @return array $res */ public function paymentGiveCoupon($merchant_id, $store_id, $bill_id, $money, $uid = 0, $vip_info) { // 实例化模型 $RetailMCouponModel = new RetailMCouponModel(); $time = time(); // uid处理 if (!$uid) { $XcxUserModel = new RetailSmallProgramUserModel(); $uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id'); } $isVip = $uid ? true : false; // 查询优支付发放惠券 $map = array( 'merchantid' => $merchant_id, 'status' => 1, 'type' => 1, 'give_status' => 3, 'payment_state' => 1, 'payment_money' => array('elt', $money), 'coupon_num' => array('gt', 0), 'reducemoney' => array('gt', 0), '_string' => "(FIND_IN_SET(" . $store_id . ",storeids) OR (storeids=0)) AND ((coupontype = 1 AND starttime < {$time} AND " . 'endtime' . "> {$time}) OR (coupontype = 2) OR (coupontype = 3))" ); $coupon = $RetailMCouponModel->getSelect($map); if (!$coupon) { $res = array('status' => 0, 'msg' => '暂无发放的优惠券'); return $res; } foreach ($coupon as &$val) { // 判断等级 if ($val['coupon_gradeid'] != 0) { // plus专属优惠券 if ($val['coupon_gradeid'] == -1 || $val['coupon_gradeid'] == '-1') { // plus会员专属优惠券 if ($vip_info['plus_type'] != 2) { //不满足优惠券发放条件 continue; } } else { // 普通优惠券 if (!in_array($vip_info['grade_id'], explode(',', $val['coupon_gradeid']))) { // 普通优惠券 //不满足优惠券发放条件 continue; } } } $result = A('PayApi/Recharge')->publicGiveCoupon($vip_info['id'], $val, $merchant_id, 0, $bill_id); if ($result['status'] == 1) { // 发放成功,减库存 $dec_result = $RetailMCouponModel->toSetDec(array('id' => $val['id']), 'coupon_num', 1); unset($dec_result); if ($isVip) { $RetailMessageModel = new RetailMessageModel(); $RetailMessageModel->couponSkipAdd($uid, $val['id']); } } unset($result); } return ['status' => 1, 'msg' => '优惠券发放成功']; } }