文件
mashangyoujiu/Application/PayApi/Controller/OrderController.class.php

2765 行
140 KiB
PHP
可执行文件

<?php
namespace PayApi\Controller;
use Common\Business\Cashier;
use Common\Business\CouponUse;
use Common\Business\Plug;
use Common\Business\SerialNumberGoods;
use Common\Business\ShopCoupon;
use Common\Business\XcxUser;
use Common\Model\RetailBillDiscountModel;
use Common\Model\RetailBillOnlineModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailGoodsGiftsModel;
use Common\Model\RetailGuideIncomeModel;
use Common\Model\RetailGuideModel;
use Common\Model\RetailMCouponModel;
use Common\Model\RetailMerchantConfigModel;
use Common\Model\RetailMerchantModel;
use Common\Model\RetailMessageModel;
use Common\Model\RetailPayOrderModel;
use Common\Model\RetailRechargeOrderModel;
use Common\Model\RetailSellModel;
use Common\Model\RetailSmallProgramUserModel;
use Common\Model\RetailVipConfigModel;
use Common\Model\RetailVipModel;
use Common\Model\SSaleMGoodsModel;
use Common\Model\VipIntegralModel;
use LittleGift\Business\Order;
use Make\Business\Make;
use Think\Controller;
use Think\Hook;
use Retail\Model\WeekDiscountModel;
//[1.9.23]
/**
* 2019-7-8 支付完成修改订单
* Class OrderController
* @package PayApi\Controller
*/
class OrderController extends Controller
{
/**
* 商城普通订单、店内订单支付成功回调(废弃)
* @param $bill array|number bill_order表id或整条bill_order数据
* @return mixed
*/
public function paySuccess($bill)
{
$BillModel = D('RetailBillOrder');
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' => '订单已支付,无需重复处理');
}
// 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' => '优惠券发放成功'];
}
}