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