Files
OMS/app/ome/model/order/retrial.php
2025-12-28 23:13:25 +08:00

1759 lines
76 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class ome_mdl_order_retrial extends dbeav_model
{
/*------------------------------------------------------ */
//-- 获取列表数据[自定义]
/*------------------------------------------------------ */
public function getlist($cols='*', $filter=array(), $offset=0, $limit=-1, $orderType=null)
{
$where = $this->_filter($filter);
if(!empty($where))
{
$where = ' WHERE '.$where;
}
$sql = "SELECT a.*, b.total_amount, b.process_status, b.is_cod, b.pay_status, b.ship_status, b.payment, b.createtime, paytime,b.shop_id FROM ". DB_PREFIX ."ome_order_retrial as a
LEFT JOIN ". DB_PREFIX ."ome_orders as b ON a.order_id=b.order_id
". $where ." ORDER BY a.id DESC";
$rows = $this->db->selectLimit($sql, $limit, $offset);
$this->tidy_data($rows, $cols);
return $rows;
}
/*------------------------------------------------------ */
//-- 过滤条件[自定义]
/*------------------------------------------------------ */
public function _filter($filter,$tableAlias=null,$baseWhere=null)
{
$where[] = 1;
if(!empty($filter['id']))
{
$where[] = "a.id = '".$filter['id']."'";
}
if(!empty($filter['order_id']))
{
$where[] = "a.order_id = '".$filter['order_id']."'";
}
if(!empty($filter['order_bn']))
{
$where[] = "a.order_bn = '".$filter['order_bn']."'";
}
if(!empty($filter['status']) || $filter['status'] == '0')
{
if(is_array($filter['status']))
{
$_temp = array();
foreach ($filter['status'] as $key => $val)
{
$_temp[] = "'".intval($val)."'";
}
$_temp = implode(',', $_temp);
$where[] = "a.status in (".$_temp.")";
}
else
{
$where[] = "a.status = '".$filter['status']."'";
}
}
//标记是否加group_id判断
if($filter['assign'])
{
if($filter['group_id'])
{
$where[] = "IF(b.op_id>0, b.op_id='".$filter['op_id']."', b.group_id='".$filter['group_id']."')";
}
unset($filter['assign']);
}
elseif(!empty($filter['op_id']))
{
$where[] = "a.op_id = '".$filter['op_id']."'";
}
if(!empty($filter['retrial_type']))
{
$where[] = "a.retrial_type = '".$filter['retrial_type']."'";
}
if(!empty($filter['dateline']))
{
$create_time_hour = $filter['_DTIME_']['H']['dateline'];
$create_time_minute = $filter['_DTIME_']['M']['dateline'];
$create_time_start = strtotime($filter['dateline'].' '.$create_time_hour.':'.$create_time_minute.':00');
if($filter['_dateline_search']=='nequal')
{
$where[] = "a.dateline='".$create_time_start."'";
}
elseif($filter['_dateline_search']=='than')
{
$where[] = "a.dateline>'".$create_time_start."'";
}
elseif($filter['_dateline_search']=='lthan')
{
$where[] = "a.dateline<'".$create_time_start."'";
}
elseif($filter['_dateline_search']=='between' && $filter['dateline_from'] && $filter['dateline_to'])
{
$from_hour = $filter['_DTIME_']['H']['dateline_from'];
$from_minute = $filter['_DTIME_']['H']['dateline_from'];
$create_time_from = $filter['dateline_from'];
$create_time_from = strtotime($create_time_from.' '.$from_hour.':'.$from_minute.':00');
$to_hour = $filter['_DTIME_']['H']['dateline_to'];
$to_minute = $filter['_DTIME_']['H']['dateline_to'];
$create_time_to = $filter['dateline_to'];
$create_time_to = strtotime($create_time_to.' '.$to_hour.':'.$to_minute.':00');
$where[] = "(a.dateline>='".$create_time_from."' AND a.dateline<='".$create_time_to."')";
}
}
if(!empty($filter['lastdate']))
{
$create_time_hour = $filter['_DTIME_']['H']['lastdate'];
$create_time_minute = $filter['_DTIME_']['M']['lastdate'];
$create_time_start = strtotime($filter['lastdate'].' '.$create_time_hour.':'.$create_time_minute.':00');
if($filter['_lastdate_search']=='nequal')
{
$where[] = "a.lastdate='".$create_time_start."'";
}
elseif($filter['_lastdate_search']=='than')
{
$where[] = "a.lastdate>'".$create_time_start."'";
}
elseif($filter['_lastdate_search']=='lthan')
{
$where[] = "a.lastdate<'".$create_time_start."'";
}
elseif($filter['_lastdate_search']=='between' && $filter['lastdate_from'] && $filter['lastdate_to'])
{
$from_hour = $filter['_DTIME_']['H']['lastdate_from'];
$from_minute = $filter['_DTIME_']['H']['lastdate_from'];
$create_time_from = $filter['lastdate_from'];
$create_time_from = strtotime($create_time_from.' '.$from_hour.':'.$from_minute.':00');
$to_hour = $filter['_DTIME_']['H']['lastdate_to'];
$to_minute = $filter['_DTIME_']['H']['lastdate_to'];
$create_time_to = $filter['lastdate_to'];
$create_time_to = strtotime($create_time_to.' '.$to_hour.':'.$to_minute.':00');
$where[] = "(a.lastdate>='".$create_time_from."' AND a.lastdate<='".$create_time_to."')";
}
}
return implode(' AND ', $where);
}
/*------------------------------------------------------ */
//-- 获取总数[自定义]
/*------------------------------------------------------ */
public function count($filter=null)
{
$where = $this->_filter($filter);
if(!empty($where))
{
$where = ' WHERE '.$where;
}
$sql = "SELECT count(*) as num FROM ". DB_PREFIX ."ome_order_retrial as a
LEFT JOIN ". DB_PREFIX ."ome_orders as b ON a.order_id=b.order_id
". $where;
$row = $this->db->select($sql);
return $row[0]['num'];
}
/**
+----------------------------------------------------------
* 获取订单中的商品信息[order_items]
+----------------------------------------------------------
* @param Array $item_list
* return Array
+----------------------------------------------------------
*/
public function get_obj_product($item_list)
{
$product_list = array();
foreach ($item_list as $key => $obj_item)
{
foreach ($obj_item as $key_j => $items)
{
foreach ($items['order_items'] as $key_k => $item)
{
$product_list[$key_k] = $item;
}
}
}
return $product_list;
}
/**
+----------------------------------------------------------
* 获取订单中购买的所有商品id及购买量
+----------------------------------------------------------
* @param Array $item_list
* @param boolean $show_del : true允许加入删除商品
* return Array
+----------------------------------------------------------
*/
public function get_product_list($item_list, $show_del=false)
{
$product_list = array();
$quantity_list = array();
foreach ($item_list as $key => $obj_item)
{
foreach ($obj_item as $key_j => $items)
{
foreach ($items['order_items'] as $key_k => $item)
{
if($show_del)
{
$product_list['ids'][$item['product_id']] = $item['product_id'];
$quantity_list[$item['product_id']][] = intval($item['nums']);
}
else
{
if($item['delete'] == 'false')
{
$product_list['ids'][$item['product_id']] = $item['product_id'];
$quantity_list[$item['product_id']][] = intval($item['nums']);
}
}
}
}
}
#订单明细中有重复货号则累加数量
foreach ($product_list['ids'] as $product_id)
{
foreach ($quantity_list[$product_id] as $val_num)
{
$product_list['nums'][$product_id] += $val_num;
}
}
unset($quantity_list);
return $product_list;
}
/**
+----------------------------------------------------------
* 获取未设置成本价的商品货号
+----------------------------------------------------------
* @param Array $product_arr
* return Array
+----------------------------------------------------------
*/
public function get_invalid_bn($product_arr)
{
$bn_arr = array();
foreach ($product_arr as $key => $val)
{
$bn_arr[] = $val['bn'];
}
return $bn_arr;
}
/**
+----------------------------------------------------------
* 获取订单成本价&销售价 * 购买量
+----------------------------------------------------------
* @param Array $product_ids
* @param Array $buy_product_nums
* @param boolean $detail true保存每件商品价格
* return Array
+----------------------------------------------------------
*/
public function get_price_monitor($product_ids, $buy_product_nums=array(), $detail=false)
{
$basicMaterialSelect = kernel::single('material_basic_select');
$price_monitor = array();
$datalist = $basicMaterialSelect->getlist_ext('bm_id, material_bn, retail_price, cost', array('bm_id'=>$product_ids));
foreach ($datalist as $key => $val)
{
$product_id = $val['product_id'];
$val['cost'] = floatval($val['cost']);
$val['price'] = floatval($val['price']);
#保存未设置成本价格商品
if($val['cost'] <= 0)
{
$price_monitor['invalid'][] = array(
'product_id'=>$product_id,
'bn'=>$val['bn'],
);
}
if(!empty($buy_product_nums[$product_id]))
{
$val['cost'] = $val['cost'] * $buy_product_nums[$product_id];
$val['price'] = $val['price'] * $buy_product_nums[$product_id];
}
#保存每件商品价格
if($detail)
{
$price_monitor['detail'][$product_id]['cost'] = $val['cost'];
$price_monitor['detail'][$product_id]['price'] = $val['price'];
}
$price_monitor['cost'] += $val['cost'];//成本 价
$price_monitor['price'] += $val['price'];//销售价
}
return $price_monitor;
}
/**
+----------------------------------------------------------
* 获取修改后订单和订单快照的对比
+----------------------------------------------------------
* @param intval $order_id
* @param intval $retrial_id
* return Array
+----------------------------------------------------------
*/
public function contrast_order($order_id, $retrial_id=0)
{
#订单快照[原始订单]
$order_old = array();
$oSnapshot = app::get('ome')->model('order_retrial_snapshot');
$order_old = $oSnapshot->getList('*', array('retrial_id'=>$retrial_id, 'order_id'=>$order_id), 0, 1, 'tid ASC');
$order_old = $order_old[0];
$order_old = unserialize($order_old['order_detail']);
//配送地区
$areaArr = explode(':', $order_old['consignee']['area']);
$areaArr = $areaArr[1];
$order_old['consignee']['ship_area'] = str_replace('/', ' ', $areaArr);
#修改后[新]订单
$order = array();
$oOrder = app::get('ome')->model('orders');
$order = $oOrder->dump($order_id);
//配送地区
$areaArr = explode(':', $order['consignee']['area']);
$areaArr = $areaArr[1];
$order['consignee']['ship_area'] = str_replace('/', ' ', $areaArr);
$item_list = $oOrder->getItemBranchStore($order_id);//商品列表信息
#数据对比
$old_item_list = $order_old['item_list'];
$new_item_list = array();
foreach ($item_list as $key => $obj_item)
{
if($key == 'pkg')
{
foreach ($obj_item as $key_j => $items)
{
//是否新增商品
if(empty($old_item_list['pkg'][$key_j]))
{
$obj_item[$key_j]['flag_add'] = 'true';
//剔除删除的捆绑商品
$delete_i = 0;
foreach ($items['order_items'] as $key_k => $item)
{
if($item['delete'] == 'true'){ $delete_i++;}
}
if($delete_i)
{
$obj_item[$key_j]['delete'] = 'true';
unset($obj_item[$key_j]);
}
}
//是否修改商品
else
{
$new_item_md5 = md5($items['obj_id'].$items['order_id'].$items['obj_type'].$items['obj_alias'].
$items['shop_goods_id'].$items['goods_id'].$items['bn'].$items['name'].$items['price'].
$items['amount'].$items['quantity'].$items['weight'].$items['score'].$items['pmt_price'].
$items['sale_price'].$items['oid'].$items['is_oversold'].count($items['order_items']));
$temp_val = $old_item_list[$key][$key_j];
$old_item_md5 = md5($temp_val['obj_id'].$temp_val['order_id'].$temp_val['obj_type'].$temp_val['obj_alias'].
$temp_val['shop_goods_id'].$temp_val['goods_id'].$temp_val['bn'].$temp_val['name'].$temp_val['price'].
$temp_val['amount'].$temp_val['quantity'].$temp_val['weight'].$temp_val['score'].$temp_val['pmt_price'].
$temp_val['sale_price'].$temp_val['oid'].$temp_val['is_oversold'].count($temp_val['order_items']));
if($new_item_md5 != $old_item_md5)
{
$obj_item[$key_j]['flag_edit'] = 'true';
}
//是否为删除商品
$delete_i = 0;
foreach ($items['order_items'] as $key_k => $item)
{
if($item['delete'] == 'true'){ $delete_i++;}
}
if($delete_i)
{
$obj_item[$key_j]['delete'] = 'true';
$old_item_list[$key][$key_j] = $obj_item[$key_j];//替换原始订单中删除商品
unset($obj_item[$key_j]);//剔除删除的捆绑商品
}
}
}
}
else
{
foreach ($obj_item as $key_j => $items)
{
foreach ($items['order_items'] as $key_k => $item)
{
//新增商品
if(empty($old_item_list[$key][$key_j]['order_items'][$key_k]))
{
$obj_item[$key_j]['order_items'][$key_k]['flag_add'] = 'true';
//剔除删除商品
if($item['delete'] == 'true')
{
unset($obj_item[$key_j]);//剔除删除商品
}
}
//是否删除
elseif($item['delete'] == 'true')
{
$old_item_list[$key][$key_j]['order_items'][$key_k] = $item;//替换原始订单中删除商品
unset($obj_item[$key_j]['order_items'][$key_k]);//剔除删除商品
}
//是否修改
else
{
$new_item_md5 = md5($item['item_id'].$item['order_id'].$item['obj_id'].$item['shop_goods_id'].
$item['product_id'].$item['shop_product_id'].$item['bn'].$item['name'].$item['cost'].
$item['price'].$item['pmt_price'].$item['sale_price'].$item['amount'].$item['weight'].
$item['nums'].$item['sendnum'].$item['delete'].$item['quantity']);
$temp_val = $old_item_list[$key][$key_j]['order_items'][$key_k];
$old_item_md5 = md5($temp_val['item_id'].$temp_val['order_id'].$temp_val['obj_id'].$temp_val['shop_goods_id'].
$temp_val['product_id'].$temp_val['shop_product_id'].$temp_val['bn'].$temp_val['name'].$temp_val['cost'].
$temp_val['price'].$temp_val['pmt_price'].$temp_val['sale_price'].$temp_val['amount'].$temp_val['weight'].
$temp_val['nums'].$temp_val['sendnum'].$temp_val['delete'].$temp_val['quantity']);
if($new_item_md5 != $old_item_md5)
{
$obj_item[$key_j]['order_items'][$key_k]['flag_edit'] = 'true';
$old_item_list[$key][$key_j]['order_items'][$key_k]['flag_edit'] = 'true';
}
}
}
}
}
$new_item_list[$key] = $obj_item;
}
#格式化[删除的商品最后显示]
$temp = array();
foreach ($old_item_list as $key => $obj_item)
{
if($key == 'pkg')
{
foreach ($obj_item as $key_j => $items)
{
if($items['delete'] == 'true')
{
$temp['delete'][$key][$key_j] = $items;
}
else
{
$temp['normal'][$key][$key_j] = $items;
}
}
}
else
{
foreach ($obj_item as $key_j => $items)
{
foreach ($items['order_items'] as $key_k => $item)
{
if($item['delete'] == 'true')
{
$temp['delete'][$key][$key_j] = $items;
}
else
{
$temp['normal'][$key][$key_j] = $items;
}
}
}
}
}
$old_item_list = array();
if($temp['delete']['pkg'] && $temp['normal']['pkg'])
{
$old_item_list['pkg'] = array_merge($temp['normal']['pkg'], $temp['delete']['pkg']);
}
elseif($temp['normal']['pkg'])
{
$old_item_list['pkg'] = $temp['normal']['pkg'];
}
elseif($temp['delete']['pkg'])
{
$old_item_list['pkg'] = $temp['delete']['pkg'];
}
if($temp['delete']['goods'] && $temp['normal']['goods'])
{
$old_item_list['goods'] = array_merge($temp['normal']['goods'], $temp['delete']['goods']);
}
elseif($temp['normal']['goods'])
{
$old_item_list['goods'] = $temp['normal']['goods'];
}
elseif($temp['delete']['goods'])
{
$old_item_list['goods'] = $temp['delete']['goods'];
}
$order['item_list'] = $new_item_list;
$order_old['item_list'] = $old_item_list;
#订单备注mark_text_客户备注custom_mark
$order['custom_mark'] = unserialize($order['custom_mark']);
if ($order['custom_mark'])
foreach ($order['custom_mark'] as $k=>$v){
if (!strstr($v['op_time'], "-")){
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
$order['custom_mark'][$k]['op_time'] = $v['op_time'];
}
}
$order['mark_text'] = unserialize($order['mark_text']);
if ($order['mark_text'])
foreach ($order['mark_text'] as $k=>$v){
if (!strstr($v['op_time'], '-')){
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
$order['mark_text'][$k]['op_time'] = $v['op_time'];
}
}
#价格监控[获取订单复审配置]
$setting_is_monitor = app::get('ome')->getConf('ome.order.is_monitor');//是否开启价格监控
$cost_multiple = app::get('ome')->getConf('ome.order.cost_multiple');//成本价倍数
$sales_multiple = app::get('ome')->getConf('ome.order.sales_multiple');//销售价倍数
$monitor_flag = array();
$monitor_flag['cost_multiple'] = ($cost_multiple['flag'] && floatval($cost_multiple['value']) ? true : false);
$monitor_flag['sales_multiple'] = ($sales_multiple['flag'] && floatval($sales_multiple['value']) ? true : false);
if($setting_is_monitor == 'true' && $monitor_flag['cost_multiple'])
{
//原始订单
$old_product_ids = $old_product_nums = array();
$temp = $this->get_product_list($old_item_list, true);
$old_product_ids = $temp['ids'];
$old_product_nums = $temp['nums'];
//现始订单
$new_product_ids = $new_product_nums = array();
$temp = $this->get_product_list($item_list);
$new_product_ids = $temp['ids'];
$new_product_nums = $temp['nums'];
//成本价_销售价监控
$old_price_monitor = $this->get_price_monitor($old_product_ids, $old_product_nums);
$new_price_monitor = $this->get_price_monitor($new_product_ids, $new_product_nums);
//成本价_销售价倍数
$old_price_monitor['cost'] = floatval($old_price_monitor['cost']) * floatval($cost_multiple['value']);
$old_price_monitor['cost'] = round($old_price_monitor['cost'], 2);
$new_price_monitor['cost'] = floatval($new_price_monitor['cost']) * floatval($cost_multiple['value']);
$new_price_monitor['cost'] = round($new_price_monitor['cost'], 2);
if($monitor_flag['sales_multiple'])
{
$old_price_monitor['price'] = floatval($old_price_monitor['price']) * floatval($sales_multiple['value']);
$old_price_monitor['price'] = round($old_price_monitor['price'], 2);
$new_price_monitor['price'] = floatval($new_price_monitor['price']) * floatval($sales_multiple['value']);
$new_price_monitor['price'] = round($new_price_monitor['price'], 2);
}
//未设置成本价的商品货号
if(!empty($old_price_monitor['invalid']))
{
$old_price_monitor['bn'] = $this->get_invalid_bn($old_price_monitor['invalid']);
$old_price_monitor['bn'] = implode(',', $old_price_monitor['bn']);
}
if(!empty($new_price_monitor['invalid']))
{
$new_price_monitor['bn'] = $this->get_invalid_bn($new_price_monitor['invalid']);
$new_price_monitor['bn'] = implode(',', $new_price_monitor['bn']);
}
//计算预计盈亏
$order_profit['old']['value'] = ($order_old['total_amount'] - $old_price_monitor['cost']);
$order_profit['new']['value'] = ($order['total_amount'] - $new_price_monitor['cost']);
$order_profit['new']['msg'] = ($order_profit['new']['value'] < 0 ? '不通过' : '通过');
}
$datalist = array();
$datalist['order_profit'] = $order_profit;
$datalist['old_price_monitor'] = $old_price_monitor;
$datalist['new_price_monitor'] = $new_price_monitor;
$datalist['monitor_flag'] = $monitor_flag;
$datalist['setting_is_monitor'] = $setting_is_monitor;
$datalist['order_old'] = $order_old;
$datalist['order_new'] = $order;
return $datalist;
}
/**
+----------------------------------------------------------
* 订单回滚[恢复复审前订单信息]
+----------------------------------------------------------
* @param intval $retrial_id 复审ID
* @param intval $order_id 订单ID
* return Array
+----------------------------------------------------------
*/
public function rollback_order($retrial_id, $order_id)
{
#订单信息[现在的]
$oOrder = app::get('ome')->model('orders');
$now_order = $oOrder->dump($order_id);
$now_order['item_list'] = $oOrder->getItemBranchStore($order_id);
#订单快照[原始的]
$order_old = array();
$oSnapshot = app::get('ome')->model('order_retrial_snapshot');
$order_old = $oSnapshot->getList('*', array('retrial_id'=>$retrial_id, 'order_id'=>$order_id), 0, 1);
$order_old = $order_old[0];
if(empty($order_old))
{
return false;
}
$order_old = unserialize($order_old['order_detail']);
#数据对比
$is_address_change = false;//地址是否变更
$is_order_change = false;//是否需要修改
//收货人信息
$consignee = array_diff_assoc($order_old['consignee'], $now_order['consignee']);
if (!empty($consignee)){
$is_address_change = true;
}
//修改订单折扣金额[是否编辑过商品]
if (strval($order_old['discount']) != strval($now_order['discount'])){
$is_order_change = true;
}
#订单信息[更新]
$new_order = array();
$new_order['order_id'] = $order_id;
$new_order['cost_item'] = $order_old['cost_item'];
$new_order['pmt_goods'] = $order_old['pmt_goods'];
$new_order['total_amount'] = $order_old['total_amount'];
$new_order['discount'] = $order_old['discount'];
$new_order['cur_amount'] = $order_old['cur_amount'];
$new_order['old_amount'] = $order_old['total_amount'];
$new_order['confirm'] = $order_old['confirm'];
$new_order['consignee'] = $order_old['consignee'];
$new_order['is_modify'] = $order_old['is_modify'];
$new_order['shipping']['cost_shipping'] = $order_old['shipping']['cost_shipping'];
//复审自定义设置[更新]
$new_order['process_status'] = 'unconfirmed';
$new_order['abnormal'] = 'false';
$new_order['pause'] = 'false';
$new_order['confirm'] = 'N';
//还原订单确认组、确认人属性
$new_order['group_id'] = $order_old['group_id'];
$new_order['op_id'] = $order_old['op_id'];
//更新order
$oOrder->save($new_order);
/**
+----------------------------------------------------------
| [更新]订单对象表、订单商品表
+----------------------------------------------------------
*/
$del_ids = array();
$sql = "select oi.item_id,o.obj_id,o.obj_type,o.quantity,oi.bn,oi.product_id,oi.nums,oi.delete from `". DB_PREFIX ."ome_order_objects` o
left join `". DB_PREFIX ."ome_order_items` oi on o.obj_id = oi.obj_id where o.order_id = '".$order_id."'";
$obj_items = kernel::database()->select($sql);
if($obj_items)
{
foreach ($obj_items as $key => $val)
{
$item_id = $val['item_id'];
$obj_id = $val['obj_id'];
$del_ids['objects'][$obj_id] = $obj_id;
$del_ids['items'][$item_id] = $item_id;
}
}
# [删除现在的]订单对象表、订单商品表
if(!empty($del_ids['objects']))
{
$sql = "DELETE FROM ". DB_PREFIX ."ome_order_objects WHERE obj_id in(".implode(',', $del_ids['objects']).")";
kernel::database()->exec($sql);
}
if(!empty($del_ids['items']))
{
$sql = "DELETE FROM ". DB_PREFIX ."ome_order_items WHERE item_id in(".implode(',', $del_ids['items']).")";
kernel::database()->exec($sql);
}
#回滚订单快照[新增订单对象表、订单商品表 && 重新加载库存]
$oObjects = app::get('ome')->model('order_objects');
$oItems = app::get('ome')->model('order_items');
foreach ($order_old['item_list'] as $key => $obj_item)
{
foreach ($obj_item as $key_j => $items)
{
//新增订单对象表
$obj_data = array(
'order_id' => $items['order_id'],
'obj_type' => $items['obj_type'],
'obj_alias' => $items['obj_alias'],
'shop_goods_id' => $items['shop_goods_id'],
'goods_id' => $items['goods_id'],
'bn' => $items['bn'],
'name' => $items['name'],
'price' => $items['price'],
'amount' => $items['amount'],
'quantity' => $items['quantity'],
'weight' => $items['weight'],
'score' => $items['score'],
'pmt_price' => $items['pmt_price'],
'sale_price' => $items['sale_price'],
'oid' => $items['oid'],
'is_oversold' => $items['is_oversold'],
);
$obj_id = $oObjects->insert($obj_data);
foreach ($items['order_items'] as $key_k => $item)
{
//新增订单商品表
$item_data = array(
'order_id' => $item['order_id'],
'obj_id' => $obj_id,//关联
'shop_goods_id' => $item['shop_goods_id'],
'product_id' => $item['product_id'],
'shop_product_id' => $item['shop_product_id'],
'bn' => $item['bn'],
'name' => $item['name'],
'cost' => $item['cost'],
'price' => $item['price'],
'pmt_price' => $item['pmt_price'],
'sale_price' => $item['sale_price'],
'amount' => $item['amount'],
'weight' => $item['weight'],
'nums' => $item['nums'],
'sendnum' => $item['sendnum'],
'addon' => $item['addon'],
'item_type' => $item['item_type'],
'delete' => $item['delete'],
);
$item_id = $oItems->insert($item_data);
}
}
}
#订单关联信息[更新]
//调用公共方法更改订单支付状态(货到付款订单不进行支付状态的变更)
if ($new_order['shipping']['is_cod'] != 'true') {
kernel::single('ome_order_func')->update_order_pay_status($order_id, true, __CLASS__.'::'.__FUNCTION__);
}
//修改交易收货人信息API
if ($is_address_change == true){
if ($service_order = kernel::servicelist('service.order')){
foreach($service_order as $object=>$instance){
if(method_exists($instance, 'update_shippinginfo')){
$instance->update_shippinginfo($order_id);
}
}
}
}
//订单编辑API
if ($is_order_change == true){
if ($service_order = kernel::servicelist('service.order')){
foreach($service_order as $object=>$instance){
if(method_exists($instance, 'update_order')){
$instance->update_order($order_id);
}
}
}
}
//订单恢复状态同步
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');
}
}
}
# [复审的]订单快照保存
$now_order['mark_text'] = unserialize($now_order['mark_text']);
$now_order['custom_mark'] = unserialize($now_order['custom_mark']);
$now_order['dateline'] = time();
$data = array('new_order_detail' => $now_order);
$filter = array('retrial_id' => $retrial_id, 'order_id' => $order_id);
$oSnapshot->update($data, $filter);
# [更新]复审订单状态[不能使用'save']
$sql = "UPDATE ". DB_PREFIX ."ome_order_retrial SET order_id='".$order_id."', status='3' WHERE id='".$retrial_id."'";
kernel::database()->exec($sql);
# [更新]订单异常表状态
$this->update_abnormal($order_id);
# [恢复]到原始订单的冻结库存
$this->recover_stock_freeze($retrial_id);
//写日志
$oOperation_log = app::get('ome')->model('operation_log');
$oOperation_log->write_log('order_retrial@ome', $order_id, '通过复审订单快照回滚到上一次订单信息。');
return true;
}
/**
+----------------------------------------------------------
* 增加复审订单
+----------------------------------------------------------
* @param Array $old_order 原始订单
* return Array
+----------------------------------------------------------
*/
public function add_retrial($old_order)
{
#获取订单复审配置
$setting_is_retrial = app::get('ome')->getConf('ome.order.is_retrial');//开启复审
$setting_retrial = app::get('ome')->getConf('ome.order.retrial');//复审规则
if($setting_is_retrial != 'true')
{
return false;//跳出
}
$op_id = kernel::single('desktop_user')->get_id();
#修改
$is_address_change = $old_order['is_address_change'];//配置地址是否变更
$is_order_change = $old_order['is_order_change'];//订单金额是否变更
$is_goods_modify = $old_order['is_goods_modify'];//商品是否变更
#进入复审
$retrial_flag = 0;
$retrial_msg = array();
if($setting_retrial['product'] && $is_goods_modify)
{
$retrial_flag++;
$retrial_msg[] = '商品数量';
}
if($setting_retrial['order'] && $is_order_change)
{
$retrial_flag++;
$retrial_msg[] = '订单金额';
}
if($setting_retrial['delivery'] && $is_address_change)
{
$retrial_flag++;
$retrial_msg[] = '配送信息';
}
if($retrial_flag == 0)
{
return false;//跳出复审
}
#历史订单
$order_id = $old_order['order_id'];
$kefu_remarks = $old_order['kefu_remarks'];//客服修改备注
$old_order['mark_text'] = unserialize($old_order['mark_text']);
$old_order['custom_mark'] = unserialize($old_order['custom_mark']);
//改变订单状态为"异常状态"&"复审"
$retrial_msg = implode('、', $retrial_msg);
$retrial_msg = $kefu_remarks.' [修改了'.$retrial_msg.'] 订单进入待复审。';
#获取订单是否未复审通过
$oRetrial = app::get('ome')->model('order_retrial');
$retrial_row = $oRetrial->getList('id, retrial_type', array('order_id'=>$order_id, 'status'=>'2'));
$retrial_row = $retrial_row[0];
if(!empty($retrial_row))
{
# [更新]复审数据
$retrial_arr = array();
$retrial_arr['id'] = $retrial_row['id'];
$retrial_arr['retrial_type'] = 'normal';//审核类型
$retrial_arr['status'] = 0;//待审核
$retrial_arr['kefu_remarks'] = $kefu_remarks;
$retrial_arr['lastdate'] = time();
$sql = "UPDATE ". DB_PREFIX ."ome_order_retrial SET retrial_type='normal', status='0', kefu_remarks='".$kefu_remarks."',
lastdate='".time()."' WHERE id='".$retrial_row['id']."'";
kernel::database()->exec($sql);
$retrial_id = $retrial_row['id'];
}
else
{
# [设置]为订单异常
$oAbnormal = app::get('ome')->model('abnormal');
$abnoram_row = $oAbnormal->getList('abnormal_id, abnormal_type_id, is_done', array('order_id'=>$order_id), 0, 1);
$abnoram_row = $abnoram_row[0];
if(!empty($abnoram_row))
{
$abnoram_row['abnormal_type_id'] = '9';
$abnoram_row['is_done'] = 'false';
$abnoram_row['abnormal_memo'] = htmlspecialchars($retrial_msg);
$abnormal_type_name = app::get('ome')->model('abnormal_type')->dump(array('type_id'=>$abnoram_row['abnormal_type_id']),'type_name');
$abnoram_row['abnormal_type_name'] = $abnormal_type_name['type_name'];
$op_name = kernel::single('desktop_user')->get_name();
$abnormal_memo[] = array('op_name'=>$op_name, 'op_time'=>date('Y-m-d H:i',time()), 'op_content'=>$abnoram_row['abnormal_memo']);
$abnoram_row['abnormal_memo'] = serialize($abnormal_memo);
$oAbnormal->save($abnoram_row);
}
else
{
$oOrder = app::get('ome')->model('orders');
$abnormal_data = array();
$abnormal_data['order_id'] = $order_id;
$abnormal_data['op_id'] = $old_order['op_id'];
$abnormal_data['group_id'] = $old_order['group_id'];
$abnormal_data['abnormal_type_id'] = 9;//订单异常类型
$abnormal_data['is_done'] = 'false';
$abnormal_data['abnormal_memo'] = $retrial_msg;
$oOrder->set_abnormal($abnormal_data);
}
# [增加]复审数据
$retrial_arr = array();
$retrial_arr['order_id'] = $order_id;
$retrial_arr['order_bn'] = $old_order['order_bn'];
$retrial_arr['retrial_type'] = 'normal';//审核类型
$retrial_arr['status'] = 0;//待审核
$retrial_arr['kefu_remarks'] = $kefu_remarks;
$retrial_arr['dateline'] = time();
$retrial_arr['lastdate'] = time();
$retrial_arr['op_id'] = $op_id;//操作员
$retrial_id = $oRetrial->insert($retrial_arr);
# [原订单]库存冻结保存
$record = $this->record_stock_freeze($old_order['item_list'], $retrial_id, true);
}
# [快照]存储原始订单信息_log
$oSnapshot = app::get('ome')->model('order_retrial_snapshot');
$data = array(
'retrial_id' => $retrial_id,
'order_id' => $order_id,
'order_detail' => $old_order,
'dateline' => time(),
);
$oSnapshot->save($data);
#如有退款申请单设置为disabled='true'
$oRefund = app::get('ome')->model('refund_apply');
$refunddata = $oRefund->getList('apply_id', array('order_id'=>$order_id, 'status'=>'0'), 0, 1);
if(!empty($refunddata[0]['apply_id']))
{
$oRefund->update(array('disabled'=>'true'), array('apply_id'=>$refunddata[0]['apply_id']));
}
//写日志
$oOperation_log = app::get('ome')->model('operation_log');
$oOperation_log->write_log('order_retrial@ome', $order_id, $retrial_msg);
return $retrial_id;
}
/**
+----------------------------------------------------------
* 保存库存冻结记录[复审订单编辑]
+----------------------------------------------------------
* @param Array $productList
* @param intval $retrial_id[复审id]
* @param boolean $first[是否首次记录]
* return Array
+----------------------------------------------------------
*/
public function record_stock_freeze($item_list, $retrial_id, $first=false)
{
//订单信息
$sql = "SELECT b.order_id, b.shop_id, b.order_bn FROM sdb_ome_order_retrial AS a LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.id=". $retrial_id;
$orderRow = $this->db->selectrow($sql);
$order_id = $orderRow['order_id'];
$shop_id = $orderRow['shop_id'];
//订单明细
$product_list = array();
foreach ($item_list as $key => $obj_item)
{
foreach ($obj_item as $key_j => $items)
{
foreach ($items['order_items'] as $key_k => $item)
{
$product_id = $item['product_id'];
$goods_id = $items['goods_id'];
$product_list[$product_id] = array(
'retrial_id'=>$retrial_id,
'order_id'=>$item['order_id'],
'edit_num'=>0,
'is_old'=>($first ? 'true' : 'false'),
'status'=>($item['delete']=='true' ? 'delete' : 'normal'),
'product_id'=>$product_id,
'goods_id'=>$goods_id,
'bn'=>$item['bn'],
'buy_num'=>$item['quantity'],
'up_num'=>0,
'diff_num'=>0,
'add_num'=>0,
'dateline'=>time(),
'delete'=>$item['delete'],
);
}
}
}
if(empty($product_list))
{
return false;
}
$oFreeze = app::get('ome')->model('order_retrial_store_freeze');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
#原始订单的冻结库存保存
if($first)
{
foreach ($product_list as $key => $val)
{
$oFreeze->insert($val);
}
return true;
}
#上次修改的标记号
$filter = array('retrial_id'=>$retrial_id);
$freeze_row = $oFreeze->getList('sid, edit_num', $filter, 0, 1, 'edit_num DESC');
$edit_num = intval($freeze_row[0]['edit_num']);
#获取上次订单详细
$history_freeze = array();
if($edit_num > 0)
{
$result = $this->up_stock_freeze($retrial_id);
$history_freeze = $result['buy_num'];
$last_product = $result['data'];
}
#原始订单购买商品详情
$filter['edit_num'] = 0;
$temp = $oFreeze->getList('*', $filter, 0, -1);
$freeze_list = array();
foreach ($temp as $key => $val)
{
$product_id = $val['product_id'];
$freeze_list[$product_id] = $val;
if(empty($history_freeze))
{
$history_freeze[$product_id] = $val['buy_num'];//购买数量
}
}
#本次购买商品详情
uasort($product_list, [kernel::single('console_iostockorder'), 'cmp_productid']);
$branchBatchList = [];
foreach($product_list as $key => $val)
{
$val['edit_num'] = 1;//修改的标记号
$val['is_old'] = ($freeze_list[$key] ? 'true' : 'false');
$val['is_del'] = ($val['delete'] == 'true' ? 'true' : 'false');
$val['up_num'] = ($history_freeze[$key] ? $history_freeze[$key] : 0);//上一次购买数量
if($val['delete'] == 'true' && $freeze_list[$key])
{
$val['diff_num'] = ($val['buy_num'] - $freeze_list[$key]['buy_num']);
$val['status'] = 'delete';
}
elseif($freeze_list[$key] && ($freeze_list[$key]['buy_num'] != $val['buy_num']))
{
$val['diff_num'] = ($val['buy_num'] - $freeze_list[$key]['buy_num']);
$val['status'] = 'edit';
}
elseif(empty($freeze_list[$key]))
{
$val['diff_num'] = $val['buy_num'];
$val['status'] = 'add';
}
//增加_删除的原订单库存
if($val['is_old'] == 'true')
{
$product_id = $val['product_id'];
$goods_id = $val['goods_id'];
$old_buy_num = intval($freeze_list[$key]['buy_num']);//原订单购买量
$last_buy_num = intval($val['up_num']);//上次购买量
$now_buy_num = intval($val['buy_num']);//本次购买量
$diff_buy_num = $old_buy_num - $now_buy_num;
$diff_up_num = $old_buy_num - $last_buy_num;
if($val['status'] == 'delete')
{
#上一次为删除状态
if($last_product[$key]['status'] == 'delete')
{
}
elseif($last_buy_num < $old_buy_num)
{
$freezeData = [];
$freezeData['bm_id'] = $product_id;
$freezeData['sm_id'] = $goods_id;
$freezeData['obj_type'] = material_basic_material_stock_freeze::__ORDER;
$freezeData['bill_type'] = 0;
$freezeData['obj_id'] = $order_id;
$freezeData['shop_id'] = $shop_id;
$freezeData['branch_id'] = 0;
$freezeData['bmsq_id'] = material_basic_material_stock_freeze::__SHARE_STORE;
$freezeData['num'] = $last_buy_num;
$freezeData['obj_bn'] = $orderRow['order_bn'];
$branchBatchList['+'][] = $freezeData;
}
else
{
$freezeData = [];
$freezeData['bm_id'] = $product_id;
$freezeData['sm_id'] = $goods_id;
$freezeData['obj_type'] = material_basic_material_stock_freeze::__ORDER;
$freezeData['bill_type'] = 0;
$freezeData['obj_id'] = $order_id;
$freezeData['shop_id'] = $shop_id;
$freezeData['branch_id'] = 0;
$freezeData['bmsq_id'] = material_basic_material_stock_freeze::__SHARE_STORE;
$freezeData['num'] = $old_buy_num;
$freezeData['obj_bn'] = $orderRow['order_bn'];
$branchBatchList['+'][] = $freezeData;
}
}
elseif($val['status'] == 'edit')
{
#上一次为删除状态
if($last_product[$key]['status'] == 'delete')
{
//减去上次删除时,强制增加的
$branchBatchList['-'][] = [
'bm_id' => $product_id,
'sm_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' => $old_buy_num,
];
//
if($diff_buy_num > 0)
{
$freezeData = [];
$freezeData['bm_id'] = $product_id;
$freezeData['sm_id'] = $goods_id;
$freezeData['obj_type'] = material_basic_material_stock_freeze::__ORDER;
$freezeData['bill_type'] = 0;
$freezeData['obj_id'] = $order_id;
$freezeData['shop_id'] = $shop_id;
$freezeData['branch_id'] = 0;
$freezeData['bmsq_id'] = material_basic_material_stock_freeze::__SHARE_STORE;
$freezeData['num'] = $diff_buy_num;
$freezeData['obj_bn'] = $orderRow['order_bn'];
$branchBatchList['+'][] = $freezeData;
}
}
else
{
if($diff_buy_num > 0 && ($last_product[$key]['buy_num'] != $val['buy_num']))
{
$freezeData = [];
$freezeData['bm_id'] = $product_id;
$freezeData['sm_id'] = $goods_id;
$freezeData['obj_type'] = material_basic_material_stock_freeze::__ORDER;
$freezeData['bill_type'] = 0;
$freezeData['obj_id'] = $order_id;
$freezeData['shop_id'] = $shop_id;
$freezeData['branch_id'] = 0;
$freezeData['bmsq_id'] = material_basic_material_stock_freeze::__SHARE_STORE;
$freezeData['num'] = abs($diff_buy_num);
$freezeData['obj_bn'] = $orderRow['order_bn'];
$branchBatchList['+'][] = $freezeData;
}
//减去上一次强制增加的库存
if($diff_up_num > 0)
{
$branchBatchList['-'][] = [
'bm_id' => $product_id,
'sm_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' => $diff_up_num,
];
}
}
}
}
$product_list[$key] = $val;
}
$basicMStockFreezeLib->freezeBatch($branchBatchList['+'], __CLASS__.'::'.__FUNCTION__, $err);
$basicMStockFreezeLib->unfreezeBatch($branchBatchList['-'], __CLASS__.'::'.__FUNCTION__, $err);
#保存冻结库存[复审订单商品]
foreach ($product_list as $key => $val)
{
$oFreeze->insert($val);
}
return true;
}
/**
+----------------------------------------------------------
* 获取上次订单的冻结库存[并删除上次记录]
+----------------------------------------------------------
* @param intval $retrial_id
* @param boolean $rollback 回滚订单
* return
+----------------------------------------------------------
*/
public function up_stock_freeze($retrial_id)
{
$oFreeze = app::get('ome')->model('order_retrial_store_freeze');
$filter = array('retrial_id'=>$retrial_id, 'edit_num|than'=>'0');
#计算[冻结库存]
$freeze_list = $oFreeze->getList('*', $filter, 0, -1);
if(empty($freeze_list))
{
return false;
}
#记录上次购买量
$result = array();
foreach ($freeze_list as $key => $val)
{
$product_id = $val['product_id'];
$result['buy_num'][$product_id] = $val['buy_num'];
$result['data'][$product_id] = $val;
}
#删除上一次库存记录
$del_sql = "DELETE FROM ". DB_PREFIX ."ome_order_retrial_store_freeze WHERE retrial_id ='".$retrial_id."' AND edit_num > 0";
$this->db->exec($del_sql);
return $result;
}
/**
+----------------------------------------------------------
* [恢复到原始订单]还原冻结库存
+----------------------------------------------------------
* @param intval $retrial_id
* return Array
+----------------------------------------------------------
*/
public function recover_stock_freeze($retrial_id)
{
$oFreeze = app::get('ome')->model('order_retrial_store_freeze');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//订单信息
$sql = "SELECT b.order_id, b.shop_id FROM sdb_ome_order_retrial AS a LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.id=". $retrial_id;
$orderRow = $this->db->selectrow($sql);
$order_id = $orderRow['order_id'];
$shop_id = $orderRow['shop_id'];
//显示的字段
$fields = 'product_id, edit_num, status, is_old, is_del, buy_num, up_num, add_num';
#编辑后的商品冻结库存
$filter = array('retrial_id'=>$retrial_id, 'edit_num|than'=>'0');
$freeze_list = $oFreeze->getList($fields, $filter, 0, -1);
if(empty($freeze_list))
{
return false;
}
#原订单的商品冻结库存
$filter = array('retrial_id'=>$retrial_id, 'edit_num'=>'0');
$temp = $oFreeze->getList($fields, $filter, 0, -1);
$old_product = array();
foreach($temp as $key => $val)
{
$product_id = $val['product_id'];
$old_product[$product_id] = $val;
}
#计算[冻结库存]
$num = 0;
uasort($freeze_list, [kernel::single('console_iostockorder'), 'cmp_productid']);
$branchBatchList = [];
foreach ($freeze_list as $key => $val)
{
$product_id = $val['product_id'];
$goods_id = 0; // 复审订单没有存goods_id或者order_objects的信息
$buy_num = intval($val['buy_num']);
$up_num = intval($val['up_num']);
$old_num = intval($old_product[$product_id]['buy_num']);//原商品购买数量
if($val['is_old'] == 'true')
{
$num = $buy_num - $old_num;
if($val['status'] == 'edit' && $num > 0)
{
$branchBatchList[] = [
'bm_id' => $product_id,
'sm_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' => abs($num),
];
}
}
else
{
if($val['is_del'] == 'false' && $buy_num > 0)
{
$branchBatchList[] = [
'bm_id' => $product_id,
'sm_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' => abs($buy_num),
];
}
}
}
$basicMStockFreezeLib->unfreezeBatch($branchBatchList, __CLASS__.'::'.__FUNCTION__, $err);
$oFreeze->delete(array('retrial_id'=>$retrial_id));//清空库存记录
return true;
}
/**
+----------------------------------------------------------
* [审核通过]使用现在的冻结库存
+----------------------------------------------------------
* @param intval $retrial_id
* return Array
+----------------------------------------------------------
*/
public function confirm_stock_freeze($retrial_id)
{
$oFreeze = app::get('ome')->model('order_retrial_store_freeze');
$basicMStockFreezeLib = kernel::single('material_basic_material_stock_freeze');
//订单信息
$sql = "SELECT b.order_id, b.shop_id FROM sdb_ome_order_retrial AS a LEFT JOIN sdb_ome_orders AS b ON a.order_id=b.order_id WHERE a.id=". $retrial_id;
$orderRow = $this->db->selectrow($sql);
$order_id = $orderRow['order_id'];
$shop_id = $orderRow['shop_id'];
//显示的字段
$fields = 'product_id, edit_num, status, is_old, is_del, buy_num, up_num, add_num';
#编辑后的商品冻结库存
$filter = array('retrial_id'=>$retrial_id, 'edit_num|than'=>'0');
$freeze_list = $oFreeze->getList($fields, $filter, 0, -1);
if(empty($freeze_list))
{
return false;
}
#原订单的商品冻结库存
$filter = array('retrial_id'=>$retrial_id, 'edit_num'=>'0');
$temp = $oFreeze->getList($fields, $filter, 0, -1);
$old_product = array();
foreach($temp as $key => $val)
{
$product_id = $val['product_id'];
$old_product[$product_id] = $val;
}
#计算[冻结库存]
$num = 0;
uasort($freeze_list, [kernel::single('console_iostockorder'), 'cmp_productid']);
$branchBatchList = [];
foreach ($freeze_list as $key => $val)
{
$product_id = $val['product_id'];
$goods_id = 0; // 复审订单没有存goods_id或者order_objects的信息
$buy_num = intval($val['buy_num']);
$up_num = intval($val['up_num']);
$old_num = intval($old_product[$product_id]['buy_num']);//原商品购买数量
if($val['is_old'] == 'true')
{
$num = $buy_num - $old_num;
if($val['status'] == 'edit' && $num < 0)
{
$branchBatchList[] = [
'bm_id' => $product_id,
'sm_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' => abs($num),
];
}
elseif($val['status'] == 'delete' && $old_num > 0)
{
$branchBatchList[] = [
'bm_id' => $product_id,
'sm_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' => abs($old_num),
];
}
}
}
$basicMStockFreezeLib->unfreezeBatch($branchBatchList, __CLASS__.'::'.__FUNCTION__, $err);
$oFreeze->delete(array('retrial_id'=>$retrial_id));//清空库存记录
return true;
}
/**
+----------------------------------------------------------
* 更新订单异常表[ome_abnormal]状态
+----------------------------------------------------------
* @param intval $order_id 订单ID
* return Array
+----------------------------------------------------------
*/
function update_abnormal($order_id)
{
$oAbnormal = app::get('ome')->model('abnormal');
$result = $oAbnormal->getList('abnormal_id, abnormal_type_id, is_done', array('order_id'=>$order_id), 0, 1);
$result = $result[0];
if(!empty($result))
{
if($result['abnormal_type_id'] == '9')
{
$result['is_done'] = 'true';//已处理
}
else
{
$result['is_done'] = $result['is_done'];//还原复审前的异常状态
}
$oAbnormal->save($result);
return $result['abnormal_id'];
}
return false;
}
/**
+----------------------------------------------------------
* [监控]商品列表的成本价格
+----------------------------------------------------------
* @param Array $item_list
* @param Array $price_monitor
* @param Array $monitor_flag
* return Array
+----------------------------------------------------------
*/
public function monitor_item_list($item_list, $price_monitor, $monitor_flag)
{
foreach ($item_list as $key => $obj_item)
{
foreach ($obj_item as $key_j => $items)
{
$count_cost = 0;
$count_price = 0;
foreach ($items['order_items'] as $key_k => $item)
{
$item_id = $item['item_id'];
$product_id = $item['product_id'];
#成本价[监控倍数]
if($monitor_flag['cost_multiple'])
{
$price_monitor[$product_id]['cost'] = floatval($price_monitor[$product_id]['cost']) * floatval($monitor_flag['cost_value']);
$price_monitor[$product_id]['cost'] = round($price_monitor[$product_id]['cost'], 2);
}
#销售价[监控倍数]
if($monitor_flag['sales_multiple'])
{
$price_monitor[$product_id]['price'] = floatval($price_monitor[$product_id]['price']) * floatval($monitor_flag['sales_value']);
$price_monitor[$product_id]['price'] = round($price_monitor[$product_id]['price'], 2);
}
$item_list[$key][$key_j]['order_items'][$key_k]['product_cost'] = $price_monitor[$product_id]['cost'];
$item_list[$key][$key_j]['order_items'][$key_k]['product_price'] = $price_monitor[$product_id]['price'];
$item_list[$key][$key_j]['order_items'][$key_k]['flag_cost'] = 'true';
$item_list[$key][$key_j]['order_items'][$key_k]['flag_price'] = 'true';
#成本价
if($price_monitor[$product_id]['cost'] <= 0)
{
$item_list[$key][$key_j]['order_items'][$key_k]['flag_cost'] = 'false';//未设置成本价
}
else
{
$count_cost += $price_monitor[$product_id]['cost'];
}
#销售价
if($price_monitor[$product_id]['price'] <= 0)
{
$item_list[$key][$key_j]['order_items'][$key_k]['flag_price'] = 'false';//未设置销售价
}
else
{
$count_price += $price_monitor[$product_id]['price'];
}
}
$obj_id = $item['obj_id'];
$item_list[$key][$key_j]['product_cost'] = $count_cost;
$item_list[$key][$key_j]['product_price'] = $count_price;
}
}
return $item_list;
}
/**
+----------------------------------------------------------
* [获取]订单信息&&价格监控
+----------------------------------------------------------
* @param intval $order_id
* return Array
+----------------------------------------------------------
*/
public function get_order_monitor($order_id)
{
#订单详细信息
$order = array();
$oOrder = app::get('ome')->model('orders');
$order = $oOrder->dump($order_id);
#配送地区
$areaArr = explode(':', $order['consignee']['area']);
$areaArr = $areaArr[1];
$order['consignee']['ship_area'] = str_replace('/', ' ', $areaArr);
#订单备注mark_text&&客户备注custom_mark
$order['custom_mark'] = unserialize($order['custom_mark']);
if ($order['custom_mark'])
foreach ($order['custom_mark'] as $k=>$v){
if (!strstr($v['op_time'], "-")){
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
$order['custom_mark'][$k]['op_time'] = $v['op_time'];
}
}
$order['mark_text'] = unserialize($order['mark_text']);
if ($order['mark_text'])
foreach ($order['mark_text'] as $k=>$v){
if (!strstr($v['op_time'], '-')){
$v['op_time'] = date('Y-m-d H:i:s',$v['op_time']);
$order['mark_text'][$k]['op_time'] = $v['op_time'];
}
}
#商品列表信息
$item_list = $oOrder->getItemBranchStore($order_id);
#价格监控[获取订单复审配置]
$setting_is_monitor = app::get('ome')->getConf('ome.order.is_monitor');//是否开启价格监控
$cost_multiple = app::get('ome')->getConf('ome.order.cost_multiple');//成本价倍数
$sales_multiple = app::get('ome')->getConf('ome.order.sales_multiple');//销售价倍数
$monitor_flag = array();
$monitor_flag['cost_multiple'] = ($cost_multiple['flag'] && floatval($cost_multiple['value']) ? true : false);
$monitor_flag['sales_multiple'] = ($sales_multiple['flag'] && floatval($sales_multiple['value']) ? true : false);
if($setting_is_monitor == 'true' && $monitor_flag['cost_multiple'])
{
$product_list = $this->get_product_list($item_list, true);
$product_ids = $product_list['ids'];
$product_nums = $product_list['nums'];
//成本价_销售价监控
$price_monitor = $this->get_price_monitor($product_ids, $product_nums, $item_list);
$price_monitor['cost'] = floatval($price_monitor['cost']) * floatval($cost_multiple['value']);
$price_monitor['cost'] = round($price_monitor['cost'], 2);
//未设置成本价的商品货号
if(!empty($price_monitor['invalid']))
{
$price_monitor['bn'] = $this->get_invalid_bn($price_monitor['invalid']);
$price_monitor['bn'] = implode(',', $price_monitor['bn']);
}
//计算预计盈亏
$order_profit['value'] = ($order['total_amount'] - $price_monitor['cost']);
$order_profit['msg'] = ($order_profit['value'] < 0 ? '不通过' : '通过');
//[监控]商品列表详细价格
$monitor_flag['cost_value'] = floatval($cost_multiple['value']);
$monitor_flag['sales_value'] = floatval($sales_multiple['value']);
$item_list = $this->monitor_item_list($item_list, $price_monitor['detail'], $monitor_flag);
}
$order['item_list'] = $item_list;
$datalist = array();
$datalist['order_profit'] = $order_profit;
$datalist['price_monitor'] = $price_monitor;
$datalist['monitor_flag'] = $monitor_flag;
$datalist['setting_is_monitor'] = $setting_is_monitor;
$datalist['order'] = $order;
return $datalist;
}
/**
+----------------------------------------------------------
* [订单编辑时]进行商品价格监控
+----------------------------------------------------------
* @param intval $product_ids 商品ID集
* return Array
+----------------------------------------------------------
*/
public function get_product_monitor($product_list, $total_amount=0)
{
#价格监控[获取订单复审配置]
$setting_is_monitor = app::get('ome')->getConf('ome.order.is_monitor');//是否开启价格监控
$cost_multiple = app::get('ome')->getConf('ome.order.cost_multiple');//成本价倍数
$sales_multiple = app::get('ome')->getConf('ome.order.sales_multiple');//销售价倍数
$monitor_flag = array();
$monitor_flag['cost_multiple'] = ($cost_multiple['flag'] && floatval($cost_multiple['value']) ? true : false);
$monitor_flag['sales_multiple'] = ($sales_multiple['flag'] && floatval($sales_multiple['value']) ? true : false);
if($setting_is_monitor == 'true' && $monitor_flag['cost_multiple'])
{
#成本价_销售价监控
$price_monitor = $this->get_price_monitor($product_list['ids'], $product_list['nums']);
$price_monitor['cost'] = floatval($price_monitor['cost']) * floatval($cost_multiple['value']);
$price_monitor['cost'] = round($price_monitor['cost'], 2);
#计算预计盈亏
$price_monitor['profit'] = ($total_amount - $price_monitor['cost']);
$price_monitor['message'] = ($price_monitor['profit'] < 0 ? '不通过' : '通过');
#未设置成本价的商品货号
if(!empty($price_monitor['invalid']))
{
$price_monitor['bn'] = $this->get_invalid_bn($price_monitor['invalid']);
$price_monitor['bn'] = implode('、', (array) $price_monitor['bn']);
}
return $price_monitor;
}
return false;
}
/**
+----------------------------------------------------------
* 复审订单关联的退款单操作sdb_ome_refund_apply
+----------------------------------------------------------
* @param intval $order_id 订单ID
* return Array
+----------------------------------------------------------
*/
function oper_ome_refund_apply($order_id, $verify='')
{
$oOrder = app::get('ome')->model('orders');
$detail = $oOrder->getList('order_id, order_bn, pay_status', array('order_id'=>$order_id), 0, 1);
$detail = $detail[0];
if($detail['pay_status'] != '6')
{
return false;
}
#查询是否有退款单
$oRefund = app::get('ome')->model('refund_apply');
$oRow = $oRefund->getList('apply_id, refund_apply_bn, status, disabled', array('order_id'=>$order_id), 0, 1);
$oRow = $oRow[0];
if($oRow['status'] != '0' && $oRow['disabled'] != 'true')
{
return false;//不是复审订单产生的退款单,则跳出
}
#审核通过后更新退款单disabled状态否则为删除退款单
$filter = array('apply_id' => $oRow['apply_id']);
$msg = '';
if($verify == 'success')
{
$oRefund->update(array('status'=>'0', 'disabled'=>'false'), $filter);//设为disabled有效状态
$oOrder->update(array('pause'=>'true'), array('order_id'=>$order_id));//退款申请中 将订单置为暂停
$msg = '订单复审通过,更新退款单号'.$oRow['refund_apply_bn'].'为有效状态;';
}
else
{
$oRefund->delete($filter);//删除退款单
$msg = ($verify == 'rollback' ? '订单复审回滚' : '订单复审未通过');
$msg .= ',删除退款单号'.$oRow['refund_apply_bn'];
}
//写日志
$oOperation_log = app::get('ome')->model('operation_log');
$oOperation_log->write_log('order_retrial@ome', $order_id, $msg);
return true;
}
}
?>