Files
OMS/app/o2o/lib/order.php
2026-01-04 19:08:31 +08:00

312 lines
13 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Created by PhpStorm.
* User: yaokangming
* Date: 2019/6/25
* Time: 11:20
*/
class o2o_order
{
/**
* 创建Order
* @param mixed $data 数据
* @return mixed 返回值
*/
public function createOrder(&$data) {
$shop = app::get('o2o')->model('store')->db_dump(array('shop_id'=>$data['shop_id']));
if(empty($shop)) {
return array(false, '没有该门店');
}
$data['branch_id'] = $shop['branch_id'];
$mark_text = [
[
'op_name' => kernel::single('desktop_user')->get_name(),
'op_time' => time(),
'op_content' => $data['mark_text'],
]
];
$sdf = array(
'member_uname'=>$data['name'],
'pay_bn'=>$data['payment_no'],
'payinfo'=>array(
'pay_name'=>$data['payment']
),
'createtime'=>time(),
'shop_id'=>$data['shop_id'],
'shop_type'=>$shop['shop_type'],
'shipping'=>array(
'shipping_name'=>'',
'is_cod'=>'false',
'cost_shipping'=>'0',
'is_protect'=>'false',
'cost_protect'=>0,
),
'custom_mark'=>'',
'mark_text'=>serialize($mark_text),
'consignee'=>array(
'name'=>$data['name'],
'email'=>'',
'zip'=>'',
'mobile'=>$data['mobile'],
'telephone' => '',
'addr'=>$data['addr'],
'area'=>$data['area'],
'r_time'=>'任意日期 任意时间段',
),
'is_tax'=>'false',
// 'cost_item'=>$data['receivable'],
'cost_item'=>array_sum($data['original_price']),
'pmt_goods'=>array_sum($data['discount']),
'pmt_order'=>$data['pmt_order'],
'total_amount'=>$data['payed'],
'order_type'=>'offline',
'paytime'=>time(),
'order_source'=>'direct',
'createway'=>'local',
'pay_status' => 1,
'payed'=>$data['payed']
);
$sdf['order_bn'] = 'O' . $data['payment_no'];
if($data['member_id']) {
$sdf['member_id'] = $data['member_id'];
} else {
$memberModel = app::get('ome')->model('members');
$member = $memberModel->dump(array('uname'=>$sdf['member_uname']),'member_id');
if (!$member) {
$member = array(
'account' => array('uname'=>$sdf['member_uname']),
'contact' => array(
'name'=>$sdf['member_uname'],
'phone'=>array('mobile'=>$sdf['consignee']['mobile'])
),
);
$memberModel->save($member);
}
$sdf['member_id'] = $member['member_id'];
}
$price = $data['price'];
$sale_price = $data['sale_price'];
$discount = $data['discount'];
$salesMLib = kernel::single('material_sales_material');
$lib_ome_order = kernel::single('ome_order');
foreach ($data['num'] as $k => $i){
$salesMInfo = $salesMLib->getSalesMById($data['shop_id'],$k);
if($salesMInfo){
if($salesMInfo['sales_material_type'] == 4){ //福袋
$basicMInfos = $salesMLib->get_order_luckybag_bminfo($salesMInfo['sm_id']);
}elseif($salesMInfo['sales_material_type'] == 5){ //多选一
$basicMInfos = $salesMLib->get_order_pickone_bminfo($salesMInfo['sm_id'],$i,$data['shop_id']);
}else{
//获取绑定的基础物料
$basicMInfos = $salesMLib->getBasicMBySalesMId($salesMInfo['sm_id']);
}
$obj_number = $i;
//如果是促销类销售物料
if($salesMInfo['sales_material_type'] == 2){ //促销
$obj_type = $item_type = 'pkg';
$obj_sale_price = $price[$k]*$obj_number;
//item层关联基础物料平摊销售价
$salesMLib->calProSaleMPriceByRate($obj_sale_price, $basicMInfos);
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
}elseif($salesMInfo['sales_material_type'] == 4){ //福袋
$obj_type = $item_type = 'lkb';
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
}elseif($salesMInfo['sales_material_type'] == 5){ //多选一
$obj_type = $item_type = 'pko';
foreach($basicMInfos as &$var_basic_info){
$var_basic_info["price"] = $price[$k];
$var_basic_info["sale_price"] = $sale_price[$k]/$obj_number;
$var_basic_info["pmt_price"] = $discount[$k]/$obj_number;
}
unset($var_basic_info);
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
}else{
$sales_material_type = material_sales_material::$sales_material_type;
$obj_type = $sales_material_type[$salesMInfo['sales_material_type']]['type'];
$obj_type = $obj_type ? $obj_type : 'goods';
$item_type = ($obj_type == 'goods') ? 'product' : $obj_type;
if($obj_type == 'gift'){
$price[$k] = 0.00;
}
foreach($basicMInfos as &$var_basic_info){
$var_basic_info["price"] = $price[$k];
$var_basic_info["sale_price"] = $sale_price[$k]/$obj_number;
$var_basic_info["pmt_price"] = $discount[$k]/$obj_number;
}
unset($var_basic_info);
$return_arr_info = $lib_ome_order->format_order_items_data($item_type,$obj_number,$basicMInfos);
}
$sdf['order_objects'][] = array(
'obj_type' => $obj_type,
'obj_alias' => $obj_type,
'goods_id' => $salesMInfo['sm_id'],
'bn' => $salesMInfo['sales_material_bn'],
'name' => $salesMInfo['sales_material_name'],
'price' => $price[$k],
'sale_price'=>$sale_price[$k],
'pmt_price'=>$discount[$k],
'amount' => $price[$k]*$obj_number,
'quantity' => $obj_number,
'order_items' => $return_arr_info["order_items"],
);
// $item_cost += $price[$k]*$obj_number;
$tostr[]=array("name"=>$salesMInfo['sales_material_name'],"num"=>$obj_number);
}
}
if (!$sdf['order_objects']) {
return array(false, '下单商品,该门店无法销售');
}
$sdf['title'] = $tostr ? json_encode($tostr):'';
$sdf['itemnum'] = count($sdf['order_objects']);
$sdf['currency'] = 'CNY';
$sdf['source'] = 'local';
$rs = app::get('ome')->model('orders')->create_order($sdf);
if(!$rs) {
return array(false, '该支付单号已经生成过订单');
}
$data['order_id'] = $sdf['order_id'];
return array(true, '新建成功');
}
/**
* doPay
* @param mixed $data 数据
* @return mixed 返回值
*/
public function doPay($data) {
$op = kernel::single('ome_func')->getDesktopUser();
$payment = array(
'payment_bn' => $data['payment_no'],
'shop_id' => $data['shop_id'],
'order_id' => $data['order_id'],
'currency' => 'CNY',
'money' => (float)$data['payed'],
'cur_money' => (float)$data['payed'],
'paymethod' => $data['payment'],
't_begin' => time(),
't_end' => time(),
'download_time' => time(),
'status' => 'succ',
'trade_no' => $data['payment_no'],
'op_id' => $op['op_id'],
'op_name' => $op['op_name']
);
app::get('ome')->model('payments')->insert($payment);
}
/**
* 添加ConsignDelivery
* @param mixed $data 数据
* @return mixed 返回值
*/
public function addConsignDelivery($data) {
$arrProductId = array();
foreach ($data['delivery'] as $k => $val) {
if ($val) {
$arrProductId[] = $k;
}
}
if(empty($arrProductId)) {
return;
}
$orderId = $data['order_id'];
$orderObj = app::get('ome')->model('orders');
$order = $orderObj->db_dump(array('order_id'=>$orderId),
'order_id,ship_name,ship_time,ship_mobile,ship_zip,ship_area,ship_tel,ship_email,ship_addr,shipping');
$delivery = array(
'branch_id' => $data['branch_id'],
'consignee' => array(
'name' => $order['ship_name'],
'r_time' => $order['ship_time'],
'mobile' => $order['ship_mobile'],
'zip' => $order['ship_zip'],
'area' => $order['ship_area'],
'telephone' => $order['ship_tel'],
'email' => $order['ship_email'],
'addr' => $order['ship_addr']
),
'check_store' => false,
'delivery_items' => array()
);
$corpData = kernel::single('logistics_rule')->getSelfFetchCorp();
$delivery['logi_id'] = $corpData['corp_id'];
$orderItems = app::get('ome')->model('order_items')->getList('*', array('order_id'=>$orderId, 'delete'=>'false', 'product_id'=>$arrProductId));
$order_items = array();
$logObj = app::get('ome')->model('operation_log');
foreach ($orderItems as $item) {
$delivery['delivery_items'][] = array(
'item_type' => $item['item_type'],
'product_id' => $item['product_id'],
'shop_product_id' => $item['shop_product_id'],
'bn' => $item['bn'],
'number' => $item['nums'],
'product_name' => $item['name'],
'spec_info' => $item['addon'],
);
$order_items[] = array(
'item_id' => $item['item_id'],
'product_id' => $item['product_id'],
'number' => $item['nums'],
'bn' => $item['bn'],
'product_name' => $item['name'],
'obj_id' => $item['obj_id'],
);
}
$split_status = '';
$deliveryObj = app::get('ome')->model("delivery");
$result = $deliveryObj->addDelivery($orderId, $delivery,array(),$order_items, $split_status);
$delivery_id = $result['data'];
if ($delivery_id) {
//更新订单信息
$sdf = array(
'order_id' => $orderId,
'process_status' => $split_status,
'confirm' => 'Y',
'dispatch_time' => time(),
'refund_status' => 0,
);
$orderObj->save($sdf);
$log_msg = '订单'.($split_status=='splitting'?'部分':'').'确认';
$get_dly_bn = $deliveryObj->getList('delivery_id, delivery_bn', array('delivery_id' => $delivery_id), 0, 1);
$get_dly_bn = $get_dly_bn[0];
$log_msg .= sprintf('(发货单号:<a href="index.php?app=ome&ctl=admin_receipts_print&act=show_delivery_items&id=%s" target="_blank">%s</a>)', $delivery_id, $get_dly_bn['delivery_bn']);
$logObj->write_log('order_confirm@ome',$orderId, $log_msg);
$upData = array();
$upData['logi_no'] = $get_dly_bn['delivery_bn'];
$upData['expre_status'] = 'true';
$upData['status'] = 'progress';
$deliveryObj->update($upData,array( 'delivery_id' => $delivery_id));
$logObj->write_log('delivery_expre@ome', $delivery_id, '线下订单已发货打印(模拟)');
$errmsg = '';
$consignRs = $deliveryObj->consignDelivery($delivery_id, 0, $errmsg);
if(!$consignRs) {
$logObj->write_log('delivery_process@ome', $delivery_id, '发货单发货失败:'.$errmsg);
}
} else {
$logObj->write_log('order_confirm@ome',$orderId,'生成发货单失败');
}
}
}