Zory 1 周之前
父节点
当前提交
dc05486001

+ 87 - 2
app/controller/Dashboard.php

@@ -9,6 +9,7 @@ use app\model\saas\SaasStore;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
+use support\Request;
 use support\Response;
 
 
@@ -35,7 +36,7 @@ class Dashboard extends Base
             ];
             $moneys = $orders = [];
             $fields = ['ROUND(sum(pay_amount)/100,2)' => 'total','substr(create_at,1,10)' => 'mday'];
-            $orderMoney = (new SaasOrderLife)->field($fields)->where("status","in",[1,3,4,5])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            $orderMoney = (new SaasOrderLife)->field($fields)->where("status","in",[1,2,3,6])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
             for ($i = 15; $i >= 0; $i--) {
                 $date = date('Y-m-d', strtotime("-{$i}days"));
                 $moneys[] = [
@@ -44,7 +45,91 @@ class Dashboard extends Base
                 ];
             }
             $field = ['count(1)' => 'count', 'substr(create_at,1,10)' => 'mday'];
-            $orderNum = (new SaasOrderLife)->field($field)->where("status","in",[1,3,4,5])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            $orderNum = (new SaasOrderLife)->field($field)->where("status","in",[1,2,3,6])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            for ($i = 15; $i >= 0; $i--) {
+                $date = date('Y-m-d', strtotime("-{$i}days"));
+                $orders[] = [
+                    '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                    '订单数量' => ($orderNum[$date] ?? [])['count'] ?? 0,
+                ];
+            }
+            return success("ok",compact("today","moneys","orders"));
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "store",methods: "get")]
+    public function getStoreData(Request $request): Response
+    {
+        try {
+            $map = [ "agent_id" => $request->user['agent_id'] ];
+            $total = (new SaasOrderLife)->where($map)->where("status","in",[1,2,3,6])->whereDay("create_at")->field("ROUND(sum(pay_amount)/100,2) as money,count(id) as num")->find();
+            $today = [
+                "order_money"   => $total['money']??0, // 营业额
+                "order_num"     => $total['num']??0, // 订单数
+                "order_done"    => "", // 已核销
+                "order_send"    => "",  // 待发货
+                "store_num"     => (new SaasStore)->where($map)->count(), // 总店铺数量
+            ];
+            $moneys = $orders = [];
+            $fields = ['ROUND(sum(pay_amount)/100,2)' => 'total','substr(create_at,1,10)' => 'mday'];
+            $orderMoney = (new SaasOrderLife)->field($fields)->where($map)->where("status","in",[1,3,4,5])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            for ($i = 15; $i >= 0; $i--) {
+                $date = date('Y-m-d', strtotime("-{$i}days"));
+                $moneys[] = [
+                    '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                    '订单金额' => ($orderMoney[$date] ?? [])['total'] ?? 0,
+                ];
+            }
+            $field = ['count(1)' => 'count', 'substr(create_at,1,10)' => 'mday'];
+            $orderNum = (new SaasOrderLife)->field($field)->where($map)->where("status","in",[1,2,3,6])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            for ($i = 15; $i >= 0; $i--) {
+                $date = date('Y-m-d', strtotime("-{$i}days"));
+                $orders[] = [
+                    '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                    '订单数量' => ($orderNum[$date] ?? [])['count'] ?? 0,
+                ];
+            }
+            return success("ok",compact("today","moneys","orders"));
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "shop",methods: "get")]
+    public function getShopData(Request $request): Response
+    {
+        try {
+            $map = [ "store_id" => $request->user['store_id'],"agent_id" => $request->user['agent_id'] ];
+            $total = (new SaasOrderLife)->where($map)->where("status","in",[1,3,4,5])->whereDay("create_at")->field("ROUND(sum(pay_amount)/100,2) as money,count(id) as num")->find();
+            $today = [
+                "order_money"   => $total['money']??0, // 营业额
+                "order_num"     => $total['num']??0, // 订单数
+                "order_done"    => "", // 已核销
+                "order_send"    => "",  // 待发货
+            ];
+            $moneys = $orders = [];
+            $fields = ['ROUND(sum(pay_amount)/100,2)' => 'total','substr(create_at,1,10)' => 'mday'];
+            $orderMoney = (new SaasOrderLife)->field($fields)->where($map)->where("status","in",[1,3,4,5])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
+            for ($i = 15; $i >= 0; $i--) {
+                $date = date('Y-m-d', strtotime("-{$i}days"));
+                $moneys[] = [
+                    '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                    '订单金额' => ($orderMoney[$date] ?? [])['total'] ?? 0,
+                ];
+            }
+            $field = ['count(1)' => 'count', 'substr(create_at,1,10)' => 'mday'];
+            $orderNum = (new SaasOrderLife)->field($field)->where($map)->where("status","in",[1,3,4,5])->whereTime('create_at', '-15 days')->group('mday')->select()->column(null, 'mday');
             for ($i = 15; $i >= 0; $i--) {
                 $date = date('Y-m-d', strtotime("-{$i}days"));
                 $orders[] = [

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

@@ -0,0 +1,53 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\OrderLogService;
+use app\extra\service\saas\OrderService;
+use app\middleware\AuthMiddleware;
+use DI\Attribute\Inject;
+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
+{
+
+    #[Inject]
+    protected OrderService $service;
+
+    #[Inject]
+    protected OrderLogService $log;
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getOrderList(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());
+        }
+    }
+
+
+    #[Route(path: "log",methods: "get")]
+    public function getOrderLog(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $list = $this->log->getList($param);
+            return successTrans("success.data",$list,200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 190 - 0
app/controller/merchant/Store.php

@@ -0,0 +1,190 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\douyin\Account;
+use app\extra\douyin\Client;
+use app\extra\service\saas\StoreService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasStore;
+use app\model\system\SystemUser;
+use app\validate\saas\StoreValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/merchant/store"),Middleware(AuthMiddleware::class)]
+class Store extends Base
+{
+
+    #[Inject]
+    protected StoreService $service;
+
+    #[Inject]
+    protected SaasStore $model;
+
+    #[Inject]
+    protected StoreValidate $validate;
+
+    protected string $scene = "edit";
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $param['agent'] = $request->user['agent_id'];
+            $list = $this->service->getList($param);
+            return successTrans("success.data",pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 设置path
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "auth",methods: "post")]
+    public function setAuth(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $store = $this->model->where("id",$param['id'])->findOrEmpty();
+            if ($store->isEmpty()) return errorTrans("empty.data");
+            // 设置path
+            $resp = (new Client)->config($this->getDyConfig())->token()->setMiniPath($store['store_id']);
+            if ($resp['err_no'] <> 0) return error($resp['err_msg']);
+            $resp = (new Account)->config($this->getDyConfig())->token()->setWhiteSetting($store['store_id'],1,true);
+            if ($resp['err_no'] <> 0) return error($resp['err_msg']);
+            return successTrans("success.data");
+        } 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['user_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");
+                }
+            }
+            if (!$this->validate->check($param)) 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: "edit",methods: "post")]
+    public function edit(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            if (!$this->validate->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) {
+            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());
+        }
+    }
+
+}

