wesmiler 2 лет назад
Родитель
Сommit
ec23e9efdd

+ 3 - 1
app/Http/Controllers/Api/v1/MemberBankController.php

@@ -53,7 +53,9 @@ class MemberBankController extends webApp
      */
     public function save(BankValidator $validator)
     {
-        $params = $validator->check(request()->all(), 'save');
+        $type = request()->post('type',3);
+        $scene = $type ==3? 'bank' : 'qrcode';
+        $params = $validator->check(request()->all(), $scene);
         if(!is_array($params)){
             return showJson($params, false);
         }

+ 141 - 0
app/Http/Controllers/Api/v1/TradeController.php

@@ -0,0 +1,141 @@
+<?php
+
+namespace App\Http\Controllers\Api\v1;
+
+use App\Http\Controllers\Api\webApp;
+use App\Services\Api\TradeService;
+use App\Services\Api\VideoCollectService;
+use App\Services\Api\VideoService;
+use App\Services\RedisService;
+use Illuminate\Http\Request;
+
+/**
+ * 承兑商交易
+ * @package App\Http\Controllers\Api
+ */
+class TradeController extends webApp
+{
+
+    /**
+     * 订单
+     * @return array
+     */
+    public function index()
+    {
+       try {
+           $params = request()->post();
+           $pageSize = request()->post('pageSize', 0);
+           $userId = isset($params['user_id']) && $params['user_id']? $params['user_id'] : $this->userId;
+           $datas = TradeService::make()->getDataList($params, $pageSize,'', $this->userId);
+           return showJson(1010, true, $datas);
+       } catch (\Exception $exception){
+           RedisService::set("caches:request:error_trade_index", ['error'=>$exception->getMessage(),'trace'=>$exception->getTrace()], 7200);
+           return showJson(1018, false, ['error'=>env('APP_DEBUG')? $exception->getMessage() : '']);
+       }
+    }
+
+    /**
+     * 记录
+     * @return array
+     */
+    public function list()
+    {
+        try {
+            $params = request()->post();
+            $pageSize = request()->post('pageSize', 0);
+            $params['acceptor_uid'] = isset($params['user_id']) && $params['user_id']? $params['user_id'] : $this->userId;
+            $datas = TradeService::make()->getDataList($params, $pageSize,'', $this->userId);
+            return showJson(1010, true, $datas);
+        } catch (\Exception $exception){
+            RedisService::set("caches:request:error_trade_list", ['error'=>$exception->getMessage(),'trace'=>$exception->getTrace()], 7200);
+            return showJson(1018, false, ['error'=>env('APP_DEBUG')? $exception->getMessage() : '']);
+        }
+    }
+
+    /**
+     * 详情
+     * @return array
+     */
+    public function info()
+    {
+        $id = request()->post('id', 0);
+        $info = TradeService::make()->getInfo($id, $this->userId);
+        if($info){
+            return showJson(1010, true, $info);
+        }else{
+            return showJson(1009, false);
+        }
+
+    }
+
+
+    /**
+     * 卖出
+     * @return array
+     */
+    public function sell(Request $request)
+    {
+        $params = request()->all();
+        if(!$result = TradeService::make()->sell($this->userId, $params, $request)){
+            return showJson(VideoService::make()->getError(), false);
+        }else{
+            return showJson(VideoService::make()->getError(), true, $result);
+        }
+    }
+
+
+    /**
+     * 点赞
+     * @return array|mixed
+     */
+    public function like()
+    {
+        $params = request()->post();
+        if(!$result = VideoCollectService::make()->collect($this->userId, $params)){
+            return showJson(VideoCollectService::make()->getError(), false);
+        }else{
+            return showJson(VideoCollectService::make()->getError(), true, $result);
+        }
+    }
+
+    /**
+     * 收藏
+     * @return array|mixed
+     */
+    public function collect()
+    {
+        $params = request()->post();
+        if(!$result = VideoCollectService::make()->collect($this->userId, $params)){
+            return showJson(VideoCollectService::make()->getError(), false);
+        }else{
+            return showJson(VideoCollectService::make()->getError(), true, $result);
+        }
+    }
+
+    /**
+     * 状态
+     * @return array|mixed
+     */
+    public function status()
+    {
+        if(!$result = VideoService::make()->status()){
+            return showJson(VideoService::make()->getError(), false);
+        }else{
+            return showJson(VideoService::make()->getError(), true, $result);
+        }
+    }
+
+    /**
+     * 删除
+     * @return array|mixed
+     */
+    public function delete()
+    {
+        if(!$result = VideoService::make()->delete()){
+            return showJson(VideoService::make()->getError(), false);
+        }else{
+            return showJson(VideoService::make()->getError(), true);
+        }
+    }
+
+}

+ 52 - 0
app/Http/Validator/BankValidator.php

@@ -0,0 +1,52 @@
+<?php
+namespace App\Http\Validator;
+class BankValidator extends BaseValidator
+{
+    // 当前模型所有验证规则
+    public static $rules = [
+        'id' => 'required',
+        'realname' => 'required|max:20',
+        'bank_name' => 'required|max:30',
+        'bank_card' => 'required|max:30',
+        'type' => 'required',
+        'qrcode' => 'required',
+        'status' => 'required',
+    ];
+    public static $msgs = [
+        'required' => ':attribute不能为空',
+        'string' => ':attribute必须是字符串',
+        'min' => ':attribute长度不能小于:min位',
+        'max' => ':attribute长度不能大于:max位',
+        'exists' => ':attribute不存在',
+        'rule' => ':attribute格式不正确',
+        'mobile' => ':attribute格式不正确',
+    ];
+
+    // 当前模型所有验证字段
+    public static $fields = [
+        'id' => 'ID',
+        'type' => '账户类型',
+        'realname' => '收款人姓名',
+        'bank_name' => '账户名称',
+        'bank_card' => '银行卡号',
+        'qrcode' => '收款码',
+    ];
+
+    // 当前模型所有验证场景
+    public static $scenes = [
+        'bank'=> ['realname','bank_name','bank_card','type'],
+        'qrcode'=> ['realname','bank_name','qrcode','type'],
+        'del'=> ['id'],
+    ];
+
+    /**
+     * 验证
+     * @param $request
+     * @param string $scene
+     * @return int|mixed
+     */
+    public static function check($request, $scene=''){
+        $validator = new BaseValidator(self::$rules, self::$msgs, self::$fields, self::$scenes);
+        return $validator->checkParams($request, $scene);
+    }
+}

+ 12 - 1
app/Services/Api/MemberBankService.php

@@ -80,6 +80,7 @@ class MemberBankService extends BaseService
                 $item['bank_card_text'] = $item['bank_card'] ? format_bank_card($item['bank_card']) : '';
                 $item['name_text'] = $item['bank_name'] ? mb_substr($item['bank_name'],0,1,'utf-8') : '';
                 $item['icon'] = $item['bank_code'] ? get_image_url('/images/icons/banks/icon-'.$item['bank_code'].'.png') : '';
+                $item['qrcode'] = $item['qrcode'] ? get_image_url($item['qrcode']) : '';
             }
         }
 
