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; 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() ?: '操作失败'); 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 * @param $orderId

@ -12,20 +12,23 @@ declare (strict_types=1);
namespace app\api\controller; namespace app\api\controller;
use app\api\model\Agreement as AgreementModel;
use app\api\model\User as UserModel; 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\BalanceLog;
use app\api\model\user\GoodSource as GoodsSourceModel; use app\api\model\user\GoodSource as GoodsSourceModel;
use app\api\model\user\InvoiceOrder; use app\api\model\user\InvoiceOrder;
use app\api\model\user\UserInvoice;
use app\api\model\user\UserCoupon; use app\api\model\user\UserCoupon;
use app\api\model\user\UserInvoice;
use app\api\model\UserCoupon as UserCouponModel; use app\api\model\UserCoupon as UserCouponModel;
use app\api\model\Agreement as AgreementModel;
use app\api\service\Feedback; use app\api\service\Feedback;
use app\api\service\User as UserService; use app\api\service\User as UserService;
use app\common\enum\dealer\withdraw\PayType; use app\common\service\qrcode\InviteUser;
use app\common\model\Agreement;
use cores\exception\BaseException; 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; use think\response\Json;
/** /**
@ -40,10 +43,12 @@ class User extends Controller
* [delete description] * [delete description]
* @return [type] [description] * @return [type] [description]
*/ */
public function delete(){ public function delete()
{
$user_id = UserService::getCurrentLoginUserId(); $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 * @return Json
@ -226,7 +231,7 @@ class User extends Controller
public function delInvoicing(): Json public function delInvoicing(): Json
{ {
$service = new UserInvoice(); $service = new UserInvoice();
if(!$service->del($this->request->param())) { if (!$service->del($this->request->param())) {
return $this->renderSuccess($service->getError() ?: '操作失败'); return $this->renderSuccess($service->getError() ?: '操作失败');
} }
return $this->renderSuccess('删除成功·'); return $this->renderSuccess('删除成功·');
@ -272,7 +277,8 @@ class User extends Controller
/** /**
* 个人中心协议 * 个人中心协议
*/ */
public function getAgreement(): Json { public function getAgreement(): Json
{
$params = $this->request->param(); $params = $this->request->param();
if (empty($params['type'])) { if (empty($params['type'])) {
return $this->renderSuccess("参数错误"); 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'); $goods_id = $this->request->param('goods_id');
$user_id = UserService::getCurrentLoginUserId(); $user_id = UserService::getCurrentLoginUserId();
$userView = new UserCoupon(); $userView = new UserCoupon();
@ -294,4 +301,72 @@ class User extends Controller
return $this->renderSuccess($userView->getError() ?: '记录失败'); 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, 'order_status' => OrderStatusEnum::NORMAL,
'platform' => getPlatform(), 'platform' => getPlatform(),
'store_id' => $this->storeId, '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) { if ($order['delivery'] == DeliveryTypeEnum::EXPRESS) {
$data['express_price'] = $order['expressPrice']; $data['express_price'] = $order['expressPrice'];

@ -458,31 +458,11 @@ function getUrl($value, $host = ''){
return $value ? $host."/".$value : ""; 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;
// 经纬度转换成弧度 function calc_time($startTime, $endTime) {
$lat1 *= $degToRad; $diffTime = ($endTime - $startTime);
$lon1 *= $degToRad; if ($diffTime > 3600) {
$lat2 *= $degToRad; return "";
$lon2 *= $degToRad; }
return date('i分钟s秒', (3600 - $diffTime));
// 应用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); // 返回结果保留小数点后两位
} }

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

@ -12,6 +12,8 @@ declare (strict_types=1);
namespace app\common\model; namespace app\common\model;
use app\common\enum\order\DeliveryType;
use app\common\enum\payment\Method;
use cores\BaseModel; use cores\BaseModel;
use app\common\model\store\shop\Order as ShopOrder; use app\common\model\store\shop\Order as ShopOrder;
use app\common\service\Order as OrderService; use app\common\service\Order as OrderService;
@ -53,6 +55,10 @@ class Order extends BaseModel
*/ */
protected $append = [ protected $append = [
'state_text', // 售后单状态文字描述 'state_text', // 售后单状态文字描述
'pay_method_text', //订单支付方式文字描述
'delivery_type_text', //配送方式文字描述
'time_text', //倒计时文字
'store_phone'//商家电话
]; ];
/** /**
@ -391,4 +397,34 @@ class Order extends BaseModel
} }
return true; 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; namespace app\common\model;
use app\common\enum\order\refund\RefundType;
use cores\BaseModel; use cores\BaseModel;
use think\model\relation\BelongsTo; use think\model\relation\BelongsTo;
use think\model\relation\HasMany; use think\model\relation\HasMany;
@ -30,6 +31,13 @@ class OrderRefund extends BaseModel
// 定义主键 // 定义主键
protected $pk = 'order_refund_id'; protected $pk = 'order_refund_id';
/**
* 追加字段
*/
protected $append = [
'refund_type_text'
];
/** /**
* 关联用户表 * 关联用户表
* @return BelongsTo * @return BelongsTo
@ -57,6 +65,15 @@ class OrderRefund extends BaseModel
return $this->belongsTo('OrderGoods')->withoutField(['content']); return $this->belongsTo('OrderGoods')->withoutField(['content']);
} }
/**
* 关联订单商品表
* @return HasMany
*/
public function goods(): HasMany
{
return $this->hasMany('OrderGoods', 'order_id', 'order_id')->withoutField(['content']);
}
/** /**
* 关联图片记录表 * 关联图片记录表
* @return HasMany * @return HasMany
@ -104,4 +121,9 @@ class OrderRefund extends BaseModel
{ {
return static::get($where, $with); 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; namespace app\common\model\wxapp;
use app\common\library\helper;
use cores\BaseModel; use cores\BaseModel;
use think\facade\Cache; 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 * @param array $data
@ -48,8 +58,10 @@ class GoodsSource extends GoodSourceModel
public function add(array $data): bool public function add(array $data): bool
{ {
// 新增记录 // 新增记录
$data['store_id'] = self::$storeId; return $this->save(array_merge($data, [
return $this->save($data); 'store_id' => self::$storeId,
'created_at' => time(),
]));
} }
/** /**

@ -13,17 +13,17 @@ declare (strict_types=1);
namespace app\store\model; namespace app\store\model;
use app\api\service\User as UserService; use app\api\service\User as UserService;
use app\common\enum\payment\Method;
use app\common\model\Order as OrderModel; use app\common\model\Order as OrderModel;
use app\common\service\Order as OrderService; use app\common\service\Order as OrderService;
use app\common\service\order\Refund as RefundService; use app\common\service\order\Refund as RefundService;
use app\common\service\order\Printer as PrinterService; use app\common\service\order\Printer as PrinterService;
use app\common\enum\order\{ use app\common\enum\order\{DataType as DataTypeEnum,
DataType as DataTypeEnum, DeliveryType,
PayStatus as PayStatusEnum, PayStatus as PayStatusEnum,
OrderStatus as OrderStatusEnum, OrderStatus as OrderStatusEnum,
ReceiptStatus as ReceiptStatusEnum, ReceiptStatus as ReceiptStatusEnum,
DeliveryStatus as DeliveryStatusEnum DeliveryStatus as DeliveryStatusEnum};
};
use app\common\library\helper; use app\common\library\helper;
use cores\exception\BaseException; use cores\exception\BaseException;
@ -65,14 +65,11 @@ class Order extends OrderModel
$filterOr = []; $filterOr = [];
if (!empty($param['searchValue']) && $param['searchType'] == 'all') { 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 = [ $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($filter)
->where('order.is_delete', '=', 0); ->where('order.is_delete', '=', 0);
if (!empty($filterOr)) { if (!empty($filterOr)) {
// $query = $query->whereOr($filterOr); $query = $query->whereOr($filterOr);
$query = $query->where($filterOr);
} }
$list = $query->order(['order.create_time' => 'desc']) $list = $query->order(['order.create_time' => 'desc'])
->paginate(10); ->paginate(10);
@ -125,7 +121,7 @@ class Order extends OrderModel
// 设置订单类型条件 // 设置订单类型条件
$dataTypeFilter = $this->getFilterDataType($param['dataType']); $dataTypeFilter = $this->getFilterDataType($param['dataType']);
// 获取数据列表 // 获取数据列表
$query = $this->with(['goods.image', 'user.avatar', 'address']) $query = $this
->alias('order') ->alias('order')
->field('order.*') ->field('order.*')
->leftJoin('user', 'user.user_id = order.user_id') ->leftJoin('user', 'user.user_id = order.user_id')
@ -137,8 +133,10 @@ class Order extends OrderModel
// $query = $query->whereOr($filterOr); // $query = $query->whereOr($filterOr);
$query = $query->where($filterOr); $query = $query->where($filterOr);
} }
// 加载关联订单数据
$list = $query->order(['order.create_time' => 'desc']) $list = $query->order(['order.create_time' => 'desc'])
->paginate(10); ->paginate(10);
$list = static::preload($list, ['goods.image', 'user.avatar', 'address', 'delivery'], true);
return $list; return $list;
} }
@ -201,7 +199,8 @@ class Order extends OrderModel
} }
// 起止时间 // 起止时间
if (!empty($params['betweenTime'])) { 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['start_time']];
$filter[] = ['order.create_time', '<', $times['end_time'] + 86400]; $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 * @param array $data

@ -13,6 +13,9 @@ declare (strict_types=1);
namespace app\store\model; namespace app\store\model;
use app\api\service\User as UserService; 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\store\model\User as UserModel;
use app\common\model\OrderRefund as OrderRefundModel; use app\common\model\OrderRefund as OrderRefundModel;
use app\common\enum\order\refund\RefundType as RefundTypeEnum; use app\common\enum\order\refund\RefundType as RefundTypeEnum;
@ -37,20 +40,12 @@ class OrderRefund extends OrderRefundModel
{ {
// 检索查询条件 // 检索查询条件
$filter = $this->getFilter($param); $filter = $this->getFilter($param);
//不是店长查询当前用户订单
// if(!UserService::isStore()) {
// $filter[] = ['user.user_id' ,'=', UserService::getCurrentLoginUserId() ];
// }
$filterOr = []; $filterOr = [];
if (!empty($param['searchValue']) && $param['searchType'] == 'all') { 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 = [ $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') ->join('user', 'user.user_id = order.user_id')
->where($filter); ->where($filter);
if(!empty($filterOr)){ if(!empty($filterOr)){
// $query = $query->whereOr($filterOr); $query = $query->whereOr($filterOr);
$query = $query->where($filterOr);
} }
$list = $query->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()]) $list = $query->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()])
->paginate(10); ->paginate(10);
@ -97,7 +91,8 @@ class OrderRefund extends OrderRefundModel
} }
// 获取列表数据 // 获取列表数据
$query = $this->alias('refund') $query = $this
->alias('refund')
->field('refund.*, order.order_no') ->field('refund.*, order.order_no')
->join('order', 'order.order_id = refund.order_id') ->join('order', 'order.order_id = refund.order_id')
->join('user', 'user.user_id = order.user_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()]) $list = $query->order(['refund.create_time' => 'desc', 'refund.' . $this->getPk()])
->paginate(10); ->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'])) { if (!empty($params['betweenTime'])) {
$params['betweenTime'] = explode(',', $params['betweenTime']);
$times = between_time($params['betweenTime']); $times = between_time($params['betweenTime']);
$filter[] = ['refund.create_time', '>=', $times['start_time']]; $filter[] = ['refund.create_time', '>=', $times['start_time']];
$filter[] = ['refund.create_time', '<', $times['end_time'] + 86400]; $filter[] = ['refund.create_time', '<', $times['end_time'] + 86400];

@ -111,6 +111,7 @@ class User extends UserModel
$filter = []; $filter = [];
// 会员昵称 // 会员昵称
!empty($params['search']) && $filter[] = ['nick_name|mobile', 'like', "%{$params['search']}%"]; !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']]; $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