Files
OMS/app/finance/lib/rpc/response/func/billtaobao.php
2026-01-04 19:08:31 +08:00

183 lines
8.6 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.
*/
class finance_rpc_response_func_billtaobao{
/**
* 接口交易数据分析
* @access public
* @param Array $record 单条交易数据
* $record = array(
* 'alipay_order_no' => '凭据号',
* 'merchant_order_no' => '商户订单号',
* 'order_type' => '订单类型',
* 'order_from' => '订单来源',
* 'order_status' => 订单状态',
* 'order_title' => '订单标题描述',
* 'total_amount' => '金额(正)',
* 'balance' => '余额',
* 'in_out_type' => 'in:收入 out:支出',
* 'modified_time' => '交易最后修改时间,2012-12-21 12:21:21',
* 'opposite_user_id' => '交易对方帐号',
* );
* @param Array $shop_detail 店铺信息
* @return Array
*/
function trade_add($record,$shop_detail=array()){
$rs = array('rsp'=>'fail','msg'=>'','data'=>'');
if (empty($record)){
$rs['rsp'] = 'succ';
$rs['msg'] = '交易数据不能为空';
return $rs;
}
$trade_status = strtoupper(trim($record['order_status']));
$order_type = strtoupper(trim($record['order_type']));
$alipay_trade_bn = trim($record['alipay_order_no']);
$order_bn = trim($record['merchant_order_no']);
$io_type = strtolower(trim($record['in_out_type']));
$money = abs($record['total_amount']);
$order_title = $record['order_title'];
$trade_account = $record['opposite_user_id'];
$node_id = $shop_detail['node_id'];
$trade_time = $record['modified_time'];
$balance = $record['balance'];
$order_type_arr = array('TRADE','CAE','CAR_R','CHARGE','_OTHERS');
$trade_status_arr = array('ACC_FINISHED','TRADE_FINISHED','CHARGE_FINISHED','_OTHERS');
if (!in_array($order_type,$order_type_arr) || !in_array($trade_status,$trade_status_arr)){
$rs['rsp'] = 'succ';
$rs['msg'] = '不处理交易状态:'.$trade_status.'交易数据';
return $rs;
}else{
#组织账单数据
$billObj = kernel::single('finance_bill');
$matching_flag = false;
$bill_sdf = array(
'money' => $io_type == 'out' ? -$money : $money,
'fee_obj' => '淘宝',
'trade_time' => $record['modified_time'],
'member' => $record['opposite_user_id'],
'channel_id' => $shop_detail['shop_id'],
'channel_name' => $shop_detail['shop_name'],
'credential_number' => $alipay_trade_bn,
'charge_status' => '1',//记账状态
'memo' => $order_title,
'unique_id' => md5($alipay_trade_bn.$trade_time.'-'.$money.'-'.$balance)
);
$confirm_bill_sdf = $bill_sdf;
if ($order_type == 'TRADE' && $trade_status == 'TRADE_FINISHED'){
#------------销售-->销售收款
$bill_sdf['order_bn'] = str_replace('T200P','',$order_bn);
$bill_sdf['fee_item'] = $io_type == 'in' ? '销售收款' : '销售退款';
$matching_flag = true;
}elseif (in_array($order_type,array('CAE','CAR_R')) && $trade_status == 'ACC_FINISHED' && substr($order_bn,0,5) == 'HJCOM'){
#平台费用-->佣金
$tmp_order_bn = explode('=',$order_bn);
if (empty($tmp_order_bn[3])){
preg_match('/\{(\d+)\}/',$order_title,$tmp_order_title);
$oid = $tmp_order_title[1];
}else{
$oid = $tmp_order_bn[3];
}
#单号可能为淘宝子订单号,需要转换订单号
$merchant_order_bn = '';
if ($instance = kernel::service('service.order')){
if (method_exists($instance,'getOrderBnByoid')){
$merchant_order_bn = $instance->getOrderBnByoid($oid,$node_id);
}
}
if ($merchant_order_bn){
$bill_sdf['order_bn'] = $merchant_order_bn;
$matching_flag = true;
}
$bill_sdf['fee_item'] = '佣金';
}elseif ($order_type == 'CAE' && $trade_status == 'ACC_FINISHED' && (substr($order_bn,0,9) == 'CAE_POINT' || strstr($order_title,'代扣返点积分'))){
#-----------平台费用-->积分
preg_match('/\d+/',$order_title,$tmp_order_title);
$bill_sdf['order_bn'] = $tmp_order_title[0];
$bill_sdf['fee_item'] = '积分';
$matching_flag = true;
}elseif ($order_type == 'CAE' && $trade_status == 'ACC_FINISHED' && strstr($order_title,'淘宝客佣金代扣')){
#-----------其他费用-->营销
preg_match('/\d+/',$order_title,$tmp_order_title);
$merchant_order_bn = $tmp_order_title[0];
#单号可能为淘宝子订单号,需要转换订单号
if($merchant_order_bn = kernel::single('finance_func')->getOrderBnByoid($merchant_order_bn,$node_id)){
$bill_sdf['order_bn'] = $merchant_order_bn;
$matching_flag = true;
}
$bill_sdf['fee_item'] = '营销';
}elseif ($order_type == 'CHARGE' && $trade_status == 'CHARGE_FINISHED'){
#-----------其他费用-->信用卡手续费:对于无法获取到订单号的,则归入到无归属账单
if ($bill_order_bn = $billObj->getOrderBnByNo($order_bn)){
$bill_sdf['order_bn'] = $bill_order_bn;
$matching_flag = true;
}
$bill_sdf['fee_item'] = '信用卡手续费';
$bill_sdf['fee_obj'] = '支付宝';
}elseif (in_array($order_type,array('CAE','CAR_R')) && $trade_status == 'ACC_FINISHED' && substr($order_bn,0,14) == 'BTC_BIZORDERID'){
#-----------其他费用-->运费险
$tmp_title = explode('INSD',$order_title);
$bill_sdf['order_bn'] = $tmp_title[1];
$bill_sdf['fee_item'] = '运费险';
$matching_flag = true;
}
#匹配上的单据,需判断订单号是否存在
if($matching_flag == true){
$funcObj = kernel::single('finance_func');
if(!$funcObj->order_is_exists($bill_sdf['order_bn'],$node_id)){
$matching_flag = false;
}
}
#存储帐单
if ($matching_flag == true && isset($bill_sdf['fee_item']) && $billObj->is_exist_item_by_table($bill_sdf['fee_item'])){
#正式账单
$save_rs = $billObj->do_save($bill_sdf);
$save_rs['status'] = $save_rs['status'] == 'fail' && $save_rs['msg_code'] == 'exists' ? 'success' : $save_rs['status'];
}else{
#无归属账单
$sdf_temp = array(
'order_bn' => $order_bn,
'fee_item' => $bill_sdf['fee_item'],
'fee_obj' => $bill_sdf['fee_obj'],
'fee_obj_code' => $record['order_from'],
'order_type' => $record['order_type'],
'order_status' => $record['order_status'],
'order_title' => $order_title,
'money' => $money,
'balance' => $balance,
'in_out_type' => $io_type,
'trade_no' => $alipay_trade_bn,
'trade_account' => $trade_account,
'memo' => '',
'unique' => $confirm_bill_sdf['unique_id']
);
$confirm_bill_sdf = array_merge($confirm_bill_sdf,$sdf_temp);
$save_rs = $billObj->add_confirm_bill($confirm_bill_sdf);
}
$rs['rsp'] = $save_rs['status'] == 'success' ? 'succ' : 'fail';
$rs['msg'] = $save_rs['msg'];
}
return $rs;
}
}