+ 131 - 0
app/controller/merchant/User.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\service\system\UserService;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasStore;
+use app\model\system\SystemUser;
+use app\validate\saas\UserValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+use Webman\Annotation\Middleware;
+
+
+#[Controller(prefix: "/api/merchant/user"),Middleware(AuthMiddleware::class)]
+class User extends Base
+{
+
+
+    #[Inject]
+    protected UserService $service;
+
+    #[Inject]
+    protected SystemUser $model;
+
+    protected UserValidate $validate;
+
+    protected string $scene = "edit";
+
+    #[Route(path: "list",methods: "get")]
+    public function getStoreList(Request $request): Response
+    {
+        try {
+            $param = $request->get();
+            $param['agent'] = $request->user['agent_id'];
+            $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 (empty($param['store_id'])) return errorTrans("empty.require");
+            $store = (new SaasStore)->where("store_id",$param['store_id'])->findOrEmpty();
+            if ($store->isEmpty()) return errorTrans("empty.data");
+            if (empty($store['agent_id'])) return errorTrans("empty.data");
+            $param['agent_id'] = $store['agent_id'];
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.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());
+        }
+    }
+
+}

+ 28 - 0
app/extra/service/saas/OrderLogService.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace app\extra\service\saas;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasOrderLog;
+
+class OrderLogService extends Service
+{
+
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasOrderLog();
+        return $this->searchVal($param,$this->searchFilter($param))->select()->toArray();
+    }
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['shop']];
+        !empty($param['open_id']) && $filter[] = ["open_id", '=', $param['open_id']];
+        !empty($param['statusLt']) && $filter[] = ["status", '=', ($param['statusLt']-1)];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['order']) && $filter[] = ["order_id", '=', $param['order']];
+        return $filter;
+    }
+
+}

+ 21 - 0
app/extra/service/saas/OrderService.php

