898 行
41 KiB
PHP
可执行文件
898 行
41 KiB
PHP
可执行文件
<?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;
|
||
}
|
||
|
||
|
||
} |