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

815 行
36 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?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;
}
}