whitefang 1 год назад
Родитель
Сommit
4b25dffa3a

+ 26 - 0
app/command/query_add_agreement.php

@@ -0,0 +1,26 @@
+<?php
+declare (strict_types = 1);
+
+namespace app\command;
+
+use think\console\Command;
+use think\console\Input;
+use think\console\input\Argument;
+use think\console\input\Option;
+use think\console\Output;
+
+class query_add_agreement extends Command
+{
+    protected function configure()
+    {
+        // 指令配置
+        $this->setName('query_add_agreement')
+            ->setDescription('the query_add_agreement command');
+    }
+
+    protected function execute(Input $input, Output $output)
+    {
+        // 指令输出
+        $output->writeln('query_add_agreement');
+    }
+}

+ 94 - 0
app/common/command/AddAgreementPdf.php

@@ -0,0 +1,94 @@
+<?php
+namespace app\common\command;
+
+use app\common\model\master_worker\MasterWorkerAgree;
+use PhpAmqpLib\Connection\AMQPStreamConnection;
+use PhpAmqpLib\Message\AMQPMessage;
+use PhpAmqpLib\Wire\AMQPTable;
+use think\console\Command;
+use think\console\Input;
+use think\console\Output;
+use think\facade\Config;
+use think\facade\Log;
+
+
+/**
+ * mq生成PDF协议队列
+ * Class AddAgreementPdf
+ * @package app\command
+ */
+class AddAgreementPdf extends Command
+{
+    protected function configure()
+    {
+        $this->setName('query_add_agreement')
+            ->setDescription('mq生成PDF协议队列');
+    }
+
+    protected function execute(Input $input, Output $output)
+    {
+        $mq_config = Config::get('mq');
+        // 连接到RabbitMQ服务
+        $connection = new AMQPStreamConnection($mq_config['host'], $mq_config['port'], $mq_config['username'], $mq_config['password'], $mq_config['vhost']);
+        $channel = $connection->channel();
+        $channel->exchange_declare('add_agreement','topic',true,true,true,false,false);
+
+        // 声明队列
+        $queue = 'add_agreement';
+        $channel->queue_declare($queue, true, true, false, true,false);
+
+        //接收消息
+        $callback = function($msg) {
+            $param = json_decode($msg->body, true);
+            self::addPdf($param);
+        };
+        $channel->basic_consume('add_agreement', '', false, true, false, false, $callback);
+        while(count($channel->callbacks)) {
+            $channel->wait();
+        }
+        $channel->close();
+        $connection->close();
+    }
+
+    public static function addPdf($param)
+    {
+        $code = $param['code'];
+        $url = $param['url'];
+        $pdf = '/'.$code.'.pdf';
+        $path = 'uploads/agreement_pdf/'.date('Ymd');
+        if(!file_exists('./'.$path)){
+            mkdir ('./public/'.$path,0777,true);
+        }
+        $shell_ = 'wkhtmltopdf --page-height 297mm '.$url.' '.'public/'.$path.$pdf;
+        shell_exec($shell_);
+        $agreement = MasterWorkerAgree::where('code', $code)->findOrEmpty();
+        $agreement->pdf_url = $path.$pdf;
+        $agreement->save();
+    }
+
+
+    public static function sendMq($code,$url):bool
+    {
+        $mq_config = Config::get('mq');
+        // 连接到RabbitMQ服务
+        $connection = new AMQPStreamConnection($mq_config['host'], $mq_config['port'], $mq_config['username'], $mq_config['password'], $mq_config['vhost']);
+        $channel = $connection->channel();
+        $channel->exchange_declare('add_agreement','topic',true,true,true,false,false);
+
+        // 声明队列
+        $queue = 'add_agreement';
+        $channel->queue_declare($queue, true, true, false, true,false);
+
+        // 发送消息
+        $data = [
+            'code'=>$code,
+            'url'=>$url
+        ];
+        $messageBody = json_encode($data,JSON_UNESCAPED_UNICODE);
+        $message = new AMQPMessage($messageBody);
+        $channel->basic_publish($message, '', $queue);
+        $channel->close();
+        $connection->close();
+        return true;
+    }
+}

