Merge branch 'main' into wxl

pull/1/head
674780036@qq.com 1 year ago
commit 6dcd77de8e
  1. 61
      app/api/common.php
  2. 15
      app/api/controller/StoreKeeper.php
  3. 95
      app/api/controller/User.php
  4. 3
      app/api/service/order/Checkout.php
  5. 32
      app/common.php
  6. 2
      app/common/library/wechat/Qrcode.php
  7. 36
      app/common/model/Order.php
  8. 22
      app/common/model/OrderRefund.php
  9. 2
      app/common/model/wxapp/Setting.php
  10. 118
      app/common/service/qrcode/InviteUser.php
  11. BIN
      app/common/service/qrcode/resource/invite_user.png
  12. 76
      app/store/controller/content/Banner.php
  13. 75
      app/store/model/Banner.php
  14. 16
      app/store/model/GoodsSource.php
  15. 53
      app/store/model/Order.php
  16. 34
      app/store/model/OrderRefund.php
  17. 1
      app/store/model/User.php
  18. 0
      public/store/css/app.fab9b2e3.css
  19. 2
      public/store/index.html
  20. 2
      public/store/js/app.efeaecac.js
  21. 2
      public/store/js/content.1d9035ce.js

@ -27,3 +27,64 @@ function getPlatform(): ?string
}
return $value;
}
/**
* 计算用户和门店距离
* @param float $lat1 用户纬度
* @param float $lon1 用户经度
* @param float $lat2
* @param float $lon2
* @return float
*/
function calculateDistance($lat1, $lon1, $lat2, $lon2): float
{
// 将角度转换为弧度
$degToRad = M_PI / 180;
// 经纬度转换成弧度
$lat1 *= $degToRad;
$lon1 *= $degToRad;
$lat2 *= $degToRad;
$lon2 *= $degToRad;
// 应用Haversine Formula计算球体上两点之间的距离
$dLat = ($lat2 - $lat1);
$dLon = ($lon2 - $lon1);
$a = pow(sin($dLat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dLon/2), 2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$distance = 6371 * $c; // 地球平均半径为6371km
return round($distance, 2); // 返回结果保留小数点后两位
}
/**
* 格式化起止时间(为了兼容前端RangePicker组件)
* 2020-04-01T08:15:08.891Z => 1585670400
* @param array $times
* @param bool $isWithTime 是否包含时间
* @return array
*/
function between_time(array $times, bool $isWithTime = false): array
{
foreach ($times as &$time) {
$time = trim($time, '"');
$time = str2date($time, $isWithTime);
}
return ['start_time' => current($times), 'end_time' => next($times)];
}
/**
* 日期转换时间戳
* 例如: 2020-04-01 08:15:08 => 1585670400
* @param string $date
* @param bool $isWithTime 是否包含时间
* @return false|int
*/
function str2date(string $date, bool $isWithTime = false)
{
if (!$isWithTime) {
$date = date('Y-m-d', strtotime($date));
}
return strtotime($date);
}

@ -243,6 +243,21 @@ class StoreKeeper extends Controller
return $this->renderError($model->getError() ?: '操作失败');
}
/**
* 修改物流信息
* @param int $orderId
* @return Json
*/
public function updateDelivery(int $orderId): Json
{
// 订单详情
$model = OrderModel::detail($orderId);
if ($model->updateDelivery($this->postForm())) {
return $this->renderSuccess('操作成功');
}
return $this->renderError($model->getError() ?: '操作失败');
}
/**
* 审核:用户取消订单
* @param $orderId

@ -12,20 +12,23 @@ declare (strict_types=1);
namespace app\api\controller;
use app\api\model\Agreement as AgreementModel;
use app\api\model\User as UserModel;
use app\api\model\Invite\InviteLog;
use app\store\model\User as StoreUserModel;
use app\api\model\user\BalanceLog;
use app\api\model\user\GoodSource as GoodsSourceModel;
use app\api\model\user\InvoiceOrder;
use app\api\model\user\UserInvoice;
use app\api\model\user\UserCoupon;
use app\api\model\user\UserInvoice;
use app\api\model\UserCoupon as UserCouponModel;
use app\api\model\Agreement as AgreementModel;
use app\api\service\Feedback;
use app\api\service\User as UserService;
use app\common\enum\dealer\withdraw\PayType;
use app\common\model\Agreement;
use app\common\service\qrcode\InviteUser;
use cores\exception\BaseException;
use think\facade\Log;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use think\response\Json;
/**
@ -40,10 +43,12 @@ class User extends Controller
* [delete description]
* @return [type] [description]
*/
public function delete(){
public function delete()
{
$user_id = UserService::getCurrentLoginUserId();
UserModel::where('user_id', $user_id)->update(['is_delete' => 1,'update_time' => time()]);
UserModel::where('user_id', $user_id)->update(['is_delete' => 1, 'update_time' => time()]);
}
/**
* 当前用户详情
* @return Json
@ -226,7 +231,7 @@ class User extends Controller
public function delInvoicing(): Json
{
$service = new UserInvoice();
if(!$service->del($this->request->param())) {
if (!$service->del($this->request->param())) {
return $this->renderSuccess($service->getError() ?: '操作失败');
}
return $this->renderSuccess('删除成功·');
@ -272,7 +277,8 @@ class User extends Controller
/**
* 个人中心协议
*/
public function getAgreement(): Json {
public function getAgreement(): Json
{
$params = $this->request->param();
if (empty($params['type'])) {
return $this->renderSuccess("参数错误");
@ -284,7 +290,8 @@ class User extends Controller
/**
* 添加用户浏览记录
*/
public function addView(): Json {
public function addView(): Json
{
$goods_id = $this->request->param('goods_id');
$user_id = UserService::getCurrentLoginUserId();
$userView = new UserCoupon();
@ -294,4 +301,72 @@ class User extends Controller
return $this->renderSuccess($userView->getError() ?: '记录失败');
}
/**
* @notes:邀请好友海报
* @return Json
* @throws BaseException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @author: wanghousheng
*/
public function InviteUserPoster(): Json
{
$userInfo = UserService::getCurrentLoginUser(true);
// 生成二维码
$Qrcode = new InviteUser($userInfo, 'MP-WEIXIN');
return $this->renderSuccess(['imageUrl' => $Qrcode->getImage()]);
}
/**
* 用户列表
* @return Json
* @throws \think\db\exception\DbException
*/
public function list(): Json
{
// 用户列表
$model = new StoreUserModel;
$list = $model->getList($this->request->param());
if (!$list) {
return $this->renderSuccess(compact('list'));
}
$list = $list->toArray();
// echo "<pre>";
// print_r($list);
// exit();
foreach ($list['data'] as $key => &$value) {
$log = InviteLog::where('invitee_user_id', $value['user_id'])->find();
$user = UserModel::where('user_id', $log['user_id'] ?? 0)->field('user_id,nick_name,mobile')->find();
$value['inviter'] = $user;
}
return $this->renderSuccess(compact('list'));
}
public function updateUser(): Json
{
$params = $this->request->param();
$user_id = $params['user_id'] ?? 0;
unset($params['user_id']);
UserModel::where('user_id', $user_id)->update($params);
return $this->renderSuccess('ok');
}
}

@ -850,6 +850,9 @@ class Checkout extends BaseService
'order_status' => OrderStatusEnum::NORMAL,
'platform' => getPlatform(),
'store_id' => $this->storeId,
'expect_receive_time' => $this->param['expect_receive_time'],//期待收货时间
'is_street_take' => $this->param['is_street_take'],//是否街边1-在 0-不在
'to_store_time' => $this->param['to_store_time'],//预计到店时间
];
if ($order['delivery'] == DeliveryTypeEnum::EXPRESS) {
$data['express_price'] = $order['expressPrice'];

@ -458,31 +458,11 @@ function getUrl($value, $host = ''){
return $value ? $host."/".$value : "";
}
/**
* 计算用户和门店距离
* @param float $lat1 用户纬度
* @param float $lon1 用户经度
* @param float $lat2
* @param float $lon2
* @return float
*/
function calculateDistance($lat1, $lon1, $lat2, $lon2): float
{
// 将角度转换为弧度
$degToRad = M_PI / 180;
// 经纬度转换成弧度
$lat1 *= $degToRad;
$lon1 *= $degToRad;
$lat2 *= $degToRad;
$lon2 *= $degToRad;
// 应用Haversine Formula计算球体上两点之间的距离
$dLat = ($lat2 - $lat1);
$dLon = ($lon2 - $lon1);
$a = pow(sin($dLat/2), 2) + cos($lat1) * cos($lat2) * pow(sin($dLon/2), 2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$distance = 6371 * $c; // 地球平均半径为6371km
return round($distance, 2); // 返回结果保留小数点后两位
function calc_time($startTime, $endTime) {
$diffTime = ($endTime - $startTime);
if ($diffTime > 3600) {
return "";
}
return date('i分钟s秒', (3600 - $diffTime));
}

@ -38,6 +38,8 @@ class Qrcode extends WxBase
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
// 构建请求
$data = compact('scene', 'width');
//$data['env_version'] = 'trial';
$data['check_path'] = false;
!is_null($page) && $data['page'] = $page;
// 返回结果
$result = $this->post($url, helper::jsonEncode($data));

@ -12,6 +12,8 @@ declare (strict_types=1);
namespace app\common\model;
use app\common\enum\order\DeliveryType;
use app\common\enum\payment\Method;
use cores\BaseModel;
use app\common\model\store\shop\Order as ShopOrder;
use app\common\service\Order as OrderService;
@ -53,6 +55,10 @@ class Order extends BaseModel
*/
protected $append = [
'state_text', // 售后单状态文字描述
'pay_method_text', //订单支付方式文字描述
'delivery_type_text', //配送方式文字描述
'time_text', //倒计时文字
'store_phone'//商家电话
];
/**
@ -391,4 +397,34 @@ class Order extends BaseModel
}
return true;
}
public function getPayMethodTextAttr($value,$data): string
{
return !empty(Method::data()[$data['pay_method']])?Method::data()[$data['pay_method']]['name']:'';//支付方式
}
public function getDeliveryTypeTextAttr($value,$data): string
{
return !empty(DeliveryType::data()[$data['delivery_type']])? DeliveryType::data()[$data['delivery_type']]['name']: '';//配送方式
}
public function getTimeTextAttr($value, $data) : int
{
$diffTime = 60*60*24;//24小时倒计时
// 付款状态
if ($data['pay_status'] == PayStatusEnum::PENDING) {
return (($data['create_time'] + $diffTime) - time()) * 1000;
}
// 收货状态
if ($data['receipt_status'] == ReceiptStatusEnum::NOT_RECEIVED) {
return (($data['delivery_time'] + $diffTime) - time()) * 1000;
}
return 0;
}
public function getStorePhoneAttr($value,$data) {
return Store::get($data['store_id'])->phone ?: '';
}
}

@ -12,6 +12,7 @@ declare (strict_types=1);
namespace app\common\model;
use app\common\enum\order\refund\RefundType;
use cores\BaseModel;
use think\model\relation\BelongsTo;
use think\model\relation\HasMany;
@ -30,6 +31,13 @@ class OrderRefund extends BaseModel
// 定义主键
protected $pk = 'order_refund_id';
/**
* 追加字段
*/
protected $append = [
'refund_type_text'
];
/**
* 关联用户表
* @return BelongsTo
@ -57,6 +65,15 @@ class OrderRefund extends BaseModel
return $this->belongsTo('OrderGoods')->withoutField(['content']);
}
/**
* 关联订单商品表
* @return HasMany
*/
public function goods(): HasMany
{
return $this->hasMany('OrderGoods', 'order_id', 'order_id')->withoutField(['content']);
}
/**
* 关联图片记录表
* @return HasMany
@ -104,4 +121,9 @@ class OrderRefund extends BaseModel
{
return static::get($where, $with);
}
public function getRefundTypeTextAttr($value, $data): string
{
return !empty(RefundType::data()[$data['type']]) ? RefundType::data()[$data['type']]['name'] : '';
}
}

@ -12,9 +12,9 @@ declare (strict_types=1);
namespace app\common\model\wxapp;
use app\common\library\helper;
use cores\BaseModel;
use think\facade\Cache;
use app\common\library\helper;
/**
* 微信小程序设置模型

@ -0,0 +1,118 @@
<?php
namespace app\common\service\qrcode;
use app\common\model\User as UserModel;
use cores\exception\BaseException;
use Exception;
use Grafika\Grafika;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
use function base_url;
class InviteUser extends BaseQRcode
{
// 当前客户端 (默认H5)
private string $channel;
// 用户信息
private UserModel $userInfo;
/**
* 构造方法
* Goods constructor.
* @param UserModel $userInfo
* @param string $channel 二维码渠道(小程序码、h5码)
*/
public function __construct(UserModel $userInfo, string $channel = 'H5')
{
parent::__construct();
// 用户信息
$this->userInfo = $userInfo;
// 当前客户端
$this->channel = $channel;
}
/**
* 拼接海报图
* @return string
* @throws BaseException
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
* @throws Exception
*/
public function getImage(): string
{
// 判断海报图文件存在则直接返回url
if (file_exists($this->getPosterPath())) {
return $this->getPosterUrl();
}
// 商城ID
$storeId = $this->userInfo['store_id'];
// 商品海报背景图
$backdrop = __DIR__ . '/resource/invite_user.png';
// 小程序码参数
$scene = "refereeId:" . ($this->userInfo['user_id'] ?: '');
// 下载小程序码
$page = 'pages/login/index';
$qrcode = $this->getQrcode($storeId, $scene, $page, $this->channel);
// 拼接海报图
return $this->savePoster($backdrop, $qrcode);
}
/**
* 拼接海报图
* @param string $backdrop 背景图路径
* @param string $qrcode 二维码图路径
* @return string
* @throws Exception
*/
private function savePoster(string $backdrop, string $qrcode): string
{
// 实例化图像编辑器
$editor = Grafika::createEditor(['Gd']);
// 打开海报背景图
$editor->open($backdropImage, $backdrop);
// 打开小程序码
$editor->open($qrcodeImage, $qrcode);
// 重设小程序码宽高
$editor->resizeExact($qrcodeImage, 140, 140);
// 小程序码添加到背景图
$editor->blend($backdropImage, $qrcodeImage, 'normal', 1.0, 'top-left', 520, 700);
// 保存图片
$editor->save($backdropImage, $this->getPosterPath());
return $this->getPosterUrl();
}
/**
* 海报图文件路径
* @return string
*/
private function getPosterPath(): string
{
// 保存路径
$tempPath = web_path() . "temp/{$this->userInfo['store_id']}/";
!is_dir($tempPath) && mkdir($tempPath, 0755, true);
return $tempPath . $this->getPosterName();
}
/**
* 海报图文件名称
* @return string
*/
private function getPosterName(): string
{
return 'invite_' . md5("{$this->userInfo['user_id']}_$this->channel") . '.png';
}
/**
* 海报图url
* @return string
*/
private function getPosterUrl(): string
{
return base_url() . 'temp/' . $this->userInfo['store_id'] . '/' . $this->getPosterName() . '?t=' . time();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 KiB

@ -0,0 +1,76 @@
<?php
declare(strict_types=1);
namespace app\store\controller\content;
use think\response\Json;
use app\store\controller\Controller;
use app\store\model\Banner as BannerModel;
/**
* Banner管理
* Class Carousel
* @package app\store\controller\content
*/
class Banner extends Controller
{
/**
* 获取列表记录
* @return Json
* @throws \think\db\exception\DbException
*/
public function list(): Json
{
$model = new BannerModel;
$list = $model->getList();
return $this->renderSuccess(compact('list'));
}
/**
* 添加Banner
* @return Json
*/
public function add(): Json
{
// 新增记录
$model = new BannerModel;
if ($model->add($this->postForm())) {
return $this->renderSuccess('添加成功');
}
return $this->renderError($model->getError() ?: '添加失败');
}
/**
* 更新Banner
* @param int $bannerId
* @return Json
*/
public function edit(int $bannerId): Json
{
// Banner详情
$model = BannerModel::detail($bannerId);
// 更新记录
if ($model->edit($this->postForm())) {
return $this->renderSuccess('更新成功');
}
return $this->renderError($model->getError() ?: '更新失败');
}
/**
* 删除Banner
* @param int $bannerId
* @return Json
*/
public function delete(int $bannerId): Json
{
// Banner详情
$model = BannerModel::detail($bannerId);
// 删除记录
if ($model->setDelete()) {
return $this->renderSuccess('删除成功');
}
return $this->renderError($model->getError() ?: '删除失败');
}
}

@ -0,0 +1,75 @@
<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare(strict_types=1);
namespace app\store\model;
use app\common\model\Banner as BannerModel;
/**
* 模型类:帮助中心
* Class Help
* @package app\store\model
*/
class Banner extends BannerModel
{
/**
* 获取列表记录
* @return \think\Paginator
* @throws \think\db\exception\DbException
*/
public function getList(): \think\Paginator
{
$data = $this->order(['sort' => 'asc', 'create_time' => 'desc'])->paginate();
return self::preload($data, ['image']);
}
/**
* 详情
* @param mixed $bannerId
* @param array $with
* @return static|array|null
*/
public static function detail($bannerId, array $with = [])
{
return self::get($bannerId, $with);
}
/**
* 新增记录
* @param array $data
* @return bool|false
*/
public function add(array $data): bool
{
$data['store_id'] = self::$storeId;
return $this->save($data);
}
/**
* 更新记录
* @param array $data
* @return bool
*/
public function edit(array $data): bool
{
return $this->save($data) !== false;
}
/**
* 删除记录
* @return bool
*/
public function setDelete(): bool
{
return $this->delete();
}
}

@ -40,6 +40,16 @@ class GoodsSource extends GoodSourceModel
]);
}
/**
* 获取货源详情
* @param int $goodsId
* @return static|null
*/
public static function detail(int $goodsId, array $with = [])
{
return self::get($goodsId, $with);
}
/**
* 新增记录
* @param array $data
@ -48,8 +58,10 @@ class GoodsSource extends GoodSourceModel
public function add(array $data): bool
{
// 新增记录
$data['store_id'] = self::$storeId;
return $this->save($data);
return $this->save(array_merge($data, [
'store_id' => self::$storeId,
'created_at' => time(),
]));
}
/**

@ -13,17 +13,17 @@ declare (strict_types=1);
namespace app\store\model;
use app\api\service\User as UserService;
use app\common\enum\payment\Method;
use app\common\model\Order as OrderModel;
use app\common\service\Order as OrderService;
use app\common\service\order\Refund as RefundService;
use app\common\service\order\Printer as PrinterService;
use app\common\enum\order\{
DataType as DataTypeEnum,
use app\common\enum\order\{DataType as DataTypeEnum,
DeliveryType,
PayStatus as PayStatusEnum,
OrderStatus as OrderStatusEnum,
ReceiptStatus as ReceiptStatusEnum,
DeliveryStatus as DeliveryStatusEnum
};
DeliveryStatus as DeliveryStatusEnum};
use app\common\library\helper;
use cores\exception\BaseException;
@ -65,14 +65,11 @@ class Order extends OrderModel
$filterOr = [];
if (!empty($param['searchValue']) && $param['searchType'] == 'all') {
// $filterOr = [
// ['order.order_no', 'like', "%{$param['searchValue']}%"],
// ['user.nick_name', 'like', "%{$param['searchValue']}%"],
// ['address.name', 'like', "%{$param['searchValue']}%"],
// ['address.phone', 'like', "%{$param['searchValue']}%"],
// ];
$filterOr = [
['order.order_no|user.nick_name|address.name|address.phone', 'like', "%{$param['searchValue']}%"]
['order.order_no', 'like', "%{$param['searchValue']}%"],
['user.nick_name', 'like', "%{$param['searchValue']}%"],
['address.name', 'like', "%{$param['searchValue']}%"],
['address.phone', 'like', "%{$param['searchValue']}%"],
];
}
@ -88,8 +85,7 @@ class Order extends OrderModel
->where($filter)
->where('order.is_delete', '=', 0);
if (!empty($filterOr)) {
// $query = $query->whereOr($filterOr);
$query = $query->where($filterOr);
$query = $query->whereOr($filterOr);
}
$list = $query->order(['order.create_time' => 'desc'])
->paginate(10);
@ -125,7 +121,7 @@ class Order extends OrderModel
// 设置订单类型条件
$dataTypeFilter = $this->getFilterDataType($param['dataType']);
// 获取数据列表
$query = $this->with(['goods.image', 'user.avatar', 'address'])
$query = $this
->alias('order')
->field('order.*')
->leftJoin('user', 'user.user_id = order.user_id')
@ -137,8 +133,10 @@ class Order extends OrderModel
// $query = $query->whereOr($filterOr);
$query = $query->where($filterOr);
}
// 加载关联订单数据
$list = $query->order(['order.create_time' => 'desc'])
->paginate(10);
$list = static::preload($list, ['goods.image', 'user.avatar', 'address', 'delivery'], true);
return $list;
}
@ -201,7 +199,8 @@ class Order extends OrderModel
}
// 起止时间
if (!empty($params['betweenTime'])) {
$times = between_time($params['betweenTime']);
$betweenTime = explode(',', $params['betweenTime']);
$times = between_time($betweenTime);
$filter[] = ['order.create_time', '>=', $times['start_time']];
$filter[] = ['order.create_time', '<', $times['end_time'] + 86400];
}
@ -320,6 +319,30 @@ class Order extends OrderModel
}
/**
* 修改物流信息
* @param array $data
* @return bool
*/
public function updateDelivery(array $data): bool
{
if ($this['delivery_status'] == DeliveryStatusEnum::DELIVERED || $this['delivery_type'] != 10) {
$this->error = "订单号[{$this['order_no']}]不满足修改条件!";
return false;
}
if (empty($data['express_id']) || empty($data['express_no'])) {
$this->error = "请补全物流信息!";
return false;
}
$update = [
'express_id' => $data['express_id'],
'express_no' => $data['express_no'],
];
return (bool)\app\common\model\order\Delivery::where(['order_id' => $this['order_id']])->update($update);
}
/**
* 修改商家备注
* @param array $data

@ -13,6 +13,9 @@ declare (strict_types=1);
namespace app\store\model;
use app\api\service\User as UserService;
use app\common\enum\dealer\withdraw\PayType;
use app\common\enum\order\DeliveryType;
use app\common\enum\payment\Method;
use app\store\model\User as UserModel;
use app\common\model\OrderRefund as OrderRefundModel;
use app\common\enum\order\refund\RefundType as RefundTypeEnum;
@ -37,20 +40,12 @@ class OrderRefund extends OrderRefundModel
{
// 检索查询条件
$filter = $this->getFilter($param);
//不是店长查询当前用户订单
// if(!UserService::isStore()) {
// $filter[] = ['user.user_id' ,'=', UserService::getCurrentLoginUserId() ];
// }
$filterOr = [];
if (!empty($param['searchValue']) && $param['searchType'] == 'all') {
// $filterOr = [
// ['order.order_no', 'like', "%{$param['searchValue']}%"],
// ['user.nick_name', 'like', "%{$param['searchValue']}%"],
// ['order.user_id', '=', (int)$param['searchValue']]
// ];
$filterOr = [
['order.order_no|user.nick_name|order.user_id', 'like', "%{$param['searchValue']}%"]
['order.order_no', 'like', "%{$param['searchValue']}%"],
['user.nick_name', 'like', "%{$param['searchValue']}%"],
['order.user_id', '=', (int)$param['searchValue']]
];
}
@ -61,8 +56,7 @@ class OrderRefund extends OrderRefundModel
->join('user', 'user.user_id = order.user_id')
->where($filter);
if(!empty($filterOr)){
// $query = $query->whereOr($filterOr);
$query = $query->where($filterOr);
$query = $query->whereOr($filterOr);
}
$list = $query->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()])
->paginate(10);
@ -97,7 +91,8 @@ class OrderRefund extends OrderRefundModel
}
// 获取列表数据
$query = $this->alias('refund')
$query = $this
->alias('refund')
->field('refund.*, order.order_no')
->join('order', 'order.order_id = refund.order_id')
->join('user', 'user.user_id = order.user_id')
@ -109,7 +104,15 @@ class OrderRefund extends OrderRefundModel
$list = $query->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()])
->paginate(10);
// 加载关联订单数据
return static::preload($list, ['orderGoods.image', 'orderData', 'user.avatar']);
$list = static::preload($list, ['goods.image', 'orderData', 'user.avatar','images.file'], true);
foreach ($list['data'] as $key => $row) {
$row['orderData']['pay_method_text'] = Method::data()[$row['orderData']['pay_method']]['name'];//支付方式
$row['orderData']['delivery_type_text'] = DeliveryType::data()[$row['orderData']['delivery_type']]['name'];//配送方式
$newRow = array_merge($row, $row['orderData']);
$list['data'][$key] = $newRow;
unset($list['data'][$key]['orderData']);
}
return $list;
}
/**
@ -155,6 +158,7 @@ class OrderRefund extends OrderRefundModel
}
// 起止时间
if (!empty($params['betweenTime'])) {
$params['betweenTime'] = explode(',', $params['betweenTime']);
$times = between_time($params['betweenTime']);
$filter[] = ['refund.create_time', '>=', $times['start_time']];
$filter[] = ['refund.create_time', '<', $times['end_time'] + 86400];

@ -111,6 +111,7 @@ class User extends UserModel
$filter = [];
// 会员昵称
!empty($params['search']) && $filter[] = ['nick_name|mobile', 'like', "%{$params['search']}%"];
!empty($params['user_type']) && $filter[] = ['user_type', 'in', explode(",", $params['user_type'])];
// 用户性别
$params['gender'] > -1 && $filter[] = ['gender', '=', (int)$params['gender']];
// 用户等级

@ -1 +1 @@
<!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>商家管理中心</title><style>#loading-mask{position:fixed;left:0;top:0;height:100%;width:100%;background:#fff;user-select:none;z-index:9999;overflow:hidden}.loading-wrapper{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.loading-dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:64px;width:64px;height:64px;box-sizing:border-box}.loading-dot i{width:22px;height:22px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.loading-dot i:nth-child(1){top:0;left:0}.loading-dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.loading-dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style><link href="css/bargain.aaf513d0.css" rel="prefetch"><link href="css/bargain~client~collector~content~dealer~eorder~goods~groupon~live~manage~market~order~page~server~se~a0a5d3c7.8e8dd5a1.css" rel="prefetch"><link href="css/client.a6cbdfac.css" rel="prefetch"><link href="css/collector.306c5f1f.css" rel="prefetch"><link href="css/content.949483f8.css" rel="prefetch"><link href="css/dealer.33c053df.css" rel="prefetch"><link href="css/eorder.af369ba5.css" rel="prefetch"><link href="css/goods.df12bc83.css" rel="prefetch"><link href="css/groupon.d7e493ca.css" rel="prefetch"><link href="css/index.65686232.css" rel="prefetch"><link href="css/market.438e7dd1.css" rel="prefetch"><link href="css/order.34562fba.css" rel="prefetch"><link href="css/page.5cf12993.css" rel="prefetch"><link href="css/passport.27257d2f.css" rel="prefetch"><link href="css/server.1583280e.css" rel="prefetch"><link href="css/setting.be935862.css" rel="prefetch"><link href="css/sharp.0237f2d1.css" rel="prefetch"><link href="css/statistics.6d805d57.css" rel="prefetch"><link href="css/store.93c41389.css" rel="prefetch"><link href="css/user.806b728e.css" rel="prefetch"><link href="js/bargain.027c2e96.js" rel="prefetch"><link href="js/bargain~client~collector~content~dealer~eorder~goods~groupon~live~manage~market~order~page~server~se~a0a5d3c7.6e8a1919.js" rel="prefetch"><link href="js/client.f9b450e7.js" rel="prefetch"><link href="js/collector.95239533.js" rel="prefetch"><link href="js/content.c8100b63.js" rel="prefetch"><link href="js/dealer.46441193.js" rel="prefetch"><link href="js/dealer~page~store.c1e7aeb9.js" rel="prefetch"><link href="js/eorder.6901a2af.js" rel="prefetch"><link href="js/exception.4f918b59.js" rel="prefetch"><link href="js/goods.69355d87.js" rel="prefetch"><link href="js/groupon.ca1a1258.js" rel="prefetch"><link href="js/index.bb016803.js" rel="prefetch"><link href="js/index~statistics.5ed2ab05.js" rel="prefetch"><link href="js/lang-zh-CN.8c571402.js" rel="prefetch"><link href="js/live.ab3fb0ef.js" rel="prefetch"><link href="js/manage.80527b44.js" rel="prefetch"><link href="js/market.8a48277d.js" rel="prefetch"><link href="js/order.8721f729.js" rel="prefetch"><link href="js/page.e2ad1a4a.js" rel="prefetch"><link href="js/passport.54223076.js" rel="prefetch"><link href="js/server.d3274e64.js" rel="prefetch"><link href="js/setting.8281d8f9.js" rel="prefetch"><link href="js/sharp.bd4c7d3f.js" rel="prefetch"><link href="js/statistics.5cc66089.js" rel="prefetch"><link href="js/store.9bd38dea.js" rel="prefetch"><link href="js/user.7b8d38e7.js" rel="prefetch"><link href="css/app.0bf46b1d.css" rel="preload" as="style"><link href="css/chunk-vendors.35626c22.css" rel="preload" as="style"><link href="js/app.12748f9b.js" rel="preload" as="script"><link href="js/chunk-vendors.87848c69.js" rel="preload" as="script"><link href="css/chunk-vendors.35626c22.css" rel="stylesheet"><link href="css/app.0bf46b1d.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"><div id="loading-mask"><div class="loading-wrapper"><span class="loading-dot loading-dot-spin"><i></i><i></i><i></i><i></i></span></div></div></div><script src="config.js"></script><script src="js/chunk-vendors.87848c69.js"></script><script src="js/app.12748f9b.js"></script></body></html>
<!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>商家管理中心</title><style>#loading-mask{position:fixed;left:0;top:0;height:100%;width:100%;background:#fff;user-select:none;z-index:9999;overflow:hidden}.loading-wrapper{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.loading-dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:64px;width:64px;height:64px;box-sizing:border-box}.loading-dot i{width:22px;height:22px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.loading-dot i:nth-child(1){top:0;left:0}.loading-dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.loading-dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style><link href="css/bargain.aaf513d0.css" rel="prefetch"><link href="css/bargain~client~collector~content~dealer~eorder~goods~groupon~live~manage~market~order~page~server~se~a0a5d3c7.8e8dd5a1.css" rel="prefetch"><link href="css/client.a6cbdfac.css" rel="prefetch"><link href="css/collector.306c5f1f.css" rel="prefetch"><link href="css/content.949483f8.css" rel="prefetch"><link href="css/dealer.33c053df.css" rel="prefetch"><link href="css/eorder.af369ba5.css" rel="prefetch"><link href="css/goods.df12bc83.css" rel="prefetch"><link href="css/groupon.d7e493ca.css" rel="prefetch"><link href="css/index.65686232.css" rel="prefetch"><link href="css/market.438e7dd1.css" rel="prefetch"><link href="css/order.34562fba.css" rel="prefetch"><link href="css/page.5cf12993.css" rel="prefetch"><link href="css/passport.27257d2f.css" rel="prefetch"><link href="css/server.1583280e.css" rel="prefetch"><link href="css/setting.be935862.css" rel="prefetch"><link href="css/sharp.0237f2d1.css" rel="prefetch"><link href="css/statistics.6d805d57.css" rel="prefetch"><link href="css/store.93c41389.css" rel="prefetch"><link href="css/user.806b728e.css" rel="prefetch"><link href="js/bargain.027c2e96.js" rel="prefetch"><link href="js/bargain~client~collector~content~dealer~eorder~goods~groupon~live~manage~market~order~page~server~se~a0a5d3c7.6e8a1919.js" rel="prefetch"><link href="js/client.f9b450e7.js" rel="prefetch"><link href="js/collector.95239533.js" rel="prefetch"><link href="js/content.1d9035ce.js" rel="prefetch"><link href="js/dealer.46441193.js" rel="prefetch"><link href="js/dealer~page~store.c1e7aeb9.js" rel="prefetch"><link href="js/eorder.6901a2af.js" rel="prefetch"><link href="js/exception.4f918b59.js" rel="prefetch"><link href="js/goods.69355d87.js" rel="prefetch"><link href="js/groupon.ca1a1258.js" rel="prefetch"><link href="js/index.bb016803.js" rel="prefetch"><link href="js/index~statistics.5ed2ab05.js" rel="prefetch"><link href="js/lang-zh-CN.8c571402.js" rel="prefetch"><link href="js/live.ab3fb0ef.js" rel="prefetch"><link href="js/manage.80527b44.js" rel="prefetch"><link href="js/market.8a48277d.js" rel="prefetch"><link href="js/order.8721f729.js" rel="prefetch"><link href="js/page.e2ad1a4a.js" rel="prefetch"><link href="js/passport.54223076.js" rel="prefetch"><link href="js/server.d3274e64.js" rel="prefetch"><link href="js/setting.8281d8f9.js" rel="prefetch"><link href="js/sharp.bd4c7d3f.js" rel="prefetch"><link href="js/statistics.5cc66089.js" rel="prefetch"><link href="js/store.9bd38dea.js" rel="prefetch"><link href="js/user.7b8d38e7.js" rel="prefetch"><link href="css/app.fab9b2e3.css" rel="preload" as="style"><link href="css/chunk-vendors.35626c22.css" rel="preload" as="style"><link href="js/app.efeaecac.js" rel="preload" as="script"><link href="js/chunk-vendors.87848c69.js" rel="preload" as="script"><link href="css/chunk-vendors.35626c22.css" rel="stylesheet"><link href="css/app.fab9b2e3.css" rel="stylesheet"></head><body><noscript><strong>We're sorry but vue-antd-pro doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"><div id="loading-mask"><div class="loading-wrapper"><span class="loading-dot loading-dot-spin"><i></i><i></i><i></i><i></i></span></div></div></div><script src="config.js"></script><script src="js/chunk-vendors.87848c69.js"></script><script src="js/app.efeaecac.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save