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

534 lines
25 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright 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.
*/
class ome_syncorder
{
var $status = array('TRADE_ACTIVE'=>'active','TRADE_CLOSED'=>'dead','TRADE_FINISHED'=>'finish');
var $pay_status = array('PAY_NO'=>0,'PAY_FINISH'=>1,'PAY_TO_MEDIUM'=>2,'PAY_PART'=>3,'REFUND_PART'=>4,'REFUND_ALL'=>5,'REFUNDING'=>6);
var $ship_status = array('SHIP_NO'=>0,'SHIP_FINISH'=>1,'SHIP_PREPARE'=>1,'SHIP_PART'=>2,'RESHIP_PART'=>3,'RESHIP_ALL'=>4);
// 矩阵订单数据转化后保存到TG订单系统
function add($aData,$shop_id,&$msg="操作失败",&$logTitle="",&$logInfo=""){
$shop = app::get("ome")->model("shop");
$shop_row = $shop->db->selectrow("select node_id,node_type from sdb_ome_shop where shop_id='".$shop_id."'");
// 默认赋值所有
$order_sdf = $aData;
$order_sdf['position'] = $aData['position'];
$order_sdf['position_no'] = $aData['position_no'];
$order_sdf['shop_type'] = $shop_row['node_type'];
$order_sdf['node_id'] = $shop_row['node_id'];
$order_sdf['order_bn'] = $aData['tid'];
$order_sdf['status'] = $this->status[$aData['status']];
$order_sdf['pay_status'] = $this->pay_status[$aData['pay_status']];
$order_sdf['ship_status'] = $this->ship_status[$aData['ship_status']];
$order_sdf['is_delivery'] = $aData['is_delivery'];
$order_sdf['t_type'] = empty($aData['tradetype'])?'fixed':$aData['tradetype'];
$order_sdf['fx_order_id'] = $aData['fx_order_id'];
$order_sdf['tc_order_id'] = $aData['tc_order_id'];
$order_sdf['index_field'] = $aData['index_field'];
$order_sdf['is_daixiao'] = $aData['is_daixiao']==true ? 'true' : 'false';
//阿里全渠道
$order_sdf['omnichannel_param'] = $aData['omnichannel_param'];
if(isset($aData['cnAuto']) && !empty($aData['cnAuto'])){
$order_sdf['cnAuto'] = $aData['cnAuto'];
}
// 京仓订单
if ($aData['store_order']) $order_sdf['store_order'] = $aData['store_order'];
//配送信息 begin
$shipping['shipping_id'] = $aData['shipping_tid'];
$shipping['shipping_name'] = $aData['shipping_type'];
$shipping['cost_shipping'] = $aData['shipping_fee'];
$shipping['is_protect'] = $aData['is_protect'];
$shipping['cost_protect'] = $aData['protect_fee'];
$shipping['is_cod'] = $aData['is_cod'];
//配送信息 end
$order_sdf['shipping'] = $shipping;
//支付方式信息 begin
$payinfo['pay_name'] = $aData['payment_type'];
$payinfo['cost_payment'] = $aData['cost_payment']; //支付费用
if($shop_row['node_type'] == 'ecshop_b2c'){
$payinfo['cost_payment'] = $aData['pay_cost']; //支付费用
}
//支付方式信息 end
$order_sdf['payinfo'] = $payinfo;
$order_sdf['is_sh_ship'] = $aData['is_sh_ship']?$aData['is_sh_ship']:'';#菜鸟自动流转订单
$order_sdf['pay_bn'] = $aData['payment_tid'];
$order_sdf['weight'] = $aData['total_weight'];
$order_sdf['title'] = $aData['title'];
$order_sdf['createtime'] = $aData['created'];
// 收货人信息 begin
$consignee['name'] = $aData['receiver_name'];
$consignee['area_state'] = $aData['receiver_state'];
$consignee['area_city'] = $aData['receiver_city'];
$consignee['area_district'] = $aData['receiver_district'];
$consignee['area_street'] = $aData['receiver_street'];
$consignee['addr'] = $aData['receiver_address'];
$consignee['zip'] = $aData['receiver_zip'];
$consignee['telephone'] = $aData['receiver_phone'];
$consignee['mobile'] = $aData['receiver_mobile'];
$consignee['email'] = $aData['receiver_email'];
$consignee['r_time'] = $aData['receiver_time'];
//收货人信息 end
$order_sdf['consignee'] = $consignee;
//发货人信息 begin 暂时没有找到 用发货人信息代替
$consigner['name'] = $aData['receiver_name'];
$consigner['area_state'] = $aData['receiver_state'];
$consigner['area_city'] = $aData['receiver_city'];
$consigner['area_district'] = $aData['receiver_district'];
$consigner['addr'] = $aData['receiver_address'];
$consigner['zip'] = $aData['receiver_zip'];
$consigner['telephone'] = $aData['receiver_phone'];
$consigner['mobile'] = $aData['receiver_mobile'];
$consigner['email'] = $aData['receiver_email'];
//发货人信息 end
$order_sdf['consigner'] = $consigner;
//代销人信息 begin
$selling_agent['member_info']['uname'] = $aData['agent_uname'];
$selling_agent['member_info']['name'] = $aData['agent_name'];
$selling_agent['member_info']['level'] = $aData['agent_level'];
$selling_agent['member_info']['birthday'] = $aData['agent_birthdate'];
$selling_agent['member_info']['sex'] = $aData['agent_sex'];
$selling_agent['member_info']['area_state'] = $aData['agent_state'];
$selling_agent['member_info']['area_city'] = $aData['agent_city'];
$selling_agent['member_info']['area_district'] = $aData['agent_district'];
$selling_agent['member_info']['addr'] = $aData['agent_address'];
$selling_agent['member_info']['zip'] = $aData['agent_zip'];
$selling_agent['member_info']['telephone'] = $aData['agent_phone'];
$selling_agent['member_info']['mobile'] = $aData['agent_mobile'];
$selling_agent['member_info']['email'] = $aData['agent_email'];
$selling_agent['website']['name'] = $aData['agent_shop_name'];
$selling_agent['website']['domain'] = $aData['agent_shop_url'];
// 单拉订单时,增加分销王代销人信息
if($shop_row['node_type'] == 'shopex_b2b'){
$order_sdf['seller_name'] = $aData['seller_name'];#卖家姓名
$order_sdf['seller_mobile'] = $aData['seller_mobile'];#卖家电话号码
$order_sdf['seller_phone'] = $aData['seller_phone'];#卖家电话号码
$order_sdf['seller_state'] = $aData['seller_state'];#卖家的所在省份
$order_sdf['seller_city'] = $aData['seller_city'];#卖家的所在城市
$order_sdf['seller_district'] = $aData['seller_district'];#卖家的所在地区
$order_sdf['seller_zip'] = $aData['seller_zip'];#卖家的邮编
$order_sdf['seller_address'] = $aData['seller_address'];#发货人的详细地址
}
$selling_agent['website']['logo'] = '';//代销人网站LOGO
//代销人信息 end
$order_sdf['selling_agent'] = $selling_agent;
//买家会员信息 begin
$member_info['uname'] = $aData['buyer_uname'];
$member_info['name'] = $aData['buyer_name'];
$member_info['alipay_no'] = $aData['buyer_alipay_no'];
$member_info['area_state'] = $aData['buyer_state'];
$member_info['area_city'] = $aData['buyer_city'];
$member_info['area_district'] = $aData['buyer_district'];
$member_info['addr'] = $aData['buyer_address'];
$member_info['mobile'] = $aData['buyer_mobile'];
$member_info['tel'] = $aData['buyer_phone'];
$member_info['email'] = $aData['buyer_email'];
$member_info['zip'] = $aData['buyer_zip'];
$member_info['buyer_open_uid'] = $aData['buyer_open_uid'];
//买家会员信息 end
$order_sdf['member_info'] = json_encode($member_info);
//订单来源
$order_sdf['order_source'] = $aData['order_source'];
//订单优惠方案信息 begin
$tmp_pmt_detail = $aData['promotion_details']['promotiondetail'];
if($shop_row['node_type'] == '360buy' && empty($tmp_pmt_detail)){
$tmp_pmt_detail = $aData['promotion_details'];
}
if($shop_row['node_type'] == 'ecshop_b2c'){
$payment_lists = json_decode($aData['payment_lists'],true);
$aData['payment_lists'] = $payment_lists;
$tmp_pmt_detail = json_decode($aData['promotion_details'],true);
}
$order_sdf['pmt_detail'] = array();
$order_sdf['other_list'] = array();
$k_count = 0;
if($tmp_pmt_detail){
foreach((array)$tmp_pmt_detail as $k=>$v){
$order_sdf['pmt_detail'][$k]['pmt_amount'] = $v['promotion_fee'] ? $v['promotion_fee'] : $v['pmt_amount'];
$order_sdf['pmt_detail'][$k]['pmt_describe'] = $v['promotion_name'] ? $v['promotion_name'] : $v['pmt_describe'];
if(isset($v['gift_item_id']) && $v['gift_item_id']){
$order_sdf['other_list'][$k_count]['type'] = 'gift';
$order_sdf['other_list'][$k_count]['id'] = $v['gift_item_id'];
$order_sdf['other_list'][$k_count]['name'] = $v['gift_item_name'];
$order_sdf['other_list'][$k_count]['num'] = $v['gift_item_num'];
$k_count++;
}
}
}
// 应收款记录
if ($aData['is_cod'] == 'true' && isset($aData['unpaidprice'])) {
$order_sdf['other_list'][] = array(
'type' => 'unpaid',
'unpaidprice' => $aData['unpaidprice'],
);
}
$order_sdf['other_list'] = json_encode($order_sdf['other_list']);
//订单优惠方案信息 end
//支付单信息 新版本
foreach((array) $aData['payment_lists']['payment_list'] as $p_k=>$p_v)
{
$payments[$p_k]['trade_no'] = $p_v['payment_id'];
$payments[$p_k]['money'] = isset($p_v['pay_fee'])?$p_v['pay_fee']:$p_v['payed_fee'];
$payments[$p_k]['pay_time'] = $p_v['pay_time'];
$payments[$p_k]['account'] = $p_v['seller_account'];
$payments[$p_k]['bank'] = $p_v['seller_bank'];
$payments[$p_k]['pay_bn'] = $p_v['payment_code'];
$payments[$p_k]['paycost'] = $p_v['paycost'];
$payments[$p_k]['pay_account'] = $p_v['buyer_account'];
$payments[$p_k]['paymethod'] = $p_v['payment_name'];
$payments[$p_k]['memo'] = $p_v['memo'];
}
$order_sdf['payments'] = $payments;
//支付单信息 新版本
$order_sdf['cost_item'] = $aData['total_goods_fee'];
$order_sdf['is_tax'] = $aData['invoice_title'] ? "true":"false";
$order_sdf['cost_tax'] = $aData['invoice_fee'];
$order_sdf['tax_title'] = $aData['invoice_title'];
$order_sdf['invoice_kind'] = $aData['invoice_kind']; //1电子发票 2纸质发票
$order_sdf['currency'] = $aData['currency'];
$order_sdf['cur_rate'] = $aData['currency_rate'];
$order_sdf['score_u'] = $aData['point_fee'];
$order_sdf['score_g'] = $aData['buyer_obtain_point_fee'];
if(in_array($shop_row['node_type'],ome_shop_type::shopex_shop_type())){
$order_sdf['discount'] = $aData['discount_fee'];
}elseif(in_array($shop_row['node_type'], array('luban'))){
//[抖音]订单需要discount_fee优惠金额
$order_sdf['discount'] = $aData['discount_fee'];
}else{
$order_sdf['discount'] = 0.00;
}
if($shop_row['node_type'] == 'youzan' || $shop_row['node_type'] == 'taobao'){
$order_sdf['discount'] = $aData['discount_fee'];#有赞的折扣或涨价
}
$order_sdf['pmt_goods'] = $aData['goods_discount_fee'];
$order_sdf['pmt_order'] = $aData['orders_discount_fee'];
$order_sdf['total_amount'] = $aData['total_trade_fee']; //订单总格 = 交易应付总额
$order_sdf['payed'] = $aData['payed_fee'];
$order_sdf['custom_mark'] = $aData['buyer_message'] ? $aData['buyer_message'] : $aData['buyer_memo'];
$order_sdf['mark_text'] = $aData['trade_memo'];
$order_sdf['buyer_flag'] = $aData['buyer_flag'];
$order_sdf['mark_type'] = $aData['seller_flag'];
$order_sdf['tax_no'] = $aData['tax_no']; //发票号
$order_sdf['order_limit_time'] = $aData['pay_time']; //订单失效时间
$order_sdf['coupons_name'] = $aData['coupons_name']; //优惠卷名称
$order_sdf['is_service_order'] = $aData['is_service_order'];
$order_sdf['service_order_objects'] = $aData['service_orders'];
//寄售字段
$order_sdf['order_type'] = $aData['is_brand_sale'];
$order_sdf['is_force_wlb'] = $aData['is_force_wlb'];
$order_sdf['is_lgtype'] = $aData['is_lgtype'];
//菜鸟直送订单
$order_sdf['cn_info'] = $aData['cn_info'];
//仓中仓
$order_sdf['sale_type'] = $aData['sale_type'];
//交易完成买家确认收货时间
$order_sdf['end_time'] = $aData['end_time'];
//风控订单
$order_sdf['is_risk'] = $aData['is_risk'];
//订单商品结构数组信息
$order_objects = array();
//$aData['orders'] = json_decode($aData['orders'],true);
foreach($aData['orders']['order'] as $o_k=>$o_v)
{
$order_objects[$o_k] = $o_v;
$order_objects[$o_k]['is_sh_ship'] = isset($o_v['is_sh_ship'])?$o_v['is_sh_ship']:'';
$order_objects[$o_k]['obj_type'] = $o_v['type'];
$order_objects[$o_k]['shop_goods_id'] = $o_v['iid'];
$order_objects[$o_k]['oid'] = $o_v['oid'];
$order_objects[$o_k]['obj_alias'] = $o_v['type_alias'];
$order_objects[$o_k]['bn'] = $o_v['orders_bn'];
$order_objects[$o_k]['name'] = $o_v['title']; //子订单名称
$order_objects[$o_k]['price'] = $o_v['total_order_fee']/$o_v['items_num']; //原始单价
$order_objects[$o_k]['amount'] = $o_v['total_order_fee']; //原始价小计
$order_objects[$o_k]['sale_price'] = $o_v['sale_price'];
$order_objects[$o_k]['quantity'] = $o_v['items_num'];
$order_objects[$o_k]['weight'] = $o_v['weight'];
$order_objects[$o_k]['score'] = 0;//积分
$order_objects[$o_k]['is_oversold'] = $o_v['is_oversold'];//淘宝超卖标记
$order_objects[$o_k]['fx_oid'] = $o_v['fx_oid'];
$order_objects[$o_k]['tc_order_id'] = $o_v['tc_order_id'];
$order_objects[$o_k]['cost_tax'] = $o_v['cost_tax'];
$order_objects[$o_k]['buyer_payment'] = $o_v['buyer_payment'];
$order_objects[$o_k]['store_code'] = $o_v['store_code'];
$order_objects[$o_k]['gift_mids'] = $o_v['gift_mids'];
$order_objects[$o_k]['part_mjz_discount'] = $o_v['part_mjz_discount'];
$order_objects[$o_k]['divide_order_fee'] = $o_v['divide_order_fee'];
$order_items = array();
$total_pmt_price = 0;
foreach($o_v['order_items']['orderitem'] as $i_k=>$i_v)
{
$order_items[$i_k] = $i_v;
if($order_sdf['shop_type'] == 'alibaba'){
$order_items[$i_k]['specId'] = $i_v['iid'];
}
$order_items[$i_k]['item_type'] = $i_v['item_type'];
$order_items[$i_k]['shop_goods_id'] = $i_v['iid'];
$order_items[$i_k]['shop_product_id'] = $i_v['sku_id'];
$order_items[$i_k]['bn'] = $i_v['bn'];
$order_items[$i_k]['name'] = $i_v['name'];
$product_attr = array();
// 微信小店前端没有规格下来
if(($order_sdf['shop_type'] != 'wx') && (!empty($i_v['sku_properties'])) && is_string($i_v['sku_properties'])){
$sku_properties = explode(';',$i_v['sku_properties']);
foreach($sku_properties as $si=>$sp){
$_sp = explode(':',$sp);
$product_attr[$si]['label'] = $_sp[0];
$product_attr[$si]['value'] = $_sp[1];
}
}
if(!empty($product_attr) && $order_sdf['shop_type'] == 'youzan'){
$order_items[$i_k]['original_str'] = $i_v['sku_properties'];
}
$order_items[$i_k]['product_attr'] = $product_attr;
$order_items[$i_k]['quantity'] = $i_v['num'];
$order_items[$i_k]['price'] = $i_v['price'];
$order_items[$i_k]['amount'] = $i_v['total_item_fee'];
$order_items[$i_k]['pmt_price'] = $i_v['discount_fee'];
$order_items[$i_k]['sale_price'] = $i_v['sale_price'];
$order_items[$i_k]['weight'] = $i_v['weight'];
$order_items[$i_k]['score'] = $i_v['score'];
$order_items[$i_k]['status'] = $i_v['status'];
$order_items[$i_k]['fx_oid'] = $i_v['fx_oid'];
$order_items[$i_k]['cost_tax'] = $i_v['cost_tax'];
$order_items[$i_k]['buyer_payment'] = $i_v['buyer_payment'];
$order_items[$i_k]['divide_order_fee'] = $i_v['divide_order_fee'];
$order_items[$i_k]['part_mjz_discount'] = $i_v['part_mjz_discount'];
$order_items[$i_k]['extend_item_list'] = $i_v['extend_item_list'];
$order_items[$i_k]['expand_card_basic_price_used_suborder'] = $i_v['expand_card_basic_price_used_suborder'];
$order_items[$i_k]['expand_card_expand_price_used_suborder'] = $i_v['expand_card_expand_price_used_suborder'];
$total_pmt_price +=$i_v['discount_fee'];
}
$order_objects[$o_k]['order_items'] = $order_items;
$order_objects[$o_k]['pmt_price'] = $o_v['discount_fee'] - $total_pmt_price;
}
$order_sdf['order_objects'] = $order_objects;
//订单商品结构数组信息
$order_sdf['lastmodify'] = $aData['lastmodify']?$aData['lastmodify']:$aData['modified'];
//加入手动单拉订单_标记_防止自动审单
$user = kernel::single('ome_func')->getDesktopUser();
//操作员手工单拉的,不能自动审单
if($user['op_name'] != 'system'){
$order_sdf['auto_combine'] = false;
}
$order_sdf['step_paid_fee'] = $aData['step_paid_fee'];
$order_sdf['step_trade_status'] = $aData['step_trade_status'];
//扩展信息字段
$order_sdf['extend_field'] = $aData['extend_field'];
//平台状态
$order_sdf['source_status'] = $aData['source_status'];
//优惠明细
$order_sdf['coupon_field'] = $aData['coupon_field'];
base_rpc_service::$node_id = $order_sdf['node_id'];
$rs = kernel::single('erpapi_router_response')->set_node_id($order_sdf['node_id'])->set_api_name('ome.order.add')->dispatch($order_sdf);
$rs['rsp'] == 'success';
$logTitle = $rs['logTitle'];
$logInfo = $rs['logInfo'];
$msg = '';
return true;
}
//队列执行的方法 获取多条订单详情
function get_order_list_detial($params)
{
$apilog = app::get('ome')->model('api_order_log');
$oApilog = app::get('ome')->model('api_log');
$last_modified = time();
$return_data = kernel::single('erpapi_router_request')->set('shop',$params['shop_id'])->order_get_order_detial($params['order_bn']);
if($return_data['rsp'] == 'success'||$return_data['rsp'] == 'succ')
{
$sdf_order = $return_data['data']['trade'];
$result = $this->get_order_log($sdf_order,$params['shop_id'],$msg);
$filter = array('log_id'=>$params['log_id']);
if($result){
$apilog->update(array('msg'=>$msg,'msg_id'=>$return_data['msg_id'],'last_modified'=>$last_modified,'status'=>'success'),$filter);
}else{
$apilog->update(array('msg'=>$msg,'msg_id'=>$return_data['msg_id'],'last_modified'=>$last_modified,'status'=>'fail'),$filter);
}
}
else
{
$log_id = $oApilog->gen_id();
$api_params['msg_id'] = $return_data['msg_id'];
$api_params['log_id'] = $log_id;
$api_params['tid'] = $params['tid'];
$api_params['shop_id'] = $params['shop_id'];
$method = "store.trade.fullinfo.get";
$class = "ome_syncorder";
$apilog_params = array($method, $api_params, $method);
$oApilog->write_log($log_id,$params['order_bn']."同步订单详情",$class,"do_reply",$apilog_params,'','request','fail',$return_data['msg'],'','api.store.trade',$params['order_bn']);
$filter = array('log_id'=>$log_id);
$oApilog->update(array('msg_id'=>$return_data['msg_id']),$filter);
$log_filter = array('log_id'=>$params['log_id']);
$apilog->update(array('msg_id'=>$return_data['msg_id'],'last_modified'=>$last_modified,'status'=>'fail'),$log_filter);
}
}
//同步失败后发起重试
function do_reply($method,$params,$callback)
{
$oApi_log = app::get('ome')->model('api_log');
$return_data = kernel::single('erpapi_router_request')->set('shop',$params['shop_id'])->order_get_order_detial($params['tid']);
if($return_data['rsp'] == 'success')
{
$sdf_order = $return_data['data'];
if($this->get_order_log($sdf_order,$params['shop_id']))
{
$oApi_log->delete(array('log_id'=>$params['log_id']));
}
}else{
$oApi_log->update_log($params['log_id'],$return_data['msg'],'fail','');
}
}
/**
* 店铺绑定关系过滤
* 检查店铺shop_id为空时标识所有店铺是否可访问远端API接口服务并返回可用的node_id
* @access private
* @param string $shop_id 店铺标识ID
* @param string $method RPC远程调用接口名称
* @return boolean
*/
private function _check_node($shop_id,$method){
$node = $this->_get_node($shop_id);
if($node){
$request_whitelist = kernel::single('ome_rpc_request_whitelist');
$t_node = $node;
foreach($t_node as $k=>$v){
$res = $request_whitelist->check_node($v['node_type'],$method);
if(!$res){
unset($node[$k]);
}
}
if($node){
return $node;
}else{
return false;
}
}else{
return false;
}
}
/**
* 通过shop_id获取结点信息
* @access private
* @param $shop_id
* @return array 店铺绑定的节点数据
*/
private function _get_node($shop_id){
$shopObj = app::get('ome')->model('shop');
$node = array();
if(empty($shop_id)){
$shop_info = $shopObj->getList('node_id,node_type', '', 0, -1);
if($shop_info){
foreach($shop_info as $v){
if ($v['node_id']){
$node[] = array(
'node_id' => $v['node_id'],
'node_type' => $v['node_type'],
);
}
}
}
}else{
$shop_info = $shopObj->dump($shop_id,'node_id,node_type');
if ($shop_info['node_id']){
$node[] = array(
'node_id' => $shop_info['node_id'],
'node_type' => $shop_info['node_type']
);
}
}
return $node;
}
function get_order_log($sdf_order,$shop_id,&$msg){
$log = app::get('ome')->model('api_log');
$result = $this->add($sdf_order,$shop_id,$msg,$logTitle,$logInfo);
$class = 'ome_rpc_response_order';
$method = 'add';
$rsp = 'fail';
if($result){
$rsp = 'success';
}
return $result;
}
}