Zory 1 week ago
parent
commit
9148a46273

+ 98 - 0
app/controller/mini/Address.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace app\controller\mini;
+
+use app\extra\basic\Base;
+use app\extra\service\saas\AddressService;
+use app\middleware\DyMiddleware;
+use app\model\saas\SaasAddress;
+use app\validate\saas\AddressValidate;
+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/dy/address"),Middleware(DyMiddleware::class)]
+class Address extends Base
+{
+    #[Inject]
+    protected SaasAddress $mode;
+
+    #[Inject]
+    protected AddressValidate $validate;
+
+    /**
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "data",methods: "get")]
+    public function getAddressList(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "page.default"  => 1,
+                "size.default"  => 10
+            ]);
+            if (!is_array($param)) return error($param);
+            $param['open_id']  = $request->user['open_id'];
+            $list = (new AddressService)->getDataListMini($param);
+            return successTrans(100010,pageFormat($list));
+        } 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['uuid'] = $request->user['id'];
+            $param['open_id'] = $request->user['open_id'];
+            if (!$this->validate->check($param)) return error($this->validate->getError());
+            $state = $this->mode->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")
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $data = $this->mode->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());
+        }
+    }
+
+}

+ 61 - 1
app/controller/mini/Confirm.php

@@ -6,13 +6,18 @@ use app\extra\basic\Base;
 use app\extra\douyin\Crypt;
 use app\extra\tools\CodeExtend;
 use app\middleware\DyMiddleware;
+use app\model\saas\SaasAddress;
+use app\model\saas\SaasGoods;
 use app\model\saas\SaasMember;
+use app\model\saas\SaasOrder;
 use app\model\saas\SaasOrderLife;
+use app\model\saas\SaasOrderLog;
 use app\model\saas\SaasStore;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
 use Shopwwi\WebmanAuth\Auth as AuthMode;
+use app\extra\douyin\Order as DouyinOrder;
 use support\Request;
 use support\Response;
 
@@ -33,15 +38,70 @@ class Confirm extends Base
             if ($order->isEmpty()) return error("订单尚未同步");
             $store = (new SaasStore)->where("store_id",$order['store_id'])->where("agent_id",$order['agent_id'])->field("service_mobile,service_type,service_at_start,service_at_end")->findOrEmpty();
             $time = [];
+            $weekdays_cn = ['日', '一', '二', '三', '四', '五', '六'];
             for ($i = 0;$i <= 15;$i ++)
             {
+                $weekNum = date("w",strtotime("+{$i} day"));
                 $time[$i]['day'] = date("m月d日",strtotime("+{$i} day"));
+                $time[$i]['full'] = date("Y-m-d",strtotime("+{$i} day"));
+                $time[$i]['week'] = "星期".$weekdays_cn[$weekNum];
                 $time[$i]['children'] = getHourlyTimeSlots();
             }
-            return successTrans("success.data",compact("order","store",'time'));
+            $specs = [];
+            $goods = (new SaasGoods)->where("out_id",$order['out_id'])->findOrEmpty();
+            if (!$goods->isEmpty()) $specs = $goods['data_specs'];
+            return successTrans("success.data",compact("order","store",'time','specs'));
         } catch (\Throwable $throwable) {
             return error($throwable->getMessage());
         }
     }
 
+
+    #[Route(path: "submit",methods: "post")]
+    public function submitOrder(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            $orderLife = (new SaasOrderLife)->where("order_id",$param['order'])->with(['store','agent'])->findOrEmpty();
+            if ($orderLife->isEmpty()) return errorTrans("empty.data");
+            $order = (new SaasOrder)->where("order_id",$param['order'])->where("status","in",[1,2,4])->findOrEmpty();
+            if (!$order->isEmpty()) return error("请勿重复提交");
+            $param['service_type'] = $orderLife['store']['service_type'];
+            $address = !empty($param['address']) ? json_decode($param['address'],true): [];
+            $param['order_sn'] = CodeExtend::random(18,1,date("md"));
+            $param['order_id'] = $param['order'];
+            $param['open_id'] = $request->user['open_id'];
+            $param['uuid'] = $request->user['id'];
+            $param['store_id'] = $orderLife['store_id'];
+            $param['agent_id'] = $orderLife['agent_id'];
+            $param['product_id'] = $orderLife['out_id'];
+            $param['product_name'] = $orderLife['product_name'];
+            $param['status'] = 2;
+            $param['username'] = $address['username']??'';
+            $param['mobile'] = $address['mobile']??'';
+            $param['region'] = $address['region']??'';
+            $param['address'] = $address['address']??'';
+            $orderDetail = (new DouyinOrder)->config($this->getDyConfig())->token()->getOrderDetail([$param['order']]);
+            if (!isset($orderDetail['data']['certificate_info_list'][0]['certificate_id'])) return error("订单数据异常");
+            $param['certificate_id'] = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
+            $param['lock_key'] = strtoupper(CodeExtend::random(18,3));
+            // 锁码
+            $endTime = strtotime("+{$orderLife['store']['code_time']} day");
+            $resp = (new DouyinOrder)->config($this->getDyConfig())->token()->orderLock(2,$param['order'],$param['certificate_id'],$param['lock_key'],time(),$endTime);
+            if ($resp['err_no'] <> 0) return error("订单数据异常");
+            $orderLife->status = 2;
+            $orderLife->save();
+            $state = $order->setAutoData($param);
+            (new SaasOrderLog)->insertGetId([
+                'order_id'  => $param['order_sn'],
+                "title"     => "提交核销",
+                "remark"    => "用户提交核销信息"
+            ]);
+            if (!$state) return error("处理失败");
+            return success("提交成功");
+        }  catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

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

@@ -4,11 +4,14 @@ namespace app\controller\mini;
 
 use app\extra\basic\Base;
 use app\extra\douyin\Crypt;
+use app\extra\douyin\Order as DouyinOrder;
 use app\extra\service\saas\OrderService;
 use app\extra\tools\CodeExtend;
 use app\middleware\DyMiddleware;
 use app\model\saas\SaasMember;
+use app\model\saas\SaasOrder;
 use app\model\saas\SaasOrderLife;
+use app\model\saas\SaasOrderLog;
 use app\model\saas\SaasStore;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
@@ -16,6 +19,7 @@ use LinFly\Annotation\Route\Route;
 use Shopwwi\WebmanAuth\Auth as AuthMode;
 use support\Request;
 use support\Response;
+use function DI\string;
 
 
 #[Controller(prefix: "/api/dy/order"),Middleware(DyMiddleware::class)]
@@ -87,6 +91,7 @@ class Order extends Base
             $resp = store_region($location[1],$location[0],2,"store_id={$order['store_id']} and agent_id={$order['agent_id']}");
             foreach ($resp as $key=>$val) {
                 $resp[$key] = $val;
+                $resp[$key]['poi_id'] = (string) $val['poi_id'];
                 $resp[$key]['juli'] = format_money($val['juli']/1000);
             }
             $store = (new SaasStore)->where("store_id",$order['store_id'])->where("agent_id",$order['agent_id'])->findOrEmpty();
@@ -123,4 +128,76 @@ class Order extends Base
         }
     }
 
+
+    /**
+     * 订单列表
+     * @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);
+            $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
+                $query->field("out_id,product_name,product_img,product_price");
+            },'poi' => function ($query) {
+                $query->field("poi_id,poi_name,poi_address");
+            }])->findOrEmpty();
+            if ($order->isEmpty()) return error("订单数据异常");
+            if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
+            return successTrans("success.data",$order->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 订单列表
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "cancel",methods: "post")]
+    public function cancelOrder(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "order.require"  => "参数错误"
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $order = (new SaasOrder)->where("order_sn",$param['order'])->with(['goods' => function($query){
+                $query->field("out_id,product_name,product_img,product_price");
+            },'poi' => function ($query) {
+                $query->field("poi_id,poi_name,poi_address");
+            }])->findOrEmpty();
+            if ($order->isEmpty()) return error("订单数据异常");
+            if ($order['open_id'] <> $request->user['open_id']) return error("订单数据异常");
+            if (empty($order['certificate_id'])) {
+                $orderDetail = (new DouyinOrder)->config($this->getDyConfig())->token()->getOrderDetail([$order['order_id']]);
+                if (!isset($orderDetail['data']['certificate_info_list'][0]['certificate_id'])) return error("订单数据异常");
+                $order->certificate_id = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
+                $order['certificate_id'] = $orderDetail['data']['certificate_info_list'][0]['certificate_id'];
+            }
+            $resp = (new DouyinOrder)->config($this->getDyConfig())->token()->orderLock(1,$order['order_id'],$order['certificate_id'],$order['lock_key']);
+            if ($resp['err_no'] <> 0) return error("取消失败,请重试");
+            $order->status = 3;
+            $order->save();
+            (new SaasOrderLife)->where("order_id",$order['order_id'])->update(['status' => 1]);
+            (new SaasOrderLog)->insertGetId([
+                'order_id'  => $param['order'],
+                "title"     => "取消订单",
+                "remark"    => "用户取消核销信息"
+            ]);
+            return successTrans("success.data",$order->toArray());
+        } catch (\Throwable $throwable) {
+            echo $throwable->getLine()."\n";
+            echo $throwable->getFile()."\n";
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 30 - 0
app/controller/mini/Test.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\controller\mini;
+
+use app\extra\basic\Base;
+use app\extra\douyin\Account;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+
+
+#[Controller(prefix: "/test")]
+class Test extends Base
+{
+
+
+    #[Route(path: "index",methods: "get")]
+    public function setWhite(Request $request)
+    {
+        try {
+            $uuid = ["228287898988984"];
+            $resp = (new \app\extra\douyin\Order)->config($this->getDyConfig())->token()->getOrderDetail(['1090074972073628984']);
+            print_r($resp);
+            return success("ok");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 4 - 0
app/extra/basic/Base.php

@@ -28,6 +28,10 @@ class Base
         return $data['account_id'];
     }
 
+    protected function getDyConfig(): array
+    {
+        return ["appid" => sConf('dy.appid'),'secret' => sConf('dy.secret')];
+    }
 
     /**
      * 写入新用户

+ 26 - 0
app/extra/douyin/Account.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace app\extra\douyin;
+
+use yzh52521\EasyHttp\Http;
+use yzh52521\EasyHttp\Response;
+
+class Account extends Base
+{
+
+    /**
+     * 设置订单详情按钮白名单
+     */
+    public function setWhiteSetting(string $account = "",int $type = 1,bool $all = false,array $uuid = []): array
+    {
+        $param = [
+            "button_type"   => $type,
+            "open_all"      => $all,
+        ];
+        if (!$all) {
+            $param['uid_list'] = $uuid;
+        }
+        return Http::asJson()->withHeaders($this->header)->post($this->gateway."api/apps/trade/v2/toolkit/button_white_setting/", $param)->array();
+    }
+
+}