+ 50 - 0
app/common/service/UploadService.php

@@ -230,6 +230,56 @@ class UploadService
         }
         }
     }
     }
 
 
+    public static function base64Image($cid, $base64_image, string $saveDir = 'uploads/signs')
+    {
+        try {
+            // 提取Base64数据,去掉"data:image/png;base64,"前缀
+            $base64_image_content = explode(',', $base64_image)[1];
+            // 解码Base64数据
+            $binary_data = base64_decode($base64_image_content);
+            // 指定保存到本地的文件名和路径
+            $file_name = 'sign'.time().rand(1000, 9999).".png";
+            $file_path = $saveDir.'/'.date('Ymd').'/'.$file_name;
+            $dir_name = dirname($file_path); // 获取目录路径
+            if (!is_dir($dir_name)) {
+                if (mkdir($dir_name, 0755, true)) {
+                } else {
+                    throw new \think\Exception("无法创建目录");
+                }
+            }
+
+            // 将二进制数据写入文件
+            if (!file_put_contents($file_path, $binary_data)) {
+                throw new \think\Exception('签名上传失败');
+            }
+
+            // 4、写入数据库中
+            $file = File::create([
+                'cid'         => $cid,
+                'type'        => FileEnum::IMAGE_TYPE,
+                'name'        => $file_name,
+                'uri'         => $file_path,
+                'source_id'   => 0,
+                'create_time' => time(),
+            ]);
+
+            // 5、返回结果
+            return [
+                'id'   => $file['id'],
+                'cid'  => $file['cid'],
+                'type' => $file['type'],
+                'name' => $file['name'],
+                'uri'  => FileService::getFileUrl($file['uri']),
+                'url'  => $file['uri']
+            ];
+
+            //
+
+        } catch (Exception $e) {
+            throw new Exception($e->getMessage());
+        }
+    }
+
     /**
     /**
      * @notes 上传地址
      * @notes 上传地址
      * @param $saveDir
      * @param $saveDir

+ 1 - 1
app/index/controller/AgreementController.php

@@ -10,7 +10,7 @@ use think\facade\View;
 class AgreementController extends BaseController
 class AgreementController extends BaseController
 {
 {
     //
     //
-    public function master_service()
+    public function index()
     {
     {
         $code = $this->request->param('code');
         $code = $this->request->param('code');
         if(empty($code)){
         if(empty($code)){

+ 18 - 0
app/workerapi/controller/MasterWorkerAgreeController.php

@@ -3,6 +3,7 @@
 namespace app\workerapi\controller;
 namespace app\workerapi\controller;
 
 
 use app\workerapi\logic\MasterWorkerAgreeLogic;
 use app\workerapi\logic\MasterWorkerAgreeLogic;
+use app\workerapi\validate\MasterWorkerAgreeValidate;
 
 
 class MasterWorkerAgreeController extends BaseApiController
 class MasterWorkerAgreeController extends BaseApiController
 {
 {
@@ -45,4 +46,21 @@ class MasterWorkerAgreeController extends BaseApiController
         return $this->data($result);
         return $this->data($result);
     }
     }
 
 
+    /**
+     * 协议签名
+     * @return \think\response\Json
+     */
+    public function agreeSign()
+    {
+        $params = (new MasterWorkerAgreeValidate())->post()->goCheck('sign', [
+            'user_id' => $this->userId,
+            'user_info' => $this->userInfo
+        ]);
+        $result = MasterWorkerAgreeLogic::sign($params);
+        if (false === $result) {
+            return $this->fail(MasterWorkerAgreeLogic::getError());
+        }
+        return $this->success('签名成功', [], 1, 1);
+    }
+
 }
 }

+ 41 - 0
app/workerapi/logic/MasterWorkerAgreeLogic.php

@@ -1,7 +1,12 @@
 <?php
 <?php
 namespace app\workerapi\logic;
 namespace app\workerapi\logic;
+use app\common\command\AddAgreementPdf;
 use app\common\logic\BaseLogic;
 use app\common\logic\BaseLogic;
