Ver Fonte

页面+接口对接

gorden há 11 meses atrás
pai
commit
b99fc3ce44
58 ficheiros alterados com 3090 adições e 284 exclusões
  1. 71 0
      app/admin/controller/client/BrowseController.php
  2. 71 0
      app/admin/controller/client/CartController.php
  3. 26 0
      app/admin/controller/client/CollectionController.php
  4. 72 0
      app/admin/controller/client/CouponController.php
  5. 70 0
      app/admin/controller/client/EvaluateController.php
  6. 71 0
      app/admin/controller/client/FavoriteController.php
  7. 71 0
      app/admin/controller/client/PointsController.php
  8. 75 0
      app/admin/controller/coupon/CouponController.php
  9. 99 0
      app/admin/controller/goods/EntityGoodsController.php
  10. 98 0
      app/admin/controller/goods/PackageGoodsController.php
  11. 98 0
      app/admin/controller/goods/ServiceGoodsController.php
  12. 98 0
      app/admin/controller/goods/SpecialGoodsController.php
  13. 133 0
      app/admin/controller/member/CheckupController.php
  14. 30 4
      app/admin/controller/member/MemberController.php
  15. 133 0
      app/admin/controller/member/VisitingController.php
  16. 133 0
      app/admin/controller/member/WellnessRecordController.php
  17. 28 0
      app/admin/controller/order/AppointmentController.php
  18. 95 0
      app/admin/controller/order/CompleteController.php
  19. 94 0
      app/admin/controller/order/ReturnController.php
  20. 93 0
      app/admin/controller/order/WholeController.php
  21. 0 157
      app/admin/controller/smart_devices/CategoryController.php
  22. 18 0
      app/admin/controller/sys_manage/AdvController.php
  23. 20 18
      app/admin/controller/sys_manage/ArticleController.php
  24. 55 0
      app/admin/controller/sys_manage/BannerController.php
  25. 36 0
      app/admin/controller/sys_manage/LogsController.php
  26. 8 1
      app/admin/controller/sys_manage/MenuController.php
  27. 57 0
      app/admin/controller/sys_manage/NewsController.php
  28. 39 0
      app/admin/controller/sys_manage/SupplierController.php
  29. 13 0
      app/admin/controller/sys_manage/UploadController.php
  30. 2 0
      app/admin/service/auth/AuthService.php
  31. 150 25
      app/admin/service/goods/GoodsService.php
  32. 32 0
      app/admin/service/order/AppointmentService.php
  33. 30 0
      app/admin/validate/coupon/CouponValidate.php
  34. 6 5
      app/admin/validate/goods/GoodsValidate.php
  35. 27 0
      app/admin/validate/member/WellnessRecordValidate.php
  36. 30 0
      app/admin/validate/order/OrderValidate.php
  37. 0 22
      app/admin/validate/smart_devices/CategoryValidate.php
  38. 0 27
      app/admin/validate/smart_devices/ProductValidate.php
  39. 23 0
      app/admin/validate/sys_manage/ArticleValidate.php
  40. 43 0
      app/admin/validate/sys_manage/SupplierValidate.php
  41. 3 2
      app/controller/Curd.php
  42. 75 0
      app/model/Appointment.php
  43. 19 0
      app/model/Article.php
  44. 47 0
      app/model/Cart.php
  45. 48 0
      app/model/ClientBrowse.php
  46. 48 0
      app/model/ClientFavorite.php
  47. 52 0
      app/model/ClientPoints.php
  48. 24 0
      app/model/Coupon.php
  49. 47 0
      app/model/CouponDetail.php
  50. 30 0
      app/model/Goods.php
  51. 48 0
      app/model/GoodsEvaluate.php
  52. 26 0
      app/model/Order.php
  53. 60 0
      app/model/OrderSheet.php
  54. 24 0
      app/model/Supplier.php
  55. 24 0
      app/model/SysLog.php
  56. 47 0
      app/model/WellnessRecord.php
  57. 197 23
      route/admin.php
  58. 23 0
      support/helpers.php

+ 71 - 0
app/admin/controller/client/BrowseController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientBrowse;
+use app\model\ClientFavorite;
+use support\Request;
+use support\Response;
+
+class BrowseController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new ClientBrowse();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'client_browse_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 71 - 0
app/admin/controller/client/CartController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\Cart;
+use app\model\ClientFavorite;
+use app\model\GoodsEvaluate;
+use support\Request;
+use support\Response;
+
+class CartController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Cart();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'cart_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 26 - 0
app/admin/controller/client/CollectionController.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientFavorite;
+use support\Request;
+use support\Response;
+
+class CollectionController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new ClientFavorite();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'client_favorite_addtimes';
+        $where['client_favorite_type'] = '收藏';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+}

+ 72 - 0
app/admin/controller/client/CouponController.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\Cart;
+use app\model\ClientFavorite;
+use app\model\CouponDetail;
+use app\model\GoodsEvaluate;
+use support\Request;
+use support\Response;
+
+class CouponController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new CouponDetail();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'coupon_detail_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'coupon' => function ($query) {
+                $query->select('coupon_id', 'coupon_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 70 - 0
app/admin/controller/client/EvaluateController.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientFavorite;
+use app\model\GoodsEvaluate;
+use support\Request;
+use support\Response;
+
+class EvaluateController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new GoodsEvaluate();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'goods_evaluate_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 71 - 0
app/admin/controller/client/FavoriteController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientFavorite;
+use support\Request;
+use support\Response;
+
+class FavoriteController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new ClientFavorite();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'client_favorite_addtimes';
+        $where['client_favorite_type'] = '关注';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 71 - 0
app/admin/controller/client/PointsController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace app\admin\controller\client;
+
+use app\controller\Curd;
+use app\model\ClientFavorite;
+use app\model\ClientPoints;
+use support\Request;
+use support\Response;
+
+class PointsController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new ClientPoints();
+    }
+
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'client_points_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'orders' => function ($query) {
+                $query->select('order_id', 'order_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+}

+ 75 - 0
app/admin/controller/coupon/CouponController.php

@@ -0,0 +1,75 @@
+<?php
+
+namespace app\admin\controller\coupon;
+
+use app\admin\validate\coupon\CouponValidate;
+use app\admin\validate\device\DeviceValidate;
+use app\controller\Curd;
+use app\model\Coupon;
+use app\model\Device;
+use app\model\SysSerial;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class CouponController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Coupon();
+        $this->validate = true;
+        $this->validateClass = new CouponValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 15:01
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'coupon_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    public function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            $item->coupon_begindate = date('Y-m-d H:i:s', $item->coupon_begindate);
+            $item->coupon_enddate = date('Y-m-d H:i:s', $item->coupon_enddate);
+        }
+
+        return $items;
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+
+        return $data;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 99 - 0
app/admin/controller/goods/EntityGoodsController.php

