Zory 2 недель назад
Родитель
Сommit
e8895e87cb

+ 143 - 0
app/controller/admin/Factory.php

@@ -0,0 +1,143 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\agent\FactoryService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasAgent;
+use app\model\saas\SaasFactory;
+use app\model\system\SystemUser;
+use app\validate\user\FactoryValidate;
+use DI\Attribute\Inject;
+use Hzdad\Codecheck\Codecheck;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/factory"),Middleware(AuthMiddleware::class)]
+class Factory extends Base
+{
+
+    #[Inject]
+    protected FactoryService $service;
+
+    #[Inject]
+    protected FactoryValidate $validate;
+
+    #[Inject]
+    protected SaasFactory $model;
+
+    protected string $scene = "edit";
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans("success.data",pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑代理
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            $agent = (new SaasAgent)->where("agent_id",$param['agent_id'])->findOrEmpty();
+            if ($agent->isEmpty()) return errorTrans("error.agent-no-exist");
+            if (!isset($param['id'])) {
+                $param['user_id'] = $param['factory_id'] = CodeExtend::random(16,1,date("md"));
+                if (!empty($param['username'])) {
+                    $userName = (new SystemUser)->where("username",$param['username'])->findOrEmpty();
+                    if (!$userName->isEmpty()) return errorTrans("error.user-exist");
+                }
+            }
+            $param['vip_at'] = $agent['vip_at'];
+            if (!$this->validate->scene($this->scene)->check($request->post())) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            $this->sceneUser($param,4,"id");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+}

+ 30 - 0
app/controller/admin/Order.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/order"),Middleware(AuthMiddleware::class)]
+class Order extends Base
+{
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            return successTrans("success.data",[],200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 59 - 1
app/controller/admin/Store.php

@@ -75,7 +75,7 @@ class Store extends Base
             if (!$this->validate->scene($this->scene)->check($request->post())) return error($this->validate->getError());
             $state = $this->model->setAutoData($param);
             if (!$state) return errorTrans("error.data");
-            $this->sceneUser($param,3);
+            $this->sceneUser($param,3,"id");
             return successTrans("success.data");
         } catch (\Throwable $throwable) {
             echo $throwable->getMessage()."\n";
@@ -85,4 +85,62 @@ class Store extends Base
         }
     }
 
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 7 - 2
app/controller/admin/User.php

@@ -64,8 +64,13 @@ class User extends Base
             $param = $request->post();
             if (!isset($param['id'])) {
                 $this->scene = "add";
-                $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
-                if (!$code) return errorTrans("error.sms-err");
+                if ($param['type'] < 4) {
+                    $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
+                    if (!$code) return errorTrans("error.sms-err");
+                } else {
+                    $this->scene = "factory";
+                }
+                $param['create_ip'] = $request->getRealIp() ?: '127.0.0.1';
                 $param['user_id'] = CodeExtend::random(16,1,date("md"));
             }
             $param['salt'] = strtoupper(CodeExtend::random(10,3));

+ 133 - 0
app/controller/admin/WashGoods.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\wash\GoodsService;
+use app\middleware\AuthMiddleware;
+use app\validate\wash\WashGoodsValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+use app\model\wash\WashGoods as WashGoodsModel;
+
+/**
+ * 洗护品类
+ */
+#[Controller(prefix: "/api/wash-goods"),Middleware(AuthMiddleware::class)]
+class WashGoods extends Base
+{
+
+    #[Inject]
+    protected GoodsService $service;
+
+    #[Inject]
+    protected WashGoodsModel $model;
+
+    #[Inject]
+    protected WashGoodsValidate $validate;
+
+    /**
+     * 代理列表
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getAgentList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getMessage()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!empty($param['price'])) $param['price'] = $param['price'] * 100;
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getMessage()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 130 - 0
app/controller/admin/WashType.php

@@ -0,0 +1,130 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\wash\TypeService;
+use app\middleware\AuthMiddleware;
+use app\validate\wash\WashTypeValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+use app\model\wash\WashType as WashTypeModel;
+
+/**
+ * 洗护品类
+ */
+#[Controller(prefix: "/api/wash-type"),Middleware(AuthMiddleware::class)]
+class WashType extends Base
+{
+
+    #[Inject]
+    protected TypeService $service;
+
+    #[Inject]
+    protected WashTypeModel $model;
+
+    #[Inject]
+    protected WashTypeValidate $validate;
+
+    /**
+     * 代理列表
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getAgentList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->service->getList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 新增/编辑
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function save(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!empty($param['price'])) $param['price'] = $param['price'] * 100;
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getMessage()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setBatchData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans("empty.require"),
+                "value.require"     => trans("empty.require"),
+                "field.require"     => trans("empty.require"),
+                "type.require"      => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delUser(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => "one",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->delete();
+            } else {
+                $data = $this->model->where("id",$param['id'])->findOrEmpty();
+                if ($data->isEmpty()) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 3 - 0
app/controller/common/Sms.php

@@ -54,6 +54,9 @@ class Sms extends Base
             if (!$state) return error($msg);
             return success($msg);
         } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
             return error($throwable->getMessage());
         }
     }

+ 14 - 2
app/controller/store/Detail.php

@@ -4,8 +4,12 @@ namespace app\controller\store;
 
 use app\extra\basic\Base;
 use app\middleware\AuthMiddleware;
+use app\model\saas\SaasStore;
+use DI\Attribute\Inject;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
 use Webman\Annotation\Middleware;
 
 
@@ -13,14 +17,22 @@ use Webman\Annotation\Middleware;
 class Detail extends Base
 {
 
+    #[Inject]
+    protected SaasStore $store;
 
     /**
      * 门店详情
      */
     #[Route(path: "data",methods: "get")]
-    public function getDetail()
+    public function getDetail(Request $request): Response
     {
-
+        try {
+            $store = $this->store->where("store_id",$request->user['store_id'])->findOrEmpty();
+            if ($store->isEmpty()) return errorTrans("error.store-no-exist");
+            return successTrans("success",$store->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
     }
 
 }

+ 2 - 2
app/extra/basic/Base.php

@@ -34,7 +34,7 @@ class Base
      * @param array $param
      * @return bool
      */
-    protected function sceneUser(array $param = [],int $type = 1): bool
+    protected function sceneUser(array $param = [],int $type = 1,$field = "agent_id"): bool
     {
         if (!isset($param['id']))
         {
@@ -43,7 +43,7 @@ class Base
             $param['create_ip'] = request()->getRealIp() ?: '127.0.0.1';
             $param['type'] = $type;
         }
-        return (new SystemUser)->setAutoData($param,"agent_id");
+        return (new SystemUser)->setAutoData($param,$field);
     }
 
     protected function getSmsChannel(): array

+ 1 - 1
app/extra/basic/Service.php

@@ -18,7 +18,7 @@ class Service
      * 白名单
      * @var array|string[]
      */
-    protected array $mobileWhite = ["18665619195","18665619196","18665619198","18665619199","18665619191","18665619192","18665619193","18665619194"];
+    protected array $mobileWhite = ["18665619195","18665619196","18665619197","18665619198","18665619199","18665619191","18665619192","18665619193","18665619194"];
 
 
     /**

+ 38 - 0
app/extra/service/agent/FactoryService.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace app\extra\service\agent;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasFactory;
+
+class FactoryService extends Service
+{
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasFactory();
+        return $this->searchVal($param,$this->searchFilter($param))->with(['user' => function($query){
+            $query->field("user_id,username");
+        }])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['type']) && $filter[] = ["store_type", '=', $param['type']];
+        !empty($param['title']) && $filter[] = ["title", 'like', "%{$param['title']}%"];
+        return $filter;
+    }
+
+}

+ 3 - 0
app/extra/service/basic/SmsService.php

@@ -43,6 +43,9 @@ class SmsService extends Service
             Cache::set(KeyService::smsKey($mobile,$scene),$code,60);
             return [1,$msg];
         } catch (\Throwable $throwable) {
+            echo $throwable->getMessage()."\n";
+            echo $throwable->getFile()."\n";
+            echo $throwable->getLine()."\n";
             return [0,$throwable->getMessage()];
         }
     }

+ 1 - 1
app/extra/service/basic/UploadService.php

@@ -15,7 +15,7 @@ class UploadService
      */
     public function setConfigVal(): array
     {
-        $data = (new SystemConfig)->where("storage","service")->column("value","name");
+        $data = (new SystemConfig)->where("type","storage")->column("value","name");
         $config = [];
         $config['storage']['default'] = $data['type'];
         $config['storage']['include'] = !empty($data['allow_exts']) ? explode(",",$data['allow_exts']) : [];

+ 1 - 0
app/extra/service/system/UserService.php

@@ -28,6 +28,7 @@ class UserService extends Service
         $filter = [];
         !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
         !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['factory']) && $filter[] = ["factory_id", '=', $param['factory']];
         !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
         !empty($param['mobile']) && $filter[] = ["mobile", 'like', "%{$param['mobile']}%"];
         !empty($param['username']) && $filter[] = ["username", 'like', "%{$param['username']}%"];

+ 35 - 0
app/extra/service/wash/GoodsService.php

@@ -0,0 +1,35 @@
+<?php
+
+namespace app\extra\service\wash;
+
+use app\extra\basic\Service;
+use app\model\wash\WashGoods;
+
+class GoodsService extends Service
+{
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new WashGoods();
+        return $this->searchVal($param,$this->searchFilter($param))->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
+        !empty($param['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
+        return $filter;
+    }
+
+}

+ 39 - 0
app/extra/service/wash/TypeService.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace app\extra\service\wash;
+
+use app\extra\basic\Service;
+use app\model\wash\WashType;
+
+class TypeService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new WashType();
+        return $this->searchVal($param,$this->searchFilter($param))->with(['agent' => function($query){
+            $query->field('agent_id,truename');
+        },'store' => function($query){
+            $query->field('store_id,truename');
+        }])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
+        return $filter;
+    }
+}

+ 11 - 1
app/functions.php

@@ -345,6 +345,16 @@ if (!function_exists("pageFormat")) {
 }
 
 
+if(!function_exists('format_money')){
+    function format_money($str,$len = '2',$append = ""): string
+    {
+        if (empty($str)) {
+            return "0.00";
+        }
+        return number_format($str, $len, ".", $append);
+    }
+}
+
 
 if (!function_exists('sConf')) {
 
@@ -370,7 +380,7 @@ if (!function_exists('sData')) {
      * @param string $name 数据名称
      * @param mixed $value 数据内容
      */
-    function sData(string $name,string $value = null)
+    function sData(string $name,mixed $value = null)
     {
         if (is_null($value)) {
             return SystemService::getData($name);

+ 57 - 0
app/model/merchant/MerchantMember.php

@@ -0,0 +1,57 @@
+<?php
+
+namespace app\model\merchant;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 代理
+ * @property integer $store_id 门店
+ * @property string $user_no 
+ * @property string $mobile 
+ * @property string $name 
+ * @property integer $sex 
+ * @property string $birthday 
+ * @property integer $source 
+ * @property integer $balance 余额
+ * @property integer $total_balance 累计消费
+ * @property string $address 
+ * @property string $remark 
+ * @property mixed $last_at 最后充值时间
+ * @property string $create_ip 
+ * @property mixed $create_at
+ */
+class MerchantMember extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "merchant_member";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 52 - 0
app/model/merchant/MerchantMemberLog.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace app\model\merchant;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 
+ * @property integer $store_id 
+ * @property integer $uid 
+ * @property string $name 
+ * @property string $mobile 
+ * @property integer $money 
+ * @property integer $type 1下单
+ * @property integer $status 0失败1成功
+ * @property string $order_sn 
+ * @property mixed $create_at
+ */
+class MerchantMemberLog extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "merchant_member_log";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 53 - 0
app/model/merchant/MerchantMemberRecharge.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace app\model\merchant;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 
+ * @property integer $store_id 
+ * @property integer $uid 
+ * @property string $name 
+ * @property string $mobile 
+ * @property integer $money 
+ * @property integer $type 1现金2微信
+ * @property integer $status 0未到账1成功
+ * @property integer $transaction_id 微信订单
+ * @property string $order_sn 
+ * @property mixed $create_at
+ */
+class MerchantMemberRecharge extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "merchant_member_recharge";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 13 - 2
app/model/saas/SaasFactory.php

@@ -6,8 +6,14 @@ use app\extra\basic\Model;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $factory_id 
+ * @property integer $id (主键)
+ * @property integer $factory_id 
+ * @property integer $agent_id 
+ * @property string $name 
+ * @property string $contact_name 
+ * @property string $contact_mobile 
+ * @property string $address 
+ * @property integer $source 
  * @property mixed $create_at
  */
 class SaasFactory extends Model
@@ -41,4 +47,9 @@ class SaasFactory extends Model
     public bool $timestamps = false;
 
 
+    public function user()
+    {
+        return $this->hasOne("app\model\system\SystemUser","user_id","factory_id");
+    }
+
 }

+ 15 - 1
app/model/saas/SaasStore.php

@@ -8,6 +8,21 @@ use app\extra\basic\Model;
 /**
  * @property integer $id (主键)
  * @property integer $store_id 
+ * @property integer $agent_id 
+ * @property string $truename 
+ * @property string $store_code 
+ * @property string $store_mch 
+ * @property integer $store_type 
+ * @property integer $wash_type 
+ * @property string $store_address 
+ * @property string $store_status 
+ * @property string $store_order 
+ * @property string $store_sms 
+ * @property string $store_express 
+ * @property string $store_inter_order 
+ * @property string $mobile 
+ * @property mixed $vip_at 
+ * @property string $license 
  * @property mixed $create_at
  */
 class SaasStore extends Model
@@ -40,7 +55,6 @@ class SaasStore extends Model
      */
     public bool $timestamps = false;
 
-
     public function user()
     {
         return $this->hasOne("app\model\system\SystemUser","user_id","store_id");

+ 52 - 0
app/model/wash/WashGoods.php

@@ -0,0 +1,52 @@
+<?php
+
+namespace app\model\wash;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $name 
+ * @property integer $price 
+ * @property integer $is_deleted 删除状态
+ * @property integer $status 状态
+ * @property mixed $create_at 创建时间
+ */
+class WashGoods extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "wash_goods";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+    public function getPriceAttr($data): int|string
+    {
+        if (empty($data)) return 0;
+        return format_money(($data/100));
+    }
+
+}

+ 48 - 0
app/model/wash/WashGoodsStore.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model\wash;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 代理ID
+ * @property integer $store_id 门店ID
+ * @property integer $goods_id 
+ * @property string $name 
+ * @property integer $price 
+ * @property mixed $create_at 创建时间
+ */
+class WashGoodsStore extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "wash_goods_store";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 63 - 0
app/model/wash/WashType.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace app\model\wash;
+
+use app\extra\basic\Model;
+use think\model\relation\HasOne;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $store_id 
+ * @property integer $agent_id 
+ * @property string $name 
+ * @property integer $status 状态
+ * @property mixed $create_at 创建时间
+ */
+class WashType extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "wash_type";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+    public function getPriceAttr($data): int|string
+    {
+        if (empty($data)) return 0;
+        return format_money(($data/100));
+    }
+
+    public function agent(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasAgent", "agent_id", "agent_id");
+    }
+
+    public function store(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasStore", "store_id", "store_id");
+    }
+
+}

+ 28 - 0
app/validate/user/FactoryValidate.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\validate\user;
+
+use think\Validate;
+
+class FactoryValidate extends Validate
+{
+
+    protected $rule = [
+        "agent_id"          => "require",
+        "name"              => "require",
+        "contact_name"      => "require",
+        "contact_mobile"    => "require",
+        "address"           => "require",
+        "source"            => "require",
+    ];
+
+
+    protected $message = [
+        "agent_id.require"      => "请选择代理",
+        "name.require"          => "请输入地址名称",
+        "contact_name.require"  => "请输入联系人姓名",
+        "contact_mobile.number" => "请输入联系电话",
+        "address.require"       => "请输入详细地址",
+        "source.require"        => "请选择注册来源",
+    ];
+}

+ 2 - 1
app/validate/user/UserValidate.php

@@ -29,7 +29,8 @@ class UserValidate extends Validate
 
 
     protected $scene = [
-        "edit"  => ["truename","password"]
+        "edit"  => ["truename","password"],
+        "factory"  => ["truename","username","password"]
     ];
 
 }

+ 20 - 0
app/validate/wash/WashGoodsValidate.php

@@ -0,0 +1,20 @@
+<?php
+
+namespace app\validate\wash;
+
+use think\Validate;
+
+class WashGoodsValidate extends Validate
+{
+
+    protected $rule = [
+        "name"      => "require",
+        "status"    => "require",
+    ];
+
+
+    protected $message = [
+        "name.require"      => "请输入名称",
+        "status.require"    => "请选择状态",
+    ];
+}

+ 24 - 0
app/validate/wash/WashTypeValidate.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\validate\wash;
+
+use think\Validate;
+
+class WashTypeValidate extends Validate
+{
+
+    protected $rule = [
+        "name"      => "require",
+        "agent_id"      => "require",
+        "store_id"      => "require",
+        "status"    => "require",
+    ];
+
+
+    protected $message = [
+        "name.require"      => "请输入名称",
+        "status.require"    => "请选择状态",
+        "agent_id.require"    => "请选择代理",
+        "store_id.require"    => "请选择门店",
+    ];
+}

+ 1 - 0
resource/translations/zh_CN/messages.php

@@ -30,6 +30,7 @@ return [
         "agent"         => "代理状态异常,请联系管理员",
         "agent-out"     => "权限已到期,请联系管理员",
         "agent-no-exist"   => "代理不存在",
+        "store-no-exist"   => "门店不存在",
     ],
     "success"   => [
         "data"  => "操作成功",