Преглед изворни кода

Merge remote-tracking branch 'origin/master'

541469799@qq.com пре 1 година
родитељ
комит
1f5c0f3fd9

+ 11 - 0
app/api/controller/Order.php

@@ -31,11 +31,13 @@ use app\common\model\RefundCompensate;
 use app\common\model\OrderTj;
 use app\common\model\SmsRemind;
 use app\common\model\PushLog;
+use app\console\service\WxDelivery;
 use app\store\model\ChannelSaleVolumeTj;
 use app\store\model\user\CommerCountTj;
 use think\cache\driver\Redis;
 use app\common\model\member\MemberTj;
 use think\facade\Db;
+use think\facade\Log;
 
 /**
  * 我的订单控制器
@@ -685,4 +687,13 @@ class Order extends Controller
         return $this->renderSuccess(compact('data'));
     }
 
+    //用户将系统中已手动发货的订单录入到微信小程序发货系统
+    //20 * * * * webuser curl https://wxapp.rwgmlc.cn/api/order/wx_delivery_cron
+    public function wxDeliveryCron(){
+        Log::info('wxDeliveryCroning');
+        $wxDeliveryServ = new WxDelivery();
+        $wxDeliveryServ->pullOrderStatus(10001);
+        return $this->renderSuccess([]);
+    }
+
 }

Разлика између датотеке није приказан због своје велике величине
+ 17 - 0
app/api/controller/Test.php


+ 2 - 0
app/api/route/api.php

@@ -95,6 +95,8 @@ Route::post('member/receive', 'members.MemberService/receive');//领取开通礼
 Route::get('member/hx_welfare_detail', 'members.MemberService/hxWelfareDetail');//异业门店核销详情接口
 Route::post('member/hx_welfare', 'members.MemberService/hxWelfare');//核销异业门店核销
 
+Route::get('order/wx_delivery_cron', 'Order/wxDeliveryCron');//微信小程序发货系统
+
 
 
 

+ 1 - 1
app/common/model/Express.php

@@ -183,6 +183,6 @@ class Express extends BaseModel
     public static function getAllList()
     {
         // 查询列表数据
-        return self::field('express_id,express_name')->order(['sort', 'express_id'])->select()->toArray();
+        return self::field('express_id,express_name,wx_delivery_id')->order(['sort', 'express_id'])->select()->toArray();
     }
 }

+ 13 - 0
app/common/model/OrderAddress.php

@@ -62,4 +62,17 @@ class OrderAddress extends BaseModel
         return $this['region']['province'] . $this['region']['city'] . $this['region']['region'] . $this['detail'];
     }
 
+    public function findByOrderId($orderId)
+    {
+        if (empty($orderId))return null;
+        return $this->where('order_id', $orderId)->find();
+    }
+
+    public function batchByOrderIds($orderIds)
+    {
+        if (empty($orderIds))return null;
+        return $this->whereIn('order_id', $orderIds)->select()->toArray();
+    }
+
+
 }

+ 4 - 0
app/common/model/User.php

@@ -525,4 +525,8 @@ class User extends BaseModel
         return $lists->column('user_id');
     }
 
+    public static function getByUserIds($userIds = []){
+        return self::whereIn('user_id',$userIds)->field('user_id,open_id')->select()->toArray();
+    }
+
 }

+ 94 - 0
app/console/service/WxDelivery.php

@@ -0,0 +1,94 @@
+<?php
+// +----------------------------------------------------------------------
+// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
+// +----------------------------------------------------------------------
+// | Author: 萤火科技 <admin@yiovo.com>
+// +----------------------------------------------------------------------
+declare (strict_types=1);
+
+namespace app\console\service;
+
+use app\console\library\Tools;
+use app\common\service\BaseService;
+use app\store\model\Express as ExpressModel;
+use app\store\model\Order;
+use app\store\model\OrderAddressSimple;
+use app\store\model\OrderGoods;
+use app\store\model\User;
+use app\store\service\wxApi\WxOrderLogistics;
+use think\facade\Log;
+
+
+/**
+ * 服务类:每小时轮训已发货的订单录入到微信小程序发货后台
+ * Class WxDelivery
+ * @package app\console\service
+ */
+class WxDelivery extends BaseService
+{
+    /**
+     * 本系统内已人工发货的订单到微信那边发货
+     * @param int $storeId
+     * @return array|bool
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\DbException
+     * @throws \think\db\exception\ModelNotFoundException
+     */
+    public function pullOrderStatus(int $storeId)
+    {
+        // 获取店内员工的预计佣金
+        $orderGoodsModel = new OrderGoods();
+        $orderGoodses = $orderGoodsModel->getNeedToWxDelivery();
+        if (empty($orderGoodses)){
+            Log::info('pullOrderStatus:No need to mp delivery');
+            return true;
+        }
+        $orderIds = array_column($orderGoodses, 'order_id');
+        $orderModel = new Order();
+        $orders = $orderModel->getListByIds($orderIds);
+
+        $express = ExpressModel::getAllList();
+        $expressIndexById = array_column($express, null, 'express_id');
+
+        $orderAddressModel = new OrderAddressSimple();
+        $orderAddress = $orderAddressModel->batchByOrderIds($orderIds);
+        $orderAddressIndexByOrderId = array_column($orderAddress,'phone','order_id');
+
+        $userIds = array_column($orderGoodses, 'user_id');
+        $users = User::getByUserIds($userIds);
+        $userToOpenId = array_column($users, 'open_id', 'user_id');
+
+        // 遍历整理数据
+        foreach ($orderGoodses as $orderGoods) {
+            $res = WxOrderLogistics::getOrderStatusByTransId($orders[$orderGoods['order_id']]['transaction_id']);
+            //$res = ['errcode' => 0, 'errmsg' => 'ok', 'order' => ['order_state' => 1]];
+            if ($res['errcode'] == 0 && $res['errmsg'] == 'ok') {
+                if ($res['order']['order_state'] == 1) {//订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。
+                    //$orderAddress = $orderAddressModel->findByOrderId($orderGoods['order_id']);
+                    $a = WxOrderLogistics::orderDeliveryByTransId($orders[$orderGoods['order_id']]['transaction_id'],
+                        $expressIndexById[$orderGoods['express_id']]['wx_delivery_id'], $orderGoods['express_no'], $orderGoods['goods_name'], $userToOpenId[$orderGoods['user_id']], '', $orderAddressIndexByOrderId[$orderGoods['order_id']]);
+                    //$a = ['errcode' => 0, 'errmsg' => 'ok'];
+                    if ($a['errcode'] == 0 && $a['errmsg'] == 'ok') {
+                        OrderGoods::update(['wx_delivery_status' => 20], ['order_goods_id' => $orderGoods['order_goods_id']]);
+                    }
+                }
+
+            }else{
+                Log::info('order_goods:'.$orderGoods['order_goods_id'],['res' => $res]);
+            }
+        }
+        // 记录日志
+        Tools::taskLogs('WxDelivery', 'pullOrderStatus', [
+            'storeId' => $storeId,
+            'data' => ['order_ids'=>$orderIds]
+        ]);
+        return true;
+    }
+
+    //对于微信已发货的订单,如果订单状态是已签收,提醒确认收货,不提醒的话,默认十天订单结束
+
+}

