zory 22 uur geleden
bovenliggende
commit
3279fdba84

+ 185 - 0
app/controller/api/Card.php

@@ -0,0 +1,185 @@
+<?php
+
+namespace app\controller\api;
+
+use app\extra\basic\Base;
+use app\extra\tools\CodeExtend;
+use app\middleware\WxMiddleware;
+use app\model\saas\SaasCombo;
+use app\model\saas\SaasUser;
+use app\model\saas\SaasUserBuy;
+use app\model\saas\SaasUserLog;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Middleware;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/wx_api/card"),Middleware(WxMiddleware::class)]
+class Card extends Base
+{
+
+    #[Route(path: "data",methods: "get")]
+    public function getCardData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "shop.require"  => "参数错误"
+            ]);
+            if (!is_array($param)) return error($param);
+            $memberCard = (new SaasUser)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->with(["shop" => function($query){
+                $query->field("shop_id,shop_name,user_card_price,user_card");
+            }])->findOrEmpty();
+            if ($memberCard->isEmpty()) return success("",[],2);
+            $memberCard['balance'] = format_money($memberCard['balance']/100,2);
+            $memberCard['end_at'] = date("Y-m-d",strtotime($memberCard['create_at']));
+            $isRecharge = (new SaasUserBuy)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->where("status",1)->sum("money");
+            if ($memberCard['shop']['user_card'] == 2) { // 自定义套餐
+                $cardPrice = array_values($memberCard['shop']['user_card_price']);
+            } else {
+                $cardPrice = (new SaasCombo)->where("type",2)->select();
+            }
+            $cardPrice = array_filter($cardPrice, function($item) use ($isRecharge) {
+                if ($isRecharge > 0) {
+                    return $item['is_first'] != '1'; // 注意:这里使用松散比较,因为数据中有字符串'1'
+                } else {
+                    return $item;
+                }
+            });
+            foreach ($cardPrice as $key=>$val) {
+                $cardPrice[$key] = $val;
+                $cardPrice[$key]['money'] = $val['money'];
+                $cardPrice[$key]['old_money'] = $val['old_money'];
+            }
+            $memberCard['card'] = array_values($cardPrice);
+            return success("ok",$memberCard->toArray());
+        } catch (\Throwable $throwable) {
+            echo getDateFull()."==会员卡报错\n";
+            echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 会员卡消费明细
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "log",methods: "get")]
+    public function getOrderList(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "page.require"  => "参数错误",
+                "size.require"  => "参数错误",
+                "shop.require"  => "参数错误",
+                "card.require"  => "参数错误"
+            ]);
+            if (!is_array($param)) return error($param);
+            $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
+            $resp = (new SaasUserLog)->where($map)->order("create_at desc")->paginate([
+                "list_rows" => $param['size'],
+                "page"      => $param['page']
+            ]);
+            return success("ok",$resp->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 下单
+     * @param Request $request
+     * @return Response|void|null
+     */
+    #[Route(path: "create",methods: "post")]
+    public function createOrder(Request $request)
+    {
+        try {
+            $param = $this->_valid([
+                "card.require"  => "参数错误",
+                "shop.require"  => "参数错误"
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
+            $card = (new SaasUser)->where($map)->with(['shop' => function($query){
+                $query->field("shop_id,shop_name");
+            }])->findOrEmpty();
+            if ($card->isEmpty()) return error("尚未开通会员卡");
+            $orderSn = strtoupper(CodeExtend::random(12,3));
+            $buyCard = json_decode($param['card'],true);
+            $state = (new SaasUserBuy)->insertGetId([
+                "uid"           => $request->user['id'],
+                "openid"        => $request->user['openid'],
+                "order_sn"      => $orderSn,
+                "shop_id"       => $param['shop'],
+                "card_no"       => $card['card_no'],
+                "money"         => $buyCard['money'] * 100,
+                "card_money"    => $buyCard['money'] * 100 + $buyCard['old_money'] * 100,
+                "remark"        => "赠送金额".$buyCard['old_money']
+            ]);
+            if ($state) {
+                $wechat = new \WeChat\Pay($this->getWxConfig());
+                $options = [
+                    'body'             => $card['shop']['shop_name']."-会员卡充值",
+                    'out_trade_no'     => $orderSn."-".CodeExtend::random(8),
+                    "attach"            => $orderSn,
+                    'total_fee'        => $buyCard['money'] * 100,
+                    'openid'           => $request->user['openid'],
+                    'trade_type'       => 'JSAPI',
+                    'notify_url'       => 'https://apiv.ujia5.com/notify/recharge',
+                    'spbill_create_ip' => $request->getRealIp(),
+                ];
+                // 生成预支付码
+                $result = $wechat->createOrder($options);
+                // 创建JSAPI参数签名
+                $resp = $wechat->createParamsForJsApi($result['prepay_id']);
+                return success("ok",$resp);
+            }
+            return error("发起充值失败");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    #[Route(path: "del",methods: "post")]
+    public function delCard(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "shop.require"  => "参数错误"
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
+            $card = (new SaasUser)->where($map)->findOrEmpty();
+            if ($card->isEmpty()) return error("会员卡不存在");
+            $state = $card->delete();
+            if ($state) return success("注销成功");
+            return error("注销失败");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 小程序配置
+     * @return array
+     */
+    protected function getWxConfig(): array
+    {
+        return [
+            'token'          => 'test',
+            'appid'          => sConf("wechat.mini_appid"),
+            'appsecret'      => sConf("wechat.mini_secret"),
+            'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
+            // 配置商户支付参数(可选,在使用支付功能时需要)
+            'mch_id'         => sConf("wechat.mch_id"),
+            'mch_key'        => sConf("wechat.mch_key")
+        ];
+    }
+
+}

+ 4 - 4
app/controller/api/Cart.php

@@ -67,7 +67,7 @@ class Cart extends Base
                 "type.default"  => 1
             ]);
             if (!is_array($param)) return error($param);
-            $cart = (new SaasCart)->where("shop_id",$param['shop'])->order("create_at desc")->select();
+            $cart = (new SaasCart)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->order("create_at desc")->select();
             if ($cart->isEmpty()) return success('ok',['cart' => []]);
             $totalAmount = $totalDiscount = 0;
             foreach ($cart as $k=>$v){
@@ -123,7 +123,7 @@ class Cart extends Base
             $totalDiscount = format_money($totalDiscount / 100,2);
             if ($param['type'] <> 1) {
                 $shop = (new SaasShop)->where("shop_id",$param['shop'])->field("shop_name,shop_address,user_card,user_card_price")->find();
-                $isRecharge = (new SaasUserBuy)->where("shop_id",$param['shop'])->where("uid",$request->user['id'])->where("status",1)->sum("money");;
+                $isRecharge = (new SaasUserBuy)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->where("status",1)->sum("money");;
                 $cardPrice = [];
                 if ($shop['user_card'] < 3) {
                     if ($shop['user_card'] == 2) { // 自定义套餐
@@ -194,7 +194,7 @@ class Cart extends Base
     {
         try {
             $param = $request->post();
-            $cart = (new SaasCart)->where("id",$param['id'])->where("uuid",$request->user['id'])->findOrEmpty();
+            $cart = (new SaasCart)->where("id",$param['id'])->where("openid",$request->user['openid'])->findOrEmpty();
             if ($cart->isEmpty()) return error('数据格式错误');
             if ($param['end_page'] > $cart['total_page']) return error('打印范围不能大于总页数');
             // 查询默认打印机是否有额外收费规则
@@ -310,7 +310,7 @@ class Cart extends Base
                     "total_page"    => $val['total'],
                     "end_page"      => $val['total'],
                     "name"          => $val['name'],
-                    "uuid"          => $request->user['id'],
+                    "openid"        => $request->user['openid'],
                     "shop_id"       => $param['shop'],
                     "paper_size"    => $paperSize,
                     "extension"     => $val['ext'],

+ 90 - 0
app/controller/api/Notify.php

@@ -0,0 +1,90 @@
+<?php
+
+namespace app\controller\api;
+
+use app\extra\basic\Base;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/notify")]
+class Notify extends Base
+{
+
+    /**
+     * 退款回调
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "refund",methods: "post")]
+    public function notifyRefund(Request $request)
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 订单支付
+     */
+    #[Route(path: "wx",methods: "post")]
+    public function notifyWx(Request $request)
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 充值并支付
+     */
+    #[Route(path: "payrecharge",methods: "post")]
+    public function notifyPayRecharge(Request $request)
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 会员卡充值
+     */
+    #[Route(path: "recharge",methods: "post")]
+    public function notifyDataRecharge(Request $request)
+    {
+        try {
+
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 小程序配置
+     * @return array
+     */
+    protected function getWxConfig(): array
+    {
+        return [
+            'token'          => 'test',
+            'appid'          => sConf("wechat.mini_appid"),
+            'appsecret'      => sConf("wechat.mini_secret"),
+            'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
+            // 配置商户支付参数(可选,在使用支付功能时需要)
+            'mch_id'         => sConf("wechat.mch_id"),
+            'mch_key'        => sConf("wechat.mch_key")
+        ];
+    }
+
+}

+ 152 - 26
app/controller/api/Order.php

@@ -8,13 +8,18 @@ use app\middleware\WxMiddleware;
 use app\model\saas\SaasCart;
 use app\model\saas\SaasDiscount;
 use app\model\saas\SaasOrder;
+use app\model\saas\SaasOrderDetail;
 use app\model\saas\SaasPrintClient;
+use app\model\saas\SaasShop;
 use app\model\saas\SaasUser;
+use app\model\saas\SaasUserBuy;
+use app\model\saas\SaasUserLog;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
 use support\Request;
 use support\Response;
+use think\facade\Db;
 
 
 #[Controller(prefix: "/wx_api/order"),Middleware(WxMiddleware::class)]
@@ -29,6 +34,75 @@ class Order extends Base
         '2_2_1' => ['name' => '黑白-双面', 'amount' => 0, 'quantity' => 0,'discount' => 0],
     ];
 
+    protected array $color = ["1" => "彩色", "2" => "黑白"];
+
+    protected array $duplex = ["1" => "单面", "2" => "双面"];
+
+    protected array $package = ["1" => "店内打印", "2" => '远程自取' , "3" => "商家配送"];
+
+    #[Route(path: "list",methods: "get")]
+    public function getOrderList(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "page.require"  => "参数错误",
+                "size.require"  => "参数错误",
+                "type.require"  => "参数错误",
+                "shop.require"  => "请选择店铺"
+            ]);
+            if (!is_array($param)) return error($param);
+            $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
+            $model = (new SaasOrder);
+            if ($param['type'] > 0) {
+                $map['status'] = $param['type'] - 1;
+            } else {
+                $model = $model->where("status",">",0);
+            }
+            $resp = $model->where($map)->append(["total"])->with(['shop' => function($query){
+                $query->field('shop_id,shop_name');
+            }])->withAttr(["total" => function($val,$resp){
+                return (new SaasOrderDetail)->where("order_sn",$resp['order_sn'])->sum("number");
+            }])->order("create_at desc")->paginate([
+                "list_rows" => $param['size'],
+                "page"      => $param['page']
+            ]);
+            return success("ok",$resp->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 订单详情
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "detail",methods: "get")]
+    public function getOrderDetail(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "order.require"  => "参数错误"
+            ]);
+            if (!is_array($param)) return error($param);
+            $resp = (new SaasOrder)->where("openid",$request->user['openid'])->where("order_sn",$param['order'])->append(["total","subscribe"])->with(['shop' => function($query){
+                $query->field('shop_id,shop_name,shop_address');
+            },"detail" => function($query){
+                $query->field('order_sn,name,color,paper_size,duplex,number,page,extension,path,icon');
+            }])->withAttr(["total" => function($val,$resp){
+                return (new SaasOrderDetail)->where("order_sn",$resp['order_sn'])->sum("number");
+            },"subscribe" => function(){
+                return ["495E40hqOKoz5j_mWcf-UcmF6wkj_yIwCrTXicicH5w","UXJjDQ7NGstSwOxrKf_laGDmpID8Mm5MpXwFAd45d8U"];
+            }])->findOrEmpty();
+            if ($resp->isEmpty()) return error("订单数据错误");
+            $resp['package_name'] = $this->package[$resp['package']];
+            $resp['money'] = format_money($resp['money'] / 100);
+            return success("ok",$resp->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
     /**
      * @param Request $request
      * @return Response
@@ -40,15 +114,15 @@ class Order extends Base
             $param = $this->_valid([
                 "shop.require"  => trans("empty.require"),
                 "print.require" => trans("empty.require"),
-                "pay.require"   => trans("empty.require"),
+                "pay.require"   => trans("empty.require"), // 1微信支付 2会员卡支付 3会员卡充值并支付
                 "printName.default" => "",
                 "express.require" => trans("empty.require"),
-                "card.default"      => [],
+                "card.default"      => "",
                 "gift.default"      => 0
             ],$request->method());
             if (!is_array($param)) return error($param);
-            $cart = (new SaasCart)->where("shop_id",$param['shop'])->order("create_at desc")->select();
-            if ($cart->isEmpty()) return success('ok',['cart' => []]);
+            $cart = (new SaasCart)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->order("create_at desc")->select();
+            if ($cart->isEmpty()) return error('请重新下单进行支付');
             $totalAmount = $totalDiscount = 0;
             foreach ($cart as $k=>$v){
                 $key = $v['color'] . '_' . $v['duplex'] . '_' . $v['source'];
@@ -73,48 +147,100 @@ class Order extends Base
                 $totalDiscount += $v['discount']; // 折扣后金额
             }
             $orderSn = CodeExtend::uniqidDate(16).date("is").rand(1,9);
-            $totalDay = (new SaasOrder)->where("shop_id",$param['shop'])->whereDay("create_at")->count();
+            $totalDay = (new SaasOrder)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->whereDay("create_at")->count();
             $orderData = [
                 "shop_id"       => $param['shop'], // 所属店铺
                 "parent_id"     => $param['shop'], // 消费店铺
+                "openid"        => $request->user['openid'],
                 "order_sn"      => $orderSn,
                 "money"         => $totalAmount,
                 "discount"      => $totalDiscount,
-                "uuid"          => $request->user['id'],
                 "print_name"    => $param['printName'],
                 "package"       => $param['express'],
                 "package_sn"    => date('md')."-".sprintf("%02d",($totalDay+1)),
-                "extra_money"   => "",
+                "extra_money"   => 0,
                 "remark"        => $param['remark']??''
             ];
-            if ($param['pay'] == 2) { // 会员卡支付或开通会员卡并充值
+            $shop = (new SaasShop)->where("shop_id",$param['shop'])->findOrEmpty();
+            if ($param['pay'] == 2) { // 会员卡支付
                 $card = (new SaasUser)->where("openid",$request->user['openid'])->where("shop_id",$param['shop'])->field("balance")->findOrEmpty();
-                if ($card->isEmpty()) // 创建会员并发起支付
-                {
-
-                }
-                if ($totalDiscount > 0 && $totalDiscount > $card['balance']) {
+                $payMoney = $totalDiscount > 0 ? $totalDiscount : $totalAmount;
+                if ($payMoney > $card['balance']) {
                     return error("卡内余额不足~");
                 }
-                if ($totalDiscount == 0 && $totalAmount > $card['balance']) {
-                    return error("卡内余额不足");
-                }
+                (new SaasUserLog)->insertGetId([
+                    "openid"    => $request->user['openid'],
+                    "shop_id"   => $param['shop'],
+                    "money"     => $payMoney,
+                    "type"      => 1
+                ]);
+                // 直接支付
+                $card->balance = Db::raw("balance - {$payMoney}");
+                $card->total_consume = Db::raw("total_consume + {$payMoney}");
+                $card->save();
+                $orderData['pay_type'] = 2;
+                $orderData['status'] = 1;
+                $orderData['pay_at'] = getDateFull();
+                (new SaasOrder)->insertGetId($orderData);
+                events("create-order",['shop' => $param['shop'],'openid' => $request->user['openid'],"order" => $orderSn]);
+                return success("支付成功",['type' => 2,'data' => []]);
             }
-            $orderDetail = [];
-            foreach ($cart as $key=>$val)
-            {
-                unset($val['id']);
-                $orderDetail[$key] = $val;
-                $orderDetail[$key]['money'] = $val['money']*100;
-                $orderDetail[$key]['order_sn'] = $orderSn;
-                $orderDetail[$key]['print_name'] = $param['printName'];
+            $options = [
+                'body'              => $shop['shop_name']."-打印",
+                'out_trade_no'      => $orderSn."-".$orderData['package_sn'],
+                "attach"            => $orderSn,
+                'total_fee'         => $orderData['money'] * 100,
+                'openid'            => $request->user['openid'],
+                'trade_type'        => 'JSAPI',
+                'spbill_create_ip'  => $request->getRealIp(),
+                "notify_url"        => "https://apiv.ujia5.com/notify/wx"
+            ];
+            if ($param['pay'] == 3 && !empty($param['card'])) { // 开通会员卡并充值
+                $buyCard = json_decode($param['card'],true);
+                (new SaasUserBuy)->insertGetId([
+                    "shop_id"       => $param['shop'],
+                    "money"         => $buyCard['money'] * 100,
+                    "total_money"   => ($buyCard['money'] * 100) + ($buyCard['old_money'] * 100),
+                    "order_sn"      => $orderSn,
+                    "openid"        => $request->user['openid']
+                ]);
+                $options['body'] = $shop['shop_name']."-充值支付";
+                $options['total_fee'] = $buyCard['money'] * 100;
+                $options['notify_url'] = "https://apiv.ujia5.com/notify/payrecharge";
             }
-            print_r($orderDetail);
-
+            (new SaasOrder)->insertGetId($orderData);
+            $wechat = new \WeChat\Pay($this->getWxConfig());
+            // 生成预支付码
+            $result = $wechat->createOrder($options);
+            if (!isset($result['return_code']) || $result['return_code'] !== "SUCCESS") {
+                return error("发起支付失败");
+            }
+            // 创建JSAPI参数签名
+            $resp = $wechat->createParamsForJsApi($result['prepay_id']);
+            return success("ok",['type' => 1,"data" => $resp]);
         } catch (\Throwable $throwable) {
             echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
             return error($throwable->getMessage());
         }
     }
 
+    /**
+     * 小程序配置
+     * @return array
+     */
+    protected function getWxConfig(): array
+    {
+        return [
+            'token'          => 'test',
+            'appid'          => sConf("wechat.mini_appid"),
+            'appsecret'      => sConf("wechat.mini_secret"),
+            'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
+            // 配置商户支付参数(可选,在使用支付功能时需要)
+            'mch_id'         => sConf("wechat.mch_id"),
+            'mch_key'        => sConf("wechat.mch_key")
+        ];
+    }
+
+
 }

+ 36 - 0
app/controller/api/User.php

@@ -4,6 +4,7 @@ namespace app\controller\api;
 
 use app\extra\basic\Base;
 use app\middleware\WxMiddleware;
+use app\model\saas\SaasPrice;
 use app\model\saas\SaasUserOpen;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Route;
@@ -16,6 +17,11 @@ use support\Response;
 class User extends Base
 {
 
+    protected array $color = ["1" => "彩色", "2" => "黑白"];
+
+    protected array $duplex = ["1" => "单面", "2" => "双面"];
+
+    protected array $type = ["1" => "文档", "2" => "复印"];
 
     #[Route(path: "data",methods: "get")]
     public function getUserData(Request $request): Response
@@ -38,4 +44,34 @@ class User extends Base
         }
     }
 
+
+    /**
+     * 价目表
+     */
+    #[Route(path: "price",methods: "get")]
+    public function getPriceData(): Response
+    {
+        try {
+            $param = $this->_valid([
+                "shop.require"  => "参数错误"
+            ]);
+            if (!is_array($param)) return error($param);
+            $data = (new SaasPrice)->where("shop_id",$param['shop'])->field("paper_size,source,duplex,price,color,type")->select();
+            if ($data->isEmpty()) return error("尚未配置价目表");
+            $resp = [];
+            foreach ($data as $key=>$val)
+            {
+                $color = $this->color[$val['color']];
+                $type = $this->type[$val['type']];
+                $duplex = $this->duplex[$val['duplex']];
+                $resp[$val['paper_size']]['id'] = $val['paper_size'];
+                $resp[$val['paper_size']]['child'][$key]['name'] = $type.$color.$duplex;
+                $resp[$val['paper_size']]['child'][$key]['price'] = $val['price'];
+            }
+            return success("ok",$resp);
+        } catch (\Throwable $exception) {
+            return error($exception->getMessage());
+        }
+    }
+
 }

+ 84 - 0
app/controller/merchant/Dashboard.php

@@ -0,0 +1,84 @@
+<?php
+
+namespace app\controller\merchant;
+
+use app\extra\basic\Base;
+use app\middleware\AuthMiddleware;
+use app\model\saas\SaasOrder;
+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/dashboard"),Middleware(AuthMiddleware::class)]
+class Dashboard extends Base
+{
+
+
+    #[Route(path: "data",methods: "get")]
+    public function getData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "money.default" => 1,
+                "hide.default"  => 0,
+                "order.default"  => 1
+            ],$request->method());
+            $moneyDay = 7;
+            $data = $moneys = $orders = [];
+            if ($param['money'] == 2) $moneyDay = 14;
+            if ($param['money'] == 3) $moneyDay = 30;
+            $orderDay = 7;
+            if ($param['order'] == 2) $orderDay = 14;
+            if ($param['order'] == 3) $orderDay = 30;
+            $shopId = $request->user['agent_id'];
+            $mode = (new SaasOrder);
+            if ($param['hide'] == 1) {
+                $data = [
+                    "userNum"   => format_money($mode->whereDay("create_at")->where("shop_id",$shopId)->where('status','in',[1,3])->sum("money")/100,2), // 今日营业额
+                    "rechargeNum"   => $mode->whereDay("create_at")->where("shop_id",$shopId)->where('status','in',[1,3])->count(), // 今日订单数
+                    "rechargeMoney"   => $mode->whereDay("create_at")->where("shop_id",$shopId)->where('status',1)->count(), // 手机自助打印待处理
+                ];
+                $fields = ['ROUND(sum(money)/100,2)' => 'total','substr(create_at,1,10)' => 'mday'];
+                $orderMoney = $mode->field($fields)->where("shop_id",$shopId)->where('status','in',[1,3])->whereTime('create_at', '-'.$moneyDay.' days')->group('mday')->select()->column(null, 'mday');
+                for ($i = $moneyDay; $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 = $mode->field($field)->where("shop_id",$shopId)->where('status','in',[1,3])->whereTime('create_at', '-'.$orderDay.' days')->group('mday')->select()->column(null, 'mday');
+                for ($i = $orderDay; $i >= 0; $i--) {
+                    $date = date('Y-m-d', strtotime("-{$i}days"));
+                    $orders[] = [
+                        '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                        '订单数量' => ($orderNum[$date] ?? [])['count'] ?? 0,
+                    ];
+                }
+            } else {
+                for ($i = $moneyDay; $i >= 0; $i--) {
+                    $date = date('Y-m-d', strtotime("-{$i}days"));
+                    $moneys[] = [
+                        '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                        '订单金额' => 888,
+                    ];
+                }
+                for ($i = $orderDay; $i >= 0; $i--) {
+                    $date = date('Y-m-d', strtotime("-{$i}days"));
+                    $orders[] = [
+                        '当天日期' => date('Y-m-d', strtotime("-{$i}days")),
+                        '订单数量' => 888,
+                    ];
+                }
+            }
+            return success("ok",compact("data","orders","moneys"));
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 27 - 0
app/event/CreateOrder.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\event;
+
+use app\model\saas\SaasCart;
+use app\model\saas\SaasOrderDetail;
+
+class CreateOrder
+{
+
+    public function createOrder(array $data = [])
+    {
+        $cart = (new SaasCart)->where("shop_id",$data['shop'])->where("openid",$data['openid'])->order("create_at desc")->select();
+        if ($cart->isEmpty()) return success('ok',['cart' => []]);
+        $orderDetail = [];
+        foreach ($cart->toArray() as $key=>$val)
+        {
+            unset($val['id']);
+            $orderDetail[$key] = $val;
+            $orderDetail[$key]['order_sn'] = $data['order'];
+            $orderDetail[$key]['status'] = 1;
+        }
+        (new SaasOrderDetail)->insertAll($orderDetail);
+//        (new SaasCart)->where("shop_id",$data['shop'])->where("openid",$data['openid'])->delete();
+    }
+
+}

+ 39 - 27
app/model/saas/SaasOrder.php

@@ -3,36 +3,38 @@
 namespace app\model\saas;
 
 use app\extra\basic\Model;
+use think\model\relation\HasMany;
+use think\model\relation\HasOne;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $shop_id 所属店铺
- * @property string $parent_id 消费店铺
- * @property string $order_sn 
- * @property integer $money 
- * @property integer $status 0待付款1已支付
- * @property integer $uuid 
- * @property integer $pay_type 支付方式1微信2会员卡
- * @property string $print_name 打印机名称
- * @property integer $coupon_money 优惠券金额
- * @property integer $coupon_id 
- * @property integer $notify_status 通知状态1已通知
- * @property mixed $pay_at 支付时间
- * @property string $transaction_id 交易编号wx
- * @property mixed $refund_at 
- * @property integer $refund_status 
- * @property integer $package 1店内打印2远程自取3商家配送
- * @property string $package_sn 取件号
- * @property integer $package_type 0无1店内打印2远程自取3商家配送
- * @property string $package_local 装订位置
- * @property integer $extra_money 额外加价
- * @property integer $express_money 配送费
- * @property integer $staple_money 装订费
- * @property float $discount 折扣
- * @property mixed $print_at 打印时间
- * @property string $remark 备注
- * @property string $reason 失败原因
+ * @property integer $id (主键)
+ * @property integer $shop_id 所属店铺
+ * @property string $parent_id 消费店铺
+ * @property string $order_sn 
+ * @property integer $money 
+ * @property integer $status 0待付款1已支付
+ * @property integer $uuid 
+ * @property integer $pay_type 支付方式1微信2会员卡
+ * @property string $print_name 打印机名称
+ * @property integer $coupon_money 优惠券金额
+ * @property integer $coupon_id 
+ * @property integer $notify_status 通知状态1已通知
+ * @property mixed $pay_at 支付时间
+ * @property string $transaction_id 交易编号wx
+ * @property mixed $refund_at 
+ * @property integer $refund_status 
+ * @property integer $package 1店内打印2远程自取3商家配送
+ * @property string $package_sn 取件号
+ * @property integer $package_type 0无1店内打印2远程自取3商家配送
+ * @property string $package_local 装订位置
+ * @property integer $extra_money 额外加价
+ * @property integer $express_money 配送费
+ * @property integer $staple_money 装订费
+ * @property float $discount 折扣
+ * @property mixed $print_at 打印时间
+ * @property string $remark 备注
+ * @property string $reason 失败原因
  * @property mixed $create_at
  */
 class SaasOrder extends Model
@@ -66,4 +68,14 @@ class SaasOrder extends Model
     public bool $timestamps = false;
 
 
+    public function shop(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasShop","shop_id","shop_id");
+    }
+
+    public function detail(): HasMany
+    {
+        return $this->hasMany("app\model\saas\SaasOrderDetail","order_sn",'order_sn');
+    }
+
 }

+ 12 - 7
app/model/saas/SaasUser.php

@@ -3,16 +3,17 @@
 namespace app\model\saas;
 
 use app\extra\basic\Model;
+use think\model\relation\HasOne;
 
 
 /**
- * @property integer $id (主键)
- * @property mixed $openid 
- * @property integer $agent_id 
- * @property integer $shop_id 
- * @property integer $balance 余额
- * @property integer $total_balance 累计充值
- * @property integer $total_consume 累计消费
+ * @property integer $id (主键)
+ * @property mixed $openid 
+ * @property integer $agent_id 
+ * @property integer $shop_id 
+ * @property integer $balance 余额
+ * @property integer $total_balance 累计充值
+ * @property integer $total_consume 累计消费
  * @property mixed $create_at
  */
 class SaasUser extends Model
@@ -46,4 +47,8 @@ class SaasUser extends Model
     public bool $timestamps = false;
 
 
+    public function shop(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasShop","shop_id","shop_id");
+    }
 }

+ 53 - 0
app/model/saas/SaasUserLog.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $agent_id 
+ * @property integer $uid 
+ * @property integer $shop_id 
+ * @property integer $money 金额
+ * @property integer $type 1出2进
+ * @property mixed $create_at
+ */
+class SaasUserLog 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_user_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($data)
+    {
+        return format_money($data/100);
+    }
+
+}

+ 3 - 0
config/event.php

@@ -3,5 +3,8 @@
 return [
     "clear-upload" => [
         [\app\event\ClearUpload::class,"clearData"]
+    ],
+    "create-order" => [
+        [\app\event\CreateOrder::class,"createOrder"]
     ]
 ];