UpdateDrugReportService.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Servers;
  3. use App\Models\DrugReportAss;
  4. use App\Servers\Aliyun\Oss;
  5. use App\Servers\QueryDrugReportService;
  6. use Carbon\Carbon;
  7. use App\Facades\Servers\Logs\Log;
  8. use GuzzleHttp\Client;
  9. class UpdateDrugReportService
  10. {
  11. public function syncDrugReport(string $startTime, string $endTime = '', int $page = 1, int $pageSize = 20)
  12. {
  13. $total = 0;
  14. $count = 0;
  15. $time = time();
  16. $QueryDrugReportService = new QueryDrugReportService();
  17. $DrugReportAss = new DrugReportAss();
  18. do {
  19. try {
  20. // 分批次拉取数据
  21. $data = $QueryDrugReportService->querydrugreportass($startTime, $endTime, $page, $pageSize);
  22. sleep(1);
  23. $count = $data['total_num'];
  24. $data = $data['data'];
  25. if (empty($data)) {
  26. break;
  27. }
  28. var_dump($startTime, $endTime, $page);
  29. foreach ($data as $item){
  30. $info = $DrugReportAss->where([
  31. 'batch_no' => $item['produce_batch_no'],
  32. 'drug_id' => $item['drug_id'],
  33. 'bill_detail_id' => $item['bill_detail_id'],
  34. 'bill_id' => $item['bill_id'],
  35. ])->first();
  36. if (!$info){
  37. continue;
  38. }
  39. if ( (int)$item['drug_report_sign_status'] != $info['drug_report_sign_status']){
  40. $updateData = [
  41. 'drug_report_sign_status'=>$item['drug_report_sign_status'],
  42. 'seal_status'=>$item['seal_status'],
  43. 'update_time'=>$time
  44. ];
  45. if(!$info['seal_report_url']){
  46. if (!empty($item['sealed_report_url'])) {
  47. $fileName = $item['physic_name'] . '_' . str_replace('/', '', $item['pkg_spec']) . '_' . $item['produce_batch_no'];
  48. $fileName = uniqid($fileName.'_').'.pdf';
  49. try {
  50. //上传报告pdf到oss
  51. $Oss = new Oss();
  52. $client = new Client(); // GuzzleHttp的客户端实例
  53. $response = $client->get($item['sealed_report_url']); // 下载文件
  54. $body = $response->getBody(); // 获取响应体
  55. $content = (string)$body; // 转换为字符串内容
  56. // 上传文件到OSS
  57. $ossPath = 'path/' . date('Y') . '/' . date('m') . '/' . $fileName;
  58. $res = $Oss->putObject($ossPath, $content);
  59. $updateData['seal_report_url'] = $res;
  60. $updateData['report_name'] = $fileName;
  61. } catch (\Throwable $th) {
  62. var_dump('上传oss报表失败:' . $th->getMessage());
  63. Log::error('syncDrug/oss', '上传oss报表失败:' . $th->getMessage(), $item);
  64. }
  65. }
  66. }
  67. $res = $DrugReportAss->where([
  68. 'batch_no' => $item['produce_batch_no'],
  69. 'drug_id' => $item['drug_id'],
  70. 'bill_detail_id' => $item['bill_detail_id'],
  71. 'bill_id' => $item['bill_id'],
  72. ])->update($updateData);
  73. if (!$res){
  74. var_dump('更新单据失败:'.$res);
  75. Log::info('update-drug-report-ass','更新单据失败', ['res'=>$res,'item'=>$item]);
  76. }else{
  77. Log::info('update-drug-report-ass','更新成功', ['res'=>$res,'data'=>$updateData]);
  78. $total++;
  79. }
  80. }
  81. }
  82. // 检查是否还有更多数据
  83. if (count($data) <> $pageSize) {
  84. break;
  85. }
  86. $page++;
  87. sleep(1);
  88. } catch (\Exception $e) {
  89. var_dump($e->getMessage());
  90. Log::info('update-drug-report-ass','更新单据错误', ['err'=>$e->getMessage()]);
  91. break;
  92. }
  93. } while (true);
  94. return ['total' => $total, 'count' => $count];
  95. }
  96. }