AssetDeviceJob.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. namespace App\Jobs;
  3. use App\Model\Asset;
  4. use App\Model\AssetTemp;
  5. use App\Service\InOutOptionService;
  6. use Illuminate\Bus\Queueable;
  7. use Illuminate\Contracts\Queue\ShouldQueue;
  8. use Illuminate\Foundation\Bus\Dispatchable;
  9. use Illuminate\Queue\InteractsWithQueue;
  10. use Illuminate\Queue\SerializesModels;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Redis;
  13. use Symfony\Component\Console\Output\ConsoleOutput;
  14. use Symfony\Component\Console\Output\OutputInterface;
  15. class AssetDeviceJob implements ShouldQueue
  16. {
  17. use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
  18. protected $data;
  19. public $timeout = 1800;
  20. /**
  21. * Create a new job instance
  22. *
  23. * @return void
  24. */
  25. public function __construct($data)
  26. {
  27. $this->data = $data;
  28. }
  29. /**
  30. * Execute the job.
  31. *
  32. * @return void
  33. */
  34. public function handle()
  35. {
  36. try{
  37. DB::beginTransaction();
  38. $this->settle();
  39. DB::commit();
  40. //输出信息 测试
  41. $this->echoMessage(new ConsoleOutput());
  42. }catch (\Exception $exception){
  43. DB::rollBack();
  44. file_put_contents('record_error.txt',date("Y-m-d H:i:s",time()).json_encode($this->data) . PHP_EOL.$exception->getMessage()."line" . $exception->getLine().PHP_EOL,8);
  45. }
  46. }
  47. public function settle(){
  48. $data = $this->data;
  49. if(empty($data)){
  50. file_put_contents('record_data.txt',date("Y-m-d H:i:s",time())."原数据:".json_encode($data).PHP_EOL,8);
  51. return;
  52. }
  53. if(empty($data['assetOas'])) {
  54. file_put_contents('record_data.txt',date("Y-m-d H:i:s",time())."数据结构错误".PHP_EOL,8);
  55. return;
  56. }
  57. //内存设置
  58. ini_set('memory_limit', -1);
  59. //软删除
  60. $time = time();
  61. Asset::where('del_time',0)
  62. ->where('crt_time','<', strtotime(date('Y-m-d 00:00:00')))
  63. ->update(['del_time' => $time]);
  64. $this->assetTempInsert();
  65. echo 'TEMP OVER-------------------'. PHP_EOL;;
  66. $this->assetInsert();
  67. echo 'OVER-------------------';
  68. AssetTemp::truncate();
  69. }
  70. //临时表数据插入
  71. public function assetTempInsert(){
  72. $data = $this->data;
  73. $batchSize = 100;
  74. $totalAssets = count($data['assetOas']);
  75. for ($i = 0; $i < $totalAssets; $i += $batchSize) {
  76. $batch = array_slice($data['assetOas'], $i, $batchSize);
  77. $insert = [];
  78. // 对每个批次的数据进行处理
  79. foreach ($batch as $value) {
  80. if(empty($value['singleCode'])) continue;
  81. $insert[] = [
  82. "assetCode" => $value['assetCode'] ?? "",
  83. "assetNo" => $value['assetNo'] ?? "",
  84. "assetType" => $value['assetType'] ?? "",
  85. "brand" => $value['brand'] ?? "",
  86. "expectedLife" => $value['expectedLife'] ?? "",
  87. "gs1" => $value['gs1'] ?? "",
  88. "isKey" => $value['isKey'] ?? "",
  89. "kind" => $value['kind'] ?? "",
  90. "located" => $value['located'] ?? "",
  91. "name" => $value['name'] ?? "",
  92. "nextCalibrationTime" => $value['nextCalibrationTime'] ?? "",
  93. "originalValue" => $value['originalValue'] ?? "",
  94. "purchaseTime" => $value['purchaseTime'] ?? "",
  95. "remark" => $value['remark'] ?? "",
  96. "singleCode" => $value['singleCode'] ?? "",
  97. "startUseDate" => $value['startUseDate'] ?? "",
  98. "type" => $value['type'] ?? "",
  99. "useDept" => $value['useDept'] ?? "",
  100. "userName" => $value['userName'] ?? "",
  101. "version" => $value['version'] ?? "",
  102. ];
  103. }
  104. // 在处理完每个批次后,进行一些内存清理操作
  105. unset($batch);
  106. if(! empty($insert)) {
  107. echo "insert Temp " . PHP_EOL;
  108. AssetTemp::insert($insert);
  109. }
  110. }
  111. }
  112. //正式数据插入或更新
  113. public function assetInsert(){
  114. DB::table('asset_temp')
  115. ->select('*')
  116. ->orderBy('id','desc')
  117. ->chunk(500,function ($data){
  118. $data_array = $data->toArray();
  119. $time = time();
  120. $update = $insert = [];
  121. foreach ($data_array as $value){
  122. $bool = Asset::where('singleCode',$value->singleCode)->exists();
  123. if($bool){
  124. $update[] = [
  125. "assetCode" => $value->assetCode ?? "",
  126. "assetNo" => $value->assetNo ?? "",
  127. "assetType" => $value->assetType ?? "",
  128. "brand" => $value->brand ?? "",
  129. "expectedLife" => $value->expectedLife ?? "",
  130. "gs1" => $value->gs1 ?? "",
  131. "isKey" => $value->isKey ?? "",
  132. "kind" => $value->kind ?? "",
  133. "located" => $value->located ?? "",
  134. "name" => $value->name ?? "",
  135. "nextCalibrationTime" => $value->nextCalibrationTime ?? "",
  136. "originalValue" => $value->originalValue ?? "",
  137. "purchaseTime" => $value->purchaseTime ?? "",
  138. "remark" => $value->remark ?? "",
  139. "singleCode" => $value->singleCode ?? "",
  140. "startUseDate" => $value->startUseDate ?? "",
  141. "type" => $value->type ?? "",
  142. "useDept" => $value->useDept ?? "",
  143. "userName" => $value->userName ?? "",
  144. "version" => $value->version ?? "",
  145. "del_time" => 0,
  146. ];
  147. }else{
  148. $insert[] = [
  149. "assetCode" => $value->assetCode ?? "",
  150. "assetNo" => $value->assetNo ?? "",
  151. "assetType" => $value->assetType ?? "",
  152. "brand" => $value->brand ?? "",
  153. "expectedLife" => $value->expectedLife ?? "",
  154. "gs1" => $value->gs1 ?? "",
  155. "isKey" => $value->isKey ?? "",
  156. "kind" => $value->kind ?? "",
  157. "located" => $value->located ?? "",
  158. "name" => $value->name ?? "",
  159. "nextCalibrationTime" => $value->nextCalibrationTime ?? "",
  160. "originalValue" => $value->originalValue ?? "",
  161. "purchaseTime" => $value->purchaseTime ?? "",
  162. "remark" => $value->remark ?? "",
  163. "singleCode" => $value->singleCode ?? "",
  164. "startUseDate" => $value->startUseDate ?? "",
  165. "type" => $value->type ?? "",
  166. "useDept" => $value->useDept ?? "",
  167. "userName" => $value->userName ?? "",
  168. "version" => $value->version ?? "",
  169. "crt_time" => $time,
  170. ];
  171. }
  172. }
  173. if(! empty($update)){
  174. foreach ($update as $value){
  175. Asset::where('singleCode',$value['singleCode'])->update($value);
  176. }
  177. }
  178. if(! empty($insert)) Asset::insert($insert);
  179. echo "insert OR update ing" . PHP_EOL;
  180. });
  181. }
  182. protected function echoMessage(OutputInterface $output)
  183. {
  184. $output->writeln($this->data);
  185. }
  186. }