mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-22 18:35:35 +08:00
1466 lines
63 KiB
PHP
1466 lines
63 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 wms_ctl_admin_consign extends desktop_controller{
|
||
|
||
var $name = "发货处理";
|
||
var $workground = "wms_delivery";
|
||
|
||
/**
|
||
* _views
|
||
* @return mixed 返回值
|
||
*/
|
||
public function _views()
|
||
{
|
||
|
||
$mdl_order = app::get('ome')->model('orders');
|
||
|
||
# 未发货分两部分:sync=none+线上店铺 OR ship_status=0+线下店铺
|
||
$shops = app::get('ome')->model('shop')->getList('shop_id,node_id');
|
||
|
||
$bindShop = $unbindShop = array();
|
||
foreach ($shops as $key=>$shop) {
|
||
if ($shop['node_id']) {
|
||
$bindShop[] = $shop['shop_id'];
|
||
} else {
|
||
$unbindShop[] = $shop['shop_id'];
|
||
}
|
||
}
|
||
$sync_none_filter = array('ship_status' => '0');
|
||
if ($bindShop && $unbindShop) {
|
||
$sync_none_filter['filter_sql'] = '(({table}sync="none" AND {table}shop_id in("'.implode('","',$bindShop).'"))'.' OR '.'({table}ship_status="0" AND shop_id in("'.implode('","',$unbindShop).'")))';
|
||
} elseif ($bindShop) {
|
||
$sync_none_filter['filter_sql'] = '{table}sync="none" AND {table}shop_id in("'.implode('","',$bindShop).'")';
|
||
} elseif ($unbindShop) {
|
||
$sync_none_filter['filter_sql'] = '{table}ship_status="0" AND {table}shop_id in("'.implode('","',$unbindShop).'")';
|
||
}
|
||
|
||
$base_filter = $this->getFilters();
|
||
|
||
$sub_menu[0] = array('label' => app::get('base')->_('全部'), 'filter' => $base_filter, 'optional' => false);
|
||
$sub_menu[1] = array('label' => app::get('base')->_('待发货'), 'filter' => array_merge($base_filter, $sync_none_filter), 'optional' => false);
|
||
$sub_menu[2] = array('label' => app::get('base')->_('回写未发起'),'filter' => array_merge($base_filter,array('createway' => 'matrix','sync' => 'none' ,'ship_status' => '1')),'optional' => false);
|
||
$sub_menu[3] = array('label' => app::get('base')->_('发货中'), 'filter' => array_merge($base_filter, array('createway'=>'matrix','sync' => 'run')), 'optional' => false);
|
||
$sub_menu[4] = array('label' => app::get('base')->_('发货失败'), 'filter' => array_merge($base_filter, array('createway'=>'matrix','sync' => 'fail','sync_fail_type'=>array('none','unbind'))), 'optional' => false);
|
||
$sub_menu[5] = array('label' => app::get('base')->_('京东发货失败'), 'filter' => array_merge($base_filter, array('createway'=>'matrix','sync' => 'fail','shop_type'=>'360buy','sync_fail_type' => array('none','unbind'))), 'optional' => false);
|
||
$sub_menu[6] = array('label' => app::get('base')->_('回写参数错误'), 'filter' => array_merge($base_filter, array('createway' => 'matrix','sync' => 'fail','sync_fail_type' => 'params')), 'optional' => false);
|
||
$sub_menu[7] = array('label' => app::get('base')->_('前端已发货'), 'filter' => array_merge($base_filter, array('createway' => 'matrix','sync' => 'fail','sync_fail_type' => 'shipped')), 'optional' => false);
|
||
$sub_menu[8] = array('label' => app::get('base')->_('发货成功'), 'filter' => array_merge($base_filter, array('createway' => 'matrix','sync' => 'succ')), 'optional' => false);
|
||
$sub_menu[9] = array('label' => app::get('base')->_('不予回写'),'filter' => array_merge($base_filter, array('createway' => array('local','import','after'))),'optional' => false);
|
||
|
||
foreach ($sub_menu as $k => $v) {
|
||
$sub_menu[$k]['filter'] = $v['filter'] ? $v['filter'] : null;
|
||
$sub_menu[$k]['addon'] = $mdl_order->count($v['filter']);
|
||
$sub_menu[$k]['href'] = 'index.php?app=wms&ctl=' . $_GET['ctl'] . '&act=' . $_GET['act'] . '&flt=' . $_GET['flt'] . '&view=' . $k . $s;
|
||
}
|
||
|
||
return $sub_menu;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 逐单发货的入口展示页
|
||
*/
|
||
function index(){
|
||
$weightSet = app::get('wms')->getConf('wms.delivery.weight');
|
||
$minWeight = app::get('wms')->getConf('wms.delivery.minWeight');
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
$this->pagedata['weightSet'] = $weightSet;
|
||
$this->pagedata['minWeight'] = $minWeight;
|
||
|
||
//称重报警max_weightwarn,weightpercent,min_weight,warnproblem_package
|
||
$weightWarn = app::get('wms')->getConf('wms.delivery.weightwarn');
|
||
$min_weightwarn = app::get('wms')->getConf('wms.delivery.min_weightwarn');
|
||
$max_weightwarn = app::get('wms')->getConf('wms.delivery.max_weightwarn');
|
||
$minpercent = app::get('wms')->getConf('wms.delivery.minpercent');
|
||
$maxpercent = app::get('wms')->getConf('wms.delivery.maxpercent');
|
||
$problem_package = app::get('wms')->getConf('wms.delivery.problem_package');
|
||
|
||
$this->pagedata['weightWarn'] = $weightWarn;
|
||
$this->pagedata['max_weightwarn'] = $max_weightwarn;
|
||
$this->pagedata['min_weightwarn'] = $min_weightwarn;
|
||
$this->pagedata['minpercent'] = $minpercent;
|
||
$this->pagedata['maxpercent'] = $maxpercent;
|
||
$this->pagedata['problem_package'] = $problem_package;
|
||
|
||
$numShow = app::get('wms')->getConf('wms.delivery.consignnum.show');
|
||
if ($numShow == 'false' || (cachecore::fetch('quick_access') !== false)) {
|
||
$this->pagedata['deliverynum'] = '未知';
|
||
} else {
|
||
$this->pagedata['deliverynum'] = $deliveryObj->countNoProcessDeliveryBill();
|
||
}
|
||
|
||
$this->pagedata['logi_no_position'] = (0==($pos=app::get('wms')->getConf('wms.delivery.logi'))) ? 'up' : 'down';
|
||
|
||
$this->page("admin/delivery/process_consign_index.html");
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 批量发货的入口展示页
|
||
*/
|
||
function batch(){
|
||
$stock_confirm= app::get('ome')->getConf('purchase.stock_confirm');
|
||
$stock_cancel= app::get('ome')->getConf('purchase.stock_cancel');
|
||
$this->pagedata['stock_confirm'] = $stock_confirm;
|
||
$this->pagedata['stock_cancel'] = $stock_cancel;
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
$this->pagedata['deliverynum'] = $deliveryObj->countNoProcessDeliveryBill();
|
||
$this->page("admin/delivery/process_consign_batch.html");
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 分组发货的入口展示页
|
||
*/
|
||
function group_consign(){
|
||
$deliCfgLib = kernel::single('wms_delivery_cfg');
|
||
$consign = $deliCfgLib->getValue('consign');
|
||
if($consign == 1){
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
$orderTypeObj = app::get('omeauto')->model('order_type');
|
||
$groupFilter['tid'] = $deliCfgLib->getValue('wms_delivery_consign_group');
|
||
$groupFilter['disabled'] = 'false';
|
||
$groupFilter['delivery_group'] = 'true';
|
||
$orderTypes = $orderTypeObj->getList('*',$groupFilter);
|
||
|
||
$filter = array(
|
||
'disabled' => 'false',
|
||
'process_status' => 3,
|
||
'status' => 0
|
||
);
|
||
$oBranch = app::get('ome')->model('branch');
|
||
$is_super = kernel::single('desktop_user')->is_super();
|
||
if (!$is_super) {
|
||
$branch_ids = $oBranch->getBranchByUser(true);
|
||
if ($branch_ids) {
|
||
$filter['branch_id'] = $branch_ids;
|
||
}
|
||
}
|
||
|
||
$deliverys = $deliveryObj->getList('delivery_id,delivery_group',$filter);
|
||
|
||
$deliveryGroup = array();
|
||
foreach($orderTypes as $key => $type){
|
||
$deliveryGroup[$type['tid']] = $type;
|
||
$deliveryGroup[$type['tid']]['deliverys'] = array();
|
||
$deliveryGroup[$type['tid']]['dCount'] = 0;
|
||
}
|
||
foreach($deliverys as $key => $value){
|
||
if($value['delivery_group']>0 && $deliveryGroup[$value['delivery_group']]){
|
||
$deliveryGroup[$value['delivery_group']]['deliverys'][] = $value['delivery_id'];
|
||
$deliveryGroup[$value['delivery_group']]['dCount']++;
|
||
}
|
||
$deliveryAll[] = $value['delivery_id'];
|
||
}
|
||
/*$deliveryGroup[8388607] = array(
|
||
'tid' => 8388607,
|
||
'name' => '全部分组',
|
||
'deliverys' => $deliveryAll,
|
||
'dCount' => count($deliveryAll),
|
||
);*/
|
||
|
||
$this->pagedata['num'] = $deliveryObj->countNoProcessDelivery();
|
||
$this->pagedata['deliveryGroup'] = $deliveryGroup;
|
||
$this->pagedata['jsonDeliveryGroup'] = json_encode($deliveryGroup);
|
||
|
||
/* 操作时间间隔 start */
|
||
$lastGroupDelivery = app::get('wms')->getConf('lastGroupDelivery'); //上次获取订单信息(key为execTime表示执行时间,key为pageBn表示页面编号),
|
||
$groupDeliveryIntervalTime = app::get('wms')->getConf('wms.groupDelivery.intervalTime'); //每次操作的时间间隔
|
||
|
||
if(($lastGroupDelivery['execTime']+60*$groupDeliveryIntervalTime)<time()){
|
||
$this->pagedata['is_allow'] = true;
|
||
}else{
|
||
$this->pagedata['is_allow'] = false;
|
||
}
|
||
$this->pagedata['lastGroupDeliveryTime'] = !empty($lastGroupDelivery['execTime']) ? date('Y-m-d H:i:s',$lastGroupDelivery['execTime']) : '';
|
||
$this->pagedata['groupDeliveryIntervalTime'] = $groupDeliveryIntervalTime;
|
||
$this->pagedata['currentTime'] = time();
|
||
/* 操作时间间隔 end */
|
||
|
||
$this->page("admin/delivery/process_group_consign.html");
|
||
}else{
|
||
echo "未开启分组发货!";
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 发货前的发货单相关信息检查
|
||
*/
|
||
function batchCheck(&$rs = false){
|
||
$logi_nos = urldecode($_POST['delivery_id']);
|
||
$weight = $_POST['weight'];
|
||
if (empty($logi_nos)){
|
||
$tmp = array(array('bn'=>'*','msg'=>'请扫描快递单号'));
|
||
echo json_encode($tmp);
|
||
die;
|
||
}
|
||
|
||
$dlyCheckLib = kernel::single('wms_delivery_check');
|
||
|
||
//逐个发货:发货判断,批量发货不做此过滤
|
||
if ($_GET['delivery_type'] == 'single'){
|
||
$return_error = $dlyCheckLib->consignAllow('', $logi_nos, $weight);
|
||
if ($return_error){
|
||
$tmp = array('status'=>'error','msg'=>$return_error);
|
||
echo json_encode($tmp);
|
||
die;
|
||
}
|
||
}else{
|
||
$logi_no_arr = array_unique(explode(',', $logi_nos));
|
||
$delivery_list = array();
|
||
|
||
if ($logi_no_arr){
|
||
foreach ($logi_no_arr as $v){
|
||
//过滤空值
|
||
if (empty($v)) continue;
|
||
|
||
//验证
|
||
$return_error = $dlyCheckLib->consignAllow('', $v, false);
|
||
if ($return_error) {
|
||
$tmp[] = array('bn'=>$v,'msg'=>$return_error);
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if ($tmp){
|
||
echo json_encode($tmp); die;
|
||
}
|
||
|
||
$rs = true;#发货判断完成的标示,这个对校验完成即发货有用
|
||
echo "";
|
||
}
|
||
|
||
function batch_log_detail(){
|
||
$log_id = $_GET['log_id'];
|
||
$filter = array('log_id'=>$log_id);
|
||
if ($_GET['status']) {
|
||
$filter['status'] = $_GET['status'];
|
||
}
|
||
$bldObj = app::get('wms')->model('batch_detail_log');
|
||
$bldData = $bldObj->getList('*',$filter,0,-1);
|
||
foreach($bldData as $k=>$v){
|
||
$bldData[$k]['createtime'] = date('Y-m-d H:i:s',$v['createtime']);
|
||
}
|
||
$this->pagedata['bldData'] = $bldData;
|
||
$this->display('admin/delivery/batch_log_detail.html');
|
||
}
|
||
|
||
/**
|
||
* 批量发货确认
|
||
* 显示批量发货订单中有退款申请或已退款的订单,让管理员确认是否发货或不发货
|
||
* @param json $data
|
||
* @return null
|
||
*/
|
||
function batch_delivery_confirm($data=null){
|
||
$this->pagedata['delivery_type'] = $_GET['delivery_type'];
|
||
$this->display('admin/order/batch_delivery_confirm.html');
|
||
}
|
||
|
||
/**
|
||
* 发货处理
|
||
*
|
||
*/
|
||
function consign($is_from_check = false){
|
||
if($is_from_check){
|
||
$redirct_url = "index.php?app=wms&ctl=admin_check&act=index&type=all";
|
||
}else{
|
||
$redirct_url = "index.php?app=wms&ctl=admin_consign";
|
||
}
|
||
$this->begin($redirct_url);
|
||
|
||
$logi_no = $_POST['logi_no'];
|
||
$weight = $_POST['weight'];
|
||
|
||
$dlyObj = app::get('wms')->model('delivery');
|
||
$dlyBillObj = app::get('wms')->model('delivery_bill');
|
||
$deliveryBillLib = kernel::single('wms_delivery_bill');
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
$wmsCommonLib = kernel::single('wms_common');
|
||
$dlyProcessLib = kernel::single('wms_delivery_process');
|
||
|
||
$primary = false;
|
||
$secondary = false;
|
||
|
||
//如果没有发货单信息,则根据物流单号识别是主单还是次单,并获取相关信息
|
||
$delivery_id = $deliveryBillLib->getDeliveryIdByPrimaryLogi($logi_no);
|
||
|
||
//[同城配]商家配送支持配送员手机号搜索
|
||
if(empty($delivery_id) && strlen($logi_no) == 11){
|
||
$deliveryInfo = $dlyObj->dump(array('deliveryman_mobile'=>$logi_no, 'process_status'=>array(2,3)), '*');
|
||
if($deliveryInfo){
|
||
$delivery_id = $deliveryInfo['delivery_id'];
|
||
|
||
$dlyBillInfo = $dlyBillObj->db_dump(array('delivery_id'=>$delivery_id), '*');
|
||
$logi_no = $dlyBillInfo['logi_no'];
|
||
}
|
||
}
|
||
|
||
if(!is_null($delivery_id)){
|
||
$primary = true;
|
||
$dly = $dlyObj->dump(array('delivery_id' => $delivery_id),'*',array('delivery_items'=>array('*')));
|
||
}else{
|
||
$delivery_id = $deliveryBillLib->getDeliveryIdBySecondaryLogi($logi_no);
|
||
if(!is_null($delivery_id)){
|
||
$secondary = true;
|
||
$dly = $dlyObj->dump(array('delivery_id' => $delivery_id),'*',array('delivery_items'=>array('*')));
|
||
}
|
||
}
|
||
|
||
$logi_number = $dly['logi_number'];
|
||
$delivery_logi_number =$dly['delivery_logi_number'];
|
||
|
||
//检查前端订单是否退款,原有逻辑是否需要?
|
||
|
||
//danny_freeze_stock_log
|
||
define('FRST_TRIGGER_OBJECT_TYPE','发货单:逐单发货');
|
||
define('FRST_TRIGGER_ACTION_TYPE','ome_ctl_admin_consign:consign');
|
||
|
||
//报警发货处理
|
||
/*
|
||
if($_POST['warn_status']=='1'){
|
||
$opObj->write_log('delivery_weightwarn@wms', $dly["delivery_id"],'物流单号:'.$logi_no.',仍然发货(称重为:'.$weight.'g)');
|
||
}
|
||
*/
|
||
|
||
//获取物流费用
|
||
$area = $dly['consignee']['area'];
|
||
$arrArea = explode(':', $area);
|
||
$area_id = $arrArea[2];
|
||
$delivery_cost_actual = $wmsCommonLib->getDeliveryFreight($area_id,$dly['logi_id'],$weight);
|
||
|
||
//如果是次物流单号
|
||
if($secondary){
|
||
$data = array(
|
||
'status'=>'1',
|
||
'weight'=>$weight,
|
||
'delivery_cost_actual'=>$delivery_cost_actual,
|
||
'delivery_time'=>time(),
|
||
'type' => 2,
|
||
);
|
||
$filter = array('logi_no'=>$logi_no);
|
||
$dlyBillObj->update($data,$filter);
|
||
|
||
$logstr = '快递单号:'.$logi_no.' 发货';
|
||
$opObj->write_log('delivery_bill_express@wms', $dly["delivery_id"], $logstr);
|
||
|
||
if(($logi_number==$delivery_logi_number)&&$dly['status'] != 3){
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}else{
|
||
$data = array('delivery_logi_number'=>$delivery_logi_number+1,'weight'=>$dly['weight']+$weight,'delivery_cost_actual'=>$dly['delivery_cost_actual']+$delivery_cost_actual);
|
||
$filter = array('delivery_id'=>$dly['delivery_id']);
|
||
$dlyObj->update($data,$filter);
|
||
|
||
if($logi_number==($delivery_logi_number+1)){
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}else{
|
||
$this->end(true, '发货处理完成');
|
||
}
|
||
}
|
||
}else{
|
||
//判断这个主物流单有没有对应的次物流单,等于1的时候只有一个包裹单
|
||
if($logi_number == 1){
|
||
if(($logi_number==$delivery_logi_number)&&$dly['status'] != 3){
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}else{
|
||
$data = array(
|
||
'status'=>'1',
|
||
'weight'=>$weight,
|
||
'delivery_cost_actual'=>$delivery_cost_actual,
|
||
'delivery_time'=>time(),
|
||
'type' => 1,
|
||
);
|
||
$filter = array('logi_no'=>$logi_no);
|
||
$dlyBillObj->update($data,$filter);
|
||
|
||
$data = array('delivery_logi_number'=>$delivery_logi_number+1,'weight'=>$dly['weight']+$weight,'delivery_cost_actual'=>$dly['delivery_cost_actual']+$delivery_cost_actual);
|
||
$filter = array('delivery_id'=>$dly['delivery_id']);
|
||
$dlyObj->update($data,$filter);
|
||
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}
|
||
}else{
|
||
//如果存在子物流单
|
||
//计算已经发货的子物流单、总共的物流单
|
||
//1,查询实际的发货数量,和总物流数量
|
||
if(($logi_number > $delivery_logi_number)){
|
||
$data = array(
|
||
'status'=>'1',
|
||
'weight'=>$weight,
|
||
'delivery_cost_actual'=>$delivery_cost_actual,
|
||
'delivery_time'=>time(),
|
||
'type' => 1,
|
||
);
|
||
$filter = array('logi_no'=>$logi_no);
|
||
$dlyBillObj->update($data,$filter);
|
||
|
||
$data = array(
|
||
'delivery_logi_number'=>$delivery_logi_number+1,
|
||
'weight'=>$dly['weight']+$weight,
|
||
'delivery_cost_actual'=>$dly['delivery_cost_actual']+$delivery_cost_actual,
|
||
);
|
||
$filter = array('delivery_id'=>$dly['delivery_id']);
|
||
$dlyObj->update($data,$filter);
|
||
|
||
if($logi_number==($delivery_logi_number+1)){
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}
|
||
$this->end(true, '发货处理完成');
|
||
//加入如果$logi_number==$delivery_logi_number 但是发货状态没有改变的判断
|
||
}elseif(($delivery_logi_number == $logi_number) && $dly['status'] != 3){
|
||
if ($dlyProcessLib->consignDelivery($dly['delivery_id'])){
|
||
$this->end(true, '发货处理完成');
|
||
}else {
|
||
$msg['delivery_bn'] = $dly['delivery_bn'];
|
||
$this->end(false, '发货未完成', '', array('msg'=>$msg));
|
||
}
|
||
}else{
|
||
$this->end(false, '此物流运单已发货');
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 分组发货执行方法
|
||
*/
|
||
function ajaxDoGroupConsign(){
|
||
$tmp = explode('||', $_POST['ajaxParams']);
|
||
$group = $tmp[0];
|
||
$delivery = explode(';', $tmp[1]);
|
||
$minWeight = app::get('wms')->getConf('wms.delivery.minWeight');
|
||
if(count($delivery)>0 && $group>0){
|
||
/* 执行时间判断 start */
|
||
$pageBn = intval($_POST['pageBn']);
|
||
$lastGroupDelivery = app::get('wms')->getConf('lastGroupDelivery'); //上次获取订单信息(key为execTime表示执行时间,key为pageBn表示页面编号),
|
||
$groupDeliveryIntervalTime = app::get('wms')->getConf('ome.groupDelivery.intervalTime'); //每次操作的时间间隔
|
||
|
||
if($pageBn !=$lastGroupDelivery['pageBn'] && ($lastGroupDelivery['execTime']+60*$groupDeliveryIntervalTime)>time()){
|
||
echo json_encode(array('total' => count($delivery), 'succ' => 0, 'fail' => count($delivery), 'failInfo'=>array('执行时间不合法')));
|
||
exit;
|
||
}
|
||
if($pageBn !=$lastGroupDelivery['pageBn'] && $pageBn<$lastGroupDelivery['execTime']){
|
||
echo json_encode(array('total' => count($delivery), 'succ' => 0, 'fail' => count($delivery), 'failInfo'=>array('提交参数过期')));
|
||
exit;
|
||
}
|
||
|
||
//记录本次获取订单时间
|
||
$currentGroupDelivery = array(
|
||
'execTime'=>time(),
|
||
'pageBn'=>$pageBn,
|
||
);
|
||
app::get('ome')->setconf('lastGroupDelivery',$currentGroupDelivery);
|
||
/* 执行时间判断 end */
|
||
|
||
$deliCfgLib = kernel::single('wms_delivery_cfg');
|
||
$weightGroup = $deliCfgLib->getValue('wms_delivery_consign_weight');
|
||
$group_weight = $weightGroup[$group] ? intval($weightGroup[$group]) : 0;
|
||
#获取商品重量
|
||
|
||
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
$deliveryBillObj = app::get('wms')->model('delivery_bill');
|
||
$dlyBillLib = kernel::single('wms_delivery_bill');
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
$wmsCommonLib = kernel::single('wms_common');
|
||
$dlyCheckLib = kernel::single('wms_delivery_check');
|
||
$dlyProcessLib = kernel::single('wms_delivery_process');
|
||
|
||
$filter = array(
|
||
'delivery_id'=>$delivery,
|
||
);
|
||
$deliverys = $deliveryObj->getList('*',$filter);
|
||
$succ = 0;
|
||
$fail = 0;
|
||
$failInfo = array();
|
||
foreach($deliverys as $value){
|
||
|
||
$weight = $value['net_weight']>0 ? $value['net_weight'] : $group_weight;
|
||
$weight = $weight ? $weight : $minWeight;
|
||
|
||
//获取物流费用
|
||
$area = $value['ship_area'];
|
||
$arrArea = explode(':', $area);
|
||
$area_id = $arrArea[2];
|
||
$delivery_cost_actual = $wmsCommonLib->getDeliveryFreight($area_id,$value['logi_id'],$weight);
|
||
|
||
$logi_no = $dlyBillLib->getPrimaryLogiNoById($value['delivery_id']);
|
||
$return_error = $dlyCheckLib->consignAllow('', $logi_no, $weight);
|
||
if(empty($return_error)) {
|
||
|
||
$billInfo = $dlyCheckLib->unDlyChildBills($value['delivery_id']);
|
||
if($billInfo){
|
||
|
||
$flag = true;
|
||
foreach($billInfo as $v){
|
||
if(empty($v['logi_no'])){
|
||
$flag = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if($flag){
|
||
$data = array(
|
||
'status'=> 1,
|
||
'weight'=>0.00,
|
||
'delivery_cost_actual'=> 0.00,
|
||
'delivery_time'=>time(),
|
||
);
|
||
$filter = array('delivery_id'=>$value['delivery_id'],'status'=> 0, 'type'=>2);
|
||
$num = $deliveryBillObj->update($data,$filter);
|
||
|
||
$logstr = '分组发货('.$num.')份';
|
||
$opObj->write_log('delivery_bill_express@wms', $value['delivery_id'], $logstr);
|
||
|
||
$data = array(
|
||
'status'=> 1,
|
||
'weight'=>$weight,
|
||
'delivery_cost_actual'=>$delivery_cost_actual,
|
||
'delivery_time'=>time(),
|
||
);
|
||
$filter = array('delivery_id'=>$value['delivery_id'],'status'=> 0, 'type'=>1);
|
||
$deliveryBillObj->update($data,$filter);
|
||
|
||
$numdata = array('delivery_logi_number'=>$value['logi_number'],'weight'=>$weight,'delivery_cost_actual'=>$delivery_cost_actual);
|
||
$numfilter = array('delivery_id'=>$value['delivery_id']);
|
||
$deliveryObj->update($numdata,$numfilter);
|
||
|
||
if($dlyProcessLib->consignDelivery($value['delivery_id'], wms_const::__GROUP)){
|
||
$succ++;
|
||
}else{
|
||
$fail++;
|
||
$failInfo[] = $value['delivery_bn'];
|
||
}
|
||
}else{
|
||
$fail++;
|
||
$failInfo[] = $value['delivery_bn'];
|
||
}
|
||
}else{
|
||
$data = array(
|
||
'status'=> 1,
|
||
'weight'=>$weight,
|
||
'delivery_cost_actual'=>$delivery_cost_actual,
|
||
'delivery_time'=>time(),
|
||
);
|
||
$filter = array('delivery_id'=>$value['delivery_id'],'status'=> 0, 'type'=>1);
|
||
$deliveryBillObj->update($data,$filter);
|
||
|
||
$numdata = array('delivery_logi_number'=>$value['logi_number'],'weight'=>$weight,'delivery_cost_actual'=>$delivery_cost_actual);
|
||
$numfilter = array('delivery_id'=>$value['delivery_id']);
|
||
$deliveryObj->update($numdata,$numfilter);
|
||
|
||
if($dlyProcessLib->consignDelivery($value['delivery_id'])){
|
||
//分组发货日志
|
||
$logstr = '分组发货完成';
|
||
$opObj->write_log('delivery_process@wms', $value['delivery_id'], $logstr);
|
||
$succ++;
|
||
}else{
|
||
$fail++;
|
||
$failInfo[] = $value['delivery_bn'];
|
||
}
|
||
}
|
||
}else{
|
||
$fail++;
|
||
$failInfo[] = $value['delivery_bn'].$return_error;
|
||
}
|
||
usleep(200000);
|
||
}
|
||
echo json_encode(array('total' => count($delivery), 'succ' => $succ, 'fail' => $fail, 'failInfo'=>$failInfo));
|
||
}else{
|
||
echo json_encode(array('total' => 0, 'succ' => 0, 'fail' => 0, 'failInfo'=>$failInfo));
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 补打物流单入口页
|
||
*/
|
||
public function fill_delivery(){
|
||
$this->page("admin/delivery/fill_delivery.html");
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 补打物流单的详细页
|
||
*/
|
||
public function fill_delivery_confirm(){
|
||
$str = array();
|
||
$logi_no = $_POST['logi_no'];
|
||
|
||
$dlyObj = app::get('wms')->model('delivery');
|
||
$dlyBillObj = app::get('wms')->model('delivery_bill');
|
||
$dlyCheckLib = kernel::single('wms_delivery_check');
|
||
$deliveryBillItemMdl = app::get('wms')->model('delivery_bill_items');
|
||
|
||
//识别是主单还是次单
|
||
$dlyBillInfo = $dlyBillObj->dump(array('logi_no'=>$logi_no),'delivery_id,type');
|
||
$delivery_id = $dlyBillInfo['delivery_id'];
|
||
|
||
if($delivery_id && $dlyBillInfo['type'] == 2){
|
||
$dlyInfo = $dlyObj->dump(array('delivery_id'=>$delivery_id),'*');
|
||
$return_error = $dlyCheckLib->extLogiNoAllow($dlyInfo, $logi_no);
|
||
if ($return_error){
|
||
$this->splash('error',null, $return_error);
|
||
// $str['str'] = $return_error;
|
||
// $tmp = array('status'=>'error','msg'=>$str);
|
||
// echo json_encode($tmp);
|
||
// die;
|
||
}
|
||
}elseif($delivery_id && $dlyBillInfo['type'] == 1){
|
||
$dlyInfo = $dlyObj->dump(array('delivery_id'=>$delivery_id),'*');
|
||
$return_error = $dlyCheckLib->extLogiNoAllow($dlyInfo, $logi_no);
|
||
if($return_error){
|
||
$this->splash('error',null, $return_error);
|
||
}
|
||
}else{
|
||
// $str['str'] = '物流单号不存在';
|
||
$this->splash('error',null, '物流单号不存在');
|
||
}
|
||
|
||
$dlyBillAllInfo = $dlyBillObj->getList('*',array('delivery_id'=>$dlyInfo['delivery_id']));
|
||
foreach($dlyBillAllInfo as &$item){
|
||
$item['logi_name'] = $dlyInfo['logi_name'];
|
||
|
||
$item['products'] = $deliveryBillItemMdl->getList('*', ['bill_id' => $item['b_id']]);
|
||
$item['status'] = $this->statusinfo($item['status']);
|
||
}
|
||
$this->pagedata['dlyBillAllInfo'] = $dlyBillAllInfo;
|
||
$this->pagedata['dlyInfo'] = $dlyInfo;
|
||
$this->display('admin/delivery/consign/package_print.html','wms');exit;
|
||
|
||
// foreach($dlyBillAllInfo as $item){
|
||
// $deliveryBillItemList = $deliveryBillItemMdl->getList('*', ['bill_id' => $item['b_id']]);
|
||
|
||
// if($item['type'] == 1){
|
||
// $str['str'] = '<tr style="background-color:#f6f6f6; color:red; font-weight:bold;height:35px;"><td>'.$dlyInfo['logi_name'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['logi_no'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['package_bn'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['weight'].'</td>';
|
||
// $str['str'] .= '<td></td>';
|
||
// $str['str'] .= '<td>'.$this->statusinfo($item['status']).'</td>';
|
||
|
||
// // 包裹明细----------------8<
|
||
// $str['str'] .= '<td>';
|
||
// if ($deliveryBillItemList){
|
||
// foreach ($deliveryBillItemList as $value) {
|
||
// $str['str'] .=<<<HTML
|
||
// <div>
|
||
// <div class="span-6">物料编码:{$value['bn']}</div>
|
||
// <div class="span-auto">物料名称:{$value['product_name']}</div>
|
||
// <div class="span-3">包裹数量:{$value['number']}</div>
|
||
// </div>
|
||
// HTML;
|
||
// }
|
||
// }
|
||
// $str['str'] .= '</td>';
|
||
// // 包裹明细----------------8<
|
||
|
||
|
||
// $str['str'] .= '<td></td></tr>';
|
||
// }else{
|
||
// $str['str'] .= '<tr style="background-color:#f6f6f6; font-weight:bold;height:35px;"><td>'.$dlyInfo['logi_name'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['logi_no'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['package_bn'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['weight'].'</td>';
|
||
// $str['str'] .= '<td>'.date('Y-m-d H:s:m',$item['create_time']).'</td>';
|
||
// $str['str'] .= '<td>'.$this->statusinfo($item['status'],0).'</td>';
|
||
// // 包裹明细----------------8<
|
||
// $str['str'] .= '<td>';
|
||
// if ($deliveryBillItemList){
|
||
// foreach ($deliveryBillItemList as $value) {
|
||
// $str['str'] .=<<<HTML
|
||
// <div>
|
||
// <div class="span-6">物料编码:{$value['bn']}</div>
|
||
// <div class="span-auto">物料名称:{$value['product_name']}</div>
|
||
// <div class="span-3">包裹数量:{$value['number']}</div>
|
||
// </div>
|
||
// HTML;
|
||
// }
|
||
// }
|
||
// $str['str'] .= '</td>';
|
||
// // 包裹明细----------------8<
|
||
// if($item['status']==1){
|
||
// $str['str'] .= '<td></td></tr>';
|
||
// }else{
|
||
// $str['str'] .= '<td><button type="button" onclick="del_deliveryBill('.$item['b_id'].','.$dlyInfo['delivery_id'].')" style="height:28px;width:40px;">删除</button></td></tr>';
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// $str['delivery_id'] = $dlyInfo['delivery_id'];
|
||
// $tmp = array('status'=>'success','msg'=>$str);
|
||
// echo json_encode($tmp);
|
||
// die;
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 删除子快递单
|
||
*/
|
||
function del_deliveryBill(){
|
||
$b_id = $_POST['b_id'];
|
||
$delivery_id = $_POST['delivery_id'];
|
||
|
||
$dlyBillObj = app::get('wms')->model('delivery_bill');
|
||
$deliveryBillItemMdl = app::get('wms')->model('delivery_bill_items');
|
||
|
||
if($dbo=$dlyBillObj->dump(array('b_id'=>$b_id))){
|
||
$dlyCorpObj = app::get('ome')->model('dly_corp');
|
||
$delivery = app::get('wms')->model('delivery');
|
||
$dlyInfo = $delivery->dump(array('delivery_id'=>$delivery_id));
|
||
$status = false;
|
||
if($dbo['status'] == 1){
|
||
$status = true;
|
||
}
|
||
|
||
//写入日志
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
if(empty($dbo['logi_no'])){
|
||
$logstr = '删除快递单,单号为空';
|
||
}else{
|
||
$dlyCorp = $dlyCorpObj->dump($dlyInfo['logi_id'], 'tmpl_type,channel_id');
|
||
//回收电子面单
|
||
|
||
if ($dlyCorp['tmpl_type'] == 'electron') {
|
||
$waybillObj = kernel::single('logisticsmanager_service_waybill');
|
||
|
||
$waybillObj->recycle_waybill($dbo['logi_no'],$dlyCorp['channel_id'],$delivery_id);
|
||
//如果是申通发送取消
|
||
|
||
}
|
||
$logstr = '删除快递单,单号:'.$dbo['logi_no'];
|
||
|
||
}
|
||
$opObj->write_log('delivery_bill_delete@wms', $delivery_id, $logstr);
|
||
|
||
$result = $dlyBillObj->delete(array('b_id'=>$b_id));
|
||
if($result){
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
if($status){
|
||
$sql = "update sdb_wms_delivery set logi_number=logi_number-1,delivery_logi_number=delivery_logi_number-1 where delivery_id=".$delivery_id;
|
||
}else{
|
||
$sql = "update sdb_wms_delivery set logi_number=logi_number-1 where delivery_id=".$delivery_id;
|
||
}
|
||
$deliveryObj->db->exec($sql);
|
||
|
||
// 删除包裹明细
|
||
$deliveryBillItemMdl = app::get('wms')->model('delivery_bill_items');
|
||
$deliveryBillItemMdl->delete(['bill_id' => $b_id]);
|
||
|
||
//京东电子面单补打
|
||
$channel_info = kernel::single('wms_delivery_print_ship')->getWaybillType($delivery_id);
|
||
if (in_array($channel_info['channel_type'],array('360buy'))) {
|
||
$logi_total = $dlyBillObj->count(array('delivery_id'=>$delivery_id,'type'=>'2'));
|
||
$delivery_data = $dlyBillObj->dump(array('delivery_id' => $delivery_id,'type'=>'1'),'logi_no');
|
||
$logi_no_total = $logi_total+1;
|
||
$logi_no_num = 1;
|
||
if ($logi_total>0) {
|
||
$dlyBillObj->db->exec("DELETE FROM sdb_wms_delivery_bill WHERE delivery_id=".$delivery_id." AND `type`='2'");
|
||
for($i=0;$i<$logi_total;$i++) {
|
||
$data = array('delivery_id' => $delivery_id,'create_time'=>time(),'type'=>2);
|
||
$logi_no_num++;
|
||
$data['logi_no'] = $delivery_data['logi_no'].'-'.$logi_no_num.'-'.$logi_no_total.'-';
|
||
$dlyBillObj->insert($data);
|
||
}
|
||
}
|
||
}
|
||
//
|
||
$dlyInfo = $deliveryObj->dump(array('delivery_id'=>$delivery_id));
|
||
$dlyBillAllInfo = $dlyBillObj->getList('*',array('delivery_id'=>$delivery_id));
|
||
|
||
|
||
// foreach($dlyBillAllInfo as $item){
|
||
// $deliveryBillItemList = $deliveryBillItemMdl->getList('*', ['bill_id' => $item['b_id']]);
|
||
|
||
// if($item['type'] == 1){
|
||
// $str['str'] = '<tr style="background-color:#f6f6f6; color:red;font-weight:bold;height:35px;"><td>'.$dlyInfo['logi_name'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['logi_no'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['package_bn'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['weight'].'</td>';
|
||
// $str['str'] .= '<td></td>';
|
||
// $str['str'] .= '<td>'.$this->statusinfo($item['status']).'</td>';
|
||
// // 包裹明细----------------8<
|
||
// $str['str'] .= '<td>';
|
||
// if ($deliveryBillItemList){
|
||
// foreach ($deliveryBillItemList as $value) {
|
||
// $str['str'] .=<<<HTML
|
||
// <div>
|
||
// <div class="span-6">物料编码:{$value['bn']}</div>
|
||
// <div class="span-auto">物料名称:{$value['product_name']}</div>
|
||
// <div class="span-3">包裹数量:{$value['number']}</div>
|
||
// </div>
|
||
// HTML;
|
||
// }
|
||
// }
|
||
// $str['str'] .= '</td>';
|
||
// // 包裹明细----------------8<
|
||
|
||
// $str['str'] .= '<td></td></tr>';
|
||
// }else{
|
||
// $str['str'] .= '<tr style="background-color:#f6f6f6; font-weight:bold;height:35px;"><td>'.$dlyInfo['logi_name'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['logi_no'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['package_bn'].'</td>';
|
||
// $str['str'] .= '<td>'.$item['weight'].'</td>';
|
||
// $str['str'] .= '<td>'.date('Y-m-d H:s:m',$item['create_time']).'</td>';
|
||
// $str['str'] .= '<td>'.$this->statusinfo($item['status'],0).'</td>';
|
||
|
||
// // 包裹明细----------------8<
|
||
// $str['str'] .= '<td>';
|
||
// if ($deliveryBillItemList){
|
||
// foreach ($deliveryBillItemList as $value) {
|
||
// $str['str'] .=<<<HTML
|
||
// <div>
|
||
// <div class="span-6">物料编码:{$value['bn']}</div>
|
||
// <div class="span-auto">物料名称:{$value['product_name']}</div>
|
||
// <div class="span-3">包裹数量:{$value['number']}</div>
|
||
// </div>
|
||
// HTML;
|
||
// }
|
||
// }
|
||
// $str['str'] .= '</td>';
|
||
// // 包裹明细----------------8<
|
||
|
||
// if($item['status']==1){
|
||
// $str['str'] .= '<td></td></tr>';
|
||
// }else{
|
||
// $str['str'] .= '<td><button type="button" onclick="del_deliveryBill('.$item['b_id'].','.$dlyInfo['delivery_id'].')" style="height:28px;width:40px;">删除</button></td></tr>';
|
||
// }
|
||
// }
|
||
// }
|
||
|
||
// $str['delivery_id'] = $delivery_id;
|
||
|
||
//判断总包裹是否等于包裹数如果等于执行发货操作
|
||
if ($dlyInfo['logi_number'] ==$dlyInfo['delivery_logi_number'] ) {
|
||
if($dlyInfo['status'] != 3){
|
||
$dlyProcessLib = kernel::single('wms_delivery_process');
|
||
$dlyProcessLib->consignDelivery($dlyInfo['delivery_id']);
|
||
|
||
}
|
||
}
|
||
|
||
// $tmp = array('status'=>'success','msg'=>$str);
|
||
// echo json_encode($tmp);
|
||
|
||
foreach($dlyBillAllInfo as &$item){
|
||
$item['logi_name'] = $dlyInfo['logi_name'];
|
||
|
||
$item['products'] = $deliveryBillItemMdl->getList('*', ['bill_id' => $item['b_id']]);
|
||
$item['status'] = $this->statusinfo($item['status']);
|
||
}
|
||
|
||
$this->pagedata['dlyBillAllInfo'] = $dlyBillAllInfo;
|
||
$this->pagedata['dlyInfo'] = $dlyInfo;
|
||
$this->display('admin/delivery/consign/package_print.html','wms');
|
||
}else{
|
||
$this->splash('error',null, '删除失败');
|
||
}
|
||
}else{
|
||
$this->splash('error',null, '删除失败');
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 快递单状态翻译显示
|
||
*/
|
||
function statusinfo($status,$style=1){
|
||
switch($style){
|
||
case 1:
|
||
switch($status){
|
||
case 0:
|
||
return '未发货';
|
||
case 1:
|
||
return '已发货';
|
||
}
|
||
case 0:
|
||
switch($status){
|
||
case 0:
|
||
return '未发货';
|
||
case 1:
|
||
return '<font color=red>已发货</font>';
|
||
case 2:
|
||
return '已取消';
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 保存批量发货至记录队列表中
|
||
*/
|
||
function doBatchConsign(){
|
||
$goto_url = 'index.php?app=wms&ctl=admin_consign&act=batch';
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
$delivery_ids = explode(',', $ids);
|
||
$delivery_ids = array_filter($delivery_ids);
|
||
|
||
if ( !$delivery_ids ) {
|
||
$this->splash('success',$goto_url ,'快递单列表为空!');
|
||
}
|
||
|
||
$batch_number = count($delivery_ids);
|
||
$blObj = app::get('wms')->model('batch_log');
|
||
|
||
$bldata = array(
|
||
'op_id' => kernel::single('desktop_user')->get_id(),
|
||
'op_name' => kernel::single('desktop_user')->get_name(),
|
||
'createtime' => time(),
|
||
'batch_number' => $batch_number,
|
||
'log_type'=>'consign',
|
||
'log_text'=>serialize($delivery_ids)
|
||
);
|
||
$result = $blObj->save($bldata);
|
||
|
||
//发货任务加队列
|
||
$push_params = array(
|
||
'data' => array(
|
||
'log_text' => $bldata['log_text'],
|
||
'log_id' => $bldata['log_id'],
|
||
'task_type' => 'autodly'
|
||
),
|
||
'url' => kernel::openapi_url('openapi.autotask','service')
|
||
);
|
||
kernel::single('taskmgr_interface_connecter')->push($push_params);
|
||
|
||
$this->splash('success',$goto_url ,'发货完成');
|
||
}
|
||
|
||
/**
|
||
* 获取发货记录历史
|
||
*/
|
||
function batchConsignLog(){
|
||
$blObj = app::get('wms')->model('batch_log');
|
||
$batchLogLib = kernel::single('wms_batch_log');
|
||
|
||
$dayBegin = mktime(0,0,0,date("m"),date("d"),date("Y"));//当天开始时间戳
|
||
$dayEnd = mktime(23,59,59,date("m"),date("d"),date("Y"));//当天结束时间戳
|
||
|
||
$blResult = $blObj->getList('*', array('log_type'=>'consign','createtime|than'=>$dayBegin,'createtime|lthan'=>$dayEnd), 0, -1,'createtime desc');
|
||
foreach($blResult as $k=>$v){
|
||
$blResult[$k]['status_value'] = $batchLogLib->getStatus($v['status']);
|
||
$blResult[$k]['fail_number'] = $v['fail_number'];
|
||
$blResult[$k]['createtime'] = date('Y-m-d H:i:s',$v['createtime']);
|
||
}
|
||
|
||
if($blResult){
|
||
echo json_encode($blResult);
|
||
}
|
||
}
|
||
|
||
/**
|
||
*
|
||
* 更新处理中发货记录值
|
||
*/
|
||
function updateBatchConsignLog(){
|
||
$log_id = urldecode($_POST['log_id']);
|
||
if($log_id){
|
||
$batchLogLib = kernel::single('wms_batch_log');
|
||
$log_id = explode(',',$log_id);
|
||
$status="'0','2'";
|
||
|
||
$blResult = $batchLogLib->get_List('consign',$log_id,$status);
|
||
foreach($blResult as $k=>$v){
|
||
$status = $v['status'];
|
||
$fail_number = $v['fail_number'];
|
||
$blResult[$k]['status_value'] = $batchLogLib->getStatus($status);
|
||
$blResult[$k]['fail_number'] = $fail_number;
|
||
|
||
}
|
||
if($blResult){
|
||
echo json_encode($blResult);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* 商品重量报警判断
|
||
*/
|
||
function weightWarn(){
|
||
$type = $_GET['type'];
|
||
$logi_no = $_POST['logi_no'];
|
||
if($type=='countpackage'){
|
||
#判断发货单是否多包裹
|
||
$delivery = app::get('ome')->model('delivery')->dump(array('logi_no|nequal' => $logi_no),'delivery_id');
|
||
$dlyBillObj = app::get('ome')->model('delivery_bill');
|
||
$dlyBill = $dlyBillObj->dump(array('logi_no|nequal' => $logi_no),'delivery_id');
|
||
if($delivery){
|
||
$delivery_id = $delivery['delivery_id'];
|
||
}else{
|
||
$delivery_id = $dlyBill['delivery_id'];
|
||
}
|
||
$billfilter = array(
|
||
|
||
'delivery_id'=>$delivery_id,
|
||
);
|
||
$num = $dlyBillObj->count($billfilter);
|
||
echo $num;
|
||
|
||
|
||
}else{
|
||
|
||
$weight = $_POST['weight'];
|
||
|
||
$product_weight = app::get('ome')->model('delivery')->getWeightbydelivery_id($logi_no);
|
||
|
||
echo json_encode($product_weight);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
/**
|
||
* 发货重量报警页面提醒
|
||
*/
|
||
function showWeightWarn(){
|
||
|
||
$logi_no = $_GET['logi_no'];
|
||
$weight = $_GET['weight'];
|
||
$type = $_GET['type'];
|
||
#确认取消条码
|
||
$stock_confirm= app::get('ome')->getConf('purchase.stock_confirm');
|
||
$stock_cancel= app::get('ome')->getConf('purchase.stock_cancel');
|
||
$this->pagedata['stock_confirm'] = $stock_confirm;
|
||
$this->pagedata['stock_cancel'] = $stock_cancel;
|
||
if($type=='unweight'){
|
||
|
||
$product_weight = app::get('ome')->model('delivery')->getWeightbydelivery_id($logi_no);
|
||
$this->pagedata['product_weight'] = $product_weight;
|
||
|
||
unset($product_weight);
|
||
$this->pagedata['logi_no'] = $logi_no;
|
||
$this->pagedata['weight'] = $weight;
|
||
$this->page('admin/delivery/delivery_noweight.html');
|
||
}else if($type=='weightwarn'){
|
||
$this->pagedata['logi_no'] = $logi_no;
|
||
$this->pagedata['weight'] = $weight;
|
||
$problem_package = app::get('wms')->getConf('wms.delivery.problem_package');
|
||
$this->pagedata['problem_package'] = $problem_package;
|
||
#如果是按退回去检查
|
||
if($problem_package==0){
|
||
$this->page('admin/delivery/delivery_weightwarnback.html');
|
||
}else{
|
||
$this->page('admin/delivery/delivery_weightwarn.html');
|
||
}
|
||
#两种情况时
|
||
|
||
}else if($type=='addLog'){
|
||
//写入日志
|
||
$logi_no = $_POST['logi_no'];
|
||
$weight = $_POST['weight'];
|
||
$logerror = $_POST['logerror'];
|
||
$dlyObj = app::get('ome')->model('delivery');
|
||
|
||
$dlyBillObj = app::get('ome')->model('delivery_bill');
|
||
$dlyBill = $dlyBillObj->dump(array('logi_no|nequal' => $logi_no),'delivery_id');
|
||
$dlyfather = $dlyObj->dump(array('logi_no|nequal' => $logi_no),'delivery_id');
|
||
if($dlyBill){
|
||
$delivery_id = $dlyBill['delivery_id'];
|
||
}elseif($dlyfather){
|
||
$delivery_id = $dlyfather['delivery_id'];
|
||
|
||
}
|
||
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
if($logerror=='1'){
|
||
$logstr = '运单号:'.$logi_no.',检查后再发货(包裹内有商品未录入重量)';
|
||
}else{
|
||
$logstr = '运单号:'.$logi_no.',检查后再发货(称重为:'.$weight.'g)';
|
||
}
|
||
echo $logstr;
|
||
$opObj->write_log('delivery_weightwarn@wms', $delivery_id, $logstr);
|
||
return true;
|
||
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 极速发货
|
||
*
|
||
* @param void
|
||
* @return void
|
||
*/
|
||
function fast_consign() {
|
||
$this->app = app::get('ome');
|
||
$op_id = kernel::single('desktop_user')->get_id();
|
||
switch ($_GET['view']) {
|
||
case '2':
|
||
case '3':
|
||
case '4':
|
||
case '5':
|
||
case '6':
|
||
case '7':
|
||
$action = array(
|
||
array('label' => '批量发货', 'submit' => 'index.php?app=wms&ctl=admin_consign&act=batch_sync', 'confirm' => '你确定要对勾选的订单进行发货操作吗?', 'target' => 'refresh'),
|
||
array('label' => '已回写成功', 'submit' => 'index.php?app=wms&ctl=admin_consign&act=batch_sync_succ', 'confirm' => "这些订单系统认为都是在前台(淘宝、京东等)已经发货,请确认这些订单前端已经发货!!!\n\n警告:本操作不会再同步发货状态,并不可恢复,请谨慎使用!!!", 'target' => 'refresh'),
|
||
);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
$params = array(
|
||
'title' => '需发货订单',
|
||
'actions' => $action,
|
||
'use_buildin_new_dialog' => false,
|
||
'use_buildin_set_tag' => false,
|
||
'use_buildin_recycle' => false,
|
||
'use_buildin_export' => false,
|
||
'use_buildin_import' => false,
|
||
'use_buildin_filter' => false,
|
||
'use_view_tab' => true,
|
||
'finder_aliasname' => 'order_consign_fast'.$op_id,
|
||
'finder_cols' => '_func_0,column_confirm,order_bn,column_sync_status,column_print_status,logi_id,logi_no,column_deff_time,member_id, ship_name,ship_area,total_amount',
|
||
'base_filter' => $this->getFilters(),
|
||
);
|
||
$this->finder('ome_mdl_orders', $params);
|
||
}
|
||
|
||
function getFilters() {
|
||
|
||
$base_filter = array();
|
||
$base_filter['status'] = array('active', 'finish');
|
||
//$base_filter['order_confirm_filter'] = "(sdb_ome_orders.op_id is not null AND sdb_ome_orders.group_id is not null ) AND (sdb_ome_orders.is_cod='true' OR sdb_ome_orders.pay_status='1' OR sdb_ome_orders.pay_status='4' OR sdb_ome_orders.pay_status='5') and logi_no <> ''";
|
||
$base_filter['order_confirm_filter'] = "(sdb_ome_orders.op_id is not null OR sdb_ome_orders.group_id is not null ) AND (sdb_ome_orders.is_cod='true' OR sdb_ome_orders.pay_status='1' OR sdb_ome_orders.pay_status='4' OR sdb_ome_orders.pay_status='5') and logi_no <> ''";
|
||
$base_filter['process_status'] = array('splited', 'confirmed', 'splitting');
|
||
|
||
return $base_filter;
|
||
}
|
||
|
||
function getProcutInfo()
|
||
{
|
||
$dlyMdl = app::get('wms')->model('delivery');
|
||
$dlyBillMdl = app::get('wms')->model('delivery_bill');
|
||
|
||
$logi_no = $_POST['logi_no'];
|
||
$deliveryBillLib = kernel::single('wms_delivery_bill');
|
||
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
|
||
|
||
$deliveryBill = $dlyBillMdl->db_dump(['logi_no' => $logi_no]);
|
||
|
||
//[同城配]商家配送支持配送员手机号搜索
|
||
if(empty($deliveryBill) && strlen($logi_no) == 11){
|
||
$delivery = $dlyMdl->getList('*', array('deliveryman_mobile'=>$logi_no, 'process_status'=>array(2,3)), 0, 1);
|
||
if($delivery){
|
||
$delivery_id = $delivery[0]['delivery_id'];
|
||
|
||
$deliveryBill = $dlyBillMdl->db_dump(array('delivery_id'=>$delivery_id), '*');
|
||
}
|
||
}
|
||
|
||
$total_weight = 0;
|
||
$procut_info = [];
|
||
if ($deliveryBill) {
|
||
$procut_info = app::get('wms')->model('delivery_bill_items')->getList('*', ['bill_id' => $deliveryBill['b_id']]);
|
||
|
||
if (!$procut_info && $deliveryBill['type'] == '1'){
|
||
$procut_info = app::get('wms')->model('delivery')->getProcutInfo($deliveryBill['delivery_id']);
|
||
}
|
||
|
||
if ($procut_info){
|
||
foreach($procut_info as $k => $v){
|
||
if(isset($v['bn']) && isset($v['product_name']) && isset($v['number'])){
|
||
$products = $basicMaterialExtObj->dump(array('bm_id'=>$v['product_id']),'weight');
|
||
$weight = sprintf('%.2f',$products['weight']*$v['number']);
|
||
|
||
$procut_info[$k]['weight'] = $weight;
|
||
|
||
$total_weight+=$weight;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
$this->pagedata['procut_info'] = $procut_info;
|
||
$this->pagedata['total_weight'] = $total_weight;
|
||
$this->display('admin/delivery/consign/package_items.html');
|
||
}
|
||
|
||
#校验完成即发货:准备校验
|
||
function CheckDelivery(){
|
||
$db = kernel::database();
|
||
$transaction = $db->beginTransaction();
|
||
$result = $this->doCheck($_rs);
|
||
#校验已完成
|
||
if($_rs){
|
||
$_POST['delivery_id'] = urldecode($_POST['logi_no']);
|
||
$_GET['delivery_type'] = 'single';
|
||
$rs2 = 'CheckDelivery';#校验完即发货类型
|
||
#继续判断发货条件
|
||
$result = $this->batchCheck($rs2);
|
||
if($rs2 !== 'CheckDelivery'){
|
||
if($rs2){
|
||
$db->commit($transaction);
|
||
}else{
|
||
$db->rollBack();
|
||
}
|
||
}
|
||
$db->rollBack();
|
||
return $result;
|
||
}else{
|
||
$db->rollBack();
|
||
#校验未完成,返回校验错误
|
||
return $result;
|
||
}
|
||
}
|
||
|
||
//校验直接发货检查方法
|
||
function doCheck(&$rs = false){
|
||
$autohide = array('autohide'=>2000);
|
||
$checkType = in_array($_POST['checkType'],array('barcode','all')) ? $_POST['checkType'] : 'barcode';
|
||
|
||
if (empty($_POST['delivery_id'])){
|
||
$tmp = array('result'=>false,'msg'=>'发货单ID传入错误');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
if ($_POST['logi_no'] == ''){
|
||
$tmp = array('result'=>false,'msg'=>'请扫描快递单号');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
|
||
foreach(kernel::servicelist('ome.delivery') as $o){
|
||
if(method_exists($o,'pre_docheck')){
|
||
$message = "";
|
||
$result = $o->pre_docheck($_POST,$message);
|
||
if(!$result){
|
||
$this->end(false, $message, '', $autohide);
|
||
}
|
||
}
|
||
}
|
||
|
||
$dly_id = $_POST['delivery_id'];
|
||
$count = $_POST['count'];
|
||
$number = $_POST['number'];
|
||
$logi_no = $_POST['logi_no'];
|
||
|
||
//检查订单的当前状态
|
||
$dlyCheckLib = kernel::single('wms_delivery_check');
|
||
if(!$dlyCheckLib->checkOrderStatus($dly_id, true, $errmsg)){
|
||
$tmp = array('result'=>false,'msg'=>$errmsg);
|
||
echo json_encode($tmp);die;
|
||
}
|
||
|
||
if ($count == 0 || $number == 0){
|
||
$tmp = array('result'=>false,'msg'=>'对不起,校验提交的数据错误');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
|
||
|
||
$deliveryObj = app::get('wms')->model('delivery');
|
||
$dly = $deliveryObj->dump($dly_id,'*', array('delivery_items'=>array('*')));
|
||
|
||
//检查运单号是否属于同一个处理的发货单
|
||
$deliveryBillLib = kernel::single('wms_delivery_bill');
|
||
$db_logi_no = $deliveryBillLib->getPrimaryLogiNoById($dly_id);
|
||
if ($db_logi_no != $logi_no){
|
||
$tmp = array('result'=>false,'msg'=>'扫描的快递单号与系统中的快递单号不对应');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
|
||
//合计发货单明细的总数
|
||
$total = 0;
|
||
foreach ($dly['delivery_items'] as $i){
|
||
$total += $i['number'];
|
||
}
|
||
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
$deliveryLib = kernel::single('wms_delivery_process');
|
||
|
||
if ($count === $number) {
|
||
|
||
//对发货单详情进行校验完成处理
|
||
if ($deliveryLib->verifyDelivery($dly_id)){
|
||
if(is_array($_POST['serial_data']) && count($_POST['serial_data'])>0)
|
||
{
|
||
$productSerialObj = app::get('ome')->model('product_serial');
|
||
$serialLogObj = app::get('ome')->model('product_serial_log');
|
||
$opInfo = kernel::single('ome_func')->getDesktopUser();
|
||
foreach($_POST['serial_data'] as $key=>$val){
|
||
foreach($val as $serial){
|
||
$serialData['branch_id'] = $dly['branch_id'];
|
||
$serialData['product_id'] = $_POST['product'][$key];
|
||
$serialData['bn'] = $key;
|
||
$serialData['serial_number'] = $serial;
|
||
$serialData['status'] = 1;
|
||
$productSerialObj->save($serialData);
|
||
|
||
$logData['item_id'] = $serialData['item_id'];
|
||
$logData['act_type'] = 0;
|
||
$logData['act_time'] = time();
|
||
$logData['act_owner'] = $opInfo['op_id'];
|
||
$logData['bill_type'] = 0;
|
||
$logData['bill_no'] = $dly['delivery_id'];
|
||
$logData['serial_status'] = 1;
|
||
$serialLogObj->save($logData);
|
||
unset($serialData,$logData);
|
||
}
|
||
}
|
||
}
|
||
|
||
//增加发货单校验把保存后的扩展
|
||
foreach(kernel::servicelist('ome.delivery') as $o){
|
||
if(method_exists($o,'after_docheck')){
|
||
$data = $_POST;
|
||
$o->after_docheck($data);
|
||
}
|
||
}
|
||
|
||
$rs = true;
|
||
return true;
|
||
}else {
|
||
$tmp = array('result'=>false,'msg'=>'发货单校验未完成,请重新校验');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
} else {
|
||
$tmp = array('result'=>false,'msg'=>'发货单校验未完成,请重新校验');
|
||
echo json_encode($tmp);die;
|
||
}
|
||
}
|
||
|
||
#校验完成即发货:开始发货
|
||
function doCheckDelivery(){
|
||
$goto_url = 'index.php?app=wms&ctl=admin_check&act=index&type=all';
|
||
$ids = $_POST['delivery_id'];
|
||
|
||
$delivery_ids = explode(',', $ids);
|
||
$delivery_ids = array_filter($delivery_ids);
|
||
|
||
if ( !$delivery_ids ) {
|
||
$this->splash('success',$goto_url ,'快递单列表为空!');
|
||
}
|
||
$delivery_id = $_POST['delivery_id'];
|
||
$msg = '校验完成即发货:开始发货';
|
||
$ObjOp = app::get('ome')->model('operation_log');
|
||
$ObjOp->write_log('delivery_checkdelivery@wms',$delivery_id,$msg,time());
|
||
#走原来发货流程
|
||
return $this->consign(true);
|
||
}
|
||
|
||
/**
|
||
* 往包裹里添加货品
|
||
*
|
||
* @param String $delivery_id 发货单ID
|
||
* @param String $num 补打数量
|
||
* @return void
|
||
* @author CP
|
||
* @version 4.3.9 2021-08-15T20:54:58+08:00
|
||
**/
|
||
public function addPackageItem($delivery_id, $num)
|
||
{
|
||
$deliveryMdl = app::get('wms')->model('delivery');
|
||
$delivery = $deliveryMdl->db_dump(['delivery_id' => $delivery_id]);
|
||
if (!$delivery) {
|
||
echo '发货单不存在!';exit;
|
||
}
|
||
if (!$num) {
|
||
echo '补打数量必填!';exit;
|
||
}
|
||
|
||
// 包裹明细
|
||
$deliveryBillMdl = app::get('wms')->model('delivery_bill');
|
||
$deliveryBillList = $deliveryBillMdl->getList('*', ['delivery_id' => $delivery_id]);
|
||
|
||
$billId = $deliveryBillList ? array_column($deliveryBillList, 'b_id') : [0];
|
||
|
||
$sequence = [0];
|
||
foreach ($deliveryBillList as $key => $value) {
|
||
if ($value['package_bn']) {
|
||
list(,$sequence[]) = explode('_', $value['package_bn']);
|
||
}
|
||
}
|
||
$maxPackageBn = max($sequence);
|
||
|
||
$packages = [];
|
||
foreach ($deliveryBillList as $key => $value) {
|
||
if ($value['type'] == '1' && !$value['package_bn']){
|
||
$maxPackageBn++;
|
||
$packages[$maxPackageBn]['package_bn'] = $delivery['delivery_bn'].'_'.$maxPackageBn;
|
||
$packages[$maxPackageBn]['package_type'] = '1';
|
||
$packages[$maxPackageBn]['bill_id'] = $value['b_id'];
|
||
$packages[$maxPackageBn]['package_title'] = '主包裹'.$maxPackageBn.',运单号:'.$value['logi_no'];
|
||
break;
|
||
}
|
||
}
|
||
|
||
for ($i=1; $i <= $num; $i++) {
|
||
$maxPackageBn++;
|
||
$packages[$maxPackageBn]['package_bn'] = $delivery['delivery_bn'].'_'.$maxPackageBn;
|
||
$packages[$maxPackageBn]['package_title'] = '补打包裹'.$maxPackageBn;
|
||
}
|
||
|
||
$deliveryBillItemMdl = app::get('wms')->model('delivery_bill_items');
|
||
$billItemList = [];
|
||
foreach ($deliveryBillItemMdl->getList('*', ['bill_id' => $billId]) as $value) {
|
||
$billItemList[$value['product_id']]['product_id'] = $value['product_id'];
|
||
$billItemList[$value['product_id']]['number'] += $value['number'];
|
||
}
|
||
|
||
$materialCodeMdl = app::get('material')->model('codebase');
|
||
$deliveryItemMdl = app::get('wms')->model('delivery_items');
|
||
$deliveryItems = $deliveryItemMdl->getList('*', ['delivery_id' => $delivery_id]);
|
||
|
||
$product_id = array_column($deliveryItems, 'product_id');
|
||
$materialCodeList = $materialCodeMdl->getList('*', ['bm_id' => $product_id, 'type' => '1']);
|
||
$materialCodeList = array_column($materialCodeList, null, 'bm_id');
|
||
|
||
foreach ($deliveryItems as $key => $value) {
|
||
$deliveryItems[$key]['barcode'] = (string) $materialCodeList[$value['product_id']]['code'];
|
||
$deliveryItems[$key]['package_num'] = (int) $billItemList[$value['product_id']]['number'];
|
||
}
|
||
|
||
$this->pagedata['deliveryItems'] = $deliveryItems;
|
||
$this->pagedata['packages'] = $packages;
|
||
$this->pagedata['delviery_id'] = $delivery_id;
|
||
$this->pagedata['num'] = $num;
|
||
$this->display('admin/delivery/package/add_items.html');
|
||
}
|
||
|
||
}
|