+use app\common\model\master_worker\MasterWorkerAgree;
 use app\common\service\ConfigService;
 use app\common\service\ConfigService;
+use app\common\service\UploadService;
+use think\Exception;
+use think\facade\Db;
 
 
 class MasterWorkerAgreeLogic extends BaseLogic
 class MasterWorkerAgreeLogic extends BaseLogic
 {
 {
@@ -12,4 +17,40 @@ class MasterWorkerAgreeLogic extends BaseLogic
             'content' => ConfigService::get('master_agreement', $type . '_content', ''),
             'content' => ConfigService::get('master_agreement', $type . '_content', ''),
         ];
         ];
     }
     }
+
+    /**
+     *
+     * @param $params
+     * @return bool|void
+     */
+    public static function sign($params)
+    {
+        Db::startTrans();
+        try {
+            //查询协议
+            $agree = MasterWorkerAgree::where(['code'=>$params['code']])->findOrEmpty();
+            if($agree->isEmpty()){
+                throw new Exception('协议不存在');
+            }
+            if($agree->sign_status==1){
+                throw new Exception('请勿重复签名');
+            }
+            //保存签名
+            $result = UploadService::base64Image(4, $params['sign']);
+            $sign = $result['url'];
+            $agree->sign = $sign;
+            $agree->sign_status = 1;
+            $agree->sign_time = time();
+            $agree->save();
+
+            //pdf队列发送
+            AddAgreementPdf::sendMq($agree->code,'https://'.$_SERVER['SERVER_NAME'].'/index/agreement/index'.'?code='.$agree->code);
+            Db::commit();
+            return true;
+        } catch (\Exception $e) {
+            Db::rollback();
+            self::setError($e->getMessage());
+            return false;
+        }
+    }
 }
 }

+ 14 - 0
app/workerapi/validate/MasterWorkerAgreeValidate.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace app\workerapi\validate;
+use app\common\validate\BaseValidate;
+class MasterWorkerAgreeValidate extends BaseValidate
+{
+    protected $rule = [
+        'sign' => 'require',
+    ];
+
+    protected $message = [
+        'sign.require' => '签名',
+    ];
+}

+ 2 - 1
composer.json

@@ -34,7 +34,8 @@
         "rmccue/requests": "^2.0",
         "rmccue/requests": "^2.0",
         "w7corp/easywechat": "^6.8",
         "w7corp/easywechat": "^6.8",
         "tencentcloud/sms": "^3.0",
         "tencentcloud/sms": "^3.0",
-        "alipaysdk/easysdk": "^2.2"
+        "alipaysdk/easysdk": "^2.2",
+        "php-amqplib/php-amqplib": "^3.7"
     },
     },
     "require-dev": {
     "require-dev": {
         "symfony/var-dumper": ">=4.2",
         "symfony/var-dumper": ">=4.2",

+ 2 - 0
config/console.php

@@ -9,5 +9,7 @@ return [
         'crontab' => 'app\common\command\Crontab',
         'crontab' => 'app\common\command\Crontab',
         // 退款查询
         // 退款查询
         'query_refund' => 'app\common\command\QueryRefund',
         'query_refund' => 'app\common\command\QueryRefund',
+        // mq队列任务
+        'query_add_agreement' => 'app\common\command\AddAgreementPdf',
     ],
     ],
 ];
 ];

+ 13 - 0
config/mq.php

@@ -0,0 +1,13 @@
+<?php
+return [
+    'driver' => 'rabbitmq',
+    'host' => env('mq.queue_rabbitmq_host', 'localhost'),
+    'port' => env('mq.queue_rabbitmq_port', 5672),
+    'username' => env('mq.queue_rabbitmq_username', 'guest'),
+    'password' => env('mq.queue_rabbitmq_password', 'guest'),
+    'vhost' => env('mq.queue_rabbitmq_vhost', '/'),
+    'consumer' => [
+        'batch_size' => 2, // 每次消费的消息数量
+        'timeout' => 0, // 长轮询超时时间,0表示无超时
+    ],
+];