Files
OMS/app/brush/controller/admin/delivery.php
2025-12-28 23:13:25 +08:00

531 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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);
}
}