1. 【新增】售后单售后原因类型支持搜索

2. 【新增】手工创建订单折扣可输入正数

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

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

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

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

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

8. 【修复】基础物料分类管理问题
This commit is contained in:
chenping
2026-04-01 11:59:17 +08:00
parent 9341122827
commit 61783b7d01
754 changed files with 46179 additions and 5700 deletions

View File

@@ -0,0 +1,360 @@
<?php
/**
* @desc
* @author:
* @since:
*/
class erpapi_shop_matrix_b2b_request_aftersale extends erpapi_shop_request_aftersale
{
public $status = array(
'succ' => 'SUCC',
'failed' => 'FAILED',
'cancel' => 'CANCEL',
'lost' => 'LOST',
'progress' => 'PROGRESS',
'timeout' => 'TIMEOUT',
'ready' => 'READY',
);
/**
* 对应第三方B2B接口文档, b2b.reship.create 退货入库完成 接口
* @param $reship 退货单请求参数
* @return string[]|void
* 因对接方不关心退货入库状态,不再实现该接口
* @used-by ome_service_reship::reship()
*/
public function addReship($reship)
{
}
/**
* 对应第三方B2B接口文档, b2b.aftersale.update 更新售后申请的状态 接口
* @param $reship 退货单请求参数
* @return string[]|void
*/
public function updateAfterSaleStatus($aftersale, $status = '', $mod = 'async')
{
// 如果缺失status,则直接返回(说明由ome_service_aftersale::update_status调用)
if (!$status) {
return true;
}
// 如果来源是本地,且状态是接受申请,则转发至售后单添加
if ($aftersale['source'] == 'local' && $status == '3') {
return $this->addAfterSale($aftersale, 'audit');
}
$rs = parent::updateAfterSaleStatus($aftersale, $status, $mod);
return $rs;
}
protected function __formatAfterSaleParams($aftersale, $status)
{
if (in_array($status,array('13','15','16'))){
return $this->_formatChangeParams($aftersale,$status);
}
$params = array(
'return_bn' => $aftersale['return_bn'],
'order_bn' => $aftersale['order']['order_bn'], //todo 接口文档能否调整为tid,与refund接口一致, 父类也直接赋值tid
'status' => $status
);
if ($params['status'] == '5') {
$params['addon'] = isset($aftersale['content']) ? $aftersale['content'] : '中台拒绝';
}
return $params;
}
/**
* 获取售后请求api
* @param $status
* @param null $returnInfo
* @return string
*/
protected function __afterSaleApi($status, $returnInfo = null)
{
switch ($status) {
case '3': // 同意申请
$api_method = SHOP_UPDATE_RESHIP_STATUS_RPC;
break;
case '5': // 拒绝申请
$api_method = SHOP_UPDATE_RESHIP_STATUS_RPC;
break;
case '10': // 入库失败
$api_method = SHOP_UPDATE_RESHIP_STATUS_RPC;
break;
case '13':
case '15':
case '16':
$api_method= SHOP_EXCHANGE_NOTIFY;
break;
default :
$api_method = SHOP_UPDATE_RESHIP_STATUS_RPC;
break;
}
return $api_method;
}
/**
* 对应第三方B2B接口文档, b2b.aftersale.create 售后申请 接口
* @param $returninfo退货单请求参数
* @param $source 来源, create 新建or编辑,audit 审核
* @return string[]|void
* @used-by ome_service_aftersale::add_aftersale
*/
public function addAfterSale($returninfo, $source = 'create')
{
// 仅审核时触发,才发起推送
if ($source != 'audit') {
return true;
}
// 订单号处理,兼容套娃换货退款情况
$orderBn = $this->_getOriginalOrderBn($returninfo['order'], $returninfo);
$params = [
'aftersale_id' => $returninfo['return_bn'], // 售后申请单ID
'tid' => $orderBn, // 交易ID
'refund_money' => $returninfo['money'], // 申请退款总金额,手动单仅money字段存在金额
'title' => $returninfo['title'], // 售后申请标题
'content' => $returninfo['content'], // 申请售后内容
'messager' => $returninfo['title'], // 申请售后留言
'created' => date("Y-m-d H:i:s", $returninfo['add_time']), // 申请时间 格式:YYYY - MM - dd HH:mm:ss
'memo' => $returninfo['memo'], // 售后备注
'status' => '3', // 状态 可选值:1(申请中),2(审核中),3(接受申请) 仅接受申请会进入该函数
'attachment' => $returninfo['attachment'], // 附件通常为url
];
// 售后明细
// todo amount 字段为0
$returnItemModel = app::get('ome')->model('return_product_items');
$returnItems = $returnItemModel->getList('name as sku_name,bn as sku_bn,num as number,price,amount,order_item_id', array('return_id' => $returninfo['return_id']));
if ($returnItems && !empty($returnItems)) {
$orderitemList = app::get('ome')->model('order_items')->getList('item_id,obj_id,order_id', ['item_id' => array_column($returnItems, 'order_item_id')]);
$orderitemList = array_column($orderitemList, null, 'item_id');
$orderObjList = app::get('ome')->model('order_objects')->getList('obj_id,oid', ['obj_id' => array_column($orderitemList, 'obj_id')]);
$orderObjList = array_column($orderObjList, null, 'obj_id');
foreach ($returnItems as $k => $val) {
$itemInfo = $orderitemList[$val['order_item_id']] ?? [];
$returnItems[$k]['oid'] = $orderObjList[$itemInfo['obj_id']]['oid'] ?? 0;
}
$params['aftersale_items'] = json_encode($returnItems);
}
$title = '店铺(' . $this->__channelObj->channel['name'] . ')售后申请(订单号:' . $params['tid'] . ',申请单号:' . $returninfo['return_bn'] . ')';
$rs = $this->__caller->call(SHOP_ADD_AFTERSALE_RPC, $params, [], $title, 10, $params['tid']);
// 调试mock
/*if (is_array($rs) && $rs['rsp'] == 'fail') {
$rs['rsp'] = 'succ';
$rs['data'] = [
'aftersaleNo' => "TPA-". date("YmdHis") . rand(1000, 9000)
];
}*/
// 直连情况下,执行callback函数 callback保存返回单号至special表
$callbackParams = array(
'order_id' => $returninfo['order_id'],
'return_id' => $returninfo['return_id'],
'return_bn' => $returninfo['return_bn']
);
$this->addAfterSaleCallback($rs, $callbackParams);
return $rs;
}
/**
* 卖家确认收货
* 对应第三方B2B接口文档, b2b.aftersale.update 更新售后申请的状态 接口
* 对应D1M文档, oms/aftersaleUpdate 推送售后单审核结果 接口
* @param $aftersale 售后申请请求参数
* @return string[]|void
*/
public function returnGoodsConfirm($sdf)
{
$title = '售后确认收货[' . $sdf['return_bn'] . ']';
$returnModel = app::get('ome')->model('return_product');
$returninfo = $returnModel->db_dump(array('return_id' => $sdf['return_id']), 'order_id,return_bn');
$sdf['return_bn'] = $returninfo['return_bn'];
$orderInfo = app::get('ome')->model('orders')->db_dump(array('order_id' => $returninfo['order_id']), 'order_bn');
$data = array(
'order_bn' => $orderInfo['order_bn'], //订单号
'reship_bn' => $sdf['return_bn'], //订单号
'status' => '4', // 状态,可选值:1(申请中),2(审核中),3(接受申请),4(完成),5(拒绝)
'addon' =>'',
);
$method = 'b2b.reship.create';
$data['status'] = 'SUCC';
$items = array();
list($res,$newItems) = $this->getReshipItems($sdf);
if($res){
$items = $newItems;
}
$items = json_encode($items);
$data['items'] = $items;
$rs = $this->__caller->call($method, $data, array(), $title, 10, $sdf['return_bn']);
return $rs;
}
/**
* 售后单添加回调
* @param $response
* @param $callback_params
* @return array
*/
public function addAfterSaleCallback($response, $callback_params)
{
// 保存westore返回的售后单号
$status = $response['rsp'];
/*if ($status == 'succ' && isset($response['data']['aftersaleNo'])) {
$model = app::get('ome')->model('return_apply_special');
$data = array(
'return_id' => $callback_params['return_id'],
'return_bn' => $callback_params['return_bn'],
'special' => json_encode([
'aftersale_no' => $response['data']['aftersaleNo'],
], JSON_UNESCAPED_UNICODE)
);
$model->db_save($data);
}*/
return $this->callback($response, $callback_params);
}
/**
* 获取原始订单号
* @param $order
*/
protected function _getOriginalOrderBn($order, $returninfo)
{
// 原样返回
if(!isset($order['createway']) || $order['createway'] =='matrix' || !isset($order['relate_order_bn']) || !$order['relate_order_bn']){
return $order['order_bn'];
}
$filter = array(
'order_bn' => $order['relate_order_bn'],
);
if($returninfo['archive']){
$archive_ordObj = kernel::single('archive_interface_orders');
$originalOrder = $archive_ordObj->getOrders($filter, 'order_bn,createway,relate_order_bn');
}else{
$orderMdl = app::get('ome')->model('orders');
$originalOrder = $orderMdl->dump($filter, 'order_bn,createway,relate_order_bn');
}
// 没有原始订单则返回
if(!$originalOrder){
return $order['order_bn'];
}elseif($originalOrder['createway'] == 'matrix'){
return $originalOrder['order_bn'];
}
// 仍非平台订单,则再次调用查询
elseif($originalOrder['relate_order_bn']){
return $this->_getOriginalOrderBn($originalOrder);
}
// 兜底返回原样
else{
return $order['order_bn'];
}
}
/**
* 换货参数格式化
* @param $returninfo
* @param $status
* @return array
*/
protected function _formatChangeParams($returninfo,$status){
$params = array(
'return_bn' => $returninfo['return_bn'],
'order_bn' => $returninfo['order']['order_bn'],
'status' => $status
);
if ($params['status'] == '13') {
$params['addon'] = '换货商品已发出';
} elseif ($params['status'] == '15') {
$params['addon'] = '换货商品已收到';
} elseif ($params['status'] == '16') {
$params['addon'] = '换货完成';
}
return $params;
}
/**
* 换货商品发货
* 对应第三方B2B接口文档, b2b.exchange.consigngoods 换货商品发货 接口
* @param $data
* @return array
*/
public function consignGoods($data){
$title = '换货商品发货[' . $data['return_bn'] . ']';
$returnModel = app::get('ome')->model('return_product');
$returninfo = $returnModel->db_dump(array('return_id' => $data['return_id']), 'order_id,return_bn');
$data['return_bn'] = $returninfo['return_bn'];
$orderInfo = app::get('ome')->model('orders')->db_dump(array('order_id' => $returninfo['order_id']), 'order_bn');
$params = array(
'return_bn' => $data['return_bn'], //退货单号
'order_bn' => $orderInfo['order_bn'], //订单号
'logi_no' => $data['logi_no'], //物流单号
'logi_code' => $data['logi_code'], //物流公司代码
'logi_name' => $data['logi_name'], //物流公司名称
'status' => '13', //状态
'addon' => '换货商品已发出', //备注
);
$rs = $this->__caller->call(SHOP_EXCHANGE_CONSIGNGOODS, $params, array(), $title, 10, $data['return_bn']);
return $rs;
}
/**
* 获取退货商品明细
* @param $sdf
* @return array
*/
public function getReshipItems($sdf)
{
$returnItemModel = app::get('ome')->model('return_product_items');
$returnItems = $returnItemModel->getList('name as sku_name,bn as sku_bn,num as number,price,amount,order_item_id', array('return_id' => $sdf['return_id']));
if ($returnItems && !empty($returnItems)) {
$orderitemList = app::get('ome')->model('order_items')->getList('item_id,obj_id,order_id', ['item_id' => array_column($returnItems, 'order_item_id')]);
$orderitemList = array_column($orderitemList, null, 'item_id');
$orderObjList = app::get('ome')->model('order_objects')->getList('obj_id,oid', ['obj_id' => array_column($orderitemList, 'obj_id')]);
$orderObjList = array_column($orderObjList, null, 'obj_id');
foreach ($returnItems as $k => $val) {
$itemInfo = $orderitemList[$val['order_item_id']] ?? [];
$returnItems[$k]['oid'] = $orderObjList[$itemInfo['obj_id']]['oid'] ?? 0;
}
return array(true, $returnItems);
}
return array(false, array());
}
}