+ 43 - 0
app/extra/douyin/Order.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace app\extra\douyin;
+
+use app\extra\tools\CodeExtend;
+use yzh52521\EasyHttp\Http;
+
+class Order extends Base
+{
+
+    public function getOrderDetail(array $orderList = [])
+    {
+        $param = [
+            "order_id_list" => $orderList,
+        ];
+        return Http::asJson()->withHeaders($this->header)->post($this->gateway."api/apps/trade/v2/toolkit/query_certificate_info/", $param)->array();
+    }
+
+    /**
+     * 加锁、解锁
+     * @param int $state 1:解锁,2:加锁
+     * @return array
+     */
+    public function orderLock(int $state = 1,string $order_id = "",string $certificate_id = "",string $lock_key = "",string $start = "",string $end = ""): array
+    {
+        $param = [
+            "operation_type" => $state, // 1解锁,2加锁
+            "order_info_list" => [
+                [
+                    "certificate_info_list" => [
+                        [
+                            "certificate_id"=> $certificate_id
+                        ]
+                    ],
+                    "lock_key" => $lock_key,
+                    "order_id" => $order_id
+                ]
+            ]
+        ];
+        return Http::asJson()->withHeaders($this->header)->post($this->gateway."api/apps/trade/v2/toolkit/change_lock_status/",$param)->array();
+    }
+
+}

