zory 2 giorni fa
parent
commit
fde5fe6b48

+ 105 - 0
app/controller/merchant/Renew.php

@@ -0,0 +1,105 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\ComboLogService;
+use app\extra\tools\CodeExtend;
+use app\extra\weMini\Link;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasCombo;
+use app\model\saas\SaasComboLog;
+use app\model\saas\SaasShop;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Middleware;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/api/mer/renew"),Middleware(AuthMiddleware::class)]
+class Renew extends Base
+{
+
+
+    #[Inject]
+    protected ComboLogService $service;
+
+
+    /**
+     *
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "detail",methods: "get")]
+    public function getRenewDetail(Request $request): Response
+    {
+        try {
+            $shop = (new SaasShop)->where("shop_id",$request->user['agent_id'])->field("shop_name,shop_mobile,start_at,end_at,vip_end,shop_status,shop_notice,line_time,status,shop_address")->withAttr(['vip_end'  => function($query,$data) {
+                return date("Y-m-d",strtotime($data['vip_end']));
+            }])->findOrEmpty();
+            if ($shop->isEmpty()) return errorTrans("empty.data");
+            $combo = (new SaasCombo)->where("status",1)->order("sort",'desc')->field("ROUND(money/100,2) as f_money,ROUND(old_money/100,2) as f_old_money,id,unit,time,name")
+                ->append(['diff'])
+                ->withAttr(['diff' => function($query,$data){
+                    return $data['f_old_money'] - $data['f_money'];
+                }])->select();
+            $privacy = htmlspecialchars_decode(sConf("service.privacy"));
+            print_r($privacy);
+            return success('ok',compact("shop",'combo','privacy'));
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "qrcode",methods: "post")]
+    public function getPayQrcode(Request $request)
+    {
+        try {
+            $param = $this->_valid([
+                "comboId.require"   => trans("empty.require")
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $combo = (new SaasCombo)->where("id",$param['comboId'])->where("status",1)->findOrEmpty();
+            if ($combo->isEmpty()) return errorTrans("empty.data");
+            $orderSn = CodeExtend::createNoncestr();
+            $state = (new SaasComboLog)->insertGetId([
+                "shop_id"   => $request->user['agent_id'],
+                "order_sn"  => $orderSn,
+                "time"      => $combo['unit']==1?$combo['time']:($combo['time']*365),
+                "money"     => $combo['money']
+            ]);
+            if (!$state) return errorTrans("error.data");
+            // 生成二维码
+            $qrcodePath = "/uploads/card/{$request->user['agent_id']}-renew-{$orderSn}.jpg";
+            (new Link([
+                "appid"     => sConf("wechat.mini_appid"),
+                "appsecret" => sConf("wechat.mini_secret")
+            ]))->createQrcodeWx("/pages/shop/renew","shop={$request->user['agent_id']}&order={$orderSn}",$qrcodePath);
+            $qrcode = 'data:image/png;base64,'.base64_encode(file_get_contents(public_path().$qrcodePath));
+            return successTrans("success.data",compact("qrcode"));
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    #[Route(path: "list",methods: "get")]
+    public function getRenewList(Request $request)
+    {
+        try {
+            $param = $request->get();
+            $param['shop'] = $request->user['agent_id'];
+            $list = $this->service->getList($param);
+            return successTrans("success.data",pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 165 - 0
app/controller/merchant/Staff.php

@@ -0,0 +1,165 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\service\system\UserService;
+use app\extra\tools\CodeExtend;
+use app\middleware\AuthMiddleware;
+use app\model\system\SystemUser;
+use app\validate\saas\UserValidate;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Middleware;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/api/mer/staff"),Middleware(AuthMiddleware::class)]
+class Staff extends Base
+{
+
+
+    #[Inject]
+    protected SystemUser $model;
+
+
+    #[Inject]
+    protected UserService $service;
+
+
+    #[Inject]
+    protected UserValidate $validate;
+
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getPrintList(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: "passwd",methods: "post")]
+    public function setUserPasswd(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => trans(20010),
+                "password.require"  => trans(20010)
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $user = $this->model->where("id",$param['id'])->findOrEmpty();
+            if ($user->isEmpty()) return errorTrans("empty.error");
+            $user->password = md5($param['password'].$user['salt']);
+            $state = $user->save();
+            if (!$state) return errorTrans("error.data");
+            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();
+            $param['agent_id'] = $request->user['agent_id'];
+            $param['type'] = 2;
+            $param['salt'] = strtoupper(CodeExtend::random(10,3));
+            $param['password'] = md5($param['password'].$param['salt']);
+            $param['create_ip'] = request()->getRealIp();
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $user = $this->model->where("username",$param['username'])->findOrEmpty();
+            if (!$user->isEmpty()) return errorTrans("error.user-exist");
+            $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: "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");
+                if ($data['agent_id'] <> $request->user['agent_id']) return errorTrans("empty.data");
+                // 删除其他相关数据
+                $state = $data->delete();
+            }
+            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());
+        }
+    }
+
+}

+ 36 - 0
app/extra/service/saas/ComboLogService.php

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

+ 56 - 0
app/model/saas/SaasComboLog.php

@@ -0,0 +1,56 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 
+ * @property integer $shop_id 
+ * @property mixed $order_sn 
+ * @property integer $time 续费时长-天
+ * @property integer $money 金额
+ * @property integer $status 0待付款1已支付
+ * @property mixed $pay_at 支付时间
+ * @property string $transaction_id 交易编号wx
+ * @property mixed $create_at
+ */
+class SaasComboLog 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_combo_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;
+
+
+    public function getMoneyAttr($val): string
+    {
+        return format_money($val/100,2);
+    }
+
+}

+ 1 - 1
app/model/system/SystemUser.php

@@ -57,7 +57,7 @@ class SystemUser extends Model
 
     public function account(): HasOne
     {
-        return $this->hasOne("app\model\saas\SaasAgent","agent_id","agent_id");
+        return $this->hasOne("app\model\saas\SaasShop","agent_id","agent_id");
     }
 
 }

BIN
public/uploads/card/1220637573959186-pay.jpg


BIN
public/uploads/card/1220637573959186-print-004356708646.jpg


BIN
public/uploads/card/1220637573959186-print-008723553191.jpg


BIN
public/uploads/card/1220637573959186-print-009769536260.jpg