Zory 3 days ago
parent
commit
f6a3b6ab67

+ 64 - 0
app/controller/merchant/Detail.php

@@ -0,0 +1,64 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\weMini\Link;
+use app\middleware\AuthMiddleware;
+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/shop"),Middleware(AuthMiddleware::class)]
+class Detail extends Base
+{
+
+    #[Inject]
+    protected SaasShop $model;
+
+
+    #[Route(path: "detail",methods: "get")]
+    public function getDetail(Request $request): Response
+    {
+        try {
+            $qrcodePath = "/uploads/card/{$request->user['agent_id']}-pay.jpg";
+            if (!is_file(public_path().$qrcodePath)) {
+                (new Link([
+                    "appid"     => sConf("wechat.mini_appid"),
+                    "appsecret" => sConf("wechat.mini_secret")
+                ]))->createQrcodeWx("/pages/shop/pay","shop={$request->user['agent_id']}",$qrcodePath);
+            }
+            $qrcode = 'data:image/png;base64,'.base64_encode(file_get_contents(public_path().$qrcodePath));
+            $shop = $this->model->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']));
+            },'qrcode' => function () use ($qrcode){
+                return $qrcode;
+            }])->findOrEmpty();
+            if ($shop->isEmpty()) return errorTrans("empty.data");
+            return success("ok",$shop->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    #[Route(path: "save",methods: "post")]
+    public function setData(Request $request)
+    {
+        try {
+            $param = $request->post();
+            $shop = $this->model->where("shop_id",$request->user['agent_id'])->findOrEmpty();
+            if ($shop->isEmpty()) return errorTrans("empty.data");
+            $state = $shop->save($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 104 - 0
app/controller/merchant/Discount.php

@@ -0,0 +1,104 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\DisCountService;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasDiscount;
+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/discount"),Middleware(AuthMiddleware::class)]
+class Discount extends Base
+{
+
+    #[Inject]
+    protected SaasDiscount $model;
+
+    #[Inject]
+    protected DisCountService $service;
+
+    #[Route(path: "list",methods: "get")]
+    public function getPriceList(Request $request): Response
+    {
+        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());
+        }
+    }
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function savePrice(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.default"        => 0,
+                "color.require"     => trans("empty.require"),
+                "duplex.require"    => trans("empty.require"),
+                "number.require"    => trans("empty.require"),
+                "rate.require"      => trans("empty.require"),
+                "shop_id.default"   => $request->user['agent_id'],
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $price = $this->model->where("id",$param["id"])->findOrEmpty();
+            if ($price->isEmpty())
+            {
+                $priceType = $this->model->where([
+                    "shop_id"   => $param["shop_id"],
+                    "color"     => $param["color"],
+                    "duplex"    => $param["duplex"],
+                    "number"    => $param["number"],
+                    "rate"      => $param["rate"],
+                ])->findOrEmpty();
+                if (!$priceType->isEmpty()) return errorTrans("error.exist");
+                $state = $price->insertGetId($param);
+            } else {
+                $state = $price->save($param);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    #[Route(path: "del",methods: "post")]
+    public function delPrice(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => ""
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param["type"] == "batch") {
+                $state = $this->model->whereIn("id",$param["id"])->delete();
+            } else {
+                $price = $this->model->where("id",$param["id"])->findOrEmpty();
+                if ($price->isEmpty()) return errorTrans("empty.data");
+                if ($price['shop_id'] <> $request->user["agent_id"]) return errorTrans("empty.data");
+                $state = $price->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 106 - 0
app/controller/merchant/Price.php

@@ -0,0 +1,106 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\PriceService;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasPrice;
+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/price"),Middleware(AuthMiddleware::class)]
+class Price extends Base
+{
+
+    #[Inject]
+    protected SaasPrice $model;
+
+    #[Inject]
+    protected PriceService $service;
+
+    #[Route(path: "list",methods: "get")]
+    public function getPriceList(Request $request): Response
+    {
+        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());
+        }
+    }
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function savePrice(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.default"        => 0,
+                "type.require"      => trans("empty.require"),
+                "color.require"     => trans("empty.require"),
+                "paper_size.require"=> trans("empty.require"),
+                "duplex.require"    => trans("empty.require"),
+                "price.require"     => trans("empty.require"),
+                "shop_id.default"   => $request->user['agent_id'],
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $param['price'] = $param['price'] * 100;
+            $price = $this->model->where("id",$param["id"])->findOrEmpty();
+            if ($price->isEmpty())
+            {
+                $priceType = $this->model->where([
+                    "type"      => $param["type"],
+                    "shop_id"   => $param["shop_id"],
+                    "color"     => $param["color"],
+                    "duplex"    => $param["duplex"],
+                    "paper_size"=> $param["paper_size"],
+                ])->findOrEmpty();
+                if (!$priceType->isEmpty()) return errorTrans("error.exist");
+                $state = $price->insertGetId($param);
+            } else {
+                $state = $price->save($param);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    #[Route(path: "del",methods: "post")]
+    public function delPrice(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"    => trans("empty.require"),
+                "type.default"  => ""
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param["type"] == "batch") {
+                $state = $this->model->whereIn("id",$param["id"])->delete();
+            } else {
+                $price = $this->model->where("id",$param["id"])->findOrEmpty();
+                if ($price->isEmpty()) return errorTrans("empty.data");
+                if ($price['shop_id'] <> $request->user["agent_id"]) return errorTrans("empty.data");
+                $state = $price->delete();
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 16 - 0
app/controller/merchant/Prints.php

@@ -6,6 +6,7 @@ use app\extra\basic\Base;
 use app\extra\service\saas\PrintService;
 use app\extra\weMini\Link;
 use app\middleware\AuthMiddleware;
+use app\model\saas\SaasPrice;
 use app\model\saas\SaasPrintClient;
 use DI\Attribute\Inject;
 use Kkokk\Poster\Facades\Poster;
@@ -32,6 +33,7 @@ class Prints extends Base
     {
         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) {
@@ -115,6 +117,7 @@ class Prints extends Base
             if (empty($param['id'])) return errorTrans("empty.require");
             $print = (new SaasPrintClient)->where("id",$param['id'])->findOrEmpty();
             if ($print->isEmpty()) return errorTrans("empty.data");
+            if ($print['status'] <> 1) return errorTrans("error.status-qrcode");
             $qrcodePath = public_path()."/uploads/card/{$print['shop_id']}-print-{$print['code']}.jpg";
             if (!is_file($qrcodePath)) {
                 $pathBase = "/uploads/qrcode/".$print['shop_id']."-".$print['code'].".jpg";
@@ -141,4 +144,17 @@ class Prints extends Base
         }
     }
 
+
+    #[Route(path: "price",methods: "get")]
+    public function getPrintPrice(Request $request): Response
+    {
+        try {
+            $price = (new SaasPrice)->where("shop_id",$request->user['agent_id'])->where("type",1)->field("id,paper_size,duplex,color")->select();
+            if ($price->isEmpty()) return errorTrans("empty.data");
+            return successTrans("success.data",$price->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 34 - 0
app/extra/service/saas/DisCountService.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\extra\service\saas;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasDiscount;
+
+class DisCountService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasDiscount();
+        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['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
+        !empty($param['shop']) && $filter[] = ["shop_id", '=', $param['shop']];
+        return $filter;
+    }
+
+
+}

+ 34 - 0
app/extra/service/saas/PriceService.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\extra\service\saas;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasPrice;
+
+class PriceService extends Service
+{
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new SaasPrice();
+        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['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
+        !empty($param['type']) && $filter[] = ["type", '=', $param['type']];
+        !empty($param['shop']) && $filter[] = ["shop_id", '=', $param['shop']];
+        return $filter;
+    }
+
+}

+ 1 - 0
app/extra/service/saas/PrintService.php

@@ -28,6 +28,7 @@ class PrintService extends Service
         $filter = [];
         !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
         !empty($param['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
+        !empty($param['shop']) && $filter[] = ["shop_id", '=', $param['shop']];
         return $filter;
     }
 

+ 48 - 0
app/model/saas/SaasDiscount.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $shop_id 
+ * @property integer $duplex 1单面2双面
+ * @property integer $color 1彩色2黑白
+ * @property integer $number 
+ * @property float $rate 折扣
+ * @property mixed $create_at
+ */
+class SaasDiscount 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_discount";
+    
+    /**
+     * 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;
+
+
+}

+ 12 - 8
app/model/saas/SaasPrice.php

@@ -6,14 +6,14 @@ use app\extra\basic\Model;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $shop_id 
- * @property integer $source 1文档2复印
- * @property integer $type 1普通纸张
- * @property string $paper_size 纸张类型
- * @property integer $duplex 1单面2双面
- * @property integer $color 1彩色2黑白
- * @property integer $price 价格
+ * @property integer $id (主键)
+ * @property integer $shop_id 
+ * @property integer $source 1文档2复印
+ * @property integer $type 1普通纸张
+ * @property string $paper_size 纸张类型
+ * @property integer $duplex 1单面2双面
+ * @property integer $color 1彩色2黑白
+ * @property integer $price 价格
  * @property mixed $create_at
  */
 class SaasPrice extends Model
@@ -46,5 +46,9 @@ class SaasPrice extends Model
      */
     public bool $timestamps = false;
 
+    public function getPriceAttr($value): string
+    {
+        return format_money($value / 100);
+    }
 
 }

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


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

@@ -12,7 +12,9 @@ return [
         "agent"     => "未绑定代理信息"
     ],
     "error"     => [
+        "exist"         => "数据已存在",
         "data"          => "操作失败",
+        "status-qrcode" => "请先开启后再生成二维码",
         "captcha"       => "验证码输入错误",
         "mobile"        => "手机号码格式错误",
         "sms-repeat"    => "请勿重复获取",