123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- <?php
- namespace App\Console\Commands;
- use App\Models\Meta;
- use BlockMatrix\EosRpc\ChainFactory;
- use BlockMatrix\EosRpc\EosRpc;
- use BlockMatrix\EosRpc\WalletFactory;
- use Carbon\Carbon;
- use GuzzleHttp\Client;
- use Illuminate\Console\Command;
- use Illuminate\Support\Facades\Log;
- use Illuminate\Support\Facades\Storage;
- use Org\Multilinguals\Apollo\Client\ApolloClient;
- use ZanySoft\Zip\Zip;
- class Trace extends Command
- {
- /**
- * The name and signature of the console command.
- *
- * @var string
- */
- protected $signature = 'trace';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = '自动打zip包,并进行上链操作';
- protected $save_dir = '';
- /**
- * Create a new command instance.
- *
- * @return void
- */
- public function __construct()
- {
- parent::__construct();
- $this->save_dir = '';
- }
- /**
- * Execute the console command.
- *
- * @return mixed
- */
- public function handle()
- {
- $this->line('-----------traceing---------');
- $metas = Meta::where('status', 0)->get();
- foreach ($metas as $meta) {
- $this->line('------开始:' . $meta['patch_num']);
- $this->save_dir = storage_path($meta['patch_num']);
- if (!is_dir($this->save_dir)) {
- mkdir($this->save_dir);
- }
- //1.生成txt
- $this->line('------开始生成txt:' . $meta['patch_num']);
- $myfile = fopen($this->save_dir . "/批次信息.txt", "w");
- $txt = "批次号:{$meta['patch_num']}\n";
- $txt .= "鸡种:{$meta['variety']}\n";
- $txt .= "年龄:{$meta['age']}\n";
- $txt .= "口粮:{$meta['food']}\n";
- $txt .= "水源:{$meta['water']}\n";
- fwrite($myfile, $txt);
- fclose($myfile);
- //2.生成质检信息
- $this->line('------开始生成质检信息:' . $meta['patch_num']);
- $myfile = fopen($this->save_dir . "/质检信息.html", "w");
- $txt = $meta['report'];
- fwrite($myfile, $txt);
- fclose($myfile);
- $this->line('------开始下载图片:' . $meta['patch_num']);
- $varietyImg = $this->downloadImg($this->save_dir, $meta['variety_img'], '鸡种');
- $foodImg = $this->downloadImg($this->save_dir, $meta['food_img'], '口粮');
- $waterImg = $this->downloadImg($this->save_dir, $meta['water_img'], '水源');
- $farms = \GuzzleHttp\json_decode($meta['farm'], true);
- foreach ($farms as $k => $v) {
- $farmImg = $this->downloadImg($this->save_dir, $v, '农场' . ($k + 1));
- }
- //生成zip包
- $this->line('------开始生成ZIP:' . $meta['patch_num']);
- $zipPath = storage_path() . '/' . $meta['patch_num'] . ".zip";
- $zip = Zip::create($zipPath);
- $zip->add($this->save_dir, true);
- $zip->close();
- $md5 = md5_file($zipPath);
- $this->line('------ZIP包MD5码:' . $md5);
- $zipUrl = '/trace/' . $meta['patch_num'] . ".zip";
- Storage::put($zipUrl, file_get_contents($zipPath));
- $data = [
- 'md5' => $md5,
- 'zip' => env('OSS_URL') . 'trace/' . $meta['patch_num'] . ".zip"
- ];
- $this->line('zip地址:' . env('OSS_URL') . 'trace/' . $meta['patch_num'] . ".zip");
- //$md5 = md5(time());
- $this->line('------开始上链:' . $md5);
- $i = 1;
- do {
- $row = $this->transcation($md5);
- if (!$row) {
- $this->line('------上链失败-继续重试:' . $i . var_export($row, true));
- $i++;
- sleep(10);
- }else{
- $this->line('------上链成功-结果:' . var_export($row, true));
- break;
- }
- } while ($i <= 3);
- if (isset($row['transaction_id']) && $row['transaction_id']) {
- $data['trans_id'] = $row['transaction_id'];
- $data['block_height'] = $row['block_num'];
- $data['block_time'] = date('Y-m-d H:i:s', strtotime($row['block_time']) + 8 * 3600)();
- $data['status'] = 1;
- } else {
- $data['status'] = 2;
- }
- Meta::where('patch_num', $meta['patch_num'])->update($data);
- }
- $this->line('-----------traceing-end--------');
- }
- //下载远程图片到服务器
- protected function downloadImg($path, $img, $name = '')
- {
- $client = new Client(['verify' => false]); //忽略SSL错误
- if ($name) {
- $path = $path . '/' . $name . '.jpg';
- } else {
- $path = $path . '/' . md5(time()) . '.jpg';
- }
- $response = $client->get($img, ['save_to' => $path]); //保存远程url到文件
- if ($response->getStatusCode() == 200) {
- return $path;
- }
- $this->line('下载' . $img . '失败');
- return false;
- }
- protected function transcation($md5)
- {
- try {
- $api = (new ChainFactory())->api(base_path());
- $walapi = (new WalletFactory())->api(base_path());
- $eos = (new EosRpc($api, $walapi));
- $accountA = "chxqsuyuanaa";
- $accountB = "chxqsuyuanbb";
- $coinCode = "EOS";
- $coin = "0.0001";//每次转多少
- $walletPassword = "PW5JbENyMrmYGc5LBMKGf2E6QaFoXSQZ6CDWMET7a6o6cXvy35qH1";
- $walletName = "caihongxingqiu";
- $eos->setWalletInfo($walletName, $walletPassword);
- $aliceBalance = json_decode($api->getCurrencyBalance('eosio.token', $accountA, $coinCode));
- $bobBalance = json_decode($api->getCurrencyBalance('eosio.token', $accountB, $coinCode));
- $balaceA = 0;
- $balaceB = 0;
- if (isset($aliceBalance[0])) {
- $balaceA = $aliceBalance[0];
- }
- if (isset($bobBalance[0])) {
- $balaceB = $bobBalance[0];
- }
- if (floatval($balaceA) < $coin || floatval($balaceB) < $coin) {
- $this->line("有个账号没钱了,快充钱");
- return false;
- }
- $this->line("准备发起交易");
- $rand = rand(0, 1);
- if ($rand == 0) {
- $trans = $eos->transfer($accountB, $accountA, $coin . " " . $coinCode, $md5, 'eosio.token', false);
- } elseif ($rand == 1) {
- $trans = $eos->transfer($accountA, $accountB, $coin . " " . $coinCode, $md5, 'eosio.token', false);
- }
- Log::debug('transinfo:' . \GuzzleHttp\json_encode($trans));
- return [
- 'transaction_id' => $trans['transaction_id'] ?? '',
- 'block_num' => $trans['processed']['block_num'] ?? 0,
- 'block_time' => $trans['processed']['block_time'] ?? ''
- ];
- } catch (\Exception $exception) {
- $this->line('上链失败:' . $exception->getMessage());
- return false;
- }
- }
- }
|