getConf('ome.order.refund.check') != 'true') { return [false, ['msg'=>'未开启配置']]; } if($order['createway'] != 'matrix') { return [false, ['msg'=>'非平台订单']]; } $shop = app::get('ome')->model('shop')->db_dump(['shop_id'=>$order['shop_id']], 'node_id, node_type'); if(empty($shop['node_id'])) { return [false, ['msg'=>'店铺未绑定']]; } if(!in_array($shop['node_type'], ['taobao'])) { return [false, ['msg'=>'非淘宝店铺']]; } list($rs, $notice) = kernel::single('ome_order_refund_status')->fetch($order['order_bn'], $shop['node_id'], $order['shop_id']); if(!$rs) { return [true, ['msg'=>$notice['msg']]]; } if(!$notice['data']) { return [false, ['msg'=>'没有退款明细']]; } $needRequest = false; foreach ($order['objects'] as $o) { if($notice['data'][$o['oid']]) { $needRequest = true; break; } } if(!$needRequest) { return [false, ['msg'=>'不需要请求详情']]; } $rs = kernel::single('erpapi_router_request')->set('shop',$order['shop_id'])->finance_getRefundStatus(['order_bn'=>$order['order_bn']]); if($rs['rsp'] == 'fail') { return [true, ['msg'=>'接口失败:'.$rs['msg']]]; } if($rs['data']) { $oids = []; foreach ($rs['data'] as $v) { if(!in_array($v['status'], ['SELLER_REFUSE_BUYER','CLOSED'])) {#非拒绝、关闭 都是退款 $oids[] = $v['oid']; } } if($oids) { foreach ($order['objects'] as $o) { if(in_array($o['oid'], $oids)) { return [true, ['msg'=>'子单:'.$o['oid'].' 存在退款']]; } } } } return [false, ['msg'=>'不存在退款']]; } /** * [兼容]订单已经全额退款并取消--创建退款单 * 场景:平台上订单已退款,矩阵先推送了更新取消订单,后面才推送了退款单,导致OMS没有创建退款单; * @param $sdf * @return void */ public function createFinishRefund($sdf, &$error_msg=null) { $refundObj = app::get('ome')->model('refunds'); $refundApplyObj = app::get('ome')->model('refund_apply'); $order_id = $sdf['order']['order_id']; //check if(empty($order_id) || empty($sdf['refund_bn']) || empty($sdf['shop_id'])){ $error_msg = '无效的数据;'; return false; } //检查是否存在退款申请单 $applyINfo = $refundApplyObj->db_dump(array('order_id'=>$order_id), 'apply_id,refund_apply_bn'); if($applyINfo){ $error_msg = '已经存在退款申请单:'. $applyINfo['refund_apply_bn'] .',无法自动创建退款单;'; return false; } //检查是否存在退款单 $refundInfo = $refundObj->db_dump(array('order_id'=>$order_id), 'refund_id,refund_bn'); if($refundInfo){ $error_msg = '已经存在退款单:'. $refundInfo['refund_bn'] .',无法自动创建退款单;'; return false; } //退款来源(normal:普通退款,aftersale:售后仅退款,不退货;) $refund_refer = '0'; if($sdf['refund_refer'] == 'aftersale'){ $refund_refer = '1'; } //data $data = array( 'refund_bn' => $sdf['refund_bn'], 'shop_id' => $sdf['shop_id'], 'order_id' => $order_id, 'currency' => 'CNY', 'money' => $sdf['refund_fee'], 'cur_money' => $sdf['cur_money'] ? $sdf['cur_money'] : $sdf['refund_fee'], 'pay_type' => $sdf['pay_type'], 'download_time' => time(), 'status' => 'succ', 'memo' => $sdf['reason'], 'trade_no' => $sdf['alipay_no'], 'modifiey' => $sdf['modified'], 'payment' => $sdf['payment'], 't_ready' => $sdf['t_ready'] ? $sdf['t_ready'] : $sdf['t_sent'], 't_sent' => $sdf['t_sent'] ? $sdf['t_sent'] : $sdf['t_ready'], 't_received' => $sdf['t_received'] ? $sdf['t_received'] : 0, 'org_id' => $sdf['org_id'], 'refund_refer' => $refund_refer, //退款来源 ); //insert $rs = $refundObj->insert($data); if(!$rs) { $error_msg = '退款单创建失败;'; return false; } //logs $logObj = app::get('ome')->model('operation_log'); $logObj->write_log('order_edit@ome', $order_id, '订单全额退款并取消,创建退款单!'); return true; } /** * 创建退款单 * @Author: XueDing * @Date: 2025/2/7 11:16 AM * @param array $sdf 包含退款单信息的数组 * @return array 返回一个数组,第一个元素表示操作是否成功,第二个元素为成功或失败的消息 */ public function create($sdf) { $refundObj = app::get('ome')->model('refunds'); $order_id = $sdf['order_id']; //check if (empty($order_id) || empty($sdf['refund_bn']) || empty($sdf['shop_id'])) { return [false, '无效的数据']; } //检查是否存在退款单 $refundInfo = $refundObj->db_dump(array ('order_id' => $order_id,'refund_bn'=>$sdf['refund_bn']), 'refund_id,refund_bn'); if ($refundInfo) { return [false, '已经存在退款单:' . $refundInfo['refund_bn'] . ',无法自动创建退款单;']; } //退款来源(normal:普通退款,aftersale:售后仅退款,不退货;) $refund_refer = '0'; if ($sdf['refund_refer'] == 'aftersale') { $refund_refer = '1'; } //data $data = array ( 'refund_bn' => $sdf['refund_bn'], 'shop_id' => $sdf['shop_id'], 'order_id' => $order_id, 'currency' => 'CNY', 'money' => $sdf['refund_fee'], 'cur_money' => $sdf['cur_money'] ? $sdf['cur_money'] : $sdf['refund_fee'], 'pay_type' => $sdf['pay_type'], 'download_time' => time(), 'status' => 'succ', 'memo' => $sdf['reason'], 'modifiey' => $sdf['modified'], 'payment' => $sdf['payment'], 't_ready' => $sdf['t_ready'] ? $sdf['t_ready'] : $sdf['t_sent'], 't_sent' => $sdf['t_sent'] ? $sdf['t_sent'] : $sdf['t_ready'], 't_received' => $sdf['t_received'] ? $sdf['t_received'] : 0, 'org_id' => $sdf['org_id'], 'refund_refer' => $refund_refer, //退款来源 ); //insert $rs = $refundObj->insert($data); if (!$rs) { return [false, '退款单创建失败']; } return [true]; } /** * 退款申请备注 * * @return array */ public function setReasonTypes() { $reasonList = array('退运费', '申请价保退款', '价保退款'); return $reasonList; } public function lanjieDelivery($refundApplyId) { $refundApply = app::get('ome')->model('refund_apply')->db_dump( array('apply_id' => $refundApplyId, 'status' => '4', 'refund_refer'=>'0'), 'apply_id,refund_apply_bn,order_id,bool_type,product_data'); if (!$refundApply) { return [false, ['msg'=>'售前完成的退款申请不存在']]; } if($refundApply['bool_type'] & ome_refund_bool_type::__PROTECTED_CODE) { return [false, ['msg'=>'退款单为价保退款']]; } $filter = array('order_id'=>$refundApply['order_id']); $arrProduct = unserialize($refundApply['product_data']); if(!is_array($arrProduct)) { $tgOrder = app::get('ome')->model('orders')->db_dump(['order_id'=>$refundApply['order_id']], 'pay_status'); if($tgOrder['pay_status'] != '5') { return [false, ['msg'=>'订单未全额退款,退款单缺少明细']]; } } else { $filter['order_item_id'] = array_column($arrProduct, 'order_item_id'); } $didItems = app::get('sales')->model('delivery_order_item')->getList('distinct delivery_id', $filter); $timing_time = time() + 300; foreach($didItems as $didItem) { //logs app::get('ome')->model('operation_log')->write_log('delivery_back@ome', $didItem['delivery_id'], '退款单:'.$refundApply['refund_apply_bn'].'导致延时自动拦截:' . date('Y-m-d H:i:s', $timing_time)); //延时任务 $task = array( 'obj_id' => $didItem['delivery_id'], 'obj_type' => 'delivery_lan_jie', 'exec_time' => $timing_time, ); app::get('ome')->model('misc_task')->saveMiscTask($task); } return [true]; } /** * 延迟更新订单取消状态 * 场景:平台更新订单全额退款状态与请求WMS取消发货单同分同秒; * @todo:发货单撤消成功,订单是(全额退款+未发货+已拆分完)的状态; * * @param array $orderIds * @return bool */ public function reundCancelOrder($orderIds) { $orderObj = app::get('ome')->model('orders'); $deliveryObj = app::get('ome')->model('delivery'); //check if(empty($orderIds)){ return false; } //list foreach ($orderIds as $orderKey => $order_id) { //如果有未取消的发货单,则退出 $deliveryList = $deliveryObj->validDeiveryByOrderId($order_id); if($deliveryList){ continue; } //订单信息 $orderInfo = $orderObj->dump(array('order_id'=>$order_id), 'order_id,order_bn,payed,status,pay_status,ship_status,process_status'); //check if(in_array($orderInfo['process_status'], array('cancel', 'remain_cancel'))){ continue; } if($orderInfo['ship_status'] != '0'){ continue; } if($orderInfo['pay_status'] != '5'){ continue; } if($orderInfo['payed'] > 0){ continue; } //订单取消 $mod = 'async'; //异步不用请求:订单取消api接口 $orderObj->cancel($order_id, '延迟更新取消订单状态', false, $mod, false); } return true; } }