View File

@@ -0,0 +1,141 @@
<?php
/**
* 发货单处理
*
* @category
* @package
* @author chenping<chenping@shopex.cn>
* @version $Id: Z
*/
class erpapi_shop_matrix_b2b_request_delivery extends erpapi_shop_request_delivery
{
protected function get_delivery_apiname($sdf)
{
return SHOP_LOGISTICS_OFFLINE_SEND;
}
/**
* 发货请求参数
*
* @return void
* @author
**/
protected function get_confirm_params($sdf)
{
$itemList = array();
foreach ($sdf['order_objects'] as $obj) {
// 拆单要过滤掉赠品
if ($obj['shop_goods_id'] == '-1') {
continue;
}
$tmp = array(
'product_bn' => $obj['bn'],
'product_name' => $obj['name'],
'number' => $obj['quantity'],
'oid' => $obj['oid'],
'sku_uuid' => $obj['sku_uuid'],
);
$itemList[] = $tmp;
}
$param = array(
't_confirm' => $sdf['delivery_time'],
'order_bn' => $sdf['orderinfo']['order_bn'],
'date' => time(),
'logi_no' => $sdf['logi_no'],
'logi_code' => $sdf['logi_type'],
'logi_name' => $sdf['logi_name'],
);
$param['items'] = json_encode($itemList);
return $param;
}
/**
* 数据处理
*
* @return void
* @author
**/
protected function format_confirm_sdf(&$sdf)
{
parent::format_confirm_sdf($sdf);
}
/**
* 对应第三方B2B接口文档, b2b.delivery.update 更新物流信息 接口
* 对应D1M文档, order/status/update 推送订单状态 接口
* @param array $sdf
* @param false $queue
* @return array|void
*/
public function confirm($sdf, $queue = false)
{
// 只处理已发货与部分发货状态
if ($sdf['status'] != 'succ' && !in_array($sdf['orderinfo']['ship_status'], array('1', '2'))) return $this->succ('发货单未发货');
$this->format_confirm_sdf($sdf);
// 发货记录
$opInfo = kernel::single('ome_func')->getDesktopUser();
$log_id = uniqid($_SERVER['HOSTNAME']);
$log = array(
'shopId' => $this->__channelObj->channel['shop_id'],
'ownerId' => $opInfo['op_id'],
'orderBn' => $sdf['orderinfo']['order_bn'],
'deliveryCode' => $sdf['logi_no'],
'deliveryCropCode' => $sdf['logi_type'],
'deliveryCropName' => $sdf['logi_name'],
'receiveTime' => time(),
'status' => 'send',
'updateTime' => '0',
'message' => '',
'log_id' => $log_id,
);
$shipmentLogModel = app::get('ome')->model('shipment_log');
$shipmentLogModel->insert($log);
// 更新订单状态
$orderModel = app::get('ome')->model('orders');
$orderModel->update(array('sync' => 'run'), array('order_id' => $sdf['orderinfo']['order_id']));
// 整理参数格式
$title = sprintf('发货状态回写[%s]-%s', $sdf['delivery_bn'], $this->__channelObj->channel['node_type']);
$params = $this->get_confirm_params($sdf);
// 直连请求暂不支持异步回调
$callback = array();
$callbackParams = array(
'shipment_log_id' => $log_id,
'order_id' => $sdf['orderinfo']['order_id'],
'logi_no' => $sdf['logi_no'],
'obj_bn' => $sdf['orderinfo']['order_bn'],
'company_code' => $sdf['logi_type'],
);
$result = $this->__caller->call($this->get_delivery_apiname($sdf), $params, $callback, $title, 10, $sdf['orderinfo']['order_bn']);
// 直连情况下,执行callback函数
$this->confirm_callback($result, $callbackParams);
return $result;
}
/**
* 发货回调
*
* @return void
* @author
**/
public function confirm_callback($response, $callback_params)
{
$rs = parent::confirm_callback($response, $callback_params);
return $rs;
}
}

