Zory 2 주 전
부모
커밋
e361ab006b

+ 145 - 0
app/controller/admin/StoreAddress.php

@@ -0,0 +1,145 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\agent\StoreAddressService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasAgent;
+use app\model\saas\SaasStore;
+use app\model\saas\SaasStoreFactory;
+use app\model\system\SystemUser;
+use app\validate\store\StoreAddressValidate;
+use app\validate\user\StoreValidate;
+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/store-address"),Middleware(AuthMiddleware::class)]
+class StoreAddress extends Base
+{
+    #[Inject]
+    protected StoreAddressService $service;
+
+    #[Inject]
+    protected StoreAddressValidate $validate;
+
+    #[Inject]
+    protected SaasStoreFactory $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'])) {
+                $this->scene = "add";
+                $code = (new Codecheck)->mobile($param['mobile'])->scene($param['scene'])->code($param['yzm'])->check();
+                if (!$code) return errorTrans("error.sms-err");
+                $param['user_id'] = $param['store_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,3,"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());
+        }
+    }
+}

+ 56 - 0
app/controller/store/Logs.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace app\controller\store;
+
+use app\extra\basic\Base;
+use app\extra\service\store\LogService;
+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/store/log"),Middleware(AuthMiddleware::class)]
+class Logs extends Base
+{
+
+    protected LogService $service;
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "recharge",methods: "get")]
+    public function getRechargeList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $param['store'] = $this->getParent($request->user);
+            $list = $this->service->getRechargeList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "logs",methods: "get")]
+    public function getLogList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $param['store'] = $this->getParent($request->user);
+            $list = $this->service->getLogList($param);
+            return successTrans(100010,pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+}

+ 141 - 0
app/controller/store/Member.php

@@ -0,0 +1,141 @@
+<?php
+
+namespace app\controller\store;
+
+use app\extra\basic\Base;
+use app\extra\service\store\MemberService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\merchant\MerchantMember;
+use app\validate\store\MemberValidate;
+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/store/member"),Middleware(AuthMiddleware::class)]
+class Member extends Base
+{
+
+    #[Inject]
+    protected MemberService $service;
+
+    #[Inject]
+    protected MerchantMember $model;
+
+    #[Inject]
+    protected MemberValidate $validate;
+
+    protected string $scene = "edit";
+
+    /**
+     * 用户列表
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getUserList(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();
+            if (!isset($param['id'])) {
+                $this->scene = "add";
+                $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));
+            if (!empty($param['password'])) {
+                $param['password'] = md5($param['password'].$param['salt']);
+            }
+            if (!empty($param['username'])) {
+                $userName = $this->model->where("username",$param['username'])->findOrEmpty();
+                if (!$userName->isEmpty()) return errorTrans("error.user-exist");
+            }
+            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");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            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());
+        }
+    }
+}

+ 37 - 0
app/extra/service/agent/StoreAddressService.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace app\extra\service\agent;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasFactory;
+use app\model\saas\SaasStoreFactory;
+
+class StoreAddressService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasStoreFactory();
+        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['factory']) && $filter[] = ["factory_id", '=', $param['factory']];
+        !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
+        !empty($param['type']) && $filter[] = ["store_type", '=', $param['type']];
+        return $filter;
+    }
+}

+ 53 - 0
app/extra/service/store/LogService.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace app\extra\service\store;
+
+use app\extra\basic\Service;
+use app\model\merchant\MerchantMemberLog;
+use app\model\merchant\MerchantMemberRecharge;
+
+class LogService extends Service
+{
+
+
+    /**
+     * 充值记录
+     * @param array $param
+     */
+    public function getRechargeList(array $param = [])
+    {
+        $this->mode = new MerchantMemberRecharge();
+        return $this->searchVal($param,$this->searchFilter($param))->append(['tel'])->withAttr(['tel' => function($data,$resp){
+            return hide_mobile($resp['mobile']);
+        }])->hidden(['mobile'])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+    /**
+     * 充值记录
+     * @param array $param
+     */
+    public function getLogList(array $param = [])
+    {
+        $this->mode = new MerchantMemberLog();
+        return $this->searchVal($param,$this->searchFilter($param))->append(['tel'])->withAttr(['tel' => function($data,$resp){
+            return hide_mobile($resp['mobile']);
+        }])->hidden(['mobile'])->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[] = ["type", '=', $param['type']];
+        return $filter;
+    }
+}

+ 50 - 0
app/extra/service/store/MemberService.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\extra\service\store;
+
+use app\extra\basic\Service;
+use app\model\merchant\MerchantMember;
+
+class MemberService extends Service
+{
+
+    protected array $sex = [ 1 => "男" , 2 => "女"];
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new MerchantMember();
+        return $this->searchVal($param,$this->searchFilter($param))->append(['tel','format_balance','format_total','format_sex'])->withAttr(['tel' => function($data,$resp){
+            return empty($resp['mobile']) ? '' : hide_mobile($resp['mobile']);
+        },"format_balance" => function($data,$resp){
+            return empty($resp['balance']) ? '0.00' : format_money($resp['balance']/100);
+        },"format_total" => function($data,$resp){
+            return empty($resp['total_balance']) ? '0.00' : format_money($resp['total_balance']/100);
+        },"format_sex" => function($data,$resp){
+            return $this->sex[$resp['sex']];
+        }])->hidden(['mobile'])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['mobile']) && $filter[] = ["mobile", 'like', "%{$param['mobile']}%"];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['agent']];
+        !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
+        !empty($param['status']) && $filter[] = ["store_status", '=', $param['status']];
+        !empty($param['type']) && $filter[] = ["store_type", '=', $param['type']];
+        !empty($param['user_type']) && $filter[] = ["type", '=', $param['user_type']];
+        !empty($param['truename']) && $filter[] = ["truename", 'like', "%{$param['truename']}%"];
+        !empty($param['user']) && $filter[] = ["user_id", '=', $param['user']];
+        !empty($param['parentGt']) && $filter[] = ["parent_id", '>', 0];
+        return $filter;
+    }
+}

