mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-30 21:15:34 +08:00
455 lines
14 KiB
PHP
455 lines
14 KiB
PHP
<?php
|
||
/**
|
||
* Copyright © ShopeX (http://www.shopex.cn). All rights reserved.
|
||
* See LICENSE file for license details.
|
||
*/
|
||
/**
|
||
* 售后退货业务
|
||
*
|
||
* @version 2024.04.11
|
||
*/
|
||
class erpapi_dealer_response_process_aftersalev2
|
||
{
|
||
|
||
static public $refund_status = array(
|
||
'REFUND_WAIT_SELLER_AGREE'=>'6',
|
||
'WAIT_SELLER_AGREE'=>'6',
|
||
'WAIT_BUYER_RETURN_GOODS'=>'6',//卖家已经同意退款
|
||
'SELLER_REFUSE_BUYER'=>'6',//卖家拒绝seller_refuse
|
||
'CLOSED'=>'1',//退款关闭
|
||
'SUCCESS'=>'6',//退款成功
|
||
|
||
);
|
||
|
||
/**
|
||
* 添加
|
||
* @param mixed $sdf sdf
|
||
* @return mixed 返回值
|
||
*/
|
||
|
||
public function add($sdf)
|
||
{
|
||
$rs = $this->_dealAftersale($sdf);
|
||
return $rs;
|
||
}
|
||
|
||
private function _dealAftersale($sdf) {
|
||
|
||
$modelAftersale = app::get('dealer')->model('platform_aftersale');
|
||
$logMdl = app::get('ome')->model('operation_log');
|
||
if($sdf['platform_aftersale']) {
|
||
$filter = array(
|
||
'plat_aftersale_id' => $sdf['platform_aftersale']['plat_aftersale_id'],
|
||
);
|
||
|
||
|
||
$upData = array(
|
||
'status' => $sdf['status'],
|
||
|
||
'outer_lastmodify'=> $sdf['modified'],
|
||
);
|
||
|
||
$upData['memo'] = $sdf['reason'];
|
||
$upData['money'] = $sdf['refund_fee'];
|
||
|
||
|
||
$rs = $modelAftersale->update($upData, $filter);
|
||
$idBn = array(
|
||
'plat_aftersale_id' => $sdf['platform_aftersale']['plat_aftersale_id'],
|
||
'plat_aftersale_bn' => $sdf['platform_aftersale']['plat_aftersale_bn']
|
||
);
|
||
|
||
|
||
$this->_dealAftersaleExtend($sdf, $idBn['plat_aftersale_id']);
|
||
|
||
$insertData['plat_aftersale_id'] = $sdf['platform_aftersale']['plat_aftersale_id'];
|
||
|
||
$msg = '更新成功';
|
||
$logMdl->write_log('aftersale@dealer', $insertData['plat_aftersale_id'], $msg);
|
||
|
||
} else {
|
||
|
||
|
||
$insertData = $this->_aftersaleSdfToData($sdf);
|
||
|
||
$aftersale_objects = $insertData['aftersale_objects'];
|
||
unset($insertData['aftersale_objects']);
|
||
|
||
|
||
//insert
|
||
$rs = $modelAftersale->insert($insertData);
|
||
|
||
|
||
if(!$rs) {
|
||
return array('rsp'=>'fail', 'msg'=>'售后申请单新建失败');
|
||
}
|
||
|
||
|
||
$itemrs = $this->_insertaftersaleItems($aftersale_objects, $insertData['plat_aftersale_id']);
|
||
|
||
$msg = '创建平台售后申请单成功';
|
||
$logMdl->write_log('aftersale@dealer', $insertData['plat_aftersale_id'], $msg);
|
||
|
||
$this->_dealAftersaleExtend($sdf, $insertData['plat_aftersale_id']);
|
||
}
|
||
|
||
|
||
$refund_item_list =$sdf['refund_item_list'];
|
||
|
||
|
||
$refund_items = array();
|
||
|
||
foreach($refund_item_list as $k=>$v){
|
||
foreach($v['items'] as $iv){
|
||
$refund_items[$iv['erp_order_id']][] = $iv;
|
||
}
|
||
|
||
}
|
||
//明细处理
|
||
|
||
foreach($refund_items as $k=>$v){
|
||
|
||
if($k>0){
|
||
kernel::single('dealer_event_trigger_aftersale')->push($insertData['plat_aftersale_id']);
|
||
}
|
||
}
|
||
|
||
//
|
||
$this->_dealPlatOrderitems($sdf);
|
||
|
||
|
||
if(in_array($sdf['status'],array('SUCCESS'))) {
|
||
|
||
$this->_updatePlaOrderPayed($sdf['platform_orders']['plat_order_id'], $sdf['refund_fee']);
|
||
|
||
$this->update_plaorder_pay_status($sdf['platform_orders']['plat_order_id']);
|
||
}
|
||
//
|
||
return array('rsp'=>'succ', 'msg' => $msg);
|
||
}
|
||
|
||
private function _aftersaleSdfToData($sdf) {
|
||
|
||
$data = array(
|
||
|
||
'plat_aftersale_bn' => $sdf['refund_bn'],
|
||
'plat_order_bn' => $sdf['order_bn'],
|
||
'plat_order_id' => $sdf['platform_orders']['plat_order_id'],
|
||
'oid' => $sdf['oid'],
|
||
'shop_id' => $sdf['shop_id'],
|
||
'shop_type' => $sdf['shop_type'],
|
||
'member_id' => $sdf['member_id'],
|
||
'add_time' => $sdf['created']?:time(),
|
||
'at_time' => time(),
|
||
'up_time' => time(),
|
||
'status' => $sdf['status'],
|
||
'refund_apply_money'=> $sdf['refund_fee'],
|
||
'refundmoney' => $sdf['refund_fee'],
|
||
'return_type' => $sdf['refund_type'],
|
||
'betc_id' => $sdf['betc_id'],
|
||
'cos_id' => $sdf['cos_id'],
|
||
'outer_lastmodify' => $sdf['modified'],
|
||
|
||
);
|
||
|
||
$refund_item_list = $sdf['refund_item_list'];
|
||
|
||
|
||
$this->divide_objects_to_items($refund_item_list);
|
||
|
||
|
||
foreach($refund_item_list as $val) {
|
||
|
||
$aftersale_items = array();
|
||
|
||
foreach($val['items'] as $iv){
|
||
$aftersale_items[] = array(
|
||
|
||
'shop_goods_bn' => $iv['shop_goods_bn'],
|
||
'product_id' => $iv['product_id'],
|
||
'bn' => $iv['bn'],
|
||
'name' => $iv['name'],
|
||
'oid' => $iv['oid'],
|
||
'num' => $iv['num'],
|
||
'price' => $iv['price'],
|
||
'erp_num' => $iv['erp_num'],
|
||
'erp_price' => $iv['erp_price'],
|
||
'betc_id' => $iv['betc_id'],
|
||
'plat_obj_id' => $iv['plat_obj_id'],
|
||
'plat_item_id' => $iv['plat_item_id'],
|
||
'erp_order_bn' => $iv['erp_order_bn'],
|
||
'erp_order_id' => $iv['erp_order_id'],
|
||
'erp_obj_id' => $iv['erp_obj_id'],
|
||
'at_time' => time(),
|
||
'up_time' => time(),
|
||
);
|
||
$data['erp_order_bn'] = $iv['erp_order_bn'];
|
||
|
||
$data['erp_order_id'] = $iv['erp_order_id'];
|
||
}
|
||
$objectsData = array(
|
||
'oid' => $val['oid'],
|
||
'num' => $val['num'],
|
||
'price' => $val['price'],
|
||
'outer_id' => $val['outer_id'],
|
||
'goods_id' => $val['goods_id'],
|
||
'aftersale_items' => $aftersale_items,
|
||
|
||
);
|
||
|
||
|
||
$data['aftersale_objects'][] = $objectsData;
|
||
|
||
}
|
||
$erp_order_id = $data['erp_order_id'];
|
||
|
||
$omeorderMdl = app::get('ome')->model('orders');
|
||
|
||
$omeorders = $omeorderMdl->db_dump(array('order_id'=>$erp_order_id),'betc_id,cos_id');
|
||
|
||
$data['betc_id'] = $omeorders['betc_id'];
|
||
$data['cos_id'] = $omeorders['cos_id'];
|
||
return $data;
|
||
}
|
||
|
||
private function _insertaftersaleItems($aftersale_items, $plat_aftersale_id) {
|
||
if(empty($plat_aftersale_id) || empty($aftersale_items)) {
|
||
return false;
|
||
}
|
||
$modelItem = app::get('dealer')->model('platform_aftersale_items');
|
||
$objectsMdl = app::get('dealer')->model('platform_aftersale_objects');
|
||
foreach($aftersale_items as $val) {
|
||
|
||
$objectsData = array(
|
||
|
||
'plat_aftersale_id' => $plat_aftersale_id,
|
||
'oid' => $val['oid'],
|
||
'num' => $val['num'],
|
||
'price' => $val['price'],
|
||
'outer_id' => $val['outer_id'],
|
||
'goods_id' => $val['goods_id'],
|
||
);
|
||
|
||
$rs = $objectsMdl->insert($objectsData);
|
||
|
||
$plat_aftersale_obj_id = $objectsData['plat_aftersale_obj_id'];
|
||
$aftersale_itemsData = $val['aftersale_items'];
|
||
foreach($aftersale_itemsData as &$iv){
|
||
|
||
$iv['plat_aftersale_id'] = $plat_aftersale_id;
|
||
$iv['plat_aftersale_obj_id'] = $plat_aftersale_obj_id;
|
||
}
|
||
if($aftersale_itemsData){
|
||
$sql = ome_func::get_insert_sql($modelItem, $aftersale_itemsData);
|
||
|
||
$rs = $modelItem->db->exec($sql);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
/**
|
||
* 更新_plaorder_pay_status
|
||
* @param mixed $plat_order_id ID
|
||
* @return mixed 返回值
|
||
*/
|
||
public function update_plaorder_pay_status($plat_order_id)
|
||
{
|
||
$plat_ordersMdl = app::get('dealer')->model('platform_orders');
|
||
$order_filter = array('plat_order_id' => $plat_order_id);
|
||
|
||
$order_detail = $plat_ordersMdl->dump($order_filter, 'plat_order_bn,payed,total_amount');
|
||
|
||
$payed = strval($order_detail['payed']);
|
||
$total_amount = strval($order_detail['total_amount']);
|
||
|
||
$pay_status = '6';
|
||
|
||
if ($payed == '0') {
|
||
$pay_status = '5';
|
||
}elseif ($payed < $total_amount) {
|
||
$pay_status = '4';
|
||
|
||
}
|
||
|
||
$data['pay_status'] = $pay_status;
|
||
|
||
$order_filter = array('plat_order_id' => $plat_order_id);
|
||
if($data){
|
||
|
||
$plat_ordersMdl->update($data, $order_filter);
|
||
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
/**
|
||
* _dealAftersaleExtend
|
||
* @param mixed $sdf sdf
|
||
* @param mixed $plat_aftersale_id ID
|
||
* @return mixed 返回值
|
||
*/
|
||
public function _dealAftersaleExtend($sdf, $plat_aftersale_id) {
|
||
if(empty($sdf['json_data']) || empty($plat_aftersale_id)) {
|
||
return false;
|
||
}
|
||
$extenddata = array(
|
||
|
||
'json_data' =>$sdf['json_data'],
|
||
|
||
);
|
||
$extendmodel = app::get('dealer')->model('platform_aftersale_extend');
|
||
$old = $extendmodel->db_dump(array('plat_aftersale_id'=>$plat_aftersale_id), 'plat_extend_id');
|
||
if($old) {
|
||
$extendmodel->update($extenddata, array('plat_extend_id'=>$old['plat_extend_id']));
|
||
return;
|
||
}
|
||
$extenddata['plat_aftersale_id'] = $plat_aftersale_id;
|
||
$extendmodel->db_save($extenddata);
|
||
}
|
||
|
||
|
||
//更新订单金额
|
||
/**
|
||
* _updatePlaOrderPayed
|
||
* @param mixed $plat_order_id ID
|
||
* @param mixed $money money
|
||
* @return mixed 返回值
|
||
*/
|
||
public function _updatePlaOrderPayed($plat_order_id, $money) {
|
||
|
||
if (empty($plat_order_id) || !$money) {
|
||
return false;
|
||
}
|
||
#更新订单分先后,避免订单退款并发时发货单撤回不及时导致订单明细未删除
|
||
$transaction = kernel::database()->beginTransaction();
|
||
$sql ="update sdb_dealer_platform_orders set payed=IF((CAST(payed AS char)-".$money.")>=0,payed-".$money.",0) where plat_order_id=".$plat_order_id;
|
||
|
||
kernel::database()->exec($sql);
|
||
kernel::database()->commit($transaction);
|
||
|
||
return true;
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* _dealPlatOrderitems
|
||
* @param mixed $sdf sdf
|
||
* @return mixed 返回值
|
||
*/
|
||
public function _dealPlatOrderitems($sdf) {
|
||
|
||
$db = kernel::database();
|
||
$pay_status = self::$refund_status[strtoupper($sdf['status'])];
|
||
|
||
$pay_status = $pay_status ? $pay_status : '6';
|
||
|
||
$plat_ordersMdl = app::get('dealer')->model('platform_orders');
|
||
$plat_obj_ids = array();
|
||
foreach($sdf['refund_item_list'] as $val) {
|
||
foreach($val['items'] as $iv){
|
||
$plat_obj_ids[$iv['plat_obj_id']] = $iv['plat_obj_id'];
|
||
}
|
||
|
||
}
|
||
|
||
if($plat_obj_ids){
|
||
|
||
$plat_obj_ids = implode(',',$plat_obj_ids);
|
||
$db->exec("UPDATE sdb_dealer_platform_order_objects set pay_status ='".$pay_status."' WHERE plat_obj_id in (".$plat_obj_ids.")");
|
||
|
||
}
|
||
|
||
$data['pay_status'] = $pay_status;
|
||
$order_filter = array('plat_order_id' => $sdf['platform_orders']['plat_order_id']);
|
||
if($data){
|
||
|
||
$plat_ordersMdl->update($data, $order_filter);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* 获取SmBmRate
|
||
* @param mixed $refund_item_list refund_item_list
|
||
* @return mixed 返回结果
|
||
*/
|
||
public function getSmBmRate($refund_item_list) {
|
||
$smIds = array();
|
||
$bmIds = array();
|
||
foreach ($refund_item_list as $object) {
|
||
$smIds[$object['goods_id']] = $object['goods_id'];
|
||
foreach ($object['items'] as $i => $item) {
|
||
$bmIds[$item['product_id']] = $item['product_id'];
|
||
}
|
||
}
|
||
$smBc = app::get('material')->model('sales_basic_material')->getList('sm_id, bm_id, rate', array('sm_id'=>$smIds));
|
||
$smBmRate = array();
|
||
foreach ($smBc as $v) {
|
||
$smBmRate[$v['sm_id']][$v['bm_id']] = $v['rate'];
|
||
}
|
||
$bmExt = app::get('material')->model('basic_material_ext')->getList('bm_id,cost', ['bm_id'=>$bmIds]);
|
||
$bmExt = array_column($bmExt, null, 'bm_id');
|
||
$smIdBn = array();
|
||
foreach ($refund_item_list as $object) {
|
||
if(!$smBmRate[$object['goods_id']]) {
|
||
$porth = 'number';
|
||
foreach ($object['items'] as $i => $item) {
|
||
if($bmExt[$item['product_id']]['cost'] > 0) {
|
||
$porth = 'cost';
|
||
}
|
||
}
|
||
foreach ($object['items'] as $i => $item) {
|
||
|
||
$smBmRate[$object['goods_id']][$item['product_id']] = $bmExt[$item['product_id']]['cost'];
|
||
}
|
||
}
|
||
}
|
||
return $smBmRate;
|
||
}
|
||
|
||
|
||
/**
|
||
* divide_objects_to_items
|
||
* @param mixed $refund_item_list refund_item_list
|
||
* @return mixed 返回值
|
||
*/
|
||
public function divide_objects_to_items(&$refund_item_list) {
|
||
$smBmRate = $this->getSmBmRate($refund_item_list);
|
||
|
||
foreach ($refund_item_list as $k => $object) {
|
||
if(empty($smBmRate[$object['goods_id']])) {
|
||
continue;
|
||
}
|
||
$tmpOrderItems = $object['items'];
|
||
foreach ($tmpOrderItems as $i => $item) {
|
||
if($item['product_id'] < 1) {
|
||
continue 2;
|
||
}
|
||
$tmpOrderItems[$i]['porth_field'] = $smBmRate[$object['goods_id']][$item['product_id']];
|
||
}
|
||
$options = array (
|
||
'part_total' => $object['price'],
|
||
'part_field' => 'price',
|
||
'porth_field' => 'porth_field',
|
||
);
|
||
$tmpOrderItems = kernel::single('ome_order')->calculate_part_porth($tmpOrderItems, $options);
|
||
|
||
$refund_item_list[$k]['items'] = $tmpOrderItems;
|
||
|
||
}
|
||
|
||
return $refund_item_list;
|
||
}
|
||
} |