1220 行
47 KiB
PHP
可执行文件
1220 行
47 KiB
PHP
可执行文件
<?php
|
|
|
|
namespace Retail\Controller;
|
|
|
|
use Common\Business\Plug;
|
|
use Common\Business\Sell;
|
|
use Common\Business\SerialNumberGoods;
|
|
use Common\Model\RetailPayOrderModel;
|
|
use Common\Model\RetailVipModel;
|
|
use Common\Order\BillOrder;
|
|
use Make\Business\Make;
|
|
use Make\Model\MakeOrderModel;
|
|
|
|
//[1.8.50]
|
|
|
|
/**
|
|
* 售后订单管理
|
|
* Class CustomerController
|
|
* @package Retail\Controller
|
|
*/
|
|
class CustomerController extends BaseController
|
|
{
|
|
public function index()
|
|
{
|
|
$arr = array(
|
|
'export' => '/index.php/Retail/Customer/export',
|
|
'wifi' => '/index.php/Retail/Customer/print_option',
|
|
'show' => '/index.php/Retail/Customer/order_info',
|
|
'examine' => '/index.php/Retail/Customer/examine',
|
|
'delivery_option' => '/index.php/Retail/Customer/delivery_agree',
|
|
);
|
|
$authArr = checkFunction($arr);
|
|
$this->assign('authArr', $authArr);
|
|
$PlugClass = new Plug();
|
|
$plugResult = $PlugClass->PlugPermissions([
|
|
'merchant_id' => $this->merchant_id,
|
|
'identification_arr' => [
|
|
'make'
|
|
]
|
|
]);
|
|
if (!empty($plugResult['data']['plug']['make'])) {
|
|
$this->assign('make', true);
|
|
} else {
|
|
$this->assign('make', false);
|
|
}
|
|
$this->display();
|
|
}
|
|
|
|
|
|
/**
|
|
* 线下退款
|
|
*/
|
|
public function line_index()
|
|
{
|
|
$this->display();
|
|
}
|
|
|
|
|
|
/**
|
|
*售后订单列表
|
|
* $time 时间
|
|
* $order_no 订单号
|
|
* vip_phone 会员手机号
|
|
* order_type 2退款订单 3换货订单
|
|
* user_type 1会员 2普通用户
|
|
* $order_genre 1普通订单 2拼团订单 3秒杀订单
|
|
* $status 1待审核 2 已完成 3待用户发货 4待商家收货 5待发货/退款 6驳回 7撤销申请8配送中
|
|
*/
|
|
public function OrderList()
|
|
{
|
|
$merchant_id = session("ls_userinfo")['merchantid'];
|
|
$store_id = session("storeid");
|
|
$data = I("post.");
|
|
$time = $data['time'];
|
|
$order_no = $data['order_no'];
|
|
$order_genre = $data['order_genre'];
|
|
$vip_phone = $data['vip_phone'];
|
|
$order_type = $data['order_type'];
|
|
$status = $data['status'];
|
|
$page = $data['page'];
|
|
$limit = $data['limit'];
|
|
$where = array(
|
|
'b.merchant_id' => $merchant_id,
|
|
'b.store_id' => $store_id,
|
|
'b.order_type' => array('in', '2,3'),
|
|
'b.type' => 1,
|
|
'b.pay_state' => array('neq', 0),
|
|
'o.order_genre' => array('in', '1,2,3,4')
|
|
);
|
|
if (!empty($order_type)) {
|
|
$where['b.order_type'] = $order_type;
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($status)) {
|
|
switch ($status) {
|
|
case 1:
|
|
//待审核
|
|
$where['b.refund_status'] = 1;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 2:
|
|
//已完成
|
|
$where['b.refund_status'] = 2;
|
|
break;
|
|
case 3:
|
|
//待用户发货
|
|
$where['b.refund_status'] = 3;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 4:
|
|
//待商家收货
|
|
$where['b.refund_status'] = 4;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 5:
|
|
//待发货/退款
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 6:
|
|
//驳回
|
|
$where['b.refund_status'] = 6;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 7:
|
|
//撤销申请
|
|
$where['b.refund_status'] = 7;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 8:
|
|
//配送中
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = 2;
|
|
break;
|
|
default:
|
|
$where['b.refund_status'] = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!empty($time)) {
|
|
$start_time = strtotime($time[0]);
|
|
$end_time = strtotime($time[1]);
|
|
$where['b.add_time'] = array('between', array($start_time, $end_time));
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($vip_phone)) {
|
|
$retailVip = D('RetailVip');
|
|
$vip = $retailVip->getFind(array($retailVip::MOBILE_PHONE . '|' . $retailVip::CARD_NUM . '|' . $retailVip::CARD_KEY => array('like', '%' . $vip_phone . '%'), $retailVip::MERCHANT_ID => $merchant_id, $retailVip::STATUS => 1));
|
|
if (!$vip) {
|
|
$res['status'] = 1;
|
|
$res['msg'] = '查询成功';
|
|
$res['order_list'] = array();
|
|
$res['customer_order_count'] = 0; //订单数
|
|
$res['refund_order_count'] = 0; //退款订单
|
|
$res['exchange_order_count'] = 0; //换货订单
|
|
$res['refund_money'] = 0; //退款金额
|
|
$this->ajaxReturn($res);
|
|
} else {
|
|
$where["b.vid"] = $vip[$retailVip::ID];
|
|
}
|
|
}
|
|
if (!empty($order_no)) {
|
|
$where['b.order_no|b.refund_no'] = array('like', "%" . trim($order_no) . "%");
|
|
}
|
|
$order_list = M('retail_bill_order as b')
|
|
->join('ls_retail_bill_online as o on b.id=o.bill_id')
|
|
->join('ls_retail_bill_discount as d on b.id=d.bill_id')
|
|
->join('ls_retail_vip as v on b.vid=v.id', 'LEFT')
|
|
->page($page, $limit)
|
|
->field('b.*,o.*,o.user_name,o.status,o.delivery_fee,v.mobile_phone as vip_phone,v.name as vip_name')
|
|
->where($where)
|
|
->order('b.id desc')
|
|
->select();
|
|
if ($order_list) {
|
|
$customer_order_count = M('retail_bill_order as b')
|
|
->join('ls_retail_bill_online as o on b.id=o.bill_id')
|
|
->join('ls_retail_bill_discount as d on b.id=d.bill_id')
|
|
->join('ls_retail_vip as v on b.vid=v.id', 'LEFT')
|
|
->where($where)
|
|
->count();
|
|
foreach ($order_list as $key => &$val) {
|
|
$val['index'] = $key + 1;
|
|
$val['add_time'] = date("Y-m-d H:i:s", $val['add_time']);
|
|
if (!empty($val['vid'])) {
|
|
$val['identity'] = "会员";
|
|
} else {
|
|
$val['identity'] = "散客";
|
|
}
|
|
if ($val['order_type'] == 2) {
|
|
$val['order_name'] = "退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
$val['order_name'] = "换货";
|
|
}
|
|
switch ($val['order_type']) {
|
|
case 2:
|
|
$val['order_type_name'] = "退款订单";
|
|
break;
|
|
case 3:
|
|
$val['order_type_name'] = "换货订单";
|
|
break;
|
|
}
|
|
switch ($val['order_genre']) {
|
|
case 1:
|
|
$val['order_genre_name'] = "普通订单";
|
|
break;
|
|
case 2:
|
|
$val['order_genre_name'] = "拼团订单";
|
|
break;
|
|
case 3:
|
|
$val['order_genre_name'] = "秒杀订单";
|
|
break;
|
|
case 4:
|
|
$val['order_genre_name'] = "预售订单";
|
|
break;
|
|
}
|
|
switch ($val['refund_status']) {
|
|
case 1:
|
|
$val['status_name'] = "待审核";
|
|
break;
|
|
case 2:
|
|
if ($val['order_type'] == 2) {
|
|
$val['status_name'] = "已退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
$val['status_name'] = "已换货";
|
|
}
|
|
break;
|
|
case 3:
|
|
$val['status_name'] = "待客户发货";
|
|
break;
|
|
case 4:
|
|
$val['status_name'] = "待商家收货";
|
|
break;
|
|
case 5:
|
|
if ($val['order_type'] == 2) {
|
|
$val['status_name'] = "待退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
switch ($val['status']) {
|
|
case 1:
|
|
$val['status_name'] = "待商家发货";
|
|
break;
|
|
case 2:
|
|
$val['status_name'] = "商家已发货";
|
|
break;
|
|
case 3:
|
|
$val['status_name'] = "客户已收货";
|
|
break;
|
|
}
|
|
if ($val['status'] == 1 || $val['status'] == 2) {
|
|
switch ($val['delivery_type']) {
|
|
case 1:
|
|
if ($val['status'] == 1) {
|
|
$val['order_status'] = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
$DaOrderModel = D('RetailDaOrder');
|
|
$clerkinfo = $DaOrderModel->getOrderFind(array("order_no" => strval($val["order_no"]), $DaOrderModel::ID => $val["delivery_record_id"]), '*', 'id desc');
|
|
$val['order_status'] = $clerkinfo["order_status"];
|
|
break;
|
|
case 3:
|
|
//Uu配送转成达达订单状态显示
|
|
$uuOrderModel = D('RetailUuOrder');
|
|
$state_uu = $uuOrderModel->getOrderFindField(array("origin_id" => $val["id"], "id" => $val["delivery_record_id"]), "state", 'id desc');
|
|
if ($state_uu == 1) {
|
|
$val['order_status'] = 1; //待接单
|
|
} else if ($state_uu == 3 || $state_uu == 4) {
|
|
$val['order_status'] = 2; //待取货
|
|
} else if ($state_uu == 5 || $state_uu == 6) {
|
|
$val['order_status'] = 3; //配送中
|
|
} else {
|
|
$val['order_status'] = 4; //已收货
|
|
}
|
|
break;
|
|
case 5:
|
|
//码科配送
|
|
$MakeOrderModel = new MakeOrderModel();
|
|
$status = $MakeOrderModel->getOrderFindField(['bill_id' => $val['id']], "status", "id desc");
|
|
switch ($status) {
|
|
case 'payed':
|
|
//待接单
|
|
$val['order_status'] = 1;
|
|
break;
|
|
case 'accepted':
|
|
//'待取件
|
|
$val['order_status'] = 2;
|
|
break;
|
|
case 'geted':
|
|
//待收件
|
|
$val['order_status'] = 3;
|
|
break;
|
|
case 'gotoed':
|
|
//待评价
|
|
$val['order_status'] = 4;
|
|
break;
|
|
case 'completed':
|
|
//订单已完成
|
|
$val['order_status'] = 4;
|
|
break;
|
|
case 'cancel':
|
|
//已取消
|
|
$val['order_status'] = 5;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
$val['status_name'] = "驳回请求";
|
|
break;
|
|
case 7:
|
|
$val['status_name'] = "客户撤销申请";
|
|
break;
|
|
}
|
|
//优惠金额
|
|
$val['discount_amount'] = round($val["coupon_money"] + $val["vip_dis_money"] + $val['vip_less_money'], 2);
|
|
//积分抵扣
|
|
$val['integral_dis_money'] = floatval($val['integral_dis_money']);
|
|
if ($val['order_type'] == 2 && ($val['refund_status'] != 2 || $val['refund_status'] == 6)) {
|
|
$val['all_money'] = round($val['all_money'] + $val['delivery_fee'], 2);
|
|
}
|
|
}
|
|
}
|
|
$res['status'] = 1;
|
|
$res['msg'] = '查询成功';
|
|
$res['order_list'] = $order_list;
|
|
$res['customer_order_count'] = $customer_order_count ? $customer_order_count : 0; //订单数
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/**
|
|
* 售后金额统计
|
|
*/
|
|
public function OrderTotal()
|
|
{
|
|
$merchant_id = session("ls_userinfo")['merchantid'];
|
|
$store_id = session("storeid");
|
|
$data = I("post.");
|
|
$time = $data['time'];
|
|
$order_no = $data['order_no'];
|
|
$order_genre = $data['order_genre'];
|
|
$vip_phone = $data['vip_phone'];
|
|
$order_type = $data['order_type'];
|
|
$status = $data['status'];
|
|
$BillModel = D("RetailBillOrder");
|
|
$where = array(
|
|
'b.merchant_id' => $merchant_id,
|
|
'b.store_id' => $store_id,
|
|
'b.order_type' => array('in', '2,3'),
|
|
'b.type' => 1,
|
|
'b.pay_state' => array('neq', 0),
|
|
'o.order_genre' => array('in', '1,2,3,4')
|
|
);
|
|
if (!empty($order_type)) {
|
|
$where['b.order_type'] = $order_type;
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($status)) {
|
|
switch ($status) {
|
|
case 1:
|
|
//待审核
|
|
$where['b.refund_status'] = 1;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 2:
|
|
//已完成
|
|
$where['b.refund_status'] = 2;
|
|
break;
|
|
case 3:
|
|
//待用户发货
|
|
$where['b.refund_status'] = 3;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 4:
|
|
//待商家收货
|
|
$where['b.refund_status'] = 4;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 5:
|
|
//待发货/退款
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 6:
|
|
//驳回
|
|
$where['b.refund_status'] = 6;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 7:
|
|
//撤销申请
|
|
$where['b.refund_status'] = 7;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 8:
|
|
//配送中
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = 2;
|
|
break;
|
|
default:
|
|
$where['b.refund_status'] = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!empty($time)) {
|
|
$start_time = strtotime($time[0]);
|
|
$end_time = strtotime($time[1]);
|
|
$where['b.add_time'] = array('between', array($start_time, $end_time));
|
|
}
|
|
if (!empty($order_no)) {
|
|
$where['b.order_no'] = array('like', "%" . $order_no . "%");
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($vip_phone)) {
|
|
$retailVip = D('RetailVip');
|
|
$vip = $retailVip->getFind(array($retailVip::MOBILE_PHONE . '|' . $retailVip::CARD_NUM . '|' . $retailVip::CARD_KEY => array('like', '%' . $vip_phone . '%'), $retailVip::MERCHANT_ID => $merchant_id, $retailVip::STATUS => 1));
|
|
if (!$vip) {
|
|
$res['status'] = 1;
|
|
$res['msg'] = '查询成功';
|
|
$res['order_list'] = array();
|
|
$res['customer_order_count'] = 0; //订单数
|
|
$res['refund_order_count'] = 0; //退款订单
|
|
$res['exchange_order_count'] = 0; //换货订单
|
|
$res['refund_money'] = 0; //退款金额
|
|
$this->ajaxReturn($res);
|
|
} else {
|
|
$where["b.vid"] = $vip[$retailVip::ID];
|
|
}
|
|
}
|
|
switch ($order_type) {
|
|
case 2:
|
|
$refund_order_count = $BillModel->getBillCount($where);
|
|
if ($status == 2 || empty($status)) {
|
|
$where['b.refund_status'] = 2;
|
|
$refund_money_actual = $BillModel->getDiscountSum($where, "b.all_money");
|
|
}
|
|
break;
|
|
case 3:
|
|
$exchange_order_count = $BillModel->getBillCount($where);
|
|
break;
|
|
default:
|
|
$where['b.order_type'] = 2;
|
|
$refund_order_count = $BillModel->getBillCount($where);
|
|
if ($status == 2 || empty($status)) {
|
|
$where['b.refund_status'] = 2;
|
|
$refund_money_actual = $BillModel->getDiscountSum($where, "b.all_money");
|
|
}
|
|
$where['b.order_type'] = 3;
|
|
unset($where['b.refund_status']);
|
|
$exchange_order_count = $BillModel->getBillCount($where);
|
|
break;
|
|
}
|
|
$refund_order_count = $refund_order_count ? $refund_order_count : 0;
|
|
$exchange_order_count = $exchange_order_count ? $exchange_order_count : 0;
|
|
$refund_money_actual = $refund_money_actual ? $refund_money_actual : 0;
|
|
$res['refund_order_count'] = $refund_order_count; //退款订单
|
|
$res['exchange_order_count'] = $exchange_order_count; //换货订单
|
|
$res['refund_money_actual'] = $refund_money_actual; //已退金额
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取售后订单详情
|
|
*/
|
|
public function order_info()
|
|
{
|
|
$bill_id = I("post.id");
|
|
$data = array(
|
|
"bill_id" => $bill_id
|
|
);
|
|
$res = A("Api/Customer")->order_info($data);
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/**
|
|
* 审核操作
|
|
* 审核售后订单
|
|
* @param order_no 订单号
|
|
* @param type 1同意退款 2拒绝
|
|
* @param reason_id 申请原因id
|
|
* @param reason 驳回原因
|
|
* @param deliver_state 0不需要客户退货 1需要客户退货
|
|
* goods_list 商品信息
|
|
*/
|
|
public function examine()
|
|
{
|
|
$data = I("post.");
|
|
$data['platform_type'] = $this->role_info['platform_type'];
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$data['refund_status'] = 1;
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$redis_key = "customer_" . $data['order_no'];
|
|
if ($ApiRedis::$redis->exists($redis_key)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = "正在操作该订单,请勿重复操作";
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
|
|
}
|
|
$res = A("Api/Customer")->examineOperation($data);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis::$redis->delete($redis_key);
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
|
|
/**
|
|
* 商家收货
|
|
* order_no 订单号
|
|
*/
|
|
public function ReceivingGoods()
|
|
{
|
|
$data = I('post.');
|
|
$data['platform_type'] = $this->role_info['platform_type'];
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$data['refund_status'] = 4;
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$redis_key = "customer_" . $data['order_no'];
|
|
if ($ApiRedis::$redis->exists($redis_key)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = "正在操作该订单,请勿重复操作";
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
|
|
}
|
|
$res = A("Api/Customer")->BusinessReceiving($data);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis::$redis->delete($redis_key);
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/**
|
|
* 线上订单退款
|
|
* order_no 订单号
|
|
* @param $user_type //1.收银员 2.店长 3.后台
|
|
* @param $return_delivery_fee // 是否退还配送费 1是 2否
|
|
*/
|
|
public function refund_agree()
|
|
{
|
|
$merchant_id = session("ls_userinfo")["merchantid"];
|
|
$store_id = session("storeid");
|
|
$order_no = I('post.order_no');
|
|
$return_delivery_fee = I('post.return_delivery_fee') == 1 ? 1 : 2; //是否退还配送费 1是 2否
|
|
if (empty($order_no) || empty($return_delivery_fee)) {
|
|
$result['status'] = 0;
|
|
$result['msg'] = '缺少参数';
|
|
$this->ajaxReturn($result);
|
|
}
|
|
$data = array(
|
|
'store_id' => $store_id,
|
|
'merchant_id' => $merchant_id,
|
|
'order_no' => $order_no,
|
|
'user_type' => 3,
|
|
'return_delivery_fee' => $return_delivery_fee,
|
|
'platform_type'=>$this->role_info['platform_type']
|
|
);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$redis_key = "customer_" . $data['order_no'];
|
|
if ($ApiRedis::$redis->exists($redis_key)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = "正在操作该订单,请勿重复操作";
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
|
|
}
|
|
// 退款
|
|
$res = A('PayApi/Refund')->onlineOrderRefund_v2($data);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis::$redis->delete($redis_key);
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/*
|
|
* 获取UU配送费
|
|
*/
|
|
public function getUuDeliveryPrice()
|
|
{
|
|
$StoreModel = D('RetailStore');
|
|
$merchant_id = session("ls_userinfo")['merchantid'];
|
|
$store_id = session("storeid");
|
|
$store = $StoreModel->getFind(array("id" => $store_id));
|
|
$data = array(
|
|
'order_no' => I("post.order_no"),
|
|
'merchant_id' => $merchant_id,
|
|
'store_id' => $store_id,
|
|
'store' => $store
|
|
);
|
|
$res = A("Api/Delivery")->getUuDeliveryPrice($data);
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/*
|
|
* 获取码科配送费
|
|
*/
|
|
public function getMakeDeliveryPrice()
|
|
{
|
|
$data = array(
|
|
'order_no' => I("post.order_no"),
|
|
'merchant_id' => $this->merchant_id,
|
|
'store_id' => $this->store_id,
|
|
);
|
|
$MakeClass = new Make();
|
|
$result = $MakeClass->getDeliveryPrice($data);
|
|
$result['Tips'] = '配送距离' . $result['data']['distance'] . 'km,配送费' . $result['data']['total_price'] . '元';
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
|
|
//出售商品记录
|
|
public function sellList()
|
|
{
|
|
$data = I('post.');
|
|
$SellClass = new Sell();
|
|
$result = $SellClass->sellList($data);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
|
|
//串号商品查询
|
|
public function searchSerial()
|
|
{
|
|
$data = I('post.');
|
|
$data['user_type'] = 4;
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$SerialClass = new SerialNumberGoods();
|
|
$result = $SerialClass->searchWarehouseSerial($data);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
|
|
//配送前确认商品信息confirmDistributionGoods
|
|
public function confirmDistributionGoods()
|
|
{
|
|
$data = I('post.');
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$data['type'] = 1;
|
|
$SellClass = new Sell();
|
|
$result = $SellClass->confirmSellGoods($data);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
|
|
/**
|
|
* 配送
|
|
* type 配送类型 1商家配送 2达达配送 3UU配送 4快递发货 5码科配送 6麦芽田配送
|
|
* order_no 订单号
|
|
* option_type 1收银端 2后台操作
|
|
* uu_phone 收银员手机号或者门店手机号
|
|
* special_type 特殊处理类型,是否需要保温箱 1需要 0不需要
|
|
* note 备注
|
|
* total_price 码科配送费
|
|
*/
|
|
public function delivery_agree()
|
|
{
|
|
$StoreModel = D('RetailStore');
|
|
$store = $StoreModel->getFind(array("id" => $this->store_id));
|
|
$operation_id = session("jurisdiction_user")['id'];
|
|
$data = array(
|
|
'option_type' => 2,
|
|
'operation_id' => $operation_id,
|
|
'merchant_id' => $this->merchant_id,
|
|
'store_id' => $this->store_id,
|
|
'store' => $store,
|
|
'order_no' => I("post.order_no"),
|
|
'type' => I("post.delivery_type"),
|
|
'uu_phone' => $store['phone'],
|
|
'special_type' => 0,
|
|
'note' => "",
|
|
'total_price' => I('post.total_price'),
|
|
// 是否发布到骑手端(仅门店配送可用)
|
|
'sync_to_rider' => I('post.sync_to_rider', 0),
|
|
'platform_type'=>$this->role_info['platform_type']?$this->role_info['platform_type']:1
|
|
);
|
|
if (C("IS_SET_REDIS")) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$redis_key = "customer_" . $data['order_no'];
|
|
if ($ApiRedis::$redis->exists($redis_key)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = "正在操作该订单,请勿重复操作";
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
|
|
}
|
|
$res = A("Api/Delivery")->deliveryOrder($data);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis::$redis->delete($redis_key);
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
|
|
/**
|
|
* 取消配送
|
|
* order_no 订单号
|
|
* reason //UU取消配送原因
|
|
* reason_id //达达取消配送原因id
|
|
*/
|
|
public function delivery_cancel()
|
|
{
|
|
$data = array(
|
|
"order_no" => I("post.order_no"),
|
|
"reason" => I("post.reason"),
|
|
"reason_id" => I("post.reason_id"),
|
|
"merchant_id" => session("ls_userinfo")['merchantid'],
|
|
"store_id" => session("storeid"),
|
|
);
|
|
if (C("IS_SET_REDIS")) {
|
|
$ApiRedis = new \Addons\Api\RedisController();
|
|
$redis_key = "customer_" . $data['order_no'];
|
|
if ($ApiRedis::$redis->exists($redis_key)) {
|
|
$res['status'] = 0;
|
|
$res['msg'] = "正在操作该订单,请勿重复操作";
|
|
$this->ajaxReturn($res);
|
|
}
|
|
$ApiRedis::$redis->setex($redis_key, 10, $data['order_no']);
|
|
}
|
|
$res = A("Api/Delivery")->cancelDelivery($data);
|
|
if (C('IS_SET_REDIS')) {
|
|
$ApiRedis::$redis->delete($redis_key);
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/**
|
|
* 获取骑手信息
|
|
*/
|
|
public function getRiderInfo()
|
|
{
|
|
$merchant_id = session("ls_userinfo")['merchantid'];
|
|
$store_id = session("storeid");
|
|
$order_no = I('post.order_no');//订单编号
|
|
if (empty($order_no) || empty($store_id) || empty($merchant_id)) {
|
|
$result['status'] = 0;
|
|
$result['msg'] = "缺少参数";
|
|
$this->ajaxReturn($result);
|
|
}
|
|
$result = A('PayApi/Order')->getRider($order_no);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
/**
|
|
* 获取达达配送取消订单原因
|
|
*/
|
|
public function getCancelDeliveryReason()
|
|
{
|
|
$reason = M('retail_da_reason')->select();
|
|
if ($reason) {
|
|
$res['status'] = 1;
|
|
$res['msg'] = '获取成功';
|
|
$res['reason'] = $reason;
|
|
} else {
|
|
$res['status'] = 0;
|
|
$res['msg'] = '暂无数据';
|
|
$res['reason'] = array();
|
|
}
|
|
$this->ajaxReturn($res);
|
|
}
|
|
|
|
/**
|
|
* wifi打印
|
|
*/
|
|
public function print_option()
|
|
{
|
|
$bill_id = I('post.bill_id');
|
|
$data = A('PayApi/Printer')->linePrinting_v1($this->store_id, $bill_id, true);
|
|
$this->ajaxReturn($data);
|
|
}
|
|
|
|
/**
|
|
* 导出
|
|
*/
|
|
public function export()
|
|
{
|
|
$data = I("get.");
|
|
$time = $data['time'];
|
|
$order_no = $data['order_no'];
|
|
$order_genre = $data['order_genre'];
|
|
$vip_phone = $data['vip_phone'];
|
|
$order_type = $data['order_type'];
|
|
$status = $data['status'];
|
|
$where = array(
|
|
'b.merchant_id' => $this->merchant_id,
|
|
'b.store_id' => $this->store_id,
|
|
'b.order_type' => array('in', '2,3'),
|
|
'b.type' => 1,
|
|
'b.pay_state' => array('neq', 0),
|
|
'o.order_genre' => array('in', '1,2,3,4')
|
|
);
|
|
if (!empty($order_type)) {
|
|
$where['b.order_type'] = $order_type;
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($status)) {
|
|
switch ($status) {
|
|
case 1:
|
|
//待审核
|
|
$where['b.refund_status'] = 1;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 2:
|
|
//已完成
|
|
$where['b.refund_status'] = 2;
|
|
$where['o.status'] = array('in', '2,3');
|
|
break;
|
|
case 3:
|
|
//待用户发货
|
|
$where['b.refund_status'] = 3;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 4:
|
|
//待商家收货
|
|
$where['b.refund_status'] = 4;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 5:
|
|
//待发货/退款
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 6:
|
|
//驳回
|
|
$where['b.refund_status'] = 6;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 7:
|
|
//撤销申请
|
|
$where['b.refund_status'] = 7;
|
|
$where['o.status'] = array('in', '1,3');
|
|
break;
|
|
case 8:
|
|
//配送中
|
|
$where['b.refund_status'] = 5;
|
|
$where['o.status'] = 2;
|
|
break;
|
|
default:
|
|
$where['b.refund_status'] = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!empty($time)) {
|
|
if(!is_array($time)){
|
|
$time = explode(',',$time);
|
|
}
|
|
$start_time = strtotime($time[0]);
|
|
$end_time = strtotime($time[1]);
|
|
$where['b.add_time'] = array('between', array($start_time, $end_time));
|
|
}
|
|
if (!empty($order_no)) {
|
|
$where['b.order_no'] = array('like', "%" . $order_no . "%");
|
|
}
|
|
if (!empty($order_genre)) {
|
|
$where['o.order_genre'] = $order_genre;
|
|
}
|
|
if (!empty($vip_phone)) {
|
|
$retailVip = new RetailVipModel();
|
|
$vMap = [
|
|
'mobile_phone|cardnum|card_key' => ['like', '%' . $vip_phone . '%'],
|
|
'merchantid' => $this->merchant_id,
|
|
'status' => 1,
|
|
];
|
|
$vip = $retailVip->getFind($vMap);
|
|
if (!$vip) {
|
|
$res['status'] = 1;
|
|
$res['msg'] = '查询成功';
|
|
$res['order_list'] = array();
|
|
$res['customer_order_count'] = 0; //订单数
|
|
$res['refund_order_count'] = 0; //退款订单
|
|
$res['exchange_order_count'] = 0; //换货订单
|
|
$res['refund_money'] = 0; //退款金额
|
|
$this->ajaxReturn($res);
|
|
} else {
|
|
$where["b.vid"] = $vip[$retailVip::ID];
|
|
}
|
|
}
|
|
$order_list = M('retail_bill_order as b')
|
|
->join('ls_retail_bill_online as o on b.id=o.bill_id')
|
|
->join('ls_retail_bill_discount as d on b.id=d.bill_id')
|
|
->join('ls_retail_vip as v on b.vid=v.id', 'LEFT')
|
|
->field('b.*,o.*,o.user_name,o.status,v.mobile_phone as vip_phone,v.name as vip_name')
|
|
->where($where)
|
|
->order('b.id desc')
|
|
->select();
|
|
if ($order_list) {
|
|
foreach ($order_list as $key => &$val) {
|
|
$val['index'] = $key + 1;
|
|
$val['add_time'] = date("Y-m-d H:i:s", $val['add_time']);
|
|
if (!empty($val['vid'])) {
|
|
$val['identity'] = "会员";
|
|
} else {
|
|
$val['identity'] = "散客";
|
|
}
|
|
if ($val['order_type'] == 2) {
|
|
$val['order_name'] = "退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
$val['order_name'] = "换货";
|
|
}
|
|
switch ($val['order_type']) {
|
|
case 2:
|
|
$val['order_type_name'] = "退款订单";
|
|
break;
|
|
case 3:
|
|
$val['order_type_name'] = "换货订单";
|
|
break;
|
|
}
|
|
switch ($val['order_genre']) {
|
|
case 1:
|
|
$val['order_genre_name'] = "普通订单";
|
|
break;
|
|
case 2:
|
|
$val['order_genre_name'] = "拼团订单";
|
|
break;
|
|
case 3:
|
|
$val['order_genre_name'] = "秒杀订单";
|
|
break;
|
|
}
|
|
switch ($val['refund_status']) {
|
|
case 1:
|
|
$val['status_name'] = "待审核";
|
|
break;
|
|
case 2:
|
|
if ($val['order_type'] == 2) {
|
|
$val['status_name'] = "已退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
$val['status_name'] = "已换货";
|
|
}
|
|
break;
|
|
case 3:
|
|
$val['status_name'] = "待客户发货";
|
|
break;
|
|
case 4:
|
|
$val['status_name'] = "待商家收货";
|
|
break;
|
|
case 5:
|
|
if ($val['order_type'] == 2) {
|
|
$val['status_name'] = "待退款";
|
|
} else if ($val['order_type'] == 3) {
|
|
switch ($val['status']) {
|
|
case 1:
|
|
$val['status_name'] = "待商家发货";
|
|
break;
|
|
case 2:
|
|
$val['status_name'] = "商家已发货";
|
|
break;
|
|
case 3:
|
|
$val['status_name'] = "客户已收货";
|
|
break;
|
|
}
|
|
if ($val['status'] == 1 || $val['status'] == 2) {
|
|
switch ($val['delivery_type']) {
|
|
case 1:
|
|
if ($val['status'] == 1) {
|
|
$val['order_status'] = 0;
|
|
}
|
|
break;
|
|
case 2:
|
|
$DaOrderModel = D('RetailDaOrder');
|
|
$clerkinfo = $DaOrderModel->getOrderFind(array("order_no" => strval($val["order_no"]), $DaOrderModel::ID => $val["delivery_record_id"]), '*', 'id desc');
|
|
$val['order_status'] = $clerkinfo["order_status"];
|
|
break;
|
|
case 3:
|
|
//Uu配送转成达达订单状态显示
|
|
$uuOrderModel = D('RetailUuOrder');
|
|
$state_uu = $uuOrderModel->getOrderFindField(array("origin_id" => $val["id"], "id" => $val["delivery_record_id"]), "state", 'id desc');
|
|
if ($state_uu == 1) {
|
|
$val['order_status'] = 1; //待接单
|
|
} else if ($state_uu == 3 || $state_uu == 4) {
|
|
$val['order_status'] = 2; //待取货
|
|
} else if ($state_uu == 5 || $state_uu == 6) {
|
|
$val['order_status'] = 3; //配送中
|
|
} else {
|
|
$val['order_status'] = 4; //已收货
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
$val['status_name'] = "驳回请求";
|
|
break;
|
|
case 7:
|
|
$val['status_name'] = "客户撤销申请";
|
|
break;
|
|
}
|
|
//优惠金额
|
|
$val['discount_amount'] = round($val["coupon_money"] + $val["vip_dis_money"] + $val['vip_less_money'], 2);
|
|
//积分抵扣
|
|
$val['integral_dis_money'] = floatval($val['integral_dis_money']);
|
|
}
|
|
}
|
|
$headArr = array(
|
|
array('index', '序号'),
|
|
array('order_no', '单号'),
|
|
array('vip_phone', '会员手机号'),
|
|
array('all_money', '金额'),
|
|
array('add_time', '申请时间'),
|
|
array('user_name', '联系人'),
|
|
array('user_phone', '联系人手机号'),
|
|
array('user_address', '地址'),
|
|
array('order_genre_name', '来源'),
|
|
array('order_type_name', '订单类型'),
|
|
array('status_name', '状态')
|
|
);
|
|
$name = "售后订单";
|
|
$str = $name . '导出时间' . date('Y-m-d H:i:s', time());
|
|
getExcel($name, $headArr, $order_list, $str);
|
|
}
|
|
|
|
|
|
/******************************线下售后订单列表****开始****************************************/
|
|
|
|
/**
|
|
* 获取线下售后订单列表
|
|
*/
|
|
public function getLineOrderList()
|
|
{
|
|
$data = I("post.");
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$BillOrder = new BillOrder();
|
|
$this->ajaxReturn($BillOrder->getLineRefundOrderList($data));
|
|
}
|
|
|
|
|
|
/**
|
|
* 获取线下售后订单数据统计
|
|
*/
|
|
public function getLineOrderSumData()
|
|
{
|
|
$data = I("post.");
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$BillOrder = new BillOrder();
|
|
$this->ajaxReturn($BillOrder->getLineRefundOrderSumData($data));
|
|
}
|
|
|
|
|
|
/**
|
|
* 导出线下售后订单列表
|
|
*/
|
|
public function exportLineOrder()
|
|
{
|
|
$data = I("get.");
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$data['is_export'] = 1;
|
|
$BillOrder = new BillOrder();
|
|
$result = $BillOrder->getLineRefundOrderList($data);
|
|
$headArr = array(
|
|
array('index', '序号'),
|
|
array('order_no', '退款单号'),
|
|
array('refund_no', '购买单号'),
|
|
array('all_money', '金额'),
|
|
array('pay_type_name', '支付类型'),
|
|
array('refund_money', '已退金额'),
|
|
array('wait_refund_money', '待退金额'),
|
|
array('add_time', '申请时间'),
|
|
array('status_name', '状态'),
|
|
array('identity', '客户'),
|
|
array('vip_phone', '会员手机号'),
|
|
array('vip_name', '会员姓名'),
|
|
array('vip_nickname', '会员昵称'),
|
|
);
|
|
$name = "线下退款订单";
|
|
$str = $name . '共' . $result['data']['count'] . '条数据,导出时间' . date('Y-m-d H:i:s', time());
|
|
getExcel($name, $headArr, $result['data']['list'], $str);
|
|
}
|
|
|
|
/**
|
|
* 线下退款失败订单继续退款
|
|
*/
|
|
public function lineOrderRefund()
|
|
{
|
|
$data = I("post.");
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$BillOrder = new BillOrder();
|
|
$this->ajaxReturn($BillOrder->failOrderRefund($data));
|
|
}
|
|
|
|
/******************************线下售后订单列表****结束****************************************/
|
|
|
|
|
|
//串号修改
|
|
public function serialModify()
|
|
{
|
|
$data = I('post.');
|
|
$data['user_type'] = 4;
|
|
$data['operator_type'] = 1;
|
|
$data['merchant_id'] = $this->merchant_id;
|
|
$data['store_id'] = $this->store_id;
|
|
$data['operator_id'] = session("jurisdiction_user")['id'];
|
|
$SerialClass = new SerialNumberGoods();
|
|
$result = $SerialClass->serialModify($data);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
|
|
//串号修改记录
|
|
public function serialModifyRecord()
|
|
{
|
|
$data = I('post.');
|
|
$SerialClass = new SerialNumberGoods();
|
|
$result = $SerialClass->serialModifyRecord($data);
|
|
$this->ajaxReturn($result);
|
|
}
|
|
|
|
/**
|
|
* 骑手配送发货
|
|
*/
|
|
public function riderDelivery()
|
|
{
|
|
$data = I('post.');
|
|
$order_id = $data['order_id'];
|
|
$delivery_fee = $data['delivery_fee'];
|
|
$estimated_time = $data['estimated_time'];
|
|
$delivery_distance = $data['delivery_distance'];
|
|
$remark = $data['remark'];
|
|
|
|
if (empty($order_id)) {
|
|
$this->ajaxReturn(['code' => 0, 'msg' => '订单ID不能为空']);
|
|
}
|
|
|
|
// 获取订单信息
|
|
$orderModel = M('retail_order');
|
|
$order = $orderModel->where(['id' => $order_id, 'merchant_id' => $this->merchant_id])->find();
|
|
|
|
if (!$order) {
|
|
$this->ajaxReturn(['code' => 0, 'msg' => '订单不存在']);
|
|
}
|
|
|
|
if ($order['order_status'] != 2) {
|
|
$this->ajaxReturn(['code' => 0, 'msg' => '订单状态不正确,无法发货']);
|
|
}
|
|
|
|
// 准备发货数据
|
|
$expressData = [
|
|
'order_id' => $order_id,
|
|
'logistics_type' => 7, // 骑手配送
|
|
'logistics_name' => '骑手配送',
|
|
'logistics_no' => 'RIDER' . date('YmdHis') . rand(1000, 9999),
|
|
'delivery_fee' => $delivery_fee,
|
|
'estimated_time' => $estimated_time,
|
|
'delivery_distance' => $delivery_distance,
|
|
'remark' => $remark,
|
|
'merchant_id' => $this->merchant_id,
|
|
'store_id' => $this->store_id,
|
|
'operator_id' => session("jurisdiction_user")['id']
|
|
];
|
|
|
|
// 调用Api/Express的toSendGoods方法处理发货
|
|
$apiExpress = A('Api/Express');
|
|
$result = $apiExpress->toSendGoods($expressData);
|
|
|
|
if ($result['code'] == 1) {
|
|
// 发货成功,同步到骑手端
|
|
$this->syncToRiderSystem($order, $expressData);
|
|
$this->ajaxReturn(['code' => 1, 'msg' => '骑手配送发货成功']);
|
|
} else {
|
|
$this->ajaxReturn(['code' => 0, 'msg' => $result['msg'] ?: '发货失败']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 同步订单到骑手系统
|
|
*/
|
|
private function syncToRiderSystem($order, $expressData)
|
|
{
|
|
// 获取骑手配置
|
|
$riderConfigModel = M('rider_config');
|
|
$config = $riderConfigModel->where(['merchant_id' => $this->merchant_id])->find();
|
|
|
|
if (!$config || !$config['auto_sync_orders']) {
|
|
return; // 未开启自动同步
|
|
}
|
|
|
|
// 准备同步数据
|
|
$syncData = [
|
|
'order_id' => $order['id'],
|
|
'order_no' => $order['order_no'],
|
|
'customer_name' => $order['consignee'],
|
|
'customer_phone' => $order['mobile'],
|
|
'customer_address' => $order['address'],
|
|
'delivery_fee' => $expressData['delivery_fee'],
|
|
'estimated_time' => $expressData['estimated_time'],
|
|
'delivery_distance' => $expressData['delivery_distance'],
|
|
'remark' => $expressData['remark'],
|
|
'merchant_id' => $this->merchant_id,
|
|
'store_id' => $this->store_id,
|
|
'status' => 1, // 待接单
|
|
'create_time' => time(),
|
|
'update_time' => time()
|
|
];
|
|
|
|
// 插入到骑手订单表
|
|
$riderOrderModel = M('rider_orders');
|
|
$riderOrderModel->add($syncData);
|
|
}
|
|
} |