1160 lines
42 KiB
PHP
1160 lines
42 KiB
PHP
<?php
|
|
|
|
namespace app\admin\logic;
|
|
|
|
use app\common\logic\OrderRefundLogic;
|
|
use app\common\model\MessageScene_;
|
|
use app\common\model\NoticeSetting;
|
|
use app\common\model\Order;
|
|
use app\common\model\OrderGoods;
|
|
use app\common\model\OrderLog;
|
|
use app\common\logic\OrderLogLogic;
|
|
use app\common\model\Pay;
|
|
use app\common\model\UserLevel;
|
|
use app\common\server\ConfigServer;
|
|
use app\common\server\UrlServer;
|
|
use app\common\server\YlyPrinter;
|
|
use expressage\Kd100;
|
|
use expressage\Kdniao;
|
|
use think\Db;
|
|
use think\Exception;
|
|
use think\facade\Cache;
|
|
use think\facade\Env;
|
|
use think\facade\Hook;
|
|
|
|
class OrderLogic
|
|
{
|
|
|
|
/**
|
|
* Notes: 列表查询条件
|
|
* @param $get
|
|
* @return array
|
|
* @author 段誉(2021/2/1 10:12)
|
|
*/
|
|
public static function getListsCondition($get)
|
|
{
|
|
$where = [];
|
|
if ($get['type'] != 66){
|
|
//订单状态
|
|
if ($get['type'] != '') {
|
|
$where[] = ['pay_status', '=', $get['type']];
|
|
}
|
|
$where[] = ['del', '=', 0];
|
|
}else{
|
|
$where[] = ['del', '=', 1];
|
|
}
|
|
//订单编号查询
|
|
if (isset($get['order_sn']) && $get['order_sn'] != '') {
|
|
$where[] = ['order_sn', 'like', '%' . $get['order_sn'] . '%'];
|
|
}
|
|
//客户姓名查询
|
|
if (isset($get['name']) && $get['name'] != '') {
|
|
$where[] = ['consignee', 'like', '%' . $get['name'] . '%'];
|
|
}
|
|
//客户的电话查询
|
|
if (isset($get['mobile']) && $get['mobile'] != '') {
|
|
$where[] = ['mobile', 'like', '%' . $get['mobile'] . '%'];
|
|
}
|
|
//商品名称
|
|
if (isset($get['goods_name']) && $get['goods_name'] != '') {
|
|
$where[] = ['goods_name', 'like', '%' . $get['goods_name'] . '%'];
|
|
}
|
|
|
|
//商品名称
|
|
if (isset($get['goods_id']) && $get['goods_id'] != '') {
|
|
$where[] = ['goods_id', '=', $get['goods_id']];
|
|
}
|
|
//付款方式
|
|
if (isset($get['order_ysck']) && $get['order_ysck'] != '') {
|
|
$where[] = ['order_ysck', '=', $get['order_ysck']];
|
|
}
|
|
//付款方式
|
|
if (isset($get['channel_id']) && $get['channel_id'] != '') {
|
|
$where[] = ['channel_id', '=', $get['channel_id']];
|
|
}
|
|
|
|
|
|
//付款方式
|
|
if (isset($get['pay_way']) && $get['pay_way'] != '') {
|
|
$where[] = ['pay_way', '=', $get['pay_way']];
|
|
}
|
|
//付款方式
|
|
if (isset($get['admin_id']) && $get['admin_id'] != '') {
|
|
$where[] = ['admin_id', '=', $get['admin_id']];
|
|
}
|
|
|
|
|
|
//配送方式
|
|
if (isset($get['delivery_type']) && $get['delivery_type'] != '') {
|
|
$where[] = ['delivery_type', '=', $get['delivery_type']];
|
|
}
|
|
|
|
//订单类型
|
|
if (isset($get['order_type']) && $get['order_type'] != '') {
|
|
$where[] = ['admin_id', '=', NULL];
|
|
}
|
|
|
|
//订单来源
|
|
if (isset($get['order_source']) && $get['order_source'] != '') {
|
|
$where[] = ['order_source', '=', $get['order_source']];
|
|
}
|
|
|
|
//下单时间
|
|
if (isset($get['start_time']) && $get['start_time'] != '') {
|
|
$where[] = ['create_time', '>=', strtotime($get['start_time'])];
|
|
}
|
|
if (isset($get['end_time']) && $get['end_time'] != '') {
|
|
$where[] = ['create_time', '<=', strtotime($get['end_time'])];
|
|
}
|
|
return $where;
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 列表
|
|
* @param $get
|
|
* @return array
|
|
* @author 段誉(2021/2/1 10:12)
|
|
*/
|
|
public static function lists($get)
|
|
{
|
|
$order = new Order();
|
|
$where = self::getListsCondition($get);
|
|
$field = 'o.*,order_status as order_status_text,pay_way as pay_way_text';
|
|
$brand = Db::name('goods_brand')->column('name', 'id'); //订单类型
|
|
$admin = Db::name('admin')->column('name', 'id');
|
|
$count = $order
|
|
->where($where)
|
|
->count();
|
|
|
|
$lists = $order
|
|
->where($where)
|
|
->page($get['page'], $get['limit'])
|
|
->order('id desc')
|
|
->select();
|
|
$channel = Db::name('orderchannel')->column('name', 'id');
|
|
foreach ($lists as &$item) {
|
|
if (isset($channel[$item['channel_id']])) {
|
|
$item['channel'] = $channel[$item['channel_id']];
|
|
}
|
|
if (isset($brand[$item['type_id']])) {
|
|
$item['brand'] = $brand[$item['type_id']];
|
|
}
|
|
if (isset($admin[$item['admin_id']])) {
|
|
$item['admin_id'] = $admin[$item['admin_id']];
|
|
}
|
|
|
|
|
|
//获取订单的商品
|
|
$goods = GoodsLogic::goodsinfo($item['goods_id']);
|
|
if ($goods) {
|
|
$item['goods_name'] = $goods['name'];
|
|
$item['goods_image'] = UrlServer::getFileUrl($goods['image']);
|
|
$item['code'] = $goods['code'];
|
|
} else {
|
|
$item['goods_name'] = '';
|
|
$item['goods_image'] = '';
|
|
$item['code'] = '';
|
|
}
|
|
|
|
$gord_id = Db::name('collection')->where('id', $item['gord_id'])->find();
|
|
if ($gord_id) {
|
|
$item['gord_name'] = $gord_id['cqname'];
|
|
} else {
|
|
$item['gord_name'] = '-';
|
|
}
|
|
}
|
|
|
|
return ['count' => $count, 'lists' => $lists];
|
|
}
|
|
|
|
public static function exportFile($get)
|
|
{
|
|
$where[] = ['o.del', '=', 0];
|
|
|
|
//订单状态
|
|
if ($get['type'] != '') {
|
|
$where[] = ['order_status', '=', $get['type']];
|
|
}
|
|
|
|
//订单搜素
|
|
if (!empty($get['search_key']) && !empty($get['keyword'])) {
|
|
$keyword = $get['keyword'];
|
|
switch ($get['search_key']) {
|
|
case 'order_sn':
|
|
$where[] = ['o.order_sn', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'user_sn':
|
|
$where[] = ['u.sn', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'nickname':
|
|
$where[] = ['nickname', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'user_mobile':
|
|
$where[] = ['u.mobile', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'consignee':
|
|
$where[] = ['consignee', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'consignee_mobile':
|
|
$where[] = ['o.mobile', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
//商品名称
|
|
if (isset($get['goods_name']) && $get['goods_name'] != '') {
|
|
$where[] = ['g.name', 'like', '%' . $get['goods_name'] . '%'];
|
|
}
|
|
|
|
//付款方式
|
|
if (isset($get['pay_way']) && $get['pay_way'] != '') {
|
|
$where[] = ['o.pay_way', '=', $get['pay_way']];
|
|
}
|
|
|
|
//配送方式
|
|
if (isset($get['delivery_type']) && $get['delivery_type'] != '') {
|
|
$where[] = ['o.delivery_type', '=', $get['delivery_type']];
|
|
}
|
|
|
|
//订单类型
|
|
if (isset($get['order_type']) && $get['order_type'] != '') {
|
|
$where[] = ['o.order_type', '=', $get['order_type']];
|
|
}
|
|
|
|
//订单来源
|
|
if (isset($get['order_source']) && $get['order_source'] != '') {
|
|
$where[] = ['o.order_source', '=', $get['order_source']];
|
|
}
|
|
|
|
//下单时间
|
|
if (isset($get['start_time']) && $get['start_time'] != '') {
|
|
$where[] = ['o.create_time', '>=', strtotime($get['start_time'])];
|
|
}
|
|
if (isset($get['end_time']) && $get['end_time'] != '') {
|
|
$where[] = ['o.create_time', '<=', strtotime($get['end_time'])];
|
|
}
|
|
|
|
$field = 'o.*,o.order_type as order_type_text, o.order_source as order_source_text,o.pay_way as pay_way_text,address as delivery_address,o.pay_status as pay_status_text,o.order_status as order_status_text,u.sn as user_sn,u.nickname as user_nickname,u.level as user_level';
|
|
|
|
$lists = Order::alias('o')
|
|
->join('user u', 'u.id=o.user_id')
|
|
->join('order_goods og', 'og.order_id=o.id')
|
|
->join('goods g', 'g.id=og.goods_id')
|
|
->with('order_goods')
|
|
->field($field)
|
|
->where($where)
|
|
->order('o.id', 'desc')
|
|
->group('og.order_id')
|
|
->select()
|
|
->toArray();
|
|
|
|
$userLevel = UserLevel::where('del', 0)->column(['id', 'name'], 'id');
|
|
|
|
$exportTitle = ['订单编号', '订单类型', '下单时间', '支付时间', '订单来源', '会员编号', '会员昵称', '会员等级', '商品信息', '商品数量', '运费金额', '商品总金额', '优惠金额', '应付金额', '支付方式', '收货人', '手机号码', '收货地址', '配送方式', '支付状态', '订单状态'];
|
|
$exportExt = 'xls';
|
|
$exportData = [];
|
|
foreach ($lists as $item) {
|
|
$orderSn = 'SN' . $item['order_sn']; // 转字符串
|
|
$level = isset($userLevel[$item['user_level']]) ? $userLevel[$item['user_level']] : '无等级';
|
|
$deliveryType = Order::getDeliveryType($item['delivery_type']);
|
|
$goodsStr = '';
|
|
foreach ($item['order_goods'] as $subItem) {
|
|
$goodsInfo = json_decode($subItem['goods_info'], true);
|
|
$goodsStr .= '【' . $goodsInfo['goods_name'] . ' 规格:' . $goodsInfo['spec_value_str'] . ' 数量:' . $subItem['goods_num'] . '】';
|
|
}
|
|
$exportData[] = [$orderSn, $item['order_type_text'], $item['create_time'], $item['pay_time'], $item['order_source_text'], $item['user_sn'], $item['user_nickname'], $level, $goodsStr, $item['total_num'], $item['shipping_price'], $item['goods_price'], $item['discount_amount'], $item['order_amount'], $item['pay_way_text'], $item['consignee'], $item['mobile'], $item['delivery_address'], $deliveryType, $item['pay_status_text'], $item['order_status_text']];
|
|
}
|
|
return ['exportTitle' => $exportTitle, 'exportData' => $exportData, 'exportExt' => $exportExt, 'exportName' => '订单列表' . date('Y-m-d H:i:s')];
|
|
}
|
|
|
|
|
|
public static function exportorder($get)
|
|
{
|
|
$where[] = ['o.del', '=', 0];
|
|
$where = self::getListsCondition($get);
|
|
$lists = Db::name('order')->where($where)->select(); //获取订单的内容
|
|
|
|
$exportData = [];
|
|
foreach ($lists as $item) {
|
|
$orderSn = 'DL' . $item['order_sn']; // 转字符串
|
|
$goods = Db::name('goods')->where('id', $item['goods_id'])->find(); //获取商品的基本信息
|
|
$ervice = Db::name('order_exe')
|
|
->where('order_sn', $item['order_sn'])
|
|
->where('staff_status', 3)
|
|
->count(); //查询服务条数
|
|
|
|
if ($item['pay_status'] == 1) {
|
|
$item['order_status_text'] = '已支付';
|
|
} else {
|
|
$item['order_status_text'] = '未支付';
|
|
}
|
|
|
|
$admin = Db::name('admin')->where('id', $item['admin_id'])->find(); //查询客服id
|
|
if ($admin) {
|
|
$admin_name = $admin['name'];
|
|
} else {
|
|
$admin_name = '-';
|
|
}
|
|
|
|
$channe = Db::name('orderchannel')->where('id', $item['channel_id'])->find(); //查询渠道内容
|
|
|
|
if ($channe) {
|
|
$channe_name = $channe['name'];
|
|
} else {
|
|
$channe_name = '-';
|
|
}
|
|
$phone = Db::name('user_address')->where('telephone', $item['mobile'])->find();
|
|
if ($phone) {
|
|
$cnle = Db::name('staffchannel')->where('id', $phone['brand_id'])->find();
|
|
if ($cnle) {
|
|
$custom = $cnle['name'];
|
|
} else {
|
|
$custom = '-';
|
|
}
|
|
}
|
|
$dsynumber = $item['number'] - $ervice;
|
|
|
|
|
|
if ($item['pay_zd'] == 0) {
|
|
$item['pay_zd'] = '已收款';
|
|
} else {
|
|
$item['pay_zd'] = '未收款';
|
|
}
|
|
$exportData[] = [$orderSn, $item['consignee'], $item['mobile'], $item['address'], $admin_name, $goods['name'], $goods['min_price'],
|
|
$item['order_amount'], $channe_name, $custom, $item['order_status_text'], $item['pay_zd'], $item['number'], $ervice, $dsynumber, date('Y-m-d H:i:s', $item['create_time'])
|
|
];
|
|
$exportTitle = ['订单序号', '客户姓名', '客户电话', '房屋地址', '订单归属', '套餐名称', '套餐金额', '付款金额', '订单渠道', '客户渠道', '是否收款', '是否支付', '总次数', '已使用', '待使用', '下单时间'];
|
|
$exportExt = 'xls';
|
|
}
|
|
return ['exportTitle' => $exportTitle, 'exportData' => $exportData, 'exportExt' => $exportExt, 'exportName' => '订单列表' . date('Y-m-d H:i:s')];
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 我的订单导出功能
|
|
* @param $get
|
|
* @return array
|
|
* @author 段誉(2021/2/1 10:12)
|
|
*/
|
|
public static function userexport($get)
|
|
{
|
|
|
|
$where = [];
|
|
$where = self::getListsCondition($get);
|
|
$lists = Db::name('order')
|
|
->where($where)
|
|
->where('admin_id', session('admin_info.id'))
|
|
->select(); //获取订单的内容
|
|
|
|
$exportData = [];
|
|
foreach ($lists as $item) {
|
|
$orderSn = 'DL' . $item['order_sn']; // 转字符串
|
|
$goods = Db::name('goods')->where('id', $item['goods_id'])->find(); //获取商品的基本信息
|
|
$ervice = Db::name('order_exe')
|
|
->where('order_sn', $item['order_sn'])
|
|
->where('staff_status', 3)
|
|
->count(); //查询服务条数
|
|
|
|
if ($item['pay_status'] == 1) {
|
|
$item['order_status_text'] = '已支付';
|
|
} else {
|
|
$item['order_status_text'] = '未支付';
|
|
}
|
|
|
|
$admin = Db::name('admin')->where('id', $item['admin_id'])->find(); //查询客服id
|
|
if ($admin) {
|
|
$admin_name = $admin['name'];
|
|
} else {
|
|
$admin_name = '-';
|
|
}
|
|
|
|
$channe = Db::name('orderchannel')->where('id', $item['channel_id'])->find(); //查询渠道内容
|
|
|
|
if ($channe) {
|
|
$channe_name = $channe['name'];
|
|
} else {
|
|
$channe_name = '-';
|
|
}
|
|
$phone = Db::name('user_address')->where('telephone', $item['mobile'])->find();
|
|
if ($phone) {
|
|
$cnle = Db::name('staffchannel')->where('id', $phone['brand_id'])->find();
|
|
if ($cnle) {
|
|
$custom = $cnle['name'];
|
|
} else {
|
|
$custom = '-';
|
|
}
|
|
}
|
|
|
|
if ($item['pay_zd'] == 0) {
|
|
$item['pay_zd'] = '已收款';
|
|
} else {
|
|
$item['pay_zd'] = '未收款';
|
|
}
|
|
$exportData[] = [$orderSn, $item['consignee'], $item['mobile'], $item['address'], $admin_name, $goods['name'], $goods['min_price'],
|
|
$item['order_amount'], $channe_name, $custom, $item['order_status_text'], $item['pay_zd'], date('Y-m-d H:i:s', $item['create_time'])
|
|
];
|
|
$exportTitle = ['订单序号', '客户姓名', '客户电话', '房屋地址', '订单归属', '套餐名称', '套餐金额', '付款金额', '订单渠道', '客户渠道', '是否收款', '是否支付', '下单时间'];
|
|
$exportExt = 'xls';
|
|
}
|
|
|
|
|
|
return ['exportTitle' => $exportTitle, 'exportData' => $exportData, 'exportExt' => $exportExt, 'exportName' => '订单列表' . date('Y-m-d H:i:s')];
|
|
}
|
|
|
|
|
|
// 子订单的导出
|
|
public static function exportFilestaff($get)
|
|
{
|
|
|
|
$where = [];
|
|
|
|
|
|
//订单类型
|
|
if (isset($get['satff']) && $get['satff'] != '') {
|
|
$where[] = ['staff_id', '=', $get['satff']];
|
|
}
|
|
if (isset($get['order_sn']) && $get['order_sn'] != '') {
|
|
$where[] = ['order_sn', '=', $get['order_sn']];
|
|
}
|
|
|
|
|
|
//下单时间
|
|
if (isset($get['start_time']) && $get['start_time'] != '') {
|
|
$where[] = ['autotime', '>=', strtotime($get['start_time'])];
|
|
}
|
|
if (isset($get['end_time']) && $get['end_time'] != '') {
|
|
$where[] = ['autotime', '<=', strtotime($get['end_time'])];
|
|
}
|
|
|
|
$lists = Db::name('order_exe')
|
|
->where($where)
|
|
->select();
|
|
|
|
$exportData = [];
|
|
foreach ($lists as $item) {
|
|
$order = Db::name('order')->where('order_sn', $item['order_sn'])->find(); //主订单的基本信息
|
|
$goods = Db::name('goods')->where('id', $order['goods_id'])->find(); //获取套餐的名称
|
|
if ($goods) {
|
|
$goods['name'] = $goods['name'];
|
|
} else {
|
|
$goods['name'] = '-';
|
|
}
|
|
$coumst = Db::name('orderchannel')->where('id', $order['channel_id'])->find(); //获取订单的渠道
|
|
$staff = Db::name('staff')->where('id', $item['staff_id'])->find(); //获取员工的基本信息
|
|
|
|
$admin = Db::name('admin')->where('id', $order['admin_id'])->find(); //获取客服管家
|
|
|
|
if ($admin) {
|
|
$admin['name'] = $admin['name'];
|
|
} else {
|
|
$admin['name'] = '-';
|
|
}
|
|
if ($coumst) {
|
|
$coumst['name'] = $coumst['name'];
|
|
} else {
|
|
$coumst['name'] = '-';
|
|
}
|
|
if ($staff) {
|
|
$staff['name'] = $staff['name'];
|
|
} else {
|
|
$staff['name'] = '-';
|
|
}
|
|
$xdtime = date('Y-m-d', $order['create_time']); //下单日期
|
|
$autotime = date('Y-m-d', $item['autotime']); //服务日期
|
|
|
|
if ($order['number'] > 12) {
|
|
$item['yeaey'] = '是';
|
|
} else {
|
|
$item['yeaey'] = '否';
|
|
}
|
|
if ($item['addtime'] == 1) {
|
|
$item['addtime'] = '上午';
|
|
} else {
|
|
$item['addtime'] = '下午';
|
|
}
|
|
$tiem['sfsk'] = $order['integral_amount'];
|
|
$adder = Db::name('dev_region')->where('id', $order['district'])->find(); //获取到地区信息
|
|
$adderss = Db::name('user_address')->where('telephone', $order['mobile'])->find(); //客户的房屋地址
|
|
|
|
if ($adderss) {
|
|
$couadderss = Db::name('admin')->where('id', $adderss['admin_id'])->find();
|
|
if ($couadderss) {
|
|
$couadderss['name_adder'] = $couadderss['name'];
|
|
}
|
|
}
|
|
|
|
if ($adder) {
|
|
$adder = $adder['name'];
|
|
} else {
|
|
$adder['name'] = '-';
|
|
}
|
|
|
|
$timeadd = Db::name('order_timeadd')
|
|
->where('orderid', $item['id'])
|
|
->where('status', 2)
|
|
->find();
|
|
if ($timeadd) {
|
|
$item['addtimes'] = $timeadd['minute'] / 60;
|
|
} else {
|
|
$item['addtimes'] = 0;
|
|
}
|
|
|
|
if ($item['staff_status'] == 0) {
|
|
$item['statusdd'] = "等待接单";
|
|
}
|
|
if ($item['staff_status'] == 1) {
|
|
$item['statusdd'] = "等待上门";
|
|
}
|
|
if ($item['staff_status'] == 2) {
|
|
$item['statusdd'] = "等待服务";
|
|
}
|
|
if ($item['staff_status'] == 3) {
|
|
$item['statusdd'] = "服务完成";
|
|
}
|
|
$exportData[] = [
|
|
$order['order_sn'],
|
|
$order['mobile'], $order['consignee'],
|
|
$adder,
|
|
$order['address'],
|
|
$goods['name'],//套餐名称
|
|
$xdtime, $autotime,
|
|
$item['addtime'],
|
|
$item['statusdd']
|
|
, $order['order_amount'], $tiem['sfsk'],
|
|
$item['addtimes'], $item['add'], $item['yeaey']
|
|
, $order['number'], $order['code'],
|
|
$coumst['name'],
|
|
$staff['name'], $item['account'],
|
|
$admin['name'],
|
|
$couadderss['name_adder'],
|
|
$item['remark']];
|
|
|
|
$exportTitle = ['订单编号', '手机号码', '客户名称', '区', '详细地址', '套餐名称', '下单日期', '服务日期', '上午/下午', '服务状态', '订单总金额', '优惠券抵用金额', '加时', '是否收款', '是否年卡', ' 总次数', '剩余次数', '渠道', '员工姓名', '报销', '订单归属', '客户归属', '订单备注'];
|
|
$exportExt = 'xls';
|
|
}
|
|
return ['exportTitle' => $exportTitle, 'exportData' => $exportData, 'exportExt' => $exportExt, 'exportName' => '订单列表' . date('Y-m-d H:i:s')];
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 详情
|
|
* @param $id
|
|
* @return Order
|
|
* @author 段誉(2021/2/1 10:12)
|
|
*/
|
|
public static function getDetail($id)
|
|
{
|
|
|
|
$result = Db::name('order')
|
|
->where('id', $id)
|
|
->find();
|
|
$goods = Db::name('goods')->where('id', $result['goods_id'])->find();
|
|
$result['goods_image'] = UrlServer::getFileUrl($goods['image']);
|
|
$result['goods_name'] = $goods['name'];
|
|
if ($result['type'] = 1) {
|
|
$result['type'] = "固定订单";
|
|
} else {
|
|
$result['type'] = "非固定订单";
|
|
}
|
|
$result['create_time'] = date("Y-m-d H:i:s", $result['create_time']);
|
|
if ($result['pay_status'] == 1) {
|
|
$result['pay_status'] = "已支付";
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Notes: 取消订单(返回商品规格表库存)
|
|
* @param $order_id
|
|
* @param $admin_id
|
|
* @author 段誉(2021/2/1 10:12)
|
|
*/
|
|
public static function cancel($order_id, $admin_id)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
$order = Order::get(['id' => $order_id], ['orderGoods']);
|
|
//取消订单
|
|
OrderRefundLogic::cancelOrder($order_id, OrderLog::TYPE_SHOP, $admin_id);
|
|
//已支付的订单,取消,退款
|
|
if ($order['pay_status'] == Pay::ISPAID) {
|
|
//更新订单状态
|
|
OrderRefundLogic::cancelOrderRefundUpdate($order);
|
|
//订单退款
|
|
OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']);
|
|
}
|
|
Db::commit();
|
|
return true;
|
|
|
|
} catch (\Exception $e) {
|
|
Db::rollback();
|
|
//增加退款失败记录
|
|
OrderRefundLogic::addErrorRefund($order, $e->getMessage());
|
|
return $e->getMessage();
|
|
}
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 删除已取消的订单
|
|
* @param $order_id
|
|
* @param $admin_id
|
|
* @author 段誉(2021/2/1 10:14)
|
|
*/
|
|
public static function del($order_id, $admin_id)
|
|
{
|
|
$order = Order::get(['del' => 0, 'id' => $order_id]);
|
|
$order->save(['del' => 1, 'update_time' => time()]);
|
|
|
|
//订单日志
|
|
OrderLogLogic::record(
|
|
OrderLog::TYPE_SHOP,
|
|
OrderLog::SHOP_DEL_ORDER,
|
|
$order_id,
|
|
$admin_id,
|
|
OrderLog::SHOP_DEL_ORDER
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 物流公司
|
|
* @return array|\PDOStatement|string|\think\Collection
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @throws \think\exception\DbException
|
|
* @author 段誉(2021/2/1 10:15)
|
|
*/
|
|
public static function express()
|
|
{
|
|
return Db::name('express')->where('del', 0)->select();
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 发货操作
|
|
* @param $data
|
|
* @param $admin_id
|
|
* @return bool
|
|
* @throws \think\Exception
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @throws \think\exception\DbException
|
|
* @throws \think\exception\PDOException
|
|
* @author 段誉(2021/2/1 10:15)
|
|
*/
|
|
public static function deliveryHandle($data, $admin_id)
|
|
{
|
|
$order_id = $data['order_id'];
|
|
$order = Order::get(['del' => 0, 'id' => $order_id], ['order_goods']);
|
|
|
|
if ($order['shipping_status'] == 1) {
|
|
return true;
|
|
}
|
|
|
|
$shipping = Db::name('express')->where('id', $data['shipping_id'])->find();
|
|
|
|
//添加发货单
|
|
$delivery_data = [
|
|
'order_id' => $order_id,
|
|
'order_sn' => $order['order_sn'],
|
|
'user_id' => $order['user_id'],
|
|
'admin_id' => $admin_id,
|
|
'consignee' => $order['consignee'],
|
|
'mobile' => $order['mobile'],
|
|
'province' => $order['province'],
|
|
'city' => $order['city'],
|
|
'district' => $order['district'],
|
|
'address' => $order['address'],
|
|
'invoice_no' => $data['invoice_no'],
|
|
'send_type' => $data['send_type'],
|
|
'create_time' => time(),
|
|
];
|
|
//配送方式->快递配送
|
|
if ($data['send_type'] == 1) {
|
|
$delivery_data['shipping_id'] = $data['shipping_id'];
|
|
$delivery_data['shipping_name'] = $shipping['name'];
|
|
$delivery_data['shipping_status'] = 1;
|
|
}
|
|
$delivery_id = Db::name('delivery')->insertGetId($delivery_data);
|
|
|
|
//更新订单下商品的发货状态
|
|
$order->update_time = time();
|
|
$order->shipping_time = time();
|
|
$order->shipping_status = 1;
|
|
$order->order_status = Order::STATUS_WAIT_RECEIVE;
|
|
$order->delivery_id = $delivery_id;
|
|
$order->save();
|
|
|
|
//订单日志
|
|
OrderLogLogic::record(
|
|
OrderLog::TYPE_SHOP,
|
|
OrderLog::SHOP_DELIVERY_ORDER,
|
|
$order_id,
|
|
$admin_id,
|
|
OrderLog::SHOP_DELIVERY_ORDER
|
|
);
|
|
|
|
//发货短信通知
|
|
if ($order->mobile) {
|
|
$nickname = Db::name('user')->where(['id' => $order['user_id']])->value('nickname');
|
|
$send_data = [
|
|
'key' => NoticeSetting::ORDER_DELIVERY_NOTICE,
|
|
'user_id' => $order['user_id'],
|
|
'mobile' => $order->mobile,
|
|
'params' => [
|
|
'order_sn' => $order->order_sn,
|
|
'nickname' => $nickname,
|
|
'time' => date('Y-m-d H:i:s'),
|
|
'invoice_no' => $data['invoice_no'] ?? '',
|
|
'shipping_name' => $delivery_data['shipping_name'] ?? '无需快递',
|
|
'goods_name' => omit_str($order['order_goods'][0]['goods_name'] ?? '商品', 8)
|
|
],
|
|
];
|
|
}
|
|
Hook::listen('sms_send', $send_data);
|
|
|
|
// 赠送成长值和积分
|
|
Hook::listen('give_reward', [
|
|
'order_id' => $order['id'],
|
|
'scene' => 2, //2=发货场景
|
|
]);
|
|
|
|
// 发货模板消息
|
|
Hook::listen('notice', [
|
|
'user_id' => $order['user_id'],
|
|
'order_id' => $order['id'],
|
|
'scene' => NoticeSetting::ORDER_DELIVERY_NOTICE,
|
|
'shipping_name' => $delivery_data['shipping_name'] ?? '无需快递',
|
|
'invoice_no' => $data['invoice_no'] ?? '',
|
|
'time' => date('Y-m-d H:i:s')
|
|
]);
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 确认收货
|
|
* @param $order_id
|
|
* @param $admin_id
|
|
* @author 段誉(2021/2/1 10:16)
|
|
*/
|
|
public static function confirm($order_id, $admin_id)
|
|
{
|
|
$order = Order::get(['del' => 0, 'id' => $order_id]);
|
|
$order->order_status = Order::STATUS_FINISH;
|
|
$order->update_time = time();
|
|
$order->confirm_take_time = time();
|
|
$order->save();
|
|
|
|
// 赠送成长值和积分
|
|
Hook::listen('give_reward', [
|
|
'order_id' => $order_id,
|
|
'scene' => 3, //3=订单完成
|
|
]);
|
|
|
|
//订单日志
|
|
OrderLogLogic::record(
|
|
OrderLog::TYPE_SHOP,
|
|
OrderLog::SHOP_CONFIRM_ORDER,
|
|
$order_id,
|
|
$admin_id,
|
|
OrderLog::SHOP_CONFIRM_ORDER
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 物流信息
|
|
* @param $order_id
|
|
* @return array|\PDOStatement|string|\think\Model|null
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @throws \think\exception\DbException
|
|
* @author 段誉(2021/2/1 10:16)
|
|
*/
|
|
public static function shippingInfo($order_id)
|
|
{
|
|
$shipping = Db::name('delivery')->where('order_id', $order_id)->find();
|
|
if ($shipping) {
|
|
$shipping['create_time_text'] = date('Y-m-d H:i:s', $shipping['create_time']);
|
|
}
|
|
$shipping['traces'] = self::getShipping($order_id);
|
|
return $shipping;
|
|
}
|
|
|
|
|
|
/**
|
|
* Notes: 物流轨迹
|
|
* @param $order_id
|
|
* @return array|bool
|
|
* @throws \think\db\exception\DataNotFoundException
|
|
* @throws \think\db\exception\ModelNotFoundException
|
|
* @throws \think\exception\DbException
|
|
* @author 段誉(2021/2/1 10:16)
|
|
*/
|
|
public static function getShipping($order_id)
|
|
{
|
|
$orderModel = new Order();
|
|
$order = $orderModel->alias('o')
|
|
->field('invoice_no,shipping_name,shipping_id,o.shipping_status')
|
|
->join('delivery d', 'd.order_id = o.id')
|
|
->where(['o.id' => $order_id])
|
|
->find();
|
|
|
|
$express = ConfigServer::get('express', 'way', '', '');
|
|
$app = ConfigServer::get($express, 'appkey', '', '');
|
|
$key = ConfigServer::get($express, 'appsecret', '', '');
|
|
|
|
if (empty($express) || $order['shipping_status'] != 1 || empty($app) || empty($key)) {
|
|
return $traces[] = ['暂无物流信息'];
|
|
}
|
|
|
|
//快递配置设置为快递鸟时
|
|
if ($express === 'kdniao') {
|
|
$expressage = (new Kdniao($key, $app, Env::get('app.app_debug', 'true')));
|
|
$shipping_field = 'codebird';
|
|
} else {
|
|
$expressage = (new Kd100($key, $app, Env::get('app.app_debug', 'true')));
|
|
$shipping_field = 'code100';
|
|
}
|
|
|
|
//快递编码
|
|
$shipping_code = Db::name('express')
|
|
->where(['id' => $order['shipping_id']])
|
|
->value($shipping_field);
|
|
|
|
//获取物流轨迹
|
|
$expressage->logistics($shipping_code, $order['invoice_no']);
|
|
$traces = $expressage->logisticsFormat();
|
|
if ($traces == false) {
|
|
$traces[] = [$expressage->getError()];
|
|
} else {
|
|
foreach ($traces as &$item) {
|
|
$item = array_values(array_unique($item));
|
|
}
|
|
}
|
|
return $traces;
|
|
}
|
|
|
|
/**
|
|
* Notes: 订单备注
|
|
* @param $post
|
|
* @param string $type
|
|
* @return int|string
|
|
* @throws \think\Exception
|
|
* @throws \think\exception\PDOException
|
|
* @author 张无忌(2021/2/1 18:50)
|
|
*/
|
|
public static function remarks($post, $type = "get")
|
|
{
|
|
if ($type === 'get') {
|
|
|
|
return Db::name('order')->field('id,order_remarks')
|
|
->where(['id' => $post['id']])
|
|
->findOrEmpty();
|
|
} else {
|
|
return Db::name('order')
|
|
->where(['id' => $post['id']])
|
|
->update(['order_remarks' => $post['order_remarks']]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Notes:打印接口
|
|
* @param $id int 订单id
|
|
* @return string
|
|
*/
|
|
public static function orderPrint($id)
|
|
{
|
|
try {
|
|
|
|
//打印机配置
|
|
$printer_config = Db::name('printer_config')->where(['status' => 1])->find();
|
|
//打印机列表
|
|
$printer_list = Db::name('printer')->where(['type' => $printer_config['id'], 'del' => 0])->select();
|
|
|
|
if (empty($printer_config) || empty($printer_list)) {
|
|
throw new Exception('请先配置打印机');
|
|
}
|
|
$yly_print = new YlyPrinter($printer_config['client_id'], $printer_config['client_secret']);
|
|
|
|
$order = self::getPrintOrder($id);
|
|
|
|
$template_config = ConfigServer::get('printer', 'yly_template', []);
|
|
$yly_print->ylyPrint($printer_list, $order, $template_config);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
$msg = json_decode($e->getMessage(), true);
|
|
if ($msg && isset($msg['error'])) {
|
|
return '易联云:' . $msg['error_description'];
|
|
}
|
|
if (18 === $e->getCode()) {
|
|
//todo token过期重新拿
|
|
Cache::rm('yly_access_token');
|
|
Cache::rm('yly_refresh_token');
|
|
};
|
|
return '易联云:' . $e->getMessage();
|
|
}
|
|
}
|
|
|
|
public static function getPrintOrder($id)
|
|
{
|
|
$order = new Order();
|
|
$result = $order
|
|
->with(['user', 'order_goods'])
|
|
->where('id', $id)
|
|
->append(['delivery_address'])
|
|
->find();
|
|
|
|
|
|
foreach ($result['order_goods'] as &$order_goods) {
|
|
$info = json_decode($order_goods['goods_info'], true);
|
|
$order_goods['name'] = $info['goods_name'];
|
|
$order_goods['spec_value_str'] = $info['spec_value_str'];
|
|
$order_goods['goods_image'] = empty($info['spec_image']) ? $info['image'] : $info['spec_image'];
|
|
}
|
|
return $result->toArray();
|
|
}
|
|
|
|
//后台增加订单
|
|
public static function add($post)
|
|
{
|
|
$adder = UserLogic::adder($post['user_id']); //获取用户的地址
|
|
$goods = Db::name('goods')->where('id', $post['goods_id'])->find(); //获取商品的ID
|
|
$user = Db::name('user')->where('mobile', $adder['telephone'])->find();
|
|
if ($user) {
|
|
$user['id'] = $user['id'];
|
|
} else {
|
|
$user['id'] = 0;
|
|
}
|
|
|
|
if ($post['gord_id']) {
|
|
$post['gord_id'] = $post['gord_id'];
|
|
} else {
|
|
$post['gord_id'] = 0;
|
|
}
|
|
$post['order_sn'] = createSn('order', 'order_sn', '', 4);
|
|
if ($post['order_ysck'] == 1) {
|
|
$pay_status = 0;
|
|
$order_status = 0;
|
|
} else {
|
|
$pay_status = 1;
|
|
$order_status = 1;
|
|
}
|
|
$data = [
|
|
'order_sn' => $post['order_sn'],
|
|
'goods_id' => $post['goods_id'],
|
|
'user_id' => $user['id'],
|
|
'consignee' => $adder['contact'],
|
|
'province' => $adder['province_id'],
|
|
'city' => $adder['city_id'],
|
|
'district' => $adder['district_id'],
|
|
'address' => $adder['address'],
|
|
'mobile' => $adder['telephone'],
|
|
'lat' => $adder['lat'],
|
|
'lng' => $adder['lng'],
|
|
'goods_price' => $post['total_amount'],
|
|
// 'order_amount'=>$post['total_amount'],
|
|
'order_amount' => $goods['max_price'],
|
|
'total_amount' => $post['total_amount'],
|
|
'pay_zd' => $post['order_ysck'],
|
|
'pay_status' => $pay_status,
|
|
'order_status' => $order_status,
|
|
'code' => $goods['code'],
|
|
'number' => $goods['code'],
|
|
'channel_id' => $post['channel_id'],
|
|
'admin_id' => session('admin_info.id'),
|
|
'order_ysck' => $post['order_ysck'],
|
|
'gord_id' => $post['gord_id'],
|
|
'create_time' => time(),
|
|
'update_time' => time(),
|
|
];
|
|
|
|
return Db::name('order')->data($data)->insert();
|
|
}
|
|
|
|
//根据订单编号获取到订单信息
|
|
public static function orderinfo($order_sn)
|
|
{
|
|
return Db::name('order')->where('order_sn', $order_sn)->find();
|
|
}
|
|
|
|
//根据订单ID获取到订单信息
|
|
public static function orderinfoid($id)
|
|
{
|
|
return Db::name('order')->where('id', $id)->find();
|
|
}
|
|
|
|
public static function userlists($get)
|
|
{
|
|
|
|
$where = [];
|
|
//订单搜素
|
|
if (!empty($get['search_key']) && !empty($get['keyword'])) {
|
|
$keyword = $get['keyword'];
|
|
switch ($get['search_key']) {
|
|
case 'order_sn':
|
|
$where[] = ['o.order_sn', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'user_sn':
|
|
$where[] = ['u.sn', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'nickname':
|
|
$where[] = ['nickname', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'user_mobile':
|
|
$where[] = ['u.mobile', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'consignee':
|
|
$where[] = ['consignee', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
case 'consignee_mobile':
|
|
$where[] = ['o.mobile', 'like', '%' . $keyword . '%'];
|
|
break;
|
|
}
|
|
}
|
|
|
|
//商品名称
|
|
if (isset($get['goods_name']) && $get['goods_name'] != '') {
|
|
$where[] = ['g.name', 'like', '%' . $get['goods_name'] . '%'];
|
|
}
|
|
|
|
//付款方式
|
|
if (isset($get['pay_way']) && $get['pay_way'] != '') {
|
|
$where[] = ['o.pay_way', '=', $get['pay_way']];
|
|
}
|
|
|
|
//配送方式
|
|
if (isset($get['delivery_type']) && $get['delivery_type'] != '') {
|
|
$where[] = ['o.delivery_type', '=', $get['delivery_type']];
|
|
}
|
|
|
|
//订单类型
|
|
if (isset($get['order_type']) && $get['order_type'] != '') {
|
|
$where[] = ['o.order_type', '=', $get['order_type']];
|
|
}
|
|
|
|
//订单来源
|
|
if (isset($get['order_source']) && $get['order_source'] != '') {
|
|
$where[] = ['o.order_source', '=', $get['order_source']];
|
|
}
|
|
|
|
//下单时间
|
|
if (isset($get['start_time']) && $get['start_time'] != '') {
|
|
$where[] = ['o.create_time', '>=', strtotime($get['start_time'])];
|
|
}
|
|
if (isset($get['end_time']) && $get['end_time'] != '') {
|
|
$where[] = ['o.create_time', '<=', strtotime($get['end_time'])];
|
|
}
|
|
|
|
$order = new Order();
|
|
$where = self::getListsCondition($get);
|
|
$field = 'o.*,order_status as order_status_text,pay_way as pay_way_text';
|
|
$brand = Db::name('goods_brand')->where(['del' => 0])->column('name', 'id'); //订单类型
|
|
$count = $order
|
|
->where($where)
|
|
->where('admin_id', session('admin_info.id'))
|
|
->order('id desc')
|
|
->count();
|
|
$lists = $order
|
|
->where($where)
|
|
->where('admin_id', session('admin_info.id'))
|
|
->page($get['page'], $get['limit'])
|
|
->order('id desc')
|
|
->select();
|
|
|
|
$channel = Db::name('orderchannel')->column('name', 'id');
|
|
foreach ($lists as &$item) {
|
|
if (isset($channel[$item['channel_id']])) {
|
|
$item['channel'] = $channel[$item['channel_id']];
|
|
}
|
|
if (isset($brand[$item['type_id']])) {
|
|
$item['brand'] = $brand[$item['type_id']];
|
|
}
|
|
//获取订单的商品
|
|
$goods = Db::name('goods')->where('id', $item['goods_id'])->find();
|
|
if ($goods) {
|
|
$item['goods_name'] = $goods['name'];
|
|
$item['goods_image'] = UrlServer::getFileUrl($goods['image']);
|
|
$item['code'] = $goods['code'];
|
|
} else {
|
|
$item['goods_name'] = '';
|
|
$item['goods_image'] = '';
|
|
$item['code'] = '';
|
|
}
|
|
$gord_id = Db::name('collection')->where('id', $item['gord_id'])->find();
|
|
if ($gord_id) {
|
|
$item['gord_name'] = $gord_id['cqname'];
|
|
} else {
|
|
$item['gord_name'] = '-';
|
|
}
|
|
}
|
|
|
|
return ['count' => $count, 'lists' => $lists];
|
|
}
|
|
|
|
|
|
public static function edit($post)
|
|
{
|
|
if ($post['pay_status'] == 1) {
|
|
$pay = 0;
|
|
} else {
|
|
$pay = 1;
|
|
}
|
|
$res = Db::name('order')->where('id', $post['id'])->update(['consignee' => $post['name'],
|
|
'address' => $post['address'],
|
|
'mobile' => $post['phone'],
|
|
'pay_status' => $pay,
|
|
'order_status' => $pay,
|
|
'province' => $post['first_category_id'],
|
|
'city' => $post['second_category_id'],
|
|
'district' => $post['third_category_id'],
|
|
'lat' => $post['store_longitude'],
|
|
'lng' => $post['store_latitude'],
|
|
'gord_id' => $post['gord_id'],
|
|
'pay_zd' => $post['pay_status'],
|
|
'channel_id' => $post['brand_id'],
|
|
'order_amount' => $post['total_amount']]);
|
|
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* Notes: 后台操作划卡次数
|
|
* @param $post
|
|
* @param string $type
|
|
* @return int|string
|
|
* @throws \think\Exception
|
|
* @throws \think\exception\PDOException
|
|
* @author 张无忌(2021/2/1 18:50)
|
|
*/
|
|
public static function delnumber($post, $type = "get")
|
|
{
|
|
if ($type === 'get') {
|
|
return Db::name('order')->field('id,code')
|
|
->where(['id' => $post['id']])
|
|
->findOrEmpty();
|
|
} else {
|
|
|
|
return Db::name('order')
|
|
->where(['id' => $post['id']])
|
|
->update(['code' => $post['code']]);
|
|
}
|
|
}
|
|
|
|
public static function channel_update($post)
|
|
{
|
|
|
|
$order = Db::name('order')->where('id', $post['id'])->find();
|
|
Db::name('order')->where('id', $post['id'])->update(['channel_id' => $post['channel_id']]);
|
|
$order_exe = Db::name('order_exe')->where('order_sn', $order['order_sn'])->find();
|
|
if ($order_exe) {
|
|
return Db::name('order_exe')->where('order_sn', $order['order_sn'])->update(['channel_id' => $post['channel_id']]);
|
|
}
|
|
return 1;
|
|
|
|
}
|
|
} |