mirror of
https://gitee.com/ShopeX/OMS
synced 2026-04-02 05:55:49 +08:00
5265 lines
222 KiB
PHP
5265 lines
222 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 ome_mdl_orders extends dbeav_model{
|
||
|
||
//是否有导出配置
|
||
var $has_export_cnf = true;
|
||
//所有组用户信息
|
||
static $__GROUPS = null;
|
||
//所用户信息
|
||
static $__USERS = null;
|
||
|
||
var $has_many = array(
|
||
//'delivery' => 'delivery', TODO:非标准写法,去掉后有报错需要修改代码
|
||
'order_objects' => 'order_objects',
|
||
);
|
||
|
||
// var $defaultOrder = array('createtime DESC ,order_id DESC');
|
||
var $defaultOrder = array('order_id DESC'); // 加上createtime排序,响应慢
|
||
var $export_name = '订单';
|
||
var $export_flag = false;
|
||
|
||
static $order_source = array(
|
||
'local' => '分销王本地订单',
|
||
'fxjl' => '抓抓',
|
||
'taofenxiao' => '淘分销',
|
||
'tbjx' => '经销订单',
|
||
'tbdx' => '代销订单',
|
||
'secondbuy' => '分销王秒批订单',
|
||
'direct' => '直销订单',
|
||
'platformexchange' => '平台换货',
|
||
'maochao' => '猫超国际',
|
||
'wxshipin' => '微信视频号',
|
||
'miaozhu' => '喵住',
|
||
'goofish' => '闲鱼',
|
||
);
|
||
|
||
const EXPORT_ITEM_TITLE = [
|
||
['label' => '销售物料编码', 'col' => 'e_sm_bn'],
|
||
['label' => '销售物料名称', 'col' => 'e_sm_name'],
|
||
['label' => '销售物料类型', 'col' => 'e_sm_type'],
|
||
['label' => '基础物料编码', 'col' => 'e_item_bn'],
|
||
['label' => '基础物料名称', 'col' => 'e_item_product_name'],
|
||
['label' => '基础物料品牌', 'col' => 'e_brand_name'],
|
||
['label' => '规格', 'col' => 'e_spec_info'],
|
||
['label' => '单位', 'col' => 'e_unit'],
|
||
['label' => '原价', 'col' => 'e_price'],
|
||
['label' => '销售价', 'col' => 'e_sale_price'],
|
||
['label' => '优惠额', 'col' => 'e_pmt_price'],
|
||
['label' => '实付金额', 'col' => 'e_divide_order_fee'],
|
||
['label' => '优惠分摊', 'col' => 'e_part_mjz_discount'],
|
||
['label' => '购买量', 'col' => 'e_nums'],
|
||
['label' => '已发货量', 'col' => 'e_sendnum'],
|
||
['label' => '已退货量', 'col' => 'e_return_num'],
|
||
['label' => '已拆分量', 'col' => 'e_split_num'],
|
||
['label' => 'hold单时限', 'col' => 'e_estimate_con_time'],
|
||
['label' => '是否预售', 'col' => 'e_presale_status'],
|
||
['label' => '预选仓', 'col' => 'e_store_code'],
|
||
['label' => '子单号', 'col' => 'e_oid'],
|
||
['label' => '关联子单号', 'col' => 'e_main_oid'],
|
||
['label' => '平台商品ID', 'col' => 'e_shop_goods_id'],
|
||
['label' => '平台SkuID', 'col' => 'e_shop_product_id'],
|
||
['label' => '达人ID', 'col' => 'e_author_id'],
|
||
['label' => '达人名称', 'col' => 'e_author_name'],
|
||
['label' => '直播间ID', 'col' => 'e_room_id'],
|
||
];
|
||
|
||
/**
|
||
* 须加密字段
|
||
*
|
||
* @var string
|
||
* */
|
||
private $__encrypt_cols = array(
|
||
'ship_name' => 'simple',
|
||
'ship_tel' => 'phone',
|
||
'ship_mobile' => 'phone',
|
||
'ship_addr' => 'simple',
|
||
);
|
||
|
||
function _filter($filter,$tableAlias=null,$baseWhere=null)
|
||
{
|
||
$tPre = ($tableAlias ? $tableAlias : '`' . $this->table_name(true) . '`') . '.';
|
||
$tmpBaseWhere = kernel::single('ome_filter_encrypt')->encrypt($filter, $this->__encrypt_cols, $tPre, 'orders');
|
||
$baseWhere = $baseWhere ? array_merge((array)$baseWhere, (array)$tmpBaseWhere) : (array)$tmpBaseWhere;
|
||
|
||
if(isset($filter['archive'])){
|
||
$where = ' archive='.$filter['archive'].' ';
|
||
unset($filter['archive']);
|
||
}else{
|
||
$where = " 1 ";
|
||
}
|
||
|
||
if(isset($filter['tax_company'])){
|
||
$where = ' tax_company like "'.$filter['tax_company'].'%" ';
|
||
unset($filter['tax_company']);
|
||
}
|
||
|
||
if(isset($filter['order_confirm_filter'])){
|
||
$where .= ' AND '.$filter['order_confirm_filter'];
|
||
unset($filter['order_confirm_filter']);
|
||
}
|
||
|
||
if (isset($filter['assigned'])){
|
||
if ($filter['assigned'] == 'notassigned'){
|
||
$where .= ' AND (group_id=0 AND op_id=0)';
|
||
}elseif($filter['assigned'] == 'buffer'){
|
||
|
||
}else{
|
||
// where (op_id is null OR op_id=0) AND (op_id > 0 OR group_id > 0) 会很影响查询效率
|
||
$tmp_where = str_replace(' ', '', $where);
|
||
if (stripos($tmp_where, 'op_idisnull') !== false || stripos($tmp_where, 'op_id=0') !== false) {
|
||
$where .= ' AND group_id > 0';
|
||
} else {
|
||
$where .= ' AND (op_id > 0 OR group_id > 0)';
|
||
}
|
||
}
|
||
|
||
$where .= ' AND IF(process_status=\'is_retrial\', abnormal=\'true\', abnormal=\'false\')';
|
||
unset ($filter['assigned'], $filter['abnormal']);
|
||
}
|
||
|
||
if (isset($filter['balance'])){
|
||
if ($filter['balance'])
|
||
$where .= " AND `old_amount` != 0 AND `total_amount` != `old_amount` ";
|
||
else
|
||
$where .= " AND `old_amount` = 0 ";
|
||
}
|
||
|
||
//自动取消订单过滤条件
|
||
if (isset($filter['auto_cancel_order_filter'])){
|
||
$where .= ' AND '.$filter['auto_cancel_order_filter'];
|
||
}
|
||
|
||
if (isset($filter['custom_process_status'])){
|
||
if(is_array($filter['custom_process_status'])){
|
||
$where .= ' AND process_status IN (\''.implode('\',\'', $filter['custom_process_status']).'\')';
|
||
}elseif($filter['custom_process_status']){
|
||
$where .= ' AND process_status ='.$filter['custom_process_status'];
|
||
}
|
||
}
|
||
|
||
if(isset($filter['product_bn'])){
|
||
$orderId = array();
|
||
$orderId[] = 0;
|
||
|
||
//多基础物料查询
|
||
if($filter['product_bn'] && is_string($filter['product_bn']) && strpos($filter['product_bn'], "\n") !== false){
|
||
$filter['product_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['product_bn']))));
|
||
}
|
||
|
||
//按基础物料查询相关订单
|
||
$itemsObj = $this->app->model("order_items");
|
||
$rows = $itemsObj->getOrderIdByFilterbnEq($filter);
|
||
if($rows){
|
||
foreach($rows as $row){
|
||
$temp_order_id = $row['order_id'];
|
||
$orderId[$temp_order_id] = $temp_order_id;
|
||
}
|
||
}
|
||
|
||
if ($filter['has_bn'] == 'false') {
|
||
$where .= ' AND order_id NOT IN ("'.implode('","', $orderId).'")';
|
||
} else {
|
||
$where .= ' AND order_id IN ("'.implode('","', $orderId).'")';
|
||
}
|
||
|
||
unset($filter['product_bn']);
|
||
}elseif(isset($filter['sales_material_bn'])){
|
||
$orderId = array();
|
||
$orderId[] = 0;
|
||
|
||
//赋值
|
||
$filter['product_bn'] = $filter['sales_material_bn'];
|
||
|
||
//多销售物料查询
|
||
if($filter['product_bn'] && is_string($filter['product_bn']) && strpos($filter['product_bn'], "\n") !== false){
|
||
$filter['product_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['product_bn']))));
|
||
}
|
||
|
||
//按销售物料查询相关订单
|
||
$itemsObj = $this->app->model('order_items');
|
||
$objectRows = $itemsObj->getOrderIdByPkgbnEq($filter);
|
||
if($objectRows){
|
||
foreach($objectRows as $objectItem){
|
||
$temp_order_id = $objectItem['order_id'];
|
||
|
||
$orderId[$temp_order_id] = $temp_order_id;
|
||
}
|
||
}
|
||
|
||
$where .= ' AND order_id IN ("'.implode('","', $orderId).'")';
|
||
|
||
unset($filter['sales_material_bn'], $filter['product_bn']);
|
||
}
|
||
if (isset($filter['sales_material_name'])) {
|
||
$orderId = [0];
|
||
|
||
//赋值
|
||
$filter['product_name'] = $filter['sales_material_name'];
|
||
//多销售物料查询
|
||
if ($filter['sales_material_name'] && is_string($filter['sales_material_name']) && strpos($filter['sales_material_name'], "\n") !== false) {
|
||
$filter['sales_material_name'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['sales_material_name']))));
|
||
}
|
||
|
||
//按销售物料查询相关订单
|
||
$itemsObj = $this->app->model('order_items');
|
||
$objectRows = $itemsObj->getOrderIdByFilterNameEq($filter);
|
||
if ($objectRows) {
|
||
foreach ($objectRows as $objectItem) {
|
||
$temp_order_id = $objectItem['order_id'];
|
||
$orderId[$temp_order_id] = $temp_order_id;
|
||
}
|
||
}
|
||
|
||
$where .= ' AND order_id IN ("' . implode('","', $orderId) . '")';
|
||
|
||
unset($filter['sales_material_name']);
|
||
}
|
||
|
||
if ( $filter['ship_area'] ) {
|
||
if($filter['ship_area'] && is_string($filter['ship_area']) && strpos($filter['ship_area'], "\n") !== false){
|
||
$filter['ship_area'] = implode("|",array_unique(array_map('trim', array_filter(explode("\n", $filter['ship_area'])))));
|
||
}
|
||
$areaWhere = $where .' AND ship_area REGEXP \''.$filter['ship_area'].'\'';
|
||
if ($filter['has_area'] == 'false') {
|
||
$orderIds = $this->getArea($areaWhere);
|
||
$where .= ' AND order_id not in ("'.implode('","',$orderIds).'")';
|
||
}else{
|
||
$where = $areaWhere;
|
||
}
|
||
unset($filter['ship_area']);
|
||
}
|
||
|
||
//支付失败
|
||
if(isset($filter['payment_fail']) && $filter['payment_fail'] == true){
|
||
$api_fail = $this->app->model("api_fail");
|
||
$payment_fail_list = $api_fail->getList('order_id', array('type'=>'payment'), 0, -1);
|
||
$payment_order_id = array();
|
||
if ($payment_fail_list){
|
||
foreach($payment_fail_list as $val){
|
||
$payment_order_id[] = $val['order_id'];
|
||
}
|
||
}
|
||
$payment_order_id = implode('","', $payment_order_id);
|
||
$payment_order_id = $payment_order_id ? $payment_order_id : '';
|
||
$where .= ' AND order_id IN ("'.$payment_order_id.'")';
|
||
unset($filter['payment_fail']);
|
||
}
|
||
|
||
if(isset($filter['product_barcode'])){
|
||
$itemsObj = $this->app->model("order_items");
|
||
$rows = $itemsObj->getOrderIdByPbarcode($filter['product_barcode']);
|
||
$orderId[] = 0;
|
||
foreach($rows as $row){
|
||
$orderId[] = $row['order_id'];
|
||
}
|
||
$where .= ' AND order_id IN ("'.implode('","', $orderId).'")';
|
||
unset($filter['product_barcode']);
|
||
}
|
||
//判断是否录入发票号
|
||
if(isset($filter['is_tax_no'])){
|
||
if($filter['is_tax_no']==1){
|
||
$where .= ' AND tax_no IS NOT NULL';
|
||
|
||
}else{
|
||
$where .= ' AND tax_no IS NULL';
|
||
}
|
||
unset($filter['is_tax_no']);
|
||
}
|
||
|
||
//付款确认
|
||
if (isset($filter['pay_confirm'])){
|
||
$where .= ' AND '.$filter['pay_confirm'];
|
||
unset($filter['pay_confirm']);
|
||
}
|
||
//确认状态
|
||
if (isset($filter['process_status_noequal'])){
|
||
$value = '';
|
||
foreach($filter['process_status_noequal'] as $k=>$v){
|
||
$value .= "'".$v."',";
|
||
}
|
||
$len = strlen($value);
|
||
$value_last = substr($value,0,($len-1));
|
||
$where .= ' AND process_status not in ( '.$value_last.")";
|
||
unset($filter['process_status_noequal']);
|
||
}
|
||
if (isset($filter['member_uname'])){
|
||
$memberId = app::get('ome')->model('members')->getMemberIdByUname($filter['member_uname']);
|
||
$where .= ' AND member_id IN ("'.implode('","', $memberId).'")';
|
||
unset($filter['member_uname']);
|
||
}
|
||
if (isset($filter['pay_type'])){
|
||
$cfgObj = app::get('ome')->model('payment_cfg');
|
||
$rows = $cfgObj->getList('pay_bn',array('pay_type'=>$filter['pay_type']));
|
||
$pay_bn[] = 0;
|
||
foreach($rows as $row){
|
||
$pay_bn[] = $row['pay_bn'];
|
||
}
|
||
$where .= ' AND pay_bn IN (\''.implode('\',\'', $pay_bn).'\')';
|
||
unset($filter['pay_type']);
|
||
}
|
||
//部分支付 包含部分退款 部分支付
|
||
if(isset($filter['pay_status_part'])){
|
||
$where .= ' AND (pay_status = \'3\' or (pay_status = \'4\' and ship_status = \'0\'))';
|
||
unset($filter['pay_status_part']);
|
||
}
|
||
//付款确认时,部分退款的只有未发货的才能继续支付
|
||
if(isset($filter['pay_status_set'])){
|
||
if($filter['pay_status_set'] == 2){
|
||
$where .= ' AND (pay_status in (\'0\',\'3\') or (pay_status = \'4\' and ship_status = \'0\'))';
|
||
}else{
|
||
$where .= ' AND (pay_status in (\'0\',\'3\',\'8\') or (pay_status = \'4\' and ship_status = \'0\'))';
|
||
}
|
||
unset($filter['pay_status_set']);
|
||
}
|
||
|
||
#支付方式搜索
|
||
if (isset($filter['pay_bn'])){
|
||
$cfgObj = app::get('ome')->model('payment_cfg');
|
||
$_rows = $cfgObj->getList('custom_name',array('pay_bn'=>$filter['pay_bn']));
|
||
$where .= ' AND payment='."'{$_rows[0]['custom_name']}' ";
|
||
unset($_rows);
|
||
unset($filter['pay_bn']);
|
||
}
|
||
|
||
if( isset($filter['order_source']) && $filter['order_source'] ){
|
||
|
||
$order_source = array_keys(self::$order_source);
|
||
|
||
if(in_array($filter['order_source'], $order_source) && $filter['order_source']!='direct'){
|
||
$where .=' AND order_source = \''.$filter['order_source'].'\'';
|
||
}else{
|
||
$where .=' AND order_source not in ( \''.implode('\',\'', $order_source).'\')';
|
||
|
||
}
|
||
|
||
unset($filter['order_source']);
|
||
}
|
||
if(isset($filter['logi_no'])&&$filter['logi_no']){
|
||
#使用子表物流单号进行搜索
|
||
if(is_string($filter['logi_no']) && strpos($filter['logi_no'], "\n") !== false){
|
||
$filter['logi_no'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['logi_no']))));
|
||
}
|
||
if (!is_array($filter['logi_no'])) {
|
||
$filter['logi_no'] = array($filter['logi_no']);
|
||
}
|
||
$sql = 'select
|
||
orders.order_id
|
||
from sdb_ome_delivery_bill bill
|
||
join sdb_ome_delivery delivery
|
||
on bill.delivery_id=delivery.delivery_id and bill.logi_no in ("'.implode('","',$filter['logi_no']).'")
|
||
join sdb_ome_delivery_order orders on delivery.delivery_id=orders.delivery_id';
|
||
$_row = $this->db->select($sql);
|
||
if(!empty($_row['order_id'])){
|
||
unset($filter['logi_no']);
|
||
$where .= ' AND order_id IN ("'.implode('","', array_column($_row,'order_id')).'")';
|
||
}
|
||
}
|
||
// 商家备注是否存在
|
||
if (isset($filter['is_mark_text'])) {
|
||
if($filter['is_mark_text'] == 'true'){
|
||
$where .= ' AND mark_text IS NOT NULL';
|
||
}else {
|
||
$where .= ' AND mark_text IS NULL';
|
||
}
|
||
unset($filter['is_mark_text']);
|
||
}
|
||
#商家备注
|
||
if(isset($filter['mark_text']) && !isset($filter['is_mark_text'])){
|
||
$mark_text = trim($filter['mark_text']);
|
||
$sql = "SELECT order_id,mark_text FROM sdb_ome_orders where mark_text like "."'%{$mark_text}%'";
|
||
$_rows = $this->db->select($sql);
|
||
if(!empty($_rows)){
|
||
foreach($_rows as $_orders){
|
||
$_order_id[] = $_orders['order_id'];
|
||
};
|
||
if (isset($filter['_mark_text_search']) && $filter['_mark_text_search'] == 'nohas') {
|
||
$where .= ' AND order_id NOT IN ("'.implode('","', $_order_id).'")';
|
||
} else {
|
||
$where .= ' AND order_id IN ("'.implode('","', $_order_id).'")';
|
||
}
|
||
unset($filter['mark_text']);
|
||
}
|
||
}
|
||
|
||
// 客户备注是否存在
|
||
if (isset($filter['is_custom_mark'])) {
|
||
if($filter['is_custom_mark']=='true'){
|
||
$where .= ' AND custom_mark IS NOT NULL';
|
||
}else {
|
||
$where .= ' AND custom_mark IS NULL';
|
||
}
|
||
unset($filter['is_custom_mark']);
|
||
}
|
||
|
||
#客户备注
|
||
if(isset($filter['custom_mark']) && !isset($filter['is_custom_mark'])){
|
||
$custom_mark = trim($filter['custom_mark']);
|
||
$sql = "SELECT order_id,custom_mark FROM sdb_ome_orders where custom_mark like "."'%{$custom_mark}%'";
|
||
$_rows = $this->db->select($sql);
|
||
if(!empty($_rows)){
|
||
foreach($_rows as $_orders){
|
||
$_order_id[] = $_orders['order_id'];
|
||
};
|
||
if (isset($filter['_custom_mark_search']) && $filter['_custom_mark_search'] == 'nohas') {
|
||
$where .= ' AND order_id NOT IN ("'.implode('","', $_order_id).'")';
|
||
} else {
|
||
$where .= ' AND order_id IN ("'.implode('","', $_order_id).'")';
|
||
}
|
||
unset($filter['custom_mark']);
|
||
}
|
||
}
|
||
|
||
//是否签收
|
||
if(isset($filter['logi_status'])){
|
||
$sql = 'select
|
||
orders.order_id
|
||
from sdb_ome_delivery delivery
|
||
left join sdb_ome_delivery_order orders on delivery.delivery_id=orders.delivery_id
|
||
where delivery.logi_status='."'". addslashes($filter['logi_status'])."'";
|
||
|
||
$where .= ' AND order_id IN ('.$sql.')';
|
||
|
||
unset($filter['logi_status']);
|
||
}
|
||
|
||
if (isset($filter['is_relate_order_bn'])){
|
||
if ($filter['is_relate_order_bn'] == 1){
|
||
$where .= " AND relate_order_bn!=''";
|
||
}
|
||
if ($filter['is_relate_order_bn'] == 0){
|
||
$where .= " AND (relate_order_bn='' or relate_order_bn is null)";
|
||
}
|
||
unset($filter['is_relate_order_bn']);
|
||
}
|
||
|
||
//模糊搜索订单号
|
||
if($filter['head_order_bn']){
|
||
$filter['head_order_bn'] = str_replace(array('"', "'"), '', $filter['head_order_bn']);
|
||
|
||
$where .= " AND order_bn LIKE '". $filter['head_order_bn'] ."%'";
|
||
|
||
unset($filter['head_order_bn'], $filter['order_bn']);
|
||
|
||
}else{
|
||
// 多订单号查询
|
||
if($filter['order_bn'] && is_string($filter['order_bn']) && strpos($filter['order_bn'], "\n") !== false){
|
||
$filter['order_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['order_bn']))));
|
||
}
|
||
}
|
||
|
||
// 多关联订单号查询
|
||
if($filter['relate_order_bn'] && is_string($filter['relate_order_bn']) && strpos($filter['relate_order_bn'], "\n") !== false){
|
||
$filter['relate_order_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['relate_order_bn']))));
|
||
}
|
||
|
||
//订单标记
|
||
if($filter['order_label']){
|
||
$ordLabelObj = app::get('ome')->model('bill_label');
|
||
$labelFilter = array(
|
||
'label_id'=>$filter['order_label'],
|
||
'bill_type'=>'order',
|
||
);
|
||
unset($filter['order_label']);
|
||
|
||
$sql = "select bill_id from sdb_ome_bill_label bl
|
||
left join sdb_ome_orders o on bl.bill_id=o.order_id
|
||
where ".$ordLabelObj->_filter($labelFilter, 'bl')." and ".$this->_filter($filter, 'o');
|
||
|
||
|
||
$where .= ' AND order_id IN ('. $sql .')';
|
||
|
||
}
|
||
|
||
// 最晚发货时间
|
||
if($filter['latest_delivery_time']){
|
||
|
||
$extendFilter = [
|
||
'latest_delivery_time' => $filter['latest_delivery_time'],
|
||
'_latest_delivery_time_search' => $filter['_latest_delivery_time_search'],
|
||
'latest_delivery_time_from' => $filter['latest_delivery_time_from'],
|
||
'latest_delivery_time_to' => $filter['latest_delivery_time_to'],
|
||
'_DTYPE_TIME' => $filter['_DTYPE_TIME'],
|
||
'_DTIME_' => $filter['_DTIME_'],
|
||
];
|
||
|
||
$orderExtendObj = app::get('ome')->model('order_extend');
|
||
$orderExtendObj->filter_use_like = true;
|
||
$sql = "select order_id from sdb_ome_order_extend
|
||
where ".$orderExtendObj->_filter($extendFilter);
|
||
unset($filter['latest_delivery_time']);
|
||
|
||
$where .= ' AND order_id IN ('. $sql .')';
|
||
}
|
||
|
||
return $where ." AND ".parent::_filter($filter,$tableAlias,$baseWhere);
|
||
}
|
||
|
||
/**
|
||
* 快速查询订单主表信息
|
||
* @access public
|
||
* @param mixed $filter 过滤条件,也可以直接是订单主键ID,如:$order_id
|
||
* @param String $cols 字段名
|
||
* @return Array 订单信息
|
||
*/
|
||
function getRow($filter,$cols='*'){
|
||
if (empty($filter)) return array();
|
||
|
||
$wheresql = array();
|
||
if (is_array($filter)){
|
||
foreach ($filter as $col=>$value){
|
||
$wheresql[] = '`'.$col.'`=\''.$value.'\'';
|
||
}
|
||
$wheresql = implode(' AND ', $wheresql);
|
||
}else{
|
||
$wheresql = '`order_id`='.$filter;
|
||
}
|
||
$sql = sprintf('SELECT %s FROM `sdb_ome_orders` WHERE %s',$cols,$wheresql);
|
||
$row = $this->db->selectrow($sql);
|
||
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($row[$field])) {
|
||
$row[$field] = (string) kernel::single('ome_security_factory')->decryptPublic($row[$field],$type);
|
||
}
|
||
}
|
||
|
||
return $row;
|
||
}
|
||
|
||
/**
|
||
* 获取订单商品明细
|
||
* @access public
|
||
* @param Number $order_id 订单ID
|
||
* @return Array 订单商品明细
|
||
*/
|
||
function order_objects($order_id){
|
||
if (empty($order_id)) return array();
|
||
|
||
$order_objects = array();
|
||
$wheresql = 'order_id='.$order_id;
|
||
#objects
|
||
$sql = sprintf('SELECT * FROM `sdb_ome_order_objects` WHERE %s',$wheresql);
|
||
$order_objects = $this->db->select($sql);
|
||
|
||
#items
|
||
$sql = sprintf('SELECT * FROM `sdb_ome_order_items` WHERE %s',$wheresql);
|
||
$items_list = $this->db->select($sql);
|
||
if ($items_list){
|
||
$tmp_items = array();
|
||
foreach ($items_list as $i_key=>$i_val){
|
||
$tmp_items[$i_val['obj_id']][] = $i_val;
|
||
}
|
||
$items_list = NULL;
|
||
}
|
||
|
||
if ($order_objects){
|
||
foreach ($order_objects as $o_key=>&$o_val){
|
||
$o_val['order_items'] = $tmp_items[$o_val['obj_id']];
|
||
}
|
||
}
|
||
|
||
return $order_objects;
|
||
}
|
||
|
||
function modifier_mark_type($row){
|
||
if($row){
|
||
$tmp = ome_order_func::order_mark_type($row);
|
||
if($tmp){
|
||
$tmp = "<img src='".$tmp."' width='20' height='20'>";
|
||
return $tmp;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_order_source($row){
|
||
if($row){
|
||
$tmp = ome_order_func::get_order_source($row);
|
||
if($tmp){
|
||
return $tmp;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_is_cod($row){
|
||
if($row == 'true'){
|
||
return "<div style='width:48px;padding:2px;height:16px;background-color:green;float:left;'><span style='color:#eeeeee;'>货到付款</span></div>";
|
||
}else{
|
||
return '款到发货';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* modifier_shop_id
|
||
* @param mixed $shop_id ID
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_shop_id($shop_id,$list,$row){
|
||
static $shopList;
|
||
|
||
if (isset($shopList)) {
|
||
return $shopList[$shop_id];
|
||
}
|
||
|
||
$shopIds = array_unique(array_column($list, 'shop_id'));
|
||
$shopList = app::get('ome')->model('shop')->getList('shop_id,name', ['shop_id'=>$shopIds]);
|
||
$shopList = array_column($shopList, 'name', 'shop_id');
|
||
|
||
return $shopList[$shop_id];
|
||
}
|
||
|
||
/**
|
||
* modifier_org_id
|
||
* @param mixed $org_id ID
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_org_id($org_id,$list,$row){
|
||
static $orgList;
|
||
|
||
if (isset($orgList)) {
|
||
return $orgList[$org_id];
|
||
}
|
||
|
||
$orgIds = array_unique(array_column($list, 'org_id'));
|
||
$orgList = app::get('ome')->model('operation_organization')->getList('org_id,name', ['org_id'=>$orgIds]);
|
||
$orgList = array_column($orgList, 'name', 'org_id');
|
||
|
||
return $orgList[$org_id];
|
||
}
|
||
|
||
/**
|
||
* 订单暂停
|
||
*
|
||
* @param int $order_id
|
||
* @param bool $must_log 订单叫回失败,需额外记录失败日志
|
||
* @param string $log_msg 操作日志前缀信息
|
||
* @return array
|
||
*/
|
||
public function pauseOrder($order_id, $must_log=false, $log_msg='')
|
||
{
|
||
$branchLib = kernel::single('ome_branch');
|
||
$channelLib = kernel::single('channel_func');
|
||
|
||
$dlyObj = app::get('ome')->model('delivery');
|
||
$delivery_itemsObj = app::get('ome')->model('delivery_items');
|
||
$oOperation_log = app::get('ome')->model('operation_log');
|
||
|
||
$rs = array('rsp'=>'succ','msg'=>'');
|
||
if(empty($order_id)){
|
||
return $rs;
|
||
}
|
||
|
||
//订单信息
|
||
$o = $this->dump($order_id,'pause,process_status,ship_status,group_id,op_id');
|
||
|
||
//订单已经是暂停状态,直接返回
|
||
if ($o['pause'] != 'false'){
|
||
return $rs;
|
||
}
|
||
|
||
//优化撤消第三方仓发货单后,客服未回到未分派
|
||
$order_group_id = $o['group_id'];
|
||
$order_op_id = $o['op_id'];
|
||
|
||
//订单对应的发货单
|
||
$dly_ids = $dlyObj->getDeliverIdByOrderId($order_id);
|
||
|
||
//没有发货单的情况,直接暂停当前订单
|
||
if(empty($dly_ids)){
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['pause'] = 'true';
|
||
$this->save($order);
|
||
$oOperation_log->write_log('order_modify@ome',$order_id, $log_msg .'订单暂停');
|
||
|
||
//订单暂停状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance){
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
$instance->update_order_pause_status($order_id);
|
||
}
|
||
}
|
||
}
|
||
|
||
return $rs;
|
||
}
|
||
|
||
$is_fail = false;//失败标记
|
||
$pause_dly = array();//成功暂停的发货单
|
||
$failDly = array();
|
||
|
||
foreach ($dly_ids as $key => $delivery_id)
|
||
{
|
||
//取仓库信息
|
||
$deliveryInfo = $dlyObj->dump($delivery_id,'*',array('delivery_items'=>array('*'),'delivery_order'=>array('*')));
|
||
if($deliveryInfo['status'] == 'succ'){
|
||
continue;//已发货,跳过
|
||
}
|
||
|
||
//根据仓库识别是否门店仓还是电商仓
|
||
$store_id = $branchLib->isStoreBranch($deliveryInfo['branch_id']);
|
||
|
||
//根据仓库获取仓储类型
|
||
$wms_id = $branchLib->getWmsIdById($deliveryInfo['branch_id']);
|
||
if($wms_id || $store_id){
|
||
//第三方仓储
|
||
//发货通知单暂停推送仓库
|
||
$notice_params = array(
|
||
'delivery_id'=>$deliveryInfo['delivery_id'],
|
||
'delivery_bn'=>$deliveryInfo['delivery_bn'],
|
||
'branch_id'=>$deliveryInfo['branch_id'],
|
||
'wms_id' => $wms_id,
|
||
);
|
||
|
||
$res = ome_delivery_notice::cancel($notice_params, true);
|
||
if($res['rsp'] == 'success' || $res['rsp'] == 'succ')
|
||
{
|
||
$deliveryInfo['is_selfwms'] = false;
|
||
$pause_dly[] = $deliveryInfo;
|
||
|
||
// $oOperation_log->write_log('delivery_back@ome',$deliveryInfo['delivery_id'], $log_msg .'发货单取消成功');
|
||
}else{
|
||
$is_fail = true;
|
||
|
||
$failDly[$delivery_id]['rsp'] = 'fail';
|
||
$failDly[$delivery_id]['msg'] = $res['msg'];
|
||
$failDly[$delivery_id]['bn'] = $deliveryInfo['delivery_bn'];
|
||
$failDly[$delivery_id]['flag'] = 'wms';
|
||
|
||
$oOperation_log->write_log('delivery_back@ome',$deliveryInfo['delivery_id'], $log_msg .'发货单取消通知仓库:失败,原因:'.$res['msg']);
|
||
|
||
//订单收订触发叫回失败的,需额外记录失败日志并展示
|
||
if($must_log){
|
||
kernel::single('console_delivery')->update_sync_status($deliveryInfo['delivery_id'], 'cancel_fail', $res['msg']);
|
||
}
|
||
}
|
||
}else{
|
||
$is_fail = true;
|
||
|
||
$failDly[$delivery_id]['rsp'] = 'fail';
|
||
$failDly[$delivery_id]['msg'] = '发货单的仓库所对应的仓储类型未定义';
|
||
$failDly[$delivery_id]['bn'] = $deliveryInfo['delivery_bn'];
|
||
$failDly[$delivery_id]['flag'] = 'none_wms';
|
||
}
|
||
}
|
||
|
||
//发货单全部成功发货,没有需要暂停的发货单
|
||
if(empty($pause_dly) && $is_fail==false)
|
||
{
|
||
$order_ids = array();
|
||
|
||
//处理订单对应多个发货单
|
||
foreach ($dly_ids as $key => $delivery_id)
|
||
{
|
||
//合并发货单对应的订单id
|
||
$deliveryInfo = $dlyObj->dump($delivery_id,'delivery_id, is_bind');
|
||
if($deliveryInfo['is_bind'] == 'true')
|
||
{
|
||
//取关联订单号进行暂停
|
||
$temp_date = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($temp_date){
|
||
foreach ($temp_date as $id){
|
||
$order_ids[] = $id;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$order_ids[] = $order_id;
|
||
$order_ids = array_unique($order_ids);
|
||
|
||
//订单暂停
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['pause'] = 'true';
|
||
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id, $log_msg .'订单暂停');
|
||
}
|
||
|
||
//订单暂停状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance)
|
||
{
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
foreach ($order_ids as $id)
|
||
{
|
||
$instance->update_order_pause_status($id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return $rs;
|
||
}
|
||
//暂停成功
|
||
elseif($pause_dly && $is_fail==false)
|
||
{
|
||
$deliveryInfo = array();
|
||
foreach ($pause_dly as $key => $val)
|
||
{
|
||
$deliveryInfo = $val;
|
||
|
||
//自有仓储
|
||
if($deliveryInfo['is_selfwms'] == true)
|
||
{
|
||
//wms暂停发货单成功,暂停本地主发货单
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'pause' => 'true'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'], $log_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,
|
||
'pause' => 'true'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$id, $log_msg .'发货单暂停');
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行暂停
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['pause'] = 'true';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id, $log_msg .'订单暂停');
|
||
}
|
||
}
|
||
}else{
|
||
//暂停当前订单
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['pause'] = 'true';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$order_id, $log_msg .'订单暂停');
|
||
}
|
||
|
||
//订单暂停状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance){
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$instance->update_order_pause_status($id);
|
||
}
|
||
}else{
|
||
$instance->update_order_pause_status($order_id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//第三方仓储
|
||
else
|
||
{
|
||
//wms第三方仓储取消发货单成功,本地主发货单取消
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'status' => 'cancel',
|
||
'logi_id' => '0',
|
||
'logi_name' => '',
|
||
'logi_no' => NULL,
|
||
);
|
||
// $dlyObj->save($tmpdly);
|
||
$ret = $dlyObj->update($tmpdly, ['delivery_id'=> $deliveryInfo['delivery_id'], 'status|in' => ['stop', 'ready', 'progress', 'timeout']]);
|
||
if (is_bool($ret)) {
|
||
continue;
|
||
}
|
||
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'], $log_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, $log_msg .'订单暂停后触发发货单撤销成功');
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行还原
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
$order['pause'] = 'true';
|
||
//订单回到未分派
|
||
if($order_group_id == '16777215'){
|
||
$order['group_id'] = '';
|
||
$order['op_id'] = '';
|
||
}
|
||
|
||
//[拆单]获取订单对应有效的发货单
|
||
$temp_dlyid = $dlyObj->getDeliverIdByOrderId($id);
|
||
if($temp_dlyid)
|
||
{
|
||
$order['process_status'] = 'splitting';//部分拆分
|
||
}
|
||
$this->save($order);
|
||
|
||
//取对应组
|
||
if($order['process_status'] == 'unconfirmed'){
|
||
$this->updateDispatchinfo($id);
|
||
}
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id, $log_msg .'发货单撤销,订单暂停成功,还需重新审核');
|
||
}
|
||
}
|
||
}else{
|
||
//还原当前订单
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
$order['pause'] = 'true';
|
||
//订单回到未分派
|
||
if($order_group_id == '16777215'){
|
||
$order['group_id'] = '0';
|
||
$order['op_id'] = '0';
|
||
}
|
||
|
||
//[拆单]获取订单对应有效的发货单
|
||
$temp_dlyid = $dlyObj->getDeliverIdByOrderId($order_id);
|
||
if($temp_dlyid){
|
||
$order['process_status'] = 'splitting';//部分拆分
|
||
}
|
||
|
||
$this->save($order);
|
||
|
||
//取对应组
|
||
if($order['process_status'] == 'unconfirmed'){
|
||
$this->updateDispatchinfo($order_id);
|
||
}
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$order_id, $log_msg .'发货单撤销,订单暂停成功,还需重新审核');
|
||
}
|
||
|
||
//库存管控
|
||
$storeManageLib = kernel::single('ome_store_manage');
|
||
$storeManageLib->loadBranch(array('branch_id'=>$deliveryInfo['branch_id']));
|
||
if($deliveryInfo['is_bind'] == 'true'){
|
||
foreach ($delivery_ids as $i){
|
||
$delivery = $dlyObj->dump($i,'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'] ='pauseOrd';
|
||
$err_msg = '';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($i);
|
||
}
|
||
}else{
|
||
$de = $deliveryInfo['delivery_order'];
|
||
$or = array_shift($de);
|
||
$ord_id = $or['order_id'];
|
||
|
||
//仓库库存处理
|
||
$params['params'] = array_merge($deliveryInfo,array('order_id'=>$ord_id));
|
||
$params['node_type'] ='pauseOrd';
|
||
$err_msg = '';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($deliveryInfo['delivery_id']);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
//暂停失败
|
||
elseif($is_fail)
|
||
{
|
||
$temp_rs = array('rsp'=>'fail', 'is_split'=>'true');
|
||
foreach ($failDly as $key => $val)
|
||
{
|
||
$temp_rs['msg'] .= '发货单'.$val['bn'].' '.str_replace('数字校验失败', '撤销失败', $val['msg']).'<br>';
|
||
}
|
||
|
||
//已暂停或取消的发货单
|
||
if($pause_dly)
|
||
{
|
||
$deliveryInfo = array();
|
||
$temp_msg = array();
|
||
foreach ($pause_dly as $key => $val)
|
||
{
|
||
$deliveryInfo = $val;
|
||
|
||
if($val['is_selfwms'] == true)
|
||
{
|
||
$temp_msg['is_selfwms'][] = $val['delivery_bn'];
|
||
|
||
//wms暂停发货单成功,暂停本地主发货单
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'pause' => 'true'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'], $log_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,
|
||
'pause' => 'true'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$id, $log_msg .'发货单暂停');
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行暂停
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['pause'] = 'true';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id, $log_msg .'订单暂停');
|
||
}
|
||
}
|
||
}else{
|
||
//暂停当前订单
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['pause'] = 'true';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$order_id, $log_msg .'订单暂停');
|
||
}
|
||
|
||
//订单暂停状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance){
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$instance->update_order_pause_status($id);
|
||
}
|
||
}else{
|
||
$instance->update_order_pause_status($order_id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}else{
|
||
$temp_msg['other'][] = $val['delivery_bn'];
|
||
|
||
//wms第三方仓储取消发货单成功,本地主发货单取消
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'status' => 'cancel',
|
||
'logi_id' => '0',
|
||
'logi_name' => '',
|
||
'logi_no' => NULL,
|
||
);
|
||
// $dlyObj->save($tmpdly);
|
||
|
||
$ret = $dlyObj->update($tmpdly, ['delivery_id'=> $deliveryInfo['delivery_id'], 'status|in' => ['stop', 'ready', 'progress', 'timeout']]);
|
||
if (is_bool($ret)) {
|
||
continue;
|
||
}
|
||
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'], $log_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, $log_msg .'发货单撤销成功');
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行还原
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
$order['pause'] = 'true';
|
||
//订单回到未分派
|
||
if($order_group_id == '16777215'){
|
||
$order['group_id'] = '0';
|
||
$order['op_id'] = '0';
|
||
}
|
||
|
||
//[拆单]获取订单对应有效的发货单
|
||
$temp_dlyid = $dlyObj->getDeliverIdByOrderId($id);
|
||
if($temp_dlyid)
|
||
{
|
||
$order['process_status'] = 'splitting';//部分拆分
|
||
}
|
||
$this->save($order);
|
||
|
||
//取对应组
|
||
if($order['process_status'] == 'unconfirmed'){
|
||
$this->updateDispatchinfo($id);
|
||
}
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id, $log_msg .'发货单撤销,订单暂停成功,还原需重新审核');
|
||
}
|
||
}
|
||
}else{
|
||
//还原当前订单
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['confirm'] = 'N';
|
||
$order['process_status'] = 'unconfirmed';
|
||
$order['pause'] = 'true';
|
||
//订单回到未分派
|
||
if($order_group_id == '16777215'){
|
||
$order['group_id'] = '0';
|
||
$order['op_id'] = '0';
|
||
}
|
||
|
||
//[拆单]获取订单对应有效的发货单
|
||
$temp_dlyid = $dlyObj->getDeliverIdByOrderId($order_id);
|
||
if($temp_dlyid)
|
||
{
|
||
$order['process_status'] = 'splitting';//部分拆分
|
||
}
|
||
$this->save($order);
|
||
|
||
//取对应组
|
||
if($order['process_status'] == 'unconfirmed'){
|
||
$this->updateDispatchinfo($order_id);
|
||
}
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$order_id, $log_msg .'发货单撤销,订单暂停成功,还原需重新审核');
|
||
}
|
||
|
||
//库存管控
|
||
$storeManageLib = kernel::single('ome_store_manage');
|
||
$storeManageLib->loadBranch(array('branch_id'=>$deliveryInfo['branch_id']));
|
||
if($deliveryInfo['is_bind'] == 'true'){
|
||
foreach ($delivery_ids as $i){
|
||
$delivery = $dlyObj->dump($i,'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'] ='pauseOrd';
|
||
$err_msg = '';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($i);
|
||
}
|
||
}else{
|
||
$de = $deliveryInfo['delivery_order'];
|
||
$or = array_shift($de);
|
||
$ord_id = $or['order_id'];
|
||
|
||
//仓库库存处理
|
||
$params['params'] = array_merge($deliveryInfo,array('order_id'=>$ord_id));
|
||
$params['node_type'] ='pauseOrd';
|
||
$err_msg = '';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($deliveryInfo['delivery_id']);
|
||
}
|
||
}
|
||
}
|
||
|
||
if($temp_msg['is_selfwms']){
|
||
$temp_rs['msg'] .= '<br><br>自有仓储,成功暂停的发货单:'.implode(',', $temp_msg['is_selfwms']);
|
||
}elseif($temp_msg['other']){
|
||
$temp_rs['msg'] .= '<br><br>第三方仓储,成功取消的发货单:'.implode(',', $temp_msg['other']);
|
||
}
|
||
}
|
||
|
||
$rs = $temp_rs;
|
||
unset($temp_rs);
|
||
}
|
||
|
||
return $rs;
|
||
}
|
||
|
||
/**
|
||
* 订单恢复
|
||
*
|
||
* @param int $order_id
|
||
* @return boolean
|
||
*/
|
||
public function renewOrder($order_id, $memo = '')
|
||
{
|
||
$branchLib = kernel::single('ome_branch');
|
||
$channelLib = kernel::single('channel_func');
|
||
|
||
$dlyObj = app::get('ome')->model('delivery');
|
||
$oOperation_log = app::get('ome')->model('operation_log');
|
||
|
||
$is_fail = false;//失败标记
|
||
$pause_dly = array();//需要恢复的发货单
|
||
|
||
if(empty($order_id)){
|
||
return false;
|
||
}
|
||
|
||
//订单信息
|
||
$o = $this->dump($order_id,'pause');
|
||
if($o['pause'] != 'true'){
|
||
return false;
|
||
}
|
||
|
||
//订单对应的发货单
|
||
$dly_ids = $dlyObj->getDeliverIdByOrderId($order_id);
|
||
|
||
//没有发货单的情况,直接恢复当前订单
|
||
if(empty($dly_ids)){
|
||
// $order = array();
|
||
// $order['order_id'] = $order_id;
|
||
// $order['pause'] = 'false';
|
||
// $this->save($order);
|
||
|
||
//update
|
||
$affect_rows = $this->update(array('pause'=>'false'), array('order_id'=>$order_id, 'status|noequal'=>'dead'));
|
||
if(!is_bool($affect_rows)){
|
||
$oOperation_log->write_log('order_modify@ome',$order_id,'订单恢复:' . $memo);
|
||
}
|
||
|
||
//订单恢复状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance){
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
$instance->update_order_pause_status($order_id, 'false');
|
||
}
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//恢复发货单
|
||
foreach ($dly_ids as $key => $delivery_id)
|
||
{
|
||
//取仓库信息
|
||
$deliveryInfo = $dlyObj->dump($delivery_id,'*');
|
||
|
||
//已发货的发货单,跳过
|
||
if($deliveryInfo['status'] == 'succ'){
|
||
continue;//已发货,跳过
|
||
}
|
||
|
||
$pause_dly[] = $deliveryInfo;
|
||
|
||
$wms_id = $branchLib->getWmsIdById($deliveryInfo['branch_id']);
|
||
if($wms_id){
|
||
$is_selfWms = $channelLib->isSelfWms($wms_id);
|
||
if($is_selfWms){
|
||
//发货通知单暂停推送仓库
|
||
$notice_params = array(
|
||
'delivery_id'=>$deliveryInfo['delivery_id'],
|
||
'delivery_bn'=>$deliveryInfo['delivery_bn'],
|
||
'branch_id'=>$deliveryInfo['branch_id'],
|
||
'wms_id' => $wms_id,
|
||
);
|
||
|
||
$res = ome_delivery_notice::renew($notice_params, true);
|
||
if($res['rsp'] == 'success' || $res['rsp'] == 'succ'){
|
||
//wms恢复发货单成功,恢复本地主发货单
|
||
$tmpdly = array(
|
||
'delivery_id' => $deliveryInfo['delivery_id'],
|
||
'pause' => 'false'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$deliveryInfo['delivery_id'],'发货单恢复');
|
||
|
||
//是否是合并发货单
|
||
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,
|
||
'pause' => 'false'
|
||
);
|
||
$dlyObj->save($tmpdly);
|
||
$oOperation_log->write_log('delivery_modify@ome',$id,'发货单恢复');
|
||
}
|
||
}
|
||
|
||
//取关联订单号进行暂停
|
||
$order_ids = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$order = array();
|
||
$order['order_id'] = $id;
|
||
$order['pause'] = 'false';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$id,'订单恢复');
|
||
}
|
||
}
|
||
}else{
|
||
//恢复当前订单
|
||
$order = array();
|
||
$order['order_id'] = $order_id;
|
||
$order['pause'] = 'false';
|
||
$this->save($order);
|
||
|
||
$oOperation_log->write_log('order_modify@ome',$order_id,'订单恢复');
|
||
}
|
||
|
||
//订单暂停状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance){
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
if($order_ids){
|
||
foreach ($order_ids as $id){
|
||
$instance->update_order_pause_status($id, 'false');
|
||
}
|
||
}else{
|
||
$instance->update_order_pause_status($order_id, 'false');
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}else{
|
||
$is_fail = true;
|
||
}
|
||
}
|
||
}else{
|
||
$is_fail = true;
|
||
}
|
||
}
|
||
|
||
//恢复已发货的发货单对应的订单状态
|
||
if(empty($pause_dly) && $is_fail==false){
|
||
$order_ids = array();
|
||
|
||
//处理订单对应多个发货单
|
||
foreach ($dly_ids as $key => $delivery_id)
|
||
{
|
||
//取仓库信息
|
||
$deliveryInfo = $dlyObj->dump($delivery_id,'delivery_id, is_bind');
|
||
|
||
//是否是合并发货单
|
||
if($deliveryInfo['is_bind'] == 'true')
|
||
{
|
||
//取关联订单号进行暂停
|
||
$temp_date = $dlyObj->getOrderIdByDeliveryId($deliveryInfo['delivery_id']);
|
||
if($temp_date){
|
||
foreach ($temp_date as $id){
|
||
$order_ids[] = $id;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$order_ids[] = $order_id;
|
||
$order_ids = array_unique($order_ids);
|
||
|
||
foreach ($order_ids as $id){
|
||
// $order = array();
|
||
// $order['order_id'] = $id;
|
||
// $order['pause'] = 'false';
|
||
// $this->save($order);
|
||
|
||
//update
|
||
$affect_rows = $this->update(array('pause'=>'false'), array('order_id'=>$id, 'status|noequal'=>'dead'));
|
||
if(!is_bool($affect_rows)){
|
||
$oOperation_log->write_log('order_modify@ome',$id,'订单恢复');
|
||
}
|
||
}
|
||
|
||
//订单恢复状态同步
|
||
if ($service_order = kernel::servicelist('service.order')){
|
||
foreach($service_order as $object=>$instance)
|
||
{
|
||
if(method_exists($instance, 'update_order_pause_status')){
|
||
foreach ($order_ids as $id)
|
||
{
|
||
$instance->update_order_pause_status($id);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if($is_fail){
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
//分派时间
|
||
function modifier_dispatch_time($row){
|
||
if ($row){
|
||
$tmp = date('Y年m月d日 H点',$row);
|
||
return $tmp;
|
||
}
|
||
}
|
||
|
||
//平台状态
|
||
function modifier_source_status($row){
|
||
return kernel::single('ome_order_func')->get_source_status($row, 'txt');
|
||
}
|
||
|
||
//平台状态
|
||
function modifier_step_trade_status($row){
|
||
return kernel::single('ome_order_func')->get_step_trade_status($row, 'txt');
|
||
}
|
||
|
||
/**
|
||
* 确认组
|
||
*
|
||
* @param Integer $row 组ID
|
||
* @return void
|
||
*/
|
||
function modifier_group_id($row) {
|
||
|
||
switch ($row) {
|
||
case 0:
|
||
$ret = '无';
|
||
break;
|
||
case 16777215:
|
||
$ret = '系统';
|
||
break;
|
||
default:
|
||
$ret = $this->_getGroupName($row);
|
||
break;
|
||
}
|
||
|
||
return $ret;
|
||
}
|
||
|
||
/**
|
||
* 获取用户名
|
||
*
|
||
* @param Integer $gid
|
||
* @return String;
|
||
*/
|
||
private function _getUserName($uid) {
|
||
if (self::$__USERS === null) {
|
||
|
||
self::$__USERS = array();
|
||
$rows = app::get('desktop')->model('users')->getList('*');
|
||
foreach((array) $rows as $row) {
|
||
self::$__USERS[$row['user_id']] = $row['name'];
|
||
}
|
||
}
|
||
|
||
if (isset(self::$__USERS[$uid])) {
|
||
|
||
return self::$__USERS[$uid];
|
||
} else {
|
||
|
||
return '未知';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取组名
|
||
*
|
||
* @param Integer $gid
|
||
* @return String;
|
||
*/
|
||
private function _getGroupName($gid) {
|
||
|
||
if (self::$__GROUPS === null) {
|
||
|
||
self::$__GROUPS = array();
|
||
$rows = app::get('ome')->model('groups')->getList('*');
|
||
foreach((array) $rows as $row) {
|
||
self::$__GROUPS[$row['group_id']] = $row['name'];
|
||
}
|
||
}
|
||
|
||
if (isset(self::$__GROUPS[$gid])) {
|
||
|
||
return self::$__GROUPS[$gid];
|
||
} else {
|
||
|
||
return '未知';
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 确认人
|
||
*
|
||
* @param Integer $row 确认人ID
|
||
* @return void
|
||
*/
|
||
function modifier_op_id($row) {
|
||
|
||
switch ($row) {
|
||
case 0:
|
||
$ret = '无';
|
||
break;
|
||
case 16777215:
|
||
$ret = '系统';
|
||
break;
|
||
default:
|
||
$ret = $this->_getUserName($row);
|
||
break;
|
||
}
|
||
|
||
return $ret;
|
||
}
|
||
|
||
/**
|
||
* 打回订单的发货单
|
||
* @param int $order_id 订单号
|
||
* @param boolean $reback_status 打回状态,默认为false:打回所有发货单;true:只打回未发货的发货单
|
||
*/
|
||
function rebackDeliveryByOrderId($order_id,$dly_status=false,$memo=''){
|
||
|
||
$dlyObj = app::get('ome')->model('delivery');
|
||
$dly_oObj = app::get('ome')->model('delivery_order');
|
||
$opObj = app::get('ome')->model('operation_log');
|
||
|
||
$is_succ = true;//成功标识
|
||
|
||
$bind = array();
|
||
$dlyos = array();
|
||
$mergedly = array();
|
||
|
||
//订单关联的发货单
|
||
$data = $dly_oObj->getList('*',array('order_id'=>$order_id),0,-1);
|
||
if ($data)
|
||
{
|
||
foreach ($data as $v){
|
||
$dly = $dlyObj->dump($v['delivery_id'],'process,status,parent_id,is_bind');
|
||
|
||
//只打回未发货的发货单
|
||
//if ($dly_status == true){
|
||
if ($dly['process'] == 'true' || in_array($dly['status'],array('failed', 'cancel', 'back', 'succ','return_back'))){
|
||
continue;
|
||
}
|
||
//}
|
||
|
||
if ($dly['parent_id'] == 0 && $dly['is_bind'] == 'true'){
|
||
$bind[$v['delivery_id']]['delivery_id'] = $v['delivery_id'];
|
||
}elseif ($dly['parent_id'] == 0){
|
||
$dlyos[$v['delivery_id']][] = $v['delivery_id'];
|
||
}else{
|
||
$mergedly[$v['delivery_id']] = $v['delivery_id'];
|
||
$bind[$dly['parent_id']]['items'][] = $v['delivery_id'];
|
||
}
|
||
}
|
||
}
|
||
|
||
//如果是合并发货单的话
|
||
if ($bind)
|
||
{
|
||
foreach ($bind as $k => $i){
|
||
//$items = $dlyObj->getItemsByParentId($i['delivery_id'], 'array', 'delivery_id');
|
||
|
||
#拆分发货单
|
||
$result = $dlyObj->splitDelivery($i['delivery_id'], $i['items'], false);
|
||
|
||
if ($result){
|
||
$is_succ = $dlyObj->rebackDelivery($i['items'], $memo, $dly_status, false);
|
||
|
||
#打回发货单失败
|
||
if($is_succ == false)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
foreach ($i['items'] as $i){
|
||
$dlyObj->updateOrderPrintFinish($i, 1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//单个发货单
|
||
if ($dlyos){
|
||
foreach ($dlyos as $v){
|
||
$is_succ = $dlyObj->rebackDelivery($v, $memo, $dly_status, false);
|
||
|
||
#打回发货单失败
|
||
if($is_succ == false)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
$dlyObj->updateOrderPrintFinish($v, 1);
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 获得总数量
|
||
*
|
||
* @param string $where
|
||
*
|
||
* @return array()
|
||
*/
|
||
function get_all($where){
|
||
$minute = $this->app->getConf('ome.order.unconfirmtime');
|
||
$time = time() - $minute*60;
|
||
|
||
$sql = "SELECT COUNT(o.order_id) AS 'TOTAL' FROM sdb_ome_orders o
|
||
WHERE 1 $where ";
|
||
$re4 = $this->db->selectrow($sql);
|
||
$sql = "SELECT COUNT(o.order_id) AS 'TOTAL' FROM sdb_ome_orders o
|
||
WHERE (is_cod='true' OR pay_status='1') $where
|
||
AND (`op_id` is null and `group_id` is null)";
|
||
$re1 = $this->db->selectrow($sql);
|
||
$sql = "SELECT COUNT(o.order_id) AS 'TOTAL' FROM sdb_ome_orders o
|
||
WHERE (`op_id` is not null or `group_id` is not null) $where
|
||
AND o.confirm='N'";
|
||
$re2 = $this->db->selectrow($sql);
|
||
$sql = "SELECT COUNT(o.order_id) AS 'TOTAL' FROM sdb_ome_orders o
|
||
WHERE (`op_id` is not null or `group_id` is not null) $where
|
||
AND o.confirm='N'
|
||
AND o.dt_begin < $time ";
|
||
$re3 = $this->db->selectrow($sql);
|
||
|
||
$re['all'] = $re4['TOTAL'];
|
||
$re['a'] = $re1['TOTAL'];
|
||
$re['b'] = $re2['TOTAL'];
|
||
$re['c'] = $re3['TOTAL'];
|
||
return $re;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获得确认组订单数量
|
||
*
|
||
* @param string $where
|
||
*
|
||
* @return array
|
||
*/
|
||
function get_group($where){
|
||
$sql = "SELECT o.group_id,g.name FROM sdb_ome_orders o
|
||
JOIN sdb_ome_groups g
|
||
ON o.group_id=g.group_id
|
||
WHERE g.g_type='confirm' $where GROUP BY o.group_id ";
|
||
$data = $this->db->select($sql);
|
||
$result = array();
|
||
if ($data){
|
||
$minute = $this->app->getConf('ome.order.unconfirmtime');
|
||
$time = time() - $minute*60;
|
||
foreach ($data as $v){
|
||
$group_id = $v['group_id'];
|
||
$result[$group_id]['name'] = $v['name'];
|
||
|
||
$sql = "SELECT COUNT(order_id) AS 'TOTAL' FROM sdb_ome_orders as o
|
||
WHERE group_id=$group_id
|
||
AND (`op_id` is not null or `group_id` is not null)
|
||
AND confirm='N' $where";
|
||
$re = $this->db->selectrow($sql);
|
||
$result[$group_id]['b'] = $re['TOTAL'];
|
||
|
||
$sql = "SELECT COUNT(order_id) AS 'TOTAL' FROM sdb_ome_orders
|
||
WHERE group_id=$group_id
|
||
AND (`op_id` is not null or `group_id` is not null)
|
||
AND confirm='N'
|
||
AND dt_begin < $time ";
|
||
$re = $this->db->selectrow($sql);
|
||
$result[$group_id]['c'] = $re['TOTAL'];
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
|
||
/**
|
||
* 获得已分派但未确认时间超过设定时间的订单数量
|
||
*
|
||
* @param string $where
|
||
* @param string $type
|
||
*
|
||
* @return number
|
||
*/
|
||
function get_operator($where){
|
||
$sql = "SELECT o.group_id,g.name as 'g_name',o.op_id,u.name as 'u_name' FROM sdb_ome_orders o
|
||
JOIN sdb_ome_groups g
|
||
ON o.group_id=g.group_id
|
||
JOIN sdb_desktop_users u
|
||
ON u.user_id=o.op_id
|
||
WHERE g.g_type='confirm' $where GROUP BY o.op_id ";
|
||
$data = $this->db->select($sql);
|
||
$result = array();
|
||
if ($data){
|
||
$minute = $this->app->getConf('ome.order.unconfirmtime');
|
||
$time = time() - $minute*60;
|
||
foreach ($data as $v){
|
||
$op_id = $v['op_id'];
|
||
$result[$op_id]['g_name'] = $v['g_name'];
|
||
$result[$op_id]['u_name'] = $v['u_name'];
|
||
|
||
$sql = "SELECT COUNT(order_id) AS 'TOTAL' FROM sdb_ome_orders as o
|
||
WHERE op_id=$op_id
|
||
AND (`op_id` is not null or `group_id` is not null)
|
||
AND confirm='N' $where";
|
||
$re = $this->db->selectrow($sql);
|
||
$result[$op_id]['b'] = $re['TOTAL'];
|
||
|
||
$sql = "SELECT COUNT(order_id) AS 'TOTAL' FROM sdb_ome_orders
|
||
WHERE op_id=$op_id
|
||
AND (`op_id` is not null or `group_id` is not null)
|
||
AND confirm='N'
|
||
AND dt_begin < $time ";
|
||
$re = $this->db->selectrow($sql);
|
||
$result[$op_id]['c'] = $re['TOTAL'];
|
||
}
|
||
}
|
||
|
||
return $result;
|
||
}
|
||
|
||
function get_confirm_ops(){
|
||
$sql = "SELECT go.op_id,u.name FROM sdb_ome_group_ops go
|
||
JOIN sdb_ome_groups g
|
||
ON g.group_id = go.group_id
|
||
JOIN sdb_desktop_users u
|
||
ON go.op_id = u.user_id
|
||
WHERE g.g_type = 'confirm' GROUP BY go.op_id ";
|
||
$re = $this->db->select($sql);
|
||
return $re;
|
||
}
|
||
/*
|
||
* 根据订单来恢复预占的冻结库存
|
||
* 比如在订单被取消时,就需要恢复冻结库存
|
||
*
|
||
* @param int $order_id
|
||
* @param int $is_ctrl_store 是否管控库存 false为不管控,不需要扣减已生成发货单的商品数量
|
||
*/
|
||
function unfreez($order_id,$is_ctrl_store = true){
|
||
$oDelivery = $this->app->model("delivery");
|
||
//unfreeze剩余未生成发货单的货品
|
||
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
|
||
|
||
kernel::single('material_basic_material_stock_freeze')->deleteOrderBranchFreeze([$order_id]);
|
||
$items = $this->db->select("SELECT product_id,nums,obj_id FROM sdb_ome_order_items WHERE order_id=".$order_id ." AND `delete`='false'");
|
||
uasort($items, [kernel::single('console_iostockorder'), 'cmp_productid']);
|
||
|
||
$objects = app::get('ome')->model('order_objects')->getList('obj_id,goods_id', ['obj_id'=>array_column($items, 'obj_id')]);
|
||
$objects = array_column($objects, null, 'obj_id');
|
||
|
||
$branchBatchList = [];
|
||
foreach($items as $v){
|
||
$dly_num = $oDelivery->getDeliveryFreez($order_id,$v['product_id']);
|
||
$dly_num = $dly_num ? $dly_num : 0;
|
||
$num = $v['nums'] - $dly_num;
|
||
if (!$is_ctrl_store) {
|
||
$num = $v['nums'];
|
||
}
|
||
if($num > 0){
|
||
|
||
$branchBatchList[] = [
|
||
'bm_id' => $v['product_id'],
|
||
'sm_id' => $objects[$v['obj_id']]['goods_id'],
|
||
'obj_type' => material_basic_material_stock_freeze::__ORDER,
|
||
'bill_type' => 0,
|
||
'obj_id' => $order_id,
|
||
'branch_id' => '',
|
||
'bmsq_id' => material_basic_material_stock_freeze::__SHARE_STORE,
|
||
'num' => $num,
|
||
];
|
||
}
|
||
}
|
||
|
||
$err = '';
|
||
$basicMStockFreezeLib->unfreezeBatch($branchBatchList, __CLASS__.'::'.__FUNCTION__, $err);
|
||
|
||
//订单取消后,清除订单级预占流水
|
||
// unfreezeBatch已经清除
|
||
// $basicMStockFreezeLib->delOrderFreeze($order_id);
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 更新订单状态
|
||
*
|
||
* @param bigint $order_id
|
||
* @param string $status
|
||
*
|
||
* @return boolean
|
||
*/
|
||
function set_status($order_id, $status){
|
||
$data['order_id'] = $order_id;
|
||
$data['process_status'] = $status['order_status'];
|
||
if(isset($status['pause'])){
|
||
$data['pause'] = $status['pause'];
|
||
}
|
||
|
||
|
||
return $this->save($data);
|
||
}
|
||
|
||
/*
|
||
* 取消发货单
|
||
*
|
||
* @param int $order_id
|
||
*
|
||
* @return bool
|
||
*/
|
||
function cancel_delivery($order_id,$must_log = false)
|
||
{
|
||
$cancel_orders = array();
|
||
|
||
//找到订单关联的发货单,取消发货单,释放仓库冻结,增加店铺销售物料冻结
|
||
//如果状态是失败,但是有成功取消发货单数量,做后续逻辑判断用到
|
||
$rs = array('rsp'=>'succ','msg'=>'','succ_num'=>0);
|
||
|
||
//bugfix 拆单一个订单可能对应多个发货单 xiayuanjun
|
||
$deliveryList = $this->db->select("SELECT dord.delivery_id,d.is_bind,d.status,d.delivery_bn,d.branch_id,d.shop_id FROM sdb_ome_delivery_order AS dord
|
||
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
|
||
WHERE dord.order_id={$order_id} AND d.disabled='false' AND d.parent_id=0 AND d.status not in('cancel','back','succ','return_back')");
|
||
if($deliveryList){
|
||
$oDelivery = $this->app->model("delivery");
|
||
$delivery_itemsObj = $this->app->model('delivery_items');
|
||
$itemsObj = $this->app->model("order_items");
|
||
$oOperation_log = app::get('ome')->model('operation_log');
|
||
$dlyObj = app::get('ome')->model("delivery");
|
||
//库存管控处理
|
||
$storeManageLib = kernel::single('ome_store_manage');
|
||
|
||
foreach($deliveryList as $delivery){
|
||
$is_bind = $delivery['is_bind'];
|
||
$branch_id = $delivery['branch_id'];
|
||
$delivery_bn = $delivery['delivery_bn'];
|
||
$delivery_id = $delivery['delivery_id'];
|
||
$shop_id = $delivery['shop_id'];
|
||
$storeManageLib->loadBranch(array('branch_id'=>$delivery['branch_id']));
|
||
|
||
if ($is_bind == 'false') {
|
||
//发货通知单暂停推送仓库
|
||
$notice_params = array(
|
||
'delivery_id'=>$delivery_id,
|
||
'delivery_bn'=>$delivery_bn,
|
||
'branch_id'=>$branch_id,
|
||
);
|
||
|
||
$res = ome_delivery_notice::cancel($notice_params, true);
|
||
if ( $res['rsp'] == 'success' || $res['rsp'] == 'succ') {
|
||
$tmpdly = array(
|
||
'delivery_id' => $delivery_id,
|
||
'status' => 'cancel',
|
||
'logi_id' => '0',
|
||
'logi_name' => '',
|
||
'logi_no' => NULL,
|
||
);
|
||
|
||
// 防并发
|
||
$ret = $dlyObj->update($tmpdly, ['delivery_id'=>$delivery_id, 'status|in' => ['stop', 'ready', 'progress', 'timeout']]);
|
||
if (is_bool($ret)) {
|
||
$rs['msg'] = '发货单已被取消';
|
||
return $rs;
|
||
}
|
||
|
||
$oOperation_log->write_log('delivery_modify@ome',$delivery_id,'发货单撤销成功');
|
||
//更新发货单状态 API
|
||
kernel::single('ome_event_trigger_shop_delivery')->delivery_process_update($delivery_id);
|
||
|
||
$deliveryInfo = $oDelivery->dump($delivery_id,'delivery_id,branch_id,shop_id',array('delivery_items'=>array('*'),'delivery_order'=>array('*')));
|
||
$de = $deliveryInfo['delivery_order'];
|
||
$or = array_shift($de);
|
||
$ord_id = $or['order_id'];
|
||
|
||
//仓库库存处理
|
||
$params['params'] = array_merge($deliveryInfo,array('order_id'=>$ord_id));
|
||
$params['node_type'] ='cancelDly';
|
||
$err_msg = '';
|
||
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
|
||
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($delivery_id);
|
||
|
||
$rs['succ_num']++;
|
||
|
||
//撤消成功的订单
|
||
$cancel_orders[$order_id] = $order_id;
|
||
}else{
|
||
$rs['rsp'] = 'fail';
|
||
$rs['msg'] .= $res['msg'] . ';';
|
||
$oOperation_log->write_log('delivery_back@ome',$delivery_id,'发货单取消通知仓库:失败,原因'.$rs['msg']);
|
||
|
||
//订单收订触发叫回失败的,需额外记录失败日志并展示
|
||
if($must_log){
|
||
kernel::single('console_delivery')->update_sync_status($delivery_id, 'cancel_fail', $rs['msg']);
|
||
}
|
||
}
|
||
}else{
|
||
|
||
|
||
$split_result = $oDelivery->splitDelivery($delivery_id,array(),$must_log);
|
||
if (!$split_result) {
|
||
$rs['rsp'] = 'fail';
|
||
$rs['msg'] .= '可能WMS订单不存在;';
|
||
}else{
|
||
$rs['succ_num']++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return $rs;
|
||
}
|
||
|
||
function order_detail($order_id){
|
||
$order_detail = $this->dump($order_id);
|
||
return $order_detail;
|
||
}
|
||
/*
|
||
* 设置订单异常,并保存异常类型和备注
|
||
*
|
||
* @param array $data abnormal对象的sdf结构数据
|
||
* @param string $log_memo 日志备注
|
||
*
|
||
*/
|
||
function set_abnormal($data){
|
||
//组织 分派的数组 $data_dispatch 跟filter(跟dispatch 的参数形式保持一致)
|
||
|
||
$data_dispatch = array(
|
||
'group_id' =>$data['group_id'],
|
||
'op_id' =>$data['op_id'],
|
||
'dt_begin' =>time(),
|
||
'dispatch_time' =>time(),
|
||
);
|
||
//组织 set_abnormal的数组
|
||
$data = array(
|
||
'abnormal_id'=>$data['abnormal_id'],
|
||
'order_id'=>$data['order_id'],
|
||
'is_done'=>$data['is_done'],
|
||
'abnormal_memo'=>$data['abnormal_memo'],
|
||
'abnormal_type_id' => $data['abnormal_type_id']
|
||
);
|
||
|
||
$abnormal_msg = $data['abnormal_memo'];
|
||
$memo = array();
|
||
$oAbnormal = $this->app->model('abnormal');
|
||
#订单异常名称
|
||
//echo $data['abnormal_type_id'];exit;
|
||
$type_name = $this->app->model('abnormal_type')->dump(array('type_id'=>$data['abnormal_type_id']),'type_name');
|
||
$data['abnormal_type_name'] = $type_name['type_name'];
|
||
|
||
//备注信息
|
||
$oldmemo = $oAbnormal->dump(array('abnormal_id'=>$data['abnormal_id']), 'abnormal_memo');
|
||
$oldmemo= unserialize($oldmemo['abnormal_memo']);
|
||
if ($oldmemo)
|
||
foreach($oldmemo as $k=>$v){
|
||
$memo[] = $v;
|
||
}
|
||
$op_name = kernel::single('desktop_user')->get_name();
|
||
$newmemo = htmlspecialchars($data['abnormal_memo']);
|
||
$memo[] = array('op_name'=>$op_name, 'op_time'=>date('Y-m-d H:i',time()), 'op_content'=>$newmemo);
|
||
$data['abnormal_memo'] = serialize($memo);
|
||
$oAbnormal->save($data);
|
||
|
||
switch ($data['is_done']){
|
||
case 'false':
|
||
$order_data = array('order_id'=>$data['order_id'],'abnormal'=>'true');
|
||
$this->save($order_data);
|
||
$memo = "设置订单异常(". $abnormal_msg .")";
|
||
break;
|
||
case 'true' :
|
||
$order = $this->dump($data['order_id']);
|
||
if ($order['ship_status'] == 2){
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'Y',
|
||
// 'process_status'=>'splitting',
|
||
//'dispatch_time'=>0, #部分发货_保留分派时间
|
||
'print_finish'=>'false'
|
||
);
|
||
$is_splited = app::get('ome')->model('order_items')->is_splited($data['order_id']);
|
||
$filter['process_status'] = $is_splited ? 'splited' : 'splitting';
|
||
|
||
}elseif ($order['process_status'] == 'cancel'){
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'N',
|
||
'group_id'=>NULL,
|
||
'op_id'=>NULL,
|
||
'dispatch_time'=>0,
|
||
'print_finish'=>'false'
|
||
);
|
||
}
|
||
#余单撤消或已发货的订单
|
||
elseif($order['process_status']=='remain_cancel' || $order['ship_status'] == '1')
|
||
{
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'Y',
|
||
);
|
||
}
|
||
//[拆单]部分拆分部分退货订单异常处理
|
||
elseif($order['process_status'] == 'splitting')
|
||
{
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'N',
|
||
'process_status'=>'unconfirmed',
|
||
'group_id'=>NULL,
|
||
'op_id'=>NULL,
|
||
'dispatch_time'=>0,
|
||
'print_finish'=>'false',
|
||
);
|
||
|
||
//根据已拆分的发货单货品数量,判断订单的拆分状态
|
||
$orderLib = kernel::single('ome_order');
|
||
$process_status = $orderLib->get_order_process_status($data['order_id']);
|
||
if($process_status){
|
||
$filter['process_status'] = $process_status;
|
||
}
|
||
|
||
//部分拆分或已拆分时,不用更新(确认组、确认人、分派时间)
|
||
if(in_array($filter['process_status'], array('splitting', 'splited'))){
|
||
unset($filter['group_id'], $filter['op_id'], $filter['dispatch_time']);
|
||
}
|
||
}
|
||
//已拆分完,部分退货订单异常处理
|
||
elseif($order['process_status'] == 'splited')
|
||
{
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'N',
|
||
'process_status'=>'unconfirmed',
|
||
'group_id'=>NULL,
|
||
'op_id'=>NULL,
|
||
'dispatch_time'=>0,
|
||
'print_finish'=>'false',
|
||
);
|
||
|
||
//根据已拆分的发货单货品数量,判断订单的拆分状态
|
||
$orderLib = kernel::single('ome_order');
|
||
$process_status = $orderLib->get_order_process_status($data['order_id']);
|
||
if($process_status){
|
||
$filter['process_status'] = $process_status;
|
||
}
|
||
|
||
//部分拆分或已拆分时,不用更新(确认组、确认人、分派时间)
|
||
if(in_array($filter['process_status'], array('splitting', 'splited'))){
|
||
unset($filter['group_id'], $filter['op_id'], $filter['dispatch_time']);
|
||
}
|
||
}
|
||
else {
|
||
$filter = array(
|
||
'order_id'=>$data['order_id'],
|
||
'abnormal'=>'false',
|
||
'confirm'=>'N',
|
||
'process_status'=>'unconfirmed',
|
||
'group_id'=>NULL,
|
||
'op_id'=>NULL,
|
||
'dispatch_time'=>0,
|
||
'print_finish'=>'false'
|
||
);
|
||
}
|
||
$order_data = $filter;
|
||
$this->save($order_data);
|
||
|
||
$memo = "修改订单异常备注(". $abnormal_msg .")";
|
||
break;
|
||
}
|
||
|
||
//写操作日志
|
||
$oOperation_log = $this->app->model('operation_log');
|
||
$oOperation_log->write_log('order_modify@ome',$data['order_id'],$memo);
|
||
}
|
||
|
||
/*
|
||
* 获取订单明细列表
|
||
*
|
||
* @param int $order_id 订单id
|
||
* @param bool $sort 是否要排序,默认不要。排序后的结果会按照普通商品、捆绑商品、赠品、配件等排列
|
||
*
|
||
* @return array
|
||
*/
|
||
function getItemList($order_id,$sort=false){
|
||
$order_items = array();
|
||
|
||
if($sort){
|
||
$items = $this->dump($order_id,"order_id",array("order_objects"=>array("*")));
|
||
foreach($items['order_objects'] as $k=>$v){
|
||
|
||
//价保订单SKU
|
||
if($v['object_bool_type'] > 0){
|
||
if(kernel::single('ome_order_bool_objecttype')->isPriceProtect($v['object_bool_type'])) {
|
||
$v['is_price_protect'] = 'true';
|
||
}
|
||
}
|
||
|
||
// 直播间ID
|
||
$v['addon'] = @json_decode($v['addon'], 1);
|
||
if ($v['addon'] && isset($v['addon']['room_id'])) {
|
||
$v['room_id'] = $v['addon']['room_id'];
|
||
}
|
||
|
||
//object
|
||
$order_items[$v['obj_type']][$k] = $v;
|
||
|
||
//普通商品类型
|
||
foreach($this->db->select("SELECT *,nums AS quantity FROM sdb_ome_order_items WHERE obj_id=".$v['obj_id']." AND item_type='product' ORDER BY item_type") as $it){
|
||
$order_items[$v['obj_type']][$k]['order_items'][$it['item_id']] = $it;
|
||
}
|
||
|
||
//其它商品类型
|
||
foreach($this->db->select("SELECT *,nums AS quantity FROM sdb_ome_order_items WHERE obj_id=".$v['obj_id']." AND item_type<>'product' ORDER BY item_type") as $it){
|
||
$order_items[$v['obj_type']][$k]['order_items'][$it['item_id']] = $it;
|
||
}
|
||
}
|
||
|
||
}else{
|
||
$items = $this->dump($order_id,"order_id",array("order_objects"=>array("*",array("order_items"=>array("*")))));
|
||
foreach($items['order_objects'] as $oneobj)
|
||
{
|
||
foreach ($oneobj['order_items'] as $objitems)
|
||
$order_items[] = $objitems;
|
||
}
|
||
}
|
||
return $order_items;
|
||
}
|
||
|
||
/*
|
||
* 获取订单明细以及明细商品在各个仓库中的库存
|
||
*
|
||
* @param int $order_id
|
||
* @param int $branch_id
|
||
*
|
||
* @return array
|
||
*/
|
||
function getItemBranchStore($order_id, $branch_id=0)
|
||
{
|
||
$libBranchProduct = kernel::single('ome_branch_product');
|
||
|
||
$order_items = $this->getItemList($order_id,true);
|
||
|
||
$tmp = array();
|
||
if($order_items){
|
||
$oDelivery = $this->app->model("delivery");
|
||
$branchObj = $this->app->model("branch");
|
||
$delivBranch = $branchObj->getDelivBranch($branch_id);
|
||
$orderFreeze = app::get('material')->model('basic_material_stock_freeze')->getList('bm_id, branch_id, num',
|
||
array('obj_type'=>1, 'obj_id'=>$order_id, 'bill_type'=>material_basic_material_stock_freeze::__ORDER_YOU));
|
||
$orderFreeze = array_column($orderFreeze, null, 'bm_id');
|
||
foreach($order_items as $obj_type=>$object_type){
|
||
foreach($object_type as $obj_id=>$obj){
|
||
|
||
$i = 1;
|
||
foreach($obj['order_items'] as $k=>$item)
|
||
{
|
||
$branch_store = $libBranchProduct->get_branch_store($item['product_id']);
|
||
|
||
/* 货品库存 = 发货仓库存+绑定的备货仓库存 */
|
||
if($delivBranch){
|
||
foreach($delivBranch as $branch_id=>$branch){
|
||
if (array_key_exists($branch_id, $branch_store)) {
|
||
foreach((array)$branch['bind_conf'] as $bindBid){
|
||
$branch_store[$branch_id] += $branch_store[$bindBid];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if($orderFreeze[$item['product_id']]) {
|
||
$ofv = $orderFreeze[$item['product_id']];
|
||
$branch_store[$ofv['branch_id']] += $ofv['num'];
|
||
}
|
||
$order_items[$obj_type][$obj_id]['order_items'][$k]['branch_store'] = $branch_store;
|
||
|
||
$sql = "SELECT SUM(number) AS 'num' FROM `sdb_ome_delivery_items_detail` did
|
||
JOIN `sdb_ome_delivery` d
|
||
ON d.delivery_id=did.delivery_id
|
||
WHERE order_item_id='".$item['item_id']."'
|
||
AND product_id='".$item['product_id']."'
|
||
AND d.status != 'back'
|
||
AND d.status != 'cancel' AND d.status!='return_back'
|
||
AND d.is_bind = 'false'";
|
||
$oi = $this->db->selectrow($sql);
|
||
|
||
$tmpNum = $item['quantity']-intval($oi['num']);
|
||
|
||
//菜鸟直送
|
||
if ($obj['store_code']){
|
||
$wmsBranch = kernel::single('wmsmgr_func')->getBranchIdByStoreCode($obj['store_code']);
|
||
$cnServiceBranch = '';
|
||
if($wmsBranch && $wmsBranch['branch_id']){
|
||
$cnServiceBranch = $delivBranch[$wmsBranch['branch_id']]['name'];
|
||
}
|
||
}
|
||
|
||
$order_items[$obj_type][$obj_id]['cnServiceBranch'] = $cnServiceBranch ? $cnServiceBranch :
|
||
($obj['store_code'] ? $obj['store_code'] : '-');
|
||
$order_items[$obj_type][$obj_id]['left_nums'] = $tmpNum;
|
||
$order_items[$obj_type][$obj_id]['order_items'][$k]['left_nums'] = $tmpNum;
|
||
if ($obj_type == 'pkg' || $obj_type == 'giftpackage' || $obj_type == 'lkb'){
|
||
$order_items[$obj_type][$obj_id]['left_nums'] = intval($obj['quantity'] / $item['quantity'] * $tmpNum);
|
||
$order_items[$obj_type][$obj_id]['sendnum'] = intval($obj['quantity'] / $item['quantity'] * $item['sendnum']);
|
||
|
||
foreach ((array) $branch_store as $bk => $bv) {
|
||
|
||
$bstore = intval($obj['quantity'] / $item['quantity'] * $bv);
|
||
|
||
if ($i==1) {
|
||
$order_items[$obj_type][$obj_id]['branch_store'][$bk] = $bstore;
|
||
} else {
|
||
$order_items[$obj_type][$obj_id]['branch_store'][$bk] = min(intval($order_items[$obj_type][$obj_id]['branch_store'][$bk]),$bstore);
|
||
}
|
||
}
|
||
}
|
||
$i++;
|
||
}
|
||
}
|
||
}
|
||
|
||
// [拆单]重新计算捆绑商品仓库库存数量
|
||
if(!empty($order_items['pkg']))
|
||
{
|
||
foreach($order_items['pkg'] as $obj_id => $obj_li)
|
||
{
|
||
if(!empty($obj_li['branch_store']))
|
||
{
|
||
foreach ($obj_li['branch_store'] as $brand_id => $branch_num)
|
||
{
|
||
foreach($obj_li['order_items'] as $item_id => $item)
|
||
{
|
||
$order_items['pkg'][$obj_id]['order_items'][$item_id]['branch_store'][$brand_id] = intval($item['branch_store'][$brand_id]);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach($order_items['pkg'] as $obj_id => $obj_li)
|
||
{
|
||
if(!empty($obj_li['branch_store']))
|
||
{
|
||
foreach ($obj_li['branch_store'] as $brand_id => $branch_num)
|
||
{
|
||
foreach($obj_li['order_items'] as $item_id => $item)
|
||
{
|
||
$get_branch_num = intval($order_items['pkg'][$obj_id]['branch_store'][$brand_id]);
|
||
$branch_store_num = intval($item['branch_store'][$brand_id]);
|
||
|
||
$order_items['pkg'][$obj_id]['branch_store'][$brand_id] = min($get_branch_num, $branch_store_num);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return $order_items;
|
||
}
|
||
|
||
function getItemsNum($order_id, $product_id){
|
||
$sql = "SELECT SUM(nums) AS '_count' FROM sdb_ome_order_items WHERE order_id='".$order_id."' AND product_id='".$product_id."'";
|
||
$row = $this->db->selectrow($sql);
|
||
return $row['_count'];
|
||
}
|
||
|
||
/*
|
||
* 获取本订单的order_object的对象别名
|
||
*
|
||
* @param bigint $order_id
|
||
*
|
||
* @return array
|
||
*/
|
||
function getOrderObjectAlias($order_id){
|
||
$ret = array();
|
||
$order_object = $this->db->select("SELECT DISTINCT(obj_type),obj_alias FROM sdb_ome_order_objects WHERE order_id={$order_id} ORDER BY obj_type");
|
||
foreach($order_object as $v){
|
||
$ret[$v['obj_type']] = $v['obj_alias'];
|
||
}
|
||
|
||
return $ret;
|
||
}
|
||
|
||
/*
|
||
* 获取订单商品可能会使用到的仓库[只获取线上仓库]
|
||
*
|
||
* @param int $order_id
|
||
*
|
||
* @return array
|
||
*/
|
||
function getBranchByOrder($order_id){
|
||
$branch = $this->db->select("SELECT distinct(b.branch_id),b.name,b.uname,b.phone,b.mobile,b.stock_threshold,b.weight,b.branch_bn FROM sdb_ome_branch AS b
|
||
WHERE b.disabled='false' AND b.is_deliv_branch='true' AND b.b_type=1 ORDER BY b.branch_id");
|
||
|
||
|
||
return $branch;
|
||
}
|
||
|
||
/*
|
||
* 生成订单号
|
||
*/
|
||
function gen_id($flag='local') {
|
||
$i = rand(0,9999);
|
||
do{
|
||
if(9999==$i){
|
||
$i=0;
|
||
}
|
||
$i++;
|
||
|
||
$prefix = '';
|
||
if ($flag == 'local'){
|
||
$prefix = 'L';
|
||
}elseif ($flag == 'change'){
|
||
$prefix = 'C';
|
||
}elseif ($flag == 'bufa'){
|
||
$prefix = 'B';
|
||
}elseif($flag){
|
||
$prefix = $flag;
|
||
}
|
||
|
||
$order_bn = $prefix.date('YmdH').'10'.str_pad($i,6,'0',STR_PAD_LEFT);
|
||
|
||
$row = $this->db->selectrow("SELECT order_id from sdb_ome_orders where order_bn='". $order_bn ."'");
|
||
}while($row);
|
||
|
||
return $order_bn;
|
||
}
|
||
|
||
/*
|
||
* 订单确认操作
|
||
*
|
||
* @param bigint $order_id 订单id
|
||
* @param array $ship_info 收货人信息
|
||
*
|
||
* @return bool
|
||
*/
|
||
function confirm($order_id,$is_auto=false){
|
||
if($order=$this->dump($order_id,"*")){
|
||
if($order['confirm']=='Y' || $order['process_status'] == 'cancel'){
|
||
return false;
|
||
}
|
||
}
|
||
|
||
$data['order_id'] = $order_id;
|
||
$data['process_status'] = 'confirmed';
|
||
$data['confirm'] = 'Y';
|
||
|
||
$this->save($data);
|
||
$oOperation_log = $this->app->model('operation_log');
|
||
$opinfo = NULL;
|
||
if ($is_auto) $opinfo = kernel::single('ome_func')->get_system();
|
||
$oOperation_log->write_log('order_confirm@ome',$data['order_id'],"订单确认",NULL,$opinfo);
|
||
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
* 拆分订单,生成发货单
|
||
*
|
||
* @param bigint $order_id
|
||
*/
|
||
function mkDelivery($order_id,$delivery_info){
|
||
$oDelivery = $this->app->model("delivery");
|
||
$dly_orderObj = $this->app->model("delivery_order");
|
||
$delivery_itemObj = $this->app->model("delivery_items");
|
||
$order_itemObj = $this->app->model("order_items");
|
||
if(is_array($delivery_info) && count($delivery_info)>0){
|
||
$ids = array();
|
||
foreach($delivery_info as $delivery){
|
||
$tmp_items = $delivery['order_items'];
|
||
unset($delivery['order_items']);
|
||
$ids[] = $oDelivery->addDelivery($order_id,$delivery,array(),$tmp_items);
|
||
}
|
||
//根据orderid找到delivery
|
||
$dly_orderdata = $dly_orderObj->getList("*",array("order_id"=>$order_id));
|
||
$dlyitemcount = 0;
|
||
foreach ($dly_orderdata as $dly_order){
|
||
$sql = "SELECT SUM(di.number) AS 'total' FROM sdb_ome_delivery_items di
|
||
JOIN sdb_ome_delivery d
|
||
ON di.delivery_id=d.delivery_id
|
||
WHERE d.delivery_id ='".$dly_order['delivery_id']."'
|
||
AND d.status != 'back'
|
||
AND d.status != 'cancel'
|
||
AND d.disabled = 'false'
|
||
AND d.is_bind = 'false' AND d.status!='return_back'";
|
||
|
||
$row = $this->db->selectrow($sql);
|
||
$dlyitemcount += empty($row)?0:$row['total'];
|
||
}
|
||
$orderitemcount = 0;
|
||
$orderitems = $order_itemObj->getList("*",array("order_id"=>$order_id));
|
||
foreach ($orderitems as $oneitem){
|
||
if ($oneitem['delete'] == 'false') $orderitemcount += $oneitem['nums'];
|
||
}
|
||
|
||
$data = [
|
||
'splited_num_upset_sql' => 'IF(`splited_num` IS NULL, 1, `splited_num` + 1)',
|
||
];
|
||
//如果delivery_item数量与order_item数量相等,则拆分完,否则部分拆分
|
||
if ($orderitemcount <= $dlyitemcount)
|
||
{
|
||
$data['order_id'] = $order_id;
|
||
$data['process_status'] = 'splited';
|
||
$this->save($data);
|
||
}
|
||
else
|
||
{
|
||
$data['order_id'] = $order_id;
|
||
$data['process_status'] = 'splitting';
|
||
$this->save($data);
|
||
}
|
||
$oOperation_log = $this->app->model('operation_log');
|
||
$oOperation_log->write_log('order_split@ome',$data['order_id'],"订单拆分");
|
||
return $ids;
|
||
}
|
||
}
|
||
|
||
/*
|
||
* 快速查找订单信息
|
||
*/
|
||
|
||
public function getOrders($name=null)
|
||
{
|
||
$sql = " SELECT order_id,order_bn FROM `sdb_ome_orders`
|
||
WHERE ship_status = '1' and order_bn regexp '".$name."'";
|
||
$data = $this->db->select($sql);
|
||
$result = array();
|
||
if ($data)
|
||
foreach ($data as $v){
|
||
$result[] = $v;
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
|
||
/*根据过滤条件查询数据*/
|
||
function getOrderId($finderResult){
|
||
$where = $finderResult? $this->_filter($finderResult):'order_id in ('.implode(',',$finderResult['order_id']).')';
|
||
$sql = 'select order_id from sdb_ome_orders where '.$where;
|
||
return $this->db->select($sql);
|
||
}
|
||
|
||
/*
|
||
* 订单详情查询
|
||
* @param order_bn string
|
||
* @return array
|
||
*/
|
||
function getOrderBybn($filter=null, $cols='*', $lim=0, $limit=1){
|
||
$sql = 'select '.$cols.' FROM `sdb_ome_orders` ';
|
||
$whereSql = '';
|
||
$limitSql = '';
|
||
if ($filter) $whereSql .= " WHERE ".$filter;
|
||
$limitSql .= " limit $lim,$limit ";
|
||
$rows = $this->db->select($sql . $whereSql . $limitSql);
|
||
|
||
$selectField = " SELECT count(*) as counts FROM (".$sql.$whereSql.") c";
|
||
$count = $this->db->select($selectField);
|
||
$rows['count'] = $count[0]['counts'];
|
||
|
||
return $rows;
|
||
}
|
||
|
||
/*
|
||
* 获取订单上下条
|
||
* getOrderUpNext
|
||
*/
|
||
function getOrderUpNext($id=null,$filter=null, $type='>'){
|
||
if (!$id) return;
|
||
$sql = "SELECT order_id,order_bn FROM `sdb_ome_orders` WHERE order_id $type '$id' ";
|
||
$sql .= $filter;
|
||
if ($type=='<') $desc = "desc";
|
||
$sql .= " ORDER BY order_id $desc ";
|
||
$tmp = $this->db->selectRow($sql);
|
||
return $tmp;
|
||
}
|
||
|
||
/* create_order 订单创建
|
||
* @param sdf $sdf
|
||
* @return sdf
|
||
*/
|
||
function create_order(&$sdf, &$msg = ''){
|
||
//订单创建基础处理Lib
|
||
$res = kernel::single('ome_order')->create_order($sdf, $msg);
|
||
if(!$res){
|
||
return false;
|
||
}
|
||
|
||
//brush特殊订单、补发订单,不需要后续功能
|
||
if(in_array($sdf['shop_type'], array('brsh', 'bufa'))){
|
||
return true;
|
||
}
|
||
|
||
$objRetrial = kernel::single('ome_order_retrial');
|
||
list($rs, $msg) = $objRetrial->checkMonitorAbnormal($sdf);
|
||
if($rs) {
|
||
$objRetrial->monitorAbnormal($sdf['order_id'], $msg);
|
||
}
|
||
|
||
//保存订单发票信息
|
||
if(app::get('invoice')->is_installed()){
|
||
kernel::single('ome_order_invoice')->insertInvoice($sdf);
|
||
}
|
||
|
||
kernel::single('omeauto_auto_hold')->process($sdf['order_id']);
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 将前端店铺过来的货品规格属性值序列化
|
||
* @access public
|
||
* @param array $productattr 货品属性值
|
||
* @return serialize 货品属性值
|
||
*/
|
||
public function _format_productattr($productattr='',$product_id='',$original_str=''){
|
||
if (!is_array($productattr) || empty($productattr)){
|
||
$oSpecvalue = $this->app->model('spec_values');
|
||
$oSpec = $this->app->model('specification');
|
||
/*
|
||
$oProducts = $this->app->model('products');//已不会调用该表和这段代码pdts,废弃 xiayuanjun
|
||
$productattr = array();
|
||
$product_info = $oProducts->dump(array('product_id'=>$product_id),"spec_desc");
|
||
$spec_desc = $product_info['spec_desc'];
|
||
if ($spec_desc['spec_value_id'])
|
||
foreach ($spec_desc['spec_value_id'] as $sk=>$sv){
|
||
$tmp = array();
|
||
$specval = $oSpecvalue->dump($sv,"spec_value,spec_id");
|
||
//$tmp['value'] = $specval['spec_value'];
|
||
$tmp['value'] = $spec_desc['spec_value'][$sk];
|
||
$spec = $oSpec->dump($specval['spec_id'],"spec_name");
|
||
$tmp['label'] = $spec['spec_name'];
|
||
$productattr[] = $tmp;
|
||
}
|
||
*/
|
||
}else{
|
||
$productattr[0]['original_str'] = $original_str;//原始商品属性值
|
||
}
|
||
$addon['product_attr'] = $productattr;
|
||
return serialize($addon);
|
||
}
|
||
|
||
|
||
function save(&$data,$mustUpdate = null){
|
||
//外键 先执行save
|
||
$this->_save_parent($data,$mustUpdate);
|
||
$plainData = $this->sdf_to_plain($data);
|
||
if(!$this->db_save($plainData,$mustUpdate )) return false;
|
||
|
||
$order_id = $plainData['order_id'];
|
||
if(isset($data['order_objects'])){
|
||
foreach($data['order_objects'] as $k=>$v){
|
||
if(isset($v['order_items'])){
|
||
foreach($v['order_items'] as $k2=>$item){
|
||
$data['order_objects'][$k]['order_items'][$k2]['order_id'] = $order_id;
|
||
}
|
||
}else{
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
|
||
if( !is_array($this->idColumn) ){
|
||
$data[$this->idColumn] = $plainData[$this->idColumn];
|
||
$this->_save_depends($data,$mustUpdate );
|
||
}
|
||
$plainData = null; //内存用完就放
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* 取消订单
|
||
* @access public
|
||
* @param Number $order_id 订单ID
|
||
* @param String $memo 取消备注
|
||
* @param Bool $is_request 是否询问请求
|
||
* @param string $mode 请求类型:sync同步 async异步
|
||
* @param Bool $must_log 订单收订叫回失败记录日志
|
||
* @return Array
|
||
*/
|
||
function cancel($order_id,$memo,$is_request=true,$mode='sync', $must_log = false){
|
||
$operLogMdl = $this->app->model('operation_log');
|
||
|
||
$rs = array('rsp'=>'fail','msg'=>'');
|
||
|
||
//取消订单的时候先取消发货单
|
||
$result = $this->cancel_delivery($order_id,$must_log);
|
||
if ($result['rsp'] == 'succ') {
|
||
//订单取消 API
|
||
$instance = kernel::service('service.order');
|
||
if($is_request == true && $instance && method_exists($instance, 'update_order_status')){
|
||
$rs = $instance->update_order_status($order_id, 'dead', $memo, $mode);
|
||
}
|
||
|
||
//异步默认状态先置为成功
|
||
if($mode == 'async'){
|
||
$rs['rsp'] = 'succ';
|
||
}
|
||
$rs['rsp'] = ($rs['rsp'] == 'succ')?'success':'fail';
|
||
|
||
//dispose
|
||
if ($mode == 'async' || $rs['rsp'] == 'success'){
|
||
$savedata = array();
|
||
$savedata['process_status'] = 'cancel';
|
||
$savedata['status'] = 'dead';
|
||
$savedata['archive'] = 1;//订单归档
|
||
$savedata['splited_num'] = 0;
|
||
|
||
//update
|
||
$affect_rows = $this->update($savedata, array('order_id'=>$order_id, 'status|noequal'=>'dead'));
|
||
|
||
//没有更新影响行数,不需要释放库存
|
||
//@todo:现在矩阵同分同秒推送退款完成单和更新订单时,会导致并发重复释放库存冻结;
|
||
if(is_bool($affect_rows)){
|
||
//logs
|
||
$memo = '订单已经是取消状态!';
|
||
$operLogMdl->write_log('order_modify@ome', $order_id, $memo);
|
||
|
||
return $rs;
|
||
}else{
|
||
$memo .= '影响行数:'. $affect_rows;
|
||
}
|
||
|
||
//订单取消释放基础物料上的冻结,以及销售物料店铺冻结
|
||
$this->unfreez($order_id);
|
||
|
||
$order = $this->db_dump(['order_id'=>$order_id], 'order_bn,shop_id,order_bool_type,createtime');
|
||
if($order['createtime'] > (time() - 600)) {
|
||
//如果10分钟内取消,则订单需要发起库存回写
|
||
kernel::single('inventorydepth_stock')->storeNeedUpdateSku($order_id, $order['shop_id']);
|
||
}
|
||
|
||
//invoice
|
||
$arr_create_invoice = array(
|
||
'order_id'=>$order_id,
|
||
'source_status' => 'TRADE_CLOSED'
|
||
);
|
||
kernel::single('invoice_order_front_router', 'b2c')->operateTax($arr_create_invoice);
|
||
|
||
//logs
|
||
$operLogMdl->write_log('order_modify@ome',$order_id,$memo);
|
||
}
|
||
}else{
|
||
//取消失败,但有取消成功的情况下重置订单状态为部分拆分
|
||
if($result['succ_num'] > 0){
|
||
$tmp_order = array('order_id'=>$order_id,'confirm'=>'N','process_status'=>'splitting');
|
||
$this->save($tmp_order);
|
||
}
|
||
|
||
kernel::single('ome_order')->resumeOrdStatus(array('order_id'=>$order_id));
|
||
$rs['rsp'] = 'fail';
|
||
$rs['msg']=$result['msg'] ? $result['msg'] : '发货单取消失败';
|
||
}
|
||
|
||
return $rs;
|
||
}
|
||
|
||
function searchOptions(){
|
||
$parentOptions = parent::searchOptions();
|
||
$childOptions = array(
|
||
'product_bn'=>app::get('ome')->_('基础物料编码'),
|
||
'product_barcode'=>app::get('ome')->_('条形码'),
|
||
'sales_material_bn'=>app::get('ome')->_('销售物料编码'),
|
||
'member_uname'=>app::get('ome')->_('用户名'),
|
||
'ship_mobile' =>app::get('ome')->_('联系手机'),
|
||
'ship_tel' =>app::get('ome')->_('联系电话'),
|
||
'logi_no'=>app::get('ome')->_('物流单号')
|
||
);
|
||
|
||
//插入模糊搜订单号
|
||
if($parentOptions){
|
||
$array_1 = array_splice($parentOptions, 0, 1);
|
||
$array_2 = array('head_order_bn'=>'模糊搜订单');
|
||
|
||
$parentOptions = array_merge($array_1, $array_2, $parentOptions);
|
||
|
||
unset($array_1, $array_2);
|
||
}
|
||
|
||
return $Options = array_merge($parentOptions,$childOptions);
|
||
}
|
||
|
||
/*
|
||
* $order_ids id数组
|
||
*/
|
||
function dispatch($data,$filter,$order_ids,$is_auto=false){
|
||
$data['is_auto'] = 'false';//手动分派,改变自动处理标示
|
||
if(empty($data['op_id'])){
|
||
$data['op_id'] = 0;
|
||
}
|
||
$this->update($data,$filter);
|
||
//写日志
|
||
$oOperation_log = $this->app->model('operation_log');
|
||
$oGroup = $this->app->model('groups');
|
||
$oOperator = app::get('desktop')->model('users');
|
||
$memo = "";
|
||
|
||
if($data['group_id']){
|
||
$group = $oGroup->dump(intval($data['group_id']));
|
||
$memo = '订单分派给'.$group['name'];
|
||
|
||
if($data['op_id']){
|
||
$operator = $oOperator->dump(intval($data['op_id']));
|
||
$memo .= '的'.$operator['name'];
|
||
}
|
||
}else{
|
||
$memo = "订单撤销分派";
|
||
}
|
||
|
||
if($order_ids[0] == '_ALL_'){
|
||
$opinfo = NULL;
|
||
if ($is_auto) $opinfo = kernel::single('ome_func')->get_system();
|
||
unset($filter['filter_sql']);
|
||
$oOperation_log->batch_write_log('order_dispatch@ome',$filter,$memo,time(),$opinfo);
|
||
}else{
|
||
foreach($order_ids as $order_id){
|
||
$opinfo = NULL;
|
||
if ($is_auto){
|
||
$opinfo = kernel::single('ome_func')->get_system();
|
||
}
|
||
$oOperation_log->write_log('order_dispatch@ome',$order_id,$memo,NULL,$opinfo);
|
||
}
|
||
}
|
||
|
||
|
||
//创建订单后执行的操作
|
||
if($data['group_id'] && $oServiceOrder = kernel::servicelist('ome_dispatch_after')){
|
||
if($order_ids[0] == '_ALL_'){
|
||
$order_ids = array();
|
||
$rows = $this->getList("order_id",$filter,0,-1);
|
||
foreach($rows as $v){
|
||
$order_ids[] = $v['order_id'];
|
||
}
|
||
}
|
||
foreach($order_ids as $v){
|
||
foreach($oServiceOrder as $object){
|
||
if(method_exists($object,'dispatch_after')){
|
||
$object->dispatch_after($v);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
* 订单退回
|
||
* $order_ids id数组
|
||
*
|
||
*/
|
||
function goback($data,$filter,$remark,$act){
|
||
$this->update($data,$filter);
|
||
//写日志
|
||
$oOperation_log = $this->app->model('operation_log');
|
||
$memo = "";
|
||
$op_name = kernel::single('desktop_user')->get_name();
|
||
$memo = $op_name.$act.',原因:'.$remark;
|
||
$oOperation_log->write_log('order_dispatch@ome',$filter['order_id'],$memo,NULL,NULL);
|
||
return true;
|
||
}
|
||
|
||
function exportTemplate($filter){
|
||
foreach ($this->io_title($filter) as $v){
|
||
$title[] = kernel::single('base_charset')->utf2local($v);
|
||
}
|
||
return $title;
|
||
}
|
||
|
||
function io_title( $filter=null,$ioType='csv' ){
|
||
switch( $ioType ){
|
||
case 'csv':
|
||
default:
|
||
$this->oSchema['csv']['order'] = array(
|
||
'*:订单号' => 'order_bn',
|
||
'*:支付方式' => 'payinfo/pay_name',
|
||
'*:下单时间' => 'createtime',
|
||
'*:付款时间' => 'paytime',
|
||
'*:配送方式' => 'shipping/shipping_name',
|
||
'*:配送费用' => 'shipping/cost_shipping',
|
||
'*:来源店铺编号' => 'shop_id',
|
||
'*:来源店铺' => 'shop_name',
|
||
'*:订单附言' => 'custom_mark',
|
||
'*:收货人姓名' => 'consignee/name',
|
||
'*:收货地址省份' => 'consignee/area/province',
|
||
'*:收货地址城市' => 'consignee/area/city',
|
||
'*:收货地址区/县' => 'consignee/area/county',
|
||
'*:收货详细地址' => 'consignee/addr',
|
||
'*:收货人固定电话' => 'consignee/telephone',
|
||
'*:电子邮箱' => 'consignee/email',
|
||
'*:收货人移动电话' => 'consignee/mobile',
|
||
'*:邮编' => 'consignee/zip',
|
||
'*:货到付款' => 'shipping/is_cod',
|
||
'*:是否开发票' => 'is_tax',
|
||
'*:发票抬头' => 'tax_title',
|
||
'*:发票金额' => 'cost_tax',
|
||
'*:优惠方案' => 'order_pmt',
|
||
'*:订单优惠金额' => 'pmt_order',
|
||
'*:商品优惠金额' => 'pmt_goods',
|
||
'*:折扣' => 'discount',
|
||
'*:返点积分' => 'score_g',
|
||
'*:商品总额' => 'cost_item',
|
||
'*:订单总额' => 'total_amount',
|
||
'*:买家会员名' => 'account/uname',
|
||
'*:来源渠道' => 'order_source', //order_type
|
||
'*:订单备注' => 'mark_text',
|
||
'*:商品重量' =>'weight',
|
||
'*:发票号'=>'tax_no',
|
||
'*:周期购'=>'createway',
|
||
'*:关联订单号'=>'relate_order_bn',
|
||
'*:补发原因' => 'bufa_reason',
|
||
);
|
||
$this->oSchema['csv']['obj'] = array(
|
||
'*:订单号' => '',
|
||
'*:商品货号' => '',
|
||
'*:商品名称' => '',
|
||
'*:购买单位' => '',
|
||
'*:商品规格' => '',
|
||
'*:购买数量' => '',
|
||
'*:商品原价' => '',
|
||
'*:销售价' =>'',
|
||
'*:商品优惠金额' => '',
|
||
'*:商品类型' => '',
|
||
'*:商品品牌' => '',
|
||
);
|
||
break;
|
||
}
|
||
#新增导出字段
|
||
if($this->export_flag){
|
||
$title = array(
|
||
'*:发货状态'=>'ship_status',
|
||
'*:付款状态'=>'pay_status'
|
||
);
|
||
$this->oSchema['csv']['order'] = array_merge($this->oSchema['csv']['order'],$title);
|
||
}
|
||
#导出模板时,将不需要的字段从这里清除
|
||
if(!$this->export_flag){
|
||
unset($this->oSchema['csv']['order']['*:来源店铺']);
|
||
}
|
||
$this->ioTitle[$ioType]['order'] = array_keys( $this->oSchema[$ioType]['order'] );
|
||
$this->ioTitle[$ioType]['obj'] = array_keys( $this->oSchema[$ioType]['obj'] );
|
||
return $this->ioTitle[$ioType][$filter];
|
||
}
|
||
|
||
/**
|
||
* 统计导出数据
|
||
*
|
||
* @param Array $filter 过滤条件
|
||
* @return void
|
||
* @author
|
||
* */
|
||
public function fcount_csv($filter)
|
||
{
|
||
$count = $this->count($filter);
|
||
if ($count < 500 && $count > 0) {
|
||
$orderidList = array();
|
||
|
||
$orderList = $this->getList('order_id',$filter);
|
||
foreach ($orderList as $order) {
|
||
$orderidList[] = $order['order_id'];
|
||
}
|
||
|
||
if ($orderidList) {
|
||
$orderItemModel = app::get('ome')->model('order_items');
|
||
$itemCount = $orderItemModel->count(array('order_id'=>$orderidList));
|
||
|
||
if ($itemCount > 2500) {
|
||
$count = 600;
|
||
}
|
||
}
|
||
}
|
||
|
||
return $count;
|
||
}
|
||
|
||
//csv导出
|
||
function fgetlist_csv( &$data,$filter,$offset,$exportType = 1 ){
|
||
@ini_set('memory_limit','1024M'); set_time_limit(0);
|
||
|
||
$this->export_flag = true;
|
||
$max_offset = 1000; // 最多一次导出10w条记录
|
||
if ($offset>$max_offset) return false;// 限制导出的最大页码数
|
||
|
||
if( !$data['title']['order'] ){
|
||
$title = array();
|
||
foreach( $this->io_title('order') as $k => $v ){
|
||
$title[] = $this->charset->utf2local($v);
|
||
}
|
||
$data['title']['order'] = '"'.implode('","',$title).'"';
|
||
}
|
||
if( !$data['title']['obj'] ){
|
||
$title = array();
|
||
foreach( $this->io_title('obj') as $k => $v )
|
||
$title[] = $this->charset->utf2local($v);
|
||
$data['title']['obj'] = '"'.implode('","',$title).'"';
|
||
}
|
||
$limit = 100;
|
||
|
||
if( !$list=$this->getList('order_id',$filter,$offset*$limit,$limit) )return false;
|
||
foreach( $list as $aFilter ){
|
||
$aOrder = $this->dump($aFilter['order_id']);
|
||
if($aOrder['order_bn']){
|
||
$aOrder['order_bn'] = "=\"\"".$aOrder['order_bn']."\"\"";//"\t".$aOrder['order_bn'];#解决订单号科学计数法的问题
|
||
}
|
||
if( !$aOrder )continue;
|
||
$objects = $this->db->select("SELECT * FROM sdb_ome_order_objects WHERE order_id=".$aFilter['order_id']);
|
||
|
||
if ($objects){
|
||
foreach ($objects as $obj){
|
||
if ($service = kernel::service("ome.service.order.objtype.".strtolower($obj['obj_type']))){
|
||
$item_data = $service->process($obj);
|
||
if ($item_data)
|
||
foreach ($item_data as $itemv){
|
||
$orderObjRow = array();
|
||
$orderObjRow['*:订单号'] = $aOrder['order_bn'];
|
||
$orderObjRow['*:商品货号'] = "\t".$itemv['bn'];
|
||
$orderObjRow['*:商品名称'] = "\t".str_replace("\n"," ",$itemv['name']);
|
||
$orderObjRow['*:购买单位'] = $itemv['unit'];
|
||
$orderObjRow['*:商品规格'] = $itemv['spec_info'] ? str_replace("\n"," ",$itemv['spec_info']):"-";
|
||
$orderObjRow['*:购买数量'] = $itemv['nums'];
|
||
$orderObjRow['*:商品原价'] = $itemv['price'];
|
||
$orderObjRow['*:销售价'] = $itemv['sale_price'] / $itemv['nums'];
|
||
$orderObjRow['*:商品优惠金额'] = $itemv['pmt_price'];
|
||
|
||
$data['content']['obj'][] = $this->charset->utf2local('"'.implode( '","', $orderObjRow ).'"');
|
||
}
|
||
}else {
|
||
$aOrder['order_items'] = $this->db->select("SELECT * FROM sdb_ome_order_items WHERE obj_id=".$obj['obj_id']." AND `delete`='false' AND order_id=".$aFilter['order_id']);
|
||
$aOrder['order_items'] = ome_order_func::add_items_colum($aOrder['order_items']);
|
||
$orderRow = array();
|
||
$orderObjRow = array();
|
||
$k = 0;
|
||
if ($aOrder['order_items'])
|
||
foreach( $aOrder['order_items'] as $itemk => $itemv ){
|
||
$addon = unserialize($itemv['addon']);
|
||
$spec_info = null;
|
||
if(!empty($addon)){
|
||
foreach($addon as $val){
|
||
foreach ($val as $v){
|
||
$spec_info[] = $v['value'];
|
||
}
|
||
}
|
||
}
|
||
$_typeName = $this->getTypeName($itemv['product_id']);
|
||
$orderObjRow = array();
|
||
$orderObjRow['*:订单号'] = $aOrder['order_bn'];
|
||
$orderObjRow['*:商品货号'] = "\t".$itemv['bn'];
|
||
$orderObjRow['*:商品名称'] = "\t".str_replace("\n"," ",$itemv['name']);
|
||
$orderObjRow['*:购买单位'] = $itemv['unit'];
|
||
$orderObjRow['*:商品规格'] = $spec_info?implode('||', $spec_info):'-';//$itemv['spec_info'] ? str_replace("\n"," ",$itemv['spec_info']):"-";
|
||
$orderObjRow['*:购买数量'] = $itemv['nums'];
|
||
$orderObjRow['*:商品原价'] = $itemv['price'];
|
||
$orderObjRow['*:销售价'] = $itemv['sale_price'] / $itemv['nums'];
|
||
$orderObjRow['*:商品优惠金额'] = $itemv['pmt_price'];
|
||
$orderObjRow['*:商品类型'] = $_typeName['type_name'];
|
||
$orderObjRow['*:商品品牌'] = $_typeName['brand_name'];
|
||
|
||
|
||
$data['content']['obj'][] = $this->charset->utf2local('"'.implode( '","', $orderObjRow ).'"');
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//处理地区数据
|
||
$area = explode('/',$aOrder['consignee']['area'] );
|
||
if(strpos($area[0],":")){
|
||
$tmp_province = explode(":",$area[0]);
|
||
$province = $tmp_province[1];
|
||
}else{
|
||
$province = $area[0];
|
||
}
|
||
#付款状态
|
||
switch($aOrder['pay_status']){
|
||
case 0:
|
||
$aOrder['pay_status'] = '未支付';
|
||
break;
|
||
case 1:
|
||
$aOrder['pay_status'] = '已支付';
|
||
break;
|
||
case 2:
|
||
$aOrder['pay_status'] = '处理中';
|
||
break;
|
||
case 3:
|
||
$aOrder['pay_status'] = '部分付款';
|
||
break;
|
||
case 4:
|
||
$aOrder['pay_status'] = '部分退款';
|
||
break;
|
||
case 5:
|
||
$aOrder['pay_status'] = '全额退款';
|
||
break;
|
||
case 6:
|
||
$aOrder['pay_status'] = '退款申请中';
|
||
break;
|
||
case 7:
|
||
$aOrder['pay_status'] = '退款中';
|
||
break;
|
||
case 8:
|
||
$aOrder['pay_status'] = '支付中';
|
||
break;
|
||
}
|
||
#发货状态
|
||
switch($aOrder['ship_status']){
|
||
case 0:
|
||
$aOrder['ship_status'] = '未发货';
|
||
break;
|
||
case 1:
|
||
$aOrder['ship_status'] = '已发货';
|
||
break;
|
||
case 2:
|
||
$aOrder['ship_status'] = '部分发货';
|
||
break;
|
||
case 3:
|
||
$aOrder['ship_status'] = '部分退货';
|
||
break;
|
||
case 4:
|
||
$aOrder['ship_status'] = '已退货';
|
||
break;
|
||
}
|
||
$city = $area[1];
|
||
if(strpos($area[2],":")){
|
||
$tmp_county = explode(":",$area[2]);
|
||
$county = $tmp_county[0];
|
||
}else{
|
||
$county = $area[2];
|
||
}
|
||
$aOrder['consignee']['area'] = array(
|
||
'province' => $province,
|
||
'city' => $city,
|
||
'county' => $county,
|
||
);
|
||
|
||
$tmp_remark = kernel::single('ome_func')->format_memo($aOrder['custom_mark']);
|
||
$tmp = '';
|
||
if ($tmp_remark)
|
||
foreach ($tmp_remark as $v){
|
||
$tmp .= $v['op_content'].'-'.$v['op_time'].'-by-'.$v['op_name'].';';
|
||
}
|
||
$aOrder['custom_mark'] = str_replace("\n"," ",$tmp);
|
||
//订单备注
|
||
$tmp_mark_text = kernel::single('ome_func')->format_memo($aOrder['mark_text']);
|
||
$tmp_mark = '';
|
||
if ($tmp_mark_text) {
|
||
foreach ($tmp_mark_text as $tv) {
|
||
$tmp_mark.=$tv['op_content'].'-'.$tv['op_time'].'-by-'.$tv['op_name'].';';
|
||
}
|
||
}
|
||
$aOrder['mark_text'] = str_replace("\n"," ",$tmp_mark);
|
||
$aOrder['consignee']['addr'] = str_replace("\n"," ",$aOrder['consignee']['addr']);
|
||
//处理店铺信息
|
||
$shop = $this->app->model('shop')->dump($aOrder['shop_id']);
|
||
$aOrder['shop_id'] = $shop['shop_bn'];
|
||
$aOrder['shop_name'] = $shop['name'];
|
||
$aOrder['createtime'] = date('Y-m-d H:i:s',$aOrder['createtime']);
|
||
$aOrder['paytime'] = $aOrder['paytime'] ? date('Y-m-d H:i:s',$aOrder['paytime']) : '尚未付款';
|
||
|
||
$member = $this->app->model('members')->dump($aOrder['member_id']);
|
||
|
||
#订单类型
|
||
$aOrder['order_source'] = ome_order_func::get_order_source($aOrder['order_source']);
|
||
|
||
$aOrder['account']['uname'] = $member['account']['uname'];
|
||
$aOrder['shipping']['is_cod'] = $aOrder['shipping']['is_cod'] == 'true' ? '是':'否';
|
||
$aOrder['is_tax'] = $aOrder['is_tax'] == 'true' ? '是':'否'; #会员邮箱
|
||
$aOrder['consignee']['email'] = $member['contact']['email'];
|
||
//处理订单优惠方案
|
||
$order_pmtObj = $this->app->model('order_pmt');
|
||
$pmt = $order_pmtObj->getList('pmt_describe',array('order_id'=>$aOrder['order_id']));
|
||
foreach($pmt as $k=>$v){
|
||
$pmt_tmp .= $v['pmt_describe'].";";
|
||
}
|
||
$aOrder['order_pmt'] = $pmt_tmp;
|
||
$aOrder['createway'] = '';
|
||
$aOrder['relate_order_bn'] = "=\"\"".$aOrder['relate_order_bn']."\"\"";
|
||
unset($pmt_tmp);
|
||
foreach( $this->oSchema['csv']['order'] as $k => $v ){
|
||
$orderRow[$k] = $this->charset->utf2local(utils::apath( $aOrder,explode('/',$v) ));
|
||
}
|
||
$data['content']['order'][] = '"'.implode('","',$orderRow).'"';
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function export_csv($data,$exportType = 1 ){
|
||
$output = array();
|
||
// if( $exportType == 2 ){
|
||
foreach( $data['title'] as $k => $val ){
|
||
$output[] = $val."\n".implode("\n",(array)$data['content'][$k]);
|
||
}
|
||
// }
|
||
echo implode("\n",$output);
|
||
}
|
||
|
||
function prepared_import_csv(){
|
||
$this->ioObj->cacheTime = time();
|
||
}
|
||
|
||
/**
|
||
* [第三步]最终,导入数据保存
|
||
*
|
||
* @return void
|
||
*/
|
||
function finish_import_csv(){
|
||
header("Content-type: text/html; charset=utf-8");
|
||
|
||
$data = $this->import_data;
|
||
unset($this->import_data);
|
||
|
||
$orderTitle = array_flip( $this->io_title('order') );
|
||
$objTitle = array_flip( $this->io_title('obj') );
|
||
$orderSchema = $this->oSchema['csv']['order'];
|
||
$objSchema =$this->oSchema['csv']['obj'];
|
||
$oQueue = app::get('base')->model('queue');
|
||
$salesMLib = kernel::single('material_sales_material');
|
||
$lib_ome_order = kernel::single('ome_order');
|
||
$fudaiLib = kernel::single('material_fukubukuro_dispatch');
|
||
|
||
$count = 0;
|
||
$limit = 50;
|
||
$page = 0;
|
||
$orderSdfs = array();
|
||
foreach( $data as $ordre_id => $aOrder ){
|
||
$orderSdf = array();
|
||
$orderSdf = $this->ioObj->csv2sdf( $aOrder['order']['contents'][0] ,$orderTitle,$orderSchema );
|
||
$lucky_falg = false;
|
||
|
||
$orderSdf['platform_order_bn'] = $orderSdf['order_bn'];
|
||
|
||
//补发订单
|
||
if($orderSdf['order_source'] == '补发订单'){
|
||
$orderSdf['order_type'] = 'bufa';
|
||
|
||
//获取原订单信息
|
||
$relateOrderInfo = array();
|
||
if($orderSdf['relate_order_bn']){
|
||
$relateOrderInfo = $this->app->model('orders')->dump(array('order_bn'=>$orderSdf['relate_order_bn']), '*');
|
||
|
||
if ($relateOrderInfo['platform_order_bn']) {
|
||
$orderSdf['platform_order_bn'] = $relateOrderInfo['platform_order_bn'];
|
||
}
|
||
|
||
//原订单的省、市、区、镇
|
||
list(, $areaTemp, ) = explode(':', $relateOrderInfo['consignee']['area']);
|
||
$areaTemp = explode('/', $areaTemp);
|
||
|
||
//复制收货人信息
|
||
$orderSdf['consignee']['area']['province'] = $areaTemp[0];
|
||
$orderSdf['consignee']['area']['city'] = $areaTemp[1];
|
||
$orderSdf['consignee']['area']['county'] = $areaTemp[2];
|
||
$orderSdf['consignee']['area']['town'] = $areaTemp[3];
|
||
|
||
$orderSdf['consignee']['mobile'] = $relateOrderInfo['consignee']['mobile'];
|
||
$orderSdf['consignee']['telephone'] = $relateOrderInfo['consignee']['telephone'];
|
||
$orderSdf['consignee']['email'] = $relateOrderInfo['consignee']['email'];
|
||
$orderSdf['consignee']['zip'] = $relateOrderInfo['consignee']['zip'];
|
||
$orderSdf['consignee']['addr'] = $relateOrderInfo['consignee']['addr'];
|
||
$orderSdf['consignee']['name'] = $relateOrderInfo['consignee']['name'];
|
||
}
|
||
|
||
unset($orderSdf['order_source']);
|
||
}
|
||
|
||
//处理店铺信息
|
||
$shop = $this->app->model('shop')->dump(array('shop_bn'=>$orderSdf['shop_id']));
|
||
if(!$shop) continue;
|
||
|
||
$orderObjectItem = 0;
|
||
$salesMLib = kernel::single('material_sales_material');
|
||
$lib_ome_order = kernel::single('ome_order');
|
||
$tostr = [];
|
||
foreach( $aOrder['obj']['contents'] as $k => $v ){
|
||
$salesMInfo = $salesMLib->getSalesMByBn($shop['shop_id'],$v[$objTitle['*:商品货号']]);
|
||
if($salesMInfo){
|
||
if($salesMInfo['sales_material_type'] == 7){
|
||
//福袋组合
|
||
$luckybagParams = $salesMInfo;
|
||
$luckybagParams['sale_material_nums'] = $v[$objTitle['*:购买数量']];
|
||
$luckybagParams['shop_bn'] = $shop['shop_bn'];
|
||
|
||
$fdResult = $fudaiLib->process($luckybagParams);
|
||
if($fdResult['rsp'] == 'succ'){
|
||
$basicMInfos = $fdResult['data'];
|
||
}else{
|
||
//标记福袋分配错误信息
|
||
//$error_msg = '销售物料编码:'. $salesMInfo['sales_material_bn'] .'获取福袋组合失败:'. $fdResult['error_msg'] .'!';
|
||
}
|
||
|
||
$lucky_falg = true;
|
||
|
||
//unset
|
||
unset($luckybagParams, $fdResult);
|
||
}elseif($salesMInfo['sales_material_type'] == 5){ //多选一
|
||
$basicMInfos = $salesMLib->get_order_pickone_bminfo($salesMInfo['sm_id'],$v[$objTitle['*:购买数量']],$shop['shop_id']);
|
||
}else{
|
||
//获取绑定的基础物料
|
||
$basicMInfos = $salesMLib->getBasicMBySalesMId($salesMInfo['sm_id']);
|
||
}
|
||
|
||
//关联基础物料列表
|
||
if($basicMInfos){
|
||
$obj_number = $v[$objTitle['*:购买数量']];
|
||
$product_price = $v[$objTitle['*:商品原价']]; //商品原价
|
||
$obj_sale_price = bcmul($v[$objTitle['*:销售价']], $obj_number, 3); //商品总销售金额
|
||
$total_amount = bcmul($product_price, $obj_number, 3); //商品总金额
|
||
|
||
//商品优惠金额
|
||
$pmt_price = bcsub($total_amount, $obj_sale_price, 3);
|
||
|
||
//如果是促销类销售物料
|
||
if($salesMInfo['sales_material_type'] == 2){ //促销
|
||
$obj_type = $item_type = 'pkg';
|
||
|
||
//item层关联基础物料平摊销售价
|
||
$salesMLib->calProSaleMPriceByRate($obj_sale_price, $basicMInfos);
|
||
|
||
//平摊优惠金额
|
||
$salesMLib->calProPmtPriceByRate($pmt_price, $basicMInfos);
|
||
|
||
//组织订单item明细
|
||
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
|
||
}elseif($salesMInfo['sales_material_type'] == 7){
|
||
//福袋组合
|
||
$obj_type = 'lkb';
|
||
$item_type = 'lkb';
|
||
|
||
//格式化order_items
|
||
$return_arr_info = $lib_ome_order->format_order_items_data($item_type, $obj_number, $basicMInfos);
|
||
|
||
}elseif($salesMInfo['sales_material_type'] == 5){ //多选一
|
||
$obj_type = $item_type = 'pko';
|
||
foreach($basicMInfos as &$var_basic_info){
|
||
$var_basic_info["price"] = $v[$objTitle['*:商品原价']];
|
||
$var_basic_info["sale_price"] = $v[$objTitle['*:销售价']];
|
||
|
||
//商品优惠金额
|
||
$var_basic_info['pmt_price'] = $pmt_price;
|
||
}
|
||
unset($var_basic_info);
|
||
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
|
||
}else{ //普通、赠品
|
||
$obj_type = ($salesMInfo['sales_material_type'] == 1) ? 'goods' : ($salesMInfo['sales_material_type'] == 6 ? 'giftpackage' : 'gift');
|
||
$item_type = ($obj_type == 'goods') ? 'product' : $obj_type;
|
||
if($obj_type == 'gift'){
|
||
$v[$objTitle['*:商品原价']] = 0.00;
|
||
$v[$objTitle['*:销售价']] = 0.00;
|
||
}
|
||
foreach($basicMInfos as &$var_basic_info){
|
||
$var_basic_info["price"] = $v[$objTitle['*:商品原价']];
|
||
$var_basic_info["sale_price"] = $v[$objTitle['*:销售价']];
|
||
|
||
//商品优惠金额
|
||
$var_basic_info['pmt_price'] = $pmt_price;
|
||
}
|
||
unset($var_basic_info);
|
||
|
||
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
|
||
}
|
||
|
||
$orderSdf['order_objects'][] = array(
|
||
'obj_type' => $obj_type,
|
||
'obj_alias' => $obj_type,
|
||
'goods_id' => $salesMInfo['sm_id'],
|
||
'bn' => $salesMInfo['sales_material_bn'],
|
||
'name' => $v[$objTitle['*:商品名称']],
|
||
'price' => $product_price,
|
||
'sale_price' => $obj_sale_price,
|
||
'amount' => $total_amount,
|
||
'quantity' => $obj_number,
|
||
'pmt_price' => $pmt_price,
|
||
'order_items' => $return_arr_info["order_items"],
|
||
);
|
||
unset($order_items);
|
||
$toStrItem = [
|
||
'name' => $v[$objTitle['*:商品名称']],
|
||
'num' => $obj_number
|
||
];
|
||
$tostr[] = $toStrItem;
|
||
}
|
||
}
|
||
}
|
||
|
||
$orderSdf["weight"] = $return_arr_info["weight"]; //商品重量
|
||
$is_code = strtolower($orderSdf['shipping']['is_cod']);
|
||
#检测货到付款
|
||
if( ($is_code == '是') || ($is_code == 'true')){
|
||
$is_code = 'true';
|
||
}else{
|
||
$is_code = 'false';
|
||
}
|
||
$is_tax = strtolower($orderSdf['is_tax']);
|
||
#检测货到付款
|
||
if( ($is_tax == '是') || ($is_tax == 'true')){
|
||
$is_tax = 'true';
|
||
}else{
|
||
$is_tax = 'false';
|
||
}
|
||
$createway = strtolower($orderSdf['createway']);
|
||
#检测货到付款
|
||
if( ($createway == '是') || ($createway == 'true')){
|
||
$createway = 'matrix';
|
||
}else{
|
||
$createway = 'import';
|
||
}
|
||
|
||
$orderSdf['shop_id'] = $shop['shop_id'];
|
||
$orderSdf['shop_type'] = $shop['shop_type'];
|
||
//临时变量province city county
|
||
$orderSdf_province = $this->import_area_char_filter($orderSdf['consignee']['area']['province']);
|
||
$orderSdf_city = $this->import_area_char_filter($orderSdf['consignee']['area']['city']);
|
||
$orderSdf_county = $this->import_area_char_filter($orderSdf['consignee']['area']['county']);
|
||
|
||
//防止excel导入的时间格式不正确,年份大于1年后的时间
|
||
$createtime = ($orderSdf['createtime'] ? strtotime($orderSdf['createtime']) : time());
|
||
if($createtime > (time() + 31536000)){
|
||
$createtime = time();
|
||
}
|
||
|
||
$paytime = ($orderSdf['paytime'] ? strtotime($orderSdf['paytime']) : time());
|
||
if($paytime > (time() + 31536000)){
|
||
$paytime = time();
|
||
}
|
||
|
||
//导入未填写下单时间,直接使用当时日期
|
||
$orderSdf['createtime'] = $createtime;
|
||
$orderSdf['paytime'] = $paytime;
|
||
$orderSdf['consignee']['area'] = $orderSdf_province."/".$orderSdf_city."/".$orderSdf_county;
|
||
$orderSdf['consignee']['mobile'] = trim($orderSdf['consignee']['mobile']);
|
||
$orderSdf['shipping']['is_cod'] = $is_code; //$orderSdf['shipping']['is_cod']?strtolower($orderSdf['shipping']['is_cod']):'false';
|
||
$orderSdf['shipping']['cost_shipping'] = $orderSdf['shipping']['cost_shipping'] ? $orderSdf['shipping']['cost_shipping'] : '0';
|
||
$orderSdf['is_tax'] = $is_tax;
|
||
$orderSdf['cost_tax'] = $orderSdf['cost_tax'] ? $orderSdf['cost_tax'] : '0';
|
||
$orderSdf['discount'] = $orderSdf['discount'] ? $orderSdf['discount'] : '0';
|
||
$orderSdf['score_g'] = $orderSdf['score_g'] ? $orderSdf['score_g'] : '0';
|
||
$orderSdf['cost_item'] = $orderSdf['cost_item'] ? $orderSdf['cost_item'] : '0';
|
||
$orderSdf['total_amount'] = $orderSdf['total_amount'] ? $orderSdf['total_amount'] : '0';
|
||
$orderSdf['pmt_order'] = $orderSdf['pmt_order'] ? $orderSdf['pmt_order'] : '0';
|
||
$orderSdf['pmt_goods'] = $orderSdf['pmt_goods'] ? $orderSdf['pmt_goods'] : '0';
|
||
|
||
//过滤金额中的逗号(当csv金额大于1000时会自动加入,逗号)
|
||
$orderSdf['cost_item'] = $this->replace_import_price($orderSdf['cost_item']);
|
||
$orderSdf['total_amount'] = $this->replace_import_price($orderSdf['total_amount']);
|
||
$orderSdf['pmt_order'] = $this->replace_import_price($orderSdf['pmt_order']);
|
||
|
||
//source
|
||
$tmp_order_source = ome_order_func::get_order_source();
|
||
$tmp_order_source = array_flip($tmp_order_source);
|
||
$ome_order_source = $tmp_order_source[$orderSdf['order_source']] ?: $orderSdf['order_source'];
|
||
$orderSdf['order_source'] = $ome_order_source ?: 'direct';
|
||
$orderSdf['custom_mark'] = kernel::single('ome_func')->append_memo($orderSdf['custom_mark']);
|
||
$orderSdf['mark_text'] = kernel::single('ome_func')->append_memo($orderSdf['mark_text']);
|
||
$orderSdf['createway'] = $createway;
|
||
$orderSdf['source'] = 'local';
|
||
//增加会员判断逻辑
|
||
|
||
$memberObj = app::get('ome')->model('members');
|
||
$tmp_member_name = trim($orderSdf['account']['uname']);
|
||
$memberInfo = $memberObj->dump(array('uname'=>$tmp_member_name),'member_id');
|
||
if($memberInfo){
|
||
$orderSdf['member_id'] = $memberInfo['member_id'];
|
||
}else{
|
||
$members_data = array(
|
||
'uname' => $tmp_member_name,
|
||
'name' => $tmp_member_name,
|
||
'shop_type' => $shop['shop_type'],
|
||
'area_state'=> $orderSdf_province,
|
||
'area_city' => $orderSdf_city,
|
||
'area_district'=> $orderSdf_county,
|
||
'shop_id' => $shop['shop_id'],
|
||
'addr' => $orderSdf['consignee']['addr'],
|
||
'tel' => $orderSdf['consignee']['telephone'],
|
||
'mobile' => $orderSdf['consignee']['mobile'],
|
||
'email' => $orderSdf['consignee']['email'],
|
||
'zip' => $orderSdf['consignee']['zip'],
|
||
);
|
||
$orderSdf['member_id'] = kernel::single('ome_member_func')->save($members_data,$shop['shop_id']);
|
||
}
|
||
$orderSdf['title'] = json_encode($tostr, JSON_UNESCAPED_UNICODE);
|
||
|
||
//福袋标记
|
||
if($lucky_falg){
|
||
$orderSdf['lucky_falg'] = true;
|
||
}
|
||
|
||
if($count < $limit){
|
||
$count ++;
|
||
}else{
|
||
$count = 0;
|
||
$page ++;
|
||
}
|
||
|
||
$orderSdfs[$page][] = $orderSdf;
|
||
}
|
||
|
||
//使用队列创建订单
|
||
foreach($orderSdfs as $v){
|
||
$queueData = array(
|
||
'queue_title'=>'订单导入',
|
||
'start_time'=>time(),
|
||
'params'=>array(
|
||
'sdfdata'=>$v,
|
||
'app' => 'ome',
|
||
'mdl' => 'orders'
|
||
),
|
||
'worker'=>'ome_order_import.run',
|
||
);
|
||
$oQueue->save($queueData);
|
||
}
|
||
app::get('base')->model('queue')->flush();
|
||
}
|
||
|
||
/**
|
||
* [第一步]整理导入的数据
|
||
*
|
||
* @param $row
|
||
* @param $title
|
||
* @param $tmpl
|
||
* @param $mark
|
||
* @param $newObjFlag
|
||
* @param $msg
|
||
* @return bool|int[]|string[]
|
||
*/
|
||
function prepared_import_csv_row($row,$title,&$tmpl,&$mark,&$newObjFlag,&$msg){
|
||
$this->has_products = 0;
|
||
//定义一个商品货号状态,为的是区别商品明细是否有值(2011_12_21_luolongjie)
|
||
$shopModel = app::get('ome')->model('shop');
|
||
|
||
$mark = 'contents';
|
||
$fileData = $this->import_data;
|
||
|
||
if( !$fileData )
|
||
$fileData = array();
|
||
|
||
//去除标题行BOM头(例如:'<feff>*:订单号')
|
||
$row[0] = trim($row[0], "\xEF\xBB\xBF");
|
||
|
||
if( substr($row[0],0,1) == '*' ){
|
||
$titleRs = array_flip($row);
|
||
|
||
$mark = 'title';
|
||
|
||
return $titleRs;
|
||
}else{
|
||
if( $row[0] ){
|
||
$row[0] = trim($row[0]);
|
||
if(is_array($title) && array_key_exists( '*:商品货号',$title ) ) {
|
||
$product_status = true;
|
||
$salesMLib = kernel::single('material_sales_material');
|
||
$shop = $shopModel->getList('shop_id',array('shop_bn'=>$this->import_data[$row[0]]['order']['contents'][0][6]),0,1);
|
||
$salesMInfo = $salesMLib->getSalesMByBn($shop[0]['shop_id'],$row[1]);
|
||
if($salesMInfo){
|
||
if($salesMInfo['sales_material_type'] == 4){ //福袋
|
||
$basicMInfos = $salesMLib->get_order_luckybag_bminfo($salesMInfo['sm_id']);
|
||
}else if($salesMInfo['sales_material_type'] == 5){ //多选一
|
||
$basicMInfos = $salesMLib->get_order_pickone_bminfo($salesMInfo['sm_id'],"1",$shop[0]['shop_id']);
|
||
}else{
|
||
//获取绑定的基础物料
|
||
$basicMInfos = $salesMLib->getBasicMBySalesMId($salesMInfo['sm_id']);
|
||
}
|
||
if(!$basicMInfos){
|
||
$product_status = false;
|
||
}
|
||
}else{
|
||
$product_status = false;
|
||
}
|
||
|
||
if ($product_status==false) $this->not_exist_product_bn = isset($this->not_exist_product_bn)?array_merge($this->not_exist_product_bn,array($row[1])):array($row[1]);
|
||
|
||
|
||
if(!is_numeric($row[5]) || $row[5] < 1){
|
||
|
||
$this->not_num_zero = isset($this->not_num_zero)?array_merge($this->not_num_zero,array($row[1])):array($row[1]);
|
||
|
||
}
|
||
|
||
//说明商品明细有过值,并非为空(2011_12_21_luolongjie)
|
||
$this->has_products = 1;
|
||
$fileData[$row[0]]['obj']['contents'][] = $row;
|
||
}else{
|
||
//计数判断,是否超过10000条记录,超过就提示数据过多
|
||
if(isset($this->order_nums)){
|
||
kernel::log($this->order_nums);
|
||
$this->order_nums ++;
|
||
if($this->order_nums > 5000){
|
||
unset($this->import_data);
|
||
$msg['error'] = "导入的数据量过大,请减少到5000单以下!";
|
||
return false;
|
||
}
|
||
}else{
|
||
$this->order_nums = 0;
|
||
}
|
||
|
||
if(isset($fileData[$row[0]])){
|
||
$this->duplicate_order_bn_in_file = isset($this->duplicate_order_bn_in_file)?array_merge($this->duplicate_order_bn_in_file,array($row[0])):array($row[0]);
|
||
}
|
||
if($this->dump(array('order_bn'=>$row[0]))){
|
||
$this->duplicate_order_bn_in_db = isset($this->duplicate_order_bn_in_db)?array_merge($this->duplicate_order_bn_in_db,array($row[0])):array($row[0]);
|
||
}
|
||
|
||
if(empty($row[6])){
|
||
unset($this->import_data);
|
||
$msg['error'] = "来源店铺编号不能为空";
|
||
return false;
|
||
}
|
||
|
||
//补发订单,不用判断收货人信息
|
||
//@todo:保存前会自动获取原订单的收货人信息;
|
||
if($row[29] != '补发订单'){
|
||
//check
|
||
if(empty($row[13]) && empty($row[15])){
|
||
unset($this->import_data);
|
||
$msg['error'] = '收货人移动电话/收货人固定电话不能同时为空';
|
||
return false;
|
||
}
|
||
|
||
//$preg_phone='/^[\d]+$/i';
|
||
$preg_phone = '/^[\d-]{8,16}$/i'; //支持虚拟号
|
||
if($row[15] && !preg_match($preg_phone, $row[15])){
|
||
unset($this->import_data);
|
||
$msg['error'] = '收货人移动电话格式不正确('. $row[15] .')';
|
||
return false;
|
||
}
|
||
|
||
if(empty($row[9]) && empty($row[10]) && empty($row[11])){
|
||
$msg['error'] = '收货地址省、市、区/县不能为空';
|
||
return false;
|
||
}
|
||
|
||
} else {
|
||
//关联订单号
|
||
if(empty($row[34])){
|
||
unset($this->import_data);
|
||
$msg['error'] = '补发订单关联单号不能为空';
|
||
return false;
|
||
}
|
||
//原平台订单
|
||
$originalInfo = app::get('ome')->model('orders')->dump(array('order_bn'=>$row[34]), 'order_id,order_bn,createway,relate_order_bn');
|
||
if(empty($originalInfo)){
|
||
unset($this->import_data);
|
||
$msg['error'] = '关联订单不存在';
|
||
return false;
|
||
}
|
||
|
||
// 补发原因
|
||
if(empty($row[35])){
|
||
unset($this->import_data);
|
||
$msg['error'] = '补发原因不能为空';
|
||
return false;
|
||
}
|
||
}
|
||
|
||
//shop
|
||
$shop = $shopModel->getList('shop_bn',array('shop_bn'=>$row[6]),0,1);
|
||
if (!$shop) {
|
||
unset($this->import_data);
|
||
$msg['error'] = "来源店铺【".$row[6]."】不存在";
|
||
return false;
|
||
}
|
||
|
||
$area = $row[9] . '/' . $row[10] . '/' . $row[11];
|
||
list($res, $err_msg) = kernel::single('eccommon_regions')->checkRegion($area);
|
||
if (!$res) {
|
||
$msg['error'] = sprintf("收货地址【%s】不在地址库!", $err_msg);
|
||
return false;
|
||
}
|
||
|
||
$fileData[$row[0]]['order']['contents'][] = $row;
|
||
}
|
||
|
||
$this->import_data = $fileData;
|
||
}
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/**
|
||
* [第二步]检查导入的订单商品明细
|
||
*
|
||
* @param $data
|
||
* @param $mark
|
||
* @param $tmpl
|
||
* @param $msg
|
||
* @return bool
|
||
*/
|
||
function prepared_import_csv_obj($data,$mark,$tmpl,&$msg = ''){
|
||
$error_msg = array();
|
||
//当商品没有货号时候,停止导入(有其他商品明细,却没货号,或者货号不对)
|
||
if(isset($this->not_exist_product_bn)){
|
||
if(count($this->not_exist_product_bn) > 10){
|
||
for($i=0;$i<10;$i++){
|
||
$not_exist_product_bn[] = current($this->not_exist_product_bn);
|
||
next($this->not_exist_product_bn);
|
||
}
|
||
$more = "...";
|
||
}else{
|
||
$not_exist_product_bn = $this->not_exist_product_bn;
|
||
$more = "";
|
||
}
|
||
$error_msg[] = "不存在的销售物料或没绑定:".implode(",",$not_exist_product_bn).$more;
|
||
}elseif($this->has_products == 0){ //没有任何商品明细的时候
|
||
$error_msg[] = "缺少商品明细";
|
||
}elseif($this->not_num_zero){
|
||
if(count($this->not_num_zero)>10){
|
||
for($i=0;$i<10;$i++){
|
||
$not_num_zero[] = current($this->not_num_zero);
|
||
next($this->not_num_zero);
|
||
}
|
||
$more = "...";
|
||
}else{
|
||
$not_num_zero = $this->not_num_zero;
|
||
$more = '';
|
||
}
|
||
$error_msg[] = "购买数量小于0:".implode(",",$not_num_zero).$more;
|
||
}
|
||
|
||
if(isset($this->duplicate_order_bn_in_file)){
|
||
if(count($this->duplicate_order_bn_in_file) > 10){
|
||
for($i=0;$i<10;$i++){
|
||
$duplicate_order_bn_in_file[] = current($this->duplicate_order_bn_in_file);
|
||
next($this->duplicate_order_bn_in_file);
|
||
}
|
||
$more = "...";
|
||
}else{
|
||
$more = "";
|
||
}
|
||
$error_msg[] = "文件中以下订单号重复:".implode(",",$this->duplicate_order_bn_in_file).$more;
|
||
}
|
||
if(isset($this->duplicate_order_bn_in_db)){
|
||
if(count($this->duplicate_order_bn_in_db) > 10){
|
||
for($i=0;$i<10;$i++){
|
||
$duplicate_order_bn_in_db[] = current($this->duplicate_order_bn_in_db);
|
||
next($this->duplicate_order_bn_in_db);
|
||
}
|
||
$more = "...";
|
||
}else{
|
||
$more = "";
|
||
}
|
||
$error_msg[] = "以下订单号在系统中已经存在:".implode(",",$this->duplicate_order_bn_in_db).$more;
|
||
}
|
||
|
||
foreach ($this->import_data as $key =>$row) {
|
||
$item_amount = $item_pmt_price = $item_devide_order_fee = 0;
|
||
if(empty($row['order']['contents'])) {
|
||
$error_msg[] = sprintf('[%s]没有主信息',$key);
|
||
continue;
|
||
}
|
||
$order_row = current($row['order']['contents']);
|
||
$obj_row = $row['obj']['contents'];
|
||
foreach ($obj_row as $obj_key => $obj_val) {
|
||
//行原价小计
|
||
$item_amount_tmp = (float)$obj_val[6] * (float)$obj_val[5];
|
||
$item_amount += $item_amount_tmp;
|
||
//行商品优惠
|
||
$item_pmt_price_tmp = $item_amount_tmp - ((float)$obj_val[7] * (float)$obj_val[5]);
|
||
$item_pmt_price += $item_pmt_price_tmp;
|
||
}
|
||
// 检查金额
|
||
$cost_item = $item_amount;
|
||
$cost_freight = $order_row[5];
|
||
$cost_tax = 0;
|
||
$discount = $order_row[24];
|
||
$pmt_order = $order_row[22];
|
||
$pmt_goods = $item_pmt_price;
|
||
$total_amount = (float)$cost_item + (float)$cost_freight + (float)$cost_tax - (float)$discount - (float)$pmt_order - (float)$pmt_goods;
|
||
if (bccomp((float)$order_row[26], round($cost_item,2), 2) !== 0) {
|
||
$error_msg[] = sprintf('商品总额[%s]明细与订单行商品行[%s]不一致',$cost_item,$order_row[26]);
|
||
}
|
||
if (bccomp((float)$order_row[27], round($total_amount,2), 2) !== 0) {
|
||
$error_msg[] = sprintf('订单总额[%s](商品总额[%s]+配送费用[%s]+税金[%s]-折扣[%s]-订单优惠[%s]-商品优惠[%s])不对',$order_row[27],$cost_item,$cost_freight,$cost_tax,$discount,$pmt_order,$pmt_goods);
|
||
}
|
||
}
|
||
if(!empty($error_msg)){
|
||
unset($this->import_data);
|
||
$msg['error'] = implode(" ",$error_msg);
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
function counter_dispatch($filter=null){
|
||
$table_name = app::get('ome')->model('orders')->table_name(1);
|
||
$strWhere = '';
|
||
|
||
$sql = 'SELECT count(*) as _count FROM `'.$this->table_name(1).'` WHERE '.$this->_filter($filter) . $strWhere;
|
||
$row = $this->db->select($sql);
|
||
|
||
return intval($row[0]['_count']);
|
||
}
|
||
|
||
function countAbnormal($filter=null){
|
||
$abnormal_table_name = app::get('ome')->model('abnormal')->table_name(1);
|
||
$strWhere = '';
|
||
if(isset($filter['abnormal_type_id'])){
|
||
$strWhere = ' AND '.$abnormal_table_name.'.abnormal_type_id ='.$filter['abnormal_type_id'];
|
||
}
|
||
|
||
$row = $this->db->select('SELECT count(*) as _count FROM `'.$this->table_name(1).'` LEFT JOIN '.$abnormal_table_name.' ON '.$this->table_name(1).'.order_id = '.$abnormal_table_name.'.order_id WHERE '.$this->_abnormalFilter($filter,$this->table_name(1)) . $strWhere);
|
||
|
||
return intval($row[0]['_count']);
|
||
}
|
||
|
||
function getlistAbnormal($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null){
|
||
if(!$cols){
|
||
$cols = $this->defaultCols;
|
||
}
|
||
if(!empty($this->appendCols)){
|
||
$cols.=','.$this->appendCols;
|
||
}
|
||
if($this->use_meta){
|
||
$meta_info = $this->prepare_select($cols);
|
||
}
|
||
|
||
$abnormal_table_name = app::get('ome')->model('abnormal')->table_name(1);
|
||
$strWhere = '';
|
||
if(isset($filter['abnormal_type_id'])){
|
||
$strWhere = ' AND '.$abnormal_table_name.'.abnormal_type_id ='.$filter['abnormal_type_id'];
|
||
}
|
||
|
||
$this->defaultOrder[0] = $this->table_name(true).'.createtime';
|
||
$tmpCols = array();
|
||
foreach(explode(',',$cols) as $col){
|
||
if(strpos($col, 'as column')){
|
||
$tmpCols[] = $col;
|
||
}else{
|
||
$tmpCols[] = $this->table_name(true).'.'.$col;
|
||
}
|
||
}
|
||
$cols = implode(',',$tmpCols);
|
||
unset($tmpCols);
|
||
|
||
$orderType = $orderType?$orderType:$this->defaultOrder;
|
||
$sql = 'SELECT '.$cols.' FROM `'.$this->table_name(true).'` LEFT JOIN '.$abnormal_table_name.' ON '.$this->table_name(1).'.order_id = '.$abnormal_table_name.'.order_id WHERE '.$this->_abnormalFilter($filter,$this->table_name(1)) . $strWhere;
|
||
|
||
if($orderType)$sql.=' ORDER BY '.(is_array($orderType)?implode(' ', $orderType):$orderType);
|
||
|
||
$data = $this->db->selectLimit($sql,$limit,$offset);
|
||
|
||
foreach ((array) $data as $key => $value) {
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($value[$field])) {
|
||
$data[$key][$field] = (string) kernel::single('ome_security_factory')->decryptPublic($value[$field],$type);
|
||
}
|
||
}
|
||
}
|
||
|
||
$this->tidy_data($data, $cols);
|
||
if($this->use_meta && count($meta_info['metacols']) && $data){
|
||
foreach($meta_info['metacols'] as $col){
|
||
$obj_meta = new dbeav_meta($this->table_name(true),$col,$meta_info['has_pk']);
|
||
$obj_meta->select($data);
|
||
}
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
function getColumns(){
|
||
$columns = array();
|
||
foreach( $this->_columns() as $k=>$v ){
|
||
$columns[] = $k;
|
||
}
|
||
|
||
return $columns;
|
||
}
|
||
|
||
|
||
/**如果是订单编辑,保存订单的原始数据
|
||
* @param int $log_id
|
||
*/
|
||
function write_log_detail($log_id,$detail){
|
||
$ooObj = $this->app->model('operations_order');
|
||
$data = array(
|
||
'log_id'=>$log_id,
|
||
'order_id' => $detail['order_id'],
|
||
'order_detail' =>$detail,
|
||
);
|
||
|
||
$ooObj->save($data);
|
||
}
|
||
|
||
/**
|
||
* 读取订单编辑前的详情
|
||
*/
|
||
function read_log_detail($order_id,$log_id){
|
||
$ooObj = $this->app->model('operations_order');
|
||
$sObj = $this->app->model('shop');
|
||
$oodetail = $ooObj->dump(array('order_id'=>$order_id,'log_id'=>$log_id),'*');
|
||
|
||
$detail = unserialize($oodetail['order_detail']);
|
||
|
||
$oodetail['order_detail'] = $detail;
|
||
foreach($detail['order_objects'] as $key=>$value){
|
||
foreach($value['order_items'] as $k=>$v){
|
||
$addon[$key][$k] = unserialize($v['addon']);
|
||
$add[$key][$k] = '';
|
||
// 检查 $addon[$key][$k] 是否为数组且包含 'product_attr' 键
|
||
if (is_array($addon[$key][$k]) && isset($addon[$key][$k]['product_attr'])) {
|
||
foreach((array)$addon[$key][$k]['product_attr'] as $vl){
|
||
if (!is_array($vl)) {
|
||
continue;
|
||
}
|
||
$add[$key][$k] .= $vl['label'].":".$vl['value'].";";
|
||
}
|
||
}
|
||
$detail['order_objects'][$key]['order_items'][$k]['addon'] = $add[$key][$k];
|
||
$detail['order_objects'][$key]['order_items'][$k]['quantity'] = $v['quantity'] ? $v['quantity'] : $v['nums'];
|
||
|
||
}
|
||
}
|
||
|
||
//发货人信息
|
||
if(empty($detail['consigner']['name'])){
|
||
$shop_info = $sObj->getList('*',array('shop_id'=>$detail['shop_id']));
|
||
$shop_info = $shop_info[0];
|
||
$detail['consigner']['name'] = $shop_info['default_sender'];
|
||
$detail['consigner']['area'] = $shop_info['area'];
|
||
$detail['consigner']['addr'] = $shop_info['addr'];
|
||
$detail['consigner']['zip'] = $shop_info['zip'];
|
||
$detail['consigner']['email'] = $shop_info['email'];
|
||
$detail['consigner']['tel'] = $shop_info['tel'];
|
||
}
|
||
if($detail['shop_type'] == 'shopex_b2b'){
|
||
//代销人信息
|
||
$osaObj = app::get('ome')->model('order_selling_agent');
|
||
$agent = $osaObj->dump(array('order_id'=>$detail['order_id']),'*');
|
||
$detail['agent'] = $agent;
|
||
}
|
||
//买家留言
|
||
$custom_mark = unserialize($detail['custom_mark']);
|
||
if ($custom_mark){
|
||
foreach ($custom_mark as $k=>$v){
|
||
$custom_mark[$k] = $v;
|
||
if (!strstr($v['op_time'], "-")){
|
||
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
|
||
$custom_mark[$k]['op_time'] = $v['op_time'];
|
||
}
|
||
}
|
||
}
|
||
|
||
//订单备注
|
||
$mark_text = unserialize($detail['mark_text']);
|
||
if ($mark_text)
|
||
foreach ($mark_text as $k=>$v){
|
||
$mark_text[$k] = $v;
|
||
if (!strstr($v['op_time'], "-")){
|
||
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
|
||
$mark_text[$k]['op_time'] = $v['op_time'];
|
||
}
|
||
}
|
||
$detail['mark_type_arr'] = ome_order_func::order_mark_type();//订单备注旗标
|
||
|
||
$detail['custom_mark'] = $custom_mark;
|
||
$detail['mark_text'] = $mark_text;
|
||
$oodetail['order_detail'] = $detail;
|
||
return $oodetail;
|
||
}
|
||
|
||
|
||
//不能进行订单编辑的状态判断
|
||
/**
|
||
* not_allow_edit
|
||
* @param mixed $order_id ID
|
||
* @return mixed 返回值
|
||
*/
|
||
public function not_allow_edit($order_id){
|
||
$order = $this->dump($order_id);
|
||
//已取消的订单不允许编辑
|
||
if($order['process_status'] == 'cancel'){
|
||
$data['msg'] = '该订单已取消,不能进行编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//退款申请中的订单不允许编辑
|
||
if($order['pay_status'] == '6'){
|
||
$data['msg'] = '退款申请中的订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//退款中的订单不允许编辑
|
||
if($order['pay_status'] == '7'){
|
||
$data['msg'] = '退款中的订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//支付中的订单不允许编辑
|
||
if($order['pay_status'] == '8'){
|
||
$data['msg'] = '支付中的订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//已发货订单不允许编辑
|
||
if($order['ship_status'] == '1'){
|
||
$data['msg'] = '已发货订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//部分发货订单不允许编辑
|
||
if($order['ship_status'] == '2'){
|
||
$data['msg'] = '部分发货订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//部分退货订单不允许编辑
|
||
if($order['ship_status'] == '3'){
|
||
$data['msg'] = '部分退货订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//已退货订单不允许编辑
|
||
if($order['ship_status'] == '4'){
|
||
$data['msg'] = '已退货订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
//余单撤销订单不允许编辑
|
||
if($order['process_status'] == 'remain_cancel'){
|
||
$data['msg'] = '余单撤销订单不允许编辑';
|
||
$data['res'] = 'false';
|
||
return $data;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/*根据发货单号获取订单运费总额*/
|
||
function get_costfreight($delivery_id = array()){
|
||
$Odelivery_order = $this->app->model('delivery_order');
|
||
$getOrders = $Odelivery_order->getList('order_id',array('delivery_id|in'=>$delivery_id));
|
||
$costfreight = 0;
|
||
if($getOrders){
|
||
foreach ($getOrders as $k => $v) {
|
||
$orderid[$k] = $v['order_id'];
|
||
}
|
||
|
||
$costfreight = $this->getList('sum(cost_freight) as cost_freight',array('order_id|in'=>$orderid));
|
||
$costfreight = $costfreight[0]['cost_freight'];
|
||
}
|
||
|
||
return $costfreight;
|
||
}
|
||
|
||
|
||
/**
|
||
* 统计订单商品重量
|
||
* @param order_id
|
||
* @return void
|
||
*/
|
||
function getOrderWeight($order_id,$type='',$additional=''){
|
||
$orderObj = $this->app->model('orders');
|
||
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
|
||
$salesMaterialExtObj = app::get('material')->model('sales_material_ext');
|
||
|
||
$weight = 0;
|
||
$order = $orderObj->dump($order_id,"order_id",array("order_objects"=>array("*",array("order_items"=>array("*")))));
|
||
foreach ($order['order_objects'] as $k=>$v) {
|
||
if($v['obj_type']=='pkg'){
|
||
$bn = $v['bn'];
|
||
$pkg = $salesMaterialExtObj->dump(array('sm_id'=>$v['goods_id']),'weight');
|
||
if ($pkg['weight']>0){
|
||
//捆绑是一个删全删除的,所以取一个看状态是否是删除
|
||
$order_items_flag = array_pop($v['order_items']);
|
||
if ($order_items_flag['delete']=='false') {
|
||
$weight+=$pkg['weight']*$v['quantity'];
|
||
}
|
||
}else {
|
||
foreach($v['order_items'] as $k1=>$v1){
|
||
if ($v1['delete'] == 'false') {
|
||
$products = $basicMaterialExtObj->dump(array('bm_id'=>$v1['product_id']),'weight');
|
||
if($products['weight']>0){
|
||
$weight+=$products['weight']*$v1['quantity'];
|
||
}else{
|
||
$weight=0;
|
||
break 2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}else{
|
||
foreach($v['order_items'] as $k1=>$v1){
|
||
if ($v1['delete'] == 'false') {
|
||
$products = $basicMaterialExtObj->dump(array('bm_id'=>$v1['product_id']),'weight');
|
||
if($products['weight']>0){
|
||
$weight+=$products['weight']*$v1['quantity'];
|
||
}else{
|
||
$weight=0;
|
||
break 2;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
$weight = round($weight,3);
|
||
return $weight;
|
||
}
|
||
|
||
function getOrdersBnById($original_id = null){
|
||
$sql="
|
||
select
|
||
do.delivery_id,o.order_bn
|
||
from sdb_ome_delivery_order as do
|
||
join sdb_ome_orders as o on do.order_id=o.order_id and do.delivery_id in ($original_id)";
|
||
$_value = $this->db->select($sql);
|
||
return $_value?$_value:null;
|
||
}
|
||
|
||
/**
|
||
* 异常订单过滤条件
|
||
*
|
||
*/
|
||
|
||
function _abnormalFilter($filter,$tableAlias=null,$baseWhere=null){
|
||
$table_name = $this->table_name(true);
|
||
if(isset($filter['archive'])){
|
||
$where = ' '.$table_name.'.archive='.$filter['archive'].' ';
|
||
unset($filter['archive']);
|
||
}else{
|
||
$where = "1";
|
||
}
|
||
///////////////////////////
|
||
// 加密处理逻辑 2017/5/5 by cp //
|
||
///////////////////////////
|
||
foreach ($filter as $key => $value) {
|
||
$pos = strpos($key,'|');
|
||
$field = false !== $pos ? substr($key,0,$pos): $key;
|
||
|
||
$encrypt_type = $this->__encrypt_cols[$field];
|
||
if ($encrypt_type) {
|
||
$searchtype = false !== $pos ? substr($key,$pos+1): 'nequal';
|
||
|
||
if ($searchtype!='nequal' && in_array($encrypt_type,array('search','nick','receiver_name'))) {
|
||
$encryptVal = kernel::single('ome_security_factory')->search($value,$encrypt_type);
|
||
} else {
|
||
$encryptVal = kernel::single('ome_security_factory')->encryptPublic($value,$encrypt_type);
|
||
}
|
||
|
||
|
||
$originalVal = utils::addslashes_array($value);
|
||
$encryptVal = utils::addslashes_array($encryptVal);
|
||
|
||
switch ($searchtype) {
|
||
case 'has':
|
||
$baseWhere[] = "({$table_name}.{$field} LIKE '%".$originalVal."%' || {$table_name}.{$field} LIKE '%".$encryptVal."%')";
|
||
break;
|
||
case 'head':
|
||
$baseWhere[] = "({$table_name}.{$field} LIKE '".$originalVal."%' || {$table_name}.{$field} LIKE '%".$encryptVal."%')";
|
||
break;
|
||
case 'foot':
|
||
$baseWhere[] = "({$table_name}.{$field} LIKE '%".$originalVal."' || {$table_name}.{$field} LIKE '%".$encryptVal."%')";
|
||
break;
|
||
default:
|
||
$baseWhere[] = "{$table_name}.{$field} IN('".$originalVal."','".$encryptVal."')";
|
||
break;
|
||
}
|
||
|
||
unset($filter[$key]);
|
||
}
|
||
}
|
||
|
||
if(isset($filter['ship_tel_mobile'])){
|
||
$encryptVal = kernel::single('ome_security_factory')->encryptPublic($filter['ship_tel_mobile'],'phone');
|
||
$encryptVal = utils::addslashes_array($encryptVal);
|
||
$originalVal = utils::addslashes_array($filter['ship_tel_mobile']);
|
||
|
||
$baseWhere[] = "({$table_name}.ship_tel IN('".$originalVal."','".$encryptVal."')||{$table_name}.ship_mobile IN('".$originalVal."','".$encryptVal."'))";
|
||
|
||
unset($filter['ship_tel_mobile']);
|
||
}
|
||
|
||
//brush特殊订单
|
||
$where .= ' AND '. $table_name .'.order_type<>"brush" ';
|
||
|
||
//order_confirm_filter
|
||
if(isset($filter['order_confirm_filter'])){
|
||
$where .= ' AND '.$table_name.'.'.$filter['order_confirm_filter'];
|
||
unset($filter['order_confirm_filter']);
|
||
}
|
||
|
||
if (isset($filter['assigned'])){
|
||
if ($filter['assigned'] == 'notassigned'){
|
||
$where .= ' AND ('.$table_name.'.group_id=0 AND '.$table_name.'.op_id=0)';
|
||
}else{
|
||
$where .= ' AND ('.$table_name.'.op_id > 0 OR '.$table_name.'.group_id > 0)';
|
||
}
|
||
unset ($filter['assigned']);
|
||
}
|
||
|
||
if (isset($filter['balance'])){
|
||
if ($filter['balance'])
|
||
$where .= " AND ".$table_name.".`old_amount` != 0 AND ".$table_name.".`total_amount` != `old_amount` ";
|
||
else
|
||
$where .= " AND ".$table_name.".`old_amount` = 0 ";
|
||
}
|
||
|
||
//自动取消订单过滤条件
|
||
if (isset($filter['auto_cancel_order_filter'])){
|
||
$where .= ' AND '.$table_name.'.'.$filter['auto_cancel_order_filter'];
|
||
}
|
||
|
||
if(isset($filter['product_bn'])){
|
||
|
||
//多基础物料查询
|
||
if($filter['product_bn'] && is_string($filter['product_bn']) && strpos($filter['product_bn'], "\n") !== false){
|
||
$filter['product_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['product_bn']))));
|
||
}
|
||
|
||
//按基础物料查询相关订单
|
||
$itemsObj = $this->app->model("order_items");
|
||
$rows = $itemsObj->getOrderIdByPbn($filter['product_bn']);
|
||
$orderId[] = 0;
|
||
foreach($rows as $row){
|
||
$orderId[] = $row['order_id'];
|
||
}
|
||
|
||
$where .= ' AND '.$table_name.'.order_id IN ('.implode(',', $orderId).')';
|
||
unset($filter['product_bn']);
|
||
}elseif(isset($filter['sales_material_bn'])){
|
||
$orderId = array();
|
||
$orderId[] = 0;
|
||
|
||
//赋值
|
||
$filter['product_bn'] = $filter['sales_material_bn'];
|
||
|
||
//多销售物料查询
|
||
if($filter['product_bn'] && is_string($filter['product_bn']) && strpos($filter['product_bn'], "\n") !== false){
|
||
$filter['product_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['product_bn']))));
|
||
}
|
||
|
||
//按销售物料查询相关订单
|
||
$itemsObj = $this->app->model('order_items');
|
||
$objectRows = $itemsObj->getOrderIdByPkgbnEq($filter);
|
||
if($objectRows){
|
||
foreach($objectRows as $objectItem){
|
||
$temp_order_id = $objectItem['order_id'];
|
||
|
||
$orderId[$temp_order_id] = $temp_order_id;
|
||
}
|
||
}
|
||
|
||
$where .= ' AND '.$table_name.'.order_id IN ('.implode(',', $orderId).')';
|
||
|
||
unset($filter['sales_material_bn'], $filter['product_bn']);
|
||
}
|
||
|
||
//支付失败
|
||
if(isset($filter['payment_fail']) && $filter['payment_fail'] == true){
|
||
$api_fail = $this->app->model("api_fail");
|
||
$payment_fail_list = $api_fail->getList('order_id', array('type'=>'payment'), 0, -1);
|
||
$payment_order_id = array();
|
||
if ($payment_fail_list){
|
||
foreach($payment_fail_list as $val){
|
||
$payment_order_id[] = $val['order_id'];
|
||
}
|
||
}
|
||
$payment_order_id = implode(',', $payment_order_id);
|
||
$payment_order_id = $payment_order_id ? $payment_order_id : '\'\'';
|
||
$where .= ' AND '.$table_name.'.order_id IN ('.$payment_order_id.')';
|
||
unset($filter['payment_fail']);
|
||
}
|
||
|
||
if(isset($filter['product_barcode'])){
|
||
$itemsObj = $this->app->model("order_items");
|
||
$rows = $itemsObj->getOrderIdByPbarcode($filter['product_barcode']);
|
||
$orderId[] = 0;
|
||
foreach($rows as $row){
|
||
$orderId[] = $row['order_id'];
|
||
}
|
||
$where .= ' AND '.$table_name.'.order_id IN ('.implode(',', $orderId).')';
|
||
unset($filter['product_barcode']);
|
||
}
|
||
//判断是否录入发票号
|
||
if(isset($filter['is_tax_no'])){
|
||
if($filter['is_tax_no']==1){
|
||
$where .= ' AND '.$table_name.'.tax_no IS NOT NULL';
|
||
|
||
}else{
|
||
$where .= ' AND '.$table_name.'.tax_no IS NULL';
|
||
}
|
||
unset($filter['is_tax_no']);
|
||
}
|
||
//付款确认
|
||
if (isset($filter['pay_confirm'])){
|
||
$where .= ' AND '.$table_name.'.'.$filter['pay_confirm'];
|
||
unset($filter['pay_confirm']);
|
||
}
|
||
//确认状态
|
||
if (isset($filter['process_status_noequal'])){
|
||
$value = '';
|
||
foreach($filter['process_status_noequal'] as $k=>$v){
|
||
$value .= "'".$v."',";
|
||
}
|
||
$len = strlen($value);
|
||
$value_last = substr($value,0,($len-1));
|
||
$where .= ' AND '.$table_name.'.process_status not in ( '.$value_last.")";
|
||
unset($filter['process_status_noequal']);
|
||
}
|
||
if (isset($filter['member_uname'])){
|
||
$memberObj = $this->app->model("members");
|
||
$rows = $memberObj->getList('member_id',array('uname|head'=>$filter['member_uname']));
|
||
$memberId[] = 0;
|
||
foreach($rows as $row){
|
||
$memberId[] = $row['member_id'];
|
||
}
|
||
$where .= ' AND '.$table_name.'.member_id IN ('.implode(',', $memberId).')';
|
||
unset($filter['member_uname']);
|
||
}
|
||
if (isset($filter['pay_type'])){
|
||
$cfgObj = app::get('ome')->model('payment_cfg');
|
||
$rows = $cfgObj->getList('pay_bn',array('pay_type'=>$filter['pay_type']));
|
||
$pay_bn[] = 0;
|
||
foreach($rows as $row){
|
||
$pay_bn[] = $row['pay_bn'];
|
||
}
|
||
$where .= ' AND '.$table_name.'.pay_bn IN (\''.implode('\',\'', $pay_bn).'\')';
|
||
unset($filter['pay_type']);
|
||
}
|
||
//部分支付 包含部分退款 部分支付
|
||
if(isset($filter['pay_status_part'])){
|
||
$where .= ' AND ('.$table_name.'.pay_status = \'3\' or ('.$table_name.'.pay_status = \'4\' and '.$table_name.'.ship_status = \'0\'))';
|
||
unset($filter['pay_status_part']);
|
||
}
|
||
//付款确认时,部分退款的只有未发货的才能继续支付
|
||
if(isset($filter['pay_status_set'])){
|
||
if($filter['pay_status_set'] == 2){
|
||
$where .= ' AND ('.$table_name.'.pay_status in (\'0\',\'3\') or ('.$table_name.'.pay_status = \'4\' and '.$table_name.'.ship_status = \'0\'))';
|
||
}else{
|
||
$where .= ' AND ('.$table_name.'.pay_status in (\'0\',\'3\',\'8\') or ('.$table_name.'.pay_status = \'4\' and '.$table_name.'.ship_status = \'0\'))';
|
||
}
|
||
unset($filter['pay_status_set']);
|
||
}
|
||
|
||
return $where ." AND ".parent::_filter($filter,$tableAlias,$baseWhere);
|
||
}
|
||
|
||
#获取发货单上捆绑商品item_id
|
||
function getPkgItemId($delivery_id = null){
|
||
$sql = "select delivery_item_id from sdb_ome_delivery_items_detail where item_type='pkg' and delivery_id=".$delivery_id;
|
||
$_value = $this->db->select($sql);
|
||
if(!empty($_value)){
|
||
foreach( $_value as $id){
|
||
$item_id[] = $id['delivery_item_id'];
|
||
}
|
||
return $item_id;
|
||
}
|
||
return false;
|
||
|
||
|
||
}
|
||
#根据product_id,获取商品类型、品牌类型
|
||
function getTypeName($product_id =null){
|
||
|
||
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
|
||
$_name = $basicMaterialExtObj->dump(array('bm_id'=>$product_id), 'bm_id, brand_id, cat_id');
|
||
if(empty($_name))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
#格式化品牌
|
||
$ome_brand_obj = app::get('ome')->model('brand');
|
||
$temp = $ome_brand_obj->dump(array('brand_id'=>$_name['brand_id']), 'brand_name');
|
||
$_name['brand_name'] = $temp['brand_name'];
|
||
|
||
#格式化品牌、商品类型
|
||
$goods_type_obj = app::get('ome')->model('goods_type');
|
||
$temp = $goods_type_obj->dump(array('type_id'=>$_name['cat_id']), 'name');
|
||
$_name['type_name'] = $temp['name'];
|
||
|
||
return $_name;
|
||
}
|
||
/**
|
||
* 获得日志类型(non-PHPdoc)
|
||
* @see dbeav_model::getLogType()
|
||
*/
|
||
public function getLogType($logParams) {
|
||
$type = $logParams['type'];
|
||
$logType = 'none';
|
||
if ($type == 'export') {
|
||
$logType = $this->exportLogType($logParams);
|
||
}
|
||
elseif ($type == 'import') {
|
||
$logType = $this->importLogType($logParams);
|
||
}
|
||
return $logType;
|
||
}
|
||
/**
|
||
* 导出日志类型
|
||
* @param Array $logParams 日志参数
|
||
*/
|
||
public function exportLogType($logParams) {
|
||
$params = $logParams['params'];
|
||
$type = 'order';
|
||
if ($params['disabled'] == 'false' && $params['is_fail'] == 'false' || $params['archive'] && $params['filter_sql']['process_status'] != 'cancel') {
|
||
//当前订单
|
||
$type .= '_current';
|
||
}
|
||
elseif ($params['disabled'] == 'false' && $params['order_confirm_filter'] == '(is_fail=\'false\' OR (is_fail=\'true\' AND status!=\'active\'))') {
|
||
//历史订单
|
||
$type .= '_history';
|
||
}
|
||
elseif ($params['is_fail'] == 'true' && $params['status'] == 'active') {
|
||
//失败订单
|
||
$type .= '_fail';
|
||
}
|
||
$type .= '_export';
|
||
return $type;
|
||
}
|
||
|
||
/**
|
||
* 导入操作日志类型
|
||
* @param Array $logParams 日志参数
|
||
*/
|
||
public function importLogType($logParams) {
|
||
$params = $logParams['params'];
|
||
$type = 'order';
|
||
$type .= '_import';
|
||
return $type;
|
||
}
|
||
|
||
/**
|
||
* 发货单列表项扩展字段
|
||
*/
|
||
function extra_cols(){
|
||
return array(
|
||
'column_abnormal_type_name' => array('label'=>'异常类型','width'=>'80','func_suffix'=>'abnormal_type_name'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 买家备注扩展字段格式化
|
||
*/
|
||
function extra_abnormal_type_name($rows){
|
||
return kernel::single('ome_extracolumn_order_abnormaltypename')->process($rows);
|
||
}
|
||
|
||
/**
|
||
* 订单导出列表扩展字段
|
||
*/
|
||
function export_extra_cols(){
|
||
return array(
|
||
'column_discount_plan' => array('label'=>'优惠方案','width'=>'100','func_suffix'=>'discount_plan'),
|
||
'column_mark_type_colour' => array('label'=>'订单备注图标颜色','width'=>'100','func_suffix'=>'mark_type_colour'),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 买家备注扩展字段格式化
|
||
*/
|
||
function export_extra_discount_plan($rows){
|
||
return kernel::single('ome_exportextracolumn_order_discountplan')->process($rows);
|
||
}
|
||
/**
|
||
* 订单备注图标颜色扩展字段格式化
|
||
*/
|
||
function export_extra_mark_type_colour($rows){
|
||
return kernel::single('ome_exportextracolumn_order_marktypecolour')->process($rows);
|
||
}
|
||
|
||
/**
|
||
* 获取京东子单号
|
||
* @param $orderIds
|
||
* @return array
|
||
*/
|
||
public function getPackageBn($orderIds)
|
||
{
|
||
$oDeliveryOrder = app::get('ome')->model('delivery_order');
|
||
$sql = "SELECT do.order_id,do.delivery_id,dp.package_bn,dp.bn,dp.status FROM sdb_ome_delivery_order do
|
||
LEFT JOIN sdb_ome_delivery_package AS dp ON do.delivery_id = dp.delivery_id
|
||
WHERE status <> 'cancel' AND do.order_id IN(". implode(',', $orderIds) .")";
|
||
$deliveryPackageList = $oDeliveryOrder->db->select($sql);
|
||
|
||
$_deliveryPackageList = array();
|
||
if ($deliveryPackageList) {
|
||
foreach($deliveryPackageList as $val){
|
||
$key = $val['order_id'].'_'.$val['bn'];
|
||
$_deliveryPackageList[$key] = $val;
|
||
}
|
||
}
|
||
return $_deliveryPackageList;
|
||
}
|
||
|
||
public function getexportdetail_改用getlist加getExportDetailV2($fields,$filter,$offset=0,$limit=1,$has_title=false)
|
||
{
|
||
//获取订单号信息
|
||
$orders = $this->db->select("SELECT order_id,order_bn FROM sdb_ome_orders WHERE order_id in(".implode(',', $filter['order_id']).")");
|
||
$aOrder = array();
|
||
if($orders){
|
||
foreach($orders as $order){
|
||
$aOrder[$order['order_id']] = $order['order_bn'];
|
||
}
|
||
}
|
||
$deliveryPackageList = $this->getPackageBn($filter['order_id']);
|
||
|
||
$row_num = 1;
|
||
foreach($filter['order_id'] as $oid){
|
||
$objects = $this->db->select("SELECT * FROM sdb_ome_order_objects WHERE order_id =".$oid);
|
||
if ($objects){
|
||
foreach ($objects as $obj){
|
||
if ($service = kernel::service("ome.service.order.objtype.".strtolower($obj['obj_type']))){
|
||
$item_data = $service->process($obj);
|
||
if ($item_data){
|
||
foreach ($item_data as $itemv){
|
||
$package_bn = '';
|
||
$orderObjRow = array();
|
||
$orderObjRow['*:订单号'] = mb_convert_encoding($aOrder[$obj['order_id']], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品货号'] = mb_convert_encoding($itemv['bn'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品名称'] = mb_convert_encoding(str_replace("\n"," ",$itemv['name']), 'GBK', 'UTF-8');
|
||
$orderObjRow['*:购买单位'] = mb_convert_encoding($itemv['unit'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品规格'] = $itemv['spec_info'] ? mb_convert_encoding(str_replace("\n"," ",$itemv['spec_info']), 'GBK', 'UTF-8'):"-";
|
||
$orderObjRow['*:购买数量'] = $itemv['nums'];
|
||
$orderObjRow['*:商品原价'] = $itemv['price'];
|
||
$orderObjRow['*:销售价'] = $itemv['sale_price'] / $itemv['nums'];
|
||
$orderObjRow['*:商品优惠金额'] = $itemv['pmt_price'];
|
||
$orderObjRow['*:子单号'] = mb_convert_encoding("\t".$obj['oid'], 'GBK', 'UTF-8');
|
||
if($obj['is_wms_gift'] == 'false') $package_bn = $deliveryPackageList[$obj['order_id'].'_'.$itemv['bn']]['package_bn'];
|
||
$orderObjRow['*:第三方单号'] = mb_convert_encoding("\t".$package_bn, 'GBK', 'UTF-8');
|
||
$orderObjRow['*:平台商品ID'] = mb_convert_encoding("\t".$obj['shop_goods_id'], 'GBK', 'UTF-8');
|
||
|
||
$data[$row_num] = implode(',', $orderObjRow );
|
||
$row_num++;
|
||
}
|
||
}
|
||
}else {
|
||
$aOrder['order_items'] = $this->db->select("SELECT * FROM sdb_ome_order_items WHERE obj_id=".$obj['obj_id']." AND `delete`='false' AND order_id =".$obj['order_id']);
|
||
$aOrder['order_items'] = ome_order_func::add_items_colum($aOrder['order_items']);
|
||
$package_bn = '';
|
||
$orderRow = array();
|
||
$orderObjRow = array();
|
||
$k = 0;
|
||
if ($aOrder['order_items'])
|
||
foreach( $aOrder['order_items'] as $itemk => $itemv ){
|
||
$addon = unserialize($itemv['addon']);
|
||
$spec_info = null;
|
||
if(!empty($addon)){
|
||
foreach($addon as $val){
|
||
foreach ($val as $v){
|
||
$spec_info[] = $v['value'];
|
||
}
|
||
}
|
||
}
|
||
$_typeName = $this->getTypeName($itemv['product_id']);
|
||
$orderObjRow = array();
|
||
$orderObjRow['*:订单号'] = mb_convert_encoding($aOrder[$obj['order_id']], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品货号'] = mb_convert_encoding("\t".$itemv['bn'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品名称'] = mb_convert_encoding("\t".str_replace("\n"," ",$itemv['name']), 'GBK', 'UTF-8');
|
||
$orderObjRow['*:购买单位'] = mb_convert_encoding($itemv['unit'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品规格'] = $spec_info ? mb_convert_encoding(implode('||', $spec_info), 'GBK', 'UTF-8'):'-';
|
||
$orderObjRow['*:购买数量'] = $itemv['nums'];
|
||
$orderObjRow['*:商品原价'] = $itemv['price'];
|
||
$orderObjRow['*:销售价'] = $itemv['sale_price'] / $itemv['nums'];
|
||
$orderObjRow['*:商品优惠金额'] = $itemv['pmt_price'];
|
||
$orderObjRow['*:商品类型'] = mb_convert_encoding($_typeName['type_name'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:商品品牌'] = mb_convert_encoding($_typeName['brand_name'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:子单号'] = mb_convert_encoding("\t".$obj['oid'], 'GBK', 'UTF-8');
|
||
if($obj['is_wms_gift'] == 'false') $package_bn = $deliveryPackageList[$obj['order_id'].'_'.$itemv['bn']]['package_bn'];
|
||
$orderObjRow['*:第三方单号'] = mb_convert_encoding("\t".$package_bn, 'GBK', 'UTF-8');
|
||
$orderObjRow['*:平台商品ID'] = mb_convert_encoding("\t".$itemv['shop_goods_id'], 'GBK', 'UTF-8');
|
||
$orderObjRow['*:平台SkuID'] = mb_convert_encoding("\t".$itemv['shop_product_id'], 'GBK', 'UTF-8');
|
||
|
||
|
||
$data[$row_num] = implode(',', $orderObjRow );
|
||
$row_num++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//明细标题处理
|
||
if($data && $has_title){
|
||
$title = array(
|
||
'*:订单号',
|
||
'*:商品货号',
|
||
'*:商品名称',
|
||
'*:购买单位',
|
||
'*:商品规格',
|
||
'*:购买数量',
|
||
'*:商品原价',
|
||
'*:销售价',
|
||
'*:商品优惠金额',
|
||
'*:商品类型',
|
||
'*:商品品牌',
|
||
'*:子单号',
|
||
'*:第三方单号',
|
||
'*:平台商品ID',
|
||
'*:平台SkuID',
|
||
|
||
);
|
||
|
||
foreach ((array)$title as $key => $value) {
|
||
$title[$key] = mb_convert_encoding($value, 'GBK', 'UTF-8');
|
||
}
|
||
|
||
$data[0] = implode(',', $title);
|
||
}
|
||
|
||
ksort($data);
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 获取分派信息
|
||
* @param
|
||
* @return
|
||
* @access public
|
||
* @author sunjing@shopex.cn
|
||
*/
|
||
function updateDispatchinfo($order_id)
|
||
{
|
||
$combineObj = new omeauto_auto_combine();
|
||
|
||
$dispatchObj = app::get('omeauto')->model('autodispatch');
|
||
$params = array();
|
||
$params[] = array(
|
||
'orders' => array (
|
||
0 => $order_id,
|
||
),
|
||
);
|
||
$result = $combineObj->dispatch($params);
|
||
|
||
if ($result['did'] && $result['did']>0) {
|
||
$opData = $dispatchObj->dump($result['did'],'group_id,op_id');
|
||
if($opData) {
|
||
$this->update($opData,array('order_id'=>$order_id));
|
||
$usersObj = app::get('desktop')->model('users');
|
||
$groupsObj = app::get('ome')->model('groups');
|
||
$confirm_opname = $usersObj->dump($opData['op_id'], 'name');
|
||
$confirm_opgroup = $groupsObj->dump($opData['group_id'], 'name');
|
||
$logMsg = '<span style="display:none">' . var_export($result, 1) . '</span>'."订单重新分派给确认组:" . $confirm_opgroup['name'] . ",确认人:" . ($confirm_opname ? $confirm_opname['name'] : '-');
|
||
$omeLogMdl = app::get('ome')->model('operation_log');
|
||
$omeLogMdl->write_log('order_dispatch@ome', $order_id, $logMsg);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 计算订单优惠均摊
|
||
*/
|
||
function getPmtorder($order_id){
|
||
$order_detail = $this->dump($order_id,"order_id,pmt_order");
|
||
$order_objects = $this->db->select("SELECT o.* FROM sdb_ome_order_items i LEFT JOIN sdb_ome_order_objects AS o ON i.obj_id=o.obj_id WHERE i.order_id=".$order_id." AND i.`delete`='false' GROUP BY order_id,obj_id");
|
||
|
||
$all_discount = $order_detail['pmt_order'];
|
||
$tmp_goods = array();
|
||
$all_goods_sale_price = 0.00;//所有商品销售价格:去商品object上优惠后的所有商品销售价合计
|
||
foreach ($order_objects as $key => $object){
|
||
|
||
$tmp_goods[$key]['product'][$object['bn']] = array(
|
||
'product_pmt_price' => $object['pmt_price'],
|
||
'sale_price' => $object['sale_price'],
|
||
'obj_id' => $object['obj_id'],
|
||
);
|
||
|
||
$tmp_goods[$key]['obj_id'] = $object['obj_id'];
|
||
$tmp_goods[$key]['bn'] = $object['bn'];
|
||
$tmp_goods[$key]['sale_price'] = $object['sale_price'];
|
||
$tmp_goods[$key]['goods_pmt_price'] = 0.00;
|
||
|
||
$tmp_goods[$key]['price_worth'] = bcsub($object['sale_price'],$tmp_goods[$key]['goods_pmt_price'],2);
|
||
|
||
$all_goods_sale_price = bcadd($all_goods_sale_price,$tmp_goods[$key]['price_worth'],2);
|
||
}
|
||
$loop = 1;
|
||
$goods_count = count($tmp_goods);
|
||
foreach($tmp_goods as $key => $goods){
|
||
if($tmp_goods[$key]['price_worth'] > 0){
|
||
if($goods_count == $loop){
|
||
$tmp_goods[$key]['apportion_pmt'] = bcsub($all_discount,$has_apportion_pmt,2);
|
||
}else{
|
||
$tmp_goods[$key]['apportion_pmt'] = bcmul($all_discount/$all_goods_sale_price,$tmp_goods[$key]['price_worth'],2);
|
||
$has_apportion_pmt = bcadd($has_apportion_pmt,$tmp_goods[$key]['apportion_pmt'],2);
|
||
}
|
||
}else{
|
||
$tmp_goods[$key]['apportion_pmt'] = 0.00;
|
||
}
|
||
|
||
$tmp_products = $goods['product'];
|
||
|
||
$sale_product[$goods['obj_id']][$tmp_goods[$key]['bn']]['apportion_pmt'] = $tmp_goods[$key]['apportion_pmt'];
|
||
$sale_product[$goods['obj_id']][$tmp_goods[$key]['bn']]['sales_amount'] = bcsub($tmp_goods[$key]['sale_price'],$tmp_goods[$key]['apportion_pmt'],2);
|
||
|
||
$loop++;
|
||
}
|
||
|
||
return $sale_product;
|
||
}
|
||
|
||
//导入订单过滤格式化地区名称
|
||
private function import_area_char_filter($str){
|
||
return trim(str_replace(array("\t","\r","\n"),array("","",""),$str));
|
||
}
|
||
|
||
/**
|
||
* modifier_ship_name
|
||
* @param mixed $ship_name ship_name
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_ship_name($ship_name,$list,$row)
|
||
{
|
||
if ($this->is_export_data) {
|
||
if ('false' != app::get('ome')->getConf('ome.sensitive.exportdata.encrypt')) {
|
||
return kernel::single('ome_view_helper2')->modifier_ciphertext($ship_name,'order','ship_name');
|
||
}
|
||
return kernel::single('ome_security_export')->decryptField([
|
||
'origin' => $ship_name,
|
||
'field_type' => 'ship_name',
|
||
'shop_id' => $row['shop_id'],
|
||
'origin_bn' => $row['order_bn'],
|
||
'type' => 'order'
|
||
]);
|
||
}
|
||
|
||
$is_encrypt = kernel::single('ome_security_hash')->check_encrypt($ship_name);
|
||
|
||
if (!$is_encrypt) return $ship_name;
|
||
|
||
$base_url = kernel::base_url(1);$order_id = $row['order_id'];
|
||
$encryptShipName = kernel::single('ome_view_helper2')->modifier_ciphertext($ship_name,'order','ship_name');
|
||
|
||
$return =<<<HTML
|
||
<a class="data-hide" href="javascript:void(0);" onclick="Ex_Loader('security',function(){new Security({url:'index.php?app=ome&ctl=admin_order&act=showSensitiveData&p[0]={$order_id}',clickElement:\$(event.target)}).desHtml(\$(event.target).getNext()); });"></a><span><span sensitive-field="ship_name">{$encryptShipName}</span></span>
|
||
HTML;
|
||
return $ship_name?$return:$ship_name;
|
||
}
|
||
|
||
/**
|
||
* modifier_ship_tel
|
||
* @param mixed $tel tel
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_ship_tel($tel,$list,$row)
|
||
{
|
||
if ($this->is_export_data) {
|
||
if ('false' != app::get('ome')->getConf('ome.sensitive.exportdata.encrypt')) {
|
||
return kernel::single('ome_view_helper2')->modifier_ciphertext($tel,'order','ship_tel');
|
||
}
|
||
return kernel::single('ome_security_export')->decryptField([
|
||
'origin' => $tel,
|
||
'field_type' => 'ship_tel',
|
||
'shop_id' => $row['shop_id'],
|
||
'origin_bn' => $row['order_bn'],
|
||
'type' => 'order'
|
||
]);
|
||
}
|
||
|
||
$is_encrypt = kernel::single('ome_security_hash')->check_encrypt($tel);
|
||
|
||
if (!$is_encrypt) return $tel;
|
||
|
||
$base_url = kernel::base_url(1);$order_id = $row['order_id'];
|
||
$encryptTel = kernel::single('ome_view_helper2')->modifier_ciphertext($tel,'order','ship_tel');
|
||
$return =<<<HTML
|
||
<a class="data-hide" href="javascript:void(0);" onclick="Ex_Loader('security',function(){new Security({url:'index.php?app=ome&ctl=admin_order&act=showSensitiveData&p[0]={$order_id}',clickElement:\$(event.target)}).desHtml(\$(event.target).getNext()); });"></a><span><span sensitive-field="ship_tel">{$encryptTel}</span></span>
|
||
HTML;
|
||
return $tel?$return:$tel;
|
||
}
|
||
|
||
/**
|
||
* modifier_ship_mobile
|
||
* @param mixed $mobile mobile
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_ship_mobile($mobile,$list,$row)
|
||
{
|
||
if ($this->is_export_data) {
|
||
if ('false' != app::get('ome')->getConf('ome.sensitive.exportdata.encrypt')) {
|
||
return kernel::single('ome_view_helper2')->modifier_ciphertext($mobile,'order','ship_mobile');
|
||
}
|
||
return kernel::single('ome_security_export')->decryptField([
|
||
'origin' => $mobile,
|
||
'field_type' => 'ship_mobile',
|
||
'shop_id' => $row['shop_id'],
|
||
'origin_bn' => $row['order_bn'],
|
||
'type' => 'order'
|
||
]);
|
||
}
|
||
|
||
|
||
$is_encrypt = kernel::single('ome_security_hash')->check_encrypt($mobile);
|
||
|
||
if (!$is_encrypt) return $mobile;
|
||
|
||
$base_url = kernel::base_url(1);$order_id = $row['order_id'];
|
||
$encryptMobile = kernel::single('ome_view_helper2')->modifier_ciphertext($mobile,'order','ship_mobile');
|
||
$return =<<<HTML
|
||
<a class="data-hide" href="javascript:void(0);" onclick="Ex_Loader('security',function(){new Security({url:'index.php?app=ome&ctl=admin_order&act=showSensitiveData&p[0]={$order_id}',clickElement:\$(event.target)}).desHtml(\$(event.target).getNext()); });"></a><span><span sensitive-field="ship_mobile">{$encryptMobile}</span></span>
|
||
HTML;
|
||
return $mobile?$return:$mobile;
|
||
}
|
||
|
||
/**
|
||
* modifier_ship_addr
|
||
* @param mixed $ship_addr ship_addr
|
||
* @param mixed $list list
|
||
* @param mixed $row row
|
||
* @return mixed 返回值
|
||
*/
|
||
public function modifier_ship_addr($ship_addr,$list,$row)
|
||
{
|
||
if ($this->is_export_data) {
|
||
if ('false' != app::get('ome')->getConf('ome.sensitive.exportdata.encrypt')) {
|
||
return kernel::single('ome_view_helper2')->modifier_ciphertext($ship_addr,'order','ship_addr');
|
||
}
|
||
return kernel::single('ome_security_export')->decryptField([
|
||
'origin' => $ship_addr,
|
||
'field_type' => 'ship_addr',
|
||
'shop_id' => $row['shop_id'],
|
||
'origin_bn' => $row['order_bn'],
|
||
'type' => 'order'
|
||
]);
|
||
}
|
||
|
||
|
||
$is_encrypt = kernel::single('ome_security_hash')->check_encrypt($ship_addr);
|
||
|
||
if (!$is_encrypt) return $ship_addr;
|
||
|
||
$base_url = kernel::base_url(1);$order_id = $row['order_id'];
|
||
$encryptAddr = kernel::single('ome_view_helper2')->modifier_ciphertext($ship_addr,'order','ship_addr');
|
||
$return =<<<HTML
|
||
<a class="data-hide" href="javascript:void(0);" onclick="Ex_Loader('security',function(){new Security({url:'index.php?app=ome&ctl=admin_order&act=showSensitiveData&p[0]={$order_id}',clickElement:\$(event.target)}).desHtml(\$(event.target).getNext()); });"></a><span><span sensitive-field="ship_addr">{$encryptAddr}</span></span>
|
||
HTML;
|
||
return $ship_addr?$return:$ship_addr;
|
||
}
|
||
|
||
/**
|
||
* 增加旺旺联系方式
|
||
*
|
||
* @param integre $row 用户ID
|
||
* @return String
|
||
*/
|
||
function modifier_member_id($member_id,$list,$row) {
|
||
static $get_from_db,$order_list;
|
||
|
||
if ($get_from_db === true) return $order_list[$row['order_id']]['uname'];
|
||
|
||
$member_list = array ();
|
||
foreach ($list as $value) {
|
||
$order_list[$value['order_id']]['shop_type'] = $value['_0_shop_type'];
|
||
$order_list[$value['order_id']]['member_id'] = $value['member_id'];
|
||
|
||
$member_list[$value['member_id']] = array ();
|
||
}
|
||
|
||
if ($mid = array_keys($member_list)) {
|
||
$m1Mdl = app::get('ome')->model('members');
|
||
$shop_list = array ();
|
||
foreach ($m1Mdl->getList('uname,member_id,shop_id,buyer_open_uid',array('member_id'=>$mid)) as $value) {
|
||
$member_list[$value['member_id']]['uname'] = $value['uname'];
|
||
$member_list[$value['member_id']]['buyer_open_uid'] = $value['buyer_open_uid'];
|
||
$member_list[$value['member_id']]['shop_type'] = &$shop_list[$value['shop_id']];
|
||
}
|
||
|
||
if ($shop_id = array_keys($shop_list)) {
|
||
$shopMdl = app::get('ome')->model('shop');
|
||
foreach ($shopMdl->getList('shop_id,shop_type', array ('shop_id' => $shop_id)) as $value) {
|
||
$shop_list[$value['shop_id']] = $value['shop_type'];
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach ($order_list as $order_id => $value) {
|
||
$value['uname'] = $member_list[$value['member_id']]['uname'];
|
||
|
||
if ($this->is_export_data) {
|
||
if ('false' != app::get('ome')->getConf('ome.sensitive.exportdata.encrypt')) {
|
||
$value['uname'] = kernel::single('ome_view_helper2')->modifier_ciphertext($value['uname'],'order','uname');
|
||
}
|
||
$order_list[$order_id] = $value; continue;
|
||
}
|
||
|
||
switch ($value['shop_type']) {
|
||
case 'taobao':
|
||
if ($value['uname']) {
|
||
$value['uname'] = kernel::single('ome_order_func')->getWangWangHtml(['nick'=>$value['uname'], 'encryptuid'=>$member_list[$value['member_id']]['buyer_open_uid']]);
|
||
}
|
||
break;
|
||
default :
|
||
// $is_encrypt = kernel::single('ome_security_hash')->check_encrypt($value['uname']);
|
||
|
||
if ($value['uname']) {
|
||
$encrypt = kernel::single('ome_view_helper2')->modifier_ciphertext($value['uname'],'order','uname');
|
||
|
||
$value['uname'] = <<<HTML
|
||
<a class="data-hide" href="javascript:void(0);" onclick="Ex_Loader('security',function(){new Security({url:'index.php?app=ome&ctl=admin_member&act=showSensitiveData&p[0]={$order_id}',clickElement:\$(event.target)}).desHtml(\$(event.target).getNext()); });"></a><span><span sensitive-field="uname">{$encrypt}</span></span>
|
||
HTML;
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
$order_list[$order_id] = $value;
|
||
}
|
||
|
||
$get_from_db = true;
|
||
|
||
return $order_list[$row['order_id']]['uname'];
|
||
}
|
||
|
||
/**
|
||
* insert
|
||
* @param mixed $data 数据
|
||
* @return mixed 返回值
|
||
*/
|
||
public function insert(&$data)
|
||
{
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($data[$field])) {
|
||
$data[$field] = (string) kernel::single('ome_security_factory')->encryptPublic($data[$field],$type);
|
||
}
|
||
}
|
||
|
||
return parent::insert($data);
|
||
}
|
||
|
||
public function update($data,$filter=array(),$mustUpdate = null)
|
||
{
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($data[$field])) {
|
||
$data[$field] = (string) kernel::single('ome_security_factory')->encryptPublic($data[$field],$type);
|
||
}
|
||
}
|
||
|
||
return parent::update($data,$filter,$mustUpdate);
|
||
}
|
||
|
||
public function getList($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null)
|
||
{
|
||
|
||
$data = parent::getList($cols,$filter,$offset,$limit,$orderType);
|
||
|
||
foreach ((array) $data as $key => $value) {
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($value[$field])) {
|
||
$data[$key][$field] = (string) kernel::single('ome_security_factory')->decryptPublic($value[$field],$type);
|
||
}
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
|
||
public function finder_getList($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null){
|
||
|
||
$data = parent::finder_getList($cols, $filter, $offset, $limit, $orderType);
|
||
|
||
foreach ((array) $data as $key => $value) {
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($value[$field])) {
|
||
$data[$key][$field] = (string) kernel::single('ome_security_factory')->decryptPublic($value[$field],$type);
|
||
}
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
|
||
protected function _debcrypt(&$data) {
|
||
foreach ((array) $data as $key => $value) {
|
||
foreach ($this->__encrypt_cols as $field => $type) {
|
||
if (isset($value[$field])) {
|
||
$data[$key][$field] = (string) kernel::single('ome_security_factory')->decryptPublic($value[$field],$type);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取Area
|
||
* @param mixed $where where
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getArea($where) {
|
||
$sql = 'SELECT order_id from sdb_ome_orders WHERE '.$where;
|
||
return array_column($this->db->select($sql),'order_id');
|
||
}
|
||
|
||
/**
|
||
* 过滤金额中的逗号和空格
|
||
*
|
||
* @param string $str
|
||
* @return string
|
||
*/
|
||
function replace_import_price($str)
|
||
{
|
||
return trim(str_replace(array(",", " "), array("", ""), $str));
|
||
}
|
||
/**
|
||
* 根据查询条件获取导出数据
|
||
* @Author: xueding
|
||
* @Vsersion: 2022/5/24 下午2:16
|
||
* @param $fields
|
||
* @param $filter
|
||
* @param $has_detail
|
||
* @param $curr_sheet
|
||
* @param $start
|
||
* @param $end
|
||
* @param $op_id
|
||
* @return bool
|
||
*/
|
||
public function getExportDataByCustom_改用getlist加getExportDetailV2($fields, $filter, $has_detail, $curr_sheet, $start, $end, $op_id)
|
||
{
|
||
$params = [
|
||
'fields' => $fields,
|
||
'filter' => $filter,
|
||
'has_detail' => $has_detail,
|
||
'curr_sheet' => $curr_sheet,
|
||
'op_id' => $op_id,
|
||
];
|
||
$orderListData = kernel::single('ome_func')->exportDataMain(__CLASS__,$params);
|
||
if (!$orderListData) {
|
||
return false;
|
||
}
|
||
//根据选择的字段定义导出的第一行标题
|
||
if ($curr_sheet == 1) {
|
||
if($has_detail == 1) {
|
||
$data['content']['main'][] = $this->getCustomExportTitle($orderListData['title']);
|
||
} else {
|
||
$data['content']['main'][] = mb_convert_encoding(implode(',', array_keys($orderListData['title'])), 'GBK', 'UTF-8');
|
||
}
|
||
}
|
||
|
||
$orderItemsMdl = app::get('ome')->model('order_items');
|
||
$orderObjectsMdl = app::get('ome')->model('order_objects');
|
||
|
||
$order_items_columns = array_values($this->orderItemsExportTitle());
|
||
$items_fields = implode(',', $order_items_columns);
|
||
|
||
$deliveryPackageList = $this->getPackageBn($filter['order_id']);
|
||
|
||
$main_columns = array_values($orderListData['title']);
|
||
$orderList = $orderListData['content'];
|
||
foreach ($orderList as $order_data) {
|
||
$order_data['order_bn'] = $order_data['order_bn']."\t";
|
||
if($has_detail != 1) {
|
||
$exptmp_data = [];
|
||
foreach ($main_columns as $key => $col) {
|
||
if (isset($order_data[$col])) {
|
||
$order_data[$col] = mb_convert_encoding($order_data[$col], 'GBK', 'UTF-8');
|
||
$exptmp_data[] = $order_data[$col];
|
||
} else {
|
||
$exptmp_data[] = '';
|
||
}
|
||
}
|
||
$data['content']['main'][] = implode(',', $exptmp_data);
|
||
continue;
|
||
}
|
||
$order_items = $orderItemsMdl->getList('*', ['order_id' => $order_data['order_id'],'delete'=>'false']);
|
||
$order_objects = $orderObjectsMdl->getList('*', ['order_id' => $order_data['order_id']]);
|
||
$order_items = ome_order_func::add_items_colum($order_items);
|
||
$order_objects = array_column($order_objects,null,'obj_id');
|
||
if ($order_items) {
|
||
foreach ($order_items as $itemk => $itemv) {
|
||
$addon = unserialize($itemv['addon']);
|
||
$spec_info = null;
|
||
if (!empty($addon)) {
|
||
foreach ($addon as $val) {
|
||
foreach ($val as $v) {
|
||
$spec_info[] = $v['value'];
|
||
}
|
||
}
|
||
}
|
||
//item 数据获取
|
||
$_typeName = $this->getTypeName($itemv['product_id']);
|
||
$orderItemObjRow = array();
|
||
$orderItemObjRow['bn'] = $itemv['bn'];
|
||
$orderItemObjRow['name'] = str_replace("\n", " ", $itemv['name']);
|
||
$orderItemObjRow['sm_bn'] = $order_objects[$itemv['obj_id']]['bn'];
|
||
$orderItemObjRow['sm_name'] = str_replace("\n", " ", $order_objects[$itemv['obj_id']]['name']);
|
||
$orderItemObjRow['unit'] = $itemv['unit'];
|
||
$orderItemObjRow['spec_info'] = $spec_info ? implode('||', $spec_info) : '-';
|
||
$orderItemObjRow['nums'] = $itemv['nums'];
|
||
$orderItemObjRow['price'] = $itemv['price'];
|
||
$orderItemObjRow['sale_price'] = $itemv['nums'] ? $itemv['sale_price'] / $itemv['nums'] : '';
|
||
$orderItemObjRow['pmt_price'] = $itemv['pmt_price'];
|
||
$orderItemObjRow['type_name'] = $_typeName['type_name'];
|
||
$orderItemObjRow['brand_name'] = $_typeName['brand_name'];
|
||
$orderItemObjRow['divide_order_fee'] = ($itemv['divide_order_fee'] ? $itemv['divide_order_fee'] : 0);
|
||
$orderItemObjRow['oid'] = mb_convert_encoding("\t".$order_objects[$itemv['obj_id']]['oid'], 'GBK', 'UTF-8');
|
||
if($order_objects[$itemv['obj_id']]['is_wms_gift'] == 'false') $package_bn = $deliveryPackageList[$itemv['order_id'].'_'.$itemv['bn']]['package_bn'];
|
||
$orderItemObjRow['package_bn'] = mb_convert_encoding("\t".$package_bn, 'GBK', 'UTF-8');
|
||
$orderItemObjRow['shop_goods_id'] = mb_convert_encoding("\t".$itemv['shop_goods_id'], 'GBK', 'UTF-8');
|
||
$orderItemObjRow['shop_product_id'] = mb_convert_encoding("\t".$itemv['shop_product_id'], 'GBK', 'UTF-8');
|
||
|
||
$orderItemObjRow = array_map(function($_v) {
|
||
$_v = str_replace(' ', '', $_v);
|
||
$_v = str_replace(array("\r\n", "\r", "\n"), '', $_v);
|
||
$_v = str_replace(',', ',', $_v);
|
||
$_v = strip_tags(html_entity_decode($_v, ENT_COMPAT | ENT_QUOTES, 'UTF-8'));
|
||
$_v = trim($_v);
|
||
return $_v;
|
||
}, $orderItemObjRow);
|
||
|
||
$orderdataRow = array_merge($order_data, $orderItemObjRow);
|
||
$all_fields = implode(',', $main_columns) . ',' . $items_fields;
|
||
|
||
$exptmp_data = [];
|
||
foreach (explode(',', $all_fields) as $key => $col) {
|
||
if (isset($orderdataRow[$col])) {
|
||
$orderdataRow[$col] = mb_convert_encoding($orderdataRow[$col], 'GBK', 'UTF-8');
|
||
$exptmp_data[] = $orderdataRow[$col];
|
||
} else {
|
||
$exptmp_data[] = '';
|
||
}
|
||
}
|
||
$data['content']['main'][] = implode(',', $exptmp_data);
|
||
}
|
||
}
|
||
}
|
||
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* 获取CustomExportTitle
|
||
* @param mixed $main_title main_title
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getCustomExportTitle($main_title)
|
||
{
|
||
$main_title = array_keys($main_title);
|
||
$order_items_title = array_keys($this->orderItemsExportTitle());
|
||
$title = array_merge($main_title, $order_items_title);
|
||
return mb_convert_encoding(implode(',', $title), 'GBK', 'UTF-8'); }
|
||
|
||
|
||
/**
|
||
* orderItemsExportTitle
|
||
* @return mixed 返回值
|
||
*/
|
||
public function orderItemsExportTitle()
|
||
{
|
||
$items_title = array(
|
||
'详情商品货号' => 'bn',
|
||
'详情商品名称' => 'name',
|
||
'关联销售物料编码' => 'sm_bn',
|
||
'关联销售物料名称' => 'sm_name',
|
||
'详情购买单位' => 'unit',
|
||
'详情商品规格' => 'spec_info',
|
||
'详情购买数量' => 'nums',
|
||
'详情商品原价' => 'price',
|
||
'详情销售价' => 'sale_price',
|
||
'详情商品优惠金额' => 'pmt_price',
|
||
'详情商品实际支付金额' => 'divide_order_fee',
|
||
'详情商品类型' => 'type_name',
|
||
'详情商品品牌' => 'brand_name',
|
||
'详情子单号' => 'oid',
|
||
'详情第三方单号' => 'package_bn',
|
||
'平台商品ID' => 'shop_goods_id',
|
||
'平台SkuID' => 'shop_product_id',
|
||
);
|
||
return $items_title;
|
||
}
|
||
|
||
function modifier_pmt_goods($row){
|
||
if($row){
|
||
if (!kernel::single('desktop_user')->has_permission('sale_price')) {
|
||
return '-';
|
||
}else{
|
||
return '¥' . $row;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_pmt_order($row){
|
||
if($row){
|
||
if (!kernel::single('desktop_user')->has_permission('sale_price')) {
|
||
return '-';
|
||
}else{
|
||
return '¥' . $row;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_total_amount($row){
|
||
if($row){
|
||
if (!kernel::single('desktop_user')->has_permission('sale_price')) {
|
||
return '-';
|
||
}else{
|
||
return '¥' . $row;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_payed($row){
|
||
if($row){
|
||
if (!kernel::single('desktop_user')->has_permission('sale_price')) {
|
||
return '-';
|
||
}else{
|
||
return '¥' . $row;
|
||
}
|
||
}
|
||
}
|
||
|
||
function modifier_cost_item($row){
|
||
if($row){
|
||
if (!kernel::single('desktop_user')->has_permission('sale_price')) {
|
||
return '-';
|
||
}else{
|
||
return '¥' . $row;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 导出明细
|
||
*
|
||
* @param array $list
|
||
* @param array $colArray
|
||
* @return array
|
||
**/
|
||
public function getExportDetailV2($list, $colArray)
|
||
{
|
||
$order_id_arr = array_unique(array_column($list, 'order_id'));
|
||
if (!$order_id_arr) {
|
||
return [$list, $colArray];
|
||
}
|
||
|
||
foreach (self::EXPORT_ITEM_TITLE as $_v) {
|
||
$colArray[$_v['col']] = ['label' => $_v['label']];
|
||
}
|
||
|
||
$list = array_column($list, null, 'order_id');
|
||
|
||
$orderItemsMdl = app::get('ome')->model('order_items');
|
||
$orderObjMdl = app::get('ome')->model('order_objects');
|
||
|
||
$objects = $items = [];
|
||
foreach ($orderObjMdl->getList('*', ['order_id|in' => $order_id_arr]) as $ov) {
|
||
// 直播间ID
|
||
$ov['addon'] = @json_decode($ov['addon'], 1);
|
||
if ($ov['addon'] && isset($ov['addon']['room_id'])) {
|
||
$ov['room_id'] = $ov['addon']['room_id'];
|
||
}
|
||
|
||
$objects[$ov['order_id']][$ov['obj_id']] = $ov;
|
||
}
|
||
|
||
$listV2 = $tmp_order_id = [];
|
||
$items = $orderItemsMdl->getList('*', ['order_id|in' => $order_id_arr]);
|
||
|
||
// 获取基础物料品牌名称
|
||
$bmIds = array_column($items, 'product_id');
|
||
$brandList = kernel::single('material_extracolumn_basicmaterial_brand')->associatedData($bmIds);
|
||
|
||
foreach ($items as $iv) {
|
||
// if (in_array($iv['order_id'], $tmp_order_id)) {
|
||
// $main = array_fill_keys(array_keys((array)$list[$iv['order_id']]), '_ISNULL_');
|
||
// } else {
|
||
// $main = (array)$list[$iv['order_id']];
|
||
// $tmp_order_id[$iv['order_id']] = $iv['order_id'];
|
||
// }
|
||
$main = (array)$list[$iv['order_id']];
|
||
$addon = unserialize($iv['addon']);
|
||
$spec_info = null;
|
||
if(!empty($addon)){
|
||
foreach($addon as $val){
|
||
foreach ($val as $v){
|
||
$spec_info[] = $v['value'];
|
||
}
|
||
}
|
||
}
|
||
$l = array_merge($main, [
|
||
'e_sm_bn' => $objects[$iv['order_id']][$iv['obj_id']]['bn'],
|
||
'e_sm_name' => $objects[$iv['order_id']][$iv['obj_id']]['name'],
|
||
'e_sm_type' => $objects[$iv['order_id']][$iv['obj_id']]['obj_type'],
|
||
'e_item_bn' => $iv['bn'],
|
||
'e_item_product_name' => $iv['name'],
|
||
'e_brand_name' => $brandList[$iv['product_id']],
|
||
'e_spec_info' => $spec_info?implode('||', $spec_info):'-',
|
||
'e_unit' => $iv['unit'],
|
||
'e_price' => $iv['price'],
|
||
'e_sale_price' => $iv['sale_price'] / $iv['nums'],
|
||
'e_pmt_price' => $iv['pmt_price'],
|
||
'e_divide_order_fee' => $iv['divide_order_fee']? $iv['divide_order_fee'] : 0,
|
||
'e_part_mjz_discount' => $iv['part_mjz_discount'],
|
||
'e_nums' => $iv['nums'],
|
||
'e_sendnum' => $iv['sendnum'],
|
||
'e_return_num' => $iv['return_num'],
|
||
'e_split_num' => $iv['split_num'],
|
||
'e_estimate_con_time' => $objects[$iv['order_id']][$iv['obj_id']]['estimate_con_time'] ? date('Y-m-d H:i:s', $objects[$iv['order_id']][$iv['obj_id']]['estimate_con_time']) : '-',
|
||
'e_presale_status' => $objects[$iv['order_id']][$iv['obj_id']]['is_oversold'] == 1 ? '是' : '否',
|
||
'e_store_code' => $objects[$iv['order_id']][$iv['obj_id']]['store_code'],
|
||
'e_oid' => mb_convert_encoding("\t".$objects[$iv['order_id']][$iv['obj_id']]['oid'], 'GBK', 'UTF-8'),
|
||
'e_main_oid' => str_replace(',', '', $objects[$iv['order_id']][$iv['obj_id']]['main_oid']),
|
||
'e_shop_goods_id' => mb_convert_encoding("\t".$objects[$iv['order_id']][$iv['obj_id']]['shop_goods_id'], 'GBK', 'UTF-8'),
|
||
'e_shop_product_id' => mb_convert_encoding("\t".$objects[$iv['order_id']][$iv['obj_id']]['shop_product_id'], 'GBK', 'UTF-8'),
|
||
'e_author_id' => $objects[$iv['order_id']][$iv['obj_id']]['author_id'],
|
||
'e_author_name' => $objects[$iv['order_id']][$iv['obj_id']]['author_name'],
|
||
'e_room_id' => $objects[$iv['order_id']][$iv['obj_id']]['room_id'],
|
||
]);
|
||
|
||
// 兼容导出数据,过滤掉特殊符号
|
||
// $l = array_map(function($v) {
|
||
// $v = str_replace([',',"\r\n", "\r", "\n"],[',',' ',' ',' '],$v );
|
||
// }, $l);
|
||
|
||
$listV2[] = $l;
|
||
}
|
||
return [$listV2, $colArray];
|
||
}
|
||
|
||
}
|