mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-22 10:25:35 +08:00
1661 lines
62 KiB
PHP
1661 lines
62 KiB
PHP
<?php
|
||
/**
|
||
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
|
||
*
|
||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
* you may not use this file except in compliance with the License.
|
||
* You may obtain a copy of the License at
|
||
*
|
||
* http://www.apache.org/licenses/LICENSE-2.0
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software
|
||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
* See the License for the specific language governing permissions and
|
||
* limitations under the License.
|
||
*/
|
||
|
||
class console_ctl_admin_delivery extends desktop_controller {
|
||
|
||
var $name = "发货单列表";
|
||
var $workground = "console_center";
|
||
|
||
/**
|
||
* 发货单列表
|
||
*/
|
||
function index(){
|
||
$_GET['view'] = intval($_GET['view']);
|
||
$user = kernel::single('desktop_user');
|
||
|
||
$actions = array();
|
||
$base_filter = array(
|
||
'type' => array('normal'),
|
||
'pause' => 'false',
|
||
'parent_id' => 0,
|
||
'disabled' => 'false',
|
||
);
|
||
|
||
$base_filter = array_merge($base_filter,$_GET);
|
||
|
||
switch ($_GET['view']) {
|
||
case '0':
|
||
case '7':
|
||
$actions[] = array(
|
||
'label' => '发送至第三方',
|
||
'submit' => $this->url.'&act=batchSyncWms',
|
||
'target'=>'dialog::{width:600,height:200,title:\'批量对勾选的发货单发送至WMS仓储\'}"',
|
||
);
|
||
|
||
$actions[] = array(
|
||
'label' => '批量撤销发货单',
|
||
'submit' => $this->url.'&act=batchDeliveryCancel',
|
||
'target'=>'dialog::{width:600,height:200,title:\'撤销当前发货单后,订单的确认状态将随之改变,确定要取消吗?\'}"',
|
||
);
|
||
break;
|
||
case '6':
|
||
$actions[] = array(
|
||
'label' => app::get('ome')->_('查询发货单'),
|
||
'submit' => "index.php?app=console&ctl=admin_delivery&act=toBatchSearch",
|
||
'target' => 'dialog::{width:600,height:250,title:\'查询发货单\'}',
|
||
);
|
||
break;
|
||
case '1':
|
||
case '2':
|
||
case '8':
|
||
$actions[] = array(
|
||
'label' => '更新WMS签收状态',
|
||
'submit' => 'index.php?app=console&ctl=admin_delivery&act=batch_sign',
|
||
'confirm' => '你确定要对勾选的发货单更新WMS发货状态为签收吗?',
|
||
'target' => 'refresh',
|
||
);
|
||
|
||
/***
|
||
* @todo:[禁止使用此按钮]升级大版本,sdb_ome_delivery表中logi_status字段加属性,好莱客户刷不动;
|
||
*
|
||
* $actions[] = array(
|
||
'label' => '物流拦截',
|
||
'submit' => $this->url.'&act=logisticsInterception',
|
||
'target'=>'dialog::{width:600,height:200,title:\'批量对勾选的发货单进行物流拦截\'}"',
|
||
);
|
||
***/
|
||
break;
|
||
}
|
||
|
||
if($user->has_permission('console_process_receipts_print_export'))
|
||
{
|
||
$base_filter_str = http_build_query($base_filter);
|
||
if ($_GET['view'] == '0') {
|
||
$query_status = 'progress';
|
||
}elseif($_GET['view'] == '2'){
|
||
$query_status = 'succ';
|
||
}
|
||
$actions[] = array(
|
||
'label'=>'导出',
|
||
'submit'=>'index.php?app=omedlyexport&ctl=ome_delivery&act=index&action=export&status='.$query_status,
|
||
'target'=>'dialog::{width:600,height:300,title:\'导出\'}'
|
||
);
|
||
}
|
||
|
||
//[京东一件发代]通知催京东WMS仓储提前发货通知
|
||
if($_GET['view'] == '0'){
|
||
$actions[] = array(
|
||
'label' => '通知京东云交易发货',
|
||
'submit' => 'index.php?app=console&ctl=admin_delivery&act=batch_makedly',
|
||
'confirm' => '你确定要对勾选的发货单,通知京东云交易平台提前发货吗?',
|
||
'target' => 'refresh',
|
||
);
|
||
}
|
||
|
||
//check shop permission
|
||
$organization_permissions = kernel::single('desktop_user')->get_organization_permission();
|
||
if($organization_permissions){
|
||
$base_filter['org_id'] = $organization_permissions;
|
||
}
|
||
|
||
$params = array(
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_import'=>false,
|
||
'use_buildin_export'=>false,
|
||
'use_buildin_filter'=>true,
|
||
'use_view_tab'=>true,
|
||
'actions' => $actions,
|
||
'title'=>'发货单',
|
||
'base_filter' => $base_filter,
|
||
'object_method' => [
|
||
'count' => 'finder_count',
|
||
'getlist' => 'finder_getList',
|
||
],
|
||
);
|
||
|
||
$this->finder('console_mdl_delivery', $params);
|
||
}
|
||
|
||
//未发货 已发货 全部
|
||
function _views(){
|
||
$oDelivery = app::get('ome')->model('delivery');
|
||
$base_filter = array(
|
||
'type' => array('normal'),
|
||
'pause' => 'false',
|
||
'parent_id' => 0,
|
||
'disabled' => 'false',
|
||
);
|
||
|
||
$sub_menu = array(
|
||
0 => array('label'=>app::get('base')->_('待发货'),'filter'=>array('process'=>array('false'),'status'=>array('progress','ready')),'optional'=>false),
|
||
1 => array('label'=>app::get('base')->_('全部'),'filter'=>array('status' => array('ready','progress','succ','return_back')),'optional'=>false),
|
||
2 => array('label' => app::get('base')->_('已发货'), 'filter' => array('process' => array('true'), 'status' => 'succ'), 'optional' => false),
|
||
3 => array('label' => app::get('base')->_('待取件'), 'filter' => array('logi_status' => array('5'), 'process' => array('true'), 'status' => 'succ'), 'optional' => false),
|
||
4 => array('label' => app::get('base')->_('已揽收'), 'filter' => array('logi_status' => array('1'), 'process' => array('true'), 'status' => 'succ'), 'optional' => false),
|
||
5 => array('label' => app::get('base')->_('已签收'), 'filter' => array('logi_status' => array('3'), 'process' => array('true'), 'status' => 'succ'), 'optional' => false),
|
||
8 => array('label' => app::get('base')->_('截单失败'), 'filter' => array('logi_status' => array('8'), 'process' => array('true'), 'status' => 'succ'), 'optional' => false),
|
||
);
|
||
|
||
$branch_ids = $this->getSearchBranchids();
|
||
if($branch_ids) {
|
||
$sub_menu[6] = array('label'=>app::get('base')->_('京仓待发货'),'filter'=>array('process'=>array('false'),'status'=>array('progress','ready'),'branch_id'=>$branch_ids),'optional'=>false);
|
||
$sub_menu[7] = array('label'=>app::get('base')->_('京仓失败'),'filter'=>array('process'=>array('false'),'status'=>array('progress','ready'),'branch_id'=>$branch_ids,'sync_status'=>array('9')),'optional'=>false);
|
||
}
|
||
|
||
//check shop permission
|
||
$organization_permissions = kernel::single('desktop_user')->get_organization_permission();
|
||
if($organization_permissions){
|
||
$base_filter['org_id'] = $organization_permissions;
|
||
}
|
||
|
||
foreach($sub_menu as $k=>$v){
|
||
if (!IS_NULL($v['filter'])){
|
||
$v['filter'] = array_merge($v['filter'], $base_filter);
|
||
}
|
||
|
||
$sub_menu[$k]['filter'] = $v['filter']?$v['filter']:null;
|
||
$sub_menu[$k]['addon'] = 'showtab';
|
||
$sub_menu[$k]['href'] = 'index.php?app=console&ctl='.$_GET['ctl'].'&act='.$_GET['act'].'&view='.$k;
|
||
}
|
||
|
||
return $sub_menu;
|
||
}
|
||
|
||
|
||
/**
|
||
* 发送至第三方
|
||
* @
|
||
* @
|
||
* @access public
|
||
* @author sunjing@shopex.cn
|
||
*/
|
||
function batch_sync()
|
||
{
|
||
@ini_set('memory_limit','512M');
|
||
set_time_limit(0);
|
||
|
||
// $this->begin('');
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$this->splash('error', null, '不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(count($ids) > 500){
|
||
$this->splash('error', null, '每次最多只能选择500条!');
|
||
}
|
||
|
||
if (!empty($ids)) {
|
||
//获取京东一件代发的仓库列表
|
||
$branchLib = kernel::single('ome_branch');
|
||
$wms_type = 'yjdf';
|
||
$error_msg = '';
|
||
$yjdfBranchList = $branchLib->getWmsBranchIds($wms_type, $error_msg);
|
||
|
||
//list
|
||
$error_msg = '';
|
||
$existRefund = array();
|
||
$syncDlyIds = array();
|
||
foreach ($ids as $deliveryid) {
|
||
$filter = array(
|
||
'delivery_id'=>$deliveryid,
|
||
'stock_status'=>'false',
|
||
'deliv_status'=>'false',
|
||
'expre_status'=>'false',
|
||
'pause'=>'false',
|
||
'process'=>'false',
|
||
'status'=>array('progress','ready'),
|
||
);
|
||
$delivery = $deliveryObj->dump($filter, 'delivery_bn,sync_status,branch_id,original_delivery_bn');
|
||
if(empty($delivery)){
|
||
continue;
|
||
}
|
||
|
||
//京东一件代发WMS仓库
|
||
$branch_id = $delivery['branch_id'];
|
||
$isYjdfFlag = ($yjdfBranchList[$branch_id] ? true : false);
|
||
|
||
//已经有第三方订单号,不允许重复推送
|
||
if($isYjdfFlag && $delivery['original_delivery_bn']){
|
||
continue;
|
||
}
|
||
|
||
//推送失败的发货单,检查订单是否已经申请退款
|
||
if($delivery['sync_status'] == '2' || $isYjdfFlag){
|
||
//订单信息
|
||
//@todo:发货单未同步第三方仓储,并且申请退款的订单直接取消发货单
|
||
$sql = "SELECT b.order_id, b.process_status, b.status, b.pay_status FROM `sdb_ome_delivery_order` AS a
|
||
LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.delivery_id=". $deliveryid;
|
||
$orderInfo = $deliveryObj->db->selectrow($sql);
|
||
if(in_array($orderInfo['pay_status'], array('5', '6', '7'))){
|
||
$existRefund[] = $delivery['delivery_bn'];
|
||
}
|
||
}
|
||
|
||
//推送的发货单
|
||
$syncDlyIds[] = $deliveryid;
|
||
|
||
//request
|
||
ome_delivery_notice::create($deliveryid);
|
||
}
|
||
|
||
//错误信息
|
||
if($existRefund){
|
||
$error_msg .= '发货单号:'. implode(',', $existRefund) .'已经申请退款或已退款,请检查!';
|
||
}
|
||
|
||
//没有可推送的发货单
|
||
if(empty($syncDlyIds)){
|
||
$error_msg .= '没有可推送的发货单(默认会过滤已有第三方单号、有退款的发货单)';
|
||
}
|
||
|
||
if($error_msg){
|
||
$this->splash('error', null, $error_msg);
|
||
}
|
||
}
|
||
|
||
$this->splash('success', null, '命令已经被成功发送!!');
|
||
}
|
||
|
||
|
||
/**
|
||
* 撤销订单
|
||
* @param
|
||
* @return
|
||
* @access public
|
||
* @author sunjing@shopex.cn
|
||
*/
|
||
function pauseorder()
|
||
{
|
||
$is_super = kernel::single('desktop_user')->is_super();
|
||
if ($is_super) {
|
||
|
||
$this->page('admin/pauseorder.html');
|
||
}else{
|
||
echo '非管理员不可操作';
|
||
}
|
||
}
|
||
|
||
function back(){
|
||
$this->begin();
|
||
$is_super = kernel::single('desktop_user')->is_super();
|
||
if (!$is_super) {
|
||
$this->end(false, '非超级管理员不可操作');
|
||
}
|
||
if (empty($_POST['select_bn']) && empty($_POST['bn_select'])){
|
||
$this->end(false, '请输入正确的单号');
|
||
}
|
||
$autohide = array('autohide'=>3000);
|
||
$Objdly = app::get('ome')->model('delivery');
|
||
$OiObj = app::get('ome')->model('delivery_items');
|
||
$ObjdlyOrder = app::get('ome')->model('delivery_order');
|
||
|
||
if($_POST['select_bn']=='order_bn'){
|
||
$select_type = 'order_bn';
|
||
$detail = $Objdly->getDeliveryByOrderBn($_POST['bn_select']);
|
||
if (!$detail) {
|
||
$this->end(false, '发货单未生成 不走此流程', '', $autohide);
|
||
}
|
||
$detail['consignee']['name'] = $detail['ship_name'];
|
||
$detail['consignee']['area'] = $detail['ship_area'];
|
||
$detail['consignee']['province'] = $detail['ship_province'];
|
||
$detail['consignee']['city'] = $detail['ship_name'];
|
||
$detail['consignee']['district'] = $detail['ship_district'];
|
||
$detail['consignee']['addr'] = $detail['ship_addr'];
|
||
$detail['consignee']['zip'] = $detail['ship_zip'];
|
||
$detail['consignee']['telephone'] = $detail['ship_telephone'];
|
||
$detail['consignee']['mobile'] = $detail['ship_mobile'];
|
||
$detail['consignee']['email'] = $detail['ship_email'];
|
||
$detail['consignee']['r_time'] = $detail['ship_name'];
|
||
}
|
||
$items = $OiObj->getList('*',array('delivery_id'=>$detail['delivery_id']));
|
||
if(empty($detail)){
|
||
$this->end(false, '没有该单号的发货单', '', $autohide);
|
||
}
|
||
if($detail['status'] == 'back'){
|
||
$this->end(false, '该发货单已经被打回,无法继续操作', '', $autohide);
|
||
}
|
||
#获取订单
|
||
$order_bn = $ObjdlyOrder->getOrderInfo('order_bn',$detail['delivery_id']);
|
||
if($detail['status'] == 'cancel'){
|
||
$this->end(false, '该发货单已经被取消,无法继续操作'."<br>".'订单号:'.$order_bn[0]['order_bn'], '', $autohide);
|
||
}
|
||
if($detail['delivery_logi_number'] > 0){
|
||
$this->end(false, '该发货单已部分发货,无法继续操作', '', $autohide);
|
||
}
|
||
if($detail['pause'] == 'true'){
|
||
$this->end(false, '该发货单已暂停,无法继续操作', '', $autohide);
|
||
}
|
||
if($detail['process'] == 'true'){
|
||
$this->end(false, '该发货单已经发货,无法继续操作', '', $autohide);
|
||
}
|
||
|
||
$basicMaterialLib = kernel::single('material_basic_material');
|
||
|
||
foreach($items as $k=>$value)
|
||
{
|
||
$barcode = $basicMaterialLib->getBasicMaterialCode($value['product_id']);
|
||
$items[$k]['barcode'] = $barcode;
|
||
}
|
||
|
||
if(($detail['stock_status']=='true') || ($detail['deliv_status']=='true') || ($detail['expre_status']=='true')){
|
||
$this->pagedata['is_confirm'] = true;
|
||
}
|
||
if($detail['is_bind']=='true'){
|
||
$countinfo = $Objdly->getList('count(parent_id)',array('parent_id'=>$detail['delivery_id']));
|
||
$count = $countinfo[0]['count(parent_id)'];
|
||
$this->pagedata['height'] = 372+26*$count;
|
||
}
|
||
$this->pagedata['select_type'] = $select_type;
|
||
$this->pagedata['bn_select'] = $_POST['bn_select'];
|
||
$this->pagedata['items'] = $items;
|
||
$this->pagedata['detail'] = $detail;
|
||
$this->page('admin/pauseorder.html');
|
||
}
|
||
|
||
/**
|
||
* 打回操作
|
||
*
|
||
*/
|
||
function doReback()
|
||
{
|
||
$autohide = array('autohide'=>3000);
|
||
$this->begin('index.php?app=ome&ctl=admin_delivery&showmemo&p[0]='.$_POST['id']);
|
||
$is_super = kernel::single('desktop_user')->is_super();
|
||
if (!$is_super) {
|
||
$this->end(false, '非超级管理员不可操作');
|
||
}
|
||
if (empty($_POST['id']) && !empty($_POST['flag'])){
|
||
$this->end(false, '请选择至少一张发货单', '', $autohide);
|
||
}
|
||
if (empty($_POST['memo'])){
|
||
$this->end(false, '备注请不要留空', '', $autohide);
|
||
}
|
||
$delivery_id = $_POST['delivery_id'];
|
||
$dlyObj = app::get('ome')->model("delivery");
|
||
$orderObj = app::get('ome')->model("orders");
|
||
$oOperation_log = app::get('ome')->model('operation_log');
|
||
|
||
$deliveryInfo = $dlyObj->dump($delivery_id,'*',array('delivery_items'=>array('*')));
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'status' => 'cancel',
|
||
'logi_id' => '0',
|
||
'logi_name' => '',
|
||
'logi_no' => NULL,
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'],'发货单撤销');
|
||
|
||
//库存管控
|
||
$storeManageLib = kernel::single('ome_store_manage');
|
||
$storeManageLib->loadBranch(array('branch_id'=>$deliveryInfo['branch_id']));
|
||
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
$err_msg = '';
|
||
|
||
//是否是合并发货单
|
||
if($deliveryInfo['is_bind'] == 'true'){
|
||
//取关联发货单号进行暂停
|
||
$delivery_ids = $dlyObj->getItemsByParentId($deliveryInfo['delivery_id'],'array');
|
||
if($delivery_ids){
|
||
foreach ($delivery_ids as $id){
|
||
$tmpdly = array(
|
||
'delivery_id' => $id,
|
||
'status' => 'cancel',
|
||
'logi_id' => '0',
|
||
'logi_name' => '',
|
||
'logi_no' => NULL,
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$id,'发货单撤销');
|
||
|
||
$delivery = $dlyObj->dump($id,'delivery_id,branch_id,shop_id',array('delivery_items'=>array('*'),'delivery_order'=>array('*')));
|
||
|
||
$de = $delivery['delivery_order'];
|
||
$or = array_shift($de);
|
||
$ord_id = $or['order_id'];
|
||
|
||
//仓库库存处理
|
||
$params['params'] = array_merge($delivery,array('order_id'=>$ord_id));
|
||
$params['node_type'] ='cancelDly';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($id);
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行还原
|
||
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order['order_id'] = $id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
$orderObj->save($order);
|
||
$oOperation_log->write_log('order_modify@ome',$id,'发货单撤销,订单还原需重新审核,备注:'.$_POST['memo']);
|
||
}
|
||
}
|
||
}else{
|
||
//还原当前订单
|
||
$order_id = $order_ids[0];
|
||
$order['order_id'] = $order_id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
|
||
$orderObj->save($order);
|
||
$oOperation_log->write_log('order_modify@ome',$order_id,'发货单撤销,订单还原需重新审核,备注:'.$_POST['memo']);
|
||
|
||
//仓库库存处理
|
||
$params['params'] = array_merge($deliveryInfo,array('order_id'=>$order_id));
|
||
$params['node_type'] ='cancelDly';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($deliveryInfo['delivery_id']);
|
||
}
|
||
//冻结库存释放
|
||
$this->end(true, '操作成功', 'index.php?app=console&ctl=admin_delivery&act=pauseorder', $autohide);
|
||
}
|
||
|
||
/**
|
||
* 填写打回备注
|
||
*
|
||
* @param bigint $dly_id
|
||
*/
|
||
function showmemo($dly_id){
|
||
$deliveryObj = app::get('ome')->model("delivery");
|
||
$dly = $deliveryObj->dump($dly_id,'is_bind,delivery_bn');
|
||
|
||
if ($dly['is_bind'] == 'true'){
|
||
$ids = $deliveryObj->getItemsByParentId($dly_id, 'array');
|
||
$returnids = implode(',', $ids);
|
||
$idd = array();
|
||
if ($ids){
|
||
foreach ($ids as $v){
|
||
$delivery = $deliveryObj->dump($v, 'delivery_bn');
|
||
$order_id = $deliveryObj->getOrderBnbyDeliveryId($v);
|
||
$idd[$v]['delivery_bn'] = $delivery['delivery_bn'];
|
||
$idd[$v]['order_bn'] = $order_id['order_bn'];
|
||
$idd[$v]['delivery_id'] = $v;
|
||
}
|
||
}
|
||
$this->pagedata['returnids'] = $returnids;
|
||
$this->pagedata['ids'] = $ids;
|
||
$this->pagedata['idd'] = $idd;
|
||
}
|
||
$this->pagedata['delivery_id'] = $dly_id;
|
||
$this->pagedata['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->display("admin/delivery_showmemo.html");
|
||
}
|
||
|
||
/**
|
||
* 强制撤销第三方仓储发货单
|
||
*
|
||
* return
|
||
*/
|
||
public function deliveryCancel()
|
||
{
|
||
$this->begin('');
|
||
|
||
$operLogObj = app::get('ome')->model('operation_log');
|
||
|
||
$limit = 500;
|
||
$deliveryIds = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$this->end(false, '不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(empty($deliveryIds)){
|
||
$this->end(false, '请选择需要操作的订单!');
|
||
}
|
||
|
||
if(count($deliveryIds) > $limit){
|
||
$this->end(false, '一次最多可执行500单!');
|
||
}
|
||
|
||
$Objdly = app::get('ome')->model('delivery');
|
||
|
||
if (!empty($deliveryIds)) {
|
||
$delivery_list = kernel::database()->select("SELECT delivery_id,branch_id,delivery_bn from sdb_ome_delivery where delivery_id in (" . join(',', $deliveryIds) . " ) AND status in('ready','progress') AND parent_id=0");
|
||
foreach ((array) $delivery_list as $delivery)
|
||
{
|
||
$delivery_id = $delivery['delivery_id'];
|
||
|
||
$res = ome_delivery_notice::cancel($delivery, true);
|
||
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
|
||
$data = array(
|
||
'status'=>'cancel',
|
||
'memo'=>'批量取消请求!',
|
||
'delivery_bn'=>$delivery['delivery_bn'],
|
||
);
|
||
kernel::single('ome_event_receive_delivery')->update($data);
|
||
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '手工批量取消发货单');
|
||
}else{
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '手工批量取消发货单,失败:'.$res['msg']);
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->end(true, '批量撤销发货单成功');
|
||
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* toBatchSearch
|
||
* @return mixed 返回值
|
||
*/
|
||
public function toBatchSearch()
|
||
{
|
||
$base_filter = array(
|
||
'type' => array('normal'),
|
||
'pause' => 'false',
|
||
'parent_id' => 0,
|
||
'disabled' => 'false',
|
||
'status' => array('ready','progress'),
|
||
);
|
||
$branch_ids = $this->getSearchBranchids();
|
||
if ($branch_ids){
|
||
$base_filter['branch_id'] = $branch_ids;
|
||
}
|
||
$_POST = array_merge($_POST, $base_filter);
|
||
|
||
|
||
$this->pagedata['request_url'] = $this->url.'&act=doBatchSearch';
|
||
|
||
parent::dialog_batch('console_mdl_delivery',true);
|
||
}
|
||
|
||
/**
|
||
* 查询京东沧海发货结果
|
||
* sunjing
|
||
*/
|
||
public function doBatchSearch()
|
||
{
|
||
|
||
parse_str($_POST['primary_id'], $postdata);
|
||
|
||
if (!$postdata['f']) { echo 'Error: 请先选择发货单';exit;}
|
||
|
||
$retArr = array(
|
||
'itotal' => 0,
|
||
'isucc' => 0,
|
||
'ifail' => 0,
|
||
'err_msg' => array(),
|
||
);
|
||
|
||
$deliveryMdl = app::get('ome')->model('delivery');
|
||
|
||
$deliverys = $deliveryMdl->getList('delivery_id,delivery_bn,branch_id', $postdata['f'], $postdata['f']['offset'], $postdata['f']['limit']);
|
||
|
||
$deliverys = array_column($deliverys, null, 'delivery_id');
|
||
|
||
if (!$deliverys) {echo 'Error: 未查询到发货单';exit;}
|
||
|
||
$retArr['itotal'] = count($deliverys);
|
||
foreach ($deliverys as $delivery) {
|
||
|
||
$wms_id = kernel::single('ome_branch')->getWmsIdById($delivery['branch_id']);
|
||
$notice_params = array(
|
||
'delivery_bn' => $delivery['delivery_bn'],
|
||
'delivery_id' => $delivery['delivery_id'],
|
||
'branch_id' => $delivery['branch_id'],
|
||
'wms_id' => $wms_id,
|
||
|
||
);
|
||
|
||
$result = ome_delivery_notice::search($notice_params, true);
|
||
if($result['rsp'] == 'succ'){
|
||
$retArr['isucc']++;
|
||
}else{
|
||
$retArr['ifail']++;
|
||
}
|
||
|
||
}
|
||
|
||
echo json_encode($retArr),'ok.';exit;
|
||
|
||
}
|
||
|
||
/**
|
||
* 获取SearchBranchids
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getSearchBranchids(){
|
||
$channelObj = app::get('channel')->model('channel');
|
||
$channel_list = $channelObj->getlist('channel_id',array('node_type'=>array('yph','jd_wms_cloud')));
|
||
if(empty($channel_list)) {
|
||
return array();
|
||
}
|
||
$channel_ids = array_map('current', $channel_list);
|
||
|
||
$branch_list = $channelObj->db->select("SELECT branch_id FROM sdb_ome_branch WHERE wms_id in (".implode(',',$channel_ids).")");
|
||
|
||
$branch_ids = array_map('current', $branch_list);
|
||
return $branch_ids;
|
||
}
|
||
|
||
/**
|
||
* 加密字段显示明文
|
||
*
|
||
* @return void
|
||
* @author
|
||
* */
|
||
public function showSensitiveData($delivery_id, $fieldType='')
|
||
{
|
||
// if (!kernel::single('desktop_user')->has_permission('sensitive_data_show')) {
|
||
// $this->splash('error',null,'您无权查看该数据');
|
||
// }
|
||
|
||
$deliveryMdl = app::get('console')->model('delivery');
|
||
|
||
$delivery = $deliveryMdl->db_dump($delivery_id,'shop_id,shop_type,ship_name,ship_tel,ship_mobile,ship_addr,delivery_id,delivery_bn,member_id,ship_province,ship_city,ship_district,memo');
|
||
|
||
if ($delivery['member_id']) {
|
||
$member = app::get('ome')->model('members')->db_dump($delivery['member_id'],'uname');
|
||
|
||
$delivery['uname'] = $member['uname'];
|
||
}
|
||
|
||
|
||
$order_ids = $deliveryMdl->getOrderIdByDeliveryId($delivery['delivery_id']);
|
||
|
||
$order = app::get('ome')->model('orders')->db_dump(array ('order_id' => $order_ids),'order_bn');
|
||
$delivery['order_bn'] = $order['order_bn'];
|
||
|
||
// 处理加密
|
||
$delivery['encrypt_body'] = kernel::single('ome_security_router',$delivery['shop_type'])->get_encrypt_body($delivery, 'delivery', $fieldType);
|
||
|
||
// 推送日志
|
||
// kernel::single('base_hchsafe')->order_log(array('operation'=>'查看发货单收货人信息','tradeIds'=>array($delivery['delivery_bn'])));
|
||
|
||
|
||
$this->splash('success',null,null,'redirect',$delivery);
|
||
}
|
||
|
||
/**
|
||
* 查询京东包裹发货状态
|
||
*/
|
||
public function selectPackageStatus($delivery_id)
|
||
{
|
||
header("cache-control:no-store,no-cache,must-revalidate");
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$rePackageObj = app::get('ome')->model('reship_package');
|
||
|
||
$deliveryLib = kernel::single('console_delivery');
|
||
$branchLib = kernel::single('ome_branch');
|
||
|
||
$delivery_id = intval($delivery_id);
|
||
$reship_id = intval($_GET['reship_id']);
|
||
|
||
//[兼容]通过退货单号查询
|
||
$show_cancel = false;
|
||
if($reship_id && empty($delivery_id))
|
||
{
|
||
$tempInfo = $rePackageObj->dump(array('reship_id'=>$reship_id), '*');
|
||
$delivery_id = $tempInfo['delivery_id'];
|
||
|
||
$show_cancel = true;
|
||
}
|
||
|
||
//发货单信息
|
||
$deliveryInfo = $deliveryObj->dump(array('delivery_id'=>$delivery_id), '*');
|
||
if(empty($deliveryInfo)){
|
||
die('发货单不存在.');
|
||
}
|
||
|
||
//wms_id
|
||
$channel_id = $branchLib->getWmsIdById($deliveryInfo['branch_id']);
|
||
|
||
//branch_bn
|
||
$branch_bn = $branchLib->getBranchBnById($deliveryInfo['branch_id']);
|
||
|
||
//package
|
||
$error_msg = '';
|
||
$packageList = $deliveryLib->getDeliveryPackage($delivery_id, $error_msg);
|
||
if(empty($packageList)){
|
||
die('没有找到包裹或者包裹已追回。');
|
||
}
|
||
|
||
//获取京东包裹发货状态
|
||
$shipping_status = $deliveryLib->getShippingStatus();
|
||
|
||
//查询配送状态
|
||
$dataList = array();
|
||
foreach ($packageList as $key => $val)
|
||
{
|
||
$package_bn = $val['package_bn'];
|
||
|
||
$params = array(
|
||
'delivery_id' => $val['delivery_id'],
|
||
'delivery_bn' => $deliveryInfo['delivery_bn'],
|
||
'branch_bn' => $branch_bn,
|
||
'package_id' => $val['package_id'],
|
||
'package_bn' => $package_bn,
|
||
);
|
||
$result = kernel::single('erpapi_router_request')->set('wms', $channel_id)->delivery_package_status($params);
|
||
$ship_status = '';
|
||
if($result['rsp'] == 'succ'){
|
||
$ship_status = $result['data']['orderStatus'];
|
||
$result['data']['status_str'] = ($ship_status ? $shipping_status[$ship_status] : '没有发货状态值');
|
||
}
|
||
|
||
//是否需要拦截包裹
|
||
if(in_array($ship_status, array('-100', '8', '16', '18'))){
|
||
$show_cancel = false;
|
||
}
|
||
|
||
$dataList[$package_bn] = $result;
|
||
}
|
||
|
||
$this->pagedata['dataList'] = $dataList;
|
||
$this->pagedata['show_cancel'] = $show_cancel;
|
||
$this->pagedata['reship_id'] = $reship_id;
|
||
$this->singlepage("admin/delivery/package_status.html");
|
||
}
|
||
|
||
|
||
/**
|
||
* 通知京东云交易平台提前发货
|
||
*/
|
||
public function batch_makedly()
|
||
{
|
||
// $this->begin('');
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$packageObj = app::get('ome')->model('delivery_package');
|
||
$channelObj = app::get('channel')->model('channel');
|
||
$operLogObj = app::get('ome')->model('operation_log');
|
||
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$this->splash('error', null, '不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(count($ids) > 500){
|
||
$this->splash('error', null, '每次最多只能选择500条!');
|
||
}
|
||
|
||
//获取京东一件代发WMS仓储
|
||
$sql = "SELECT channel_id FROM `sdb_channel_channel` WHERE node_type='yjdf'";
|
||
$tempList = $deliveryObj->db->select($sql);
|
||
if(empty($tempList)){
|
||
$this->splash('error', null, '没有获取到[京东一件代发]WMS仓储!');
|
||
}
|
||
|
||
$channel_ids = array();
|
||
foreach ($tempList as $key => $val)
|
||
{
|
||
$channel_id = $val['channel_id'];
|
||
|
||
$channel_ids[$channel_id] = $channel_id;
|
||
}
|
||
|
||
//仓库
|
||
$branchList = array();
|
||
$sql = "SELECT branch_id,branch_bn FROM `sdb_ome_branch` WHERE wms_id IN(". implode(',', $channel_ids) .")";
|
||
$tempList = $deliveryObj->db->select($sql);
|
||
if(empty($tempList)){
|
||
$this->splash('error', null, '没有获取到[京东一件代发]关联的仓库!');
|
||
}
|
||
|
||
foreach ($tempList as $key => $val)
|
||
{
|
||
$branch_id = $val['branch_id'];
|
||
|
||
$branchList[$branch_id] = $val['branch_bn'];
|
||
}
|
||
|
||
//发货单
|
||
$deliveryList = $deliveryObj->getList('delivery_id,delivery_bn,branch_id,sync_status', array('delivery_id'=>$ids, 'status'=>array('progress','ready')));
|
||
if(empty($deliveryList)){
|
||
$this->splash('error', null, '没有获取到可操作的发货单!');
|
||
}
|
||
|
||
//list
|
||
$syncDlyIds = array();
|
||
$syncErrorDly = array();
|
||
foreach ($deliveryList as $key => $val)
|
||
{
|
||
$delivery_id = $val['delivery_id'];
|
||
$branch_id = $val['branch_id'];
|
||
|
||
//只处理指定仓库
|
||
if(empty($branchList[$branch_id])){
|
||
continue;
|
||
}
|
||
|
||
//过滤通知发货成功
|
||
if($val['sync_status'] == '12'){
|
||
continue;
|
||
}
|
||
|
||
//推送创建发货单失败的场景
|
||
if($val['sync_status'] == '2'){
|
||
$packageInfo = $packageObj->dump(array('delivery_id'=>$delivery_id), 'package_id');
|
||
if(empty($packageInfo)){
|
||
continue; //没有京东订单号(包裹号),则跳过
|
||
}
|
||
}
|
||
|
||
//delivery_id
|
||
$syncDlyIds[] = $delivery_id;
|
||
|
||
//request
|
||
$error_msg = '';
|
||
$result = ome_delivery_notice::notification($delivery_id, $error_msg);
|
||
if($result === false){
|
||
$syncErrorDly[] = $val['delivery_bn'];
|
||
|
||
$error_msg = '手动通知云交易发货失败:'. $error_msg;
|
||
$operLogObj->write_log('delivery_modify@ome', $delivery_id, $error_msg);
|
||
}
|
||
}
|
||
|
||
/****
|
||
if($syncErrorDly){
|
||
$error_msg = '发货单号:'. implode(',', $syncErrorDly) .'推荐失败,请查看发货单日志!';
|
||
|
||
$this->end(false, $error_msg);
|
||
}
|
||
***/
|
||
|
||
if(empty($syncDlyIds)){
|
||
$this->splash('error', null, '没有需要通知的发货单(默认已过滤通知成功、没有京东订单号的记录)。');
|
||
}
|
||
|
||
$this->splash('success', null, '命令已经被成功发送!!');
|
||
}
|
||
|
||
/**
|
||
* [京东云交易]更新WMS发货单为签收状态
|
||
*/
|
||
public function batch_sign()
|
||
{
|
||
@ini_set('memory_limit','512M');
|
||
set_time_limit(0);
|
||
|
||
// $this->begin('');
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$packageObj = app::get('ome')->model('delivery_package');
|
||
$channelObj = app::get('channel')->model('channel');
|
||
$operLogObj = app::get('ome')->model('operation_log');
|
||
|
||
$deliveryLib = kernel::single('console_delivery');
|
||
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$this->splash('error', null, '不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(count($ids) > 500){
|
||
$this->splash('error', null, '每次最多只能选择500条!');
|
||
}
|
||
|
||
//获取京东一件代发WMS仓储
|
||
$sql = "SELECT channel_id FROM `sdb_channel_channel` WHERE node_type='yjdf'";
|
||
$channelInfo = $deliveryObj->db->selectrow($sql);
|
||
if(empty($channelInfo)){
|
||
$this->splash('error', null, '没有获取到[京东一件代发]WMS仓储!');
|
||
}
|
||
$channel_id = $channelInfo['channel_id'];
|
||
|
||
//[京东一件代发]仓库
|
||
$branchList = array();
|
||
$sql = "SELECT branch_id,branch_bn FROM `sdb_ome_branch` WHERE wms_id=". $channel_id;
|
||
$tempList = $deliveryObj->db->select($sql);
|
||
if(empty($tempList)){
|
||
$this->splash('error', null, '没有获取到[京东一件代发]关联的仓库!');
|
||
}
|
||
|
||
foreach ($tempList as $key => $val)
|
||
{
|
||
$branch_id = $val['branch_id'];
|
||
|
||
$branchList[$branch_id] = $val['branch_bn'];
|
||
}
|
||
|
||
//发货单
|
||
$tempList = $deliveryObj->getList('delivery_id,delivery_bn,branch_id', array('delivery_id'=>$ids, 'status'=>'succ'));
|
||
if(empty($tempList)){
|
||
$this->splash('error', null, '没有获取到可操作的发货单!');
|
||
}
|
||
|
||
$deliveryList = array();
|
||
$delivery_ids = array();
|
||
foreach ($tempList as $key => $val)
|
||
{
|
||
$delivery_id = $val['delivery_id'];
|
||
$branch_id = $val['branch_id'];
|
||
|
||
//只处理指定仓库
|
||
if(empty($branchList[$branch_id])){
|
||
continue;
|
||
}
|
||
|
||
//仓库信息
|
||
$val['branch_bn'] = $branchList[$branch_id];
|
||
|
||
$delivery_ids[$delivery_id] = $delivery_id;
|
||
|
||
$deliveryList[$delivery_id] = $val;
|
||
}
|
||
|
||
if(empty($deliveryList)){
|
||
$this->splash('error', null, '没有获取到可操作的发货单。');
|
||
}
|
||
|
||
//关联订单号
|
||
$sql = "SELECT a.delivery_id,b.order_id,b.order_bn,b.process_status,b.status,b.pay_status,b.ship_status FROM `sdb_ome_delivery_order` AS a
|
||
LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.delivery_id IN(". implode(',', $delivery_ids) .")";
|
||
$tempList = $deliveryObj->db->select($sql);
|
||
|
||
//检查订单状
|
||
$orderList = array();
|
||
foreach ($tempList as $key => $val)
|
||
{
|
||
$order_id = $val['order_id'];
|
||
$delivery_id = $val['delivery_id'];
|
||
|
||
//发货单信息
|
||
$deliveryInfo = $deliveryList[$delivery_id];
|
||
|
||
//check
|
||
if($val['process_status'] != 'splited'){
|
||
unset($deliveryList[$delivery_id]);
|
||
|
||
$this->splash('error', null, '订单号:'.$val['order_bn'].'不是已拆分状态');
|
||
}
|
||
|
||
if($val['pay_status'] != '1'){
|
||
unset($deliveryList[$delivery_id]);
|
||
|
||
$this->splash('error', null, '订单号:'.$val['order_bn'].'不是已支付状态');
|
||
}
|
||
|
||
if($val['ship_status'] != '1'){
|
||
unset($deliveryList[$delivery_id]);
|
||
|
||
$this->splash('error', null, '订单号:'.$val['order_bn'].'不是已发货状态');
|
||
}
|
||
|
||
$val['branch_bn'] = $deliveryInfo['branch_bn'];
|
||
|
||
$orderList[$order_id] = $val;
|
||
}
|
||
|
||
//list
|
||
$is_flag = false;
|
||
foreach ($orderList as $key => $val)
|
||
{
|
||
$order_id = $val['order_id'];
|
||
|
||
//request
|
||
$result = kernel::single('erpapi_router_request')->set('wms', $channel_id)->delivery_confirm($val);
|
||
if($result['rsp'] != 'succ'){
|
||
//log
|
||
$error_msg = '订单推送WMS确认收货失败:'.$result['err_msg'];
|
||
$operLogObj->write_log('order_confirm@ome', $order_id, $error_msg);
|
||
}else{
|
||
$is_flag = true;
|
||
|
||
//log
|
||
$error_msg = '订单推送WMS确认收货成功!';
|
||
$operLogObj->write_log('order_confirm@ome', $order_id, $error_msg);
|
||
}
|
||
}
|
||
|
||
if(!$is_flag){
|
||
$this->splash('success', null, '命令已经被成功发送!');
|
||
}
|
||
|
||
//查询京东订单状态
|
||
foreach ($deliveryList as $dlyKey => $dlyVal)
|
||
{
|
||
$delivery_id = $dlyVal['delivery_id'];
|
||
$branch_bn = $dlyVal['branch_bn'];
|
||
|
||
//package
|
||
$error_msg = '';
|
||
$packageList = $deliveryLib->getDeliveryPackage($delivery_id, $error_msg);
|
||
if(empty($packageList)){
|
||
continue;
|
||
}
|
||
|
||
//查询配送状态
|
||
$dataList = array();
|
||
foreach ($packageList as $packKey => $packVal)
|
||
{
|
||
$package_bn = $packVal['package_bn'];
|
||
|
||
//params
|
||
$params = array(
|
||
'delivery_id' => $packVal['delivery_id'],
|
||
'delivery_bn' => $dlyVal['delivery_bn'],
|
||
'branch_bn' => $branch_bn,
|
||
'package_id' => $packVal['package_id'],
|
||
'package_bn' => $package_bn,
|
||
);
|
||
|
||
//request
|
||
$result = kernel::single('erpapi_router_request')->set('wms', $channel_id)->delivery_package_status($params);
|
||
}
|
||
}
|
||
|
||
unset($tempList, $branchList, $deliveryList, $orderList);
|
||
|
||
$this->splash('success', null, '命令已经被成功发送。');
|
||
}
|
||
|
||
/**
|
||
* 批量推送发货单至WMS仓储
|
||
*/
|
||
public function batchSyncWms()
|
||
{
|
||
@ini_set('memory_limit','512M');
|
||
set_time_limit(0);
|
||
|
||
$deliveryIds = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
die('不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(empty($deliveryIds)){
|
||
die('请选择需要操作的发货单!');
|
||
}
|
||
|
||
if(count($deliveryIds) > 500){
|
||
die('每次最多只能选择500条!');
|
||
}
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$dataList = $deliveryObj->getList('delivery_id', array('delivery_id' => $deliveryIds, 'sync_status|noequal' => '3'));
|
||
if (empty($dataList)) {
|
||
die('没有需要重推的发货单!');
|
||
}
|
||
$deliveryIds = array_column($dataList, 'delivery_id');
|
||
$_POST['delivery_id'] = $deliveryIds;
|
||
|
||
$this->pagedata['GroupList'] = json_encode($deliveryIds);
|
||
|
||
$this->pagedata['request_url'] = $this->url .'&act=ajaxSyncWms';
|
||
|
||
//调用desktop公用进度条(第4个参数是增量传offset,否则默认一直为0)
|
||
parent::dialog_batch('ome_mdl_delivery', false, 50, 'incr');
|
||
}
|
||
|
||
/**
|
||
* ajaxSyncWms
|
||
* @return mixed 返回值
|
||
*/
|
||
public function ajaxSyncWms()
|
||
{
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
|
||
$branchLib = kernel::single('ome_branch');
|
||
|
||
$retArr = array(
|
||
'itotal' => 0,
|
||
'isucc' => 0,
|
||
'ifail' => 0,
|
||
'err_msg' => array(),
|
||
);
|
||
|
||
//获取发货单号
|
||
parse_str($_POST['primary_id'], $postdata);
|
||
if(!$postdata){
|
||
echo 'Error: 请先选择发货单';
|
||
exit;
|
||
}
|
||
|
||
//filter
|
||
$filter = $postdata['f'];
|
||
$offset = intval($postdata['f']['offset']);
|
||
$limit = intval($postdata['f']['limit']);
|
||
|
||
if(empty($filter)){
|
||
echo 'Error: 没有找到查询条件';
|
||
exit;
|
||
}
|
||
|
||
//data
|
||
$filter['sync_status|noequal'] = '3';
|
||
$dataList = $deliveryObj->getList('delivery_id,delivery_bn,branch_id,sync_status,original_delivery_bn', $filter, $offset, $limit);
|
||
|
||
//check
|
||
if(empty($dataList)){
|
||
echo 'Error: 没有获取到发货单';
|
||
exit;
|
||
}
|
||
|
||
//count
|
||
$retArr['itotal'] = count($dataList);
|
||
|
||
//获取京东一件代发的仓库列表
|
||
$wms_type = 'yjdf';
|
||
$error_msg = '';
|
||
$yjdfBranchList = $branchLib->getWmsBranchIds($wms_type, $error_msg);
|
||
|
||
//list
|
||
foreach ($dataList as $key => $val)
|
||
{
|
||
$delivery_id = $val['delivery_id'];
|
||
$branch_id = $val['branch_id'];
|
||
|
||
//京东一件代发WMS仓库
|
||
$isYjdfFlag = ($yjdfBranchList[$branch_id] ? true : false);
|
||
|
||
//[开普勒]已经有第三方订单号,不允许重复推送
|
||
if($isYjdfFlag && $val['original_delivery_bn']){
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = $val['delivery_bn'].'已经有第三方单号,不允许重复推送';
|
||
|
||
continue;
|
||
}
|
||
|
||
//推送失败的发货单,检查订单是否已经申请退款
|
||
if($val['sync_status'] == '2' || $isYjdfFlag){
|
||
//@todo:发货单未同步第三方仓储,并且申请退款的订单直接取消发货单
|
||
$sql = "SELECT b.order_id, b.process_status, b.status, b.pay_status FROM `sdb_ome_delivery_order` AS a
|
||
LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.delivery_id=". $delivery_id;
|
||
$orderInfo = $deliveryObj->db->selectrow($sql);
|
||
if(in_array($orderInfo['pay_status'], array('5', '6', '7'))){
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = $val['delivery_bn'].'已经申请退款或已退款,请检查;';
|
||
|
||
continue;
|
||
}
|
||
}
|
||
|
||
//request
|
||
ome_delivery_notice::create($delivery_id);
|
||
|
||
//succ
|
||
$retArr['isucc'] += 1;
|
||
}
|
||
|
||
echo json_encode($retArr),'ok.';
|
||
exit;
|
||
}
|
||
|
||
/**
|
||
* 批量推送发货单至WMS仓储
|
||
*/
|
||
public function batchDeliveryCancel()
|
||
{
|
||
@ini_set('memory_limit','512M');
|
||
set_time_limit(0);
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
|
||
$deliveryIds = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
die('不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(empty($deliveryIds)){
|
||
die('请选择需要操作的发货单!');
|
||
}
|
||
|
||
if(count($deliveryIds) > 500){
|
||
die('每次最多只能选择500条!');
|
||
}
|
||
|
||
//data
|
||
$dataList = $deliveryObj->getList('delivery_id', array('delivery_id'=>$deliveryIds, 'status'=>array('ready','progress'), 'parent_id'=>0));
|
||
if(empty($dataList)){
|
||
die('没有可撤消的发货单!');
|
||
}
|
||
|
||
$deliveryIds = array_column($dataList, 'delivery_id');
|
||
|
||
$this->pagedata['GroupList'] = json_encode($deliveryIds);
|
||
|
||
$this->pagedata['request_url'] = $this->url .'&act=ajaxDeliveryCancel';
|
||
|
||
//调用desktop公用进度条(第4个参数是增量传offset,否则默认一直为0)
|
||
parent::dialog_batch('ome_mdl_delivery', false, 50, 'incr');
|
||
}
|
||
|
||
/**
|
||
* ajaxDeliveryCancel
|
||
* @return mixed 返回值
|
||
*/
|
||
public function ajaxDeliveryCancel()
|
||
{
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$operLogObj = app::get('ome')->model('operation_log');
|
||
|
||
$retArr = array(
|
||
'itotal' => 0,
|
||
'isucc' => 0,
|
||
'ifail' => 0,
|
||
'err_msg' => array(),
|
||
);
|
||
|
||
//获取发货单号
|
||
parse_str($_POST['primary_id'], $postdata);
|
||
if(!$postdata){
|
||
echo 'Error: 请先选择发货单';
|
||
exit;
|
||
}
|
||
|
||
//filter
|
||
$filter = $postdata['f'];
|
||
$offset = intval($postdata['f']['offset']);
|
||
$limit = intval($postdata['f']['limit']);
|
||
|
||
if(empty($filter)){
|
||
echo 'Error: 没有找到查询条件';
|
||
exit;
|
||
}
|
||
|
||
//data
|
||
$dataList = $deliveryObj->getList('delivery_id,branch_id,delivery_bn,status', $filter, $offset, $limit);
|
||
|
||
//check
|
||
if(empty($dataList)){
|
||
echo 'Error: 没有获取到发货单';
|
||
exit;
|
||
}
|
||
|
||
//count
|
||
$retArr['itotal'] = count($dataList);
|
||
|
||
//list
|
||
foreach ($dataList as $key => $delivery)
|
||
{
|
||
$delivery_id = $delivery['delivery_id'];
|
||
|
||
if(!in_array($delivery['status'], array('ready','progress'))){
|
||
continue;
|
||
}
|
||
|
||
//cancel
|
||
$res = ome_delivery_notice::cancel($delivery, true);
|
||
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
|
||
//succ
|
||
$retArr['isucc'] += 1;
|
||
|
||
//update
|
||
$data = array(
|
||
'status'=>'cancel',
|
||
'memo'=>'批量取消请求!',
|
||
'delivery_bn'=>$delivery['delivery_bn'],
|
||
);
|
||
kernel::single('ome_event_receive_delivery')->update($data);
|
||
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '手工批量取消发货单');
|
||
}else{
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = $delivery['delivery_bn'].'请求取消失败:'. $res['msg'];
|
||
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '手工批量取消发货单,失败:'.$res['msg']);
|
||
}
|
||
}
|
||
|
||
echo json_encode($retArr),'ok.';
|
||
exit;
|
||
}
|
||
|
||
/**
|
||
* 设置为请求失败状态
|
||
*/
|
||
public function batch_updateFail()
|
||
{
|
||
// $this->begin('');
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
$this->splash('error', null, '不能使用全选功能,每次最多选择500条!');
|
||
}
|
||
|
||
if(count($ids) > 500){
|
||
$this->splash('error', null, '每次最多只能选择500条!');
|
||
}
|
||
|
||
//发货单
|
||
$deliveryList = $deliveryObj->getList('delivery_id,delivery_bn,branch_id,sync_status', array('delivery_id'=>$ids, 'status'=>array('progress','ready')));
|
||
if(empty($deliveryList)){
|
||
$this->splash('error', null, '没有获取到可操作的发货单!');
|
||
}
|
||
|
||
//list
|
||
$syncDlyIds = array();
|
||
$syncErrorDly = array();
|
||
foreach ($deliveryList as $key => $val)
|
||
{
|
||
$delivery_id = $val['delivery_id'];
|
||
$sync_status = $val['sync_status'];
|
||
|
||
//check
|
||
if($sync_status != '1'){
|
||
continue;
|
||
}
|
||
|
||
$deliveryObj->update(array('sync_status'=>'2'), array('delivery_id'=>$delivery_id));
|
||
}
|
||
|
||
$this->splash('success', null, '已完成操作!');
|
||
}
|
||
|
||
/**
|
||
* 强制修复发货单
|
||
*/
|
||
public function repairDelivery()
|
||
{
|
||
$this->begin();
|
||
|
||
$keplerLib = kernel::single('console_delivery_kepler');
|
||
|
||
//post
|
||
$delivery_id = intval($_POST['delivery_id']);
|
||
if(empty($delivery_id)){
|
||
$this->end(false, '无效的操作');
|
||
}
|
||
|
||
//dispose
|
||
$error_msg = '';
|
||
$result = $keplerLib->repairDelivery($delivery_id, $error_msg);
|
||
if(!$result){
|
||
$this->end(false, '执行失败:'. $error_msg);
|
||
}
|
||
|
||
$this->end(true, '强制修复发货单成功');
|
||
}
|
||
|
||
/**
|
||
* 批量对勾选的发货单进行物流拦截
|
||
*/
|
||
public function logisticsInterception()
|
||
{
|
||
@ini_set('memory_limit','512M');
|
||
set_time_limit(0);
|
||
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
|
||
$deliveryIds = $_POST['delivery_id'];
|
||
|
||
//check
|
||
if($_POST['isSelectedAll'] == '_ALL_'){
|
||
die('不能使用全选功能,每次最多选择500条;');
|
||
}
|
||
|
||
if(empty($deliveryIds)){
|
||
die('请选择需要操作的发货单;');
|
||
}
|
||
|
||
if(count($deliveryIds) > 500){
|
||
die('每次最多只能选择500条;');
|
||
}
|
||
|
||
//data
|
||
$filter = array('delivery_id'=>$deliveryIds, 'status'=>array('succ'), 'parent_id'=>0, 'logi_status'=>array('0','1','2','3','4','5','6','8'));
|
||
$dataList = $deliveryObj->getList('delivery_id', $filter);
|
||
if(empty($dataList)){
|
||
die('没有可拦截的发货单,或者发货单已经通知WMS进行拦截中!');
|
||
}
|
||
|
||
$deliveryIds = array_column($dataList, 'delivery_id');
|
||
|
||
$this->pagedata['GroupList'] = json_encode($deliveryIds);
|
||
|
||
$this->pagedata['request_url'] = $this->url .'&act=ajaxLogisticsInterception';
|
||
|
||
//调用desktop公用进度条(第4个参数是增量传offset,否则默认一直为0)
|
||
parent::dialog_batch('ome_mdl_delivery', false, 50, 'incr');
|
||
}
|
||
|
||
/**
|
||
* ajaxLogisticsInterception
|
||
* @return mixed 返回值
|
||
*/
|
||
public function ajaxLogisticsInterception()
|
||
{
|
||
$ordermdl = app::get('ome')->model('orders');
|
||
$reshipMdl = app::get('ome')->model('reship');
|
||
$deliveryObj = app::get('ome')->model('delivery');
|
||
$operLogObj = app::get('ome')->model('operation_log');
|
||
$returnProductMdl = app::get('ome')->model('return_product');
|
||
|
||
$reshipLib = kernel::single('ome_reship');
|
||
$productLib = kernel::single('ome_return_product');
|
||
|
||
$retArr = array(
|
||
'itotal' => 0,
|
||
'isucc' => 0,
|
||
'ifail' => 0,
|
||
'err_msg' => array(),
|
||
);
|
||
|
||
//获取发货单号
|
||
parse_str($_POST['primary_id'], $postdata);
|
||
if(!$postdata){
|
||
echo 'Error: 请先选择发货单';
|
||
exit;
|
||
}
|
||
|
||
//filter
|
||
$filter = $postdata['f'];
|
||
$offset = intval($postdata['f']['offset']);
|
||
$limit = intval($postdata['f']['limit']);
|
||
|
||
if(empty($filter)){
|
||
echo 'Error: 没有找到查询条件';
|
||
exit;
|
||
}
|
||
|
||
//物流跟踪状态
|
||
$filter['logi_status'] = array('0','1','2','3','4','5','6','8');
|
||
|
||
//data
|
||
$dataList = $deliveryObj->getList('delivery_id,delivery_bn,logi_name,logi_no,status,logi_status', $filter, $offset, $limit);
|
||
if(empty($dataList)){
|
||
echo 'Error: 没有可操作的发货单,或者发货单已经通知WMS进行拦截';
|
||
exit;
|
||
}
|
||
|
||
//count
|
||
$retArr['itotal'] = count($dataList);
|
||
|
||
//list
|
||
$error_msg = '';
|
||
foreach ($dataList as $key => $deliveryInfo)
|
||
{
|
||
$delivery_id = $deliveryInfo['delivery_id'];
|
||
$logi_name = $deliveryInfo['logi_name'];
|
||
$logi_no = $deliveryInfo['logi_no'];
|
||
|
||
//check
|
||
if(!in_array($deliveryInfo['status'], array('succ'))){
|
||
continue;
|
||
}
|
||
|
||
if(empty($logi_no)){
|
||
continue;
|
||
}
|
||
|
||
//请求WMS进行物流拦截
|
||
$requestParams = ['logi_no'=>$logi_no];
|
||
$res = ome_delivery_notice::cut($requestParams);
|
||
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
|
||
//更新发货单状态为:拦截通知已发送
|
||
$deliveryObj->update(array('logi_status'=>'7'), array('delivery_id'=>$delivery_id));
|
||
|
||
//logs
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '拦截通知已发送');
|
||
|
||
//根据发货单信息获取售后服务单数据
|
||
$returnProductList = $productLib->getReturnProductByDelivery($delivery_id, $error_msg);
|
||
if(empty($returnProductList)){
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = 'Error:'. $error_msg;
|
||
|
||
continue;
|
||
}
|
||
|
||
//[按订单纬度]新建售后申请单,自动审核生成售后退货单,并且自动退货完成
|
||
$returnIds = array();
|
||
foreach ($returnProductList as $order_id => $returnProductSdf)
|
||
{
|
||
//是否检测明细已经创建过售后申请单
|
||
$returnProductSdf['is_check_items'] = true;
|
||
|
||
//exec
|
||
$return_id = $productLib->autoCreateReturnProduct($returnProductSdf, $error_msg);
|
||
if(empty($return_id)){
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = 'Error:'. $error_msg;
|
||
|
||
continue 2;
|
||
}
|
||
|
||
$returnIds[$return_id] = $return_id;
|
||
}
|
||
|
||
//exec
|
||
$reshipIds = array();
|
||
if($returnIds){
|
||
//按售后申请单ID创建退货单
|
||
foreach ($returnIds as $returnKey => $return_id)
|
||
{
|
||
$adata = array(
|
||
'choose_type_flag' => '1', //创建售后退货单标记
|
||
'choose_type' => '1', //创建售后退货单类型(1:退货单,2:换货单)
|
||
'status' => '3',
|
||
'return_id' => $return_id,
|
||
);
|
||
$result = $returnProductMdl->tosave($adata, true, $error_msg);
|
||
if(!$result){
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = 'Error:创建退货单失败,'. $error_msg;
|
||
|
||
continue 2;
|
||
}
|
||
}
|
||
|
||
//获取创建成功的售后退货单ID
|
||
$reshipList = $reshipMdl->getList('reship_id,reship_bn,order_id,tmoney,totalmoney,had_refund', array('return_id'=>$returnIds, 'is_check'=>'0'));
|
||
if($reshipList){
|
||
$reshipIds = array_column($reshipList, 'reship_id');
|
||
|
||
//order_id
|
||
$orderIds = array_column($reshipList, 'order_id');
|
||
|
||
$orderList = $ordermdl->getList('order_id,order_bn,process_status,pay_status,ship_status,payed', ['order_id'=>$orderIds]);
|
||
$orderList = array_column($orderList, null, 'order_id');
|
||
|
||
//update
|
||
foreach ($reshipList as $reshipKey => $reshipInfo)
|
||
{
|
||
$order_id = $reshipInfo['order_id'];
|
||
$reship_id = $reshipInfo['reship_id'];
|
||
|
||
//使用发货单上的退回物流公司、退回物流单号进行更新
|
||
$updateData = [
|
||
'return_logi_name' => $logi_name,
|
||
'return_logi_no' => $logi_no
|
||
];
|
||
|
||
//订单如果是全额退款,需要更新:已退金额
|
||
if(isset($orderList[$order_id])){
|
||
if($orderList[$order_id]['pay_status'] == '5' || $orderList[$order_id]['payed'] <= 0){
|
||
$updateData['had_refund'] = $reshipInfo['tmoney']; //已退金额
|
||
$updateData['totalmoney'] = $reshipInfo['totalmoney'] - $reshipInfo['tmoney']; //最后合计金额
|
||
}elseif($orderList[$order_id]['payed'] < $reshipInfo['tmoney']){
|
||
//获取退货商品已经完成退运费的金额
|
||
//@todo:顾客先申请退款了运费,再申请退货退款,导致订单可退金额不足,自动审核退货单失败;
|
||
$sum_refunded = $reshipLib->getReshipByRefund($reshipInfo, $error_msg);
|
||
if($sum_refunded && $sum_refunded > 0){
|
||
$updateData['had_refund'] = $reshipInfo['had_refund'] + $sum_refunded; //已退金额
|
||
$updateData['totalmoney'] = $reshipInfo['totalmoney'] - $sum_refunded; //最后合计金额
|
||
}
|
||
}
|
||
}
|
||
|
||
$reshipMdl->update($updateData, array('reship_id'=>$reship_id));
|
||
}
|
||
}
|
||
}
|
||
|
||
//售后退换货自动审批
|
||
$is_auto_approve = app::get('ome')->getConf('return.auto_approve');
|
||
if($reshipIds && $is_auto_approve == 'on'){
|
||
$reshipLib = kernel::single('ome_reship');
|
||
|
||
//使用queue例任务自动审核退货单
|
||
foreach ($reshipIds as $reshipKey => $reship_id)
|
||
{
|
||
$reshipLib->batch_reship_queue($reship_id);
|
||
}
|
||
}
|
||
|
||
//succ
|
||
$retArr['isucc'] += 1;
|
||
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '自动创建售后申请单成功');
|
||
}else{
|
||
//error
|
||
$retArr['ifail'] += 1;
|
||
$retArr['err_msg'][] = $deliveryInfo['delivery_bn'].'请求物流拦截失败:'. $res['msg'];
|
||
|
||
//拦截失败
|
||
$deliveryObj->update(array('logi_status'=>'8'), array('delivery_id'=>$delivery_id));
|
||
|
||
//log
|
||
$operLogObj->write_log('delivery_back@ome', $delivery_id, '请求物流拦截发货单,失败:'.$res['msg']);
|
||
}
|
||
}
|
||
|
||
echo json_encode($retArr),'ok.';
|
||
exit;
|
||
}
|
||
}
|