Files
OMS/app/ome/model/delivery.php
chenping 61783b7d01 1. 【新增】售后单售后原因类型支持搜索
2. 【新增】手工创建订单折扣可输入正数

3. 【优化】盘点申请单确认

4. 【修复】采购退货单模拟出库失败问题

5. 【新增】订单金额客户实付与结算金额

6. 【优化】仓库发货统计报表物料名称显示

7. 【优化】自有仓储虚拟发货逻辑

8. 【修复】基础物料分类管理问题
2026-04-01 11:59:17 +08:00

4628 lines
176 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
class ome_mdl_delivery extends dbeav_model
{
//public $filter_use_like = true;
public $has_many = array(
'delivery_items' => 'delivery_items',
'delivery_order' => 'delivery_order',
//'dly_items_pos' => 'dly_items_pos', TODO:和zhangxu确认是否需要
);
public $defaultOrder = array('delivery_id', ' ASC');
public $deliveryOrderModel = null;
/**
* 须加密字段
*
* @var string
**/
private $__encrypt_cols = array(
'ship_name' => 'simple',
'ship_tel' => 'phone',
'ship_mobile' => 'phone',
'ship_addr' => 'simple',
);
public function __construct($app)
{
if ($_GET['status'] == '0' || $_GET['status'] == '') {
$opInfo = kernel::single('ome_func')->getDesktopUser();
if (app::get('ome')->getConf('delivery.bycreatetime' . $opInfo['op_id']) == 1) {
$this->defaultOrder = array('order_createtime', ' ASC');
} else {
$this->defaultOrder = array('idx_split', ' ASC');
}
} else {
$this->defaultOrder = array('delivery_id', ' DESC');
}
parent::__construct($app);
}
public 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, 'delivery');
$baseWhere = $baseWhere ? array_merge((array)$baseWhere, (array)$tmpBaseWhere) : (array)$tmpBaseWhere;
//setting
$deliveryIds = array();
$where = '';
//filter
if (isset($filter['extend_delivery_id'])) {
//delivery_id
$tempDlyIds = array(0);
foreach($filter['extend_delivery_id'] as $extend_delivery_id)
{
$tempDlyIds[$extend_delivery_id] = $extend_delivery_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['extend_delivery_id']);
}
if (isset($filter['member_uname'])) {
$memberObj = $this->app->model("members");
$rows = $memberObj->getList('member_id', array('uname|has' => $filter['member_uname']));
$memberId[] = 0;
foreach ($rows as $row) {
$memberId[] = $row['member_id'];
}
$where .= ' AND member_id IN (' . implode(',', $memberId) . ')';
unset($filter['member_uname']);
}
//按订单号搜索
if (isset($filter['order_bn'])) {
// 多订单号查询
if(strpos($filter['order_bn'], "\n") !== false){
$filter['order_bn'] = array_unique(array_map('trim', array_filter(explode("\n", $filter['order_bn']))));
}
$orderObj = $this->app->model("orders");
$rows = $orderObj->getList('order_id', array('order_bn' => $filter['order_bn']));
$orderId[] = 0;
foreach ($rows as $row) {
$orderId[] = $row['order_id'];
}
$deliOrderObj = $this->app->model("delivery_order");
$rows = $deliOrderObj->getList('delivery_id', array('order_id' => $orderId));
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['order_bn']);
}
//[SKU基础物料号]多货号查询
if (isset($filter['material_bn'])){
if(strpos($filter['material_bn'], "\n") !== false){
$material_bns = array_unique(array_map('trim', array_filter(explode("\n", $filter['material_bn']))));
$filter['material_bn'] = $material_bns;
}
//search_delivery_items
$itemsObj = app::get('ome')->model("delivery_items");
$rows = $itemsObj->getDeliveryIdByPbn($filter);
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['material_bn']);
}
//[单个货号]按货号查询
if (isset($filter['product_bn'])) {
$where .= ' AND ' . $tPre . 'bnsContent like \'%' . $filter['product_bn'] . '%\'';
unset($filter['product_bn']);
}
//按条形码搜索
if (isset($filter['product_barcode'])) {
//search_delivery_items
$itemsObj = $this->app->model("delivery_items");
$rows = $itemsObj->getDeliveryIdByPbarcode($filter);
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
//unset
unset($filter['product_barcode']);
}
if (isset($filter['logi_no_ext'])) {
$logObj = $this->app->model("delivery_log");
$rows = $logObj->getDeliveryIdByLogiNO($filter['logi_no_ext']);
//delivery_id
$tempDlyIds = array(0);
foreach($rows as $row)
{
$temp_dly_id = $row['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['logi_no_ext']);
}
if (isset($filter['addonSQL'])) {
$where .= ' AND ' . $filter['addonSQL'];
unset($filter['addonSQL']);
}
if (isset($filter['delivery_ident'])) {
//delivery_id
$tempDlyIds = array(0);
$arr_delivery_ident = explode('_', $filter['delivery_ident']);
$mdl_queue = app::get('ome')->model("print_queue");
if (count($arr_delivery_ident) == 2) {
$ident_dly = array_pop($arr_delivery_ident);
$ident = implode('-', $arr_delivery_ident);
$queueItem = $mdl_queue->findQueueItem($ident, $ident_dly);
if ($queueItem) {
$temp_dly_id = $queueItem['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
} else {
if (1 == substr_count($filter['delivery_ident'], '-')) {
$queues = $mdl_queue->getList('dly_bns', array('ident|head' => $filter['delivery_ident']));
if ($queues) {
//$queue['dly_bns'] = implode(',', array_map('current', $queues));
$tempDlyIds = array_map('current', $queues);
}
} else {
//获取实际的打印批次号
$delivery_id = $mdl_queue->findQueueDeliveryId($filter['delivery_ident'], 'delivery_id');
if ($delivery_id) {
//$queue['dly_bns'] = $delivery_id;
$tempDlyIds = explode(',', $delivery_id);
}
}
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['delivery_ident']);
}
if (isset($filter['ship_tel_mobile'])) {
$where .= ' AND (ship_tel=\'' . $filter['ship_tel_mobile'] . '\' or ship_mobile=\'' . $filter['ship_tel_mobile'] . '\')';
unset($filter['ship_tel_mobile']);
}
if ($filter['todo'] == 1) {
$where .= " AND ({$tPre}stock_status='false' or {$tPre}expre_status='false' or {$tPre}deliv_status='false')";
unset($filter['todo']);
}
if ($filter['todo'] == 2) {
$where .= " AND ({$tPre}stock_status='false' or {$tPre}expre_status='false')";
unset($filter['todo']);
}
if ($filter['todo'] == 3) {
$where .= " AND ({$tPre}expre_status='false' or {$tPre}deliv_status='false')";
unset($filter['todo']);
}
if ($filter['todo'] == 4) {
$where .= " AND {$tPre}expre_status='false'";
unset($filter['todo']);
}
if (isset($filter['print_finish'])) {
$where_or = array();
foreach ((array) $filter['print_finish'] as $key => $value) {
$or = "(deli_cfg='" . $key . "'";
switch ($value) {
case '1_1':
$or .= " AND {$tPre}stock_status='true' AND {$tPre}deliv_status='true' ";
break;
case '1_0':
$or .= " AND {$tPre}stock_status='true' ";
break;
case '0_1':
$or .= " AND {$tPre}deliv_status='true' ";
break;
case '0_0':
break;
}
$or .= ')';
$where_or[] = $or;
}
if ($where_or) {
$where .= ' AND (' . implode(' OR ', $where_or) . ')';
}
unset($filter['print_finish']);
}
if (isset($filter['ext_branch_id'])) {
if (isset($filter['branch_id'])) {
$filter['branch_id'] = array_intersect((array) $filter['branch_id'], (array) $filter['ext_branch_id']);
$filter['branch_id'] = $filter['branch_id'] ? $filter['branch_id'] : 'false';
} else {
$filter['branch_id'] = $filter['ext_branch_id'];
}
unset($filter['ext_branch_id']);
}
if (isset($filter['no_logi_no']) && $filter['no_logi_no'] == 'NULL') {
$where .= "AND {$tPre}logi_no is null";
unset($filter['no_logi_no']);
}
//客服备注
if (isset($filter['mark_text'])) {
$mark_text = $filter['mark_text'];
$sql = "SELECT do.delivery_id FROM sdb_ome_delivery_order do JOIN sdb_ome_orders o ON do.order_id=o.order_id and o.process_status='splited' and o.mark_text like " . "'%{$mark_text}%'";
$_rows = $this->db->select($sql);
if (!empty($_rows)) {
$tempDlyIds = array(0);
foreach ($_rows as $_orders)
{
$temp_dly_id = $_orders['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['mark_text']);
}
}
//买家留言
if (isset($filter['custom_mark'])) {
$custom_mark = $filter['custom_mark'];
$sql = "SELECT do.delivery_id FROM sdb_ome_delivery_order do JOIN sdb_ome_orders o ON do.order_id=o.order_id and o.process_status='splited' and o.custom_mark like " . "'%{$custom_mark}%'";
$_rows = $this->db->select($sql);
if (!empty($_rows)) {
$tempDlyIds = array(0);
foreach ($_rows as $_orders)
{
$temp_dly_id = $_orders['delivery_id'];
$tempDlyIds[$temp_dly_id] = $temp_dly_id;
}
//intersection
if(empty($deliveryIds)){
$deliveryIds = $tempDlyIds;
}else{
$deliveryIds = array_intersect($deliveryIds, $tempDlyIds);
}
unset($filter['custom_mark']);
}
}
//delivery_ids
if($deliveryIds){
$where .= " AND delivery_id IN (". implode(',', $deliveryIds) .")";
}
return parent::_filter($filter, $tableAlias, $baseWhere) . $where;
}
public function getParentIdBybn($delivery_bn)
{
$sql = 'SELECT parent_id from sdb_ome_delivery WHERE parent_id>0 and delivery_bn like \'%' . $delivery_bn . '%\' GROUP BY parent_id';
$rows = $this->db->select($sql);
return $rows;
}
/**
* 取得物流公司名称
*/
public function getLogi_name()
{
$sql = " SELECT logi_id,logi_name FROM sdb_ome_delivery GROUP BY logi_id ";
$row = $this->db->select($sql);
return $row;
}
/**
* 判断是否已有此物流单号,检验前物流单号可以任意修改
*
* @param string $logi_no
* @param int $dly_id
* @return boolean
*/
public function existExpressNo($logi_no, $dly_id = 0)
{
if ($logi_no) {
$count = $this->db->selectRow('select delivery_id from sdb_ome_delivery where logi_no="' . $logi_no . '" AND `status` in(\'progress\',\'succ\',\'progress\',\'ready\',\'stop\',\'failed\')');
//检测delivery_bill是否存在快递单号 wujian@shopex.cn 2012年3月13日
$billrow = $this->db->selectRow('select delivery_id from sdb_ome_delivery_bill where logi_no="' . $logi_no . '"');
if (($count && $count['delivery_id'] != $dly_id) || $billrow) {
unset($count);
unset($billrow);
return true;
}
}
}
/**
* 判断是否已有此物流单号,检验前物流单号可以任意修改(反向检测)
* wujian@shopex.cn
* 2012年3月22日
*/
public function existExpressNoBill($logi_no, $dly_id = 0, $billid = 0)
{
//更新conut走架构
$filter['logi_no'] = $logi_no;
$filter['delivery_id|noequal'] = $dly_id; //不等于见dbeavfilter
$filter['verify'] = 'true';
$filter['status'] = array('progress', 'succ');
$count = $this->count($filter);
//检测delivery_bill是否存在快递单号 wujian@shopex.cn 2012年3月13日
$billrow = $this->db->selectRow('select * from sdb_ome_delivery_bill where log_id!=' . $billid . ' and logi_no="' . $logi_no . '"');
if ($count > 0 || $billrow) {
return true;
} else {
return false;
}
}
/**
* 判断发货单是否已合并过,
*
* @param array() $dly_ids
* @return boolean
*/
public function existIsMerge($dly_ids)
{
$ids = implode(',', $dly_ids);
//更新conut走架构
$filter['delivery_id|in'] = $ids;
$filter['parent_id|noequal'] = 0;
$count = $this->count($filter);
if ($count > 0) {
return true;
}
return false;
}
/**
* 判断发货单是否为合并后的发货单
*
* @param array() $dly_ids
* @return boolean
*/
public function existIsMerge_parent($dly_id)
{
$sql = "SELECT is_bind FROM sdb_ome_delivery where delivery_id = {$dly_id}";
$row = $this->db->select($sql);
if ($row[0]['is_bind'] == 'true') {
return true;
} else {
return false;
}
}
/**
* 更新发货单详情
*
* @param array() $dly
* @param array() $delivery_id
* @return boolean
*/
public function updateDelivery($dly, $delivery_id)
{
$result = $this->update($dly, $delivery_id);
if ($result) {
kernel::single('ome_event_trigger_shop_delivery')->delivery_logistics_update($delivery_id);}
return $result;
}
/**
* 记录商品当天仓库的发货数量
*
* @param int $branch_id
* @param int $number
* @param int $product_id
*
* @return boolean
*/
public function createStockChangeLog($branch_id, $number, $product_id)
{
$basicMaterialLib = kernel::single('material_basic_material');
$branchObj = $this->app->model('branch');
$stock_clObj = $this->app->model('stock_change_log');
$branch = $branchObj->dump($branch_id);
$day = $branch['stock_safe_day'];
$time = $branch['stock_safe_time'];
$log_bn = date('Ymd');
$now = time();
$todaylog = $stock_clObj->dump(array('log_bn' => $log_bn, 'product_id' => $product_id, 'branch_id' => $branch_id));
if ($todaylog) {
$log['log_id'] = $todaylog['log_id'];
$log['store'] = $todaylog['store'] + $number;
$stock_clObj->save($log);
} else {
$log['product_id'] = $product_id;
$log['branch_id'] = $branch_id;
$log['log_bn'] = $log_bn;
$log['create_time'] = time();
$log['store'] = $number;
$bMaterialRow = $basicMaterialLib->getBasicMaterialExt($product_id);
$log['bn'] = $bMaterialRow['material_bn'];
$log['product_name'] = $bMaterialRow['material_name'] . ($bMaterialRow['spec_desc'] ? "(" . $bMaterialRow['spec_desc'] . ")" : "");
$stock_clObj->save($log);
}
unset($branch, $todaylog, $bMaterialRow, $log);
return true;
}
/**
* 判断发货单对应的订单处理状态是否为取消或异常
*
* @param bigint $dly_id
* @param string $is_bind
*
* @return boolean
*/
public function existOrderStatus($dly_id, $is_bind)
{
if ($is_bind == 'true') {
$ids = $this->getItemsByParentId($dly_id);
} else {
$ids = $dly_id;
}
//$sql = "SELECT COUNT(*) AS '_count' FROM sdb_ome_delivery_order dord JOIN sdb_ome_orders o ON dord.order_id=o.order_id WHERE dord.delivery_id in ($ids) AND (o.process_status='cancel' OR o.abnormal='true' OR o.disabled='true') ";
$sql = "SELECT COUNT(*) AS '_count' FROM sdb_ome_delivery WHERE delivery_id in ($ids) AND (status='cancel' OR status='back' OR status='timeout' OR status='failed' OR disabled='true' OR pause='true' OR status='return_back') ";
$row = $this->db->select($sql);
if ($row[0]['_count'] > 0) {
return false;
} else {
return true;
}
}
public function existOrderPause($dly_id, $is_bind)
{
if ($is_bind == 'true') {
$ids = $this->getItemsByParentId($dly_id);
} else {
$ids = $dly_id;
}
$sql = "SELECT COUNT(*) AS '_count' FROM sdb_ome_delivery_order dord JOIN sdb_ome_orders o ON dord.order_id=o.order_id WHERE dord.delivery_id in ($ids) AND (o.process_status='cancel' OR o.abnormal='true' OR o.disabled='true' OR o.pause='true' OR pay_status='6' OR pay_status='7' OR pay_status='5') ";
$row = $this->db->select($sql);
if ($row[0]['_count'] > 0) {
return false;
} else {
return true;
}
}
/**
* 获取与本发货单配送信息(bind_key)相同的发货单列表(父id为0)
*
* @param bigint $dly_id
*
* @return array()
*/
public function getSameKeyList($dly_id)
{
$dly = $this->dump($dly_id, 'bind_key');
$filter['bind_key'] = $dly['bind_key'];
$filter['process'] = 'false';
$filter['status'] = array('ready', 'progress');
$filter['type'] = 'normal';
$filter['parent_id'] = '0';
$data = $this->getList('*', $filter, 0, -1);
foreach ($data as $key => $item) {
if ($this->existOrderStatus($item['delivery_id'], $item['is_bind']) && $this->existOrderPause($item['delivery_id'], $item['is_bind'])) {
$data[$key]['order_status'] = 'OK';
} else {
$data[$key]['order_status'] = 'ERROR';
}
if ($item['is_bind'] == 'true') {
$data[$key]['ids'] = $this->getItemsByParentId($item['delivery_id'], 'array', '*');
}
}
return $data;
}
/**
* 利用父ID获取子发货单的ID
*
* @param bigint $parent_id
*
* @return string/array id字符串或id数组或者id对应所有数据
*/
public function getItemsByParentId($parent_id, $return = 'string', $column = 'delivery_id')
{
$filter['parent_id'] = $parent_id;
$rows = $this->getList($column, $filter, 0, -1);
if (empty($rows)) {
if($return == 'string') {
$ids = '0';
}else{
$ids = array($parent_id);
}
return $ids;
}
foreach ($rows as $item) {
$data[] = $item['delivery_id'];
}
if ($return == 'string') {
$ids = implode(',', $data);
} elseif ($column == 'delivery_id') {
$ids = $data;
} else {
foreach ($rows as $key => $item) {
if ($this->existOrderStatus($item['delivery_id'], $item['is_bind']) && $this->existOrderPause($item['delivery_id'], $item['is_bind'])) {
$rows[$key]['order_status'] = 'OK';
} else {
$rows[$key]['order_status'] = 'ERROR';
}
}
$ids = $rows;
}
return $ids;
}
/**
* 拆分发货单
* 作用:先将大的发货单拆分掉,再将不需要拆分的子发货单合并
*
* @param bigint $parent_id
* @param array $items 需要拆分的items
* @param boolean $must_log 订单收订叫回失败记录日志
*
* @return boolean
*/
public function splitDelivery($parent_id, $items = '', $must_log = false)
{
$opObj = $this->app->model('operation_log');
//获取发货单信息
$dly = $this->dump(array('delivery_id' => $parent_id));
//发货通知单暂停推送仓库
$notice_params = array(
'delivery_id' => $dly['delivery_id'],
'delivery_bn' => $dly['delivery_bn'],
'branch_id' => $dly['branch_id'],
);
$res = ome_delivery_notice::cancel($notice_params, true);
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
$data['logi_no'] = null;
$data['status'] = 'back';
$data['delivery_id'] = $parent_id;
$affect_row = $this->update($data,array('delivery_id' => $parent_id,'status' => array('ready','progress')));
if (!is_numeric($affect_row) || $affect_row <= 0) {
return false;
}
$opObj->write_log('delivery_split@ome', $parent_id, '合并发货单叫回');
$ids = $this->getItemsByParentId($parent_id, 'array');
foreach($ids as $id){
if (empty($items) || ($items && !in_array($id,$items))) {
$this->rebackDelivery($id, '合并发货单叫回', false, false);
}
}
// 发货单取消后的service扩展点
foreach(kernel::servicelist('ome.service.delivery.cancel.after') as $object) {
if(method_exists($object, 'cancel_delivery_after')) {
$object->cancel_delivery_after($parent_id);
}
}
return true;
} else {
$opObj->write_log('delivery_back@ome', $parent_id, '发货单拆分,取消通知仓库:失败,原因:' . $res['msg']);
//订单收订触发叫回失败的,需额外记录失败日志并展示
if ($must_log) {
kernel::single('console_delivery')->update_sync_status($parent_id, 'cancel_fail', $res['msg']);
}
return false;
}
}
/**
* 合并发货单处理
*
* @param array() $dly_ids
* @param array() $delivery => array(
'logi_id' => '',
'logi_name' => '',
'delivery_bn' => '',
'logi_no' => '',
'status' => '',
'stock_status' => '',
'deliv_status' => '',
'expre_status' => '',
* );
* $delivery的键值可以只传前两个或者都传
*
* @return boolean
*/
public function merge($dly_ids, $delivery = array())
{
if (!is_array($dly_ids)) {
return false;
}
if (count($dly_ids) < 2) {
return false;
}
if ($delivery) {
if (!$delivery['logi_id']) {
return false;
}
$tmp = $delivery;
unset($delivery['logi_id'], $delivery['logi_name'], $delivery['memo'], $delivery['logi_no']);
if ($delivery) {
if (!$delivery['delivery_bn']) {
return false;
}
return $this->mergeDelivery($dly_ids, $tmp);
} else {
$dly['logi_id'] = $tmp['logi_id'];
$dly['logi_name'] = $tmp['logi_name'];
$dly['memo'] = $tmp['memo'];
$dly['logi_no'] = $tmp['logi_no'] ? $tmp['logi_no'] : null; #菜鸟的智选物流会返回物流单号
$dly['delivery_bn'] = $this->gen_id();
$dly['status'] = 'ready';
$dly['stock_status'] = 'false';
$dly['deliv_status'] = 'false';
$dly['expre_status'] = 'false';
return $this->mergeDelivery($dly_ids, $dly);
}
} else {
$tmp = $dly_ids;
$id = array_shift($tmp);
unset($tmp);
$delivery = $this->dump($id, 'logi_id,logi_name');
$dly['logi_id'] = $delivery['logi_id'];
$dly['logi_name'] = $delivery['logi_name'];
$dly['logi_no'] = null;
$dly['delivery_bn'] = $this->gen_id();
$dly['status'] = 'ready';
$dly['stock_status'] = 'false';
$dly['deliv_status'] = 'false';
$dly['expre_status'] = 'false';
return $this->mergeDelivery($dly_ids, $dly);
}
}
/**
* 合并发货单
*
* @param array() $dly_ids
*
* @return boolean
*/
public function mergeDelivery($dly_ids, $delivery)
{
if ($dly_ids && is_array($dly_ids)) {
foreach ($dly_ids as $key => $_id) {
$_dly = $this->db->selectrow("SELECT delivery_id,delivery_bn,parent_id FROM sdb_ome_delivery WHERE delivery_id=" . $_id);
if ($_dly['parent_id'] != 0) {
trigger_error("发货单:" . $_dly['delivery_bn'] . "已合并过", E_USER_ERROR);
return false;
//unset($dly_ids[$key]);
}
}
}
if (count($dly_ids) < 2) {
return false;
}
$dly_corpObj = app::get('ome')->model('dly_corp');
$opObj = $this->app->model('operation_log');
if (!is_array($dly_ids)) {
return false;
}
$new_ids = array(); //单个小发货单ID数组
$net_weight = 0;
$weight = 0;
$bool_type = 0; $r_time = ''; $delivery_time = ''; $promised_collect_time = ''; $promised_sign_time = ''; $cpup_service = [];
$promiseServiceList = [];
foreach ($dly_ids as $item) {
$dly = $this->dump($item);
//$net_weight += $dly['net_weight'];
#合并发货单计算净重
$bool_type = $bool_type | $dly['bool_type'];
$weight += $dly['weight'];
if ($dly['is_bind'] == 'true') {
$ids = $this->getItemsByParentId($item, 'array');
if (is_array($ids)) {
$parents[] = $item; //大发货单ID数组
$new_ids = array_merge($new_ids, $ids);
}
} else {
$new_ids[] = $item;
}
//天猫物流升级
if (kernel::single('ome_delivery_bool_type')->isCPUP($bool_type)) {
if ($dly['consignee']['r_time']) {
$r_time = $r_time ? min($r_time, $dly['consignee']['r_time']) : $dly['consignee']['r_time'];
}
if ($dly['delivery_time']) {
$delivery_time = $delivery_time ? min($delivery_time, $dly['delivery_time']) : $dly['delivery_time'];
}
if ($dly['promised_collect_time']) {
$promised_collect_time = $promised_collect_time ? min($promised_collect_time, $dly['promised_collect_time']) : $dly['promised_collect_time'];
}
if ($dly['promised_sign_time']) {
$promised_sign_time = $promised_sign_time ? min($promised_sign_time, $dly['promised_sign_time']) : $dly['promised_sign_time'];
}
$cpup_service = array_merge($cpup_service, explode(',', $dly['cpup_service']));
}elseif(kernel::single('ome_delivery_bool_type')->isAoxiang($dly['bool_type'])){
//翱象业务
//计划发货时间(取最早时间)
if($dly['delivery_time']){
$delivery_time = $delivery_time ? min($delivery_time, $dly['delivery_time']) : $dly['delivery_time'];
}
//承诺最晚送达时间(取最早时间)
if($dly['promised_sign_time']){
$promised_sign_time = $promised_sign_time ? min($promised_sign_time, $dly['promised_sign_time']) : $dly['promised_sign_time'];
}
//计划发货时间(取最早时间)
if($dly['promised_collect_time']){
$promised_collect_time = $promised_collect_time ? min($promised_collect_time, $dly['promised_collect_time']) : $dly['promised_collect_time'];
}
//计划发货时间(取最早时间)
if($dly['promise_outbound_time']){
$promise_outbound_time = $promise_outbound_time ? min($promise_outbound_time, $dly['promise_outbound_time']) : $dly['promise_outbound_time'];
}
//计划发货时间(取最早时间)
if($dly['plan_sign_time']){
$plan_sign_time = $plan_sign_time ? min($plan_sign_time, $dly['plan_sign_time']) : $dly['plan_sign_time'];
}
//物流服务标签(取合集)
if($dly['promise_service']){
$promiseServiceList = array_merge($promiseServiceList, explode(',', $dly['promise_service']));
$promiseServiceList = array_unique($promiseServiceList);
}
//物流升级服务
if($dly['cpup_service']){
$cpup_service = array_merge($cpup_service, explode(',', $dly['cpup_service']));
$cpup_service = array_unique($cpup_service);
}
}
}
#获取发货单累计重量
foreach ($dly_ids as $dk => $dv) {
$dlys = $this->dump($dv, 'net_weight');
if ($dlys['net_weight'] > 0) {
$net_weight += $dlys['net_weight'];
} else {
$net_weight = 0;
break;
}
}
if (count($new_ids) < 2) {
return false;
}
unset($dly['net_weight']);
unset($dly['delivery_id']);
unset($dly['verify']);
unset($dly['cost_protect']);
//计算合并后的大发货单的预计物流费用
$area = $dly['consignee']['area'];
$arrArea = explode(':', $area);
$area_id = $arrArea[2];
$price = $this->getDeliveryFreight($area_id, $delivery['logi_id'], $net_weight);
if ($delivery['logi_id']) {
$dly_corp = $dly_corpObj->dump($delivery['logi_id']);
$logi_name = $dly_corp['name'];
//计算保价费用
$protect = $dly_corp['protect'];
if ($protect == 'true') {
$is_protect = 'true';
$protect_rate = $dly_corp['protect_rate']; //保价费率
$protect_price = $protect_rate * $net_weight;
$minprice = $dly_corp['minprice']; //最低报价费用
if ($protect_price < $minprice) {
$cost_protect = $minprice;
} else {
$cost_protect = $protect_price;
}
}
}
$dly['cost_protect'] = $cost_protect;
$dly['is_protect'] = $is_protect ? $is_protect : 'false';
$new_dly = $dly; //新的大发货单sdf结构
$new_dly['memo'] = $delivery['memo'];
$new_dly['delivery_bn'] = $delivery['delivery_bn'];
$new_dly['net_weight'] = $net_weight;
$new_dly['weight'] = $weight;
$new_dly['is_bind'] = 'true';
$new_dly['logi_no'] = $delivery['logi_no'];
$new_dly['logi_id'] = $delivery['logi_id'];
$new_dly['logi_name'] = $delivery['logi_name'];
$new_dly['parent_id'] = 0;
$new_dly['status'] = $delivery['status'];
$new_dly['stock_status'] = $delivery['stock_status'];
$new_dly['deliv_status'] = $delivery['deliv_status'];
$new_dly['expre_status'] = $delivery['expre_status'];
$new_dly['delivery_cost_expect'] = $price;
$new_dly['bool_type'] = $bool_type;
$new_dly['cpup_service'] = implode(',', $cpup_service);
if ($r_time) {
$new_dly['ship_time'] = $r_time;
}
//未发货之前,不能赋值,否则客户导出时有异议
// if ($delivery_time){
// $new_dly['delivery_time'] = $delivery_time;
// }
if ($promised_collect_time){
$new_dly['promised_collect_time'] = $promised_collect_time;
}
if ($promised_sign_time){
$new_dly['promised_sign_time'] = $promised_sign_time;
}
//获取大发货单的订单创建时间 取各个发货单最小的订单创建时间
$order_createtime = $this->getDeliveryOrderCreateTime($dly_ids);
if ($order_createtime) {
$new_dly['order_createtime'] = $order_createtime;
}
//承诺最晚出库时间
if($promise_outbound_time){
$new_dly['promise_outbound_time'] = $promise_outbound_time;
}
//承诺计划送达时间
if($plan_sign_time){
$new_dly['plan_sign_time'] = $plan_sign_time;
}
//物流服务标签
if($promiseServiceList){
$new_dly['promise_service'] = implode(',', $promiseServiceList);
}
//save
if ($this->save($new_dly)) {
//创建大发货单
if ($parents && is_array($parents)) {
foreach ($parents as $p_id) {
$this->splitDelivery($p_id, '', false);
}
}
foreach ($new_ids as $id) {
$tmp_dly = array(
'delivery_id' => $id,
'logi_no' => null,
'parent_id' => $new_dly['delivery_id'],
);
$this->save($tmp_dly);
}
$this->insertParentItemByItems($new_dly['delivery_id'], $new_ids, $dly['branch_id']); //新增大发货单与小发货单的明细关联
$this->insertParentOrderByItems($new_dly['delivery_id'], $new_ids);
$this->insertParentItemDetailByItemsDetail($new_dly['delivery_id'], $new_ids); //2011.03.15新增(为发货单详情绑定订单商品关联)
////////////////////////////////为合并后的发货单生成统计字段///////////////////////////////////
$bns = array();
$totalNum = 0;
$diObj = $this->app->model('delivery_items');
$dis = $diObj->getList('*', array('delivery_id' => $new_dly['delivery_id']), 0, -1);
foreach ($dis as $v) {
$totalNum += $v['number'];
$bns[$v['product_id']] = $v['bn'];
}
ksort($bns);
//11.25新增
$data['skuNum'] = count($dis);
$data['itemNum'] = $totalNum;
$data['bnsContent'] = serialize($bns);
$data['idx_split'] = $data['skuNum'] * 10000000000 + sprintf("%u", crc32($data['bnsContent']));
$data['delivery_id'] = $new_dly['delivery_id'];
$this->save($data);
/////////////////////////////////////////////////////////////////////////////////////////////////////
$merge_dly = $this->getList("delivery_bn", array('delivery_id' => $new_ids), 0, -1);
foreach ($merge_dly as $v) {
$tmp_idd[] = $v['delivery_bn'];
}
$idd = implode(",", $tmp_idd);
$opObj->write_log('delivery_merge@ome', $new_dly['delivery_id'], '合并发货单(' . $idd . ')');
return $new_dly['delivery_id'];
}
return false;
}
/**
* 重置发货单
* 使用:将发货单状态设置为初始状态 ,物流运单号设置为空
*
* @param array() $filter
*
* @return boolean
*/
public function resumeDelivery($filter, $cancel_items)
{
$rows = $this->getList('*', $filter, 0, -1);
$oOperation_log = app::get('ome')->model('operation_log');
if (empty($rows)) {
return false;
}
$dly_itemObj = $this->app->model('delivery_items');
foreach ($rows as $r) {
$data['parent_id'] = 0;
$data['logi_no'] = null;
if ($r['status'] == 'cancel' || $r['status'] == 'back') {
$data['status'] = $r['status'];
} else {
if (empty($cancel_items) || ($cancel_items && !in_array($r['delivery_id'], $cancel_items))) {
$data['status'] = 'ready';
$data['verify'] = 'false';
$data['stock_status'] = 'false';
$data['deliv_status'] = 'false';
$data['expre_status'] = 'false';
$dly_itemObj->resumeItemsByDeliveryId($r['delivery_id']); //重置每个发货单的校验
$filter2['delivery_id'] = $r['delivery_id'];
}
}
if ($cancel_items && in_array($r['delivery_id'], $cancel_items)) {
unset($data['parent_id']);
}
if ($r['delivery_id']) {
$filter2['delivery_id'] = $r['delivery_id'];
$this->update($data, $filter2);
}
}
$data = null;
return true;
}
/**
* 调用model:delivery_items中的insertParentItemByItems方法
* 作用将子发货单的关联items复制给大发货单
*
* @param bigint $parent_id
* @param array() $items
*
* @return boolean
*/
public function insertParentItemByItems($parent_id, $items, $branch_id)
{
$dly_itemObj = $this->app->model('delivery_items');
return $dly_itemObj->insertParentItemByItems($parent_id, $items, $branch_id);
}
/**
* 调用model:delivery_order中的insertParentOrderByItems方法
* 作用将子发货单的关联order复制给大发货单
*
* @param bigint $parent_id
* @param array() $items
*
* @return boolean
*/
public function insertParentOrderByItems($parent_id, $items)
{
$dly_orderObj = $this->app->model('delivery_order');
return $dly_orderObj->insertParentOrderByItems($parent_id, $items);
}
public function insertParentItemDetailByItemsDetail($parent_id, $items)
{
$didObj = $this->app->model('delivery_items_detail');
return $didObj->insertParentItemDetailByItemsDetail($parent_id, $items);
}
/**
* 通过一个发货单号或一个发货单号数组,获取这些发货单号对应的订单号
*
* @param string/array() $dly_ids
*
* @return array() 订单ID的数组(自然下标)
*/
public function getOrderIdByDeliveryId($dly_ids)
{
$dly_orderObj = $this->app->model('delivery_order');
$filter['delivery_id'] = $dly_ids;
$data = $dly_orderObj->getList('order_id', $filter);
foreach ($data as $item) {
$ids[] = $item['order_id'];
}
return $ids;
}
/**
* 根据发货单id获取订对应的订单号
*
* @param void
* @return void
* @author
**/
public function getOrderBnbyDeliveryId($delivery_id)
{
$sql = 'SELECT order_bn,pay_status,o.order_id
FROM sdb_ome_orders AS o
LEFT JOIN sdb_ome_delivery_order AS deli ON o.order_id = deli.order_id
WHERE delivery_id=' . $delivery_id;
$delivery = kernel::database()->select($sql);
return $delivery[0];
}
/**
* 通过发货单号获取发货单详情关联表的对应记录
*
* @param bigint $dly_id
*
* @return array()
*/
public function getItemsByDeliveryId($dly_id)
{
$dly_itemObj = $this->app->model('delivery_items');
$rows = $dly_itemObj->getList('*', array('delivery_id' => $dly_id), 0, -1);
return $rows;
}
/**
* 通过仓库ID和货品ID获取其所有货位的商品数量信息
*
* @param int $branch_id
* @param int $product_id
*
* @return array()
* ss备注些方法已经没用可以删除
*/
public function getBranchProductPosNum($branch_id, $product_id)
{
//$branch_pposObj = $this->app->model('branch_product_pos');
//$rows = $branch_pposObj->getList('*', array('branch_id' => $branch_id, 'product_id' => $product_id));
$sql = "SELECT * FROM sdb_ome_branch_product_pos dpp
JOIN sdb_ome_branch_pos dp
ON dpp.pos_id=dp.pos_id
WHERE dp.branch_id='$branch_id' AND dpp.product_id='$product_id'";
return $this->db->select($sql);
}
/**
* 通过发货单的itemId获取其相应的item货位商品数量信息
*
* @param int $item_id
*
* @return array()
* ss备注些方法已经没用可以删除
*/
public function getItemPosByItemId($item_id)
{
$dly_iposObj = $this->app->model('dly_items_pos');
$branch_posObj = $this->app->model('branch_pos');
$rows = $dly_iposObj->getList('*', array('item_id' => $item_id));
foreach ($rows as $key => $item) {
//循环取出货位名称
$pos = $branch_posObj->dump($item['pos_id']);
$rows[$key]['store_position'] = $pos['store_position'];
}
return $rows;
}
/**
* 通过delivery_id(可以为数组)删除发货单订单关联表中的记录
*
* @param bigint/array() $dly_id
*
* @return boolean
*/
public function deleteDeliveryItemDetailByDeliveryId($dly_id)
{
if ($dly_id) {
$didObj = $this->app->model('delivery_items_detail');
$filter['delivery_id'] = $dly_id;
return $didObj->delete($filter);
}
return false;
}
/**
* 通过delivery_id(可以为数组)删除发货单订单关联表中的记录
*
* @param bigint/array() $dly_id
*
* @return boolean
*/
public function deleteDeliveryOrderByDeliveryId($dly_id)
{
if ($dly_id) {
$dly_orderObj = $this->app->model('delivery_order');
$filter['delivery_id'] = $dly_id;
return $dly_orderObj->delete($filter);
}
return false;
}
/**
* 通过delivery_id(可以为数组)删除发货单明细关联表中的记录
*
* @param bigint/array() $dly_id
*
* @return boolean
*/
public function deleteDeliveryItemsByDeliveryId($dly_id)
{
if ($dly_id) {
$dly_itemObj = $this->app->model('delivery_items');
$filter['delivery_id'] = $dly_id;
return $dly_itemObj->delete($filter);
}
return false;
}
/**
* 删除发货单相关的货位信息(只有合并过的发货单才会触发此方法)
*
* @param int $dly_id
*
* @return boolean
* ss备注此方法可以被删除
*/
public function deleteDeliveryItemsPosByDeliveryId($dly_id)
{
if ($dly_id) {
$dly_itemObj = $this->app->model('delivery_items');
$dly_itemPosObj = $this->app->model('dly_items_pos');
foreach ($dly_id as $id) {
$rows = $dly_itemObj->getList('*', array('delivery_id' => $id), 0, -1);
if (empty($rows)) {
return false;
}
foreach ($rows as $row) {
$filter['item_id'] = $row['item_id'];
$dly_itemPosObj->delete($filter);
}
}
return true;
}
return false;
}
/**
* 打回发货单操作
*
* @param array() $dly_ids
* @param string $memo
* @param boolean $reback_status 打回状态默认为false:打回所有发货单;true只打回未发货的发货单
* @param boolean $must_log 订单收订叫回失败记录日志
* @return boolean
*/
public function rebackDelivery($dly_ids, $memo, $dly_status = false, $must_log = false)
{
$flag = true; //发货单打回,成功标志
$err_msg = '';
if (is_array($dly_ids)) {
$ids = $dly_ids;
} else {
$ids[] = $dly_ids;
}
$memo_log = '';
if ($memo) {
$memo_log .= ',备注:' . $memo;
}
$data['memo'] = $memo;
$data['status'] = 'back';
$data['logi_no'] = null;
$orderObj = app::get('ome')->model('orders');
$delivery_itemsObj = app::get('ome')->model('delivery_items');
$deliveryBillObj = app::get('ome')->model('delivery_bill');
$combineObj = new omeauto_auto_combine();
$dispatchObj = app::get('omeauto')->model('autodispatch');
$opObj = app::get('ome')->model('operation_log');
foreach ($ids as $item) {
$res = array('rsp' => 'false');
$deliveryInfo = $this->dump($item, 'delivery_id, shop_id, process, status, delivery_bn, branch_id, is_bind, parent_id', array('delivery_items' => array('*'), 'delivery_order' => array('*')));
//本地先检查是否可操作
if ($deliveryInfo['process'] == 'true' || in_array($deliveryInfo['status'], array('failed', 'cancel', 'back', 'succ', 'return_back'))) {
continue;
}
//如果是主发货单
if ($deliveryInfo['parent_id'] == 0) {
//发货通知单暂停推送仓库
$notice_params = array(
'delivery_id' => $item,
'delivery_bn' => $deliveryInfo['delivery_bn'],
'branch_id' => $deliveryInfo['branch_id'],
);
$res = ome_delivery_notice::cancel($notice_params, true);
} else {
$res['rsp'] = 'success';
}
if ($res['rsp'] == 'success' || $res['rsp'] == 'succ') {
$data['delivery_id'] = $item;
$rs = $this->update($data, ['delivery_id'=>$item, 'status|in' => ['stop', 'ready', 'progress', 'timeout']]);
if (is_bool($rs)) {
continue;
}
$opObj->write_log('delivery_back@ome', $item, '发货单撤销成功' . $memo_log);
// 发货单取消成功通知
$this->sendDeliveryCancelSuccessNotify($deliveryInfo, $memo);
if($deliveryInfo['parent_id'] == 0){
// 发货单取消后的service扩展点
foreach(kernel::servicelist('ome.service.delivery.cancel.after') as $object) {
if(method_exists($object, 'cancel_delivery_after')) {
$object->cancel_delivery_after($item);
}
}
}
//库存管控处理
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $deliveryInfo['branch_id']));
if ($deliveryInfo['is_bind'] == 'true') {
$childIds = $this->getItemsByParentId($item, 'array');
foreach ($childIds as $i) {
$delivery = $this->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'] = 'cancelDly';
$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'] = 'cancelDly';
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
kernel::single('ome_order_object_splitnum')->backDeliverySplitNum($item);
}
//默认叫回发货单后需处理订单相应的状态
if (!$dly_status) {
$order = $this->getOrderIdByDeliveryId($item);
$orderlist = $orderObj->getlist('order_id,order_combine_idx,order_combine_hash,pay_status,ship_status,payed,process_status', array('order_id' => $order));
foreach ($orderlist as $orderInfo) {
//发货单打回,更新订单状态
kernel::single('ome_order')->resumeOrdStatus($orderInfo);
$isStoreBranch = $storeManageLib->isStoreBranch();
if ($isStoreBranch) {
kernel::single('ome_o2o_performance_orders')->updateProcessStatus($orderInfo['order_id'], 'refuse');
}
}
}
//打回发货单状态同步
kernel::single('ome_event_trigger_shop_delivery')->delivery_process_update($item);
} else {
$opObj->write_log('delivery_back@ome', $item, '发货单取消通知仓库:失败,原因:' . $res['msg'] . $memo_log);
//如果是强制更新,但是通知仓储失败则标记发货单通知失败
if ($must_log) {
kernel::single('console_delivery')->update_sync_status($item, 'cancel_fail', $res['msg']);
}
$flag = false; //打回发货单失败
continue;
}
}
return $flag;
}
/**
* 判断订单确认状态是否为部分拆分[2014.10.31 拆单已使用]
* @param int $order_id
* @param void $return_num 是否返回发货单count数量
*/
public function validDeiveryByOrderId($order_id, $return_num = false)
{
$order_id = intval($order_id);
if ($order_id == 0) {
return false;
}
$sql = "SELECT COUNT(*) AS _count FROM sdb_ome_delivery_order do
JOIN sdb_ome_delivery d
ON do.delivery_id=d.delivery_id
WHERE do.order_id=$order_id
AND d.parent_id=0
AND d.status IN ('ready','progress','succ', 'stop')
AND d.disabled='false'";
$row = $this->db->selectrow($sql);
#返回统计的发货单数量
if ($return_num) {
return $row['_count'];
}
return ($row['_count'] > 0 ? true : false);
}
public function getCorpsByBranchId()
{
}
/**
* 获取发货人信息
*
* @param int $dly_id
*
* @return array()
*/
public function getShopInfo($shop_id)
{
static $shops;
if ($shops[$shop_id]) {
return $shops[$shop_id];
}
$shopObj = $this->app->model("shop");
$shops[$shop_id] = $shopObj->dump($shop_id);
return $shops[$shop_id];
}
/**
* 统计商品数量
*
* @param array() $dly_ids
*
* @return array()
*/
public function countProduct($dly_ids = null)
{
if ($dly_ids) {
$sql = "SELECT bn,product_name,SUM(number) AS 'count' FROM sdb_ome_delivery_items
WHERE delivery_id IN ($dly_ids) AND number!=0 GROUP BY bn";
$data = $this->db->select($sql);
}
return $data;
}
/**
* 统计商品在每个货位上的数量
*
* @param array() $dly_ids
* @param string $bn
*
* @return array()
* ss备注此方法已经没用可以删除
*/
public function countProductPos($dly_ids = null, $bn = null)
{
if ($dly_ids) {
$sql = "SELECT bp.store_position,SUM(dip.num) AS 'count' FROM sdb_ome_delivery_items di
JOIN sdb_ome_dly_items_pos dip
ON di.item_id=dip.item_id
JOIN sdb_ome_branch_pos bp
ON dip.pos_id=bp.pos_id
WHERE di.delivery_id IN ($dly_ids)
AND di.number!=0
AND dip.num!=0 AND di.bn='$bn'
GROUP BY di.bn,bp.store_position";
$rows = $this->db->select($sql);
}
return $rows;
}
public function getProductPosByDeliveryId($dly_id = null)
{
if ($dly_id) {
// 发货单对应的仓库id
$branch_id = $this->dump($dly_id, 'branch_id');
$sql = "SELECT di.bn,di.product_name,di.product_id,
a.bm_id AS goods_id, a.material_name AS name, a.material_bn AS bn,
di.number,delivery_id, bp.store_position
FROM sdb_ome_delivery_items di
JOIN sdb_material_basic_material a ON a.bm_id=di.product_id
LEFT JOIN (
SELECT bpp.*
FROM (
SELECT ss.pos_id,ss.product_id
FROM sdb_ome_branch_product_pos as ss LEFT JOIN sdb_ome_branch_pos bss on ss.pos_id=bss.pos_id
WHERE ss.branch_id=" . $branch_id['branch_id'] . " AND bss.pos_id!=''
)bpp
GROUP BY bpp.product_id
)bb
ON bb.product_id = di.product_id
LEFT JOIN sdb_ome_branch_pos bp ON bp.pos_id = bb.pos_id
WHERE di.delivery_id = $dly_id
AND di.number != 0";
$rows = $this->db->select($sql);
}
$basicMaterialLib = kernel::single('material_basic_material');
foreach ($rows as $key => $val) {
$get_product = $basicMaterialLib->getBasicMaterialExt($val['goods_id']);
$val['barcode'] = $get_product['barcode'];
$val['weight'] = $get_product['weight'];
$val['unit'] = $get_product['unit'];
$val['price'] = $get_product['retail_price'];
$val['spec_info'] = $get_product['specifications'];
$rows[$key] = $val;
}
return $rows;
}
public function getProductPosInfo($dly_id = '', $branch_id = '')
{
if ($dly_id && $branch_id) {
$sql = "SELECT di.bn,di.product_name,di.product_id,
a.bm_id AS goods_id, a.material_name AS name, a.material_bn AS bn,
di.number,delivery_id, bp.store_position
FROM sdb_ome_delivery_items di
JOIN sdb_material_basic_material a ON a.bm_id=di.product_id
LEFT JOIN (
SELECT bpp.*
FROM (
SELECT ss.pos_id,ss.product_id
FROM sdb_ome_branch_product_pos as ss LEFT JOIN sdb_ome_branch_pos bss on ss.pos_id=bss.pos_id
WHERE ss.branch_id=" . $branch_id . " AND bss.pos_id!=''
)bpp
GROUP BY bpp.product_id
)bb
ON bb.product_id = di.product_id
LEFT JOIN sdb_ome_branch_pos bp ON bp.pos_id = bb.pos_id
WHERE di.delivery_id = $dly_id
AND di.number != 0";
$rows = $this->db->select($sql);
}
$basicMaterialLib = kernel::single('material_basic_material');
foreach ($rows as $key => $val) {
$get_product = $basicMaterialLib->getBasicMaterialExt($val['goods_id']);
$val['barcode'] = $get_product['barcode'];
$val['weight'] = $get_product['weight'];
$val['unit'] = $get_product['unit'];
$val['price'] = $get_product['retail_price'];
$val['spec_info'] = $get_product['specifications'];
$rows[$key] = $val;
}
return $rows;
}
public function getOrderMemoByDeliveryId($dly_ids = null)
{
if ($dly_ids) {
$sql = "SELECT o.custom_mark FROM sdb_ome_delivery_order do
JOIN sdb_ome_orders o
ON do.order_id=o.order_id
WHERE do.delivery_id IN ($dly_ids)
GROUP BY do.order_id ";
$rows = $this->db->select($sql);
$memo = array();
if ($rows) {
foreach ($rows as $v) {
$memo[] = unserialize($v['custom_mark']);
}
}
return serialize($memo);
}
}
/**
* 统计订单商品的发货数量
*
* @param int $order_id
*
* @return int
*/
public function countOrderSendNumber($order_id)
{
$sql = "SELECT COUNT(*) AS 'total' FROM sdb_ome_order_items WHERE order_id = '$order_id' AND nums!=sendnum AND `delete`='false'";
$item_num = $this->db->selectrow($sql);
return $item_num['total'];
}
/**
* 统计订单商品的拆分数量
*
* @param int $order_id
*
* @return int
*/
public function countOrderSplitNumber($order_id)
{
$sql = "SELECT COUNT(*) AS 'total' FROM sdb_ome_order_items WHERE order_id = '$order_id' AND nums!=split_num AND `delete`='false'";
$item_num = $this->db->selectrow($sql);
return $item_num['total'];
}
/**
* 更新仓库商品表商品数量
*
* @param int $num
* @param int $product_id
* @param int $branch_id
*
* @return boolean
*
function updateBranchProduct($num, $product_id, $branch_id){
$now = time();
//$sql = "UPDATE sdb_ome_branch_product SET store=store-$num,store_freeze=store_freeze-$num,last_modified=$now WHERE branch_id='$branch_id' AND product_id='$product_id'";
//暂时不在branch_product上使用冻结库存
$sql = "UPDATE sdb_ome_branch_product SET store=store-$num,last_modified=$now WHERE branch_id='$branch_id' AND product_id='$product_id'";
//echo $sql;
return $this->db->exec($sql);//扣减branch_product表
}
/**
* 更新仓库商品货位表商品数量
*
* @param int $num
* @param int $product_id
* @param int $pos_id
*
* @return boolean
*
function updateBranchProductPos($num, $product_id, $pos_id){
$sql = "UPDATE sdb_ome_branch_product_pos SET store=store-$num WHERE pos_id='$pos_id' AND product_id='$product_id'";
//echo $sql;
return $this->db->exec($sql);//扣减branch_product_pos表
}/*
/*
* 生成发货单号
*
*
* @return bigint 发货单号
*/
public function gen_id()
{
$prefix = date("ymd");
$sign = kernel::single('eccommon_guid')->incId('delivery', $prefix, 7, true);
return $sign;
/* $cManage = $this->app->model("concurrent");
$prefix = date("ymd").'11';
$sqlString = "SELECT MAX(delivery_bn) AS maxno FROM sdb_ome_delivery WHERE delivery_bn LIKE '".$prefix."%'";
$aRet = $this->db->selectrow($sqlString);
if(is_null($aRet['maxno'])){
$aRet['maxno'] = 0;
$maxno = 0;
}else
$maxno = substr($aRet['maxno'], -5);
do{
$maxno += 1;
if ($maxno==100000){
break;
}
$maxno = str_pad($maxno,5,'0',STR_PAD_LEFT);
$sign = $prefix.$maxno;
if($cManage->is_pass($sign,'delivery')){
break;
}
}while(true);
return $sign;
*/
}
/*
* 根据订单id获取发货单信息
*
* @param string $cols
* @param bigint $order_id 订单id
*
* @return array $delivery 发货单数组
*/
public function getDeliveryByOrder($cols = "*", $order_id)
{
$delivery_ids = $this->getDeliverIdByOrderId($order_id);
if ($delivery_ids) {
$f_status = array('ready', 'progress', 'succ', 'return_back', 'back');
$delivery = $this->getList($cols, array('delivery_id' => $delivery_ids, 'status' => $f_status), 0, -1);
if ($delivery) {
foreach ($delivery as $k => $v) {
if (isset($v['logi_id'])) {
$dly_corp = $this->db->selectrow("SELECT * FROM sdb_ome_dly_corp WHERE disabled='false' AND corp_id=" . intval($v['logi_id']));
$delivery[$k]['request_url'] = $dly_corp['website']; //TODO: 等request_url完善后使用request_url
$delivery[$k]['logi_code'] = $dly_corp['type'];
}
if (isset($v['branch_id'])) {
$branch = $this->db->selectrow("SELECT * FROM sdb_ome_branch WHERE disabled='false' AND branch_id=" . intval($v['branch_id']));
$delivery[$k]['branch_name'] = $branch['name'];
}
if (isset($v['status'])) {
if (empty($status_text)) {
$status_text = array('succ' => '已发货', 'failed' => '发货失败', 'cancel' => '已取消', 'progress' => '等待配货', 'timeout' => '超时', 'ready' => '等待配货', 'stop' => '暂停', 'back' => '打回','return_back'=>'退回');
}
$delivery[$k]['status_text'] = $status_text[$v['status']];
}
if (isset($v['stock_status']) || isset($v['deliv_status']) || isset($v['expre_status'])) {
if ($v['stock_status'] == 'ture' && $v['deliv_status'] == 'true' && $v['expre_status'] == 'true') {
$delivery[$k]['print_statis'] = '已完成打印';
} else if ($v['stock_status'] == 'false' && $v['deliv_status'] == 'false' && $v['expre_status'] == 'false') {
$delivery[$k]['print_status'] = '未打印';
} else {
$print_status = array();
if ($v['stock_status'] == 'true') {
$print_status[] = '备货单';
}
if ($v['deliv_status'] == 'true') {
$print_status[] = '清单';
}
if ($v['expre_status'] == 'true') {
$print_status[] = '快递单';
}
$delivery[$k]['print_status'] = implode("/", $print_status) . "已打印";
}
}
}
return $delivery;
} else {
return array();
}
} else {
return array();
}
}
/**
* 根据订单order_id获取关联的所有发货单delivery_id
* todo只获取父delivery_id是0的发货单
*
* @param int $order_id
* @param bool $is_reback_dly 只获取能打回的发货单
* @return array
*/
public function getDeliverIdByOrderId($order_id, $is_reback_dly = false)
{
if (is_array($order_id)) {
$order_id = implode(',', $order_id);
$where = 'order_id in (' . $order_id . ')';
} else {
$where = 'order_id = ' . $order_id;
}
if ($is_reback_dly) {
//过滤掉已发货的
$sql = "SELECT dord.delivery_id FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.{$where} AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false' AND d.status NOT IN('failed','cancel','back','return_back', 'succ')";
} else {
$sql = "SELECT dord.delivery_id FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
WHERE dord.{$where} AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false' AND d.status NOT IN('failed','cancel','back','return_back')";
}
//delivery list
$delivery_ids = $this->db->select($sql);
$ids = array();
if ($delivery_ids) {
foreach ($delivery_ids as $v) {
$ids[] = $v['delivery_id'];
}
}
return $ids;
}
/*
* 根据订单id获取"失败"、"取消"、"打回"的发货单id
* 只获取父id是0的发货单
*
* @param bigint $order_id
*
* @return array $ids
*/
public function getHistoryIdByOrderId($order_id)
{
$delivery_ids = $this->db->select("SELECT dord.delivery_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.parent_id=0 OR d.is_bind='true') AND d.disabled='false' AND d.status IN('failed','cancel','back','return_back')");
$ids = array();
if ($delivery_ids) {
foreach ($delivery_ids as $v) {
$ids[] = $v['delivery_id'];
}
}
return $ids;
}
/**
* 根据发货单ID判断相关订单ID所有相关联的发货单是否都已打印如果都打印更新订单print_finish为TRUE
* $type为0 是否更新为1时更新为FALSE
*
* @param bigint $dly_id
* @param int $type
*
*/
public function updateOrderPrintFinish($dly_id, $type = 0)
{
$orderIds = $this->getOrderIdByDeliveryId($dly_id);
foreach ($orderIds as $id) {
$ordObj = $this->app->model('orders');
if(!$ordObj->db_dump(['order_id' => $id], 'order_id')) {
continue;
}
if ($type == 0) {
$flag = 0;
$dlyIds = $this->getDeliverIdByOrderId($id);
foreach ($dlyIds as $i) {
$dly = $this->dump($i);
if ($dly['stock_status'] == 'false') {
break;
}
if ($dly['deliv_status'] == 'false') {
break;
}
if ($dly['expre_status'] == 'false') {
break;
}
$flag++;
}
if ($flag > 0) {
$data['order_id'] = $id;
$data['print_finish'] = 'true';
$ordObj->save($data);
}
} elseif ($type == 1) {
$data['order_id'] = $id;
$data['print_finish'] = 'false';
$data['print_status'] = 0;
$data['logi_no'] = null;
$ordObj->save($data);
}
}
return true;
}
/*
* 设置发货单状态
*
* @param int $delivery_id
* @param string $status 状态
*
* @return bool
*/
public function set_status($delivery_id, $status)
{
$data = array(
'delivery_id' => $delivery_id,
'status' => $status,
);
if ($status == 'cancel') {
$data['logi_no'] = null;
}
return $this->save($data);
}
/*
* 获取订单已生成发货单的货品数量
*
* @param bigint $order_id 订单id
* @param int $product_id 货品id
*
* @return int
*/
public function getDeliveryFreez($order_id, $product_id)
{
$sql = "SELECT SUM(di.number) AS nums FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
LEFT JOIN sdb_ome_delivery_items AS di ON(di.delivery_id=d.delivery_id)
WHERE dord.order_id='{$order_id}' AND di.product_id='{$product_id}' AND d.parent_id=0 AND d.disabled='false' AND d.status IN('succ','failed','progress','timeout','ready','stop')";
$ret = $this->db->selectrow($sql);
return $ret['nums'];
}
/*
* 获取发货单可以合并的依据
*
* @param int $shop_id 前端店铺id
* @param int $branch_id 仓库id
* @param string $ship_addr 收货地址
* @param int $member_id 会员id
* @param string $is_cod 是否活到付款 true/false
* @param string $is_protect 是否保价 true/false
*
* @return string
*/
public function getBindKey($data)
{
$bindkey = md5($data['shop_id'] . $data['branch_id'] . $data['consignee']['addr'] . $data['member_id'] . $data['is_cod'] . $data['is_protect']);
if ($service = kernel::service('ome.service.delivery.bindkey')) {
if (method_exists($service, 'get_bindkey')) {
$bindkey = $service->get_bindkey($data);
}
}
return $bindkey;
}
public function cmp_delivery_productid($arr1, $arr2)
{
if ($arr1['product_id'] == $arr2['product_id']) {
return 0;
}
return ($arr1['product_id'] < $arr2['product_id']) ? -1 : 1;
}
/**
* 新建发货单
*
* @param $order_id bigint
* @param $delivery array
* @param $ship_info array
* @param $order_items
* @param $split_status 拆单后订单状态
* @param $is_diff_order 补差价订单生成已发货的发货单 不涉及库存
* @param $extendInfo array 扩展信息
*
* @return array|string[]
*/
public function addDelivery($order_id, $delivery, $ship_info = array(), $order_items = array(), &$split_status = '', $is_diff_order = false, $extendInfo=array())
{
$addRes = $this->_addDelivery($order_id, $delivery, $ship_info, $order_items, $split_status, $is_diff_order, $extendInfo);
if ($addRes['rsp'] == 'fail') {
return $addRes;
}
$data = $addRes['data'];
if ($is_diff_order) { //调用方法的外层会更新当前订单为已发货并发起发货单回写请求
} else {
//发货单创建
$deliveryEventStartTime = microtime(true);
kernel::single('ome_event_trigger_shop_delivery')->delivery_add($data['delivery_id']);
$deliveryEventTime = microtime(true) - $deliveryEventStartTime;
// 记录发货单事件触发性能数据
ome_api_log::add_message('event', 'delivery_add', $deliveryEventTime, array(
'delivery_id' => $data['delivery_id']
));
}
return array('rsp' => 'succ', 'data' => $data['delivery_id']);
}
private function _addDelivery($order_id, $delivery, $ship_info = array(), $order_items = array(), &$split_status = '', $is_diff_order = false, $extendInfo=array())
{
$oOrder = $this->app->model("orders");
$oDly_corp = $this->app->model("dly_corp");
$branchObj = $this->app->model("branch");
// 验证明细
if (!$delivery['delivery_items']) {
return array('rsp' => 'fail', 'msg' => '没有明细');
}
// 减少死锁概率以product_id排序
usort($delivery['delivery_items'], array('ome_mdl_delivery', 'cmp_delivery_productid'));
// 根据代码追踪order_items获取order_objects的sm_id不准确临时方案
if ($order_items) {
$orderObjMdl = app::get('ome')->model('order_objects');
$objIdArr = array_column($order_items, 'obj_id');
$objectsList = $orderObjMdl->getList('obj_id,goods_id', ['order_id'=>$order_id, 'obj_id'=>$objIdArr]);
$objectsList = array_column($objectsList, null, 'obj_id');
foreach ($delivery['delivery_items'] as $di => $dv) {
$sm_id = 0;
foreach ($order_items as $ov) {
$sm_id = $objectsList[$ov['obj_id']]['goods_id'];
break;
}
$delivery['delivery_items'][$di]['goods_id'] = $sm_id;
}
}
//开启添加发货单事务,锁定当前订单记录
$this->db->beginTransaction();
//防止订单编辑与生成发货单并发导致错误
$oOrder->update(['last_modified'=>time()], ['order_id'=>$order_id]);
$psRow = app::get('ome')->model('order_platformsplit')->db_dump(['order_id'=>$order_id], 'id');
if($psRow) {
$this->db->rollBack();
return array('rsp' => 'fail', 'msg' => '已经进行京东平台拆,不能生成发货单');
}
$order = $oOrder->dump($order_id);
if (kernel::single('ome_order_bool_type')->isJITX($order['order_bool_type'])) {
kernel::single('purchase_branch_freeze')->deleteFromOrder($order['order_bn'], $order['shop_id']);
}
$ship_info = $delivery['consignee'] ? $delivery['consignee'] : $order['consignee'];
$delivery_bn = $delivery['delivery_bn'] ? $delivery['delivery_bn'] : $this->gen_id();
$data['delivery_bn'] = $delivery_bn;
$is_protect = $delivery['is_protect'] ? $delivery['is_protect'] : $order['shipping']['is_protect'];
$is_cod = $delivery['is_cod'] ? $delivery['is_cod'] : $order['shipping']['is_cod'];
if ($is_cod) {
$data['is_cod'] = $is_cod;
}
if ($order['order_type'] == 'vopczc') {
$delivery['type'] = 'vopczc';
}
$data['delivery'] = $delivery['delivery'] ? $delivery['delivery'] : $order['shipping']['shipping_name'];
$data['logi_id'] = $delivery['logi_id'];
$data['memo'] = $delivery['memo'];
$data['delivery_group'] = $delivery['delivery_group'];
$data['sms_group'] = $delivery['sms_group'];
$data['branch_id'] = $delivery['branch_id'];
$data['wms_channel_id'] = $delivery['wms_channel_id'] ? : kernel::single('console_delivery_yjdf')->getWMSChannelId($delivery['branch_id'], $delivery['delivery_items']); //WMS渠道ID
//平台订单号
if(kernel::single('ome_order_bool_type')->isJDLVMI($order['order_bool_type'])) {
$data['platform_order_bn'] = $order['platform_order_bn'];
}elseif($order['platform_order_bn']){
$data['platform_order_bn'] = $order['platform_order_bn'];
}
$logi_name = "";
if ($is_diff_order) {
//补差价订单直接生成已发货的发货单 不涉及库存
$delivery['type'] = "reject";
$data['memo'] = "售后补差价订单:" . $order["order_bn"] . ",自动生成已发货的发货单。";
$logi_name = "其他物流公司";
$data['process'] = 'true';
$data['status'] = 'succ';
$data['delivery_time'] = time();
}
if ($delivery['type']) {
$data['type'] = $delivery['type'];
}
//计算预计物流费用
// 记录运费和重量计算开始时间
$freightStartTime = microtime(true);
$weight = 0;
if (isset($delivery['weight'])) {
$weight = $delivery['weight'];
} else {
//[拆单]根据发货单中货品详细读取重量
$orderSplitLib = kernel::single('ome_order_split');
$split_seting = $orderSplitLib->get_delivery_seting();
if ($split_seting) {
$weight = $orderSplitLib->getDeliveryWeight($order_id, $order_items);
} else {
$weight = $this->app->model('orders')->getOrderWeight($order_id);
}
}
list($area_prefix, $area_chs, $area_id) = explode(':', $ship_info['area']);
$price = 0.00;
if ($delivery['logi_id']) {
$price = $this->getDeliveryFreight($area_id, $delivery['logi_id'], $weight);
$dly_corp = $oDly_corp->dump($delivery['logi_id']);
$logi_name = $dly_corp['name'];
// 计算保价费用
$protect = $dly_corp['protect'];
if ($protect == 'true') {
$is_protect = 'true';
$protect_price = $dly_corp['protect_rate'] * $weight;
$cost_protect = max($protect_price, $dly_corp['minprice']);
}
}
// 计算运费和重量计算总耗时
$freightTime = microtime(true) - $freightStartTime;
// 记录运费和重量计算性能数据
ome_api_log::add_message('freight', 'freight_calculation', $freightTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
'order_id' => $order_id,
'logi_id' => $delivery['logi_id'] ?? '',
'weight' => $weight,
'freight_price' => $price
));
//[同城配]配送方式
if($dly_corp['corp_model'] == 'instatnt'){
//同城配送
$data['delivery'] = 'instatnt';
}elseif($dly_corp['corp_model'] == 'seller'){
//商家配送
$data['delivery'] = 'seller';
}
//order has logi_infoaikucun
if ($delivery['delivery_waybillCode']) {
$data['logi_no'] = $delivery['delivery_waybillCode'];
}
if ($delivery['delivery_sub_waybillCode']) {
$data['logi_number'] = count($delivery['delivery_sub_waybillCode']) + 1;
}
$data['logi_name'] = $logi_name;
$data['is_protect'] = $is_protect ? $is_protect : 'false';
$data['create_time'] = time();
$data['cost_protect'] = $cost_protect ? $cost_protect : '0';
$data['net_weight'] = $weight;
$data['delivery_cost_expect'] = $price;
$data['member_id'] = $delivery['member_id'] ? $delivery['member_id'] : $order['member_id'];
$data['shop_id'] = $order['shop_id'];
$data['shop_type'] = $order['shop_type'];
$data['delivery_items'] = $delivery['delivery_items'];
$data['consignee'] = $ship_info;
//权限相关
$data['org_id'] = $order['org_id']; //运营组织
$data['betc_id'] = $order['betc_id']; //贸易公司ID
$data['cos_id'] = $order['cos_id']; //组织架构ID
//支持四、五级地区
$temp_area = explode('/', $area_chs);
$data['consignee']['province'] = $temp_area[0];
$data['consignee']['city'] = $temp_area[1];
$data['consignee']['district'] = $temp_area[2];
$data['consignee']['town'] = empty($temp_area[3]) ? '' : $temp_area[3];
$data['consignee']['village'] = empty($temp_area[4]) ? '' : $temp_area[4];
$data['order_createtime'] = ($order['paytime'] && $is_cod == 'false') ? $order['paytime'] : $order['createtime']; #付款时间为空时取创建时间
$opInfo = kernel::single('ome_func')->getDesktopUser();
$data['op_id'] = $opInfo['op_id'];
$data['op_name'] = $opInfo['op_name'];
//得物急速现货
if ($order['order_type'] == 'jisuxianhuo') {
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__JISU_CODE;
}
if ($order['order_type'] == 'platform') {
$data['original_delivery_bn'] = $delivery_bn;
$data['bool_type'] = ($data['bool_type'] ? $data['bool_type'] : 0) | ome_delivery_bool_type::__PLATFORM_CODE;
}
if($order['shop_type'] == '360buy') {
if(kernel::single('ome_bill_label_shsm')->isTinyPieces($order['order_id'])) {
$data['bool_type'] = ($data['bool_type'] ? $data['bool_type'] : 0) | ome_delivery_bool_type::__SHSM_CODE;
}
}
// format
$bns = array();
$totalNum = 0;
foreach ($data['delivery_items'] as $dlyItemKey => $v) {
$product_id = $v['product_id'];
$totalNum += $v['number'];
$bns[$v['product_id']] = $v['bn'];
}
ksort($bns);
//11.25新增
$data['skuNum'] = count($delivery['delivery_items']);
$data['itemNum'] = $totalNum;
$data['bnsContent'] = serialize($bns);
$data['idx_split'] = $data['skuNum'] * 10000000000 + sprintf("%u", crc32($data['bnsContent']));
$data['bind_key'] = $this->getBindKey($data);
$data['bool_type'] = (int)$data['bool_type'];
$orderExtend = app::get('ome')->model("order_extend")->db_dump(array('order_id' => $order_id), '*');
if (kernel::single('ome_order_bool_type')->isCPUP($order['order_bool_type'])) {
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__CPUP_CODE;
//未发货之前,不能赋值,否则客户导出时有异议
//$data['delivery_time'] = $orderExtend['latest_delivery_time'];
$data['cpup_service'] = $orderExtend['cpup_service'];
$data['promise_service'] = $orderExtend['promise_service'];
$data['promised_collect_time'] = $orderExtend['promised_collect_time'];
$data['promised_sign_time'] = $orderExtend['promised_sign_time'];
$data['cpup_addon'] = serialize($orderExtend);
}
//[翱象]相关信息
if(in_array($order['shop_type'], array('taobao', 'tmall')) && $order['order_bool_type'] && $orderExtend){
//是否翱象订单
$orderTypeLib = kernel::single('ome_order_bool_type');
$isAoxiang = $orderTypeLib->isAoxiang($order['order_bool_type']);
if($isAoxiang){
//翱象发货单标识
$data['bool_type'] = $data['bool_type'] | ome_delivery_bool_type::__AOXIANG_CODE;
//物流升级服务
$data['cpup_service'] = $orderExtend['cpup_service'];
//最晚发货时间
//$data['delivery_time'] = $orderExtend['latest_delivery_time'];
//承诺最晚送达时间
$data['promised_sign_time'] = $orderExtend['promised_sign_time'];
//承诺最晚揽收时间
$data['promised_collect_time'] = $orderExtend['promised_collect_time'];
//承诺最晚出库时间
$data['promise_outbound_time'] = $orderExtend['latest_delivery_time'];
//承诺计划送达时间
$data['plan_sign_time'] = $orderExtend['plan_sign_time'];
//物流服务标签(多个订单合并取消合集)
$data['promise_service'] = $orderExtend['promise_service'];
}
}
if(kernel::single('ome_order_bool_type')->isJDLVMI($order['order_bool_type'])) {
$data['platform_order_bn'] = $order['platform_order_bn'];
}elseif($order['betc_id'] && $order['cos_id']){
//分销订单
$data['platform_order_bn'] = $order['platform_order_bn'];
}
//save
$saveStartTime = microtime(true);
$result = $this->save($data);
$saveTime = microtime(true) - $saveStartTime;
// 记录发货单保存性能数据
ome_api_log::add_message('database', 'delivery_save', $saveTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
'order_id' => $order_id
));
if (!$result || !$data['delivery_id']) {
$this->db->rollBack();
return array('rsp' => 'fail', 'msg' => '发货单生成失败');
}
if ($delivery['type'] != 'reject') {
$err_msg = '';
// product_id
$productIds = array_column($delivery['delivery_items'], 'product_id');
// 获取指定不需要管控库存的基础物料
$notCtrlStoreBmList = kernel::single('material_basic_material')->getNotCtrlStoreProducts($productIds);
if($notCtrlStoreBmList){
// 标记是否管控库存
foreach ($delivery['delivery_items'] as $dlyItemKey => $dlyItemVal)
{
$product_id = $dlyItemVal['product_id'];
// 是否管控库存
if(isset($notCtrlStoreBmList[$product_id]) && $notCtrlStoreBmList[$product_id]){
$delivery['delivery_items'][$dlyItemKey]['is_product_ctrl_store'] = false;
}else{
$delivery['delivery_items'][$dlyItemKey]['is_product_ctrl_store'] = true;
}
}
}
//库存管控
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id' => $delivery['branch_id']));
$params = array();
$params['params'] = array_merge($delivery, array('order_id' => $order_id, 'shop_id' => $order['shop_id'], 'delivery_id' => $data['delivery_id'], 'order_type' => $order['order_type']));
$params['node_type'] = 'addDly';
$shop = app::get('ome')->model('shop')->db_dump(['shop_id'=>$order['shop_id']], 'delivery_mode');
// 记录库存冻结开始时间
$inventoryFreezeStartTime = microtime(true);
if($shop['delivery_mode'] == 'jingxiao') {
$processResult = true; //经销发货单不产生冻结
} else {
$processResult = $storeManageLib->processBranchStore($params, $err_msg);
}
// 计算库存冻结耗时
$inventoryFreezeTime = microtime(true) - $inventoryFreezeStartTime;
// 记录库存冻结操作
ome_api_log::add_message('inventory', 'inventory_freeze', $inventoryFreezeTime, array(
'delivery_id' => $data['delivery_id'],
'branch_id' => $delivery['branch_id'],
'mode' => $shop['delivery_mode'] == 'jingxiao' ? 'jingxiao' : 'normal',
'result' => $processResult ? 'success' : 'failed'
));
if (!$processResult) {
$this->db->rollBack();
return array('rsp' => 'fail', 'msg' => $err_msg);
}
// 记录拆单处理开始时间
$splitProcessStartTime = microtime(true);
if (!kernel::single('ome_order_object_splitnum')->addDeliverySplitNum($order_items)) {
$this->db->rollBack();
return array('rsp' => 'fail', 'msg' => '明细已经生成发货单');
}
// 判断是否已经拆分完
$is_splited = app::get('ome')->model('order_items')->is_splited($order_id);
$split_status = $is_splited ? 'splited' : 'splitting';
//有优惠明细记录,实付进行重算
$order_items = $this->_regroupDeliveryItemDetailData($order_id,$order_items);
// 计算拆单处理耗时
$splitProcessTime = microtime(true) - $splitProcessStartTime;
// 记录优惠明细重算性能数据
ome_api_log::add_message('discount', 'discount_recalculation', $splitProcessTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
'order_id' => $order_id,
'split_status' => $split_status,
'is_splited' => $is_splited ? 'yes' : 'no'
));
}
if ($data['delivery_id'] && !empty($order_items) && is_array($order_items)) {
$this->create_delivery_items_detail($data['delivery_id'], $order_items);
}
//插关联表
if ($order_id) {
$rs = $this->db->exec('SELECT * FROM sdb_ome_delivery_order WHERE 0=1');
$ins = array('order_id' => $order_id, 'delivery_id' => $data['delivery_id']);
$sql = kernel::single("base_db_tools")->getinsertsql($rs, $ins);
$this->db->exec($sql);
}
//更新订单相应状态
$this->updateOrderLogi($data['delivery_id'], $data);
// 记录标签处理开始时间
$labelProcessStartTime = microtime(true);
// jitx 检测订单是否有标签
if (in_array(strtolower($order['shop_type']),['vop','luban'])) {
kernel::single('ome_bill_label')->transferLabel('omeorders_to_omedelivery', [
'order_id' => $order_id,
'ome_delivery_id' => $data['delivery_id'],
]);
}
// 标签扩展信息(Json格式)
$bill_extend_info = '';
if($extendInfo){
$bill_extend_info = is_array($extendInfo) ? json_encode($extendInfo, JSON_UNESCAPED_UNICODE) : $extendInfo;
}
//标签写入发货单
kernel::single('ome_bill_label')->orderToDeliveryLabel($order_id, $data['delivery_id'], 'ome_delivery', $bill_extend_info);
//打上标
kernel::single('ome_bill_label_delivery')->ToDeliveryPresaleLabel($order, $data['delivery_id']);
// 计算标签处理耗时
$labelProcessTime = microtime(true) - $labelProcessStartTime;
// 记录标签处理性能数据
ome_api_log::add_message('label', 'label_process', $labelProcessTime, array(
'delivery_id' => $data['delivery_id'] ?? '',
'order_id' => $order_id,
'shop_type' => $order['shop_type'] ?? ''
));
$this->db->commit();
/*
if ($is_diff_order) { //调用方法的外层会更新当前订单为已发货并发起发货单回写请求
} else {
//发货单创建
kernel::single('ome_event_trigger_shop_delivery')->delivery_add($data['delivery_id']);
}
*/
return array('rsp' => 'succ', 'data' => $data);
}
/**
* 根据优惠明细 - 重组delivery_items_detail 订单实付、用户实付、销售实付
* @param $order_id
* @param $order_items
* @return mixed
*/
public function _regroupDeliveryItemDetailData($order_id, $order_items)
{
$deliveryItemDetailMdl = app::get('ome')->model('delivery_items_detail');
$orderCouponDetailObj = app::get('ome')->model('order_coupon');
$itemsMdl = app::get('ome')->model('order_items');
//平台金额明细
$couponRow = $orderCouponDetailObj->getCouponAmountList($order_id);
//查询当前订单下的所有发货单id
$delivery_ids = $this->getDeliverIdByOrderId($order_id);
$deliveryItemDetailList = $deliveryItemDetailMdl->getList('*', array('delivery_id'=>$delivery_ids));
$devideFee = array();
foreach ($deliveryItemDetailList as $key => $value) {
$oid = $value['oid'];
$item_type = $value['item_type'];
$product_id = $value['product_id'];
//键名
if($value['item_type'] == 'pkg'){
$key_name = $oid .'-'. $product_id;
}else{
$key_name = $oid;
}
$devideFee[$key_name]['divide_user_fee'] += $value['divide_user_fee'];
$devideFee[$key_name]['divide_order_fee'] += $value['divide_order_fee'];
$devideFee[$key_name]['origin_amount'] += $value['origin_amount'];
$devideFee[$key_name]['total_promotion_amount'] += $value['total_promotion_amount'];
//货品总价格
$devideFee[$key_name]['total_price'] += $value['total_price'];
}
//order_items
$itemIds = array_column($order_items,'item_id');
$orderItemList = $itemsMdl->getList('*', array('item_id'=>$itemIds));
$orderItemList = array_column($orderItemList,null,'item_id');
//是否存在捆绑商品
$isPkg = false;
foreach($orderItemList as $key => $value)
{
if($value['item_type'] == 'pkg'){
$isPkg = true;
break;
}
}
//均摊PKG捆绑商品的相关金额
$pkgItemList = array();
if($isPkg && $couponRow){
$pkgItemList = $orderCouponDetailObj->avgCouponPkgAmount($order_id, $couponRow);
}
//list
foreach ($order_items as $key => $item)
{
$item_id = $item['item_id'];
$oid = $item['oid'];
$product_id = $item['product_id'];
$total_price = 0;
$order_items[$key]['divide_order_fee'] = isset($orderItemList[$item_id]['divide_order_fee']) ? bcmul(bcdiv($orderItemList[$item_id]['divide_order_fee'], $orderItemList[$item_id]['nums'], 2), $item['number'], 2) : 0;
$order_items[$key]['retail_price'] = $orderItemList[$item_id]['price'];
//item_type
$item['item_type'] = ($item['item_type'] ? $item['item_type'] : $orderItemList[$item_id]['item_type']);
//键名
if($value['item_type'] == 'pkg'){
$key_name = $oid .'-'. $product_id;
}else{
$key_name = $oid;
}
//平台相关金额
$devideUserFee = 0; //用户实付
$origin_amount = 0; //商品单件价格
$total_promotion_amount = 0; //SKU商品优惠
// 客户实付
$actually_amount = (isset($orderItemList[$item_id]['actually_amount']) ? $orderItemList[$item_id]['actually_amount'] : 0);
//PKG捆绑商品
if($item['item_type'] == 'pkg'){
//平台支付明细
if($pkgItemList){
$devideUserFee = $pkgItemList[$oid]['pkg_items'][$product_id]['avg_amount'];
$origin_amount = $pkgItemList[$oid]['pkg_items'][$product_id]['avg_origin_amount'];
$total_promotion_amount = $pkgItemList[$oid]['pkg_items'][$product_id]['avg_promotion_amount'];
//sku货品总价格(单价*数量)
$buy_nums = intval($pkgItemList[$oid]['pkg_items'][$product_id]['buy_nums']);
if($item['number'] == $buy_nums){
//未拆分直接取SKU总价格
$total_price = $pkgItemList[$oid]['pkg_items'][$product_id]['sku_total_price'];
}else{
$total_price = bcmul($origin_amount, $item['number'], 2);
//实付金额
$devideUserFee = $buy_nums != 0 ? bcdiv($devideUserFee, $buy_nums, 2) : 0;
$devideUserFee = bcmul($devideUserFee, $item['number'], 2);
}
}else{
//用户实付
$devideUserFee = $order_items[$key]['divide_order_fee'];
//商品单件价格
$origin_amount = $order_items[$key]['retail_price'];
//SKU商品优惠
$total_promotion_amount = $orderItemList[$item_id]['part_mjz_discount'];
//sku货品总价格(单价*数量)
$total_price = bcmul($origin_amount, $item['number'], 2);
}
}else{
//普通商品
//用户实付
if(isset($couponRow[$oid]['user_payamount'])){
$devideUserFee = bcmul(bcdiv($couponRow[$oid]['user_payamount'], $orderItemList[$item_id]['nums'], 2), $item['number'], 2);
}else{
$devideUserFee = $order_items[$key]['divide_order_fee'];
}
//商品单件价格
$origin_amount = isset($couponRow[$oid]['origin_amount']) ? $couponRow[$oid]['origin_amount'] : $order_items[$key]['retail_price'];
//SKU商品优惠
$total_promotion_amount = isset($couponRow[$oid]['total_promotion_amount']) ? $couponRow[$oid]['total_promotion_amount'] : $orderItemList[$item_id]['part_mjz_discount'];
//sku货品总价格(单价*数量)
$total_price = bcmul($origin_amount, $item['number'], 2);
}
//单个优惠金额
if($orderItemList[$item_id]['nums'] > 1){
$total_promotion_amount = bcdiv($total_promotion_amount, $orderItemList[$item_id]['nums'], 2);
$total_promotion_amount = bcmul($total_promotion_amount, $item['number'], 2);
}
$order_items[$key]['divide_user_fee'] = empty($devideUserFee) ? 0 : $devideUserFee;
$order_items[$key]['total_promotion_amount'] = empty($total_promotion_amount) ? 0 : $total_promotion_amount;
$order_items[$key]['origin_amount'] = empty($origin_amount) ? 0 : $origin_amount;
$order_items[$key]['total_price'] = $total_price;
//如果是最后一单实付金额重算,实付 - 累加小计 = 实付
if ($orderItemList[$item_id]['split_num'] != $orderItemList[$item_id]['nums']) {
continue;
}
//以下是拆分订单时,最后一次拆单场景;
$devideUser = isset($devideFee[$key_name]['divide_user_fee']) ? $devideFee[$key_name]['divide_user_fee'] : 0 ;
$devideOrder = isset($devideFee[$key_name]['divide_order_fee']) ? $devideFee[$key_name]['divide_order_fee'] : 0 ;
$dly_origin_amount = isset($devideFee[$key_name]['origin_amount']) ? $devideFee[$key_name]['origin_amount'] : 0 ;
$dly_total_promotion_amount = isset($devideFee[$key_name]['total_promotion_amount']) ? $devideFee[$key_name]['total_promotion_amount'] : 0 ;
//coupon
//PKG捆绑商品
if($item['item_type'] == 'pkg'){
//平台支付明细
if($pkgItemList){
$residue = $pkgItemList[$oid]['pkg_items'][$product_id]['avg_amount'];
$total_promotion_amount = $pkgItemList[$oid]['pkg_items'][$product_id]['avg_promotion_amount'];
}else{
$residue = $order_items[$key]['divide_order_fee'];
$total_promotion_amount = $orderItemList[$item_id]['part_mjz_discount'];
}
}else{
//普通商品
//用户实付
if(isset($couponRow[$oid]['user_payamount'])){
$residue = $couponRow[$oid]['user_payamount'];
}else{
$residue = $order_items[$key]['divide_order_fee'];
}
//SKU货品总优惠
if(isset($couponRow[$oid]['total_promotion_amount'])){
$total_promotion_amount = $couponRow[$oid]['total_promotion_amount'];
}else{
$total_promotion_amount = $orderItemList[$item_id]['part_mjz_discount'];
}
}
$residue = (empty($residue) ? 0 : $residue);
$total_promotion_amount = (empty($total_promotion_amount) ? 0 : $total_promotion_amount);
//diff
$devideUserFee = $residue - $devideUser;
if ($devideUser <= 0) {
$devideUserFee = $residue;
}
if (!$residue) {
$devideUserFee = 0;
}
$order_items[$key]['divide_user_fee'] = $devideUserFee;
$devideOrderFee = $orderItemList[$item_id]['divide_order_fee'] - $devideOrder;
if ($devideOrder <= 0) {
$devideOrderFee = $orderItemList[$item_id]['divide_order_fee'];
}
if ($orderItemList[$item_id]['divide_order_fee'] <= 0) {
$devideOrderFee = 0;
}
$order_items[$key]['divide_order_fee'] = $devideOrderFee;
// 客户实付
$order_items[$key]['actually_amount'] = $actually_amount;
//SKU商品优惠
$diff_promotion_amount = $total_promotion_amount - $dly_total_promotion_amount;
$diff_promotion_amount = ($diff_promotion_amount <= 0 ? $total_promotion_amount : $diff_promotion_amount);
$order_items[$key]['total_promotion_amount'] = $diff_promotion_amount;
//[pkg拆单]最后一次拆分
if($item['item_type'] == 'pkg' && $pkgItemList){
//剩余sku货品总价格
if($devideFee[$key_name]['total_price']){
$sku_total_price = $pkgItemList[$oid]['pkg_items'][$product_id]['sku_total_price'];
$order_items[$key]['total_price'] = bcsub($sku_total_price, $devideFee[$key_name]['total_price'], 2);
}
//[兼容]最后一次拆分数量为1个,并且没有优惠金额时,直接用剩余用户实付金额
//@todo当捆绑商品拆分多次后,单价均摊不均,导致报错:(商品数量*商品单价) != 用户实付金额;
if($item['number'] == 1 && empty($order_items[$key]['total_promotion_amount'])){
$order_items[$key]['origin_amount'] = $devideOrderFee;
}
}
}
return $order_items;
}
public function create_delivery_items_detail($delivery_id, $order_items)
{
$didObj = $this->app->model('delivery_items_detail');
$diObj = $this->app->model('delivery_items');
$oiObj = $this->app->model('order_items');
foreach ($order_items as $item)
{
$oi = $di = $di_item = $did = array();
$oi = $oiObj->dump($item['item_id']);
$di = $diObj->dump(array('delivery_id' => $delivery_id, 'product_id' => $item['product_id']));
$item_id = $di['item_id'];
//save
$item_price = 0;
$item_price = $oi['sale_price'] / $oi['quantity'];
$did = array(
'delivery_id' => $delivery_id,
'delivery_item_id' => $item_id,
'order_id' => $oi['order_id'],
'order_item_id' => $oi['item_id'],
'order_obj_id' => $oi['obj_id'],
'item_type' => $oi['item_type'],
'product_id' => $oi['product_id'],
'bn' => $oi['bn'],
'number' => $item['number'],
'price' => $item_price,
'amount' => $item['number'] * $item_price,
'oid' => $item['oid'],
's_type' => $item['s_type'],
'divide_order_fee' => $item['divide_order_fee'],
'divide_user_fee' => $item['divide_user_fee'],
'retail_price' => $item['retail_price'],
'origin_amount' => $item['origin_amount'], //货品单件价格
'total_price' => $item['total_price'], //货品总价格(单价*数量)
'total_promotion_amount' => $item['total_promotion_amount'], //SKU商品优惠
'actually_amount' => (isset($item['actually_amount']) ? $item['actually_amount'] : 0), // 客户实付
);
$didObj->save($did);
}
}
public function call_delivery_api($delivery_id, $fastConsign = false)
{
kernel::single('ome_event_trigger_shop_delivery')->delivery_confirm_send($delivery_id);
}
public function array2xml2($data, $root = 'root')
{
$xml = '<' . $root . '>';
$this->_array2xml($data, $xml);
$xml .= '</' . $root . '>';
return $xml;
}
public function _array2xml(&$data, &$xml)
{
if (is_array($data)) {
foreach ($data as $k => $v) {
if (is_numeric($k)) {
$xml .= '<item>';
$xml .= $this->_array2xml($v, $xml);
$xml .= '</item>';
} else {
$xml .= '<' . $k . '>';
$xml .= $this->_array2xml($v, $xml);
$xml .= '</' . $k . '>';
}
}
} elseif (is_numeric($data)) {
$xml .= $data;
} elseif (is_string($data)) {
$xml .= '<![CDATA[' . $data . ']]>';
}
}
public function existStockIsPlus($product_id, $store, $item_id, $branch_id, &$err_msg, $bn)
{
$err_msg = '';
$branch_pObj = $this->app->model("branch_product");
$bp = $branch_pObj->dump(array('branch_id' => $branch_id, 'product_id' => $product_id), 'store');
if ($bp['store'] < $store) {
$err_msg = $bn . ":此货号商品仓库商品数量不足";
return false;
}
return true;
}
/*
* 校验发货单
*/
public function verifyDelivery($dly, $auto = false)
{
$dly_id = $dly['delivery_id'];
$dly_itemObj = $this->app->model('delivery_items');
$opObj = $this->app->model('operation_log');
//对发货单详情进行校验完成处理
if ($dly_itemObj->verifyItemsByDeliveryId($dly_id)) {
$delivery['delivery_id'] = $dly_id;
$delivery['verify'] = 'true';
if (!$this->save($delivery)) {
return false;
}
if ($dly['is_bind'] == 'true') {
$ids = $this->getItemsByParentId($dly_id, 'array');
foreach ($ids as $i) {
$dly_itemObj->verifyItemsByDeliveryId($i);
}
}
//增加捡货绩效
foreach (kernel::servicelist('tgkpi.pick') as $o) {
if (method_exists($o, 'finish_pick')) {
$o->finish_pick($dly_id);
}
}
if ($auto) {
$msg = '发货单校验完成(免校验)';
} else {
$msg = '发货单校验完成';
}
if (kernel::single('desktop_user')->get_id()) {
$opObj->write_log('delivery_check@ome', $dly_id, $msg);
}
#淘宝全链路 已捡货,已验货
$this->sendMessageProduce($dly_id, 'picking');
return true;
} else {
if (kernel::single('desktop_user')->get_id()) {
$opObj->write_log('delivery_check@ome', $dly_id, '发货单校验未完成');
}
return false;
}
}
/**
* 淘宝全链路 已验货
*/
public function sendMessageProduce($delivery_id, $statusArr)
{
if (empty($this->deliveryOrderModel)) {
$this->getDeliveryOrderModel();
}
$deliveryOrderInfo = $this->deliveryOrderModel->getList('*', array('delivery_id' => $delivery_id));
$orderIds = array();
foreach ($deliveryOrderInfo as $delivery_order) {
$orderIds[] = $delivery_order['order_id'];
}
kernel::single('ome_event_trigger_shop_order')->order_message_produce($orderIds, $statusArr);
}
/**
* 发送CRM赠品日志
* @param Int $delivery_id
*/
public function crmSendGiftLog($delivery_id)
{
if (empty($this->deliveryOrderModel)) {
$this->getDeliveryOrderModel();
}
$obj_crm_rpc = kernel::single('crm_rpc_gift');
$deliveryOrderInfo = $this->deliveryOrderModel->getList('*', array('delivery_id' => $delivery_id));
foreach ($deliveryOrderInfo as $delivery_order) {
$logData = $this->getCrmGiftLog($delivery_order['order_id']);
if ($logData) {
$obj_crm_rpc->getGiftRuleLog($logData);
}
}
}
/**
* 验证CRM赠品是否发送
* @param Int $delivery_id
*/
public function getCrmGiftLog($order_id)
{
if (!$order_id) {
return false;
}
$app_type = channel_ctl_admin_channel::$appType;
$obj_channel = app::get('channel')->model('channel');
$node_info = $obj_channel->getList('node_id', array('channel_type' => $app_type['crm']));
if (empty($node_info) || strlen($node_info[0]['node_id']) <= 0) {
return false;
}
$crm_cfg = app::get('crm')->getConf('crm.setting.cfg');
if (empty($crm_cfg)) {
return false;
}
if ($crm_cfg['gift'] != 'on') {
return false;
}
$orderObj = app::get('ome')->model('orders');
$order_info = $obj_channel->getOrderInfo($order_id);
if (empty($order_info)) {
return false;
}
$shop_id = $order_info['shop_id']; #店铺节点
if (empty($crm_cfg['name'][$shop_id])) {
return false;
}
#赠品数据
$order_item_info = $obj_channel->getOrderItemInfo($order_id, 'gift');
# $order_item_info = $obj_channel->getOrderItemInfo($order_id);
if (empty($order_item_info)) {
return false;
}
$mobile = $order_info['ship_mobile'] ? $order_info['ship_mobile'] : '';
$tel = $order_info['ship_tel'] ? $order_info['ship_tel'] : '';
$ship_area = $order_info['ship_area'];
$ship_area_arr = '';
if ($ship_area && is_string($ship_area)) {
$firstPos = strpos($ship_area, ':');
$lastPos = strrpos($ship_area, ':');
$newShipArea = substr($ship_area, $firstPos + 1, ($lastPos - $firstPos - 1));
$ship_area_arr = explode('/', $newShipArea);
}
$payed = $order_info['payed'] ? $order_info['payed'] : 0; #付款金额
$isCod = $order_info['is_cod'] == 'true' ? 1 : 0; #是否货到付款
$logData = array(
'buyer_nick' => $order_info['uname'],
'receiver_name' => $order_info['ship_name'],
'mobile' => $mobile,
'tel' => $tel,
'shop_id' => $shop_id,
'order_bn' => $order_info['order_bn'],
'province' => $ship_area_arr[0],
'city' => $ship_area_arr[1],
'district' => $ship_area_arr[2],
'total_amount' => $order_info['total_amount'],
'payed' => $payed,
'is_cod' => $isCod,
'addon' => $order_item_info,
);
return $logData;
}
/**
* 获得发货单订单关联模式
* Enter description here ...
*/
public function getDeliveryOrderModel()
{
$this->deliveryOrderModel = $this->app->model('delivery_order');
}
public function queueConsign($delivery_id)
{
$oQueue = app::get('base')->model('queue');
$queueData = array(
'queue_title' => '订单导入',
'start_time' => time(),
'params' => array(
'sdfdata' => $delivery_id,
'app' => 'ome',
'mdl' => 'delivery',
),
'worker' => 'ome_delivery_consign.run',
);
$oQueue->save($queueData);
}
/*
* 处理订单发货数量
*/
public function consignOrderItem($delivery)
{
$ord_itemObj = $this->app->model('order_items');
$didObj = $this->app->model('delivery_items_detail');
if (!empty($delivery['delivery_items'])) {
foreach ($delivery['delivery_items'] as $r) {
$filter = array(
'delivery_item_id' => $r['item_id'],
'product_id' => $r['product_id'],
);
$rows = $didObj->getList('item_detail_id,order_item_id,number', $filter, 0, -1);
if ($rows) {
foreach ($rows as $row) {
$num = (int) $row['number'];
$sql = "UPDATE sdb_ome_order_items SET sendnum = IFNULL(sendnum,0)+" . $num . " WHERE item_id=" . $row['order_item_id'];
$this->db->exec($sql);
}
}
unset($rows);
}
}
}
/**
* 获取电子面单类型
*/
public function getChannelType($logi_id)
{
$channel_type = '';
if ($logi_id > 0) {
$dlyCorpObj = app::get('ome')->model('dly_corp');
$dlyCorp = $dlyCorpObj->dump($logi_id, 'channel_id,tmpl_type,shop_id');
if ($dlyCorp['channel_id'] > 0) {
$channelObj = app::get('logisticsmanager')->model('channel');
$channel = $channelObj->dump($dlyCorp['channel_id']);
$channel_type = $channel['channel_type'];
}
}
return $channel_type;
}
public function getShopType($delivery_id)
{
if (!$delivery_id) {
return false;
}
$deliveryObj = app::get('ome')->model('delivery');
$delivery_orderObj = app::get('ome')->model('delivery_order');
$orderObj = app::get('ome')->model('orders');
$shopObj = app::get('ome')->model('shop');
$delivery_detail = $deliveryObj->dump($delivery_id, 'is_bind,parent_id');
$delivery_order = $delivery_orderObj->dump(array('delivery_id' => $delivery_id));
$order_detail = $orderObj->dump($delivery_order['order_id'], 'ship_status,shop_id');
$shop_detail = $shopObj->dump($order_detail['shop_id'], 'node_type');
$shop_type = $shop_detail['node_type'];
return $shop_type;
}
public function getDeliveryCost($area_id = 0, $logi_id = 0, $weight = 0)
{
if ($logi_id && $logi_id > 0) {
$dlyCorpObj = $this->app->model('dly_corp');
$corp = $dlyCorpObj->dump($logi_id); //物流公司信息
}
//物流预算费用计算
if ($area_id && $area_id > 0) {
$regionObj = kernel::single('eccommon_regions');
$region = $regionObj->getOneById($area_id);
$regionIds = explode(',', $region['region_path']);
foreach ($regionIds as $key => $val) {
if ($regionIds[$key] == '' || empty($regionIds[$key])) {
unset($regionIds[$key]);
}
}
}
if ($corp['area_fee_conf'] && $regionIds) {
$area_fee_conf = unserialize($corp['area_fee_conf']);
foreach ($area_fee_conf as $k => $v) {
$areaIds = array();
$areaIds = explode(',', $v['areaGroupId']);
if (array_intersect($areaIds, $regionIds)) {
//如果配送地区匹配,优先使用地区设置的配送费用,及公式
$corp['firstprice'] = $v['firstprice'];
$corp['continueprice'] = $v['continueprice'];
$corp['dt_expressions'] = $v['dt_expressions'];
break;
}
}
}
if ($corp['dt_expressions'] && $corp['dt_expressions'] != '') {
$price = utils::cal_fee($corp['dt_expressions'], $weight, 0, $corp['firstprice'], $corp['continueprice']); //TODO 生成快递费用
} else {
$price = 0;
}
return $price;
}
public function searchOptions()
{
$parentOptions = parent::searchOptions();
$childOptions = array(
'order_bn' => app::get('base')->_('订单号'),
'delivery_bn' => app::get('base')->_('发货单号'),
'member_uname' => app::get('base')->_('用户名'),
'ship_name' => app::get('base')->_('收货人'),
'ship_mobile' =>app::get('ome')->_('联系手机'),
'ship_tel' =>app::get('ome')->_('联系电话'),
'product_bn' => app::get('base')->_('货号'),
'product_barcode' => app::get('base')->_('条形码'),
'delivery_ident' => app::get('base')->_('打印批次号'),
);
return array_merge($childOptions, $parentOptions);
}
public function getDeliveryOrderCreateTime($dly_ids)
{
$str_dly_ids = implode(',', $dly_ids);
$sql = 'SELECT order_createtime FROM sdb_ome_delivery WHERE delivery_id IN(' . $str_dly_ids . ')';
$rows = $this->db->select($sql);
if ($rows) {
$lenOrder = count($rows);
$order_createtime = $rows[0]['order_createtime'];
for ($i = 1; $i < $lenOrder; $i++) {
if (isset($rows[$i])) {
if ($order_createtime > $rows[$i]['order_createtime']) {
$order_createtime = $rows[$i]['order_createtime'];
}
}
}
return $order_createtime;
} else {
return false;
}
}
public function getAllTotalAmountByDelivery($delivery_order)
{
$order_total_amount = 0;
if (count($delivery_order) > 1) {
//合并
$is_vaild = true;
foreach ($delivery_order as $deli_order) {
$total_amount = $this->getTotalAmountByDelivery($deli_order['order_id'], $deli_order['delivery_id']);
if ($total_amount) {
$order_total_amount += $total_amount;
} else {
$is_vaild = false;
break;
}
}
if (!$is_vaild) {
$order_total_amount = 0;
}
} else {
//单张
$delivery_order = current($delivery_order);
$order_total_amount = $this->getTotalAmountByDelivery($delivery_order['order_id'], $delivery_order['delivery_id']);
}
return $order_total_amount;
}
public function getTotalAmountByDelivery($order_id, $delivery_id)
{
$order_total_amount = 0;
$objOrders = $this->app->model('orders');
$order = $objOrders->order_detail($order_id);
if ($order['process_status'] == 'splited') {
//已拆分
$ids = $this->getDeliverIdByOrderId($order_id);
if (count($ids) == 1) {
//发货单必须是一张
$order_total_amount = $order['total_amount'];
}
}
return $order_total_amount;
}
/**
* 根据订单ID获取发货单的商品
*
* @param $order_id
* @return array
*/
public function getDeliverItemByOrderId($order_id)
{
$list = $this->db->select("SELECT dt.* FROM sdb_ome_delivery_order AS dord
LEFT JOIN sdb_ome_delivery AS d ON(dord.delivery_id=d.delivery_id)
LEFT JOIN sdb_ome_delivery_items AS dt ON d.delivery_id = dt.delivery_id
WHERE dord.order_id='{$order_id}' AND d.is_bind='false' AND d.disabled='false' AND d.status IN ('ready','progress','succ') AND d.pause='false'");
$new_list = array();
foreach ($list as $item) {
if (!isset($new_list[$item['delivery_id']])) {
$new_list[$item['delivery_id']] = array();
}
$new_list[$item['delivery_id']][] = $item;
}
return $new_list;
}
/**
* 根据订单ID获取发货单列表
*
* @param $order_id
* @return array
*/
public function getDeliversByOrderId($order_id)
{
return $this->db->select("SELECT d.* 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.is_bind='false' AND d.disabled='false' AND d.status IN ('ready','progress','succ') AND d.pause='false'");
}
/**
* 统计已打印完成待校验的发货单总数
*/
public function countNoVerifyDelivery()
{
//$status_cfg = $this->app->getConf('ome.delivery.status.cfg');
$deliCfgLib = kernel::single('ome_delivery_cfg');
$btncombi_single = $deliCfgLib->btnCombi('single');
$btncombi_multi = $deliCfgLib->btnCombi('multi');
$btncombi_basic = $deliCfgLib->btnCombi();
$filter = array(
'parent_id' => 0,
'expre_status' => 'true',
'verify' => 'false',
'disabled' => 'false',
'pause' => 'false',
'status' => 'progress',
);
$filter['print_finish'] = array(
'' => $btncombi_basic,
'single' => $btncombi_single,
'multi' => $btncombi_multi,
);
if ($deliCfgLib->deliveryCfg == '') {
$filter['addonSQL'] = ' logi_no IS NOT NULL ';
}
$oBranch = app::get('ome')->model('branch');
$is_super = kernel::single('desktop_user')->is_super();
if (!$is_super) {
$branch_ids = $oBranch->getBranchByUser(true);
if ($branch_ids) {
$filter['branch_id'] = $branch_ids;
}
}
$num = $this->count_logi_no($filter);
return $num;
}
/**
* 统计已校验待发货的发货单总数
*/
public function countNoProcessDelivery()
{
$filter = array(
'parent_id' => 0,
// 'stock_status' => 'true',
// 'deliv_status' => 'true',
// 'expre_status' => 'true',
'verify' => 'true',
'disabled' => 'false',
'pause' => 'false',
'process' => 'false',
'status' => 'progress',
);
$oBranch = app::get('ome')->model('branch');
$is_super = kernel::single('desktop_user')->is_super();
if (!$is_super) {
$branch_ids = $oBranch->getBranchByUser(true);
if ($branch_ids) {
$filter['branch_id'] = $branch_ids;
}
}
$num = $this->count($filter);
return $num;
}
/**
* 统计子物流表待发货的发货单总数
* wujian@shopex.cn
* 2012年3月19日
*/
public function countNoProcessDeliveryBill()
{
$filter = array(
'parent_id' => 0,
// 'stock_status' => 'true',
// 'deliv_status' => 'true',
// 'expre_status' => 'true',
'verify' => 'true',
'disabled' => 'false',
'pause' => 'false',
'process' => 'false',
'status' => 'progress',
);
$oBranch = app::get('ome')->model('branch');
$is_super = kernel::single('desktop_user')->is_super();
if (!$is_super) {
$branch_ids = $oBranch->getBranchByUser(true);
if ($branch_ids) {
$filter['branch_id'] = $branch_ids;
}
}
/*$num =0;
//$num = $this->count($filter);
$numarr = $this->getList('logi_number, delivery_logi_number', $filter, 0, -1);
for($i=0;$i<=count($numarr);$i++){
$num += $numarr[$i]['logi_number']-$numarr[$i]['delivery_logi_number'];
}*/
$num = $this->count($filter);
$dataDly = $this->getList('delivery_id', $filter, 0, -1);
$billObj = app::get('ome')->model('delivery_bill');
foreach ($dataDly as $v) {
$billFilter = array(
'status' => 0,
'delivery_id' => $v['delivery_id'],
);
$num += $billObj->count($billFilter);
}
return $num;
}
public function getOrderByDeliveryId($delivery_id)
{
if ($delivery_id) {
$sql = "SELECT O.pay_status,O.order_bn FROM `sdb_ome_orders` as O LEFT JOIN
`sdb_ome_delivery_order` as DO ON DO.order_id=O.order_id
WHERE DO.delivery_id ='" . $delivery_id . "'";
$rows = $this->db->selectrow($sql);
return $rows;
}
}
public function getOrderByDeliveryBn($delivery_bn)
{
if ($delivery_bn) {
$sql = "SELECT O.* FROM `sdb_ome_orders` as O LEFT JOIN
`sdb_ome_delivery_order` as DO ON DO.order_id=O.order_id
LEFT JOIN sdb_ome_delivery as D ON D.delivery_id=DO.delivery_id
WHERE D.delivery_bn ='" . $delivery_bn . "'";
$rows = $this->db->selectrow($sql);
return $rows;
}
}
//从载方法 以解决 发货中未录入快递单号不能过滤的bug
// function getlist_logi_no($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);
// }
// $orderType = $orderType?$orderType:$this->defaultOrder;
// if($filter['logi_no'] == 'NULL'){
// unset($filter['logi_no']);
// $sql = 'SELECT '.$cols.' FROM `'.$this->table_name(true).'` WHERE '.$this->_filter($filter).' AND `logi_no` IS NULL';
// }else{
// $sql = 'SELECT '.$cols.' FROM `'.$this->table_name(true).'` WHERE '.$this->_filter($filter);
// }
// if ($orderType)
// $sql.=' ORDER BY ' . (is_array($orderType) ? implode($orderType, ' ') : $orderType);
// $data = $this->db->selectLimit($sql,$limit,$offset);
// $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;
// }
//从载方法 以解决 发货中未录入快递单号不能过滤的bug
public function getlist_logi_no($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);
}
$orderType = $orderType ? $orderType : $this->defaultOrder;
if ($filter['logi_no'] == 'NULL') {
unset($filter['logi_no']);
$where = $this->_filter($filter) . ' AND `logi_no` IS NULL';
} else {
$where = $this->_filter($filter);
}
//增加对 idx_split 的 order 排序的支持
$orderType = (is_array($orderType) ? implode(' ', $orderType) : $orderType);
$table = $this->table_name(true);
if (strpos($orderType, 'idx_split') !== false) {
$table .= " LEFT JOIN (SELECT COUNT(idx_split) AS iNum, idx_split AS idx FROM {$table} WHERE {$where} GROUP BY idx_split ) AS i ON i.idx=idx_split";
$orderType = str_replace('idx_split', 'skuNum, itemNum, iNum DESC, idx_split,delivery_id', $orderType);
}
$sql = 'SELECT ' . $cols . ' FROM ' . $table . ' WHERE ' . $where;
if ($orderType
) {
$sql .= ' ORDER BY ' . $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;
}
public function count_logi_no($filter = null)
{
if ($filter['logi_no'] == 'NULL') {
unset($filter['logi_no']);
$row = $this->db->select('SELECT count(*) as _count FROM `' . $this->table_name(1) . '` WHERE ' . $this->_filter($filter) . ' AND `logi_no` IS NULL');
} else {
$row = $this->db->select('SELECT count(*) as _count FROM `' . $this->table_name(1) . '` WHERE ' . $this->_filter($filter));
}
return intval($row[0]['_count']);
}
public function getPrintStockPrice($ids)
{
$data = array();
$sql = 'SELECT did.bn,SUM(did.amount) AS _amount FROM sdb_ome_delivery_items_detail AS did WHERE did.delivery_id IN(' . implode(',', $ids) . ') GROUP BY did.bn';
$rows = $this->db->select($sql);
foreach ($rows as $row) {
$data[strtoupper($row['bn'])] = $row['_amount'];
}
return $data;
}
/**
* 根据物流ID获取站内对应的物流公司
* @param array $logi_ids
*
*/
public function getOMELogiName($logi_ids)
{
if (!$logi_ids) {
return false;
}
$logi_names = $this->db->select('SELECT corp_id,name FROM sdb_ome_dly_corp WHERE corp_id IN(' . implode(',', $logi_ids) . ')');
$new_logi_names = array();
if ($logi_names) {
foreach ($logi_names as $l) {
$new_logi_names[$l['corp_id']] = $l['name'];
}
return $new_logi_names;
} else {
return false;
}
}
public function getPrintProductName($ids)
{
$printProductNames = array();
$sql = 'SELECT distinct oi.order_id,oi.name,oi.bn,oi.addon,bp.store_position
FROM sdb_ome_delivery_order AS d2o
LEFT JOIN sdb_ome_order_items AS oi
ON d2o.order_id = oi.order_id
LEFT JOIN (
SELECT bpp.*
FROM (
SELECT pos_id,product_id
FROM sdb_ome_branch_product_pos
ORDER BY create_time DESC
)bpp
GROUP BY bpp.product_id
)bb
ON bb.product_id = oi.product_id
LEFT JOIN sdb_ome_branch_pos bp
ON bp.pos_id = bb.pos_id
WHERE d2o.delivery_id IN(' . implode(',', $ids) . ') ORDER BY d2o.order_id';
$rows = $this->db->select($sql);
foreach ($rows as $row) {
$row['bn'] = trim($row['bn']);
if (isset($printProductNames[$row['bn']])) {
continue;
}
$row['addon'] = ome_order_func::format_order_items_addon($row['addon']);
$printProductNames[$row['bn']] = $row;
}
return $printProductNames;
}
public function getOrderIdsByDeliveryIds($delivery_ids)
{
$rows = $this->db->select('select order_id from sdb_ome_delivery_order where delivery_id in(' . implode(',', $delivery_ids) . ')');
$order_ids = array();
foreach ($rows as $row) {
$order_ids[] = $row['order_id'];
}
return $order_ids;
}
public function update($data, $filter = array(), $mustUpdate = null)
{
//取id和更新上下位置换一下解决由于发货单更新后订单更新打印状态查询不到发货单id的问题因为发货单发货状态变成已发货了
//获取更新的列表
$deliveryIds = $this->getList('delivery_id', $filter);
foreach ($this->__encrypt_cols as $field => $type) {
if (isset($data[$field])) {
$data[$field] = (string) kernel::single('ome_security_factory')->encryptPublic($data[$field], $type);
}
}
//调用原有处理
$result = parent::update($data, $filter, $mustUpdate);
if (!empty($deliveryIds)) {
foreach ($deliveryIds as $row) {
$this->updateOrderLogi($row['delivery_id'], $data);
}
}
return $result;
}
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 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;
}
/**
* 重载 save 方法,发现有打印状态的更新及 logi_no 的更新,就回传至对应订单
*/
public function save(&$data, $mustUpdate = null)
{
//调用原有处理
$result = parent::save($data, $mustUpdate);
if ($data['delivery_id'] > 0) {
$this->updateOrderLogi($data['delivery_id'], $data);
}
return $result;
}
/**
* 更新发货单对应的订单发货物流信息
*
* @param Integer $delivery_id
* @param Array $data
* @return void
*/
public function updateOrderLogi($delivery_id, $data)
{
//执行订单更新过程
$updatebody = array();
//检查打印状态
if (key_exists('status', $data) && in_array($data['status'], array('back', 'cancel', 'failed'))) {
//发货单取消,对应订单数据中的物流信息也清除 (如有分折订单,需做更多检查)
$updatebody = array("logi_no = ''", 'print_status = 0');
} else {
$chkField = array('expre_status' => 0x01, 'stock_status' => 0x02, 'deliv_status' => 0x04);
$addPrintStatus = 0;
$removeStatus = 0x7;
if (key_exists('expre_status', $data) || key_exists('stock_status', $data) || key_exists('deliv_status', $data)) {
foreach ($chkField as $fieldName => $state) {
if (isset($data[$fieldName])) {
if ($data[$fieldName] == 'true') {
$addPrintStatus = $addPrintStatus | $state;
} else {
$removeStatus = $removeStatus & (~$state);
}
}
}
$updatebody[] = "print_status = print_status | $addPrintStatus & $removeStatus";
}
//检查快递单号
if (key_exists('logi_no', $data)) {
if (empty($data['logi_no'])) {
$updatebody[] = "logi_no = ''";
} else {
$updatebody[] = "logi_no = '".$data['logi_no']."'";
}
}
//检查快递公司
if (key_exists('logi_id', $data)) {
if (!empty($data['logi_id'])) {
$updatebody[] = "logi_id = " . $data['logi_id'];
}
}
}
//有更新内容,则更新订单
if (!empty($updatebody)) {
$d2o = app::get('ome')->model('delivery_order')->getList('order_id', array('delivery_id' => $delivery_id));
if (!empty($d2o)) {
$ids = array();
foreach ($d2o as $oId) {
$ids[] = $oId['order_id'];
}
kernel::database()->exec("UPDATE sdb_ome_orders SET " . join(',', $updatebody) . " WHERE order_id IN (" . join(',', $ids) . ")");
}
}
}
public function repairCheck($delivery_ids)
{
$rows = $this->db->select('select delivery_id from sdb_ome_delivery where process ="false" and verify="true" and logi_no in("' . implode('","', $delivery_ids) . '")');
if ($rows) {
foreach ($rows as $row) {
$this->db->exec('update sdb_ome_delivery_items set verify="true",verify_num=number where delivery_id=' . $row['delivery_id']);
}
}
}
//根据发货单id调整打印排序
public function printOrderByByIds($ids)
{
if (!$ids) {
return false;
}
$table = $this->table_name(true);
$where = 'delivery_id in(' . implode(',', $ids) . ')';
$table .= " LEFT JOIN (SELECT COUNT(idx_split) AS iNum, idx_split AS idx FROM {$table} WHERE {$where} GROUP BY idx_split ) AS i ON i.idx=idx_split";
$orderType = 'skuNum, itemNum, iNum DESC, idx_split,delivery_id';
$sql = 'SELECT delivery_id FROM ' . $table . ' WHERE ' . $where . ' ORDER BY ' . $orderType;
$list = $this->db->select($sql);
$delivery_ids = array();
foreach ($list as $row) {
$delivery_ids[] = $row['delivery_id'];
}
return $delivery_ids;
}
/* 检测快递单是主快递单 还是子表中的快递单
* wujian@shopex.cn
* 2012年3月20日
*/
public function checkDeliveryOrBill($logi_no)
{
$dlyObj = $this->app->model('delivery');
$dly = $dlyObj->dump(array('logi_no|nequal' => $logi_no), '*');
if (empty($dly)) {
$dlyObjBill = $this->app->model('delivery_bill');
$dlyBill = $dlyObjBill->dump(array('logi_no|nequal' => $logi_no), '*');
if ($dlyBill) {
$dly = $dlyObj->dump(array('delivery_id|nequal' => $dlyBill["delivery_id"]), '*');
return $dly["logi_no"];
} else {
return false;
}
} else {
return $logi_no;
}
}
/* 检测主快递单是否有子快递单
* wujian@shopex.cn
* 2012年3月22日
*/
public function checkDeliveryHaveBill($delivery_id)
{
$dlyBillObj = $this->app->model('delivery_bill');
$dlyBill = $dlyBillObj->getList('*', array('delivery_id|nequal' => $delivery_id, 'status' => 0));
if ($dlyBill) {
return $dlyBill;
} else {
return false;
}
}
/*
*获取发货单优惠金额
*
*@date 2012-04-26
*/
public function getPmt_price($data)
{
$orderObj = $this->app->model('orders');
$pmt_order = array();
return $pmt_order;
}
/*
*获取商品销售单价
*@date 2012-04-26
*/
public function getsale_price($data)
{
$orderObj = $this->app->model('orders');
$sale_order = array();
foreach ($data as $key => $val) {
$order = $orderObj->dump($val['order_id'], "order_id", array("order_objects" => array("*", array("order_items" => array('bn,pmt_price,sale_price,nums,price')))));
foreach ($order['order_objects'] as $k => $v) {
//基础物料线order_objects数据表上有delete字段
if ($v['delete'] == 'false') {
foreach ($v['order_items'] as $k1 => $v1) {
if (isset($sale_order[$v1['bn']])) {
$sale_order[$v1['bn']]['quantity'] += $v1['quantity'];
$sale_order[$v1['bn']]['sale_price'] += $v1['sale_price'];
} else {
$sale_order[$v1['bn']]['quantity'] = $v1['quantity'];
$sale_order[$v1['bn']]['sale_price'] = $v1['sale_price'];
}
}
}
}
}
$sale_price = array();
foreach ($sale_order as $k => $v) {
$price = $v['sale_price'];
$quantity = $v['quantity'];
$sale_price[$k] = round($price / $quantity, 2);
}
return $sale_price;
}
/**
* 根据订单bn获取发货单信息
*
* @param void
* @return void
* @author
**/
public function getDeliveryByOrderBn($order_bn, $col = '*')
{
$order_info = app::get('ome')->model('orders')->select()->columns('order_id')->where('order_bn=?', $order_bn)->instance()->fetch_row();
$sql = "SELECT *
FROM sdb_ome_delivery_order as deo
LEFT JOIN sdb_ome_delivery AS d ON deo.delivery_id = d.delivery_id
WHERE deo.order_id={$order_info['order_id']}
AND (d.parent_id=0 OR d.is_bind='true')
AND d.disabled='false'
AND d.status NOT IN('failed','cancel','back','return_back')";
$delivery = kernel::database()->select($sql);
// 发货单解密
foreach ((array) $delivery as $key => $value) {
foreach ($this->__encrypt_cols as $field => $type) {
if (isset($value[$field])) {
$delivery[$key][$field] = (string) kernel::single('ome_security_factory')->decryptPublic($value[$field], $type);
}
}
}
if (isset($delivery[0]) && $delivery) {
return $delivery[0];
} else {
return array();
}
}
/**
* 检查发货单是否已经打印完成
*
* @author chenping<chenping@shopex.cn>
* @version 2012-5-15 00:14
* @param Array $dly 发货单信息 $dly
* @param Array $msg 错误信息
* @return TRUE:打印完成、FALSE:打印未完成
**/
public function checkPrintFinish($dly, &$msg)
{
$deliCfgLib = kernel::single('ome_delivery_cfg');
if ($deliCfgLib->deliveryCfg != '') {
$btncombi = $deliCfgLib->btnCombi($dly['deli_cfg']);
list($stock, $delie) = explode('_', $btncombi);
if (1 == $stock) {
if ($dly['stock_status'] == 'false') {
$msg[] = array('bn' => $dly['logi_no'], 'msg' => $this->app->_('备货单未打印'));
return false;
}
}
if (1 == $delie) {
if ($dly['deliv_status'] == 'false') {
$msg[] = array('bn' => $dly['logi_no'], 'msg' => $this->app->_('发货单未打印'));
return false;
}
}
} else {
# 默认情况全部开启
if ($dly['stock_status'] == 'false') {
// 备货单未打印
$msg[] = array('bn' => $dly['logi_no'], 'msg' => $this->app->_('备货单未打印'));
return false;
}
if ($dly['deliv_status'] == 'false') {
// 发货单未打印
$msg[] = array('bn' => $dly['logi_no'], 'msg' => $this->app->_('发货单未打印'));
return false;
}
}
if ($dly['expre_status'] == 'false') {
// 快递单未打印
$msg[] = array('bn' => $dly['logi_no'], 'msg' => $this->app->_('快递单未打印'));
return false;
}
return true;
}
/**
* 计算物流费用
*/
public function getDeliveryFreight($area_id = 0, $logi_id = 0, $weight = 0)
{
if ($logi_id && $logi_id > 0) {
$dlyCorpObj = $this->app->model('dly_corp');
$corp = $dlyCorpObj->dump($logi_id); //物流公司信息
}
if ($corp['setting'] == '1') {
$firstunit = $corp['firstunit'];
$continueunit = $corp['continueunit'];
$firstprice = $corp['firstprice'];
$continueprice = $corp['continueprice'];
$dt_expressions = $corp['dt_expressions'];
} else {
//物流预算费用计算
$regionIds = [];
if ($area_id && $area_id > 0) {
$regionObj = kernel::single('eccommon_regions');
$region = $regionObj->getOneById($area_id);
$regionIds = explode(',', $region['region_path']);
foreach ($regionIds as $key => $val) {
if ($regionIds[$key] == '' || empty($regionIds[$key])) {
unset($regionIds[$key]);
}
}
}
$regionIds = implode('","', $regionIds);
#物流公式设置明细表
$sql = 'SELECT firstunit,continueunit,firstprice,continueprice,dt_expressions,dt_useexp FROM sdb_ome_dly_corp_items WHERE corp_id="' . $logi_id . '" AND region_id in ("' . $regionIds . '") ORDER BY region_id DESC';
$corp_items = $this->db->selectrow($sql);
$firstunit = $corp_items['firstunit'];
$continueunit = $corp_items['continueunit'];
$firstprice = $corp_items['firstprice'];
$continueprice = $corp_items['continueprice'];
$dt_expressions = $corp_items['dt_expressions'];
}
if ($dt_expressions && $dt_expressions != '') {
$price = utils::cal_fee($dt_expressions, $weight, 0, $firstprice, $continueprice); //TODO 生成快递费用
} else {
if ($continueunit > 0 && bccomp($weight, $firstunit, 3) == 1) {
$continue_price = (($weight - $firstunit) / $continueunit) * $continueprice;
} else {
$continue_price = 0;
}
$price = $firstprice + $continue_price;
}
return $price;
}
/**
* 根据物流单号获取商品和重量信息
*/
public function getWeightbydelivery_id($logi_no)
{
$orderObj = $this->app->model('orders');
$dlyObj = $this->app->model('delivery');
$basicMaterialExtObj = app::get('material')->model('basic_material_ext');
$salesMaterialExtObj = app::get('material')->model('sales_material_ext');
$salesBasicMaterialObj = app::get('material')->model('sales_basic_material');
$dlyBillObj = $this->app->model('delivery_bill');
$dlyBill = $dlyBillObj->dump(array('logi_no|nequal' => $logi_no), 'delivery_id');
$dlyfather = $dlyObj->dump(array('logi_no|nequal' => $logi_no), 'delivery_id');
if ($dlyBill) {
$delivery_id = $dlyBill['delivery_id'];
} elseif ($dlyfather) {
$delivery_id = $dlyfather['delivery_id'];
}
$dly = $dlyObj->dump($delivery_id, '*', array('delivery_items' => array('*'), 'delivery_order' => array('*')));
//[拆单]根据发货单中货品详细读取重量
$orderSplitLib = kernel::single('ome_order_split');
$split_seting = $orderSplitLib->get_delivery_seting();
if ($split_seting && $dly['is_bind'] == 'false') {
$orderItemObj = app::get('ome')->model('order_items');
$objectsObj = app::get('ome')->model('order_objects');
$dlyItemDetail = app::get('ome')->model('delivery_items_detail');
$product_weight = array();
$item_list = $item_ids = array();
$temp_data = $dlyItemDetail->getList('*', array('delivery_id' => $delivery_id));
foreach ($temp_data as $key => $val) {
$item_id = $val['order_item_id'];
$item_list[$item_id] = array(
'item_id' => $item_id,
'obj_id' => $val['order_obj_id'],
'item_type' => $val['item_type'],
'product_id' => $val['product_id'],
'bn' => $val['bn'],
'number' => $val['number'],
);
$item_ids[] = $item_id;
}
#获取本次发货单关联的订单明细
$obj_list = array();
$flag = true; //重量累加标记
$filter = array('item_id' => $item_ids, '`delete`' => 'false');
$item_data = $orderItemObj->getList('item_id, obj_id, product_id, bn, item_type, nums, name', $filter);
foreach ($item_data as $key => $val) {
$item_type = $val['item_type'];
$item_id = $val['item_id'];
$obj_id = $val['obj_id'];
$product_id = $val['product_id'];
$bn = $val['bn'];
$val['send_num'] = $item_list[$item_id]['number']; //发货数量
if ($item_type == 'pkg') {
$obj_list[$obj_id]['items'][$item_id] = $val;
//[捆绑商品]货号bn
if (empty($obj_list[$obj_id]['bn'])) {
$obj_item = $objectsObj->getList('obj_id, goods_id,bn', array('obj_id' => $obj_id), 0, 1);
$obj_list[$obj_id]['bn'] = $obj_item[0]['bn'];
//单个[捆绑商品]重量
$pkg_goods = $salesMaterialExtObj->dump(array('sm_id' => $obj_item[0]['goods_id']), 'sm_id, weight');
$obj_list[$obj_id]['net_weight'] = floatval($pkg_goods['weight']);
//[捆绑商品]发货数量
$pkg_product = $salesBasicMaterialObj->dump(array('sm_id' => $pkg_goods['sm_id'], 'bm_id' => $product_id), 'number');
$obj_list[$obj_id]['send_num'] = intval($val['send_num'] / $pkg_product['number']);
$obj_list[$obj_id]['weight'] = 0;
if ($obj_list[$obj_id]['net_weight'] > 0) {
$obj_list[$obj_id]['weight'] = ($obj_list[$obj_id]['net_weight'] * $obj_list[$obj_id]['send_num']);
}
}
//items_list
$products = $basicMaterialExtObj->dump(array('bm_id' => $product_id), 'weight');
$product_weight[$obj_id]['items'][$item_id] = array(
'weight' => $products['weight'],
'number' => $val['send_num'],
'total' => ($products['weight'] * $val['send_num']),
'bn' => $bn,
'product_name' => $val['name'],
);
} else {
//普通商品直接计算重量
$weight = 0;
$products = $basicMaterialExtObj->dump(array('bm_id' => $product_id), 'weight');
if ($products['weight'] > 0) {
$weight = ($products['weight'] * $val['send_num']);
}
//items_list
$product_weight[$obj_id]['obj_type'] = $item_type;
$product_weight[$obj_id]['weight'] = $weight;
$product_weight[$obj_id]['items'][$item_id] = array(
'weight' => $products['weight'],
'number' => $val['send_num'],
'total' => ($products['weight'] * $val['send_num']),
'bn' => $bn,
'product_name' => $val['name'],
);
}
}
#捆绑商品无重量的重新计算
if (!empty($obj_list)) {
foreach ($obj_list as $obj_id => $obj_item) {
$weight = 0;
if ($obj_item['weight'] > 0 && $flag == true) {
$weight += $obj_item['weight'];
} else {
foreach ($product_weight[$obj_id] as $item_id => $item) {
if ($item['total'] == 0) {
$weight = 0;
break;
}
$weight += $item['total'];
}
}
$product_weight[$obj_id]['obj_type'] = 'pkg';
$product_weight[$obj_id]['weight'] = $weight;
}
}
sort($product_weight);
return $product_weight;
} elseif ($dly) {
$delivery_order = $dly['delivery_order'];
$product_weight = array();
foreach ($delivery_order as $items) {
$order = $orderObj->dump($items['order_id'], "order_id", array("order_objects" => array("*", array("order_items" => array('product_id,nums,bn,name,`delete`')))));
foreach ($order['order_objects'] as $k => $v) {
$bn = $v['bn'];
$item_weight_total = 0;
$items_list = array();
foreach ($v['order_items'] as $k1 => $v1) {
if ($v1['delete'] == 'true') {
continue;
}
$products = $basicMaterialExtObj->dump(array('bm_id' => $v1['product_id']), 'weight');
$items_list[] = array(
'weight' => $products['weight'],
'number' => $v1['quantity'],
'total' => $products['weight'] * $v1['quantity'],
'bn' => $v1['bn'],
'product_name' => $v1['name'],
);
$item_weight_total += $products['weight'] * $v1['quantity'];
}
if (empty($items_list)) {
continue;
}
foreach ($items_list as $list) {
if ($list['total'] == 0) {
$item_weight_total = 0;
break;
}
}
if ($v['obj_type'] == 'pkg') {
$pkg = $salesMaterialExtObj->dump(array('sm_id' => $v['goods_id']), 'weight');
$weight = $pkg['weight'] * $v['quantity'];
if ($weight == 0) {
$weight = $item_weight_total;
}
} else {
$weight = $item_weight_total;
}
$product_weight[$k]['items'] = $items_list;
$product_weight[$k]['weight'] = $weight;
$product_weight[$k]['obj_type'] = $v['obj_type'];
}
}
sort($product_weight);
return $product_weight;
}
}
public function modifier_is_cod($row)
{
if ($row == 'true') {
return "<div style='width:48px;padding:2px;height:16px;background-color:green;float:left;'><span style='color:#eeeeee;'>货到付款</span></div>";
} else {
return '款到发货';
}
}
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];
}
/**
* 获取订单备注
*/
public function getOrderMarktextByDeliveryId($dly_ids = null)
{
if ($dly_ids) {
$sql = "SELECT o.mark_text FROM sdb_ome_delivery_order do
JOIN sdb_ome_orders o
ON do.order_id=o.order_id
WHERE do.delivery_id IN ($dly_ids)
GROUP BY do.order_id ";
$rows = $this->db->select($sql);
$memo = array();
if ($rows) {
foreach ($rows as $v) {
$memo[] = unserialize($v['mark_text']);
}
}
return serialize($memo);
}
}
/**
* 获取可合并发货单
*/
public function fetchCombineDelivery($order_id)
{
$combine_member_id = app::get('ome')->getConf('ome.combine.member_id');
$combine_shop_id = app::get('ome')->getConf('ome.combine.shop_id');
$combine_member_id = !isset($combine_member_id) ? 1 : $combine_member_id;
$combine_shop_id = !isset($combine_shop_id) ? 1 : $combine_shop_id;
$memberidconf = intval(app::get('ome')->getConf('ome.combine.memberidconf'));
$memberidconf = $memberidconf == '1' ? '1' : '0';
$orders = $this->app->model('orders')->getlist('order_id, shop_type,member_id,shop_id,ship_name,ship_mobile,ship_area,ship_addr,is_cod', array('order_id' => $order_id), 0, 1);
$orders = $orders[0];
$filter = array('process' => 'false', 'status' => array('ready', 'progress'), 'parent_id' => '0', 'is_cod' => $orders['is_cod']);
if ($orders['shop_type'] == 'shopex_b2b') {
if (empty($orders['member_id'])) {
return false;
} else {
$filter['member_id'] = $orders['member_id'];
}
$filter['shop_id'] = $orders['shop_id'];
} else if ($orders['shop_type'] == 'dangdang' && $orders['is_cod'] == 'true') {
return false;
} else if ($orders['shop_type'] == 'amazon' && $orders['self_delivery'] == 'false') {
return false;} else if ($orders['shop_type'] == 'taobao' && $orders['order_source'] == 'tbdx') {
return false;
} else {
//直销单
if ($combine_member_id) {
if (empty($orders['member_id'])) {
if ($memberidconf == '0') {
return false;
}
} else {
$filter['member_id'] = $orders['member_id'];
}
}
if ($combine_shop_id) {
$filter['shop_id'] = $orders['shop_id'];
}
}
$filter = array_merge($filter, kernel::single('omeauto_auto_combine')->_getAddrFilter($orders));
$filter['no_encrypt'] = true;
$delivery = $this->getlist('delivery_bn', $filter);
$combine_delivery = array();
foreach ((array) $delivery as $deli) {
$combine_delivery[] = $deli['delivery_bn'];
}
return $combine_delivery;
}
/**
* 找印时获取前端名称
*
*/
public function getPrintFrontProductName($ids)
{
$ordersObj = $this->app->model('orders');
$printProductNames = array();
$sql = 'SELECT distinct oi.order_id,oi.name,oi.bn,oi.addon,bp.store_position
FROM sdb_ome_delivery_order AS d2o
LEFT JOIN sdb_ome_order_items AS oi
ON d2o.order_id = oi.order_id
LEFT JOIN (
SELECT bpp.*
FROM (
SELECT pos_id,product_id
FROM sdb_ome_branch_product_pos
ORDER BY create_time DESC
)bpp
GROUP BY bpp.product_id
)bb
ON bb.product_id = oi.product_id
LEFT JOIN sdb_ome_branch_pos bp
ON bp.pos_id = bb.pos_id
WHERE d2o.delivery_id IN(' . implode(',', $ids) . ') ORDER BY d2o.order_id';
$rows = $this->db->select($sql);
foreach ($rows as $row) {
$orders = $ordersObj->dump($row['order_id'], 'shop_id');
$bncode = md5($orders['shop_id'] . trim($row['bn']));
$row['bn'] = $bncode;
if (isset($printProductNames[$row['bn']])) {
continue;
}
$row['addon'] = ome_order_func::format_order_items_addon($row['addon']);
$printProductNames[$row['bn']] = $row;
}
return $printProductNames;
}
#逐单发货时,根据物流单号,获取货号、货品名称
public function getProcutInfo($logi_no = null)
{
$sql = 'select
items.bn,items.product_id,items.product_name,items.number,delivery.delivery_id
from sdb_ome_delivery as delivery
left join sdb_ome_delivery_items items on items.delivery_id=delivery.delivery_id
where delivery.logi_no=' . "'$logi_no'";
$rows = $this->db->select($sql);
return $rows;
}
/**
* 获取打印前端商品名
*
* @param Array $deliverys 发货单集合
* @return Array
* @author
**/
public function getPrintOrderName($deliverys)
{
$data = array();
$order_ids = array();
foreach ((array) $deliverys as $delivery) {
foreach ($delivery['delivery_order'] as $delivery_order) {
$order_ids[] = $delivery_order['order_id'];
}
}
$orderItemModel = app::get('ome')->model('order_items');
$orderItemList = $orderItemModel->getList('order_id,name,bn,addon', array('order_id' => $order_ids, 'delete' => 'false'));
$re_orderItemList = array();
foreach ((array) $orderItemList as $order_item) {
$order_item['addon'] = ome_order_func::format_order_items_addon($order_item['addon']);
$re_orderItemList[$order_item['order_id']][$order_item['bn']] = $order_item;
}
unset($orderItemList);
foreach ((array) $deliverys as $delivery) {
$arr = array();
foreach ($delivery['delivery_order'] as $delivery_order) {
//$arr = array_merge((array) $arr,(array) $re_orderItemList[$delivery_order['order_id']]);
$arr = $arr + (array) $re_orderItemList[$delivery_order['order_id']];
}
$data[$delivery['delivery_id']] = $arr;
}
unset($re_orderItemList);
return $data;
}
/**
* 获取打印货品位
*
* @param Array $deliverys 发货单集合
* @return void
* @author
**/
public function getPrintProductPos($deliverys)
{
$data = array();
$product_ids = array();
foreach ($deliverys as $delivery) {
foreach ($delivery['delivery_items'] as $delivery_item) {
$product_ids[] = $delivery_item['product_id'];
$bpro_key = $delivery['branch_id'] . $delivery_item['product_id'];
$data[$delivery_item['product_id']] = &$bpro[$bpro_key];
}
}
// 货品货位有关系
$bppModel = app::get('ome')->model('branch_product_pos');
$bppList = $bppModel->getList('product_id,pos_id,branch_id', array('product_id' => $product_ids));
// 如果货位存在
if ($bppList) {
// 货位信息
$pos_ids = array();
foreach ($bppList as $key => $value) {
$pos_ids[] = $value['pos_id'];
}
$posModel = app::get('ome')->model('branch_pos');
$posList = $posModel->getList('pos_id,branch_id,store_position', array('pos_id' => $pos_ids));
foreach ($posList as $key => $value) {
$bpos_key = $value['branch_id'] . $value['pos_id'];
$bpos[$bpos_key] = $value['store_position'];
}
unset($posList);
foreach ($bppList as $key => $value) {
$bpro_key = $value['branch_id'] . $value['product_id'];
$bpos_key = $value['branch_id'] . $value['pos_id'];
$bpro[$bpro_key] = $bpos[$bpos_key];
}
unset($bppList);
}
return $data;
}
/**
* 获取发货商品序列号
* @param
* @return
* @access public
* @author cyyr24@sina.cn
*/
public function getProductserial($dly_id)
{
$order_objectsObj = app::get('ome')->model('order_objects');
$order_itemsObj = app::get('ome')->model('order_items');
$product_serialObj = app::get('ome')->model('product_serial');
$deliveryObj = $this->app->model('delivery');
$orderIds = $deliveryObj->getOrderIdByDeliveryId($dly_id);
$order_objects = $order_objectsObj->getlist('oid,order_id,obj_id', array('order_id' => $orderIds, 'oid|than' => '0'));
$product = array();
$product_serial = $product_serialObj->getSerialByproduct_id($dly_id);
if ($product_serial) {
foreach ($order_objects as $objects) {
$obj_id = $objects['obj_id'];
$order_id = $objects['order_id'];
$oid = $objects['oid'];
$order_items = $order_itemsObj->getlist('product_id,nums', array('obj_id' => $obj_id, 'order_id' => $order_id, 'delete' => 'false'));
$serial_list = array();
foreach ($order_items as $items) {
$nums = $items['nums'];
$product_id = $items['product_id'];
if ($product_serial[$product_id]) {
$serial = array_slice($product_serial[$product_id], 0, $nums); //取数组
if ($serial) {
$serial_list[] = implode(',', $serial);
array_splice($product_serial[$product_id], 0, $nums); //删除
}
}}
if ($serial_list) {
$product[] = $oid . ':' . implode('|', $serial_list);
}
}
}
if ($product) {
$product = "identCode=" . implode('|', $product);
}
return $product;
}
/**
* 发货单列表项扩展字段
*/
public function extra_cols()
{
return array(
'column_custom_mark' => array('label' => '买家留言', 'width' => '180', 'func_suffix' => 'custom_mark'),
'column_mark_text' => array('label' => '客服备注', 'width' => '180', 'func_suffix' => 'mark_text'),
'column_tax_no' => array('label' => '发票号', 'width' => '180', 'func_suffix' => 'tax_no'),
'column_ident' => array('label' => '批次号', 'width' => '160', 'func_suffix' => 'ident', 'order_field' => 'idx_split'),
);
}
/**
* 买家备注扩展字段格式化
*/
public function extra_custom_mark($rows)
{
return kernel::single('ome_extracolumn_delivery_custommark')->process($rows);
}
/**
* 客服备注扩展字段格式化
*/
public function extra_mark_text($rows)
{
return kernel::single('ome_extracolumn_delivery_marktext')->process($rows);
}
/**
* 发票号扩展字段格式化
*/
public function extra_tax_no($rows)
{
return kernel::single('ome_extracolumn_delivery_taxno')->process($rows);
}
/**
* 批次号扩展字段格式化
*/
public function extra_ident($rows)
{
return kernel::single('ome_extracolumn_delivery_ident')->process($rows);
}
public function getDlyId($logi_nos = false)
{
$all_logi_no = array();
foreach ($logi_nos as $logi_no) {
$all_logi_no[] = "'" . $logi_no . "'";
}
$str_logi_no = implode(',', $all_logi_no);
$sql = "select delivery_id from sdb_ome_delivery where logi_no in ( " . $str_logi_no . " )
union
select delivery_id from sdb_ome_delivery_bill where logi_no in(" . $str_logi_no . " )";
$rows = $this->db->select($sql);
$data = array();
if (!empty($rows)) {
foreach ($rows as $row) {
$data[] = $row['delivery_id'];
}
}
return $data;
}
#订阅华强宝物流信息
public function get_hqepay_logistics($delivery_id)
{
#检测是否开启华强宝物流
$is_hqepay_on = app::get('ome')->getConf('ome.delivery.hqepay');
if ($is_hqepay_on == 'false') {
return true;
}
#订阅物流信息
kernel::single('ome_service_delivery')->get_hqepay_logistics($delivery_id);
return true;
}
public function getFinishDeliveryByorderId($order_id)
{
$SQL = "SELECT d.* FROM sdb_ome_delivery as d LEFT JOIN sdb_ome_delivery_order as od ON od.delivery_id=d.delivery_id LEFT JOIN sdb_ome_orders as o ON o.order_id=od.order_id WHERE o.order_id='" . $order_id . "' AND (d.parent_id=0 OR d.is_bind='true') AND d.status='succ' AND d.process='true'";
$delivery_list = $this->db->select($SQL);
if ($delivery_list) {
return $delivery_list;
} else {
return array();
}
}
/**
* 获取已发货发货单
*
* @param Int $delivery_id 主单发货单ID
* @return void
* @author
**/
public function getFinishDelivery($delivery_id)
{
static $deliverys;
if (isset($deliverys[$delivery_id])) {
return $deliverys[$delivery_id];
}
$deliveryinfo = $this->db->selectrow('SELECT * FROM ' . $this->table_name(true) . ' WHERE delivery_id=' . $delivery_id . ' AND process="true" AND parent_id="0"');
if (!$deliveryinfo) {
return array();
}
// 发货单对应的订单
$deliveryOrderModel = app::get('ome')->model('delivery_order');
$deliveryOrderList = $deliveryOrderModel->getList('order_id', array('delivery_id' => $delivery_id));
$order_ids = array();
foreach ($deliveryOrderList as $key => $value) {
$order_ids[] = $value['order_id'];
}
$orderModel = app::get('ome')->model('orders');
$orderList = $orderModel->getList('*', array('order_id' => $order_ids));
$deliveryinfo['orders'] = $orderList;
$deliveryinfo['delivery_order'] = $deliveryOrderList;
$deliverys[$delivery_id] = $deliveryinfo;
return $deliverys[$delivery_id];
}
#根据订单,检测已生成发货单数量
public function checkDeliverNumsById($order_ids)
{
$sql = " SELECT count(dord.delivery_id) nums 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 in( " . implode(',', $order_ids) . " ) AND (d.parent_id=0 OR d.is_bind='true') AND d.disabled='false' AND d.status NOT IN('cancel','back','return_back')"; #过滤已撤销发货单
$delivery_nums = $this->db->selectRow($sql);
if (empty($delivery_nums)) {
return 0;
}
return $delivery_nums['nums'];
}
/**
* 获取订单下所有发货单
* @param $order_id
* @return array
* @date 2024-04-11 10:26 上午
*/
public function getAllDeliversOrderId($order_id)
{
return $this->db->select("SELECT d.delivery_id,d.delivery_bn,d.logi_id,d.logi_no,d.logi_name 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.status IN ('succ')");
}
/**
* 发送发货单取消成功通知
* @param array $deliveryInfo 发货单信息
* @param string $memo 备注
*/
private function sendDeliveryCancelSuccessNotify($deliveryInfo, $memo = '')
{
try {
// 获取仓库信息
$branchObj = app::get('ome')->model('branch');
$branchInfo = $branchObj->dump(['branch_id' => $deliveryInfo['branch_id'], 'check_permission' => 'false'], 'name');
$branchName = $branchInfo ? $branchInfo['name'] : '未知仓库';
// 发送通知
kernel::single('monitor_event_notify')->addNotify('delivery_cancel_success', [
'delivery_bn' => $deliveryInfo['delivery_bn'],
'branch_name' => $branchName,
'cancel_time' => date('Y-m-d H:i:s'),
'memo' => $memo ?: '无',
]);
} catch (Exception $e) {
// 静默处理异常,不影响主流程
}
}
}