815 行
36 KiB
PHP
可执行文件
815 行
36 KiB
PHP
可执行文件
<?php
|
||
|
||
namespace PayApi\Controller;
|
||
|
||
use Common\Business\Cashier;
|
||
use Common\Model\RetailGoodsModel;
|
||
use Common\Model\RetailSellModel;
|
||
use Common\Model\RetailVipConfigModel;
|
||
use LittleGift\Business\Order;
|
||
use Think\Controller;
|
||
|
||
//[1.8.50]
|
||
|
||
/**
|
||
* 2019-7-8 支付完成修改订单
|
||
* Class OrderController
|
||
* @package PayApi\Controller
|
||
*/
|
||
class ActivityOrderController extends Controller
|
||
{
|
||
/**
|
||
* 修改bill订单(公共方法)
|
||
* @param int|array $param bill_order表id或整条bill_order数据
|
||
* @return array $res
|
||
*/
|
||
public function paySuccess($param)
|
||
{
|
||
// 获取bill_order数据
|
||
$BillModel = D('RetailBillOrder'); // bill_order表模型
|
||
if (is_array($param)) {
|
||
$bill_order = $param;
|
||
} else {
|
||
$bill_order = $BillModel->getFind(array($BillModel::ID => $param, $BillModel::TYPE => 1));
|
||
}
|
||
$supplier_type = D("RetailStore")->getFindField(array('id' => $bill_order['store_id']), "supplier_type"); //2寄售
|
||
// 判断$bill_order
|
||
if (empty($bill_order)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 获取关联的bill_online表数据
|
||
$OnlineModel = D('RetailBillOnline');
|
||
$bill_online = $OnlineModel->getFind(array($OnlineModel::BILL_ID => $bill_order[$BillModel::ID]));
|
||
// 判断$bill_online
|
||
if (empty($bill_online)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 获取关联的bill_discount表数据
|
||
$DiscountModel = D('RetailBillDiscount');
|
||
$bill_discount = $DiscountModel->getFind(array($DiscountModel::BILL_ID => $bill_order[$BillModel::ID]));
|
||
// 判断$bill_discount
|
||
if (empty($bill_discount)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 查询sell表订单(活动订单只有一条销售记录)
|
||
$SellModel = new RetailSellModel(); // sell表模型
|
||
$sell_order = $SellModel->getFind(array($SellModel::BILL_ID => $bill_order[$BillModel::ID]));
|
||
if (!$sell_order) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '销售订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 生成出库记录
|
||
switch ($bill_online[$OnlineModel::ORDER_GENRE]) {
|
||
case 2:
|
||
// 查询bill_group关联数据
|
||
$BillGroupModel = D('RetailBillGroup');
|
||
$bill_group = $BillGroupModel->getFind(array($BillGroupModel::BILL_ID => $bill_order[$BillModel::ID]));
|
||
if (empty($bill_group)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 拼团出库记录
|
||
|
||
// 剩余库存购<买数量
|
||
$add_log = $this->groupQuantityLogs($bill_group[$BillGroupModel::GROUP_ID], $bill_group[$BillGroupModel::SKU_ID], $sell_order[$SellModel::GOODS_ID], $bill_group[$BillGroupModel::BUY_NUMBER], $sell_order['id']);
|
||
break;
|
||
case 3:
|
||
// 查询bill_group关联数据
|
||
$BillSpikeModel = D('RetailBillSpike');
|
||
$bill_spike = $BillSpikeModel->getFind(array($BillSpikeModel::BILL_ID => $bill_order[$BillModel::ID]));
|
||
if (empty($bill_spike)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 秒杀出库记录
|
||
$add_log = $this->spikeQuantityLogs($bill_spike[$BillSpikeModel::SPIKE_ID], $bill_order[$BillModel::MERCHANT_ID], $sell_order[$SellModel::GOODS_ID], $bill_spike[$BillSpikeModel::BUY_NUMBER], $sell_order[$SellModel::ALL_MONEY], $sell_order['id']);
|
||
break;
|
||
case 4:
|
||
//预售订单
|
||
$advance_bill = D("RetailBillAdvance")->getFind(array("bill_id" => $bill_order["id"]));
|
||
if (empty($advance_bill)) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单查询失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
//预售出库记录
|
||
$add_log = $this->advance_stock_logs($advance_bill, $sell_order);
|
||
break;
|
||
default:
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '请求有误'
|
||
);
|
||
return $res;
|
||
break;
|
||
}
|
||
|
||
if ($bill_order['platform_type'] == 2) {
|
||
//第三方平台
|
||
if ($bill_online['order_genre'] == 2 || $bill_online['order_genre'] == 3 || ($bill_online['order_genre'] == 4 && (($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 1) || $advance_bill['advance_type'] == 1))) {
|
||
$ThirdOrderClass = new Order();
|
||
$thirdResult = $ThirdOrderClass->orderPayment([
|
||
'merchant_id' => $bill_order['merchant_id'],
|
||
'third_order' => $bill_order['third_order'],
|
||
'pay_type' => $bill_order['pay_type']
|
||
]);
|
||
if ($thirdResult['status'] == 0) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '第三方平台订单状态修改失败' . $thirdResult['message']
|
||
);
|
||
return $res;
|
||
}
|
||
}
|
||
}
|
||
if (!$add_log['id']) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '活动库存出现异常,请联系商家进行退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 更新sell表
|
||
if ($bill_online[$OnlineModel::ORDER_GENRE] == 4 && $advance_bill['advance_type'] == 2 && $advance_bill['state'] == 0) {
|
||
//支付定金待支付状态
|
||
$save_order = $BillModel->updateOrder(array('id' => $bill_order['id']), array('pay_state' => 2));
|
||
} else {
|
||
$sell_content = array('pay_state' => 1);
|
||
//寄售供货商
|
||
if (!empty($add_log['stock_arr']) && $supplier_type == 2) {
|
||
$parameter = array(
|
||
'supplier_json' => $add_log['info']['supplier_json'],
|
||
'purchase_id_str' => $add_log['info']['purchase_id_str'],
|
||
'store_id' => $bill_order['store_id']
|
||
);
|
||
D("SPurchasePayable")->addPayableMoney($parameter);
|
||
$sell_content['supplier_json'] = json_encode($add_log['stock_arr']['supplier_json']);
|
||
$sell_content['purchase_id_str'] = $add_log['stock_arr']['purchase_id_str'];
|
||
}
|
||
$save_sell = $SellModel->updateOrder(array($SellModel::ID => $sell_order[$SellModel::ID]), $sell_content);
|
||
if (!$save_sell) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '销售订单出现异常,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 判断会员
|
||
$VipModel = D('RetailVip');
|
||
if ($bill_order[$BillModel::VID]) {
|
||
// 查询会员
|
||
$vip_info = $VipModel->getFind(array($VipModel::ID => $bill_order[$BillModel::VID]));
|
||
}
|
||
// 判断积分
|
||
if (!empty($vip_info) && $bill_discount[$DiscountModel::GET_INTEGRAL] && $bill_discount[$DiscountModel::GET_INTEGRAL] > 0) {
|
||
$balance_percent_state = true;//判断商户是否开启余额支付送积分
|
||
if ($bill_order['pay_type'] == 5) {
|
||
$VipConfigModel = new RetailVipConfigModel();
|
||
$state = $VipConfigModel->getFindField(array('merchant_id' => $bill_order['merchant_id']), $vip_info['plus_type'] == 2 ? 'plus_pay_integral_state' : 'vip_pay_integral_state');
|
||
$balance_percent_state = $state == 1 ? true : false;
|
||
if (!$balance_percent_state) {
|
||
$GoodsModel = new RetailGoodsModel();
|
||
$goods = $GoodsModel->getFind(array('id' => $sell_order['goods_id']), 'integral_mem_status,integral');
|
||
if ($goods['integral_mem_status'] == 1 && $goods['integral'] * 1 > 0) {
|
||
$SellModel->updateOrder(array('id' => $sell_order['id']), array('get_integral' => 0));
|
||
$DiscountModel->updateOrder(array('bill_id' => $bill_order['id']), array('get_integral' => 0));
|
||
}
|
||
}
|
||
}
|
||
if ($balance_percent_state) {
|
||
// 会员价积分并添加积分记录
|
||
$data = array(
|
||
'vip_id' => $vip_info[$VipModel::ID],
|
||
'store_id' => $bill_order[$BillModel::STORE_ID],
|
||
'bill_id' => $bill_order[$BillModel::ID],
|
||
'integral' => $bill_discount[$DiscountModel::GET_INTEGRAL],
|
||
'remark' => '购买商品送积分,共获得' . $bill_discount[$DiscountModel::GET_INTEGRAL] . '积分',
|
||
);
|
||
// 增加积分并记录
|
||
$this->addIntegralOrderLog($data);
|
||
}
|
||
}
|
||
|
||
// 更新bill_online表
|
||
if ($bill_online[$OnlineModel::PICKUP_TYPE] == 1) { // 判断配送方式 1.自提 2.配送
|
||
// 生成提货码
|
||
$up[$OnlineModel::PICK_CODE] = getPickCode();
|
||
if ($bill_online[$OnlineModel::ORDER_GENRE] == 3) {
|
||
$StoreModel = D('RetailStore');
|
||
$store = $StoreModel->getFind(array($StoreModel::ID => $bill_order[$BillModel::STORE_ID]));
|
||
$SmallProgramUserModel = D('RetailSmallProgramUser');
|
||
$openid = $SmallProgramUserModel->getFindField(array($SmallProgramUserModel::ID => $bill_order[$BillModel::UID]), $SmallProgramUserModel::OPENID);
|
||
$tempSend = array(
|
||
'merchant_id' => $bill_order[$BillModel::MERCHANT_ID],
|
||
'openid' => $openid,
|
||
'form_id' => $bill_online[$OnlineModel::FORM_ID],
|
||
'type' => 1,//'1自提通知 2发货通知',
|
||
'sendData' => array(
|
||
'store_name' => $store[$StoreModel::STORE_NAME],
|
||
'order_no' => $bill_order[$BillModel::ORDER_NO],
|
||
'pick_code' => $up[$OnlineModel::PICK_CODE],
|
||
'price' => $bill_order[$BillModel::ALL_MONEY],
|
||
'add_time' => date('Y-m-d H:i:s', $bill_order[$BillModel::ADD_TIME]),
|
||
'goods_name' => $sell_order['goods_name'],
|
||
'pick_time' => date('Y-m-d H:i:s', $bill_online[$OnlineModel::USER_SELECT_TIME]),
|
||
'user_phone' => $bill_online[$OnlineModel::USER_PHONE],
|
||
'username' => $bill_online[$OnlineModel::USER_NAME],
|
||
'user_remark' => $bill_online[$OnlineModel::REMARK],
|
||
'store_address' => $store[$StoreModel::ADDRESS],
|
||
'store_phone' => $store[$StoreModel::PHONE],
|
||
'order_type' => '秒杀订单',
|
||
'page' => 'pages/order/myOrderDetail/myOrderDetail?order_no=' . $bill_order[$BillModel::ORDER_NO]
|
||
),
|
||
);
|
||
A('Api/XcxMark')->sendMark($tempSend);//小程序模板通知
|
||
}
|
||
}
|
||
$up[$OnlineModel::STATUS] = 1;
|
||
$save_online = $OnlineModel->updateOrder(array($OnlineModel::BILL_ID => $bill_order[$BillModel::ID]), $up);
|
||
if (!$save_online) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '订单更新出现异常,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 更新bill_order表
|
||
$up2 = array(
|
||
$BillModel::FINISH_TIME => time(),
|
||
$BillModel::PAY_STATE => 1
|
||
);
|
||
$save_order = $BillModel->updateOrder(array($BillModel::ID => $bill_order[$BillModel::ID]), $up2);
|
||
if (!$save_order) {
|
||
$res = array(
|
||
'status' => 0,
|
||
'msg' => '支付失败,请联系商家退款'
|
||
);
|
||
return $res;
|
||
}
|
||
// 判断会员
|
||
if (!empty($vip_info)) {
|
||
$payInfo['ordernum'] = $bill_order[$BillModel::ORDER_NO];
|
||
$payInfo['integral'] = $bill_discount[$DiscountModel::GET_INTEGRAL] && $bill_discount[$DiscountModel::GET_INTEGRAL] > 0 ? $bill_discount[$DiscountModel::GET_INTEGRAL] : 0;
|
||
switch ($bill_order[$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($bill_order[$BillModel::STORE_ID], $vip_info[$VipModel::ID], $bill_order[$BillModel::ALL_MONEY], $payType, $payInfo);
|
||
// 消费送次卡
|
||
A('PayApi/VipCard')->rechargeGiveCard($bill_order['merchant_id'], $vip_info['id'], $bill_order['all_money'], 3, $bill_order['type'] == 1 ? 2 : 1);
|
||
}
|
||
}
|
||
switch ($bill_online[$OnlineModel::ORDER_GENRE]) {
|
||
case 2:
|
||
$sku_id = $bill_group[$BillGroupModel::SKU_ID] && $bill_group[$BillGroupModel::SKU_ID] != 0 ? $bill_group[$BillGroupModel::SKU_ID] : 0;
|
||
$redis_key = 'retail_group_' . $bill_group[$BillGroupModel::GROUP_ID] . '_' . $sku_id . '_' . $bill_order[$BillModel::UID] . '_' . $bill_order[$BillModel::ID];
|
||
break;
|
||
case 3:
|
||
// 获取规格
|
||
$Spike = D('RetailSpike');
|
||
$sku_id = $Spike->getFindField(array($Spike::ID => $bill_spike[$BillSpikeModel::SPIKE_ID]), $Spike::SKU_ID);
|
||
$sku_id = $sku_id && $sku_id != 0 ? $sku_id : 0;
|
||
$redis_key = 'retail_spike_' . $bill_spike[$BillSpikeModel::SPIKE_ID] . '_' . $sku_id . '_' . $bill_order[$BillModel::UID] . '_' . $bill_order[$BillModel::ID];
|
||
break;
|
||
case 4:
|
||
//删除预售nosql中数据
|
||
$advance_bill['sku_id'] = $advance_bill['sku_id'] ? $advance_bill['sku_id'] : 0;
|
||
$redis_key = 'retail_advance_goods_' . $advance_bill['advance_id'] . '_' . $advance_bill['goods_id'] . '_' . $advance_bill['sku_id'] . '_' . $advance_bill['uid'] . '_' . $advance_bill['bill_id'];
|
||
break;
|
||
}
|
||
|
||
$BillModel->create_print_number($bill_order['id'], $bill_order['type'], $bill_order['store_id']); // 生成排序单号
|
||
//收银员推送
|
||
$CashierClass = new Cashier();
|
||
$CashierClass->pushCashier([
|
||
'merchant_id' => $bill_order['merchant_id'],
|
||
'store_id' => $bill_order['store_id'],
|
||
'data' => [
|
||
'order_number' => $bill_order['order_no'],
|
||
'flower_balance' => $bill_order['all_money'],
|
||
'add_time' => $bill_order['add_time'],
|
||
'pickup_type_name' => $bill_online['pickup_type'] == 1 ? '自提' : ($bill_online['pickup_type'] == 2 ? '配送' : '快递发货')
|
||
]
|
||
]);
|
||
if (C('IS_SET_REDIS')) {
|
||
// 移除redis数据库中记录
|
||
$ApiRedis = new \Addons\Api\RedisController();
|
||
$ApiRedis::$redis->delete($redis_key);
|
||
}
|
||
|
||
$res = array(
|
||
'status' => 1,
|
||
'msg' => '交易完成',
|
||
);
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 添加出售库存记录(拼团)
|
||
* @param $group_id
|
||
* @param $goods_id
|
||
* @param $num
|
||
* @param $sell_id
|
||
* @return bool
|
||
*/
|
||
protected function groupQuantityLogs($group_id, $sku_id, $goods_id, $num, $sell_id)
|
||
{
|
||
$RGModel = D('RetailGroup');
|
||
$map = array(
|
||
$RGModel::ID => $group_id
|
||
);
|
||
// 根据活动id查询出现有库存(发生操作前)
|
||
$now_group = $RGModel->getFind($map);
|
||
if (empty($now_group)) {
|
||
return false;
|
||
}
|
||
$less_group = $RGModel->toSetDec($map, $RGModel::ACT_NUM, $num);
|
||
if (!$less_group) {
|
||
return false;
|
||
}
|
||
// $less_num = $RGModel->getFindField($map, $RGModel::ACT_NUM);
|
||
// if ($less_num < 0) {
|
||
// return false;
|
||
// }
|
||
if ($sku_id && $sku_id != 0) {
|
||
// 查询活动规格
|
||
$RSGModel = D('RetailSkuGroup');
|
||
$map2 = array(
|
||
$RSGModel::ID => $sku_id
|
||
);
|
||
$now_sku = $RSGModel->getFind($map2);
|
||
if (!$now_sku) {
|
||
return false;
|
||
}
|
||
$sku_id = $now_sku['sku_id'];
|
||
$less_sku = $RSGModel->toSetDec($map2, $RSGModel::ACT_NUM, $num);
|
||
if (!$less_sku) {
|
||
return false;
|
||
}
|
||
}
|
||
// 增加销售数量
|
||
$GoodsModel = D('RetailGoods');
|
||
$GoodsModel->toSetInc(array($GoodsModel::ID => $goods_id), $GoodsModel::SELL_NUM, $num); // 商品销售数量
|
||
$RGModel->toSetInc($map, $RGModel::SELL_NUMBER, $num); // 活动销售
|
||
// 添加出库记录
|
||
// 添加出库记录
|
||
$stock_data = [
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $sku_id,
|
||
'stock_price' => $now_group[$RGModel::ACT_PRICE],
|
||
'stock_num' => $num,
|
||
'type' => 4,
|
||
'sell_id' => $sell_id
|
||
];
|
||
$success = A('Api/Inventory')->goodsNumReduce($stock_data);
|
||
return $success;
|
||
}
|
||
|
||
/**
|
||
* 添加出售库存记录(秒杀)
|
||
* @param $spike_id
|
||
* @param $merchant_id
|
||
* @param $goods_id
|
||
* @param $num
|
||
* @param $sell_id
|
||
* @return bool
|
||
*/
|
||
protected function spikeQuantityLogs($spike_id, $merchant_id, $goods_id, $num, $all_money, $sell_id)
|
||
{
|
||
$RSModel = D('RetailSpike');
|
||
$map = array(
|
||
$RSModel::ID => $spike_id
|
||
);
|
||
//根据活动id查询出现有库存(发生操作前)
|
||
$now_spike = $RSModel->getFind($map);
|
||
if (empty($now_spike)) {
|
||
return false;
|
||
}
|
||
$less_group = $RSModel->toSetDec($map, $RSModel::STOCK, $num);
|
||
if (!$less_group) {
|
||
return false;
|
||
}
|
||
// $less_num = $RSModel->getFindField($map, $RSModel::STOCK);
|
||
// if ($less_num < 0) {
|
||
// return false;
|
||
// }
|
||
// 增加销售数量
|
||
$GoodsModel = D('RetailGoods');
|
||
$GoodsModel->toSetInc(array($GoodsModel::ID => $goods_id), $GoodsModel::SELL_NUM, $num); // 商品销售数量
|
||
$RSModel->toSetInc($map, $RSModel::SELL_NUMBER, $num); // 活动销售
|
||
// 添加出库记录
|
||
$stock_data = [
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $now_spike[$RSModel::SKU_ID],
|
||
'stock_price' => $now_spike[$RSModel::SPIKE_PRICE],
|
||
'stock_num' => $num,
|
||
'type' => 5,
|
||
'sell_id' => $sell_id
|
||
];
|
||
$success = A('Api/Inventory')->goodsNumReduce($stock_data);
|
||
return $success;
|
||
}
|
||
|
||
|
||
/**
|
||
* 添加出售库存记录(预售)
|
||
* @param $advance_bill
|
||
* @param $sell_order
|
||
* @return bool
|
||
*/
|
||
protected function advance_stock_logs($advance_bill, $sell_order)
|
||
{
|
||
$advance_id = $advance_bill['advance_id'];
|
||
$goods_id = $sell_order['goods_id'];
|
||
$sku_id = '';
|
||
$num = $advance_bill['buy_number'];
|
||
$price = $sell_order['price'];
|
||
$all_money = $sell_order['all_money'];
|
||
if ($sell_order['attribute_state'] == 2) {
|
||
$sku_id = $advance_bill['sku_id'];
|
||
}
|
||
if (C('IS_SET_REDIS')) {
|
||
$ApiRedis = new \Addons\Api\RedisController();
|
||
if ($sell_order['attribute_state'] == 2) {
|
||
$redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id . '_sku_id_' . $sku_id;
|
||
} else {
|
||
$redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id;
|
||
}
|
||
}
|
||
$redis_time = ($advance_bill['tail_end_time'] - time()) * 1; //redis 保存时间秒
|
||
$advance_model = D("AdvanceGoods");
|
||
$advance_sku_model = D("AdvanceSkuGoods");
|
||
$GoodsModel = D('RetailGoods');
|
||
$where = array(
|
||
'id' => $advance_id,
|
||
'goods_id' => $goods_id
|
||
);
|
||
$advance_goods = $advance_model->getFind($where);
|
||
if (empty($advance_goods)) {
|
||
return false;
|
||
}
|
||
if ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 0) {
|
||
//定金添加冻结库存
|
||
if (C('IS_SET_REDIS')) {
|
||
$frozen_param = array(
|
||
'id' => $advance_id,
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $sku_id,
|
||
'attribute_state' => $sell_order['attribute_state']
|
||
);
|
||
$frozen_num = $advance_model->frozen_num($frozen_param);
|
||
$frozen_num = round($frozen_num + $num, 3);
|
||
$redis_save = array(
|
||
'advance_id' => $advance_id,
|
||
'num' => $frozen_num
|
||
);
|
||
$ApiRedis::$redis->setex($redis_key, $redis_time, json_encode($redis_save));
|
||
}
|
||
$success['id'] = true;
|
||
} else {
|
||
$advance_stock = $advance_model->toSetDec($where, "surplus_num", $num); //活动库存减少
|
||
if (!$advance_stock) {
|
||
return false;
|
||
}
|
||
if ($advance_bill['advance_type'] == 2 && $advance_bill['state'] == 1) {
|
||
//尾款支付
|
||
if (C('IS_SET_REDIS')) {
|
||
$frozen_param = array(
|
||
'id' => $advance_id,
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $sku_id,
|
||
'attribute_state' => $sell_order['attribute_state']
|
||
);
|
||
$frozen_num = $advance_model->frozen_num($frozen_param);
|
||
if ($frozen_num >= $num) {
|
||
$frozen_num = round($frozen_num - $num, 3);
|
||
$redis_save = array(
|
||
'advance_id' => $advance_id,
|
||
'num' => $frozen_num
|
||
);
|
||
$ApiRedis::$redis->setex($redis_key, $redis_time, json_encode($redis_save));
|
||
}
|
||
}
|
||
}
|
||
if (!empty($sku_id)) {
|
||
//规格库存减少
|
||
$map = array(
|
||
'advance_id' => $advance_id,
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $sku_id
|
||
);
|
||
$advance_sku_stock = $advance_sku_model->toSetDec($map, "surplus_num", $num);
|
||
}
|
||
// 增加销售数量
|
||
$GoodsModel->toSetInc(array($GoodsModel::ID => $goods_id), $GoodsModel::SELL_NUM, $num); // 商品销售数量
|
||
// 添加出库记录
|
||
$stock_data = [
|
||
'goods_id' => $goods_id,
|
||
'sku_id' => $sku_id,
|
||
'stock_price' => $price,
|
||
'stock_num' => $num,
|
||
'type' => 11,
|
||
'all_money' => $all_money,
|
||
'sell_id' => $sell_order['id']
|
||
];
|
||
$success = A('Api/Inventory')->goodsNumReduce($stock_data);
|
||
}
|
||
return $success;
|
||
}
|
||
|
||
/**
|
||
* 增加积分并添加积分记录
|
||
* @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
|
||
* @return array
|
||
*/
|
||
public function groupOrderContinentPay($pay_order)
|
||
{
|
||
$RPOModel = D('RetailPayOrder');
|
||
$res = $this->paySuccess($pay_order[$RPOModel::BILL_ID]);
|
||
if ($res['status'] == 1) {
|
||
// 查询bill
|
||
$RBOModel = D('RetailBillOrder');
|
||
$fields = array(
|
||
'b.' . $RBOModel::ORDER_NO,
|
||
'b.' . $RBOModel::STORE_ID,
|
||
'g.*'
|
||
);
|
||
$map = array(
|
||
$RBOModel::ID => $pay_order[$RPOModel::BILL_ID]
|
||
);
|
||
$bill = $RBOModel->getFindGroup($map, $fields);
|
||
if ($bill) {
|
||
$res = A('PayApi/Group')->updateGroupState($bill['group_id'], $bill['parent_id'], $bill[$RBOModel::STORE_ID], $bill[$RBOModel::ORDER_NO]);
|
||
}
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 秒杀订单新大陆支付完成
|
||
* @param $pay_order
|
||
* @return array
|
||
*/
|
||
public function spikeOrderContinentPay($pay_order)
|
||
{
|
||
$RPOModel = D('RetailPayOrder');
|
||
$res = $this->paySuccess($pay_order[$RPOModel::BILL_ID]);
|
||
if ($res['status'] == 1) {
|
||
$res = A('PayApi/Spike')->updateOrder($pay_order[$RPOModel::BILL_ID]);
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 预售订单支付回调
|
||
* @param $pay_order
|
||
* @return array
|
||
*/
|
||
public function advance_pay_notify($pay_order)
|
||
{
|
||
$res = $this->paySuccess($pay_order["bill_id"]);
|
||
if ($res['status'] == 1) {
|
||
$res = D("RetailBillAdvance")->update_bill_advance($pay_order);
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* 活动订单生成退款订单
|
||
* @param string $order_no
|
||
* @return array $res
|
||
*/
|
||
public function doRefund_v1($order_no)
|
||
{
|
||
// 查询bill_order订单
|
||
$BillModel = D('RetailBillOrder');
|
||
$bMap = array(
|
||
$BillModel::ORDER_NO => strval($order_no),
|
||
$BillModel::TYPE => 1,
|
||
$BillModel::ORDER_TYPE => 1,
|
||
$BillModel::REFUND_STATUS => 0
|
||
);
|
||
$billOrder = $BillModel->getFind($bMap);
|
||
// 判断bill_order订单
|
||
if (empty($billOrder)) {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '请求有误,请刷新重试';
|
||
return $result;
|
||
}
|
||
// 查询bill_online订单,线上关联订单
|
||
$BillOnlineModel = D('RetailBillOnline');
|
||
$oMap = array(
|
||
$BillOnlineModel::BILL_ID => $billOrder[$BillModel::ID]
|
||
);
|
||
$billOnline = $BillOnlineModel->getFind($oMap);
|
||
// 判断bill_online订单
|
||
if (empty($billOnline)) {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '请求有误,请刷新重试';
|
||
return $result;
|
||
}
|
||
// 计算配送费
|
||
$delivery_fee = $billOnline[$BillOnlineModel::PICKUP_TYPE] == 2 && floatval($billOnline[$BillOnlineModel::DELIVERY_FEE]) > 0 ? floatval($billOnline[$BillOnlineModel::DELIVERY_FEE]) : 0;
|
||
$BillDisModel = D('RetailBillDiscount');
|
||
// 判断线上订单关联的活动
|
||
$RBGModel = D('RetailBillGroup');
|
||
$RBSModel = D('RetailBillSpike');
|
||
if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 2) { // 拼团订单
|
||
// 查询拼团关联
|
||
$act_bill = $RBGModel->getFind(array($RBGModel::BILL_ID => $billOrder[$BillModel::ID]));
|
||
} else if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 3) { // 秒杀订单
|
||
// 查询秒杀关联
|
||
$act_bill = $RBSModel->getFind(array($RBSModel::BILL_ID => $billOrder[$BillModel::ID]));
|
||
} else {
|
||
$result['status'] = 1;
|
||
$result['msg'] = '未知的退款类型';
|
||
return $result;
|
||
}
|
||
// 判断活动
|
||
if (!$act_bill) {
|
||
$res = array('status' => 0, 'msg' => '活动订单查询失败');
|
||
return $res;
|
||
}
|
||
// 判断是否发货
|
||
if ($billOnline[$BillOnlineModel::STATUS] != 1) {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '该订单已发货,不能退款';
|
||
return $result;
|
||
}
|
||
// 查询sell订单(销售订单)
|
||
$SellModel = D('RetailSell');
|
||
$refund_list = $SellModel->getSelect(array($SellModel::BILL_ID => $billOrder[$BillModel::ID]));
|
||
$new_discount = $BillDisModel->getFind(array($BillDisModel::BILL_ID => $billOrder[$BillModel::ID]));
|
||
// 退款总金额
|
||
$allMoney = round($billOrder[$BillModel::ALL_MONEY] - $delivery_fee, 2);
|
||
$time = time();
|
||
$newBill = array(
|
||
$BillModel::ALL_MONEY => $allMoney,
|
||
$BillModel::PAY_STATE => 1,
|
||
$BillModel::REFUND_STATUS => 5,
|
||
$BillModel::TYPE => 1,
|
||
$BillModel::ORDER_TYPE => 2,
|
||
$BillModel::ADD_TIME => $time,
|
||
$BillModel::REFUND_NO => $billOrder[$BillModel::ORDER_NO],
|
||
$BillModel::REFUND_MONEY => $allMoney,
|
||
$BillModel::UID => $billOrder[$BillModel::UID],
|
||
$BillModel::VID => $billOrder[$BillModel::VID],
|
||
$BillModel::STORE_ID => $billOrder[$BillModel::STORE_ID],
|
||
$BillModel::MERCHANT_ID => $billOrder[$BillModel::MERCHANT_ID],
|
||
);
|
||
$newBill = $BillModel->addBillOrder($newBill);
|
||
if ($newBill) {
|
||
if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 2) { // 拼团订单
|
||
$act_bill[$RBGModel::BILL_ID] = $newBill[$BillModel::ID];
|
||
$new_act = $RBGModel->addOrder($act_bill);
|
||
} else if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 3) {
|
||
$act_bill[$RBSModel::BILL_ID] = $newBill[$BillModel::ID];
|
||
$new_act = $RBSModel->addOrder($act_bill);
|
||
}
|
||
$new_discount[$BillDisModel::BILL_ID] = $newBill[$BillModel::ID];
|
||
$add_dis = $BillDisModel->addOrder($new_discount);
|
||
$old_online = $BillOnlineModel->getFind(array($BillOnlineModel::BILL_ID => $billOrder[$BillModel::ID]));
|
||
$old_online[$BillOnlineModel::CANCEL_TIME]++;
|
||
$old_online[$BillOnlineModel::BILL_ID] = $newBill[$BillModel::ID];
|
||
// $old_online[$BillOnlineModel::DELIVERY_FEE] = 0; //先默认为不退换配送费
|
||
$add_online = $BillOnlineModel->addOrder($old_online);
|
||
$online_save[$BillOnlineModel::CANCEL_TIME] = $old_online[$BillOnlineModel::CANCEL_TIME];
|
||
|
||
if ($new_act && $add_dis && $add_online) {
|
||
//可进行退换货操作
|
||
$success_array = array();
|
||
foreach ($refund_list as &$val) {
|
||
$newSell = $val;
|
||
unset($newSell[$SellModel::ID]);
|
||
$newSell[$SellModel::SELL_TYPE] = 2; //退款
|
||
$newSell[$SellModel::PAY_STATE] = 0; //未成功退款
|
||
$newSell[$SellModel::BILL_ID] = $newBill[$BillModel::ID];
|
||
$add_sell = $SellModel->addOrder($newSell);
|
||
if ($add_sell) {
|
||
$newSell[$SellModel::ID] = $add_sell;
|
||
$success_array[] = $newSell;
|
||
$SellModel->toSetInc(array($SellModel::ID => $val[$SellModel::ID]), $SellModel::WAIT_REFUND_NUM, $val[$SellModel::NUM]);
|
||
}
|
||
}
|
||
if (count($success_array) == count($refund_list)) {
|
||
$result['status'] = 1;
|
||
$result['msg'] = '退款申请发起成功';
|
||
// 修改原订单状态
|
||
$BillModel->updateOrder($bMap, array($BillModel::REFUND_STATUS => 1));
|
||
$BillOnlineModel->updateOrder($oMap, $online_save);
|
||
|
||
// 减少销售数量增加活动库存
|
||
if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 2) { // 拼团订单
|
||
D('RetailGroup')->toSetDec(array('id' => $act_bill[$RBGModel::GROUP_ID]), 'sell_number', $act_bill[$RBGModel::BUY_NUMBER]);
|
||
D('RetailGroup')->toSetInc(array('id' => $act_bill[$RBGModel::GROUP_ID]), 'actnum', $act_bill[$RBGModel::BUY_NUMBER]);
|
||
} else if ($billOnline[$BillOnlineModel::ORDER_GENRE] == 3) { // 秒杀订单
|
||
D('RetailSpike')->toSetDec(array('id' => $act_bill[$RBSModel::SPIKE_ID]), 'sell_number', $act_bill[$RBSModel::BUY_NUMBER]);
|
||
D('RetailSpike')->toSetInc(array('id' => $act_bill[$RBSModel::SPIKE_ID]), 'active_limit_num', $act_bill[$RBSModel::BUY_NUMBER]);
|
||
}
|
||
} else {
|
||
$BillModel->deleteOrder(array($BillModel::ID => $newBill[$BillModel::ID]));
|
||
$SellModel->deleteOrder(array($SellModel::BILL_ID => $newBill[$BillModel::ID]));
|
||
foreach ($success_array as $value) {
|
||
$SellModel->toSetDec(array($SellModel::ID => $value[$SellModel::BILL_ID]), $SellModel::WAIT_REFUND_NUM, $value[$SellModel::NUM]);
|
||
}
|
||
$result['status'] = 0;
|
||
$result['msg'] = '数据操作有误2';
|
||
}
|
||
} else {
|
||
$BillModel->deleteOrder(array($BillModel::ID => $newBill[$BillModel::ID]));
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款请求失败,请稍后重试';
|
||
}
|
||
} else {
|
||
$result['status'] = 0;
|
||
$result['msg'] = '退款请求失败,请稍后重试1';
|
||
}
|
||
return $result;
|
||
}
|
||
} |