@@ -9,6 +9,26 @@ class OrderService extends Service
 {
 
 
+    /**
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasOrder();
+        return $this->searchVal($param,$this->searchFilter($param))->with(['goods' => function($query){
+            $query->field("out_id,product_name,product_img,product_price");
+        },"store" => function($query){
+            $query->field("store_id,store_name,service_at_start,service_at_end");
+        },"agent" => function ($query) {
+            $query->field("agent_id,name");
+        },"parent" => function ($query) {
+            $query->field("order_id,status,pay_amount,order_amount,count");
+        }])->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
     public function getDataListMini(array $param = [])
     {
         $this->mode = new SaasOrder();
@@ -28,6 +48,7 @@ class OrderService extends Service
         !empty($param['open_id']) && $filter[] = ["open_id", '=', $param['open_id']];
         !empty($param['statusLt']) && $filter[] = ["status", '=', ($param['statusLt']-1)];
         !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['ex_status']) && $filter[] = ["express_status", '=', $param['ex_status']];
         !empty($param['order']) && $filter[] = ["order_sn", 'like', "%{$param['order']}%"];
         return $filter;
     }

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

@@ -15,7 +15,9 @@ class UserService extends Service
     public function getList(array $param = [])
     {
         $this->mode = new SystemUser();
-        return $this->searchVal($param,$this->searchFilter($param))->paginate([
+        return $this->searchVal($param,$this->searchFilter($param))->with(['account' => function ($query) {
+            $query->field("store_id,store_name");
+        }])->paginate([
             "list_rows" => $param['pageSize'],
             "page"      => $param['page']
         ]);

+ 5 - 0
app/model/saas/SaasOrder.php

@@ -79,5 +79,10 @@ class SaasOrder extends Model
         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');
+    }
+
 
 }

+ 27 - 22
app/model/system/SystemUser.php

@@ -6,28 +6,28 @@ use app\extra\basic\Model;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $user_id 
- * @property integer $role_id 权限ID
- * @property string $role_path 
- * @property integer $parent_id 代理ID
- * @property integer $account_id 店铺id
- * @property string $username 用户名
- * @property string $truename 真实姓名
- * @property string $password 密码
- * @property mixed $salt 密钥串
- * @property integer $status 状态
- * @property string $contact_name 
- * @property string $contact_mobile 
- * @property integer $type 1管理员2代理子账号3店铺账号
- * @property integer $is_deleted 删除状态
- * @property integer $is_super 
- * @property string $remark 备注
- * @property string $login_ip 登录IP
- * @property mixed $login_at 登录时间
- * @property integer $login_num 
- * @property string $create_ip 
- * @property mixed $updated_at 更新时间
+ * @property integer $id (主键)
+ * @property integer $user_id 
+ * @property integer $role_id 权限ID
+ * @property string $role_path 
+ * @property integer $parent_id 代理ID
+ * @property integer $account_id 店铺id
+ * @property string $username 用户名
+ * @property string $truename 真实姓名
+ * @property string $password 密码
+ * @property mixed $salt 密钥串
+ * @property integer $status 状态
+ * @property string $contact_name 
+ * @property string $contact_mobile 
+ * @property integer $type 1管理员2代理子账号3店铺账号
+ * @property integer $is_deleted 删除状态
+ * @property integer $is_super 
+ * @property string $remark 备注
+ * @property string $login_ip 登录IP
+ * @property mixed $login_at 登录时间
+ * @property integer $login_num 
+ * @property string $create_ip 
+ * @property mixed $updated_at 更新时间
  * @property mixed $create_at 创建时间
  */
 class SystemUser extends Model
@@ -61,4 +61,9 @@ class SystemUser extends Model
     public bool $timestamps = false;
 
 
+    public function account()
+    {
+        return $this->hasOne('app\model\saas\SaasStore', 'store_id', 'store_id');
+    }
+
 }

+ 43 - 0
app/validate/saas/UserValidate.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace app\validate\saas;
+
+use think\Validate;
+
+class UserValidate extends Validate
+{
+
+    protected $rule = [
+        "agent_id"      => "require",
+        "store_id"      => "require",
+        "express_type"  => "require",
+        "is_auto"       => "require",
+        "is_reback"     => "require",
+        "store_name"    => "require",
+        "order_end"     => "require",
+        "express_name"  => "require",
+        "express_mobile"    => "require",
+        "express_goods" => "require",
+        "express_unit"  => "require",
+        "express_address"   => "require",
+        "express_time"  => "require"
+    ];
+
+
+    protected $message = [
+        "agent_id.require"      => "请现在代理",
+        "store_id.require"      => "请输入来客ID",
+        "express_type.require"  => "请选择快递类型",
+        "is_auto.require"       => "请选择自动呼叫快递",
+        "is_reback.require"     => "请选择退款自动拦截快递",
+        "store_name.require"    => "请输入来客店铺名称",
+        "order_end.require"     => "请选择核销时机",
+        "express_name.require"  => "请输入联系人",
+        "express_mobile.require"=> "请输入联系电话",
+        "express_goods.require" => "请输入物品名称",
+        "express_unit.require"  => "请输入物品单位",
+        "express_time.require"  => "请选择呼叫快递时间",
+        "express_address.require"  => "请输入发货地址",
+    ];
+
+}