Files
OMS/app/o2o/lib/delivery/print/newdelivery.php
2025-12-28 23:13:25 +08:00

582 lines
28 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class o2o_delivery_print_newdelivery extends o2o_delivery_print_abstract{
//增加发货单打印需要的扩展信息
/**
* appendExtData
* @param mixed $deliverys deliverys
* @return mixed 返回值
*/
public function appendExtData(&$deliverys){
foreach($deliverys as $dk =>$dly){
foreach($dly['orders'] as $ok=> $order){
foreach($order['order_objects'] as $ook=>$ordobj){
$now_obj_items_num = 0;
foreach($ordobj['order_items'] as $oik=>$orditem){
if($orditem['delete'] == 'false'){
$now_obj_items_num += $orditem['nums'];
}
}
$deliverys[$dk]['orders'][$ok]['order_objects'][$ook]['obj_item_num_sum'] = $now_obj_items_num;
}
}
}
}
//获取平摊的优惠金额
/**
* 获取PmtPrice
* @param mixed $orders orders
* @return mixed 返回结果
*/
public function getPmtPrice($orders){
$pmt_order = array();
foreach($orders as $ok=>$order){
foreach($order['order_objects'] as $ook=>$ordobj){
$pvg_price = 0;
if($ordobj['obj_type']!='goods' && $ordobj['obj_item_num_sum'] > 0){
$pvg_price = round($ordobj['pmt_price']/$ordobj['obj_item_num_sum'],2);
}
foreach($ordobj['order_items'] as $k1=>$v1){
$item_pmt_price=0;
$item_pmt_price=$pvg_price*$v1['nums'];
if(isset($pmt_order[$v1['bn']])){
$pmt_order[$v1['bn']]['pmt_price'] += $v1['pmt_price']+$item_pmt_price;
}else{
$pmt_order[$v1['bn']]['pmt_price'] = $v1['pmt_price']+$item_pmt_price;
}
}
}
}
return $pmt_order;
}
//获取平台的销售价格
function getSalePrice($orders){
$sale_order = array();
foreach($orders as $ok=>$order){
foreach($order['order_objects'] as $ook=>$ordobj){
$pvg_price = 0;
if($ordobj['obj_type']=='pkg' || $ordobj['obj_type']=='gift' || $ordobj['obj_type']=='giftpackage'){
if($ordobj['obj_item_num_sum'] > 0)
{
$pvg_price = round($ordobj['sale_price']/$ordobj['obj_item_num_sum'],2);
foreach($ordobj['order_items'] as $k1=>$v1){
if(isset($sale_order[$v1['bn']])){
$sale_order[$v1['bn']]['obj_quantity'] += $v1['nums'];
$sale_order[$v1['bn']]['obj_sale_price'] += ($v1['nums']*$pvg_price);
}else{
$sale_order[$v1['bn']]['obj_quantity'] = $v1['nums'];
$sale_order[$v1['bn']]['obj_sale_price'] = ($v1['nums']*$pvg_price);
}
}
}
} else {
foreach( $ordobj['order_items'] as $k1=>$v1 ){
if ( isset( $sale_order[$v1['bn']]) ){
$sale_order[$v1['bn']]['quantity'] += $v1['nums'];
$sale_order[$v1['bn']]['sale_price'] += $v1['sale_price'];
}else{
$sale_order[$v1['bn']]['quantity'] = $v1['nums'];
$sale_order[$v1['bn']]['sale_price'] = $v1['sale_price'];
}
}
}
}
}
$sale_price = array();
foreach($sale_order as $k=>$v){
$price = ($v['obj_sale_price']+$v['sale_price']);
$quantity = $v['quantity']+$v['obj_quantity'];
$sale_price[$k]=round($price/$quantity,2);
}
return $sale_price;
}
/**
* format
* @param mixed $print_data 数据
* @param mixed $sku sku
* @param mixed $_err _err
* @param mixed $mode mode
* @return mixed 返回值
*/
public function format($print_data, $sku,&$_err,$mode='old')
{
$basicMaterialLib = kernel::single('material_basic_material');
$basicMaterialBarcode = kernel::single('material_basic_material_barcode');
$libBranchProductPos = kernel::single('ome_branch_product_pos');
if ($print_data['ids']) {
$orderObj = app::get('ome')->model('orders');
$orderExtendObj = app::get('ome')->model('order_extend');
$basicMObj = app::get('material')->model('basic_material');
$basicMExtObj = app::get('material')->model('basic_material_ext');
$didObj = app::get('ome')->model('delivery_items_detail');
$orderObjectObj = app::get('ome')->model('order_objects');
$dlyorderObj = app::get('ome')->model('delivery_order');
$brandObj = app::get('ome')->model('brand');
$goodsTypeObj = app::get('ome')->model('goods_type');
$tbitemObj = app::get('ome')->model('tbfx_order_items');
$dlyObj = app::get('ome')->model('delivery');
//备注显示方式
$markShowMethod = app::get('ome')->getConf('ome.order.mark');
$delivery_cfg = app::get('wms')->getConf('wms.delivery.status.cfg');
//获取仓库名称
$branchObj = app::get('ome')->model('branch');
$branch_list = array();
$kmtmp_shopInfo = array();
$km_pd = array();
$km_gds = array();
$km_position = array();
$km_brand = array();
$km_gtype = array();
$km_member = array();
$logi_name = '';
foreach ($print_data['deliverys'] as $k => $dly) {
if(!isset($branch_list[$dly['branch_id']])){
$branch = $branchObj->dump(array('branch_id'=>$dly['branch_id']),'name');
if($branch){
$branch_list[$dly['branch_id']] = $branch['name'];
}
}
// 加密地址处理
$consigneeCols = array ('ship_name', 'ship_addr', 'ship_tel', 'ship_mobile');
foreach ($consigneeCols as $col) {
$csIndex = strpos($dly[$col], '>>');
if ($csIndex !== false){
$dly[$col] = substr($dly[$col], 0, $csIndex);
}
}
foreach ($dly['consignee'] as $dkk => $dkv) {
$csIndex = strpos($dkv, '>>');
if ($csIndex !== false){
$dly['consignee'][$dkk] = substr($dkv, 0, $csIndex);
}
}
$pmt_orders = $this->getPmtPrice($dly['orders']);
$sale_orders = $this->getSalePrice($dly['orders']);
//当前发货单信息
$data = $dly;
//订单数量
$data['order_number'] = count($dly['delivery_order']);
if ($data) {
# 批次号
$allItems[$data['delivery_id']] = $data;
//多条发货单减少查询次数
if(!isset($kmtmp_shopInfo[$data['shop_id']])){
$shop = $dlyObj->getShopInfo($data['shop_id']);
$data['shop_name'] = $shop['name'];
#新增收货人信息
$data['sender_name'] = $shop['default_sender'];
$data['sender_mobile'] = $shop['mobile'];
$data['sender_tel'] = $shop['tel'];
$data['sender_addr'] = $shop['addr'];
$sender_area = $shop['area'];
kernel::single('ome_func')->split_area($sender_area);
$data['sender_area'] = implode('-',$sender_area);
$kmtmp_shopInfo[$data['shop_id']] = array(
'shop_name'=>$data['shop_name'],
'sender_name'=>$data['sender_name'],
'sender_mobile'=>$data['sender_mobile'],
'sender_tel'=>$data['sender_tel'],
'sender_addr'=>$data['sender_addr'],
'sender_area'=>$data['sender_area']
);
}else{
$data = array_merge($data,$kmtmp_shopInfo[$data['shop_id']]);
}
$pmt_order_total=0;
$objIds = array();
$store_position = 0;
foreach ($data['delivery_items'] as $k => $item) {
if(!isset($km_pd[$item['bn']]))
{
$p = $basicMaterialLib->getBasicMaterialBybn($item['bn']);
#查询关联的条形码
$p['barcode'] = $basicMaterialBarcode->getBarcodeById($p['bm_id']);
$km_pd[$item['bn']] = $p;
}else{
$p = $km_pd[$item['bn']];
}
//区分货品
$data['delivery_items'][$k]['bncode'] = md5($item['shop_id'].trim($item['bn']));
if(!isset($km_position[$item['product_id']."_km_".$data['branch_id']])){
$store_position = $libBranchProductPos->get_product_pos($item['product_id'], $data['branch_id']);
$km_position[$item['product_id']."_km_".$data['branch_id']] = $store_position;
}else{
$store_position = $km_position[$item['product_id']."_km_".$data['branch_id']];
}
#start新增PKG类型展示
$data['delivery_items'][$k]['item_type'] = $item['item_type'];
$data['delivery_items'][$k]['order_obj_id'] = $item['order_obj_id'];
$data['delivery_items'][$k]['order_item_id'] = $item['order_item_id'];
#end
//$data['delivery_items'][$k]['picurl'] = $picurl;
$data['delivery_items'][$k]['spec_info'] = $p['specifications'];
$data['delivery_items'][$k]['name'] = $p['material_name'];
$data['delivery_items'][$k]['store_position'] = $store_position;
$data['delivery_items'][$k]['addon'] = $p['specifications'];
$data['delivery_items'][$k]['pmt_price'] = $pmt_orders[$item['bn']]['pmt_price'];
$data['delivery_items'][$k]['barcode'] = $p['barcode']; //商品条形码
//$data['delivery_items'][$k]['goods_bn'] = $goods['bn'];//商品编码
$data['delivery_items'][$k]['product_weight'] = $p['weight'];//商品重量
$data['delivery_items'][$k]['unit'] = $p['unit'];//商品单位
if($item['order_source'] == 'tbdx' && $item['shop_type'] == 'taobao'){
$tbfx_filter = array('obj_id'=>$item['order_obj_id'],'item_id'=>$item['order_item_id']);
$ext_item_info = $tbitemObj->getOrderByOrderId($tbfx_filter);
$data['delivery_items'][$k]['price'] = round(($ext_item_info[0]['buyer_payment']/$item['number']),2);
$data['delivery_items'][$k]['amount'] = $ext_item_info[0]['buyer_payment'];
$data['delivery_items'][$k]['sale_price'] = $ext_item_info[0]['buyer_payment'];
}else{
$data['delivery_items'][$k]['price'] = $item['price'];
$data['delivery_items'][$k]['amount'] = $item['amount'];
$data['delivery_items'][$k]['sale_price'] = ($sale_orders[$item['bn']]*$item['number']);
}
}
if(!isset($km_member[$data['member_id']])){
$tmp = app::get('ome')->model('members')->dump($data['member_id'], 'uname,name,mobile,tel');
$data['member_name'] = $tmp['account']['uname'];
$t_tel = array();
if ($tmp['contact']['phone']['telephone']) {
$t_tel[] = $tmp['contact']['phone']['telephone'];
}
if ($tmp['contact']['phone']['mobile']) {
$t_tel[] = $tmp['contact']['phone']['mobile'];
}
$km_member[$data['member_id']] = array('uname'=>$data['member_name'],'phone'=>array($tmp['contact']['phone']['telephone'],$tmp['contact']['phone']['mobile']));
}else{
$data['member_name'] = $km_member[$data['member_id']]['uname'];
$t_tel = $km_member[$data['member_id']]['phone'];
}
$order_bn = array();
$shop_type = array();
$order_source = array();
if ($data['orders']){
$total_receivable = 0;
foreach ($data['orders'] as $odk => $order) {
if( $order['order_source'] == 'tbdx' && $order['shop_type'] == 'taobao' ){
$cost_item = $tbitemObj->getCostitemByOrderId($order['order_id']);
$data['order_cost_item'] += $cost_item[0]['cost_items'];
}else{
$data['order_cost_item'] += $order['cost_item'];
}
$pmt_order_total+=$order['pmt_order'];
$data['front_cost_freight'] += $order['shipping']['cost_shipping'];
if ($order['custom_mark']) {
$mark = unserialize($order['custom_mark']);
if (is_array($mark) || !empty($mark)){
if($markShowMethod == 'all'){
foreach ($mark as $im) {
$data['buyWord'] .= $im['op_content'] . " " . $im['op_time'] ."\r\n";
}
}else{
$tmp_mark = array_pop($mark);
$data['buyWord'] .= $tmp_mark['op_content'] . " " . $tmp_mark['op_time'] ."\r\n";
}
$data['buyWord'] = trim($data['buyWord'], "\r\n");
}
}
if ($order['mark_text']) {
$mark = '';
$mark_text = unserialize($order['mark_text']);
if (is_array($mark_text) || !empty($mark_text)){
if($markShowMethod == 'all'){
foreach ($mark_text as $im) {
$data['orderMark'] .= $im['op_content'] . " " . $im['op_time'] ."\r\n";
}
}else{
$tmp_mark = array_pop($mark_text);
$data['orderMark'] .= $tmp_mark['op_content'] . " " . $tmp_mark['op_time'] ."\r\n";
}
$data['orderMark'] = trim($data['orderMark'], "\r\n");
}
}
if($order['tax_no'] || $order['tax_title']){
$data['_tax_info'][] = array(
'order_bn'=>$order['order_bn'],
'tax_no'=>$order['tax_no'],
'tax_title'=>$order['tax_title'],
);
}
$order_bn[] = $order['order_bn'];
if(!in_array($order['shop_type'],$shop_type)){
$shop_type[] = $order['shop_type'];
}
if(!in_array($order['order_source'],$order_source)){
$order_source[] = $order['order_source'];
}
if($order['shipping']['is_cod'] == 'true'){
$extendInfo = array();
$extendInfo = $orderExtendObj->dump($order['order_id']);
$total_receivable += $extendInfo['receivable'];
}
if(!empty($order['paytime'])){
$data['paytime'] = date('Y-m-d H:i:s',$order['paytime']);
}
}
}
$data['total_receivable'] = $total_receivable;
$data['order_bn'] = implode(" , ", $order_bn);
//有两级价格的发货单不显示价格
$show_delivery_price = true;
//all:代表一张发货关联多个前端店铺
$data['shop_type'] = 'all';
$data['order_source'] = 'all';
if(count($shop_type) == 1 && count($order_source) == 1){
$data['shop_type'] = $shop_type[0];
$data['order_source'] = $order_source[0];
if($shop_type[0] == 'shopex_b2b'){
$arr = array('fxjl','b2c','taofenxiao');
if(in_array($order_source[0], $arr)){
$show_delivery_price = false;
}
}
}
$show_delivery_price = true;#有两级价格的,显示价格
$data['show_delivery_price'] = $show_delivery_price;
if ($t_tel) $data['member_tel'] = implode(" / ", $t_tel);
//去除多余的三级区域
$reg = preg_quote(trim($data['consignee']['province']));
if (!empty($data['consignee']['city'])) {
$reg .= '.*?' . preg_quote(trim($data['consignee']['city']));
}
if (!empty($data['consignee']['district'])) {
$reg .= '.*?' . preg_quote(trim($data['consignee']['district']));
}
$data['consignee']['addr'] = preg_replace('/' . $reg . '/is', '', $data['consignee']['addr']);
$data['shopname'] = $data['shop_name'];#因京东会直接替掉,所以新增显示
#分销王订单新增代销人收货信息
if($shop['node_type'] == 'shopex_b2b'){
#开启分销王代销人发货信息
if($delivery_cfg['set']['wms_delivery_sellagent']){
foreach($data['delivery_order'] as $val){
//订单代销人会员信息
$oSellagent = app::get('ome')->model('order_selling_agent');
$sellagent_detail = $oSellagent->dump(array('order_id'=>$val['order_id']));
#订单扩展表上的状态是1 (只有发货人与发货地址都存在状态才会是1)
if($sellagent_detail['print_status'] == '1'){
$data['shop_name'] = $sellagent_detail['website']['name'];
$data['seller_name'] = $sellagent_detail['seller']['seller_name'];
$data['seller_mobile'] = $sellagent_detail['seller']['seller_mobile'];
$data['seller_phone'] = $sellagent_detail['seller']['seller_phone'];
$data['seller_address'] = $sellagent_detail['seller']['seller_address'];
$data['seller_area'] = $sellagent_detail['seller']['seller_area'];
}
}
}
}
//京东订单添加打印标示
if($data['shop_type']=='360buy'){
$logo_url = kernel::base_url(1)."/app/wms/statics/360buylogo.png";
$data['shop_name'] = '<img src="'.$logo_url.'" width="129" height="25" alt="京东商城">&nbsp;';
$data['shop_logo_url'] = $logo_url;
$data['shop_logo_html'] = '<img src="'.$logo_url.'" width="129" height="25" alt="京东商城">';
}
//物流信息
if ($logi_name == '') {
$logi_name = $data['logi_name'];
}
$batch_number = $print_data['identInfo']['items'][$data['delivery_id']];
$data['batch_number'] = $batch_number ? $batch_number : '';//$data['delivery_id']
$items[] = $data;
//$this->checkOrderSendnum($id);
} else {
$_err = 'true';
}
}
unset($kmtmp_shopInfo,$km_pd,$km_gds,$km_position,$km_brand,$km_gtype,$km_member);
}
function cmp($a, $b) {
return strcmp($a["store_position"], $b["store_position"]);
}
$deliCfgLib = kernel::single('wms_delivery_cfg');
$is_print_front = (1 == $deliCfgLib->getValue('wms_delivery_is_printdelivery',$sku)) ? true : false;
foreach ($items as $k => $item) {
usort($item['delivery_items'], "cmp");
if (!$is_print_front) {
foreach ($item['delivery_items'] as $i => $di) {
$item['delivery_items'][$i]['product_name'] = $di['name'];
}
}
$items[$k] = $item;
}
//商品名称和规格取前台,是合并发货单,取第一个订单的货品名称
if ($print_data['ids'] && $is_print_front) {
$arrPrintProductName = $dlyObj->getPrintOrderName($items);
if (!empty($arrPrintProductName)) {
$productPos = $dlyObj->getPrintProductPos($items);
foreach ($items as $k => $rows) {
foreach ($rows['delivery_items'] as $k2 => $v) {
$rows['delivery_items'][$k2]['name'] = $arrPrintProductName[$rows['delivery_id']][$v['bn']]['name'];
$rows['delivery_items'][$k2]['product_name'] = $arrPrintProductName[$rows['delivery_id']][$v['bn']]['name'];
$rows['delivery_items'][$k2]['addon'] = $arrPrintProductName[$rows['delivery_id']][$v['bn']]['addon'];
$rows['delivery_items'][$k2]['spec_info'] = $arrPrintProductName[$rows['delivery_id']][$v['bn']]['addon'];
$rows['delivery_items'][$k2]['store_position'] = $productPos[$v['product_id']];
}
$items[$k] = $rows;
}
}
}
if ($print_data['ids']) $vid = implode(',', $print_data['ids']);
foreach ($items as $k => $rows) {
$pmt_order_total=0;
$pmt_order_discount = 0;
foreach($rows['orders'] as $order){
$pmt_order_total+=$order['pmt_order'];
$pmt_order_total+=$order['pmt_goods'];
$pmt_order_discount+=$order['discount'];
}
$delivery_total_nums = 0;
$goods_num = 0;
$sum_sale_price =0;
foreach ($rows['delivery_items'] as $v) {
$delivery_total_nums += $v['number'];
$sum_sale_price = $v['sale_price'];
$goods_num++;
}
$rows['goods_num'] = $goods_num;
$rows['delivery_total_nums'] = $delivery_total_nums;
$rows['pmt_order_total'] = $pmt_order_total;
//订单折扣金额
$rows['pmt_order_discount'] = $pmt_order_discount;
//有两级价格的发货单不显示价格
if(!$rows['show_delivery_price']){
foreach ($rows['delivery_items'] as $kk => $item) {
$rows['delivery_items'][$kk]['price'] = '-';
}
$rows['order_total_amount'] = '-';
$rows['order_cost_item'] = '-';
}else{
#add taobao fenxiao
if($rows['order_source'] == 'tbdx' && $rows['shop_type'] == 'taobao'){
$rows['order_total_amount'] = $rows['front_cost_freight'] + $rows['order_cost_item'];
$rows['order_sales_price'] = $dlyObj->getAllTotalAmountByDelivery($rows['delivery_order']);#代销类型订单,增加字段,订单实际总额
}else{
$rows['order_total_amount'] = $dlyObj->getAllTotalAmountByDelivery($rows['delivery_order']);
}
}
$items[$k] = $rows;
}
#添加打印模式
#获取当前设置打印版本$deliCfgLib
$print_version = $deliCfgLib->getprintversion();
#获取当前打印模式
$print_style = $deliCfgLib->getprintstyle();
#打印订单将捆绑商品分类展示
#根据版本标识
foreach($items as $k=>$v){
//格式化销售模式的数据
if ($print_style == '1'){
$items[$k]['delivery_items'] = ['goods' => [['order_items'=>$v['delivery_items']]]];
} else {
$items[$k] = $this->formatSaleStyleData($v);
}
#判断是否开启按货位排序
if($delivery_cfg['set']['print_order'] == 1){
if(is_array($items[$k]['delivery_items']['goods'])){
uasort($items[$k]['delivery_items']['goods'], 'cmp');
}
}
}
//打印输出保质期信息按item层输出
foreach($items as $k1=>$v1){
if(isset($v1['expire_bns'])){
foreach($v1['delivery_items'] as $k2=>$v2){
foreach($v1['expire_bns'] as $ek => $info){
if($v2['wms_item_id'] == $info['item_id']){
$items[$k1]['delivery_items'][$k2]['expire_bns'][] = $info['expire_bn'];
}
}
if($items[$k1]['delivery_items'][$k2]['expire_bns']){
$items[$k1]['delivery_items'][$k2]['expire_bn'] = implode('\n',$items[$k1]['delivery_items'][$k2]['expire_bns']);
}
}
}
}
return array(
'items' => $items,
'allItems' => $allItems,
'branch_list' => $branch_list,
'vid' => $vid,
'print_style' => $print_style,
'logi_name' => $logi_name,
);
}
/**
* arrayToJson
* @param mixed $deliverys deliverys
* @return mixed 返回值
*/
public function arrayToJson($deliverys) {
$nbsp = " ";
$this->covertNullToString($deliverys);
return json_encode($deliverys);
}
}