@@ -0,0 +1,99 @@
+<?php
+
+namespace app\admin\controller\goods;
+
+use app\admin\service\goods\GoodsService;
+use app\admin\validate\goods\GoodsValidate;
+use support\Request;
+use support\Response;
+
+class EntityGoodsController
+{
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 10:08
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function select(Request $request)
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $keywords = $request->get('keywords');
+
+        return GoodsService::select($page, $pageSize, $keywords, 'GOODS');
+    }
+
+    /**
+     * @Desc 商品详情
+     * @Author Gorden
+     * @Date 2024/3/28 10:25
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request)
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('info')->check($request->get())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::info($request->get('goods_id'));
+    }
+
+    /**
+     * @Desc 添加商品
+     * @Author Gorden
+     * @Date 2024/3/11 10:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        $validate = new GoodsValidate();
+        if (!$validate->scene('add')->check($params)) {
+            return json_fail($validate->getError());
+        }
+
+        $params['goods_classify'] = 'GOODS';
+        return GoodsService::insert($params);
+    }
+
+    /**
+     * @Desc 修改商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('update')->check($request->post())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::update($request->post());
+    }
+
+    /**
+     * @Desc 删除商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function delete(Request $request)
+    {
+        $ids = $request->post('goods_id');
+
+        return GoodsService::delete($ids);
+    }
+}

+ 98 - 0
app/admin/controller/goods/PackageGoodsController.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace app\admin\controller\goods;
+
+use app\admin\service\goods\GoodsService;
+use app\admin\validate\goods\GoodsValidate;
+use support\Request;
+use support\Response;
+
+class PackageGoodsController
+{
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 10:08
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function select(Request $request)
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $keywords = $request->get('keywords');
+
+        return GoodsService::select($page, $pageSize, $keywords, 'PACKAGE');
+    }
+
+    /**
+     * @Desc 商品详情
+     * @Author Gorden
+     * @Date 2024/3/28 10:25
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request)
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('info')->check($request->get())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::info($request->get('goods_id'));
+    }
+
+    /**
+     * @Desc 添加商品
+     * @Author Gorden
+     * @Date 2024/3/11 10:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        $validate = new GoodsValidate();
+        if (!$validate->scene('add')->check($params)) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::insert($params);
+    }
+
+    /**
+     * @Desc 修改商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('update')->check($request->post())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::update($request->post());
+    }
+
+    /**
+     * @Desc 删除商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function delete(Request $request)
+    {
+        $ids = $request->post('goods_id');
+
+        return GoodsService::delete($ids);
+    }
+}

+ 98 - 0
app/admin/controller/goods/ServiceGoodsController.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace app\admin\controller\goods;
+
+use app\admin\service\goods\GoodsService;
+use app\admin\validate\goods\GoodsValidate;
+use support\Request;
+use support\Response;
+
+class ServiceGoodsController
+{
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 10:08
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function select(Request $request)
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $keywords = $request->get('keywords');
+
+        return GoodsService::select($page, $pageSize, $keywords, 'SERVICE');
+    }
+
+    /**
+     * @Desc 商品详情
+     * @Author Gorden
+     * @Date 2024/3/28 10:25
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request)
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('info')->check($request->get())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::info($request->get('goods_id'));
+    }
+
+    /**
+     * @Desc 添加商品
+     * @Author Gorden
+     * @Date 2024/3/11 10:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        $validate = new GoodsValidate();
+        if (!$validate->scene('add')->check($params)) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::insert($params);
+    }
+
+    /**
+     * @Desc 修改商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('update')->check($request->post())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::update($request->post());
+    }
+
+    /**
+     * @Desc 删除商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function delete(Request $request)
+    {
+        $ids = $request->post('goods_id');
+
+        return GoodsService::delete($ids);
+    }
+}

+ 98 - 0
app/admin/controller/goods/SpecialGoodsController.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace app\admin\controller\goods;
+
+use app\admin\service\goods\GoodsService;
+use app\admin\validate\goods\GoodsValidate;
+use support\Request;
+use support\Response;
+
+class SpecialGoodsController
+{
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 10:08
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function select(Request $request)
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $keywords = $request->get('keywords');
+
+        return GoodsService::select($page, $pageSize, $keywords, 'SPECIAL');
+    }
+
+    /**
+     * @Desc 商品详情
+     * @Author Gorden
+     * @Date 2024/3/28 10:25
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function info(Request $request)
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('info')->check($request->get())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::info($request->get('goods_id'));
+    }
+
+    /**
+     * @Desc 添加商品
+     * @Author Gorden
+     * @Date 2024/3/11 10:21
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function insert(Request $request): Response
+    {
+        $params = $request->post();
+        $validate = new GoodsValidate();
+        if (!$validate->scene('add')->check($params)) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::insert($params);
+    }
+
+    /**
+     * @Desc 修改商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function update(Request $request): Response
+    {
+        $validate = new GoodsValidate();
+        if (!$validate->scene('update')->check($request->post())) {
+            return json_fail($validate->getError());
+        }
+
+        return GoodsService::update($request->post());
+    }
+
+    /**
+     * @Desc 删除商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:22
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function delete(Request $request)
+    {
+        $ids = $request->post('goods_id');
+
+        return GoodsService::delete($ids);
+    }
+}

+ 133 - 0
app/admin/controller/member/CheckupController.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace app\admin\controller\member;
+
+use app\admin\validate\life\CinemaIlkValidate;
+use app\admin\validate\member\WellnessRecordValidate;
+use app\controller\Curd;
+use app\model\CinemaIlk as CinemaIlkModel;
+use app\model\WellnessRecord;
+use support\Request;
+use support\Response;
+
+class CheckupController extends Curd
+{
+
+    public function __construct()
+    {
+        $this->model = new WellnessRecord();
+        $this->validate = true;
+        $this->validateClass = new WellnessRecordValidate();
+    }
+
+    /**
+     * @Desc 查询列表
+     * @Author Gorden
+     * @Date 2024/3/21 9:58
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $field = $field ?? 'wellness_record_addtimes';
+        $order = $request->get('order', 'desc');
+        $where['wellness_record_category'] = '体检';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    protected function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if (!empty($item->wellness_record_file_json)) {
+                $item->wellness_record_file_json = json_decode($item->wellness_record_file_json, true);
+                $files = '';
+                foreach ($item->wellness_record_file_json as $file){
+                    $files.=getenv('STORAGE_DOMAIN').$file.',';
+                }
+                $item->wellness_record_file_json = rtrim($files,',');
+            }
+        }
+
+        return $items;
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+
+        return $data;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 30 - 4
app/admin/controller/member/MemberController.php

@@ -4,17 +4,43 @@ namespace app\admin\controller\member;
 
 use app\admin\service\member\MemberService;
 use app\admin\validate\member\MemberValidate;
+use support\Db;
 use support\Request;
 
 class MemberController
 {
+    public function selectList(Request $request)
+    {
+        $keywords = $request->get('keywords');
+        if (!$keywords) {
+            return json_fail("查询错误");
+        }
+
+        $res = Db::table('member')
+            ->join('member_cert', 'member.member_id', '=', 'member_cert.join_cert_member_id')
+            ->select('member.member_id', 'member.member_mobile', 'member_cert.member_cert_name')
+            ->where(function ($query) use ($keywords) {
+                $query->where('member.member_mobile', 'like', '%' . $keywords . '%')
+                    ->orWhere("member_cert.member_cert_name", 'like', '%' . $keywords . '%');
+            })->get();
+        $data = [];
+        foreach ($res as $item) {
+            $data[] = [
+                'key'=>$item->member_id,
+                'value'=>!empty($item->member_cert_name) ? $item->member_cert_name : $item->member_mobile,
+            ];
+        }
+
+        return json_success('',$data);
+    }
+
     public function list(Request $request)
     {
-        $page = $request->get('page',1);
-        $pageSize = $request->get('pageSize',10);
-        $keywords = $request->get('keywords','');
+        $page = $request->get('page', 1);
+        $pageSize = $request->get('pageSize', 10);
+        $keywords = $request->get('keywords', '');
 
-        return MemberService::list($page,$pageSize,$keywords);
+        return MemberService::list($page, $pageSize, $keywords);
     }
 
     /**

+ 133 - 0
app/admin/controller/member/VisitingController.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace app\admin\controller\member;
+
+use app\admin\validate\life\CinemaIlkValidate;
+use app\admin\validate\member\WellnessRecordValidate;
+use app\controller\Curd;
+use app\model\CinemaIlk as CinemaIlkModel;
+use app\model\WellnessRecord;
+use support\Request;
+use support\Response;
+
+class VisitingController extends Curd
+{
+
+    public function __construct()
+    {
+        $this->model = new WellnessRecord();
+        $this->validate = true;
+        $this->validateClass = new WellnessRecordValidate();
+    }
+
+    /**
+     * @Desc 查询列表
+     * @Author Gorden
+     * @Date 2024/3/21 9:58
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $field = $field ?? 'wellness_record_addtimes';
+        $order = $request->get('order', 'desc');
+        $where['wellness_record_category'] = '来访';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    protected function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if (!empty($item->wellness_record_file_json)) {
+                $item->wellness_record_file_json = json_decode($item->wellness_record_file_json, true);
+                $files = '';
+                foreach ($item->wellness_record_file_json as $file){
+                    $files.=getenv('STORAGE_DOMAIN').$file.',';
+                }
+                $item->wellness_record_file_json = rtrim($files,',');
+            }
+        }
+
+        return $items;
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+
+        return $data;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 133 - 0
app/admin/controller/member/WellnessRecordController.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace app\admin\controller\member;
+
+use app\admin\validate\life\CinemaIlkValidate;
+use app\admin\validate\member\WellnessRecordValidate;
+use app\controller\Curd;
+use app\model\CinemaIlk as CinemaIlkModel;
+use app\model\WellnessRecord;
+use support\Request;
+use support\Response;
+
+class WellnessRecordController extends Curd
+{
+
+    public function __construct()
+    {
+        $this->model = new WellnessRecord();
+        $this->validate = true;
+        $this->validateClass = new WellnessRecordValidate();
+    }
+
+    /**
+     * @Desc 查询列表
+     * @Author Gorden
+     * @Date 2024/3/21 9:58
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $field = $field ?? 'wellness_record_addtimes';
+        $order = $request->get('order', 'desc');
+        $where['wellness_record_category'] = '档案';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    protected function doSelect(array $where, string $field = null, string $order = 'desc')
+    {
+        $model = $this->model->with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'cert' => function ($query) {
+                $query->select('join_cert_member_id', 'member_cert_name');
+            }
+        ]);
+        foreach ($where as $column => $value) {
+            if (is_array($value)) {
+                if ($value[0] === 'like' || $value[0] === 'not like') {
+                    $model = $model->where($column, $value[0], "%$value[1]%");
+                } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
+                    $model = $model->where($column, $value[0], $value[1]);
+                } elseif ($value[0] == 'in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereIn($column, $valArr);
+                } elseif ($value[0] == 'not in' && !empty($value[1])) {
+                    $valArr = $value[1];
+                    if (is_string($value[1])) {
+                        $valArr = explode(",", trim($value[1]));
+                    }
+                    $model = $model->whereNotIn($column, $valArr);
+                } elseif ($value[0] == 'null') {
+                    $model = $model->whereNull($column);
+                } elseif ($value[0] == 'not null') {
+                    $model = $model->whereNotNull($column);
+                } elseif ($value[0] !== '' || $value[1] !== '') {
+                    $model = $model->whereBetween($column, $value);
+                }
+            } else {
+                $model = $model->where($column, $value);
+            }
+        }
+        if ($field) {
+            $model = $model->orderBy($field, $order);
+        }
+        return $model;
+    }
+
+    protected function afterQuery($items)
+    {
+        foreach ($items as &$item) {
+            if (!empty($item->wellness_record_file_json)) {
+                $item->wellness_record_file_json = json_decode($item->wellness_record_file_json, true);
+                $files = '';
+                foreach ($item->wellness_record_file_json as $file){
+                    $files.=getenv('STORAGE_DOMAIN').$file.',';
+                }
+                $item->wellness_record_file_json = rtrim($files,',');
+            }
+        }
+
+        return $items;
+    }
+
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+
+        return $data;
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data = $this->inputFilter($request->post());
+        $data['wellness_record_datetime'] = date('Y-m-d H:i:s', strtotime($data['wellness_record_datetime']));
+        if (!empty($data['wellness_record_file_json'])) {
+            $data['wellness_record_file_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['wellness_record_file_json']);
+            $data['wellness_record_file_json'] = json_encode(explode(',', $data['wellness_record_file_json']));
+        }
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 28 - 0
app/admin/controller/order/AppointmentController.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\admin\service\order\AppointmentService;
+use support\Request;
+use support\Response;
+
+class AppointmentController
+{
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/29 10:44
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $keywords = $request->get('keywords');
+
+        return AppointmentService::select($page, $pageSize, $keywords);
+    }
+}

+ 95 - 0
app/admin/controller/order/CompleteController.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\admin\validate\coupon\CouponValidate;
+use app\admin\validate\device\DeviceValidate;
+use app\admin\validate\order\OrderValidate;
+use app\controller\Curd;
+use app\model\Coupon;
+use app\model\Device;
+use app\model\Order;
+use app\model\OrderSheet;
+use app\model\SysSerial;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class CompleteController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Order();
+        $this->validate = true;
+        $this->validateClass = new OrderValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 15:01
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'order_addtimes';
+        $where['order_status_system'] = 'CONFIRM';
+        $where['order_is_complete'] = ['in',['Y', 'R']];
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * @Desc 订单商品详情
+     * @Author Gorden
+     * @Date 2024/3/29 8:50
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function sheet(Request $request)
+    {
+        $orderId = $request->get('order_id');
+        $orderSheet = OrderSheet::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price');
+            },
+        ])->where('join_sheet_order_id', $orderId)
+            ->get()
+            ->toArray();
+        foreach ($orderSheet as &$item) {
+            $item['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $item['goods']['goods_cover'];
+        }
+
+        $order = Order::where('order_id', $orderId)->first();
+        $data = [
+            'order' => $order,
+            'sheet' => $orderSheet
+        ];
+
+        return json_success('', $data);
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 94 - 0
app/admin/controller/order/ReturnController.php

@@ -0,0 +1,94 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\admin\validate\coupon\CouponValidate;
+use app\admin\validate\device\DeviceValidate;
+use app\admin\validate\order\OrderValidate;
+use app\controller\Curd;
+use app\model\Coupon;
+use app\model\Device;
+use app\model\Order;
+use app\model\OrderSheet;
+use app\model\SysSerial;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class ReturnController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Order();
+        $this->validate = true;
+        $this->validateClass = new OrderValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 15:01
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['order_category'] = 'RETURN';
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'order_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * @Desc 订单商品详情
+     * @Author Gorden
+     * @Date 2024/3/29 8:50
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function sheet(Request $request)
+    {
+        $orderId = $request->get('order_id');
+        $orderSheet = OrderSheet::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price');
+            },
+        ])->where('join_sheet_order_id', $orderId)
+            ->get()
+            ->toArray();
+        foreach ($orderSheet as &$item) {
+            $item['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $item['goods']['goods_cover'];
+        }
+
+        $order = Order::where('order_id', $orderId)->first();
+        $data = [
+            'order' => $order,
+            'sheet' => $orderSheet
+        ];
+
+        return json_success('', $data);
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 93 - 0
app/admin/controller/order/WholeController.php

@@ -0,0 +1,93 @@
+<?php
+
+namespace app\admin\controller\order;
+
+use app\admin\validate\coupon\CouponValidate;
+use app\admin\validate\device\DeviceValidate;
+use app\admin\validate\order\OrderValidate;
+use app\controller\Curd;
+use app\model\Coupon;
+use app\model\Device;
+use app\model\Order;
+use app\model\OrderSheet;
+use app\model\SysSerial;
+use support\exception\BusinessException;
+use support\Request;
+use support\Response;
+
+class WholeController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Order();
+        $this->validate = true;
+        $this->validateClass = new OrderValidate();
+    }
+
+    /**
+     * @Desc 列表
+     * @Author Gorden
+     * @Date 2024/3/28 15:01
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'order_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * @Desc 订单商品详情
+     * @Author Gorden
+     * @Date 2024/3/29 8:50
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function sheet(Request $request)
+    {
+        $orderId = $request->get('order_id');
+        $orderSheet = OrderSheet::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price');
+            },
+        ])->where('join_sheet_order_id', $orderId)
+            ->get()
+            ->toArray();
+        foreach ($orderSheet as &$item) {
+            $item['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $item['goods']['goods_cover'];
+        }
+
+        $order = Order::where('order_id', $orderId)->first();
+        $data = [
+            'order' => $order,
+            'sheet' => $orderSheet
+        ];
+
+        return json_success('', $data);
+    }
+
+    protected function updateInput(Request $request): array
+    {
+        $primary_key = $this->model->getKeyName();
+        $id = $request->post($primary_key);
+        $data = $this->inputFilter($request->post());
+        $data['coupon_begindate'] = strtotime($data['coupon_begindate']);
+        $data['coupon_enddate'] = strtotime($data['coupon_enddate']);
+        $model = $this->model->find($id);
+        if (!$model) {
+            throw new BusinessException('记录不存在', 2);
+        }
+        unset($data[$primary_key]);
+        return [$id, $data];
+    }
+}

+ 0 - 157
app/admin/controller/smart_devices/CategoryController.php

@@ -1,157 +0,0 @@
-<?php
-
-namespace app\admin\controller\smart_devices;
-
-use app\admin\validate\smart_devices\CategoryValidate;
-use app\common\Tree;
-use app\controller\Curd;
-use app\model\SmartDevicesCategory;
-use support\Db;
-use support\exception\BusinessException;
-use support\Request;
-use support\Response;
-
-class CategoryController extends Curd
-{
-    public function __construct()
-    {
-        $this->model = new SmartDevicesCategory();
-        $this->validate = true;
-        $this->validateClass = new CategoryValidate();
-    }
-
-    /**
-     * @Desc 列表
-     * @Author Gorden
-     * @Date 2024/3/8 10:07
-     *
-     * @param Request $request
-     * @return Response
-     * @throws BusinessException
-     */
-    public function select(Request $request): Response
-    {
-        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
-        $format = 'tree';
-        $order = $request->get('order', 'desc');
-        $field = $field ?? 'category_add_time';
-        $where['category_is_del'] = 0;
-        $query = $this->doSelect($where, $field, $order);
-        return $this->doFormat($query, $format, $limit);
-    }
-
-    /**
-     * @Desc 执行写入
-     * @Author Gorden
-     * @Date 2024/3/8 9:09
-     *
-     * @param array $data
-     * @return mixed|null
-     */
-    protected function doInsert(array $data)
-    {
-        Db::beginTransaction();
-        try {
-            $path = '/0/';
-            if ($data['category_pid'] != 0) {
-                $parent = $this->model->getParent($data['category_pid']);
-                $path = $parent['category_path'];
-            }
-            $primary_key = $this->model->getKeyName();
-            $model_class = get_class($this->model);
-            $model = new $model_class;
-            foreach ($data as $key => $val) {
-                $model->{$key} = $val;
-            }
-            $model->save();
-            $model->category_path = $path . $model->$primary_key . '/';
-            $model->save();
-            Db::commit();
-            return $primary_key ? $model->$primary_key : null;
-        } catch (\Exception $e) {
-            Db::rollBack();
-            throw new BusinessException('数据写入失败');
-        }
-    }
-
-    /**
-     * @Desc 执行更新
-     * @Author Gorden
-     * @Date 2024/3/8 10:00
-     *
-     * @param $id
-     * @param $data
-     * @return void
-     * @throws BusinessException
-     */
-    protected function doUpdate($id, $data)
-    {
-        Db::beginTransaction();
-        try {
-            $model = $this->model->find($id);
-            if ($model->category_pid != $data['category_pid']) {
-                $oldPath = $model->category_path;
-                $parent = $this->model->getParent($data['category_pid']);
-                $model->category_path = $parent['category_path'] . $model->category_id . '/';
-                // 直系下级,改path
-                $subs = $this->model->getDirectSub($id);
-                foreach ($subs as $sub) {
-                    $this->model->updatePath($sub['category_id'], str_replace($oldPath, $model->category_path, $sub['category_path']));
-                }
-            }
-            foreach ($data as $key => $val) {
-                $model->{$key} = $val;
-            }
-            $model->save();
-
-            Db::commit();
-        } catch (\Exception $e) {
-            Db::rollBack();
-            throw new BusinessException('数据更新失败~');
-        }
-    }
-
-    /**
-     * @Desc 删除
-     * @Author Gorden
-     * @Date 2024/3/8 10:11
-     *
-     * @param Request $request
-     * @return Response
-     * @throws BusinessException
-     */
-    public function delete(Request $request): Response
-    {
-        $ids = $this->deleteInput($request);
-        $this->doSoftDelete($ids, ['category_is_del' => 1]);
-
-        return json_success('success');
-    }
-
-    /**
-     * @Desc 树形数据
-     * @Author Gorden
-     * @Date 2024/3/8 10:08
-     *
-     * @param $items
-     * @return Response
-     */
-    protected function formatTree($items): Response
-    {
-        $format_items = [];
-        foreach ($items as $item) {
-            $format_items[] = [
-                'name' => $item->category_name,
-                'value' => (string)$item->category_id,
-                'id' => $item->category_id,
-                'pid' => $item->category_pid,
-                'category_name' => $item->category_name,
-                'category_level' => $item->category_level,
-                'category_add_time' => $item->category_add_time,
-                'category_update_time' => $item->category_update_time
-            ];
-        }
-        $tree = new Tree($format_items);
-        return json_success('success', $tree->getTree());
-    }
-}

