mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-23 02:45:33 +08:00
531 lines
19 KiB
PHP
531 lines
19 KiB
PHP
<?php
|
||
/**
|
||
* Copyright © ShopeX (http://www.shopex.cn). All rights reserved.
|
||
* See LICENSE file for license details.
|
||
*/
|
||
/**
|
||
* @author ykm 2015-11-19
|
||
* @describe 特殊订单审核通过及发货
|
||
*/
|
||
class brush_ctl_admin_delivery extends desktop_controller
|
||
{
|
||
function __construct($app)
|
||
{
|
||
if(in_array($_GET['act'], ['toPrintExpre'])) {
|
||
$this->checkCSRF = false;
|
||
}
|
||
|
||
parent::__construct($app);
|
||
}
|
||
|
||
/**
|
||
* _views
|
||
* @return mixed 返回值
|
||
*/
|
||
|
||
public function _views()
|
||
{
|
||
static $sub_menu;
|
||
|
||
$brushDelivery = $this->app->model('delivery');
|
||
|
||
if($sub_menu) {
|
||
return $sub_menu;
|
||
}
|
||
|
||
$sub_menu = array(
|
||
0 => array('label'=>app::get('base')->_('待发货'),'filter'=>array('status'=>array('ready','progress') ),'optional'=>false),
|
||
1 => array('label'=>app::get('base')->_('已打印'),'filter'=>array('status'=>array('progress'), 'expre_status'=>'true'),'optional'=>false),
|
||
2 => array('label'=>app::get('base')->_('已发货'),'filter'=>array('status'=>'succ'),'optional'=>false,'addon'=>'_FILTER_POINT_'),
|
||
3 => array('label'=>app::get('base')->_('全部'),'filter'=>array('status|noequal'=>'cancel'),'optional'=>false,'addon'=>'_FILTER_POINT_'),
|
||
);
|
||
$dly = app::get('ome')->model('dly_corp')->getList('corp_id,name',array('disabled'=>'false'));
|
||
foreach($dly as $val){
|
||
$sub_menu[] = array('label'=>$val['name'],'filter'=>array('status'=>array('ready','progress'),'logi_id'=>$val['corp_id']),'optional'=>false);
|
||
}
|
||
|
||
foreach ($sub_menu as $k => $v)
|
||
{
|
||
if (!$v['addon']) $sub_menu[$k]['addon'] = $brushDelivery->count($v['filter']);
|
||
$sub_menu[$k]['href'] = 'index.php?app=brush&ctl=' . $_GET['ctl'] . '&act=' . $_GET['act'] . '&view=' . $k;
|
||
}
|
||
|
||
return $sub_menu;
|
||
}
|
||
|
||
/**
|
||
* index
|
||
* @return mixed 返回值
|
||
*/
|
||
public function index()
|
||
{
|
||
$subMenu = $this->_views();
|
||
|
||
$use_export = true;
|
||
|
||
if(!isset($_GET['view']) || $_GET['view'] == '') {
|
||
foreach($subMenu as $k => $v) {
|
||
if($v['addon'] > 0) {
|
||
$_GET['view'] = $k;
|
||
break;
|
||
}
|
||
}
|
||
|
||
is_null($_GET['view']) && $_GET['view'] = 0;
|
||
}
|
||
|
||
//export
|
||
if($_GET['view'] == '' || $_GET['view'] == '0'){
|
||
$use_export = false;
|
||
}
|
||
|
||
if($_GET['action'] && $_POST['isSelectedAll'] == '_ALL_') {
|
||
$_POST = $_POST ? array_merge($subMenu[$_GET['view']]['filter'], $_POST) : $subMenu[$_GET['view']]['filter'];
|
||
}
|
||
|
||
$params = array(
|
||
'title'=>'特殊订单列表',
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag'=>false,
|
||
'use_buildin_recycle'=>false,
|
||
'use_buildin_export' => $use_export,
|
||
'use_buildin_import'=>false,
|
||
'use_buildin_filter'=>true,
|
||
'use_view_tab' => true,
|
||
);
|
||
|
||
$params['actions'] = $this->_getAction();
|
||
|
||
$this->finder('brush_mdl_delivery',$params);
|
||
}
|
||
|
||
private function _getAction()
|
||
{
|
||
$subMenu = $this->_views();
|
||
|
||
$act = 'toPrintExpre';
|
||
$query = http_build_query($subMenu[$_GET['view']]['filter']);
|
||
|
||
$action = array(
|
||
'expre' => array(
|
||
'label' => '打印快递单',
|
||
'submit' => 'index.php?app=brush&ctl=admin_print&act=' . $act . '&' . $query,
|
||
'onclick'=>"_hmt.push(['_trackEvent', '订单发货操作', '打印快递单', 'b-打印快递单']);",
|
||
'target' => '_blank',
|
||
),
|
||
'delivery' => array(
|
||
'label' => '开始发货',
|
||
'submit' => 'index.php?app=brush&ctl=admin_delivery&act=delivery',
|
||
'target' => 'dialog::{title:\'开始发货\',width:650,height:260}',
|
||
'confirm' =>' 确认要进行发货么?'
|
||
),
|
||
'changeDly' => array(
|
||
'label' => '批量更换物流',
|
||
'submit' => 'index.php?app=brush&ctl=admin_logistics&act=toChangeLogistics&' . $query,
|
||
'target' => 'dialog::{title:\'批量更换物流公司\',width:680,height:500}',
|
||
)
|
||
);
|
||
|
||
switch($_GET['view'])
|
||
{
|
||
case 2 :
|
||
case 3 :
|
||
unset($action['delivery'], $action['changeDly']);
|
||
break;
|
||
case 0 :
|
||
case 1 :
|
||
$action['process'] = array(
|
||
'label' => '导出未发货',
|
||
'submit' => 'index.php?app=brush&ctl=admin_delivery&act=unDelivery&action=export',
|
||
'target' => 'dialog::{title:\'导出未发货\',width:400,height:200}',
|
||
);
|
||
|
||
$action['import'] = array(
|
||
'label' => '导入未发货',
|
||
'href' => 'index.php?app=brush&ctl=admin_delivery&act=unDelivery&action=import',
|
||
'target' => 'dialog::{title:\'导入未发货\',width:400,height:200}',
|
||
);
|
||
|
||
break;
|
||
default : break;
|
||
}
|
||
|
||
return $action;
|
||
}
|
||
|
||
/**
|
||
* unDelivery
|
||
* @return mixed 返回值
|
||
*/
|
||
public function unDelivery()
|
||
{
|
||
$subMenu = $this->_views();
|
||
|
||
if($_GET['action'] && $_POST['isSelectedAll'] == '_ALL_') {
|
||
$_POST = $_POST ? array_merge($subMenu[$_GET['view']]['filter'], $_POST) : $subMenu[$_GET['view']]['filter'];
|
||
}
|
||
|
||
$params = array(
|
||
'title'=>'特殊订单未发货导出'
|
||
);
|
||
|
||
$this->finder('brush_mdl_undelivery', $params);
|
||
}
|
||
|
||
/**
|
||
* delivery
|
||
* @return mixed 返回值
|
||
*/
|
||
public function delivery()
|
||
{
|
||
$arrDeliveryId = $this->_getSelectedId();
|
||
|
||
$this->pagedata['deliveryCount'] = count($arrDeliveryId);
|
||
$this->pagedata['deliveryGroup'] = json_encode($arrDeliveryId);
|
||
|
||
$this->display("admin/delivery.html");
|
||
}
|
||
|
||
/**
|
||
* 开始虚拟发货
|
||
*/
|
||
public function ajaxDealDelivery()
|
||
{
|
||
$db = kernel::database();
|
||
$brushDelivery = kernel::single('brush_delivery');
|
||
|
||
$arrObjId = explode(';', $_POST['ajaxParams']);
|
||
|
||
$deliveryData = $this->app->model('delivery')->getList('delivery_id,delivery_bn,expre_status,status,logi_id,logi_no', array('delivery_id'=>$arrObjId));
|
||
|
||
$orderIds = $this->app->model('delivery_order')->getList('*', array('delivery_id'=>$arrObjId));
|
||
|
||
$arrDeliveryOrder = array();
|
||
foreach($orderIds as $val) {
|
||
$arrDeliveryOrder[$val['delivery_id']] = $val['order_id'];
|
||
}
|
||
|
||
$fail = $succ = $noPrint =0;
|
||
|
||
$this->begin();
|
||
|
||
$errorList = array();
|
||
foreach($deliveryData as $delivery)
|
||
{
|
||
if($delivery['expre_status'] == 'false') {
|
||
$fail++;
|
||
$noPrint++;
|
||
|
||
$errorList[] = '发货单号:'. $delivery['delivery_bn'] .' 未打印';
|
||
|
||
continue;
|
||
}
|
||
|
||
if($delivery['status'] == 'succ') {
|
||
$succ++;
|
||
continue;
|
||
}
|
||
|
||
$params = array('logi_id'=>$delivery['logi_id'], 'logi_no'=>$delivery['logi_no']);
|
||
|
||
$db->exec('SAVEPOINT batchDelivery');
|
||
|
||
$error_msg = '';
|
||
$ret = $brushDelivery->finishDeliver($delivery['delivery_id'], $arrDeliveryOrder[$delivery['delivery_id']], $params, $error_msg);
|
||
if(!$ret) {
|
||
$fail++;
|
||
|
||
if($error_msg){
|
||
$errorList[] = $error_msg;
|
||
}
|
||
|
||
$db->exec('ROLLBACK TO SAVEPOINT batchDelivery');
|
||
} else {
|
||
$succ++;
|
||
}
|
||
}
|
||
|
||
$this->endonly(true);
|
||
|
||
$retData['total'] = $fail + $succ;
|
||
$retData['fail'] = $fail;
|
||
$retData['succ'] = $succ;
|
||
$retData['noPrint'] = $noPrint;
|
||
|
||
if($errorList){
|
||
$error_msg = implode(';', $errorList);
|
||
$retData['error_msg'] = substr($error_msg, 0, 200);
|
||
}
|
||
|
||
echo json_encode($retData);
|
||
}
|
||
|
||
/**
|
||
* doDetail
|
||
* @return mixed 返回值
|
||
*/
|
||
public function doDetail()
|
||
{
|
||
if (empty($_POST['dly'])) {
|
||
$this->splash('error', null, '保存失败');
|
||
}
|
||
|
||
if (empty($_POST['dly']['logi_id'])) {
|
||
$this->splash('error', null, '请选择物流公司');
|
||
}
|
||
|
||
$ObjDelivery = $this->app->model('delivery');
|
||
$delivery = $ObjDelivery->dump($_POST['dly']['delivery_id'], 'delivery_id,status,weight,logi_id,logi_no,ship_area,net_weight,memo');
|
||
if(in_array($delivery['status'], array('cancel', 'back', 'stop', 'return_back'))) {
|
||
$this->splash('error', null, '发货单已撤销不能编辑');
|
||
}
|
||
|
||
$data['logi_id'] = $_POST['dly']['logi_id'];
|
||
$data['logi_no'] = $_POST['dly']['logi_no'];
|
||
if(isset($_POST['weight'])) {
|
||
$data['weight'] = $_POST['weight'];
|
||
}
|
||
|
||
if($data['logi_id'] != $delivery['logi_id']) {//切换物流公司
|
||
$changeLogistics = kernel::single('brush_logistics')->checkChangeLogistics($data, $delivery);
|
||
if(!$changeLogistics['result']) {
|
||
$this->splash('error', null, $changeLogistics['msg']);
|
||
} else {
|
||
$succMsg = '保存成功,快递公司切换,需重新打印';
|
||
|
||
$corpRows = app::get('ome')->model('dly_corp')->getList('corp_id,name', array('corp_id' => array($data['logi_id'], $delivery['logi_id'])));
|
||
|
||
foreach($corpRows as $cVal) {
|
||
if($cVal['corp_id'] == $delivery['logi_id']) {
|
||
$oldCorpName = $cVal['name'];
|
||
} elseif($cVal['corp_id'] == $data['logi_id']) {
|
||
$newCorpName = $cVal['name'];
|
||
}
|
||
}
|
||
|
||
$logMsg = '物流公司:' . $oldCorpName . ' => ' . $newCorpName;
|
||
}
|
||
} else {
|
||
if($data['logi_no'] == $delivery['logi_no']) {
|
||
unset($data['logi_no']);
|
||
}
|
||
|
||
if($data['weight'] == $delivery['weight']) {
|
||
unset($data['weight']);
|
||
} elseif(isset($data['weight'])) {
|
||
$arrArea = explode(':', $delivery['ship_area']);
|
||
$area_id = $arrArea[2];
|
||
$data['delivery_cost_actual'] = app::get('ome')->model('delivery')->getDeliveryFreight($area_id,$data['logi_id'],$data['weight']);
|
||
}
|
||
|
||
unset($data['logi_id']);
|
||
}
|
||
|
||
if($_POST['dly']['memo'] != $delivery['memo']) {
|
||
$data['memo'] = $_POST['dly']['memo'];
|
||
}
|
||
|
||
if(count($data)) {
|
||
if($data['logi_no'] && $ObjDelivery->dump(array('delivery_id|noequal' => $delivery['delivery_id'], 'logi_no' => $data['logi_no']))) {
|
||
$this->splash('error', null, '已有此物流单号');
|
||
}
|
||
|
||
$this->begin();
|
||
|
||
$ret = kernel::single('brush_logistics')->changeLogistics($data, $delivery['delivery_id'], $logMsg);
|
||
if(!$ret) {
|
||
$this->end(false, '保存失败');
|
||
}
|
||
|
||
$succMsg = $succMsg ? $succMsg : '保存成功';
|
||
|
||
$this->end(true, $succMsg);
|
||
} else {
|
||
$this->splash('success', null, '没有数据发生变化');
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 批量审核订单并发货
|
||
*/
|
||
public function ajaxDoAuto()
|
||
{
|
||
$brushDelivery = kernel::single('brush_delivery');
|
||
$db = kernel::database();
|
||
|
||
$arrObjId = explode(';', $_POST['ajaxParams']);
|
||
$corp_id = $_POST['need_delivery'] ? $_POST['corp_id'] : 0;
|
||
|
||
//result
|
||
$retData = array('total'=>0, 'succ'=>0, 'fail'=> 0, 'error_msg'=>'');
|
||
|
||
//delivery
|
||
$succ = 0;
|
||
$data = $brushDelivery->orderToDelivery($arrObjId, $corp_id);
|
||
if(!$data){
|
||
$retData['fail'] = 1;
|
||
$retData['error_msg'] = 'Error: 没有可操作的订单:[虚拟发货]仅限淘宝平台,请检查';
|
||
echo json_encode($retData);
|
||
exit;
|
||
}
|
||
|
||
$fail = count($arrObjId) - count($data);
|
||
|
||
$this->begin();
|
||
|
||
//data
|
||
foreach($data as $val)
|
||
{
|
||
$db->exec('SAVEPOINT delivery_start');
|
||
|
||
$order_id = $val['main']['order_id'];
|
||
unset($val['main']['order_id']);
|
||
|
||
$mainData = $val['main'];
|
||
$items = $val['item'];
|
||
$itemsDetail = $val['itemDetail'];
|
||
$mainData['delivery_bn'] = $brushDelivery->generateBrushDeliveryBn();
|
||
|
||
$ret = $this->app->model('delivery')->insert($mainData);
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue;
|
||
}
|
||
|
||
foreach($items as &$item)
|
||
{
|
||
$item['delivery_id'] = $mainData['delivery_id'];
|
||
|
||
$ret = $this->app->model('delivery_items')->insert($item);
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue 2;
|
||
}
|
||
}
|
||
|
||
foreach($itemsDetail as &$detail)
|
||
{
|
||
$detail['delivery_id'] = $mainData['delivery_id'];
|
||
$detail['delivery_item_id'] = $items[$detail['bn']]['item_id'];
|
||
|
||
$ret = $this->app->model('delivery_items_detail')->insert($detail);
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue 2;
|
||
}
|
||
}
|
||
|
||
$deliOrder = array('order_id'=>$order_id, 'delivery_id'=>$mainData['delivery_id']);
|
||
$ret = $this->app->model('delivery_order')->insert($deliOrder);
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue;
|
||
}
|
||
|
||
app::get('ome')->model('operation_log')->write_log('order_confirm@ome', $order_id, '订单确认(发货单号:'. $mainData['delivery_bn'] .')');
|
||
if($corp_id) {
|
||
//更新订单为[已确认]状态
|
||
$orderUpdate = array('process_status'=>'confirmed');
|
||
$ret = app::get('ome')->model('orders')->update($orderUpdate, array('order_id'=>$order_id, 'process_status|noequal'=>'confirmed'));
|
||
$ret = is_bool($ret) ? false : true;
|
||
} else {
|
||
$ret = app::get('ome')->model('operation_log')->write_log('delivery_brush_expre@brush', $mainData['delivery_id'], '快递单打印(自动发货模拟)');
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue;
|
||
}
|
||
|
||
$brushDelivery->log_msg = '批量审单自动发货成功(' . $mainData['delivery_bn'] . ')';
|
||
|
||
$ret = $brushDelivery->finishDeliver($mainData['delivery_id'], $order_id);
|
||
}
|
||
|
||
if(!$ret) {
|
||
$fail += 1;
|
||
$db->exec('ROLLBACK TO SAVEPOINT delivery_start');
|
||
continue;
|
||
}
|
||
|
||
$succ += 1;
|
||
}
|
||
|
||
$this->endonly(true);
|
||
|
||
$retData['total'] = $fail + $succ;
|
||
$retData['fail'] = $fail;
|
||
$retData['succ'] = $succ;
|
||
|
||
echo json_encode($retData);
|
||
}
|
||
|
||
private function _getSelectedId()
|
||
{
|
||
$objModel = $this->app->model('delivery');
|
||
|
||
if($_POST['isSelectedAll'] == '_ALL_') {
|
||
unset($_POST['isSelectedAll']);
|
||
|
||
$view = intval($_POST['view']);
|
||
$subMenu = $this->_views();
|
||
$baseFilter = $subMenu[$view]['filter'];
|
||
$param = array_merge($baseFilter, $_POST);
|
||
$objModel->defaultOrder = '';
|
||
$objModel->filter_use_like = true;
|
||
$selData = $objModel->getList($objModel->idColumn, $param, 0, -1);
|
||
$arrObjId = array();
|
||
foreach($selData as $val) {
|
||
$arrObjId[] = $val[$objModel->idColumn];
|
||
}
|
||
} else {
|
||
$arrObjId = $_POST[$objModel->idColumn];
|
||
}
|
||
|
||
if(empty($arrObjId)) {
|
||
$this->splash('success', $this->url, '没有选择的发货单');
|
||
}
|
||
|
||
return $arrObjId;
|
||
}
|
||
|
||
/**
|
||
* 加密字段显示明文
|
||
*
|
||
* @param int $delivery_id
|
||
* @return html
|
||
*/
|
||
public function showSensitiveData($delivery_id)
|
||
{
|
||
$deliveryMdl = app::get('brush')->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), '*');
|
||
$delivery['order_bn'] = $order['order_bn'];
|
||
|
||
$obj = kernel::single('ome_security_router', $delivery['shop_type']);
|
||
|
||
if ($obj->allowDecrypt($order['shop_id'], $order['shop_type'], $order['status'])){
|
||
// 处理加密
|
||
$delivery['encrypt_body'] = $obj->get_encrypt_body($delivery, 'delivery');
|
||
|
||
// 推送日志
|
||
kernel::single('base_hchsafe')->order_log(array('operation'=>'查看发货单收货人信息','tradeIds'=>array($delivery['delivery_bn'])));
|
||
}
|
||
|
||
$this->splash('success',null,null,'redirect',$delivery);
|
||
|
||
}
|
||
} |