+ 1 - 1
app/console/task/Order.php

@@ -48,7 +48,7 @@ class Order extends Task
         }
         ['storeId' => $this->storeId] = $param;
         $this->setInterval($this->storeId, $this->taskKey, $this->taskExpire, function () {
-            // echo $this->taskKey . PHP_EOL;
+            echo $this->taskKey . PHP_EOL;
             // 未支付订单自动关闭--待支付订单定时频率太快,单独拿出来处理-2021年11月2日 11:58:18
             // 已发货订单自动确认收货
             $this->receiveEvent();

+ 54 - 0
app/console/task/WxDelivery.php

@@ -0,0 +1,54 @@
+<?php
+// +----------------------------------------------------------------------
+// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
+// +----------------------------------------------------------------------
+// | Author: 萤火科技 <admin@yiovo.com>
+// +----------------------------------------------------------------------
+declare (strict_types = 1);
+
+namespace app\console\task;
+
+/**
+ * 定时获取微信订单状态
+ * Class WxDelivery
+ * @package app\console\task
+ */
+class WxDelivery extends Task
+{
+    // 当前任务唯一标识
+    private $taskKey = 'WxMpDelivery';
+
+    // 任务执行间隔时长 (单位:秒)
+    protected $taskExpire = 3600;
+
+    // 当前商城ID
+    private $storeId;
+
+    /**
+     * 任务处理
+     * @param array $param
+     */
+    public function handle(array $param)
+    {
+        ['storeId' => $this->storeId] = $param;
+        $this->setInterval($this->storeId, $this->taskKey, $this->taskExpire, function () {
+             echo $this->taskKey . PHP_EOL;
+            // 获取微信订单状态
+            $this->fetchWxOrderStatus();
+        });
+    }
+
+    /**
+     * 设置优惠券过期状态
+     */
+    private function fetchWxOrderStatus()
+    {
+        $service = new \app\console\service\WxDelivery();
+        $flag = $service->pullOrderStatus($this->storeId);
+
+    }
+}

+ 42 - 0
app/store/model/OrderAddressSimple.php

@@ -0,0 +1,42 @@
+<?php
+// +----------------------------------------------------------------------
+// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
+// +----------------------------------------------------------------------
+// | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
+// +----------------------------------------------------------------------
+// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
+// +----------------------------------------------------------------------
+// | Author: 萤火科技 <admin@yiovo.com>
+// +----------------------------------------------------------------------
+declare (strict_types = 1);
+
+namespace app\store\model;
+
+use app\common\model\BaseModel;
+
+/**
+ * 订单收货地址模型
+ * Class OrderAddress
+ * @package app\store\model
+ */
+class OrderAddressSimple extends BaseModel
+{
+    protected $name = 'order_address';
+
+    // 定义主键
+    protected $pk = 'order_address_id';
+
+    protected $updateTime = false;
+    public function findByOrderId($orderId)
+    {
+        if (empty($orderId))return null;
+        return $this->where('order_id', $orderId)->find()->toArray();
+    }
+
+    public function batchByOrderIds($orderIds)
+    {
+        if (empty($orderIds))return null;
+        return $this->whereIn('order_id', $orderIds)->select()->toArray();
+    }
+
+}

+ 8 - 0
app/store/model/OrderGoods.php

@@ -19,6 +19,7 @@ use app\common\enum\order\OrderStatus as OrderStatusEnum;
 use app\common\enum\order\PayStatus as PayStatusEnum;
 use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum;
 use app\common\library\helper;
+use app\common\library\wechat\WxPay;
 use app\common\model\OrderGoods as OrderGoodsModel;
 use app\store\model\Order as OrderModel;
 use app\store\model\OrderGoodsPackage as OrderGoodsPackageModel;
@@ -316,6 +317,13 @@ class OrderGoods extends OrderGoodsModel
         return $filter;
     }
 
+    //获取需要微信发货的订单商品,wx_delivery_status=10未微信发货,20已微信发货
+    public function getNeedToWxDelivery()
+    {
+        //return $this->where(['order_goods_id'=>91])->select()->toArray();
+        return $this->where(['delivery_status' => DeliveryStatusEnum::DELIVERED, 'receipt_status' => ReceiptStatusEnum::NOT_RECEIVED,'wx_delivery_status' => 10])->limit(50)->select()->toArray();
+    }
+
     /**
      * 获取待发货数量
      */

+ 207 - 0
app/store/service/wxApi/WxOrderLogistics.php

@@ -0,0 +1,207 @@
+<?php
+
+namespace app\store\service\wxApi;
+
+use app\common\service\BaseService;
+use app\common\service\MpWxService;
+use app\api\model\Wxapp as WxappModel;
+use think\facade\Log;
+
+/**
+ * 物流发货logic
+ * Class WxOrderLogistics
+ * @package app\store\service\wxApi
+ */
+class WxOrderLogistics extends BaseService
+{
+    /**
+     * 发货订单信息,如果发货物流公司是顺丰,必须保证有发件人和收件人信息,并且发件人收件人信息需要打掩码:`189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024
+     * @param $orderTransId
+     * @param $expressCompany
+     * @param $trackingNo
+     * @param $goodsDesc
+     * @param $payerOpenId
+     * @param $consignorContact
+     * @param $receiverContact
+     * @param $logisticsType 物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提
+     * @return object
+     */
+    public static function orderDeliveryByTransId($orderTransId, $expressCompany, $trackingNo, $goodsDesc, $payerOpenId, $consignorContact, $receiverContact, $logisticsType = 1)
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" . $accessToken;
+
+        //$params['access_token'] = $accessToken;
+        $params['order_key'] = [
+            'order_number_type' => 2,
+            'transaction_id' => $orderTransId,
+        ];
+        $params['logistics_type'] = $logisticsType;
+        $params['delivery_mode'] = 1;
+        $params['is_all_delivered'] = true;
+
+        $shippingInfo = [
+            'tracking_no' => $trackingNo,
+            'express_company' => $expressCompany,
+            'item_desc' => $goodsDesc,
+        ];
+
+        if ($consignorContact != null || $receiverContact != null) {
+            $shippingInfo['contact'] = [];
+            if ($consignorContact != null) {
+                $shippingInfo['contact']['consignor_contact'] = $consignorContact;
+            }
+
+            if ($receiverContact != null) {
+                $shippingInfo['contact']['receiver_contact'] = $receiverContact;
+            }
+        }
+
+        $params['shipping_list'] = [$shippingInfo];
+
+        $nowStr = date('Y-m-d H:i:s');
+        $data = explode(' ', $nowStr);
+        $params['upload_time'] = $data[0] . 'T' . $data[1] . '.000+08:00';
+        $params['payer'] = [
+            'openid' => $payerOpenId
+        ];
+        $paramsJson = json_encode($params);
+        Log::info('orderDeliveryByTransIdParams::' . $paramsJson);
+        $ret = curl_post($url, $paramsJson);
+        Log::info('orderDeliveryByTransId::' . $ret);
+        $arr = json_decode($ret,true);
+
+        return $arr;
+    }
+
+    /**
+     * 发货订单信息,如果发货物流公司是顺丰,必须保证有发件人和收件人信息,并且发件人收件人信息需要打掩码:`189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024
+     * @param $storeId
+     * @param $outTradeNo
+     * @param $expressCompany
+     * @param $trackingNo
+     * @param $goodsDesc
+     * @param $payerOpenId
+     * @param $consignorContact
+     * @param $receiverContact
+     * @return object
+     */
+    public static function orderDeliveryByOutTradeNo($storeId, $outTradeNo, $expressCompany, $trackingNo, $goodsDesc, $payerOpenId, $consignorContact, $receiverContact)
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = "https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=" . $accessToken;
+
+        $params['access_token'] = $accessToken;
+
+        $wxConfig = WxappModel::getWxappCache($storeId);
+
+        $params['order_key'] = [
+            'order_number_type' => 1,
+            'mchid' => $wxConfig['mchid'],
+            'out_trade_no' => $outTradeNo,
+        ];
+        $params['logistics_type'] = 1;
+        $params['delivery_mode'] = 1;
+        $params['is_all_delivered'] = true;
+
+        $shippingInfo = [
+            'tracking_no' => $trackingNo,
+            'express_company' => $expressCompany,
+            'item_desc' => $goodsDesc,
+        ];
+
+        if ($consignorContact != null || $receiverContact != null) {
+            $shippingInfo['contact'] = [];
+            if ($consignorContact != null) {
+                $shippingInfo['contact']['consignor_contact'] = $consignorContact;
+            }
+
+            if ($receiverContact != null) {
+                $shippingInfo['contact']['receiver_contact'] = $receiverContact;
+            }
+        }
+
+        $params['shipping_list'] = [$shippingInfo];
+
+        $nowStr = date('Y-m-d H:i:s');
+        $data = explode($nowStr, ' ');
+        $params['upload_time'] = $data[0] . 'T' . $data[1] . '.000+08:00';
+        $params['payer'] = [
+            'openid' => $payerOpenId
+        ];
+
+        $ret = curl_post($url, json_encode($params));
+        $arr = json_decode($ret, true);
+
+        return $arr;
+    }
+
+    /**
+     * 根据transId获得订单状态,状态字段:order_state:订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。
+     * @param $transId
+     * @return object
+     */
+    public static function getOrderStatusByTransId($transId)
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = "https://api.weixin.qq.com/wxa/sec/order/get_order?access_token=" . $accessToken;
+
+        //$params['access_token'] = $accessToken;
+
+        $params['transaction_id'] = $transId;
+
+        $ret = curl_post($url, json_encode($params));
+        $arr = json_decode($ret, true);
+
+        return $arr;
+    }
+
+    /**
+     * 根据outTradeNo获得订单状态,状态字段:order_state:订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。
+     * @param $storeId
+     * @param $outTradeNo
+     * @return object
+     */
+    public static function getOrderStatusByOutTradeNo($storeId, $outTradeNo)
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = "https://api.weixin.qq.com/wxa/sec/order/get_order?access_token=" . $accessToken;
+
+        $params['access_token'] = $accessToken;
+        $wxConfig = WxappModel::getWxappCache($storeId);
+        $params['merchant_id'] = $wxConfig['mchid'];
+        $params['merchant_trade_no'] = $outTradeNo;
+
+        $ret = curl_post($url, json_encode($params));
+        $arr = json_decode($ret);
+
+        return $arr;
+    }
+
+    public static function getDeliveryList()
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = 'https://api.weixin.qq.com/cgi-bin/express/delivery/open_msg/get_delivery_list?access_token=' . $accessToken;
+        //$params = [];
+        Log::info($url);
+        $ret = curl_post($url, '{}');
+        return json_decode($ret,true);
+    }
+
+    public static function isTradeManaged($storeId)
+    {
+        $weixinToken = MpWxService::weixinTokenCache();
+        $accessToken = $weixinToken['access_token'];
+        $url = 'https://api.weixin.qq.com/wxa/sec/order/is_trade_managed?access_token=' . $accessToken;
+        $wxConfig = WxappModel::getWxappCache($storeId);
+
+        $params = ['appid' => $wxConfig['app_id']];
+        $ret = curl_post($url, json_encode($params));
+        return json_decode($ret,true);
+    }
+}