likeshop/server/application/admin/logic/VerificationLogic.php
2025-07-27 21:42:34 +08:00

362 lines
14 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | likeshop开源商城系统
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
// | gitee下载https://gitee.com/likeshop_gitee
// | github下载https://github.com/likeshop-github
// | 访问官网https://www.likeshop.cn
// | 访问社区https://home.likeshop.cn
// | 访问手册http://doc.likeshop.cn
// | 微信公众号likeshop技术社区
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用未经许可不能去除前后端官方版权标识
// | likeshop系列产品收费版本务必购买商业授权购买去版权授权后方可去除前后端官方版权标识
// | 禁止对系统程序代码以任何目的,任何形式的再发布
// | likeshop团队版权所有并拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeshop.cn.team
// +----------------------------------------------------------------------
namespace app\admin\logic;
use app\common\logic\OrderLogLogic;
use app\common\model\Order;
use app\common\model\OrderLog;
use app\common\model\UserLevel;
use app\common\model\Verification;
use app\common\server\UrlServer;
use think\Db;
use think\facade\Hook;
class VerificationLogic
{
/**
* @notes 列表查询条件
* @param $params
* @return array
* @author ljj
* @date 2021/8/16 5:59 下午
*/
public static function getWhere($params)
{
$where = [];
$where[] = ['o.del', '=', 0];
$where[] = ['o.delivery_type', '=', 2];
//提货码
if (!empty($params['pickup_code'])) {
$where[] = ['o.pickup_code', 'like', '%'.$params['pickup_code'].'%'];
}
//核销状态
if (isset($params['verification_status']) && $params['verification_status'] != '') {
$where[] = ['o.verification_status', '=', $params['verification_status']];
}
//订单搜素
if (!empty($params['search_key']) && !empty($params['keyword'])) {
$keyword = $params['keyword'];
switch ($params['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 'consignee':
$where[] = ['consignee', 'like', '%' . $keyword . '%'];
break;
case 'consignee_mobile':
$where[] = ['o.mobile', 'like', '%' . $keyword . '%'];
break;
}
}
//商品名称
if (!empty($params['goods_name'])) {
$where[] = ['g.goods_name', 'like', '%' . $params['goods_name'] . '%'];
}
//订单类型
if (!empty($params['order_type'])) {
$where[] = ['o.order_type', '=', $params['order_type']];
}
//订单来源
if (!empty($params['order_source'])) {
$where[] = ['o.order_source', '=', $params['order_source']];
}
//付款方式
if (!empty($params['pay_way'])) {
$where[] = ['o.pay_way', '=', $params['pay_way']];
}
//下单时间
if (!empty($params['start_time'])) {
$where[] = ['o.create_time', '>=', strtotime($params['start_time'])];
}
if (!empty($params['end_time'])) {
$where[] = ['o.create_time', '<=', strtotime($params['end_time'])];
}
return $where;
}
/**
* @notes 自提订单列表
* @param $params
* @return array
* @author ljj
* @date 2021/8/16 6:09 下午
*/
public static function lists($params)
{
$order = new Order();
$where = self::getWhere($params);
$field = 'o.*,pay_way as pay_way_text,ss.name as shop_name';
$count = $order
->alias('o')
->field($field)
->join('user u', 'u.id = o.user_id')
->join('order_goods g', 'g.order_id = o.id')
->join('selffetch_shop ss', 'ss.id = o.selffetch_shop_id')
->with(['order_goods', 'user.level'])
->where($where)
->group('o.id')
->count();
$lists = $order
->alias('o')
->field($field)
->join('user u', 'u.id = o.user_id')
->join('order_goods g', 'g.order_id = o.id')
->join('selffetch_shop ss', 'ss.id = o.selffetch_shop_id')
->with(['order_goods', 'user.level'])
->where($where)
->append(['delivery_address', 'order_type_text', 'user.base_avatar', 'order_source_text','verification_status_text'])
->page($params['page'], $params['limit'])
->order('o.id desc')
->group('o.id')
->select()->toArray();
foreach ($lists as &$list){
foreach ($list['order_goods'] as &$order_goods){
$order_good_info = json_decode($order_goods['goods_info'], true);
$order_goods['goods_name'] = $order_good_info['goods_name'];
$order_goods['spec_value'] = $order_good_info['spec_value_str'];
$order_goods['image'] = empty($order_good_info['spec_image']) ?
UrlServer::getFileUrl($order_good_info['image']) : UrlServer::getFileUrl($order_good_info['spec_image']);
}
$list['delivery_type'] = Order::getDeliveryType($list['delivery_type']);
$list['user_level'] = $list['user']['level']['name'] ?? '无等级';
$list['verifier_name'] = '-';
$list['verification_time'] = '-';
if ($list['verification_status'] == Order::WRITTEN_OFF) {
$verification = Verification::where('order_id',$list['id'])->json(['snapshot'],true)->find();
$list['verification_time'] = date('Y-m-d H:i:s',$verification['create_time']);
$list['verifier_name'] = $verification['snapshot']['name'];
}
}
return ['count' => $count, 'lists' => $lists];
}
/**
* @notes 导出自提订单列表
* @param $params
* @return array
* @author ljj
* @date 2021/8/16 7:55 下午
*/
public static function exportFile($params)
{
$where = self::getWhere($params);
$field = 'o.*,o.order_type as order_type_text, o.order_source as order_source_text,o.pay_way as pay_way_text,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',
'selffetch_shop' => function ($query) {
$query->field([ 'id', 'name', 'address', 'district', 'city', 'province' ])->append([ 'shop_address' ]);
}
])
->field($field)
->where($where)
->append([ 'verification_status_text', 'order_status_text' ])
->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){
$item['delivery_type'] = Order::getDeliveryType($item['delivery_type']);
$orderSn = 'SN'.$item['order_sn']; // 转字符串
$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']. '】';
}
$item['verifier_name'] = '-';
$item['verification_time'] = '-';
if ($item['verification_status'] == Order::WRITTEN_OFF) {
$verification = Verification::where('order_id',$item['id'])->json(['snapshot'],true)->find();
$item['verification_time'] = date('Y-m-d H:i:s',$verification['create_time']);
$item['verifier_name'] = $verification['snapshot']['name'];
}
$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['integral_amount'], $item['order_amount'], $item['pay_way_text'],
$item['delivery_type'], $item['selffetch_shop']['name'] ?? '', $item['selffetch_shop']['shop_address'] ?? '', $item['consignee'], $item['mobile'], $item['pickup_code'],
$item['verification_status_text'], $item['order_status_text'], $item['verifier_name'], $item['verification_time'],
];
}
return ['exportTitle'=> $exportTitle, 'exportData' => $exportData, 'exportExt'=>$exportExt, 'exportName'=>'自提订单列表'.date('Y-m-d H:i:s')];
}
/**
* @notes 提货核销
* @param $params
* @return bool|string
* @author ljj
* @date 2021/8/17 10:09 上午
*/
public static function verification($params)
{
// 启动事务
Db::startTrans();
try {
$order = Order::find($params['id']);
//添加核销记录
$snapshot = [
'sn' => $params['admin_info']['account'],
'name' => $params['admin_info']['name']
];
$verification = new Verification;
$verification->order_id = $params['id'];
$verification->selffetch_shop_id = $order['selffetch_shop_id'];
$verification->handle_id = $params['admin_info']['id'];
$verification->verification_scene = Verification::TYPE_ADMIN;
$verification->snapshot = json_encode($snapshot);
$verification->create_time = time();
$verification->save();
//更新订单状态
$order->order_status = Order::STATUS_FINISH;
$order->verification_status = Order::WRITTEN_OFF;
$order->update_time = time();
$order->confirm_take_time = time();
$order->save();
//订单日志
OrderLogLogic::record(
OrderLog::TYPE_SHOP,
OrderLog::SHOP_VERIFICATION,
$params['id'],
$params['admin_info']['id'],
OrderLog::SHOP_VERIFICATION
);
// 赠送成长值和积分
Hook::listen('give_reward', [
'order_id' => $params['id'],
'scene' => 3, //3=订单完成
]);
// 提交事务
Db::commit();
return true;
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
return $e->getMessage();
}
}
/**
* @notes 提货核销详情
* @param $id
* @return Order
* @author ljj
* @date 2021/8/17 10:00 上午
*/
public static function verificationInfo($id)
{
$detail = Order::alias('o')
->join('selffetch_shop ss', 'ss.id = o.selffetch_shop_id')
->with('order_goods')
->where('o.id',$id)
->field('o.id,o.pickup_code,ss.name as shop_name,o.consignee,o.mobile')
->find();
foreach ($detail['order_goods'] as &$order_goods) {
$info = json_decode($order_goods['goods_info'], true);
$order_goods['goods_name'] = $info['goods_name'];
$order_goods['spec_value'] = $info['spec_value_str'];
$order_goods['goods_image'] = empty($info['spec_image']) ?
UrlServer::getFileUrl($info['image']) : UrlServer::getFileUrl($info['spec_image']);
}
return $detail;
}
/**
* @notes 核销查询
* @param $id
* @return Order
* @author ljj
* @date 2021/8/17 11:47 上午
*/
public static function verificationQuery($id)
{
$detail = Order::alias('o')
->join('selffetch_shop ss', 'ss.id = o.selffetch_shop_id')
->join('verification v', 'o.id = v.order_id')
->with('order_goods')
->where('o.id',$id)
->field('o.id,ss.name as shop_name,o.consignee,o.mobile,v.snapshot,v.create_time as verification_time')
->json(['snapshot'],true)
->find();
foreach ($detail['order_goods'] as &$order_goods) {
$info = json_decode($order_goods['goods_info'], true);
$order_goods['goods_name'] = $info['goods_name'];
$order_goods['spec_value'] = $info['spec_value_str'];
$order_goods['goods_image'] = empty($info['spec_image']) ?
UrlServer::getFileUrl($info['image']) : UrlServer::getFileUrl($info['spec_image']);
}
$detail['verification_time'] = date('Y-m-d H:i:s',$detail['verification_time']);
return $detail;
}
}