zory 1 mês atrás
pai
commit
785132f25a

+ 1 - 1
app/controller/admin/Store.php

@@ -226,7 +226,7 @@ class Store extends Base
         try {
             $param = $request->get();
             $scene = (new SaasSmsScene)->where("store_id",$param['store'])->findOrEmpty();
-            if ($scene->isEmpty()) return errorTrans("error.data");
+            if ($scene->isEmpty()) $scene = null;
             $system = sConf("scene.");
             return successTrans("success.data",compact("system","scene"));
         } catch (\Throwable $throwable) {

+ 2 - 0
app/controller/merchant/Order.php

@@ -152,6 +152,7 @@ class Order extends Base
                 "title"     => "同意解锁申请",
                 "remark"    => "管理员手动同意解锁申请,用户可以申请退款"
             ]);
+            events("sms",["type" => "order_cancel","data" => $order->toArray(),"store_id" => $order['store_id']]);
             if (!$state) return errorTrans("error.data");
             return successTrans("success.data");
         } catch (\Throwable $throwable) {
@@ -231,6 +232,7 @@ class Order extends Base
                 "title"     => "完成核销",
                 "remark"    => "管理员手动完成就核销,该笔交易完成"
             ]);
+            events("sms",["type" => "order_done","data" => $order->toArray(),"store_id" => $order['store_id']]);
             if (!$state) return errorTrans("error.data");
             return successTrans("success.data");
         } catch (\Throwable $throwable) {

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

@@ -8,6 +8,7 @@ use app\extra\douyin\Client;
 use app\extra\service\saas\StoreService;
 use app\extra\tools\CodeExtend;
 use app\middleware\AuthMiddleware;
+use app\model\saas\SaasAgent;
 use app\model\saas\SaasStore;
 use app\model\system\SystemUser;
 use app\validate\saas\StoreValidate;
@@ -188,4 +189,26 @@ class Store extends Base
         }
     }
 
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "total",methods: "get")]
+    public function getStoreNum(Request $request): Response
+    {
+        try {
+            $map = ["agent_id" => $request->user['agent_id']];
+            $agent = (new SaasAgent)->where($map)->findOrEmpty();
+            if ($agent->isEmpty()) return errorTrans("error.data");
+            $shopNum = (new SaasStore)->where($map)->count();
+            if ($shopNum >= $agent['open_num']) return error("无权限开通更多店铺");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 6 - 0
app/controller/mini/Confirm.php

@@ -86,6 +86,7 @@ class Confirm extends Base
             $param['express_status'] = ($param['service_type']==1?1:0);
             $param['username'] = $address['username']??'';
             $param['mobile'] = $address['mobile']??'';
+            $param['region_json'] = $address['region_json'];
             $param['region'] = $address['region']??'';
             $param['address'] = $address['address']??'';
             $param['certificate_id'] = $param['order']??'';
@@ -97,6 +98,11 @@ class Confirm extends Base
             if ($resp['err_no'] <> 0) return error("订单数据异常");
             $orderLife->status = 2;
             $orderLife->save();
+            $config = sConf("dy.");
+            if ($orderLife['store']['is_auto'] == 1) {
+                events("express",compact("param","orderLife","config"));
+            }
+            events("sms",['type' => "order_submit","data" => $param,"store_id" => $param['store_id']]);
             $state = $order->setAutoData($param);
             (new SaasOrderLog)->insertGetId([
                 'order_id'  => $param['order_sn'],

+ 4 - 0
app/controller/mini/Order.php

@@ -239,6 +239,10 @@ class Order extends Base
                 "title"     => "取消预约/服务",
                 "remark"    => ($param['type']==1?'用户取消预约,未发货自动同意解锁':'该订单已发货,需审核通过后才可解锁退款按钮')
             ]);
+            if ($param['type'] == 2) {
+                events("sms",["type" => "order_cancel_submit","data" => $order->toArray(),"store_id" => $order['store_id']]);
+                events("sms",["type" => "order_agent","data" => $order->toArray(),"store_id" => $order['store_id']]);
+            }
             return successTrans("success.data",$order->toArray());
         } catch (\Throwable $throwable) {
             echo $throwable->getLine()."\n";

+ 4 - 1
app/controller/mini/Test.php

@@ -25,6 +25,9 @@ class Test extends Base
                 "account.default"   => "7513378475235919883",
                 "order.default"   => "1090207881668509512",
                 "openid.default"   => "_000SDaHqDYY9GGnyrpYfp4vIPHD8qs32XCx",
+                "key.default"   => "_000SDaHqDYY9GGnyrpYfp4vIPHD8qs32XCx",
+                "cert.default"   => "_000SDaHqDYY9GGnyrpYfp4vIPHD8qs32XCx",
+                "lock.default"   => 1,
                 "type.default"  => 1
             ]);
             $resp = [];