+ 18 - 0
app/admin/controller/sys_manage/AdvController.php

@@ -29,9 +29,27 @@ class AdvController extends Curd
     public function select(Request $request): Response
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['adv_category'] = 'adv';
         $order = $request->get('order', 'desc');
         $field = $field ?? 'content_sort';
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/27 10:24
+     *
+     * @param Request $request
+     * @return array
+     * @throws \support\exception\BusinessException
+     */
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['adv_category'] = 'adv';
+
+        return $data;
+    }
 }

+ 20 - 18
app/admin/controller/smart_devices/ProductController.php → app/admin/controller/sys_manage/ArticleController.php

@@ -1,26 +1,28 @@
 <?php
 
-namespace app\admin\controller\smart_devices;
+namespace app\admin\controller\sys_manage;
 
-use app\admin\validate\smart_devices\ProductValidate;
+use app\admin\validate\sys_manage\AdvValidate;
+use app\admin\validate\sys_manage\ArticleValidate;
 use app\controller\Curd;
-use app\model\SmartDevicesProduct;
+use app\model\Adv;
+use app\model\Article;
 use support\Request;
 use support\Response;
 
-class ProductController extends Curd
+class ArticleController extends Curd
 {
     public function __construct()
     {
-        $this->model = new SmartDevicesProduct();
+        $this->model = new Article();
         $this->validate = true;
-        $this->validateClass = new ProductValidate();
+        $this->validateClass = new ArticleValidate();
     }
 
-    /**
-     * @Desc 列表
+    /** 列表
+     * @Desc
      * @Author Gorden
-     * @Date 2024/3/8 13:34
+     * @Date 2024/3/5 10:00
      *
      * @param Request $request
      * @return Response
@@ -29,27 +31,27 @@ class ProductController extends Curd
     public function select(Request $request): Response
     {
         [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['type'] = 'article';
         $order = $request->get('order', 'desc');
-        $field = $field ?? 'product_add_time';
-        $where['product_is_del'] = 0;
+        $field = $field ?? 'sort';
         $query = $this->doSelect($where, $field, $order);
         return $this->doFormat($query, $format, $limit);
     }
 
     /**
-     * @Desc 删除
+     * @Desc
      * @Author Gorden
-     * @Date 2024/3/8 13:34
+     * @Date 2024/3/27 10:24
      *
      * @param Request $request
-     * @return Response
+     * @return array
      * @throws \support\exception\BusinessException
      */
-    public function delete(Request $request): Response
+    protected function insertInput(Request $request): array
     {
-        $ids = $this->deleteInput($request);
-        $this->doSoftDelete($ids, ['product_is_del' => 1]);
+        $data = $this->inputFilter($request->post());
+        $data['type'] = 'article';
 
-        return json_success('success');
+        return $data;
     }
 }