View File

@@ -0,0 +1,266 @@
<?php
/**
* Created by PhpStorm.
* User: yaokangming
* Date: 2018/12/07
* Time: 15:02
*/
class erpapi_shop_matrix_b2b_request_finance extends erpapi_shop_request_finance
{
/**
* 对应第三方B2B接口文档, b2b.refund.create 同意退款单 接口
* @param $refund
* @return string[]|void
*/
public function addRefund($refund)
{
$rs = array('rsp' => 'fail', 'msg' => '', 'data' => '');
if (!$refund) {
$rs['msg'] = 'no refund';
return $rs;
}
// 没有金额则不回传
// if (!isset($refund['money']) || bccomp($refund['money'], 0, 3) === 0) {
// $rs['msg'] = '退款信息缺失金额,不回传';
// return $rs;
// }
$params = array();
$params = $this->_getAddRefundParams($refund);
// 直连请求暂不支持异步回调
$callback = array();
$callbackParams = array(
'shop_id' => $refund['shop_id'],
'tid' => $params['order_bn'],
'refund_apply_id' => $refund['refund_apply_id']
);
$title = '店铺(' . $this->__channelObj->channel['name'] . ')添加[交易退款单(金额:' . $refund['money'] . ')](订单号:' . $params['order_bn'] . '退款单号:' . $refund['refund_bn'] . ')';
$result = $this->__caller->call(SHOP_ADD_REFUND_RPC, $params, $callback, $title, 10, $params['order_bn']);
// 直连情况下,执行callback函数
$result = $this->addRefundCallback($result, $callbackParams);
return $result;
}
/**
* 退款单添加参数组装
* @param $refund
* @return array
*/
public function _getAddRefundParams($refund)
{
// 订单信息
$orderModel = app::get('ome')->model('orders');
$order = $orderModel->dump($refund['order_id'], 'order_id,order_bn,member_id,shop_id,createway,relate_order_bn');
// 订单号处理,兼容套娃换货退款情况
$orderBn = $this->_getOriginalOrderBn($order, $refund);
// 会员
$memberModel = app::get('ome')->model('members');
$member = $memberModel->dump(array('member_id' => $order['member_id']), 'uname,name,member_id');
$params = array();
$params['account'] = $refund['account'] ? $refund['account'] : '';
$params['bank'] = $refund['bank'] ? $refund['bank'] : '';
$params['buyer_id'] = $member['account']['uname'];#买家会员帐号
$params['cur_money'] = $refund['cur_money'] ? $refund['cur_money'] : $refund['money'];
$params['currency'] = $refund['currency'] ? $refund['currency'] : 'CNY';
$params['money'] = $refund['money'];
$params['order_bn'] = $orderBn;
$params['pay_account'] = $refund['pay_account'] ? $refund['pay_account'] : '';
$params['pay_name'] = $refund['payment'] ?? '';
$params['pay_type'] = $refund['pay_type'] ? $refund['pay_type'] : '';
$params['refund_bn'] = $refund['refund_bn'];
// $params['status'] = $refund['status'] ? strtoupper($refund['status']) : '';
$params['t_begin'] = isset($refund['t_ready']) ? date("Y-m-d H:i:s", $refund['t_ready']) : date("Y-m-d H:i:s");
$params['t_payed'] = isset($refund['t_payed']) ? date("Y-m-d H:i:s", $refund['t_payed']) : '';
$params['t_confirm'] = date("Y-m-d H:i:s");
//获取售后申请单号
if($refund['return_id']){
$return = app::get('ome')->model('return_product')->dump(array('return_id'=>$refund['return_id']),'return_bn');
}
$params['memo'] = $return['return_bn']?$return['return_bn']:'';
$params['trade_no'] = $refund['trade_no'] ? $refund['trade_no'] : '';
$items = $this->__getRefundItems($refund);
$params['items'] = json_encode($items);
return $params;
}
/**
* 获取原始订单号
* @param $order
*/
protected function _getOriginalOrderBn($order, $refund)
{
// 原样返回
if(!isset($order['createway']) || $order['createway'] =='matrix' || !isset($order['relate_order_bn']) || !$order['relate_order_bn']){
return $order['order_bn'];
}
$filter = array(
'order_bn' => $order['relate_order_bn'],
);
if($refund['archive']){
$archive_ordObj = kernel::single('archive_interface_orders');
$originalOrder = $archive_ordObj->getOrders($filter, 'order_bn,createway,relate_order_bn');
}else{
$orderMdl = app::get('ome')->model('orders');
$originalOrder = $orderMdl->dump($filter, 'order_bn,createway,relate_order_bn');
}
// 没有原始订单则返回
if(!$originalOrder){
return $order['order_bn'];
}elseif($originalOrder['createway'] == 'matrix'){
return $originalOrder['order_bn'];
}
// 仍非平台订单,则再次调用查询
elseif($originalOrder['relate_order_bn']){
return $this->_getOriginalOrderBn($originalOrder);
}
// 兜底返回原样
else{
return $order['order_bn'];
}
}
/**
* 退款单明细,参数组装
* todo 售后退款单缺失明细,
* @param $refund
* @return mixed
*/
private function __getRefundItems($refund)
{
if(!$refund['product_data']){
return $this->__getAllRefundItems($refund);
}
$itemList = unserialize($refund['product_data']);
if (!is_array($itemList) || empty($itemList)) {
return $this->__getAllRefundItems($refund);
}
$objects = [];
foreach ($itemList as $item) {
// 兼容oid不存在
if (!$item['oid'] && $item['obj_id']) {
$objMdl = app::get('ome')->model('order_objects');
$obj = $objMdl->dump($item['obj_id'], 'oid');
if ($obj) {
$item['oid'] = $obj['oid'];
}
}
$tmp = [
'oid' => $item['oid'],
'sku_bn' => $item['bn'],
'sku_name' => $item['name'],
'price' => $item['price'],
'number' => $item['num'],
'sku_uuid'=>$item['sku_uuid'],
];
$objects[] = $tmp;
}
return $objects;
}
private function __getAllRefundItems($refund)
{
$orderObjMdl = app::get('ome')->model('order_objects');
$filter = ['order_id' => $refund['order_id']];
$objects = $orderObjMdl->getList('oid,bn as sku_bn,name as sku_name,quantity as number,price', $filter);
return $objects;
}
/**
* 退款单添加回调
* @param $response
* @param $callback_params
* @return array
*/
public function addRefundCallback($response, $callback_params)
{
$status = $response['rsp'];
if ($status != 'succ') {
$shop_id = $callback_params['shop_id'];
$order_bn = $callback_params['tid'];
$refund_apply_id = $callback_params['refund_apply_id'];
$oOrder = app::get('ome')->model('orders');
$order_detail = $oOrder->dump(array('order_bn' => $order_bn, 'shop_id' => $shop_id), 'order_id,pay_status');
if (!$order_detail) {
$oOrder = app::get('archive')->model('orders');
$order_detail = $oOrder->dump(array('order_bn' => $order_bn, 'shop_id' => $shop_id), 'order_id,pay_status');
}
$order_id = $order_detail['order_id'];
//状态回滚,变成已支付/部分付款/部分退款
kernel::single('ome_order_func')->update_order_pay_status($order_id, true, __CLASS__.'::'.__FUNCTION__);
#bugfix:解决如果退款单请求先到并生成单据于此同时由于网络超时造成退款申请失败,从而造成退款申请单状态错误问题。
$refund_applyObj = app::get('ome')->model('refund_apply');
$refundapply_detail = $refund_applyObj->getList('refund_apply_bn', array('apply_id' => $refund_apply_id));
$refundsObj = app::get('ome')->model('refunds');
$refunds_detail = $refundsObj->getList('refund_id', array('refund_bn' => $refundapply_detail[0]['refund_apply_bn'], 'status' => 'succ'));
if (!$refunds_detail) {
$refund_applyObj->update(array('status' => '6'), array('status|notin' => array('4'), 'apply_id' => $refund_apply_id));
//操作日志
$oOperation_log = app::get('ome')->model('operation_log');
$oOperation_log->write_log('order_refund@ome', $order_id, '订单:' . $order_bn . '发起退款请求,前端拒绝退款,退款失败');
}
}
return $this->callback($response, $callback_params);
}
/**
* 更新退款单状态,对应第三方B2B接口文档, b2b.refund.refuse 退款拒绝 接口
* @param $refund
* @param $status
* @param string $mod
* @return array|false
*/
public function updateRefundApplyStatus($refund, $status, $mod = 'sync')
{
$rs = parent::updateRefundApplyStatus($refund, $status, $mod);
return $rs;
}
/**
* 退款申请单状态同步接口名
* @param string $status 2:已接受申请、3:已拒绝
* @return [type] [description]
*/
protected function _updateRefundApplyStatusApi($status, $refundInfo = null)
{
$api_method = '';
switch ($status) {
case '3':
$api_method = SHOP_REFUSE_REFUND;#拒绝退款接口
break;
}
return $api_method;
}
/**
* 退款申请单状态同步参数
* @param $refund
* @param $status
* @return array
*/
public function _updateRefundApplyStatusParam($refund, $status)
{
$params = array();
$params['order_bn'] = $refund['order_bn'];
$params['refund_bn'] = $refund['refund_bn'];
$params['status'] = $status;
return $params;
}
}

