文件
mashangyoujiu/Application/Api/Controller/DeliveryController.class.php

898 行
41 KiB
PHP
可执行文件

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

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

<?php
namespace Api\Controller;
use Common\Business\BillOrder;
use Common\Business\Sell;
use Common\Business\SerialNumberGoods;
use Common\Business\StockRecord;
use Common\Model\RetailBillOnlineModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailSellModel;
use Common\Model\SellModel;
use LittleGift\Business\Order;
use Make\Business\Make;
use Think\Controller;
//[1.8.50]
class DeliveryController extends Controller
{
/**
* 获取UU配送费和距离
* @param $parameter
* @return mixed
*/
public function getUuDeliveryPrice($parameter)
{
$verify_bill_order = D("RetailBillOrder")->order_existence_verify($parameter); //验证订单
if ($verify_bill_order['status'] == 0) {
return $verify_bill_order;
}
$billOrder = $verify_bill_order['bill_order'];
$verify_bill_online = D("RetailBillOnline")->delivery_verify($billOrder);
if ($verify_bill_online['status'] == 0) {
return $verify_bill_online;
}
$onlineOrder = $verify_bill_online['online_order']; //online_order 信息
if ($onlineOrder["order_genre"] == 2) {
//拼团订单
$BillGroupModel = D('RetailBillGroup');
$state = $BillGroupModel->getFindField(array($BillGroupModel::BILL_ID => $billOrder["id"]), $BillGroupModel::STATE);
if ($state != 2) {
$result['status'] = 0;
$result['msg'] = '该订单未拼团成功,不能进行配送';
return $result;
}
}
$verify_delivery = D('RetailDeliveryConfig')->delivery_verify();
if ($verify_delivery['status'] == 0) {
return $verify_delivery;
}
$deliveryConfig = $verify_delivery['delivery_config'];
$StoreModel = D('RetailStore');
$store = $StoreModel->getFind(array('id' => $billOrder['store_id']));
if (empty($store[$StoreModel::DETAIL_ADDRESS]) || empty($store[$StoreModel::LATITUDE]) || empty($store[$StoreModel::LONGITUDE])) {
$res['status'] = 0;
$res['msg'] = '请检查后台本门店详细地址与经纬度';
return $res;
}
$lngLat = getAddress($onlineOrder["user_address"], 2);
if (empty($lngLat['lng']) || empty($lngLat['lat'])) {
$res['status'] = 0;
$res['msg'] = '腾讯地图获取经纬度失败,请检测合伙人地图设置';
return $res;
}
$UuMerchantModel = D('RetailUuMerchant');
$openid = $UuMerchantModel->getFindField(array($UuMerchantModel::MERCHANT_ID => $parameter['merchant_id']), $UuMerchantModel::OPENID);
$store_position = Convert_GCJ02_To_BD09($store[$StoreModel::LATITUDE], $store[$StoreModel::LONGITUDE]);
$data = array(
'from_address' => $store[$StoreModel::DETAIL_ADDRESS],
'to_address' => $onlineOrder["user_address"],
'city_name' => $store[$StoreModel::CITY],
'county_name' => $store[$StoreModel::AREA],
'send_type' => 0,
'to_lat' => $lngLat['lat'],
'to_lng' => $lngLat['lng'],
'from_lat' => $store_position['lat'],
'from_lng' => $store_position['lng'],
'openid' => $openid,
'appid' => $deliveryConfig['uu_appid'],
);
file_put_contents('./deliveryUU.txt', json_encode($data) . "\r\n", FILE_APPEND);
$content = A('Retail/Uudelivery')->getorderprice($data, $deliveryConfig['uu_appkey']);//获取uu价格
$content = json_decode($content, true);
if ($content['return_code'] == 'ok' && $content['appid']) {
$UuOrderModel = D('RetailUuOrder');
$item = array(
$UuOrderModel::ORIGIN_ID => $billOrder["id"],
$UuOrderModel::ORDER_ID => $billOrder["order_no"],
$UuOrderModel::PRICE_TOKEN => $content['price_token'],
$UuOrderModel::TOTAL_MONEY => $content['total_money'],
$UuOrderModel::NEED_PAY_MONEY => $content['need_paymoney'],
$UuOrderModel::TOTAL_PRICE_OFF => $content['total_priceoff'],
$UuOrderModel::DISTANCE => $content['distance'],
$UuOrderModel::FREIGHT_MONEY => $content['freight_money'],
$UuOrderModel::COUPON_AMOUNT => $content['coupon_amount'],
$UuOrderModel::EXPIRES_IN => $content['expires_in'],
$UuOrderModel::MERCHANT_ID => $parameter['merchant_id'],
$UuOrderModel::STORE_ID => $parameter['store_id'],
$UuOrderModel::ADD_TIME => time(),
$UuOrderModel::ORDER_GENRE => $onlineOrder["order_genre"]
);
$add = $UuOrderModel->addOrder($item);
if ($add) {
D("RetailBillOnline")->updateOrder(array("bill_id" => $billOrder['id']), array("delivery_record_id" => $add));
$res['status'] = 1;
$res['msg'] = '实际需要支付金额' . $content['need_paymoney'] . '元,配送距离' . $content['distance'] . '米';
} else {
$res['status'] = 0;
$res['msg'] = '价格计算成功,存表失败,请重新配送';
}
} else {
$res['status'] = 0;
$res['msg'] = $content['return_msg'];
}
return $res;
}
/**
* @param $parameter
* 配送
* platform_type 商户平台类型 1默认系统 2微礼平台
* option_type 1收银机 2后台
* operation_id 后台操作者Id
* order_no 订单编号
* type 1商家配送 2达达配送 3UU配送 5码科配送
* uu_phone 发件人手机号
* special_type 特殊处理类型,是否需要保温箱 1需要 0不需要
* note 备注
* sync_to_rider 是否同步到骑手端 1是 0否(仅type=1时生效)
* total_price 码科的配送价格
* @return array|mixed
*/
public function deliveryOrder($parameter)
{
$BillModel = new RetailBillOrderModel();
$OnlineModel = new RetailBillOnlineModel();
$platform_type = $parameter['platform_type'] ? $parameter['platform_type'] : 1;
$option_type = $parameter['option_type'] ? $parameter['option_type'] : 1;
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter["store_id"];
$store = $parameter['store'];
$cashier = $parameter["cashier"];
$cashier_id = $parameter["cashier_id"];
$operation_id = $parameter['operation_id'];
$order_no = $parameter["order_no"];
$type = $parameter["type"];
$uu_phone = $parameter["uu_phone"];
$special_type = $parameter["special_type"] ? $parameter["special_type"] : 0;
$note = $parameter["note"];
if (empty($uu_phone) && $option_type == 1) {
$CashierModel = D('RetailCashier');
$uu_phone = $cashier[$CashierModel::MOBILE];
}
if (empty($order_no) || empty($type)) {
$result['status'] = 0;
$result['msg'] = "缺少参数";
return $result;
}
$BillOrderClass = new BillOrder();
$verifyResult = $BillOrderClass->orderStateVerify([
'order_no' => $order_no,
'store_id' => $store_id,
'platform_type' => $platform_type
]); //新版验证
if ($verifyResult['status'] != 1) {
$verifyResult['msg'] = $verifyResult['message'];
return $verifyResult;
}
$billOrder = $verifyResult['data']['order_info']; //订单信息
//商品信息验证
$SellClass = new Sell();
$goodsVerify = $SellClass->distributionGoodsVerify([
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $billOrder['id'],
'type' => 1
]);
if ($goodsVerify['status'] != 1) {
$goodsVerify['msg'] = $goodsVerify['message'];
return $goodsVerify;
}
$goods_serial_list = $goodsVerify['data']; //串号商品的信息
switch ($type) {
case 2:
//达达配送
$param = array(
'bill_order' => $billOrder,
'online_order' => $billOrder,
'store' => $store,
'merchant_id' => $merchant_id,
'store_id' => $store_id
);
$res = $this->toDaDaDelivery($param);//达达配送
break;
case 3:
//UU配送
$param = array(
'bill_order' => $billOrder,
'online_order' => $billOrder,
'uu_phone' => $uu_phone,
'special_type' => $special_type,
'note' => $note,
'store' => $store,
'merchant_id' => $merchant_id,
'store_id' => $store_id
);
$res = $this->toUUDelivery($param);//UU配送
break;
case 5:
//码科配送
$param = [
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'store' => $store,
'cashier' => $cashier,
'bill_order' => $billOrder,
'begin_phone' => $uu_phone,
'note' => $note,
'total_price' => $parameter['total_price'],
'distance' => $parameter['distance']
];
$MakeClass = new Make();
$res = $MakeClass->createOrder($param);
$res['msg'] = $res['message'];
$res['delivery_record_id'] = $res['data']['delivery_record_id'];
break;
case 6:
$data = (new \Common\Model\RetailMaiyatianOrderModel)->where(['order_id' => $order_no])->find();
$data['order'] = @json_decode($data['order'], true);
$data['order_customer'] = @json_decode($data['order_customer'], true);
$maiyatian = new \Common\Lib\Maiyatian($data['order']['shop_id']);
if ($maiyatian->orderCreated([
'order' => $data['order'],
'order_customer' => $data['order_customer'],
'update_time' => $data['update_time'],
])) {
$res['status'] = $maiyatian->orderConfirmed($data['order']['order_id']) ? 1 : 0;
$res['msg'] = '配送成功';
$res['delivery_record_id'] = $billOrder['id'];
}
break;
default:
$res = array(
'status' => 1,
'msg' => '配送成功'
);
break;
}
if ($res['status'] == 1) {
$time = $_SERVER['REQUEST_TIME'];
if ($option_type == 2) {
$bSave = array(
$BillModel::OPERATION_ID => $operation_id
);
} else if ($option_type == 1) {
$bSave = array(
$BillModel::CASHIER_ID => $cashier_id
);
}
$bUpdate = $BillModel->updateOrder(array("id" => $billOrder['id']), $bSave);
$oSave = array(
$OnlineModel::STATUS => $type == 1 ? 2 : 1,
$OnlineModel::DELIVERY_TYPE => $type,
$OnlineModel::DELIVERY_RECORD_ID => $res['delivery_record_id'],
$OnlineModel::DELIVERY_TIME => strval($time),
);
$oUpdate = $OnlineModel->updateOrder(array("bill_id" => $billOrder['id']), $oSave);
if ($oUpdate) {
// 如为商家配送且需要同步到骑手端,则触发同步
if ((int)$type === 1 && isset($parameter['sync_to_rider']) && (int)$parameter['sync_to_rider'] === 1) {
try {
$syncService = new \Common\Business\OrderSyncService();
$syncResult = $syncService->syncSingleOrder($billOrder['id']);
if (isset($syncResult['success']) && $syncResult['success']) {
// 回填骑手订单ID并增强提示信息
$res['rider_order_id'] = $syncResult['rider_order_id'];
$res['msg'] = $res['msg'] . ',已同步至骑手端';
} else if (isset($syncResult['message'])) {
// 同步失败不影响发货流程,仅提示
$res['msg'] = $res['msg'] . '(骑手同步失败:' . $syncResult['message'] . ')';
}
} catch (\Exception $e) {
// 异常同样不影响发货流程
$res['msg'] = $res['msg'] . '(骑手同步异常:' . $e->getMessage() . ')';
}
}
if ($platform_type == 2 && $billOrder['order_type'] == 1) {
//第三方平台购买订单
$ThirdOrderClass = new Order();
$thirdResult = $ThirdOrderClass->orderExecute([
'merchant_id' => $merchant_id,
'third_order' => $billOrder['third_order']
]);
if ($thirdResult['status'] == 0) {
$res['status'] = 1;
$res['msg'] = '订单发货成功,Q3发货失败'.$thirdResult['message'];
}
}
$result = $res;
} else {
$BillModel->updateOrder(array("id" => $billOrder['id']), array($BillModel::FINISH_TIME => '', $BillModel::CASHIER_ID => null));
$result['status'] = 0;
$result['msg'] = '配送成功,订单更新失败,请联系管理员';
}
switch ($billOrder['order_type']) {
case 1:
//购买订单串号仓库减少
if (!empty($goods_serial_list)) {
$SerialClass = new SerialNumberGoods();
$serialResult = $SerialClass->basisNumberOperation([
'store_id' => $store_id,
'goods_list' => $goods_serial_list,
'type' => 2
]);
//仓库减少新增出库记录
if ($serialResult['status'] == 1) {
$sell_id_arr = array_column($goods_serial_list, 'id');
if (!empty($sell_id_arr)) {
$StockRecordClass = new StockRecord();
$outsideResult = $StockRecordClass->basisSellStockRecord([
'store_id' => $store_id,
'sell_id' => $sell_id_arr
]);
$outside_id_arr = $outsideResult['data'];
if (!empty($outside_id_arr)) {
$new_outside_id_arr = array_column($outside_id_arr, null, 'stock_out_id');
$order_genre = $OnlineModel->getFindField([
"bill_id" => $billOrder['id'],
], 'order_genre');
switch ($order_genre) {
case 1:
$stock_type = 8;
break;
case 2:
$stock_type = 4;
break;
case 3:
$stock_type = 5;
break;
case 4:
$stock_type = 11;
break;
}
foreach ($goods_serial_list as $val) {
if ($val['serial_number_state'] == 1 && !empty($val['serial_list'])) {
$SerialClass->stockSerial([
'user_type' => 4,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'outside_id' => $new_outside_id_arr[$val['id']]['id'],
'type' => $stock_type,
'goods_id' => $val['goods_id'],
'sku_id' => $val['sku_id'] ? $val['sku_id'] : 0,
'serial_list' => $val['serial_list']
]);
}
}
}
}
}
}
break;
case 3:
//换货订单减少商家库存
$param = array(
'bill_order' => $billOrder
);
A("Api/Inventory")->CustomerStockDec($param);
break;
}
$SmallProgramUserModel = D('RetailSmallProgramUser');
$xcxVipInfo = $SmallProgramUserModel->getFind(array($SmallProgramUserModel::ID => $billOrder[$BillModel::UID]));
$StoreModel = D('RetailStore');
$SellModel = D('RetailSell');
$sMap = array(
$SellModel::BILL_ID => $billOrder[$BillModel::ID]
);
$sFields = array(
$SellModel::GOODS_NAME,
);
$sellOrder = $SellModel->getSelect($sMap, $sFields, '', '1,2');
if (count($sellOrder) > 1) {
$goods_name = $sellOrder[0][$SellModel::GOODS_NAME] . '等商品';
} else {
$goods_name = $sellOrder[0][$SellModel::GOODS_NAME];
}
switch ($billOrder[$OnlineModel::ORDER_GENRE]) {
case '1':
$order_type = '普通订单';
break;
case '2':
$order_type = '拼团订单';
break;
case '3':
$order_type = '秒杀订单';
break;
case '4':
$order_type = '预售订单';
break;
default:
$order_type = '普通订单';
}
switch ($type) {
case 1:
$delivery_type = '商家配送';
break;
case 2:
$delivery_type = '达达配送';
break;
case 3:
$delivery_type = 'UU跑腿配送';
break;
case 5:
$delivery_type = '码科配送';
break;
}
$tempSend = array(
'merchant_id' => $billOrder[$BillModel::MERCHANT_ID],
'openid' => $xcxVipInfo[$SmallProgramUserModel::OPENID],
'form_id' => $billOrder[$OnlineModel::FORM_ID],
'type' => 2,//'1自提通知 2发货通知',
'sendData' => array(
'store_name' => $store[$StoreModel::STORE_NAME],
'delivery_type' => $delivery_type,
'delivery_time' => date('Y-m-d H:i:s'),
'order_no' => $billOrder[$BillModel::ORDER_NO],
'user_address' => $billOrder[$OnlineModel::USER_ADDRESS],
'user_phone' => $billOrder[$OnlineModel::USER_PHONE],
'username' => $billOrder[$OnlineModel::USER_NAME],
'price' => $billOrder[$BillModel::ALL_MONEY],
'add_time' => date('Y-m-d H:i:s', $billOrder[$BillModel::ADD_TIME]),
'goods_name' => $goods_name,
'store_address' => $store[$StoreModel::ADDRESS],
'store_phone' => $store[$StoreModel::PHONE],
'user_remark' => $billOrder[$OnlineModel::REMARK],
'order_type' => $order_type,
'page' => 'pages/order/myOrderDetail/myOrderDetail?order_no=' . $billOrder[$BillModel::ORDER_NO]
),
);
A('Api/XcxMark')->sendMark($tempSend);//小程序模板通知
} else {
$result = $res;
}
return $result;
}
/**
* 达达配送
* @param $billOrder 订单主表
* @param $onlineOrder 线上表
* @return mixed
*/
protected function toDaDaDelivery($parameter)
{
$billOrder = $parameter['bill_order'];
$onlineOrder = $parameter['online_order'];
$store = $parameter['store'];
$merchant_id = $parameter['merchant_id'];
$store_id = $parameter['store_id'];
$BillModel = D('RetailBillOrder');
$OnlineModel = D('RetailBillOnline');
$DeliveryConfigModel = D('RetailDeliveryConfig');
$deliveryConfig = $DeliveryConfigModel->getFind();
if (empty($deliveryConfig)) {
$result['status'] = 0;
$result['msg'] = '请先联系合伙人完善开发者信息';
return $result;
}
$da_app_key = $deliveryConfig[$DeliveryConfigModel::DA_APP_KEY];
$da_app_secret = $deliveryConfig[$DeliveryConfigModel::DA_APP_SECRET];
if (empty($da_app_key) || empty($da_app_secret)) {
$result['status'] = 0;
$result['msg'] = '请联系合伙人完善达达配送所需信息';
return $result;
}
$StoreModel = D('RetailStore');
if ($store[$StoreModel::DADA_OPEN_STATE] != 2) {
$result['status'] = 0;
$result['msg'] = "该门店未开启达达配送";
return $result;
}
if ($store[$StoreModel::DADA_SYNC_STATE] != 2) {
$result['status'] = 0;
$result['msg'] = "门店未同步达达配送";
return $result;
}
$store_city = substr($store[$StoreModel::CITY], 0, -3);
$DaDaCityModel = D('RetailDaDaCity');
$cMap = array(
$DaDaCityModel::CITY_NAME => array('like', $store_city . "%")
);
$city_code = $DaDaCityModel->getFindField($cMap, $DaDaCityModel::CITY_CODE);
if (empty($city_code)) {
$result['status'] = 0;
$result['msg'] = '订单所在城市有误';
return $result;
}
if (!$onlineOrder[$OnlineModel::USER_ADDRESS]) {
$result['status'] = 0;
$result['msg'] = '收货人信息有误';
return $result;
}
$DaMerchantModel = D('RetailDaMerchant');
$da_merchant_id = $DaMerchantModel->getFindField(array($DaMerchantModel::MERCHANT_ID => $merchant_id), $DaMerchantModel::RESULT_ID);
if (empty($da_merchant_id)) {
$result['status'] = 0;
$result['msg'] = '请先在达达配送注册达达商户';
return $result;
}
$lngLat = getAddress($onlineOrder[$OnlineModel::USER_ADDRESS], 1);
$title = 'http';
if ($_SERVER['HTTPS'] == 'on') {
$title .= 's';
}
$http = $title . '://' . $_SERVER['HTTP_HOST'];
$data = array(
'origin_id' => $billOrder[$BillModel::ORDER_NO],
'shop_no' => $store[$StoreModel::ORIGIN_SHOP_ID],
'city_code' => $city_code,
'cargo_price' => $billOrder[$BillModel::ALL_MONEY],
'is_prepay' => 0,
'receiver_name' => $onlineOrder[$OnlineModel::USER_NAME],
'receiver_address' => $onlineOrder[$OnlineModel::USER_ADDRESS],
'receiver_lat' => $lngLat['lat'],
'receiver_lng' => $lngLat['lng'],
'receiver_phone' => $onlineOrder[$OnlineModel::USER_PHONE],
'cargo_weight' => 1,
'callback' => $http . '/index.php/NotifyApi/DaDa/orderCallBack'
);
$DaOrderModel = D('RetailDaOrder');
$oldDaOrder = $DaOrderModel->getFind(array($DaOrderModel::ORDER_NO => strval($billOrder[$BillModel::ORDER_NO])));
if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 2 && ($onlineOrder[$OnlineModel::CANCEL_DELIVERY_STATUS] == 1 || empty($oldDaOrder))) {
//第一次下单
$success = A('Retail/DadaCeshi')->addorder($da_app_key, $da_app_secret, $da_merchant_id, $data);
} else if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 2 && $onlineOrder[$OnlineModel::CANCEL_DELIVERY_STATUS] == 2 && !empty($oldDaOrder)) {
$success = A('Retail/DadaCeshi')->reAddOrder($da_app_key, $da_app_secret, $da_merchant_id, $data);
} else {
$result['status'] = 0;
$result['msg'] = '您的操作有误';
return $result;
}
file_put_contents('./deliveryDaDa.txt', $success . "\r\n", FILE_APPEND);
$success = json_decode($success, true);
if ($success['status'] == 'success') {
$item = array(
$DaOrderModel::ORDER_GENRE => $onlineOrder[$OnlineModel::ORDER_GENRE],
$DaOrderModel::ORDER_NO => $billOrder[$BillModel::ORDER_NO],
$DaOrderModel::ORDER_STATUS => 1,//待接单=1 待取货=2 配送中=3 已完成=4 已取消=5 已过期=7 指派单=8 妥投异常之物品返回中=9 妥投异常之物品返回完成=10 创建达达运单失败=1000
$DaOrderModel::MERCHANT_ID => $merchant_id,
$DaOrderModel::STORE_ID => $store_id,
$DaOrderModel::ADD_TIME => time(),
$DaOrderModel::DISTANCE => $success['result']['distance'],
$DaOrderModel::FEE => $success['result']['fee'],
$DaOrderModel::DELIVER_FEE => $success['result']['deliverFee'],
);
$clerk_id = $DaOrderModel->addOrder($item);
if ($clerk_id) {
$result['delivery_record_id'] = $clerk_id;
$result['status'] = 1;
$result['msg'] = $success['msg'] . "配送距离" . $success['result']['distance'] . "米,实际配送费" . $success['result']['fee'] . "运费" . $success['result']['deliverFee'];
} else {
$result['status'] = 1;
$result['msg'] = $success['msg'] . "配送距离" . $success['result']['distance'] . "米,实际配送费" . $success['result']['fee'] . "运费" . $success['result']['deliverFee'] . '订单状态未修改';
}
} else {
$result['status'] = 0;
$result['msg'] = $success['msg'];
}
return $result;
}
/**
* UU配送
* @param $billOrder 订单主表
* @param $onlineOrder 订单线上表
* @param $special_type 特殊处理类型,是否需要保温箱 1需要 0不需要
* @param $uu_phone 发件人手机号
* @param $note 备注
* @return mixed
*/
protected function toUUDelivery($parameter)
{
$billOrder = $parameter['bill_order'];
$onlineOrder = $parameter['online_order'];
$special_type = $parameter['special_type'];
$uu_phone = $parameter['uu_phone'];
$note = $parameter['note'];
$OnlineModel = D('RetailBillOnline');
if (!$billOrder) {
$res['status'] = 0;
$res['msg'] = '参数错误,请重新下单';
return $res;
}
$UuOrderModel = D('RetailUuOrder');
$orderInfo = $UuOrderModel->getFind(array($UuOrderModel::ID => $onlineOrder[$OnlineModel::DELIVERY_RECORD_ID]));
if (empty($orderInfo)) {
$res['status'] = 0;
$res['msg'] = '未找到订单,刷新重试';
return $res;
}
$DeliveryConfigModel = D('RetailDeliveryConfig');
$deliveryConfig = $DeliveryConfigModel->getFind();
if (empty($deliveryConfig)) {
$result['status'] = 0;
$result['msg'] = '请先联系合伙人完善开发者信息';
return $result;
}
$uu_app_id = $deliveryConfig[$DeliveryConfigModel::UU_APPID];
$uu_ip = $deliveryConfig[$DeliveryConfigModel::UU_IP];
$uu_app_key = $deliveryConfig[$DeliveryConfigModel::UU_APP_KEY];
if (empty($uu_app_id) || empty($uu_ip) || empty($uu_app_key)) {
$result['status'] = 0;
$result['msg'] = '请联系合伙人完善UU配送所需信息';
return $result;
}
$UuMerchantModel = D('RetailUuMerchant');
$openid = $UuMerchantModel->getFindField(array($UuMerchantModel::MERCHANT_ID => $parameter['merchant_id']), $UuMerchantModel::OPENID);
$title = 'http';
if ($_SERVER['HTTPS'] == 'on') {
$title .= 's';
}
$http = $title . '://' . $_SERVER['HTTP_HOST'];
$data = array(
'price_token' => $orderInfo[$UuOrderModel::PRICE_TOKEN],
'order_price' => $orderInfo[$UuOrderModel::TOTAL_MONEY],
'balance_paymoney' => $orderInfo[$UuOrderModel::NEED_PAY_MONEY],
'receiver' => $onlineOrder[$OnlineModel::USER_NAME],
'receiver_phone' => $onlineOrder[$OnlineModel::USER_PHONE],
'push_type' => 0,
'special_type' => $special_type,
'callme_withtake' => 1,
'pubusermobile' => $uu_phone,
'openid' => $openid,
'appid' => $uu_app_id,
'callback_url' => $http . '/index.php/NotifyApi/Uu/orderCallBack',
);
if (!empty($note)) {
$data['note'] = $note;
}
$content = A('Retail/Uudelivery')->addorder($data, $uu_app_key);
$content = json_decode($content, true);
if ($content['return_code'] == 'ok' && $content['appid'] == $data['appid']) {
$save = array(
$UuOrderModel::ORDER_CODE => $content['ordercode'],
$UuOrderModel::STATE => 1
);
$uuSave = $UuOrderModel->updateOrder(array($UuOrderModel::ID => $orderInfo[$UuOrderModel::ID]), $save);
if ($uuSave) {
$res['delivery_record_id'] = $onlineOrder[$OnlineModel::DELIVERY_RECORD_ID];
$res['status'] = 1;
$res['msg'] = '下单成功';
} else {
$res['status'] = 0;
$res['msg'] = '下单成功,订单状态修改失败';
}
} else {
$res['status'] = 0;
$res['msg'] = $content['return_msg'];
}
return $res;
}
/**
* 取消配送
* order_no 订单号
* reason //UU取消配送原因
* reason_id //达达取消配送原因id
*/
public function cancelDelivery($parameter)
{
$order_no = $parameter["order_no"];
$reason = $parameter["reason"] ? $parameter["reason"] : '';
$reason_id = $parameter["reason_id"] ? $parameter["reason_id"] : 0;
$merchant_id = $parameter["merchant_id"];
$store_id = $parameter["store_id"];
if (empty($order_no)) {
$result['status'] = 0;
$result['msg'] = "缺少参数";
return $result;
}
//查询该订单
$BillModel = D('RetailBillOrder');
$bMap = array(
$BillModel::ORDER_NO => strval($order_no),
$BillModel::STORE_ID => $store_id,
$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;
}
$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::DELIVERY_TYPE] == 2 || $onlineOrder[$OnlineModel::DELIVERY_TYPE] == 3) && (empty($reason) && empty($reason_id))) {
$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 1:
$res['status'] = 1;
$res['msg'] = '取消配送成功';
break;
case 2:
//达达配送
$DaMerchantModel = D('RetailDaMerchant');
$result_id = $DaMerchantModel->getFindField(array($DaMerchantModel::MERCHANT_ID => $merchant_id), $DaMerchantModel::RESULT_ID);
if (empty($result_id)) {
$res['status'] = 0;
$res['msg'] = '请先在达达配送注册达达商户';
return $res;
}
$data = array();
$data['order_id'] = $billOrder[$BillModel::ORDER_NO];
$data['cancel_reason_id'] = $reason_id;
$success = A('Retail/DadaCeshi')->formalCancel($deliveryConfig[$DeliveryConfigModel::DA_APP_KEY], $deliveryConfig[$DeliveryConfigModel::DA_APP_SECRET], $result_id, $data);
$success = json_decode($success, true);
if ($success['status'] == 'success') {
$DaOrderModel = D('RetailDaOrder');
$dMap = array(
$DaOrderModel::ID => $onlineOrder[$OnlineModel::DELIVERY_RECORD_ID]
);
$cancel_reason = M('retail_da_reason')->where(array('reasonid' => $reason_id))->getField('reason');
$save_d = array(
$DaOrderModel::DEDUCT_FEE => $success['result']['deduct_fee'],
$DaOrderModel::ORDER_STATUS => 5,
$DaOrderModel::CANCEL_REASON => $cancel_reason,
$DaOrderModel::CANCEL_FROM => 2,
);
$clerk_save = $DaOrderModel->updateOrder($dMap, $save_d);
if (!$clerk_save) {
$res['status'] = 1;
$res['msg'] = $success['msg'] . "订单修改失败";
} else {
$res['status'] = 1;
$res['msg'] = $success['msg'] . "扣除费用" . $success['result']['deduct_fee'] . "元";
}
} else {
$res['status'] = 0;
$res['msg'] = $success['msg'];
}
break;
case 3:
//UU配送
$uu_app_id = $deliveryConfig[$DeliveryConfigModel::UU_APPID];
$uu_ip = $deliveryConfig[$DeliveryConfigModel::UU_IP];
$uu_app_key = $deliveryConfig[$DeliveryConfigModel::UU_APP_KEY];
if (empty($uu_app_id) || empty($uu_ip) || empty($uu_app_key)) {
$result['status'] = 0;
$result['msg'] = '请联系合伙人完善UU配送所需信息';
return $result;
}
$UuOrderModel = D('RetailUuOrder');
$uuMap = array($UuOrderModel::ID => $onlineOrder[$OnlineModel::DELIVERY_RECORD_ID]);
$uu_order_info = $UuOrderModel->getFind($uuMap);
if (!$uu_order_info) {
$res['status'] = 0;
$res['msg'] = '未找到该uu订单';
return $res;
}
$UuMerchantModel = D('RetailUuMerchant');
$openid = $UuMerchantModel->getFindField(array($UuMerchantModel::MERCHANT_ID => $merchant_id), $UuMerchantModel::OPENID);
$data['order_code'] = $uu_order_info[$UuOrderModel::ORDER_CODE];
$data['reason'] = $reason ? $reason : '';
$data['openid'] = $openid;
$data['appid'] = $uu_app_id;
$content = A('Retail/Uudelivery')->cancelorder($data, $uu_app_key);
$content = json_decode($content, true);
if ($content['return_code'] == 'ok' && $content['appid'] == $data['appid']) {
$save = $UuOrderModel->updateOrder($uuMap, array($UuOrderModel::STATE => '-1'));
if ($save) {
$res['status'] = 1;
$res['msg'] = '取消配送成功';
} else {
$res['status'] = 0;
$res['msg'] = '取消成功,订单状态修改失败';
}
} else {
$res['status'] = 0;
$res['msg'] = $content['return_msg'];
}
break;
case 5 :
//码科配送
$MakeClass = new Make();
$res = $MakeClass->cancel_order([
'bill_id' => $billOrder['id'],
'merchant_id' => $merchant_id
]);
$res['msg'] = $res['message'];
break;
default:
$res['status'] = 1;
$res['msg'] = '取消配送成功';
break;
}
if ($res['status'] == 1) {
//购买订单串号库存增加
$SellClass = new Sell();
$SerialClass = new SerialNumberGoods();
$sellSerialResult = $SellClass->distributionGoodsVerify([
'merchant_id' => $merchant_id,
'store_id' => $store_id,
'order_id' => $billOrder['id'],
'type' => 2
]);
switch ($billOrder['order_type']) {
case 1:
if ($sellSerialResult['status'] == 1 && !empty($sellSerialResult['data'])) {
$SerialClass->basisNumberOperation([
'type' => 1,
'store_id' => $store_id,
'goods_list' => $sellSerialResult['data']
]);
}
break;
case 3:
//换货订单商家库存增加
$param = array(
'bill_order' => $billOrder
);
A("Api/Inventory")->CustomerStockInc($param);
break;
}
//删除已配送串号信息
if ($sellSerialResult['status'] == 1 && !empty($sellSerialResult['data'])) {
$SerialClass->sellSerialNumOperation([
'id' => array_column($sellSerialResult['data'], 'id'),
'type' => 1,
'option_type' => 2
]);
//出库记录串号信息删除
$sell_id_arr = array_column($sellSerialResult['data'], 'id');
if (!empty($sell_id_arr)) {
$StockRecordClass = new StockRecord();
$outsideResult = $StockRecordClass->basisSellStockRecord([
'store_id' => $store_id,
'sell_id' => $sell_id_arr
]);
$outside_id_arr = $outsideResult['data'];
if (!empty($outside_id_arr)) {
$new_outside_id_arr = array_column($outside_id_arr, 'id');
$SerialClass->basisOutIdStockSerialDelete([
'outside_id' => $new_outside_id_arr,
'merchant_id' => $merchant_id,
'store_id' => $store_id,
]);
}
}
}
$saveOnline = array(
$OnlineModel::DELIVERY_TYPE => 1,//配送方式
$OnlineModel::DELIVERY_RECORD_ID => 0,//配送id
$OnlineModel::STATUS => 1,//状态:未发货
$OnlineModel::CANCEL_DELIVERY_STATUS => 2,//1取消过配送
);
}
$OnlineModel->updateOrder($oMap, $saveOnline);
return $res;
}
}