+ 55 - 0
app/admin/controller/sys_manage/BannerController.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\AdvValidate;
+use app\controller\Curd;
+use app\model\Adv;
+use support\Request;
+use support\Response;
+
+class BannerController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Adv();
+        $this->validate = true;
+        $this->validateClass = new AdvValidate();
+    }
+
+    /** 列表
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/5 10:00
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['adv_category'] = 'banner';
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'content_sort';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * @Desc 插入数据处理
+     * @Author Gorden
+     * @Date 2024/3/27 10:24
+     *
+     * @param Request $request
+     * @return array
+     * @throws \support\exception\BusinessException
+     */
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['adv_category'] = 'banner';
+
+        return $data;
+    }
+}

+ 36 - 0
app/admin/controller/sys_manage/LogsController.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\AdvValidate;
+use app\controller\Curd;
+use app\model\Adv;
+use app\model\SysLog;
+use support\Request;
+use support\Response;
+
+class LogsController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new SysLog();
+    }
+
+    /** 列表
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/5 10:00
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'log_create_time';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+}

+ 8 - 1
app/admin/controller/sys_manage/MenuController.php

@@ -54,7 +54,7 @@ class MenuController extends Curd
             'menu_sort' => $params['meta']['sort'] ?? 0,
             'menu_is_show' => isset($params['meta']['hidden']) && $params['meta']['hidden'] ? 2 : 1,
             'menu_is_menu' => $params['meta']['type'] == 'menu' ? 1 : 2,
-            'menu_status' => $params['meta']['status'] ?? 2,
+            'menu_status' => $params['meta']['status'] == true ? 1 : 2,
 //            'level' => $params['level'],
         ];
         $operate = $params['operate'];
@@ -71,6 +71,8 @@ class MenuController extends Curd
             } catch (\Exception $exception) {
                 return json_fail('数据写入失败');
             }
+            // 写操作日志
+            _syslog("添加菜单", "添加菜单【" . $data['menu_name'] . '】', $data);
             return json_success('success');
         } else if ($operate == 'update') {
             $data['goods_id'] = $params['id'];
@@ -87,6 +89,8 @@ class MenuController extends Curd
             } catch (\Exception $e) {
                 return json_fail('数据更新失败');
             }
+            // 记录日志
+            _syslog("修改菜单", "修改菜单【" . $data['menu_title'] . '】', $data);
 
             return json_success('success');
         }
@@ -257,6 +261,9 @@ class MenuController extends Curd
                 $this->model->where('menu_path', 'like', $item->menu_path . '%')->delete();
             }
             Db::commit();
+            // 记录日志
+            $menu = $menu ? $menu->toArray() : [];
+            _syslog("删除菜单", "删除菜单", $menu);
             return json_success('删除成功');
         } catch (\Exception $e) {
             Db::rollBack();

+ 57 - 0
app/admin/controller/sys_manage/NewsController.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\AdvValidate;
+use app\admin\validate\sys_manage\ArticleValidate;
+use app\controller\Curd;
+use app\model\Adv;
+use app\model\Article;
+use support\Request;
+use support\Response;
+
+class NewsController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Article();
+        $this->validate = true;
+        $this->validateClass = new ArticleValidate();
+    }
+
+    /** 列表
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/5 10:00
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $where['type'] = 'news';
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'sort';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+
+    /**
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/27 10:24
+     *
+     * @param Request $request
+     * @return array
+     * @throws \support\exception\BusinessException
+     */
+    protected function insertInput(Request $request): array
+    {
+        $data = $this->inputFilter($request->post());
+        $data['type'] = 'news';
+
+        return $data;
+    }
+}

+ 39 - 0
app/admin/controller/sys_manage/SupplierController.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace app\admin\controller\sys_manage;
+
+use app\admin\validate\sys_manage\AdvValidate;
+use app\admin\validate\sys_manage\SupplierValidate;
+use app\controller\Curd;
+use app\model\Adv;
+use app\model\Supplier;
+use support\Request;
+use support\Response;
+
+class SupplierController extends Curd
+{
+    public function __construct()
+    {
+        $this->model = new Supplier();
+        $this->validate = true;
+        $this->validateClass = new SupplierValidate();
+    }
+
+    /** 列表
+     * @Desc
+     * @Author Gorden
+     * @Date 2024/3/5 10:00
+     *
+     * @param Request $request
+     * @return Response
+     * @throws \support\exception\BusinessException
+     */
+    public function select(Request $request): Response
+    {
+        [$where, $format, $limit, $field, $order] = $this->selectInput($request);
+        $order = $request->get('order', 'desc');
+        $field = $field ?? 'supplier_addtimes';
+        $query = $this->doSelect($where, $field, $order);
+        return $this->doFormat($query, $format, $limit);
+    }
+}

+ 13 - 0
app/admin/controller/sys_manage/UploadController.php

@@ -48,6 +48,19 @@ class UploadController
         return UploadService::upload($config);
     }
 