View File

@@ -0,0 +1,95 @@
<?php
/**
* @author
* @describe 发票 相关请求接口类
*/
class erpapi_shop_matrix_b2b_request_invoice extends erpapi_shop_request_invoice
{
/**
* 发票上传组织数据
*
* @return void
* @author
*/
protected function getUploadParams($sdf)
{
$invoice = $sdf['invoice'];
$electronic = $sdf['electronic'];
$params = array(
'order_bn' => $invoice['order_bn'], # 订单编号 必须
'invoice_type' => $electronic['billing_type'], # 发票类型 1-蓝票 2-红票 必须
'payee_register_no' => $invoice['tax_no'], # 销货方识别号(税号) 必须
'payee_name' => $invoice['payee_name'], # 销货方公司名称 必须
'payee_address' => $invoice['address'], # 销货方公司地址
'payee_phone' => $invoice['telephone'], # 销货方电话
'payee_bankname' => $invoice['bank'], # 销货方公司开户行
'payee_bankaccount' => $invoice['bank_no'], # 销货方公司银行账户
'payee_operator' => $invoice['payee_operator'], # 开票人
'payee_receiver' => $invoice['payee_receiver'], # 收款人
'taxfree_amount' => round($invoice['amount'], 2), # 开票金额 两位小数w
'invoice_title' => $invoice['title'], # 发票抬头 必须
'invoice_time' => date('Y-m-d', $electronic['create_time']), # 开票时间 yyyy-MM-dd 必须
'ivc_content_type' => '', # 开票内容编号
'ivc_content_name' => $invoice['content'], # 开票内容名称
'invoice_code' => $electronic['invoice_code'], # 发票代码 必须
'invoice_no' => $electronic['invoice_no'], # 发票号码 必须
'invoice_memo' => $invoice['remarks'], # 发票备注
'blue_invoice_code' => (string)$electronic['normal_invoice_code'], # 原蓝票发票代码 开红票的时候必须传
'blue_invoice_no' => (string)$electronic['normal_invoice_no'], # 原蓝票发票号码 开红票的时候必须传
'pdf_info' => $electronic['url'], # 发票PDF文件二进制流base64 必须
'logi_name' => $electronic['logi_name'],
'logi_no' => $electronic['logi_no'],
);
if ($sdf['items']) {
$items = array();
foreach ($sdf['items'] as $value) {
$items[] = array(
'item_no' => '', # 货号
'item_name' => $value['spmc'], # SKU商品名称
'num' => $value['spsl'], # 数量
'price' => round($value['spdj'], 2), # 单价
'spec' => '', # 规格
'unit' => $value['dw'], # 单位
'tax_rate' => $value['sl'], # 税率 两位小数
'tax_categroy_code' => $value['spbm'], # 税收分类编码
'is_tax_discount' => $value['yhzcbs'], # 优惠政策标识 0-不使用 1-使用
'tax_discount_content' => $value['zzstsgl'], # 增值税特殊管理 当优惠政策标识为1时填写
'zero_tax' => $value['lslbs'], # 零税率标识 空-非零税率 0-出口退税 1-免税 2-不征收 3-普通零税率
'deductions' => '', # 扣除额 两位小数
'imei' => '', # 商品IMEI码
'discount' => 0, # 折扣
'freight' => 0, # 运费
);
}
$params['invoice_items'] = json_encode($items);
}
return $params;
}
/**
* 电子发票回传平台,对应第三方B2B接口文档, b2b.invoice.send 订单开票上传 接口
* 对应D1M文档, oms/pushInvoiceLinkV2 推送发票开具成功消息 接口
* @param $sdf
* @param false $sync
*/
public function upload($sdf, $sync = false)
{
$params = $this->getUploadParams($sdf);
// 直连请求暂不支持异步回调
$callback = array();
$rs = $this->__caller->call(EINVOICE_DETAIL_UPLOAD, $params, $callback, '电子发票回传', 10, $sdf['invoice']['order_bn']);
$this->uploadCallback($rs, array('electronic_item_id' => $sdf['electronic']['item_id']));
return $rs;
}
}

