Files
OMS/app/wap/controller/aftersale/changeproduct.php
2026-01-04 19:08:31 +08:00

355 lines
18 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.
*/
/**
* 门店售后 换货单 20170525 by wangjianjun@shopex.cn
*/
class wap_ctl_aftersale_changeproduct extends wap_controller{
function _views_change($curr_view){
$mdl_wap_return = app::get('wap')->model("return");
$page = intval($_POST['page']) ? intval($_POST['page']) : 0;
$limit = 1; //默认显示1条
$offset = $limit * $page;
$base_filter = array("return_type"=>"change");
//换货页面以换货门店仓为主
$is_super = kernel::single('desktop_user')->is_super();
if(!$is_super){
$branch_ids = kernel::single('o2o_store_branch')->getO2OBranchByUser(true);
if(empty($branch_ids)){
$this->pagedata['link_url'] = $this->delivery_link['order_index'];
$this->pagedata['error_msg'] = '操作员没有管辖的仓库';
echo $this->fetch('auth_error.html');
exit;
}
$base_filter['changebranch_id'] = $branch_ids[0];
}
$wap_router = app::get('wap')->router();
$sub_menu = array(
'all' => array('label'=>app::get('base')->_('全部'),'filter'=>$base_filter,'href'=>$wap_router->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'index'), true)),
'pending' => array('label'=>app::get('base')->_('待处理'),'filter'=>array_merge($base_filter,array("status"=>1)),'href'=>$wap_router->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'pending'), true)),
'refused' => array('label'=>app::get('base')->_('已拒绝'),'filter'=>array_merge($base_filter,array("status"=>2)),'href'=>$wap_router->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'refused'), true)),
'already' => array('label'=>app::get('base')->_('已处理'),'filter'=>array_merge($base_filter,array("status"=>3)),'href'=>$wap_router->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'already'), true)),
);
foreach($sub_menu as $k=>$v){
//Ajax加载下一页数据,只处理本页
if($_POST['flag'] == 'ajax' && $curr_view != $k){
continue;
}
$sub_menu[$k]['offset'] = $offset;
$sub_menu[$k]['limit'] = $limit;
$sub_menu[$k]['orderby'] = 'return_id desc'; //排序
//搜索条件
$sel_keywords = htmlspecialchars(trim($_POST['sel_keywords']));
if($_POST['sel_type'] && $sel_keywords){
switch ($_POST['sel_type']){
case 'order_bn':
//先获取order_ids
$mdl_ome_orders = app::get('ome')->model("orders");
$rs_order = $mdl_ome_orders->getList("order_id",array("order_bn"=>$sel_keywords));
if(!empty($rs_order)){
$order_ids = array();
foreach ($rs_order as $var_o){
$order_ids[] = $var_o["order_id"];
}
$v['filter']['order_id'] = $order_ids;
}else{
$not_show_datalist = true;
}
break;
case 'ship_mobile':
$v['filter']['ship_mobile'] = $sel_keywords;
break;
case 'aftersale_bn':
$mdl_ome_return_product = app::get('ome')->model("return_product");
$rs_return_product= $mdl_ome_return_product->dump(array("return_bn"=>$sel_keywords),"return_id");
if (!empty($rs_return_product)){
$v['filter']['aftersale_id'] = $rs_return_product["return_id"];
}else{
$not_show_datalist = true;
}
break;
case 'original_reship_bn':
$v['filter']['original_reship_bn'] = $sel_keywords;
break;
}
if ($not_show_datalist){//搜索不满足条件的不显示列表
$sub_menu[$k]['not_show_datalist'] = true;
}else{
//搜索并入
$sub_menu[$k]['filter'] = $v['filter'] ? $v['filter'] : array();
}
$sub_menu[$k]['sel_type'] = $_POST['sel_type'];
$sub_menu[$k]['sel_keywords'] = $sel_keywords;
}
$count = $mdl_wap_return->count($v['filter']);
$sub_menu[$k]['pageSize'] = ceil($count / $limit);
$sub_menu[$k]['curr_view'] = false;
if($k == $curr_view){//选中状态
$sub_menu[$k]['curr_view'] = true;
}
}
return $sub_menu;
}
//换货单“全部”的列表显示
function index(){
$this->common("all");
}
//换货单“待处理”的列表显示
function pending(){
$this->common("pending");
}
//换货单“已拒绝”的列表显示
function refused(){
$this->common("refused");
}
//换货单“已处理”的列表显示
function already(){
$this->common("already");
}
//列表公共加载方法
private function common($menu_type){
//标签Tabs处理
$sub_menu = $this->_views_change($menu_type);
$this->pagedata['sub_menu'] = $sub_menu;
$filter = $sub_menu[$menu_type]["filter"];
$offset = $sub_menu[$menu_type]['offset'];
$limit = $sub_menu[$menu_type]['limit'];
$orderby = $sub_menu[$menu_type]['orderby'];
//ajax点击加载参数
$this->pagedata['pageSize'] = $sub_menu[$menu_type]['pageSize'];
$this->pagedata['link_url'] = $sub_menu[$menu_type]['href'];
if ($sub_menu[$menu_type]['not_show_datalist']){//搜索不满足条件的不显示列表
}else{
//默认获取列表数据
$wap_aftersale_lib = kernel::single('wap_aftersale');
$dataList = $wap_aftersale_lib->getList($filter, $offset, $limit,$orderby);
if(!empty($dataList)){//有列表数据
//待处理页面显示 确认 拒单按钮
if($menu_type == "pending"){
foreach ($dataList as &$var_d){
$var_d["show_button"] = true;
}
unset($var_d);
//拒绝操作
$this->delivery_link['doRefuse'] = app::get('wap')->router()->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'doRefuse'), true);
//确认换货操作
$this->delivery_link['doConfirm'] = app::get('wap')->router()->gen_url(array('ctl'=>'aftersale_changeproduct','act'=>'doConfirm'), true);
}
$this->pagedata["dataList"] = $dataList;
}
}
//搜索选择状态保存
if ($sub_menu[$menu_type]['sel_type'] && $sub_menu[$menu_type]['sel_keywords']){
$this->pagedata["sel_type"] = $sub_menu[$menu_type]['sel_type'];
$this->pagedata["sel_keywords"] = $sub_menu[$menu_type]['sel_keywords'];
}
//给公共footer附上link 带上所以的父类构造方法的link
$this->pagedata['delivery_link'] = $this->delivery_link;
if($offset > 0){//Ajax加载更多
$this->display('aftersale/change_product_more.html');
}else{
$this->display('aftersale/change_product.html');
}
}
//换货拒单操作
function doRefuse(){
if (!$_POST["return_id"] || !$_POST["refuse_reason_text"]){
echo json_encode(array('res'=>'error', 'msg'=>'无效操作'));
exit;
}
$mdl_ome_operation_log = app::get('ome')->model('operation_log');
$mdl_wap_return = app::get('wap')->model('return');
$mdl_ome_reship = app::get('ome')->model('reship');
//获取原始退换货单号
$rs_wap_return = $mdl_wap_return->dump(array("return_id"=>$_POST["return_id"]),"original_reship_bn");
//原始退换货单信息
$rs_ome_reship = $mdl_ome_reship->dump(array("reship_bn"=>$rs_wap_return["original_reship_bn"]),"reship_id,changebranch_id");
//更新门店退换单为已拒绝状态
$mdl_wap_return->update(array("status"=>2),array("return_id"=>$_POST["return_id"]));
//参考oms端收货质检拒绝操作 收货异常
$refuseMemo = array("refuse"=>$_POST["refuse_reason_text"]);
$refuse = array(
'reason' => serialize($refuseMemo),
'is_check' => 12
);
$mdl_ome_reship->update($refuse,array('reship_id'=>$rs_ome_reship["reship_id"]));
//库存管控 释放换货门店仓库存冻结
$storeManageLib = kernel::single('ome_store_manage');
$storeManageLib->loadBranch(array('branch_id'=>$rs_ome_reship['changebranch_id']));
$params_stock = array(
"params" => $rs_ome_reship,
"node_type" => "refuseChangeReship",
);
$storeManageLib->processBranchStore($params_stock, $err_msg);
//获取主键记录原始换货货单日志
$mdl_ome_operation_log->write_log('reship@ome',$rs_ome_reship["reship_id"],'门店拒绝换货');
echo json_encode(array('res'=>'succ', 'status'=>'已拒绝', 'msg'=>'已拒绝成功'));
exit;
}
//确认换货操作
function doConfirm(){
if (!$_POST["return_id"]){
echo json_encode(array('res'=>'error', 'msg'=>'无效操作'));
exit;
}
//获取当前的换货单数据
$mdl_wap_return = app::get('wap')->model('return');
$mdl_wap_return_items = app::get('wap')->model('return_items');
$rs_wap_return = $mdl_wap_return->dump(array("return_id"=>$_POST["return_id"],"return_type"=>"change"),"*");
$rs_wap_return_items = $mdl_wap_return_items->getList("*",array("return_id"=>$_POST["return_id"]));
if (empty($rs_wap_return) || empty($rs_wap_return_items)){
echo json_encode(array('res'=>'error', 'msg'=>'换货单数据缺失'));
exit;
}
//获取原始换货单数据
$mdl_ome_reship = app::get('ome')->model('reship');
$rs_ome_reship = $mdl_ome_reship->dump(array("reship_bn"=>$rs_wap_return["original_reship_bn"],"is_check"=>1),"*");
if(empty($rs_ome_reship)){
echo json_encode(array('res'=>'error', 'msg'=>'原始换货单必须是已审核状态'));
exit;
}
//先更新原始换货单状态 做并发处理
if ($rs_ome_reship['status'] == "succ") {
echo json_encode(array('res'=>'error', 'msg'=>'请不要重复点击'));
exit;
}
$mdl_ome_reship->update(array("status"=>"succ"),array('reship_id'=>$rs_ome_reship["reship_id"]));
//必走流程:生成一张相应的门店订单、付款、生成发货单、发货
$change_order_sdf = kernel::single('wap_aftersale')->create_order_pay_store_delivery($rs_ome_reship);
if (empty($change_order_sdf)) {
echo json_encode(array('res'=>'error', 'msg'=>'生成换货订单发货流程失败'));
exit;
}
//换货订单发货流程走后 默认memo
$memo = ' 生成了1张换货订单【'.$change_order_sdf['order_bn'].'】';
//获取退货部分的明细数据 更新原始退货单 normal_num良品字段数据
$rs_wap_return_items_part = array();
foreach($rs_wap_return_items as $var_w_r_i){
if ($var_w_r_i["return_type"] == "return"){
$rs_wap_return_items_part[] = $var_w_r_i;
}
}
$mdl_ome_reship_items = app::get('ome')->model('reship_items');
foreach ($rs_wap_return_items_part as $var_w_r_i_t){
$mdl_ome_reship_items->update(array("normal_num"=>$var_w_r_i_t["num"]),array("reship_id"=>$rs_ome_reship["reship_id"],"bn"=>$var_w_r_i_t["bn"]));
}
//库存管控
$storeManageLib = kernel::single('ome_store_manage');
//退货部分:门店货品实际库存增加
$storeManageLib->loadBranch(array('branch_id'=>$rs_ome_reship['branch_id']));
$params_stock = array(
"params" => $rs_ome_reship,
"node_type" => "confirmReshipReturn",
);
$storeManageLib->processBranchStore($params_stock, $err_msg);
//释放换货门店仓库存冻结
$storeManageLib->loadBranch(array('branch_id'=>$rs_ome_reship['changebranch_id']));
$params_stock = array(
"params" => $rs_ome_reship,
"node_type" => "confirmReshipChange",
);
$storeManageLib->processBranchStore($params_stock, $err_msg);
//添加换货单api请求
$mdl_ome_reship->request_reship_creat_api($rs_ome_reship["shop_id"],$rs_ome_reship["reship_id"]);
//是否归档
$is_archive = kernel::single('archive_order')->is_archive($rs_ome_reship['source']);
//订单明细退货处理
$orders = $mdl_ome_reship->do_order_items_return($rs_ome_reship,$is_archive);
//更新上换货订单的关联订单号
app::get('ome')->model('orders')->update(array('relate_order_bn'=>$orders['order_bn']),array('order_bn'=>$change_order_sdf['order_bn']));
//判断是否要生成一张支付单
if ($rs_ome_reship['diff_order_bn']) {//新增补差订单 发货状态改为已发货 并把状态回打给前端。
kernel::single('ome_reship')->updatediffOrder($rs_ome_reship['diff_order_bn']);
}
//生成退款申请单(换货都会生成退款相关的流水)
$mdl_refund_apply = app::get('ome')->model('refund_apply');
$refund_apply_bn = $mdl_refund_apply->gen_id();
//新建退款申请单时的申请退款金额
$money = (float)$rs_ome_reship['tmoney']+(float)$rs_ome_reship['diff_money']+(float)$rs_ome_reship['bcmoney']-(float)$rs_ome_reship['bmoney'];
$refund_sdf = $mdl_ome_reship->create_refund_apply_record($refund_apply_bn,$rs_ome_reship,$money,$is_archive);
//完成退款申请和退款单处理 命名类
$reshipLib = kernel::single('ome_reship');
if ($is_archive) {
$reshipLib = kernel::single('archive_reship');
}
$is_generate_aftersale = true; //是否生成售后单
$totalmoney = (float)$rs_ome_reship['totalmoney']; //实际需要退款的金额
if ($totalmoney == 0 || $totalmoney < 0) {//换货 如果实际退款金额为零 或者 负数: 需客户再补钱的 都是走个已退款的流水 退款申请完成,并产生退款单
$reshipLib->createRefund($refund_sdf,$orders);
}elseif($totalmoney > 0){
$is_generate_aftersale = false;
//更新为实际退款金额 需要退款
$memo .= $refund_sdf['memo'].'总退款金额大于换货订单总额,进行多余费用退款!';
$mdl_refund_apply->update(array("money"=>$totalmoney,"memo"=>$memo),array('refund_apply_bn'=>$refund_apply_bn));
//生成退款申请单(换出的订单金额) 后产生退款单 状态更新为已退款
$refund_apply_bn = $mdl_refund_apply->gen_id();
$refund_sdf = $mdl_ome_reship->create_refund_apply_record($refund_apply_bn,$rs_ome_reship,$change_order_sdf['total_amount'],$is_archive);
$reshipLib->createRefund($refund_sdf,$orders);//退款申请完成,并产生退款单
}
//更新当前换货单状态及原始换货单状态
$mdl_wap_return->update(array("status"=>3),array("return_id"=>$rs_wap_return["return_id"]));
$mdl_ome_reship->update(array('is_check'=>'7','t_end'=>time()),array('reship_id'=>$rs_ome_reship["reship_id"]));
$memo .= '操作完成。';
$mdl_operation_log = app::get('ome')->model('operation_log');
if($rs_ome_reship['return_id']){//存在售后申请单的,更新为完成状态、是否收货和是否质检的字段。
$mdl_return_product = app::get('ome')->model('return_product');
$mdl_return_product->update(array('status'=>'4','money'=>$totalmoney,'recieved'=>'true','verify'=>'true'),array('return_id'=>$rs_ome_reship['return_id']));
$mdl_operation_log->write_log('return@ome',$rs_ome_reship['return_id'],$memo);
//退货完成回写
if ($change_order_sdf) {
$newmemo =' 生成了1张换货订单【'.$change_order_sdf['order_bn'].'】';
}
kernel::single('ome_service_aftersale')->update_status($rs_ome_reship['return_id'],'','async',$newmemo);
}
$mdl_operation_log->write_log('reship@ome',$rs_ome_reship["reship_id"],$memo);
//生成售后单
if($is_generate_aftersale){
kernel::single('sales_aftersale')->generate_aftersale($rs_ome_reship["reship_id"],$rs_ome_reship['return_type']);
}
echo json_encode(array('res'=>'succ', 'status'=>'已确认', 'msg'=>'已确认换货'));
}
}