+    public function file()
+    {
+        $config = [
+            'single_limit' => 1024 * 1024 * 50,
+            'nums' => 1,
+            'include' => ['doc','docx','xlsx'],
+            'uri' => '/storage/files/',
+            'root' => public_path() . '/storage/files/',
+        ];
+
+        return UploadService::upload($config);
+    }
+
     /**
      * @Desc 修改文件状态
      * @Author Gorden

+ 2 - 0
app/admin/service/auth/AuthService.php

@@ -42,6 +42,8 @@ class AuthService
             $token = JwtToken::generateToken($extend);
             // 提交事务
             DB::commit();
+            // 写操作日志
+            _syslog("登录", "管理员【" . $params['username'] . "】登录系统; ID:" . $user->user_id, false, false, $user->user_id);
 
             return json_success('', $token);
         } catch (\Exception $e) {

+ 150 - 25
app/admin/service/goods/GoodsService.php

@@ -10,10 +10,81 @@ use app\model\GoodsSku;
 use app\model\SysSerial;
 use support\Db;
 use support\exception\BusinessException;
+use support\Request;
 use support\Response;
 
 class GoodsService
 {
+    public static function select($page, $pageSize, $keywords, $classify = "GOODS")
+    {
+        $rows = Goods::with([
+            'category' => function ($query) {
+                $query->select('category_id', 'category_name');
+            },
+            'running' => function ($query) {
+                $query->select('join_running_goods_id', 'goods_running_storage');
+            }
+        ])->select('goods_id', 'join_goods_category_id', 'join_goods_device_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_cover', 'goods_sort', 'goods_addtimes')
+            ->where('goods_classify', $classify)
+            ->when($keywords != '', function ($query) use ($keywords) {
+                $query->where('goods_name', 'like', '%' . $keywords . '%')
+                    ->orWhere('goods_title', 'like', '%', $keywords, '%');
+            })
+            ->orderBy('goods_sort', 'DESC')
+            ->forPage($page, $pageSize)
+            ->get()
+            ->toArray();
+        $total = Goods::when($keywords != '', function ($query) use ($keywords) {
+            $query->where('goods_name', 'like', '%' . $keywords . '%')
+                ->orWhere('goods_title', 'like', '%', $keywords, '%');
+        })->where('goods_classify', $classify)->count();
+
+        foreach ($rows as &$row) {
+            $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
+        }
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
+    /**
+     * @Desc 商品详情
+     * @Author Gorden
+     * @Date 2024/3/28 10:25
+     *
+     * @param $goodsId
+     * @return Response
+     */
+    public static function info($goodsId)
+    {
+        try {
+            // 商品主表
+            $main = Goods::where('goods_id', $goodsId)->first()->toArray();
+            // 详情表
+            $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first()->toArray();
+            // 标签表
+            $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first()->toArray();
+            // Running表
+            $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first()->toArray();
+            // 合并数据
+            $data = array_merge($main, $detail, $label, $running);
+
+            $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : '';
+            $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
+            $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
+            $slider = '';
+            foreach ($data['goods_detail_slider_json'] as $item) {
+                $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
+            }
+            $data['goods_detail_slider_json'] = rtrim($slider, ',');
+            $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
+
+            return json_success('', $data);
+        } catch (\Exception $e) {
+            return json_fail("查询错误~");
+        }
+    }
+
+
     /**
      * @Desc 添加商品
      * @Author Gorden
@@ -38,12 +109,15 @@ class GoodsService
 
             Db::commit();
         } catch (\PDOException $e) {
+            Db::rollBack();
+            dump($e->getMessage());
             return json_fail('数据写入失败~');
         } catch (BusinessException $e) {
             Db::rollBack();
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
             Db::rollBack();
+            dump($e->getTrace());
             return json_fail('数据写入失败~');
         }
 
@@ -74,6 +148,39 @@ class GoodsService
         return json_success('success');
     }
 
+    /**
+     * @Desc 删除商品
+     * @Author Gorden
+     * @Date 2024/3/28 13:20
+     *
+     * @param $ids
+     * @return Response
+     */
+    public static function delete($ids)
+    {
+        if (!$ids) {
+            return json_fail("数据错误~");
+        }
+        if (!is_array($ids)) {
+            $ids = [$ids];
+        }
+
+        Db::beginTransaction();
+        try {
+            Goods::whereIn('goods_id', $ids)->delete();
+            GoodsDetail::whereIn('join_detail_goods_id', $ids)->delete();
+            GoodsLabel::whereIn('join_label_goods_id', $ids)->delete();
+            GoodsRunning::whereIn('join_running_goods_id', $ids)->delete();
+
+            Db::commit();
+            return json_success("商品删除成功");
+        } catch (\Exception $e) {
+            Db::rollBack();
+
+            return json_fail("商品删除失败~");
+        }
+    }
+
     /**
      * @Desc 商品主表
      * @Author Gorden
@@ -85,27 +192,30 @@ class GoodsService
      */
     public static function mainInsert($params)
     {
+        if (!empty($params['goods_cover'])) {
+            $params['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_cover']);
+        }
         try {
             $model = new Goods();
             $model->goods_id = $params['goods_id'];
-            $model->join_goods_category_id = $params['join_goods_category_id'];
-            $model->goods_classify = $params['goods_classify'];
-            $model->goods_status = $params['goods_status'];
-            $model->goods_category = $params['goods_category'];
-            $model->goods_prefix = $params['goods_prefix'];
+            $model->join_goods_category_id = $params['join_goods_category_id'] ?? '';
+            $model->goods_classify = $params['goods_classify'] ?? '';
+            $model->goods_status = $params['goods_status'] ?? '';
+            $model->goods_category = $params['goods_category'] ?? '';
+            $model->goods_prefix = $params['goods_prefix'] ?? '';
             $model->goods_name = $params['goods_name'];
-            $model->goods_market_price = $params['goods_market_price'];
-            $model->goods_sales_price = $params['goods_sales_price'];
+            $model->goods_market_price = $params['goods_market_price'] ?? '';
+            $model->goods_sales_price = $params['goods_sales_price'] ?? '';
             $model->goods_sku_json = !empty($params['goods_sku_json']) ? $params['goods_sku_json'] : '{}';
             $model->goods_attribute_json = !empty($params['goods_attribute_json']) ? $params['goods_attribute_json'] : '{}';
             $model->goods_service_json = !empty($params['goods_service_json']) ? $params['goods_service_json'] : '{}';
-            $model->goods_title = $params['goods_title'];
-            $model->goods_cover = $params['goods_cover'];
+            $model->goods_title = $params['goods_title'] ?? '';
+            $model->goods_cover = $params['goods_cover'] ?? '';
             $model->goods_on_addtimes = $params['goods_on_addtimes'] ? strtotime($params['goods_on_addtimes']) : null;
             $model->goods_sort = $params['goods_sort'];
-            $model->goods_groupby = $params['goods_groupby'];
-            $model->goods_remark = $params['goods_remark'];
-            $model->goods_extend_json = $params['goods_extend_json'];
+            $model->goods_groupby = $params['goods_groupby'] ?? '';
+            $model->goods_remark = $params['goods_remark'] ?? '';
+            $model->goods_extend_json = $params['goods_extend_json'] ?? '{}';
             $model->goods_addtimes = time();
             if ($model->save()) {
                 return $model->goods_id;
@@ -113,6 +223,7 @@ class GoodsService
             // 异常
             throw new BusinessException("数据写入失败~");
         } catch (\Exception $e) {
+            dump($e->getMessage());
             throw new BusinessException("数据写入失败~");
         }
     }
@@ -128,18 +239,23 @@ class GoodsService
      */
     public static function detailInsert($params)
     {
+        if (!empty($params['goods_detail_slider_json'])) {
+            $params['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $params['goods_detail_slider_json']);
+            $params['goods_detail_slider_json'] = json_encode(explode(',', $params['goods_detail_slider_json']));
+        }
         try {
             $model = new GoodsDetail();
             $model->join_detail_goods_id = $params['goods_id'];
-            $model->goods_detail_code_json = $params['goods_detail_code_json'];
-            $model->goods_detail_slider_json = $params['goods_detail_slider_json'];
-            $model->goods_detail_specs_json = $params['goods_detail_specs_json'];
-            $model->goods_detail_content = $params['goods_detail_content'];
+            $model->goods_detail_code_json = $params['goods_detail_code_json'] ?? '{}';
+            $model->goods_detail_slider_json = $params['goods_detail_slider_json'] ?? '{}';
+            $model->goods_detail_specs_json = $params['goods_detail_specs_json'] ?? '{}';
+            $model->goods_detail_content = $params['goods_detail_content'] ?? '';
             if (!$model->save()) {
                 // 异常
                 throw new BusinessException("数据写入失败~");
             }
         } catch (\Exception $e) {
+            dump($e->getMessage());
             throw new BusinessException("数据写入失败~");
         }
     }
@@ -157,7 +273,7 @@ class GoodsService
     {
         $model = new GoodsLabel();
         $model->join_label_goods_id = $params['goods_id'];
-        $model->goods_label = $params['goods_label'];
+        $model->goods_label = $params['goods_label'] ? implode(',', $params['goods_label']) : '';
         $model->goods_label_extend_json = !empty($params['goods_label_extend_json']) ? $params['goods_label_extend_json'] : '{}';
         if (!$model->save()) {
             // 异常
@@ -179,14 +295,15 @@ class GoodsService
         try {
             $model = new GoodsRunning();
             $model->join_running_goods_id = $params['goods_id'];
-            $model->goods_running_storage = $params['goods_running_storage'];
-            $model->goods_running_sale = $params['goods_running_sale'];
-            $model->goods_running_off_type = $params['goods_running_off_type'];
-            $model->goods_running_off_json = $params['goods_running_off_json'];
+            $model->goods_running_storage = $params['goods_running_storage'] ?? '';
+            $model->goods_running_sale = $params['goods_running_sale'] ?? '';
+            $model->goods_running_off_type = $params['goods_running_off_type'] ?? '';
+            $model->goods_running_off_json = $params['goods_running_off_json'] ?? '{}';
             if (!$model->save()) {
                 throw new BusinessException('数据写入失败');
             }
         } catch (\Exception $e) {
+            dump($e->getMessage());
             throw new BusinessException('数据写入失败');
         }
     }
@@ -232,13 +349,16 @@ class GoodsService
     {
         try {
             $data = self::inputFilter($params, new Goods());
+            if (!empty($data['goods_cover'])) {
+                $data['goods_cover'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_cover']);
+            }
             $data['goods_on_addtimes'] = strtotime($data['goods_on_addtimes']);
 
             self::doUpdate($data['goods_id'], $data, new Goods());
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
-            throw new BusinessException('数据更新异常~');
+            throw new BusinessException('数据更新异常~1');
         }
     }
 
@@ -255,13 +375,18 @@ class GoodsService
     {
         try {
             $data = self::inputFilter($params, new GoodsDetail());
+            if (!empty($data['goods_detail_slider_json'])) {
+                $data['goods_detail_slider_json'] = str_replace(getenv('STORAGE_DOMAIN'), '', $data['goods_detail_slider_json']);
+                $data['goods_detail_slider_json'] = json_encode(explode(',', $data['goods_detail_slider_json']));
+            }
             // 根据goods_id 查详情ID
             $detail = GoodsDetail::where('join_detail_goods_id', $params['goods_id'])->first();
             self::doUpdate($detail->goods_detail_id, $data, new GoodsDetail());
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
-            throw new BusinessException('数据更新异常~');
+            dump($e->getMessage());
+            throw new BusinessException('数据更新异常~2');
         }
     }
 
@@ -284,7 +409,7 @@ class GoodsService
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
-            throw new BusinessException('数据更新异常~');
+            throw new BusinessException('数据更新异常~3');
         }
     }
 
@@ -307,7 +432,7 @@ class GoodsService
         } catch (BusinessException $e) {
             throw new BusinessException($e->getMessage());
         } catch (\Exception $e) {
-            throw new BusinessException('数据更新异常~');
+            throw new BusinessException('数据更新异常~4');
         }
     }
 