@@ -35,7 +38,7 @@ class Test extends Base
                 $resp = (new Client)->config($this->getDyConfig())->token()->queryOrder($param['account'],$param['openid']);
             }
             if ($param['type'] == 3) { // 加锁/解锁
-                $resp = (new \app\extra\douyin\Order())->config($this->getDyConfig())->token()->orderLock(1,$param['order'],"7580559591462207503","81O6R1PT9QLW8T5MEA");
+                $resp = (new \app\extra\douyin\Order())->config($this->getDyConfig())->token()->orderLock($param['lock'],$param['order'],$param['cert'],$param['key']);
             }
             if ($param['type'] == 4) { // 查询订单可用门店
                 $resp = (new Client)->config($this->getDyConfig())->token()->queryOrderStore($param['order']);

+ 21 - 18
app/controller/notify/SfExpress.php

@@ -24,6 +24,7 @@ class SfExpress extends Base
         80 => "已签收"
     ];
 
+    protected array $whiteCode = [50,30,31,44,80];
 
     /**
      *
@@ -53,24 +54,26 @@ class SfExpress extends Base
             }
             if (!empty($data['Body']['WaybillRoute'])){
                 foreach ($data['Body']['WaybillRoute'] as $val) {
-                    $order = (new SaasOrder)->where("express_id",$val['mailno'])->with(['store' => function($query){
-                        $query->field('store_id,store_name,appid,secret,express_time,order_end');
-                    }])->findOrEmpty();
-                    if ($order->isEmpty()) return json(['code' => 0,"success" => true,"msg" => ""]);
-                    if ($order['status'] >= 2) return json(['code' => 0,"success" => true,"msg" => ""]);
-                    (new SaasOrderExpress)->insertGetId(['order_id' => $order['order_sn'],'express_id' => $val['mailno'],'content' => $val['remark'],'title' => $this->opCode[$val['opCode']]??'']);
-                    (new SaasOrderLog)->insertGetId(['order_id' => $order['order_sn'],'remark' => $val['remark'],'title' => $this->opCode[$val['opCode']]??'' ]);
-                    if ($val['opCode'] == 50 && $order['store']['order_end'] == "2") { // 已揽收,发起核销
-                        // $val['acceptAddress'] 发货地址
-                        $this->orderDone($order->toArray(),1);
-                        $order->status = 2;
-                        $order->save();
-                    }
-                    if ($val['opCode'] == 80 && $order['store']['order_end'] == "3") { // 已签收
-                        // $val['acceptAddress'] 发货地址
-                        $this->orderDone($order->toArray(),2);
-                        $order->status = 2;
-                        $order->save();
+                    if (in_array($val['opCode'],$this->whiteCode)) {
+                        $order = (new SaasOrder)->where("express_id",$val['mailno'])->with(['store' => function($query){
+                            $query->field('store_id,store_name,appid,secret,express_time,order_end');
+                        }])->findOrEmpty();
+                        if ($order->isEmpty()) return json(['code' => 0,"success" => true,"msg" => ""]);
+                        if ($order['status'] >= 2) return json(['code' => 0,"success" => true,"msg" => ""]);
+                        (new SaasOrderExpress)->insertGetId(['order_id' => $order['order_sn'],'express_id' => $val['mailno'],'content' => $val['remark'],'title' => $this->opCode[$val['opCode']]??'']);
+                        (new SaasOrderLog)->insertGetId(['order_id' => $order['order_sn'],'remark' => $val['remark'],'title' => $this->opCode[$val['opCode']]??'' ]);
+                        if ($val['opCode'] == 50 && $order['store']['order_end'] == "2") { // 已揽收,发起核销
+                            // $val['acceptAddress'] 发货地址
+                            $this->orderDone($order->toArray(),1);
+                            $order->status = 2;
+                            $order->save();
+                        }
+                        if ($val['opCode'] == 80 && $order['store']['order_end'] == "3") { // 已签收
+                            // $val['acceptAddress'] 发货地址
+                            $this->orderDone($order->toArray(),2);
+                            $order->status = 2;
+                            $order->save();
+                        }
                     }
                 }
             }

+ 48 - 0
app/controller/notify/ZtExpress.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\controller\notify;
+
+use app\extra\basic\Base;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/zt")]
+class ZtExpress extends Base
+{
+
+
+    /**
+     * 轨迹查询推送服务
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "subscribe",methods: ['get','post'])]
+    public function getSubscribe(Request $request): Response
+    {
+        try {
+            if ($request->method() == "GET") {
+                $data = $request->get();
+            } else {
+                $data = $request->post();
+            }
+            return $this->reJson();
+        } catch (\Throwable $throwable) {
+            return $this->reJson();
+        }
+    }
+
+
+    protected function reJson(): Response
+    {
+        return json([
+            "status" => true,
+            "message" => "请求成功",
+            "result" => [],
+            "statusCode" => "SYS000"
+        ]);
+    }
+
+}

+ 34 - 0
app/event/Express.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace app\event;
+
+use app\model\saas\SaasOrder;
+
+class Express
+{
+
+    /**
+     * 呼叫快递
+     * @param array $data
+     * param 用户提交信息
+     * orderLife 来客订单信息
+     * config 配置信息
+     * @return bool
+     */
+    public function sendExpress(array $data = []): bool
+    {
+        if (empty($data['param'])) return false;
+        if (empty($data['orderLife'])) return false;
+        if (empty($data['config'])) return false;
+        $endStart = strtotime(date("Y-m-d ".$data['config']['express_start'].":00"));
+        $endEnd = strtotime(date("Y-m-d ".$data['config']['express_end'].":00"));
+        // 为确保店铺安全,该时间内系统暂停核销功能!
+        if (time() < $endStart || time() > $endEnd)
+        {
+            (new SaasOrder)->where("order_sn",$data['param']['order_sn'])->update(['is_auto' => 2]); // 等待到时间后自动开始呼叫
+        }
+
+        return true;
+    }
+
+}

