'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 = "
";
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 "
货到付款
";
}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']).'
';
}
//已暂停或取消的发货单
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'] .= '
自有仓储,成功暂停的发货单:'.implode(',', $temp_msg['is_selfwms']);
}elseif($temp_msg['other']){
$temp_rs['msg'] .= '
第三方仓储,成功取消的发货单:'.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头(例如:'*:订单号')
$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 = '' . var_export($result, 1) . ''."订单重新分派给确认组:" . $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 =<<{$encryptShipName}
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 =<<{$encryptTel}
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 =<<{$encryptMobile}
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 =<<{$encryptAddr}
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'] = <<{$encrypt}
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];
}
}