+ 32 - 0
app/admin/service/order/AppointmentService.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace app\admin\service\order;
+
+use app\model\Appointment;
+
+class AppointmentService
+{
+    public static function select($page, $pageSize, $keywords)
+    {
+        $rows = Appointment::with([
+            'member' => function ($query) {
+                $query->select('member_id', 'member_mobile');
+            },
+            'goods' => function ($query) {
+                $query->select('goods_id', 'goods_name', 'goods_cover', 'goods_market_price', 'goods_sales_price');
+            },
+            'order',
+            'benefit'
+        ])->orderBy('appointment_addtimes', 'DESC')
+            ->forPage($page, $pageSize)
+            ->get()
+            ->toArray();
+        $total = Appointment::count();
+
+        foreach ($rows as &$row) {
+            $row['goods']['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods']['goods_cover'];
+        }
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+}

+ 30 - 0
app/admin/validate/coupon/CouponValidate.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\admin\validate\coupon;
+
+use think\Validate;
+
+class CouponValidate extends Validate
+{
+    /**
+     * 规则
+     * @var string[]
+     */
+    protected $rule = [
+        'coupon_id' => 'require|alphaDash',
+        'coupon_status' => 'require|in:ACTIVED,DISABLED',
+        'coupon_category' => 'max:32',
+        'coupon_name' => 'require|max:32',
+        'coupon_begindate' => 'require',
+        'coupon_enddate' => 'require',
+    ];
+
+    /**
+     * 场景
+     * @var array[]
+     */
+    protected $scene = [
+        'add' => ['coupon_status', 'coupon_category', 'coupon_name', 'coupon_begindate', 'coupon_enddate'],
+        'update' => ['coupon_id', 'coupon_status', 'coupon_category', 'coupon_name', 'coupon_begindate', 'coupon_enddate'],
+    ];
+}

+ 6 - 5
app/admin/validate/goods/GoodsValidate.php

@@ -8,7 +8,7 @@ class GoodsValidate extends Validate
 {
     protected $rule = [
         'goods_id' => 'require|alphaDash',
-        'join_goods_category_id' => 'require|integer',
+        'join_goods_category_id' => 'integer',
         'join_goods_device_id' => 'max:32',
         'goods_classify' => 'require|in:GOODS,DEVICE,SERVICE,SPECIAL,PACKAGE,OTHER',  // GOODS=实物商品|DEVICE=设备|SERIVCE=服务|SPECIAL=专题业务|PACKAGE=套包|OTHER=其他
         'goods_status' => 'require|in:PENDING,ON,OFF,DISABLED',    // 产品状态 PENDING=待处理|ON=上架(已激活)|OFF=下架|DISABLED=已禁用
@@ -21,12 +21,12 @@ class GoodsValidate extends Validate
         'goods_attribute_json' => 'isJson',
         'goods_service_json' => 'isJson',
         'goods_title' => 'max:128',
-        'goods_cover' => 'require|regex:/^[0-9a-zA-Z\.\/]+$/',
+        'goods_cover' => 'url',
         'goods_on_addtimes' => 'date',
         'goods_sort' => 'integer',
         'goods_groupby' => 'max:32;',
         'goods_extend_json' => 'isJson',
-        'goods_slide' => 'regex:/^[0-9a-zA-Z\.\/\,]+$/',
+//        'goods_slide' => 'regex:/^[0-9a-zA-Z\.\/\,]+$/',
         'goods_specs_json' => 'isJson',
 //        'goods_content' => '',
         'goods_label' => 'max:32',
@@ -52,16 +52,17 @@ class GoodsValidate extends Validate
     protected $scene = [
         'add' => ['join_goods_category_id', 'join_goods_device_id', 'goods_classify', 'goods_status', 'goods_category', 'goods_prefix',
             'goods_name', 'goods_market_price', 'goods_sku_json', 'goods_attribute_json', 'goods_service_json', 'goods_title',
-            'goods_cover', 'goods_on_addtimes', 'goods_sort', 'goods_groupby', 'goods_extend_json', 'goods_slide', 'goods_specs_json',
+            'goods_cover', 'goods_on_addtimes', 'goods_sort', 'goods_groupby', 'goods_extend_json', 'goods_specs_json',
             'goods_label', 'goods_storage', 'goods_sale', 'goods_running_off_type', 'goods_running_off_json', 'goods_sku_status',
             'goods_sku_specs_json', 'goods_sku_title', 'goods_sku_images_json', 'goods_sku_market_price', 'goods_sku_sales_price',
             'goods_sku_storage_json', 'goods_sku_service_json', 'goods_sku_extend_json'],
         'update' => ['goods_id', 'join_goods_category_id', 'join_goods_device_id', 'goods_classify', 'goods_status', 'goods_category', 'goods_prefix',
             'goods_name', 'goods_market_price', 'goods_sku_json', 'goods_attribute_json', 'goods_service_json', 'goods_title',
-            'goods_cover', 'goods_on_addtimes', 'goods_sort', 'goods_groupby', 'goods_extend_json', 'goods_slide', 'goods_specs_json',
+            'goods_cover', 'goods_on_addtimes', 'goods_sort', 'goods_groupby', 'goods_extend_json', 'goods_specs_json',
             'goods_label', 'goods_storage', 'goods_sale', 'goods_running_off_type', 'goods_running_off_json', 'goods_sku_status',
             'goods_sku_specs_json', 'goods_sku_title', 'goods_sku_images_json', 'goods_sku_market_price', 'goods_sku_sales_price',
             'goods_sku_storage_json', 'goods_sku_service_json', 'goods_sku_extend_json'],
+        'info' => ['goods_id'],
     ];
 
     /**

+ 27 - 0
app/admin/validate/member/WellnessRecordValidate.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate\member;
+
+use think\Validate;
+
+class WellnessRecordValidate extends Validate
+{
+    protected $rule = [
+        'wellness_record_id' => 'require|integer',
+        'join_wellness_record_member_id' => 'require',
+        'wellness_record_status' => 'max:32',
+        'wellness_record_category' => 'in:档案,体检,病例,医嘱,来访,其他',
+        'wellness_record_name' => 'require',
+//        'wellness_record_datetime' => 'max:20',
+        'wellness_record_file_json' => 'isJson',
+        'wellness_record_json' => 'isJson',
+        'wellness_record_extend_json' => 'isJson',
+    ];
+
+    protected $message = [];
+
+    protected $scene = [
+        'add' => ['join_wellness_record_member_id', 'wellness_record_category', 'wellness_record_name', 'wellness_record_datetime'],
+        'update' => ['wellness_record_id', 'join_wellness_record_member_id', 'wellness_record_category', 'wellness_record_name', 'wellness_record_datetime'],
+    ];
+}

+ 30 - 0
app/admin/validate/order/OrderValidate.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\admin\validate\order;
+
+use think\Validate;
+
+class OrderValidate extends Validate
+{
+    /**
+     * 规则
+     * @var string[]
+     */
+    protected $rule = [
+        'order_id' => 'require|alphaDash',
+        'join_order_member_id' => 'require|alphaDash',
+        'order_name' => 'max:32',
+        'order_status_system' => 'require|max:32',
+        'order_status_payment' => 'require|max:32',
+        'order_status_storage' => 'require|max:32',
+    ];
+
+    /**
+     * 场景
+     * @var array[]
+     */
+    protected $scene = [
+        'add' => ['join_order_member_id', 'order_name', 'order_status_system', 'order_status_payment', 'order_status_storage'],
+        'update' => ['order_id', 'join_order_member_id', 'order_name', 'order_status_system', 'order_status_payment', 'order_status_storage'],
+    ];
+}

+ 0 - 22
app/admin/validate/smart_devices/CategoryValidate.php

@@ -1,22 +0,0 @@
-<?php
-
-namespace app\admin\validate\smart_devices;
-
-use think\Validate;
-
-class CategoryValidate extends Validate
-{
-    protected $rule = [
-        'category_id' => 'require|integer',
-        'category_pid' => 'require|integer',
-        'category_name' => 'require|max:150',
-        'category_level' => 'integer|max:1'
-    ];
-
-    protected $message = [];
-
-    protected $scene = [
-        'add' => ['category_pid', 'category_name', 'category_level'],
-        'update' => ['category_id', 'category_pid', 'category_name', 'category_level']
-    ];
-}

+ 0 - 27
app/admin/validate/smart_devices/ProductValidate.php

@@ -1,27 +0,0 @@
-<?php
-
-namespace app\admin\validate\smart_devices;
-
-use think\Validate;
-
-class ProductValidate extends Validate
-{
-    protected $rule = [
-        'product_id' => 'require|integer',
-        'product_category_id' => 'require|integer',
-        'product_name' => 'require|max:255',
-        'product_img' => 'regex:/^[0-9a-zA-Z\.\/]+$/',
-        'product_brand' => 'max:255',
-        'product_code' => 'max:255',
-        'product_type' => 'require|integer',
-        'product_is_bind_many' => 'require|integer',
-        'product_is_bind_rome' => 'require|integer'
-    ];
-
-    protected $message = [];
-
-    protected $scene = [
-        'add' => ['product_category_id', 'product_name', 'product_img', 'product_brand', 'product_code', 'product_type', 'product_is_bind_many', 'product_is_bind_rome'],
-        'update' => ['product_id', 'product_category_id', 'product_name', 'product_img', 'product_brand', 'product_code', 'product_type', 'product_is_bind_many', 'product_is_bind_rome'],
-    ];
-}

+ 23 - 0
app/admin/validate/sys_manage/ArticleValidate.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace app\admin\validate\sys_manage;
+
+use think\Validate;
+
+class ArticleValidate extends Validate
+{
+    protected $rule = [
+        'id' => 'require|integer',
+        'title' => 'require|max:64',
+        'author' => 'max:64',
+        'introduce' => 'max:255',
+        'sort'=>'integer'
+    ];
+
+    protected $message = [];
+
+    protected $scene = [
+        'add' => ['title', 'author', 'introduce','sort'],
+        'update' => ['id', 'title', 'author', 'introduce','sort'],
+    ];
+}

+ 43 - 0
app/admin/validate/sys_manage/SupplierValidate.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace app\admin\validate\sys_manage;
+
+use think\Validate;
+
+class SupplierValidate extends Validate
+{
+    protected $rule = [
+        'supplier_id' => 'require|integer',
+        'join_supplier_category_id' => 'integer',
+        'supplier_status' => 'require|in:ACTIVED,DISABLED',
+        'supplier_category' => 'max:32',
+        'supplier_name' => 'require|max:64',
+        'supplier_contact_json' => 'isJson',
+        'supplier_config_json' => 'isJson',
+        'supplier_extend_json' => 'isJson'
+    ];
+
+    protected $message = [];
+
+    protected $scene = [
+        'add' => ['join_supplier_category_id', 'supplier_status', 'supplier_category', 'supplier_name', 'supplier_contact_json', 'supplier_config_json', 'supplier_extend_json'],
+        'update' => ['supplier_id', 'join_supplier_category_id', 'supplier_status', 'supplier_category', 'supplier_name', 'supplier_contact_json', 'supplier_config_json', 'supplier_extend_json'],
+    ];
+
+    /**
+     * @Desc 验证json数据
+     * @Author Gorden
+     * @Date 2024/3/27 13:18
+     *
+     * @param $value
+     * @return string|true
+     */
+    public function isJson($value)
+    {
+        if (is_json($value)) {
+            return true;
+        }
+
+        return "数据格式错误";
+    }
+}

+ 3 - 2
app/controller/Curd.php

@@ -101,8 +101,8 @@ class Curd
             $this->doInsert($data);
         } catch (BusinessException $customException) {
             return json_fail($customException->getMessage());
-        } catch (\Exception $exception) {
-            dump($exception->getMessage());
+        } catch (\Exception $e) {
+            dump($e->getMessage());
             return json_fail('数据写入失败');
         }
         return json_success('success');
@@ -126,6 +126,7 @@ class Curd
         } catch (BusinessException $e) {
             return json_fail($e->getMessage());
         } catch (\Exception $e) {
+            dump($e->getTrace());
             return json_fail('数据更新失败');
         }
 