+ 18 - 0
app/event/Sms.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace app\event;
+
+class Sms
+{
+
+    /**
+     * 发短信
+     * @param array $data
+     * @return void
+     */
+    public function sendMsg(array $data = [])
+    {
+
+    }
+
+}

+ 1 - 1
app/extra/service/saas/OrderService.php

@@ -66,7 +66,7 @@ class OrderService extends Service
         !empty($param['store']) && $filter[] = ["store_id", '=', $param['store']];
         !empty($param['open_id']) && $filter[] = ["open_id", '=', $param['open_id']];
         !empty($param['statusLt']) && $filter[] = ["status", '=', ($param['statusLt']-1)];
-        !empty($param['auto']) && $filter[] = ["auto", '=', ($param['auto']-1)];
+        !empty($param['auto']) && $filter[] = ["is_auto", '=', ($param['auto']-1)];
         !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
         !empty($param['ex_status']) && $filter[] = ["express_status", '=', ($param['ex_status']-1)];
         !empty($param['orderid']) && $filter[] = ["order_id", 'like', "%{$param['orderid']}%"];

+ 87 - 0
app/extra/tools/ZtExpress.php

@@ -0,0 +1,87 @@
+<?php
+
+namespace app\extra\tools;
+
+class ZtExpress
+{
+
+
+    /**
+     * 接口地址
+     * @var string
+     */
+    protected string $gateway = "https://japi-test.zto.com";
+
+    protected array $config = [];
+
+    /**
+     * 设置配置权限
+     * @param array $data
+     * @return $this
+     */
+    public function config(array $data = [])
+    {
+        $this->config = $data;
+        if ($data['version'] == "test")
+        {
+            $this->gateway = "https://japi-test.zto.com";
+        } else {
+            $this->gateway = "https://japi.zto.com";
+        }
+        return $this;
+    }
+
+    /**
+     * 下单
+     * @param array $sendData 发货信息
+     * @param array $endData 收件人信息
+     * @return array
+     */
+    public function createOrder(array $sendData = [],array $endData = [],string $orderId = "",int $expressType = 1): array
+    {
+        $param = [
+            "partnerType"   => 2,
+            "orderType"     => 1,
+            "partnerOrderCode" => $orderId,
+            "senderInfo"    => [
+                "senderName" => $endData['username'],
+                "senderMobile" => $endData['mobile'],
+                "senderProvince" => "",
+                "senderCity"    => "",
+                "senderDistrict" => "",
+                "senderAddress" => "",
+            ]
+        ];
+        if ($this->config['version'] == "test")
+        {
+            $param['accountInfo']['accountPassword'] = $this->config['account'];
+        } else {
+            $param['accountInfo']['accountId'] = $this->config['account'];
+        }
+    }
+
+
+    /**
+     * 获取签名
+     * @param array $params
+     * @return string
+     */
+    protected function getSign(array $params = []): string
+    {
+        $fixedParams = array();
+        foreach ($params as $k => $v) {
+            if (gettype($v) != "string") {
+                $fixedParams += [$k => json_encode($v)];
+            } else {
+                $fixedParams += [$k => $v];
+            }
+        }
+        $str_to_digest = "";
+        foreach ($fixedParams as $k => $v) {
+            $str_to_digest = $str_to_digest .$k ."=" .$v ."&";
+        }
+        $str_to_digest = substr($str_to_digest, 0, -1) .$this->config['secret'];
+        return base64_encode(md5($str_to_digest, true));
+    }
+
+}

+ 9 - 1
app/model/saas/SaasSmsScene.php

@@ -9,14 +9,22 @@ use app\extra\basic\Model;
  * @property integer $id (主键)
  * @property integer $agent_id 代理id
  * @property integer $store_id 店铺id
- * @property integer $order 
+ * @property integer $orders 
+ * @property string $orders_template 
  * @property integer $order_submit 
+ * @property string $order_submit_template 
  * @property integer $order_send 
+ * @property string $order_send_template 
  * @property integer $order_auto 
+ * @property string $order_auto_template 
  * @property integer $order_agent 
+ * @property string $order_agent_template 
  * @property integer $order_cancel 
+ * @property string $order_cancel_template 
  * @property integer $order_cancel_submit 
+ * @property string $order_cancel_submit_template 
  * @property integer $order_done 
+ * @property string $order_done_template 
  * @property mixed $create_at
  */
 class SaasSmsScene extends Model

+ 6 - 1
config/event.php

@@ -1,5 +1,10 @@
 <?php
 
 return [
-    
+    "express" => [
+        [\app\event\Express::class,"sendExpress"]
+    ],
+    "sms"   => [
+        [\app\event\Sms::class,"sendMsg"]
+    ]
 ];