+ 62 - 0
app/model/saas/SaasStoreFactory.php

@@ -0,0 +1,62 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+use think\model\relation\HasOne;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 所属代理
+ * @property integer $store_id 
+ * @property integer $factory_id 
+ * @property integer $day_order 日订单量
+ * @property mixed $create_at
+ */
+class SaasStoreFactory 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 = "saas_store_factory";
+    
+    /**
+     * 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 factory(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasFactory","factory_id","factory_id");
+    }
+
+    public function store(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasStore","store_id","store_id");
+    }
+
+    public function agent(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasAgent","agent_id","agent_id");
+    }
+
+}

+ 26 - 0
app/validate/store/MemberValidate.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace app\validate\store;
+
+use think\Validate;
+
+class MemberValidate extends Validate
+{
+    protected $rule = [
+        "agent_id"  => "require",
+        "store_id"  => "require",
+        "name"      => "require",
+        "mobile"    => "require|mobile",
+        "user_no"   => "require|date",
+    ];
+
+
+    protected $message = [
+        "agent_id.require"  => "请输入代理名称",
+        "store_id.require"  => "请输入联系人",
+        "mobile.require"    => "请输入手机号码",
+        "mobile.mobile"     => "手机号码格式错误",
+        "name.require"      => "请填写会员名称",
+        "user_no.require"   => "请填写会员卡号"
+    ];
+}

+ 22 - 0
app/validate/store/StoreAddressValidate.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace app\validate\store;
+
+use think\Validate;
+
+class StoreAddressValidate extends Validate
+{
+
+    protected $rule = [
+        "agent_id"  => "require",
+        "store_id"  => "require",
+        "factory_id"    => "require",
+    ];
+
+
+    protected $message = [
+        "agent_id.require"  => "请选择代理",
+        "store_id.require"  => "请选择门店",
+        "factory_id.require"    => "请选择洗衣地址",
+    ];
+}