View File

@@ -0,0 +1,87 @@
<?php
/**
* @author
* @describe 处理店铺商品相关类
*/
class erpapi_shop_matrix_b2b_request_product extends erpapi_shop_request_product {
/**
* 回传库存,对应第三方B2B接口文档, b2b.update_store.updateStore 批量库存回写 接口
* @param array $stocks
* @param string $dorelease
* @return array
*/
public function updateStock($stocks, $dorelease = false)
{
$rs = array('rsp' => 'fail', 'msg' => '', 'data' => '');
if (!$stocks) {
$rs['msg'] = 'no stocks';
return $rs;
}
$shop_id = $this->__channelObj->channel['shop_id'];
$skuIds = array_keys($stocks);
sort($stocks);
$logData = ['list_quantity' => '', 'original' => json_encode($stocks, JSON_UNESCAPED_UNICODE)];
foreach ($stocks as $key => $value) {
if ($value['regulation']) {
unset($stocks[$key]['regulation']);
}
}
//格式化库存参数
$stocks = $this->format_stocks($stocks);
if (!$stocks) {
return $this->error('没有可回写的库存数据', '102');
}
//保存库存同步管理日志
$oApiLogToStock = kernel::single('ome_api_log_to_stock');
$oApiLogToStock->save($stocks, $shop_id);
$params = $this->_getUpdateStockParams($stocks);
$logData = array_merge($logData, $params);
//api_name
$stockApi = SHOP_UPDATE_ITEMS_QUANTITY_LIST_RPC;
// 直连请求暂不支持异步回调
$callback = array();
$callbackParams = array(
'shop_id' => $shop_id,
'request_params' => $params,
'api_name' => $stockApi
);
$title = '批量更新店铺(' . $this->__channelObj->channel['name'] . ')的库存(共' . count($stocks) . '个)';
$primaryBn = $this->__channelObj->channel['shop_bn'] . 'UpdateStock';
$return = $this->__caller->call($stockApi, $params, [], $title, 10, $primaryBn, true, '', $logData);
if ($return !== false) {
if ($dorelease === true) {
if ($skuIds && app::get('inventorydepth')->is_installed()) {
app::get('inventorydepth')->model('shop_adjustment')->update(array('release_status' => 'running'), array('id' => $skuIds));
}
}
app::get('ome')->model('shop')->update(array('last_store_sync_time' => time()), array('shop_id' => $shop_id));
if(isset($return['data']) && is_array($return['data']) && $return['data']){
$return['data'] = json_encode($return['data']);
}
// 直连情况下,执行callback函数
$this->updateStockCallback($return, $callbackParams);
}
$rs['rsp'] = 'success';
return $rs;
}
/*
* 整理参数
*/
protected function _getUpdateStockParams($stocks)
{
return parent::_getUpdateStockParams($stocks);
}
}