+ 33 - 0
app/extra/service/saas/AddressService.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace app\extra\service\saas;
+
+use app\extra\basic\Service;
+use app\model\saas\SaasAddress;
+
+class AddressService extends Service
+{
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getDataListMini(array $param = [])
+    {
+        $this->mode = new SaasAddress();
+        return $this->searchVal($param,$this->searchFilter($param))->paginate([
+            "list_rows" => $param['size'],
+            "page"      => $param['page']
+        ]);
+    }
+
+
+
+    protected function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['open_id']) && $filter[] = ["open_id", '=', $param['open_id']];
+        !empty($param['uuid']) && $filter[] = ["uuid", '=', $param['uuid']];
+        return $filter;
+    }
+
+}

+ 3 - 2
app/extra/service/saas/OrderService.php

@@ -13,7 +13,7 @@ class OrderService extends Service
     {
         $this->mode = new SaasOrder();
         return $this->searchVal($param,$this->searchFilter($param))->with(['goods' => function($query){
-            $query->field("product_name,product_id,image_list,actual_amount_once");
+            $query->field("out_id,product_name,product_img,product_price");
         }])->paginate([
             "list_rows" => $param['size'],
             "page"      => $param['page']
@@ -26,7 +26,8 @@ class OrderService extends Service
         $filter = [];
         !empty($param['agent']) && $filter[] = ["agent_id", '=', $param['shop']];
         !empty($param['open_id']) && $filter[] = ["open_id", '=', $param['open_id']];
-        !empty($param['status']) && $filter[] = ["status", '=', ($param['status']-1)];
+        !empty($param['statusLt']) && $filter[] = ["status", '=', ($param['statusLt']-1)];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
         !empty($param['order']) && $filter[] = ["order_sn", 'like', "%{$param['order']}%"];
         return $filter;
     }

+ 50 - 0
app/model/saas/SaasAddress.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $uuid 
+ * @property string $open_id 
+ * @property string $username 
+ * @property string $mobile 
+ * @property string $region 
+ * @property string $address 
+ * @property integer $is_default 
+ * @property mixed $create_at
+ */
+class SaasAddress 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_address";
+    
+    /**
+     * 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;
+
+
+}

+ 30 - 17
app/model/saas/SaasOrder.php

@@ -3,26 +3,27 @@
 namespace app\model\saas;
 
 use app\extra\basic\Model;
+use think\model\relation\HasOne;
 
 
 /**
- * @property integer $id (主键)
- * @property integer $uuid 
- * @property integer $agent_id 代理id
- * @property integer $store_id 店铺id
- * @property string $order_id 
- * @property integer $product_id 商品ID
- * @property string $product_name 
- * @property string $username 
- * @property string $code 
- * @property string $mobile 
- * @property string $region 
- * @property string $address 
- * @property integer $status 
- * @property string $express_id 顺丰订单id
- * @property integer $is_send 1已发送
- * @property integer $is_auto 1自动呼叫快递
- * @property string $remark 
+ * @property integer $id (主键)
+ * @property integer $uuid 
+ * @property integer $agent_id 代理id
+ * @property integer $store_id 店铺id
+ * @property string $order_id 
+ * @property integer $product_id 商品ID
+ * @property string $product_name 
+ * @property string $username 
+ * @property string $code 
+ * @property string $mobile 
+ * @property string $region 
+ * @property string $address 
+ * @property integer $status 
+ * @property string $express_id 顺丰订单id
+ * @property integer $is_send 1已发送
+ * @property integer $is_auto 1自动呼叫快递
+ * @property string $remark 
  * @property mixed $create_at
  */
 class SaasOrder extends Model
@@ -56,4 +57,16 @@ class SaasOrder extends Model
     public bool $timestamps = false;
 
 
+    public function goods(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasGoods",'out_id','product_id');
+    }
+
+
+    public function poi(): HasOne
+    {
+        return $this->hasOne("app\model\saas\SaasStoreShop",'poi_id','poi_id');
+    }
+
+
 }

+ 11 - 0
app/model/saas/SaasOrderLife.php

@@ -3,6 +3,7 @@
 namespace app\model\saas;
 
 use app\extra\basic\Model;
+use think\model\relation\HasOne;
 
 
 /**
@@ -69,4 +70,14 @@ class SaasOrderLife extends Model
         return format_money($data/100);
     }
 
+    public function store(): HasOne
+    {
+        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");
+    }
+
 }

+ 46 - 0
app/model/saas/SaasOrderLog.php

@@ -0,0 +1,46 @@
+<?php
+
+namespace app\model\saas;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property integer $order_id 
+ * @property string $title 
+ * @property string $remark 
+ * @property mixed $create_at
+ */
+class SaasOrderLog 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_order_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;
+
+
+}

+ 30 - 0
app/validate/saas/AddressValidate.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace app\validate\saas;
+
+use think\Validate;
+
+class AddressValidate extends Validate
+{
+
+    protected $rule = [
+        "open_id"   => "require",
+        "uuid"      => "require",
+        "username"  => "require",
+        "mobile"    => "require|mobile",
+        "region"    => "require",
+        "address"   => "require"
+    ];
+
+
+    protected $message = [
+        "open_id.require"   => "会员信息错误",
+        "uuid.require"      => "会员信息错误",
+        "username.require"  => "请输入姓名",
+        "mobile.require"    => "请输入手机号码",
+        "mobile.mobile"     => "手机号码格式错误",
+        "region.require"    => "请选择地区",
+        "address.require"   => "请输入详细地址",
+    ];
+
+}

+ 0 - 0
webman