+ 75 - 0
app/model/Appointment.php

@@ -0,0 +1,75 @@
+<?php
+
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class Appointment extends Model
+{
+    protected $table = 'appointment';
+
+    protected $primaryKey = 'appointment_id';
+
+    protected $keyType = 'string';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'appointment_addtimes';
+
+    const UPDATED_AT = 'null';
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联用户
+     * @Author Gorden
+     * @Date 2024/3/29 10:59
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_appointment_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/29 10:58
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_appointment_goods_id');
+    }
+
+    /**
+     * @Desc 关联订单
+     * @Author Gorden
+     * @Date 2024/3/29 10:58
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function order()
+    {
+        return $this->hasOne(Order::class, 'order_id', 'join_appointment_order_id');
+    }
+
+    /**
+     * @Desc 关联权益
+     * @Author Gorden
+     * @Date 2024/3/29 10:58
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function benefit()
+    {
+        return $this->hasOne(MemberBenefit::class, 'member_benefit_id', 'join_appointment_member_benefit_id');
+    }
+}

+ 19 - 0
app/model/Article.php

@@ -0,0 +1,19 @@
+<?php
+
+
+namespace app\model;
+
+use support\Model;
+
+class Article extends Model
+{
+    protected $table = 'article';
+
+    protected $primaryKey = 'id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'create_time';
+
+    const UPDATED_AT = 'update_time';
+}

+ 47 - 0
app/model/Cart.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class Cart extends Model
+{
+    protected $table = 'cart';
+
+    protected $primaryKey = 'cart_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'cart_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(\DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_cart_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_cart_goods_id');
+    }
+}

+ 48 - 0
app/model/ClientBrowse.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class ClientBrowse extends Model
+{
+    protected $table = 'client_browse';
+
+    protected $primaryKey = 'client_browse_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'client_browse_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_client_browse_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_client_browse_goods_id');
+    }
+}

+ 48 - 0
app/model/ClientFavorite.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class ClientFavorite extends Model
+{
+    protected $table = 'client_favorite';
+
+    protected $primaryKey = 'client_favorite_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'client_favorite_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_client_favorite_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_client_favorite_goods_id');
+    }
+}

+ 52 - 0
app/model/ClientPoints.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class ClientPoints extends Model
+{
+    protected $table = 'client_points';
+
+    protected $primaryKey = 'client_points_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'client_points_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(\DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_client_points_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_client_points_goods_id');
+    }
+
+    public function orders()
+    {
+        return $this->hasOne(Order::class, 'order_id', 'join_client_points_order_id');
+    }
+}

+ 24 - 0
app/model/Coupon.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class Coupon extends Model
+{
+    protected $table = 'coupon';
+
+    protected $primaryKey = 'coupon_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'coupon_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 47 - 0
app/model/CouponDetail.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class CouponDetail extends Model
+{
+    protected $table = 'coupon_detail';
+
+    protected $primaryKey = 'coupon_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'coupon_detail_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(\DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_coupon_member_id');
+    }
+
+    /**
+     * @Desc 关联优惠券
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function coupon()
+    {
+        return $this->hasOne(Coupon::class, 'coupon_id', 'join_detail_coupon_id');
+    }
+}

+ 30 - 0
app/model/Goods.php

@@ -2,6 +2,7 @@
 
 namespace app\model;
 
+use DateTimeInterface;
 use support\Model;
 
 class Goods extends Model
@@ -18,4 +19,33 @@ class Goods extends Model
     const CREATED_AT = 'goods_addtimes';
 
     const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联分类
+     * @Author Gorden
+     * @Date 2024/3/28 9:36
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function category()
+    {
+        return $this->hasOne(SysCategory::class, 'category_id', 'join_goods_category_id');
+    }
+
+    /**
+     * @Desc 关联GoodsRunning
+     * @Author Gorden
+     * @Date 2024/3/28 10:04
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function running()
+    {
+        return $this->hasOne(GoodsRunning::class, 'join_running_goods_id', 'goods_id');
+    }
 }

+ 48 - 0
app/model/GoodsEvaluate.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class GoodsEvaluate extends Model
+{
+    protected $table = 'goods_evaluate';
+
+    protected $primaryKey = 'goods_evaluate_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'goods_evaluate_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联会员
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_evaluate_member_id');
+    }
+
+    /**
+     * @Desc 关联商品
+     * @Author Gorden
+     * @Date 2024/3/30 13:08
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_evaluate_goods_id');
+    }
+}

+ 26 - 0
app/model/Order.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class Order extends Model
+{
+    protected $table = 'order';
+
+    protected $primaryKey = 'order_id';
+
+    protected $keyType = 'string';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'order_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 60 - 0
app/model/OrderSheet.php

@@ -0,0 +1,60 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class OrderSheet extends Model
+{
+    protected $table = 'order_sheet';
+
+    protected $primaryKey = 'order_sheet_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'order_sheet_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联Member
+     * @Author Gorden
+     * @Date 2024/3/29 9:18
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_sheet_member_id');
+    }
+
+    /**
+     * @Desc 关联Goods
+     * @Author Gorden
+     * @Date 2024/3/29 9:19
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function goods()
+    {
+        return $this->hasOne(Goods::class, 'goods_id', 'join_sheet_goods_id');
+    }
+
+    /**
+     * @Desc 关联订单
+     * @Author Gorden
+     * @Date 2024/3/29 9:19
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function order()
+    {
+        return $this->hasOne(Order::class, 'order_id', 'join_sheet_order_id');
+    }
+}

+ 24 - 0
app/model/Supplier.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class Supplier extends Model
+{
+    public $table = 'supplier';
+
+    public $primaryKey = 'supplier_id';
+
+    public $dateFormat = 'U';
+
+    const CREATED_AT = 'supplier_addtimes';
+
+    const UPDATED_AT = null;
+
+    public function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 24 - 0
app/model/SysLog.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class SysLog extends Model
+{
+    protected $table = 'sys_log';
+
+    protected $primaryKey = 'log_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'log_create_time';
+
+    const UPDATED_AT = null;
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+}

+ 47 - 0
app/model/WellnessRecord.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace app\model;
+
+use DateTimeInterface;
+use support\Model;
+
+class WellnessRecord extends Model
+{
+    protected $table = 'wellness_record';
+
+    protected $primaryKey = 'wellness_record_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'wellness_record_addtimes';
+
+    const UPDATED_AT = null;
+
+    protected function serializeDate(DateTimeInterface $date)
+    {
+        return $date->format('Y-m-d H:i:s');
+    }
+
+    /**
+     * @Desc 关联用户
+     * @Author Gorden
+     * @Date 2024/3/29 16:10
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(Member::class, 'member_id', 'join_wellness_record_member_id');
+    }
+
+    /**
+     * @Desc 关联用户身份
+     * @Author Gorden
+     * @Date 2024/3/29 16:10
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function cert(){
+        return $this->hasOne(MemberCert::class,'join_cert_member_id','join_wellness_record_member_id');
+    }
+}

+ 197 - 23
route/admin.php

@@ -6,6 +6,7 @@ Route::group('/admin', function () {
     Route::group('/upload', function () {
         Route::post('/image', [\app\admin\controller\sys_manage\UploadController::class, 'image']);
         Route::post('/video', [\app\admin\controller\sys_manage\UploadController::class, 'video']);
+        Route::post('/file', [\app\admin\controller\sys_manage\UploadController::class, 'file']);
         Route::post('/updateStatus/{id:\d+}', [\app\admin\controller\sys_manage\UploadController::class, 'updateStatus']);
     })->middleware([
         \app\middleware\AdminAuthCheck::class
@@ -18,6 +19,48 @@ Route::group('/admin', function () {
     })->middleware([
         \app\middleware\AdminAuthCheck::class
     ]);
+    Route::group('/goods', function () {
+        /* 实物商品管理 */
+        Route::group('/entity', function () {
+            Route::get('/list', [\app\admin\controller\goods\EntityGoodsController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\goods\EntityGoodsController::class, 'info']);
+            Route::post('/add', [\app\admin\controller\goods\EntityGoodsController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\goods\EntityGoodsController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\goods\EntityGoodsController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 业务服务商品管理 */
+        Route::group('/service', function () {
+            Route::get('/list', [\app\admin\controller\goods\ServiceGoodsController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\goods\ServiceGoodsController::class, 'info']);
+            Route::post('/add', [\app\admin\controller\goods\ServiceGoodsController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\goods\ServiceGoodsController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\goods\ServiceGoodsController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 营销专题商品管理 */
+        Route::group('/special', function () {
+            Route::get('/list', [\app\admin\controller\goods\SpecialGoodsController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\goods\SpecialGoodsController::class, 'info']);
+            Route::post('/add', [\app\admin\controller\goods\SpecialGoodsController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\goods\SpecialGoodsController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\goods\SpecialGoodsController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 实物商品管理 */
+        Route::group('/package', function () {
+            Route::get('/list', [\app\admin\controller\goods\PackageGoodsController::class, 'select']);
+            Route::get('/info', [\app\admin\controller\goods\PackageGoodsController::class, 'info']);
+            Route::post('/add', [\app\admin\controller\goods\PackageGoodsController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\goods\PackageGoodsController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\goods\PackageGoodsController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+    });
     /* 系统管理中心 */
     Route::group('/sys', function () {
         /* 角色管理 */
@@ -98,6 +141,30 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        Route::group('/banner', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\BannerController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\sys_manage\BannerController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\sys_manage\BannerController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\BannerController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        Route::group('/article', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\ArticleController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\sys_manage\ArticleController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\sys_manage\ArticleController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\ArticleController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        Route::group('/news', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\NewsController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\sys_manage\NewsController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\sys_manage\NewsController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\NewsController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
         Route::group('/menu', function () {
             Route::get('/my', [\app\admin\controller\sys_manage\MenuController::class, 'myMenu']);
             Route::get('/list', [\app\admin\controller\sys_manage\MenuController::class, 'select']);
@@ -108,6 +175,21 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
+        /* 供应商管理 */
+        Route::group('/supplier', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\SupplierController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\sys_manage\SupplierController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\sys_manage\SupplierController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\sys_manage\SupplierController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 日志管理 */
+        Route::group('/log', function () {
+            Route::get('/list', [\app\admin\controller\sys_manage\LogsController::class, 'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
 
     /* 业务支撑 */
@@ -354,9 +436,37 @@ Route::group('/admin', function () {
         ]);
         // 用户管理
         Route::group('', function () {
+            Route::get('/selectList', [\app\admin\controller\member\MemberController::class, 'selectList']);
             Route::get('/list', [\app\admin\controller\member\MemberController::class, 'list']);
             Route::post('/add', [\app\admin\controller\member\MemberController::class, 'add']);
         });
+        /* 档案管理 */
+        Route::group('/wellnessRecord', function () {
+            Route::get('/list', [\app\admin\controller\member\WellnessRecordController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\member\WellnessRecordController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\member\WellnessRecordController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\member\WellnessRecordController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 体检管理 */
+        Route::group('/checkup', function () {
+            Route::get('/list', [\app\admin\controller\member\CheckupController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\member\CheckupController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\member\CheckupController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\member\CheckupController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        /* 来访管理 */
+        Route::group('/visiting', function () {
+            Route::get('/list', [\app\admin\controller\member\VisitingController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\member\VisitingController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\member\VisitingController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\member\VisitingController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
     });
     /* 营销管理 */
     Route::group('/marketing', function () {
@@ -391,28 +501,6 @@ Route::group('/admin', function () {
             \app\middleware\AdminAuthCheck::class
         ]);
     });
-    /* 智能设备管理 */
-    Route::group('/smartDevices', function () {
-        /* 智能设备分类管理 */
-        Route::group('/category', function () {
-            Route::get('/list', [\app\admin\controller\smart_devices\CategoryController::class, 'select']);
-            Route::post('/add', [\app\admin\controller\smart_devices\CategoryController::class, 'insert']);
-            Route::post('/update', [\app\admin\controller\smart_devices\CategoryController::class, 'update']);
-            Route::delete('/delete', [\app\admin\controller\smart_devices\CategoryController::class, 'delete']);
-        })->middleware([
-            \app\middleware\AdminAuthCheck::class
-        ]);
-        /* 智能设备管理 */
-        Route::group('/product', function () {
-            Route::get('/list', [\app\admin\controller\smart_devices\ProductController::class, 'select']);
-            Route::post('/add', [\app\admin\controller\smart_devices\ProductController::class, 'insert']);
-            Route::post('/update', [\app\admin\controller\smart_devices\ProductController::class, 'update']);
-            Route::delete('/delete', [\app\admin\controller\smart_devices\ProductController::class, 'delete']);
-        })->middleware([
-            \app\middleware\AdminAuthCheck::class
-        ]);
-    });
-
     /* 康养设备管理 */
     Route::group('/device', function () {
         Route::group('/ledger', function () {
@@ -424,7 +512,7 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
-        Route::group('',function (){
+        Route::group('', function () {
             Route::get('/list', [\app\admin\controller\device\DeviceController::class, 'select']);
             Route::post('/add', [\app\admin\controller\device\DeviceController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\device\DeviceController::class, 'update']);
@@ -433,4 +521,90 @@ Route::group('/admin', function () {
             \app\middleware\AdminAuthCheck::class
         ]);
     });
+    /* 优惠券管理 */
+    Route::group('/coupon', function () {
+        Route::group('', function () {
+            Route::get('/list', [\app\admin\controller\coupon\CouponController::class, 'select']);
+            Route::post('/add', [\app\admin\controller\coupon\CouponController::class, 'insert']);
+            Route::post('/update', [\app\admin\controller\coupon\CouponController::class, 'update']);
+            Route::delete('/delete', [\app\admin\controller\coupon\CouponController::class, 'delete']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+    });
+    /* 订单管理 */
+    Route::group('/order', function () {
+        // 全部订单
+        Route::group('/whole', function () {
+            Route::get('/list', [\app\admin\controller\order\WholeController::class, 'select']);
+            Route::get('/sheet', [\app\admin\controller\order\WholeController::class, 'sheet']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 售后订单
+        Route::group('/return', function () {
+            Route::get('/list', [\app\admin\controller\order\ReturnController::class, 'select']);
+            Route::get('/sheet', [\app\admin\controller\order\ReturnController::class, 'sheet']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 已完成订单
+        Route::group('/complete', function () {
+            Route::get('/list', [\app\admin\controller\order\CompleteController::class, 'select']);
+            Route::get('/sheet', [\app\admin\controller\order\CompleteController::class, 'sheet']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 预约订单
+        Route::group('/appointment', function () {
+            Route::get('/list', [\app\admin\controller\order\AppointmentController::class, 'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+    });
+    /* 客户端相关数据 */
+    Route::group('/client', function () {
+        // 我的关注
+        Route::group('/favorite',function (){
+            Route::get('/list',[\app\admin\controller\client\FavoriteController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的收藏
+        Route::group('/collection',function (){
+            Route::get('/list',[\app\admin\controller\client\FavoriteController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的积分
+        Route::group('/points',function (){
+            Route::get('/list',[\app\admin\controller\client\PointsController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的评价
+        Route::group('/evaluate',function (){
+            Route::get('/list',[\app\admin\controller\client\EvaluateController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的购物车
+        Route::group('/cart',function (){
+            Route::get('/list',[\app\admin\controller\client\CartController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的优惠券
+        Route::group('/coupon',function (){
+            Route::get('/list',[\app\admin\controller\client\CouponController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+        // 我的浏览数据
+        Route::group('/browse',function (){
+            Route::get('/list',[\app\admin\controller\client\BrowseController::class,'select']);
+        })->middleware([
+            \app\middleware\AdminAuthCheck::class
+        ]);
+    });
 });

+ 23 - 0
support/helpers.php

@@ -616,4 +616,27 @@ function chinese_week($week)
     $weekArray = ['日', '一', '二', '三', '四', '五', '六'];
 
     return '周' . $weekArray[$week];
+}
+
+/**
+ * @Desc 管理员操作日志
+ * @Author Gorden
+ * @Date 2024/3/29 17:07
+ *
+ * @param $name
+ * @param $operation
+ * @return void
+ */
+function _syslog($name, $operation, $operationData = false, $requestParams = false, $adminId = false)
+{
+    $logAdminId = $adminId ? $adminId : \Tinywan\Jwt\JwtToken::getCurrentId();
+    $model = new \app\model\SysLog();
+    $model->log_admin_id = $logAdminId;
+    $model->log_name = $name;
+    $model->log_route = \request()->route->getPath();
+    $model->log_operation = $operation;
+    $model->log_ip = \request()->getRealIp();
+    $model->log_request_params = $requestParams ? json_encode($requestParams) : json_encode(\request()->all());
+    $model->log_operation_data = $operationData ? json_encode($operationData) : '{}';
+    $model->save();
 }