@@ -104,7 +105,7 @@ class MemberBankService extends BaseService
         }
 
         $datas = $this->model->where(['user_id'=> $userId,'status'=> 1,'mark'=>1])
-            ->select(['id','realname','bank_name','bank_card','status'])
+            ->select(['id','realname','bank_name','bank_card','type','status'])
             ->get();
         $datas = $datas? $datas->toArrayu() :[];
         if($datas){
@@ -122,16 +123,26 @@ class MemberBankService extends BaseService
     public function saveData($userId, $params)
     {
         $id = isset($params['id']) ? $params['id'] : 0;
+        $isDefault = isset($params['is_default'])? $params['is_default'] : 2;
         $data = [
             'user_id'=> $userId,
             'realname'=> isset($params['realname'])? $params['realname'] : '',
+            'type'=> isset($params['type'])? intval($params['type']) : 3,
             'bank_name'=> isset($params['bank_name'])? $params['bank_name'] : '',
             'bank_card'=> isset($params['bank_card'])? $params['bank_card'] : '',
             'bank_code'=> isset($params['bank_code'])? $params['bank_code'] : '',
+            'qrcode'=> isset($params['qrcode']) && $params['qrcode']? get_image_path($params['qrcode']) : '',
+            'is_default'=> $isDefault,
             'status'=> isset($params['status'])? $params['status'] : 1,
             'update_time'=> time(),
             'mark'=> 1,
         ];
+
+        // 默认处理
+        if($isDefault == 1){
+            $this->model->where(['user_id'=> $userId,'mark'=>1])->update(['is_default'=>2,'update_time'=>time()]);
+        }
+
         if($id && $this->model->where(['id'=> $id])->value('id')){
             $this->model->where(['id'=> $id])->update($data);
             $this->error = $id? 1008 : 1027;

+ 306 - 0
app/Services/Api/TradeService.php

@@ -0,0 +1,306 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Services\Api;
+use App\Models\MemberModel;
+use App\Models\TradeModel;
+use App\Models\VideoCollectModel;
+use App\Models\VideoModel;
+use App\Services\BaseService;
+use App\Services\ConfigService;
+use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 承兑商交易管理-服务类
+ * @author laravel开发员
+ * @since 2020/11/11
+ * @package App\Services\Api
+ */
+class TradeService extends BaseService
+{
+    // 静态对象
+    protected static $instance = null;
+
+    /**
+     * 构造函数
+     * @author laravel开发员
+     * @since 2020/11/11
+     * GoodsService constructor.
+     */
+    public function __construct()
+    {
+        $this->model = new TradeModel();
+    }
+
+    /**
+     * 静态入口
+     * @return static|null
+     */
+    public static function make()
+    {
+        if (!self::$instance) {
+            self::$instance = (new static());
+        }
+        return self::$instance;
+    }
+
+    /**
+     * 列表数据
+     * @param $params
+     * @param int $pageSize
+     * @return array
+     */
+    public function getDataList($params, $pageSize = 18, $field = '', $userId=0)
+    {
+
+        $where = ['a.mark' => 1,'b.mark'=>1];
+        $field = $field? $field : 'lev_a.*';
+        $order = 'lev_a.id desc';
+        $list = $this->model->with(['member','acceptor'])->from('trade as a')
+            ->leftJoin('member as b', 'b.id', '=', 'a.user_id')
+            ->where($where)
+            ->where(function ($query) use ($params, $userId) {
+                $type = isset($params['type']) ? $params['type'] : 0;
+                if ($type > 0) {
+                    $query->where('a.type', $type);
+                }
+
+                $uid = isset($params['user_id']) ? $params['user_id'] : 0;
+                if ($uid > 0) {
+                    $query->where('a.user_id', $uid);
+                }
+
+                $appectorUid = isset($params['acceptor_uid']) ? $params['acceptor_uid'] : 0;
+                if ($appectorUid > 0) {
+                    $query->where('a.acceptor_uid', $appectorUid);
+                }
+
+                $appectorId = isset($params['acceptor_id']) ? $params['acceptor_id'] : 0;
+                if ($appectorId > 0) {
+                    $query->where('a.acceptor_id', $appectorId);
+                }
+            })
+            ->where(function ($query) use ($params) {
+                $keyword = isset($params['kw']) ? $params['kw'] : '';
+                if ($keyword) {
+                    $query->where('a.order_no', 'like', "%{$keyword}%")
+                        ->orWhere('b.nickname', 'like', "%{$keyword}%")
+                        ->orWhere('b.id', '=', "%{$keyword}%");
+                }
+            })
+            ->selectRaw($field)
+            ->orderByRaw($order)
+            ->paginate($pageSize > 0 ? $pageSize : 9999999);
+
+        $list = $list ? $list->toArray() : [];
+        if ($list && $list['data']) {
+            foreach ($list['data'] as &$item) {
+                $item['time_text'] = isset($item['create_time']) ? dateFormat($item['create_time'], 'Y-m-d H:i') : '';
+                $member = isset($item['member'])? $item['member'] : [];
+                if($member){
+                    $member['avatar'] = isset($member['avatar']) && $member['avatar']? get_image_url($member['avatar']) : get_image_url('/images/member/logo.png');
+                }
+                $item['member'] = $member;
+            }
+        }
+
+        return [
+            'pageSize' => $pageSize,
+            'total'    => isset($list['total']) ? $list['total'] : 0,
+            'list'     => isset($list['data']) ? $list['data'] : []
+        ];
+    }
+
+    /**
+     * 详情
+     * @param $id
+     * @return array
+     */
+    public function getInfo($id, $userId=0, $field=[])
+    {
+        $field = $field? $field : ['a.*'];
+        $info = $this->model->with(['member','acceptor'])->from('trade as a')
+            ->leftJoin('member as b','b.id','=','a.user_id')
+            ->where(['a.id'=> $id,'a.mark'=>1,'b.mark'=>1])
+            ->select($field)
+            ->first();
+
+        $info = $info? $info->toArray() : [];
+        if($info){
+            $member = isset($info['member'])? $info['member'] : [];
+            if($member){
+                $member['avatar'] = isset($member['avatar']) && $member['avatar']? get_image_url($member['avatar']) : get_image_url('/images/member/logo.png');
+            }
+            $info['member'] = $member;
+            $info['time_text'] = isset($info['create_time']) ? dateFormat($info['create_time'], 'Y-m-d H:i') : '';
+        }
+
+        return $info;
+    }
+
+    /**
+     * 卖出
+     * @param $goodsId
+     * @return bool
+     */
+    public function sell($userId, $params, $request)
+    {
+        $goodsId = isset($params['goods_id'])? intval($params['goods_id']) : 0;
+        $type = isset($params['type'])? intval($params['type']) : 2;
+        $userInfo = MemberModel::where(['id'=> $userId,'mark'=>1])
+            ->select(['id','nickname','status'])
+            ->first();
+        $status = isset($userInfo['status'])? $userInfo['status'] : 0;
+        $nickname = isset($userInfo['nickname'])? $userInfo['nickname'] : '';
+        if(empty($userInfo) || $status != 1){
+            $this->error = 2017;
+            return false;
+        }
+
+        $thumb = isset($params['thumb'])? trim($params['thumb']) : '';
+        if($thumb){
+            $result = upload_base64($thumb);
+            $thumb = isset($result['file_path'])? $result['file_path'] : '';
+            if(empty($thumb)){
+                $this->error = 2208;
+                return false;
+            }
+        }
+        // 音乐
+        $musicUrl = isset($params['music_url'])? trim($params['music_url']) : '';
+        if($musicUrl){
+            $result = upload_remote_image($musicUrl,'mp3','music');
+            $musicUrl = isset($result['file_path'])? $result['file_path'] : '';
+            if(empty($musicUrl)){
+                $this->error = 2209;
+                return false;
+            }
+        }
+
+        // 视频
+        $fileUrl = isset($params['file_url'])? trim($params['file_url']) : '';
+        $albums = isset($params['album_urls'])?json_decode( $params['album_urls'],true) : [];
+        if($type == 1) {
+            if($fileUrl){
+                $result = upload_video($request,'video');
+                $data = isset($result['data'])? $result['data'] : [];
+                $fileUrl = isset($data['file_path'])? $data['file_path'] : '';
+                if(empty($fileUrl)){
+                    $this->error = 2212;
+                    return false;
+                }
+            }else{
+                $this->error = 2213;
+                return false;
+            }
+        }
+
+        // 相册
+        else if($type == 2){
+            if(empty($albums) || !is_array($albums)){
+                $this->error = 2211;
+                return false;
+            }
+
+            $albums = get_format_images($albums);
+        }
+
+        $title = isset($params['title']) && $params['title']? trim($params['title']) : "{$nickname} 发布的短视频";
+        $description = isset($params['description']) && $params['description']? trim($params['description']) : "{$nickname} 发布的短视频";
+        $publishCheck = ConfigService::make()->getConfigByCode('video_publish_check',0);
+        $publishCheck = $publishCheck>0? $publishCheck : 0;
+        $tags = isset($params['tags']) && $params['tags']? $params['tags'] : '';
+        $data = [
+            'user_id'  => $userId,
+            'title'  => $title,
+            'type'  => $type,
+            'description'  => $description,
+            'tags'  =>  $tags && is_array($tags)? implode(',', $tags) : $tags,
+            'file_url'  => $fileUrl,
+            'thumb'  => $thumb,
+            'albums'  => $albums? $albums : '',
+            'music_hash'  => isset($params['music_hash'])? trim($params['music_hash']) : '',
+            'music_name'  => isset($params['music_name'])? trim($params['music_name']) : '',
+            'music_url'  => $musicUrl,
+            'goods_id'  => $goodsId,
+            'visible_type'  => isset($params['visible_type'])? intval($params['visible_type']) : 1,
+            'is_comment'  => isset($params['is_comment'])? intval($params['is_comment']) : 1,
+            'status'  => $publishCheck? 1 : 2,
+            'mark'  => 1,
+            'publish_at' => date('Y-m-d H:i:s'),
+            'create_time' => time(),
+        ];
+        RedisService::set('caches:videos:publish', ['params'=> $params,'data'=> $data], 600);
+        if($id = $this->model->insertGetId($data)){
+            $this->error = 1023;
+            // 发布视频任务处理
+            TaskService::make()->updateTask($userId,5, $id);
+            return ['id'=> $id];
+        }
+
+        $this->error = 1024;
+        return false;
+    }
+
+    /**
+     * 状态设置
+     * @return bool
+     */
+    public function status()
+    {
+        $id = request()->post('id', 0);
+        $status = request()->post('status', 1);
+        if ($id && !$this->model->where(['id' => $id, 'mark' => 1])->value('id')) {
+            $this->error = 2981;
+            return false;
+        }
+
+        if($this->model->where(['id'=> $id,'mark'=>1])->update(['status'=>$status, 'update_time'=> time()])){
+            $this->error = 1002;
+            return true;
+        }
+
+        $this->error = 1003;
+        return true;
+    }
+
+    /**
+     * 删除
+     * @return bool
+     */
+    public function delete()
+    {
+        // 参数
+        $param = request()->all();
+        $id   = getter($param, "id");
+        if (empty($id)) {
+            $this->error = 2014;
+            return false;
+        }
+
+        if(!$this->model->where(['id'=> $id])->value('id')){
+            $this->error = 1039;
+            return false;
+        }
+
+
+        if($this->model->where(['id'=> $id])->update(['mark'=>0,'update_time'=>time()])){
+            $this->model->where(['mark'=> 0])->where('update_time','<=', time() - 3 * 86400)->delete();
+            $this->error = 1025;
+            return true;
+        }else{
+            $this->error = 1026;
+            return false;
+        }
+    }
+
+}

+ 23 - 0
routes/api.php

@@ -125,6 +125,29 @@ Route::prefix('v1')->group(function(){
     Route::post('/message/setting', [\App\Http\Controllers\Api\v1\MessageController::class, 'setSetting']);
     Route::post('/message/getSetting', [\App\Http\Controllers\Api\v1\MessageController::class, 'getSetting']);
 
+    // 承兑商
+    Route::match(['get','post'],'/acceptor/index', [\App\Http\Controllers\Api\v1\AcceptorController::class, 'index']);
+    Route::match(['get','post'],'/acceptor/info', [\App\Http\Controllers\Api\v1\AcceptorController::class, 'info']);
+
+    // 承兑商交易
+    Route::match(['get','post'],'/trade/sell', [\App\Http\Controllers\Api\v1\TradeController::class, 'sell']);
+    Route::match(['get','post'],'/trade/pay', [\App\Http\Controllers\Api\v1\TradeController::class, 'pay']);
+    Route::match(['get','post'],'/trade/complete', [\App\Http\Controllers\Api\v1\TradeController::class, 'complete']);
+    Route::match(['get','post'],'/trade/exception', [\App\Http\Controllers\Api\v1\TradeController::class, 'exception']);
+    Route::match(['get','post'],'/trade/cancel', [\App\Http\Controllers\Api\v1\TradeController::class, 'cancel']);
+    Route::match(['get','post'],'/trade/index', [\App\Http\Controllers\Api\v1\TradeController::class, 'index']);
+    Route::match(['get','post'],'/trade/info', [\App\Http\Controllers\Api\v1\TradeController::class, 'info']);
+
+    // 银行卡
+    Route::post('/bank/index', [\App\Http\Controllers\Api\v1\MemberBankController::class, 'index']);
+    Route::post('/bank/list', [\App\Http\Controllers\Api\v1\MemberBankController::class, 'list']);
+    Route::post('/bank/options', [\App\Http\Controllers\Api\v1\MemberBankController::class, 'options']);
+    Route::post('/bank/save', [\App\Http\Controllers\Api\v1\MemberBankController::class, 'save']);
+
+
+    // 文章
+    Route::match(['get','post'],'/article/index', [\App\Http\Controllers\Api\v1\ArticleController::class, 'index']);
+    Route::match(['get','post'],'/article/info', [\App\Http\Controllers\Api\v1\ArticleController::class, 'info']);
 
 });