CollectEquipmentExecute.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Servers\Aliyun\Oss;
  4. use App\Models\CollectEquipment as Model;
  5. use App\Models\CollectTask;
  6. use App\Models\CollectTaskAllocate;
  7. use App\Models\CollectEquipmentAccount;
  8. use App\Models\CollectTaskRecord;
  9. use Illuminate\Support\Facades\Log;
  10. use Illuminate\Support\Facades\DB;
  11. class CollectEquipmentExecute extends Api
  12. {
  13. private const HEARTBEAT_CACHE_PREFIX = 'collect:equipment:heartbeat:';
  14. private const HEARTBEAT_DEFAULT_TTL = 180;
  15. private function heartbeatCacheKey($collectEquipmentId)
  16. {
  17. return self::HEARTBEAT_CACHE_PREFIX.$collectEquipmentId;
  18. }
  19. /**
  20. * 执行结果上报
  21. *
  22. * */
  23. public function result_report(Model $Model, CollectTaskAllocate $CollectTaskAllocate, CollectTaskRecord $CollectTaskRecord){
  24. // 接受参数
  25. $collectTaskAllocateId = request('collect_task_allocate_id','');
  26. $status = request('status','');
  27. $finishStatus = request('finish_status',0);
  28. $realCount = request('real_count','');
  29. $startTime = request('start_time','');
  30. $endTime = request('end_time','');
  31. $startPage = request('start_page','');
  32. $endPage = request('end_page','');
  33. $remark = request('remark','');
  34. $equipment_account_id = request('equipment_account_id','');
  35. $allocateInfo = CollectTaskAllocate::query()->where([['id','=',$collectTaskAllocateId]])->first();
  36. if (!$allocateInfo){
  37. return json_send(['code'=>'error','msg'=>'执行任务ID参数错误']);
  38. }
  39. if($status == 2){
  40. //修改任务状态
  41. $res = CollectTaskAllocate::query()->where([['id','=',$collectTaskAllocateId]])->update(['status'=>$status]);
  42. if (!$res){
  43. return json_send(['code'=>'error','msg'=>'修改任务状态失败']);
  44. }
  45. } else {
  46. //修改设备占用状态
  47. $res = $Model->edit($allocateInfo['collect_equipment_id'],['task_status'=>0]);
  48. if (!$res){
  49. return json_send(['code'=>'error','msg'=>'修改设备占用状态失败']);
  50. }
  51. cache()->forget($this->heartbeatCacheKey($allocateInfo['collect_equipment_id']));
  52. //修改任务状态
  53. $res = CollectTaskAllocate::query()->where([['id','=',$collectTaskAllocateId]])->update(['status'=>$status]);
  54. if (!$res){
  55. return json_send(['code'=>'error','msg'=>'修改任务状态失败']);
  56. }
  57. if ($finishStatus){
  58. //查询设备ids
  59. $equipmentIds = CollectTaskAllocate::query()->where([
  60. ['collect_task_id','=',$allocateInfo['collect_task_id']],
  61. ['id','><',$collectTaskAllocateId],
  62. ['status','=',1]
  63. ])->pluck('collect_equipment_id')->toArray();
  64. //更新子任状态为弃用
  65. $allocateIds = CollectTaskAllocate::query()->where([
  66. ['collect_task_id','=',$allocateInfo['collect_task_id']],
  67. ['status','=',1]
  68. ])->pluck('id')->toArray();
  69. if ($allocateIds){
  70. $res = CollectTaskAllocate::query()->where([
  71. ['collect_task_id','=',$allocateInfo['collect_task_id']],
  72. ['status','=',1]
  73. ])->update(['status'=>6]);
  74. if (!$res){
  75. return json_send(['code'=>'error','msg'=>'修改子任务状态未弃用失败']);
  76. }
  77. }
  78. $res = CollectTask::query()->where([['id','=',$allocateInfo['collect_task_id']]])->update(['allocate_status'=>2,'status'=>2]);
  79. if (!$res){
  80. return json_send(['code'=>'error','msg'=>'修改总任务状态失败']);
  81. }
  82. if ($equipmentIds){
  83. //更新设备状态为空闲
  84. $res = $Model::query()->whereIn('id',$equipmentIds)->update(['task_status'=>0]);
  85. if (!$res){
  86. return json_send(['code'=>'error','msg'=>'修改设备状态失败']);
  87. }
  88. foreach ($equipmentIds as $equipmentId){
  89. cache()->forget($this->heartbeatCacheKey($equipmentId));
  90. }
  91. }
  92. }
  93. //添加任务执行记录
  94. $data = [
  95. 'collect_task_id' => $allocateInfo['collect_task_id'],
  96. 'collect_equipment_id' => $allocateInfo['collect_equipment_id'],
  97. 'platform' => $allocateInfo['platform'],
  98. 'product_name' => $allocateInfo['product_name'],
  99. 'product_specs' => $allocateInfo['product_specs'],
  100. 'minimum_order_quantity' => $allocateInfo['minimum_order_quantity'],
  101. 'start_time' => $startTime,
  102. 'end_time' => $endTime,
  103. 'start_page' => $startPage,
  104. 'end_page' => $endPage,
  105. 'real_count' => $realCount,
  106. 'status' => ($status == 3) ? 2 : 1,
  107. 'count' => $allocateInfo['count'],
  108. 'remark' => $remark,
  109. ];
  110. $res = $CollectTaskRecord->add($data);
  111. if (!$res){
  112. return json_send(['code'=>'error','msg'=>'添加任务执行记录失败']);
  113. }
  114. }
  115. if ($status == 4){
  116. $CollectEquipmentAccount = new CollectEquipmentAccount();
  117. //修改设备账号状态
  118. $res = $CollectEquipmentAccount::query()->where([['id','=',$allocateInfo['equipment_account_id']]])->update(['status'=>1]);
  119. if (!$res){
  120. return json_send(['code'=>'error','msg'=>'修改设备账号状态失败']);
  121. }
  122. }
  123. return json_send(['code'=>'success','msg'=>'成功','data'=>[]]);
  124. }
  125. /**
  126. * 设备心跳上报
  127. *
  128. * */
  129. public function heartbeat(Model $Model)
  130. {
  131. $collectEquipmentId = (int)request('collect_equipment_id',0);
  132. if (!$collectEquipmentId){
  133. return json_send(['code'=>'error','msg'=>'设备ID参数错误']);
  134. }
  135. $equipment = $Model->query()
  136. ->where('id','=',$collectEquipmentId)
  137. ->select('id','task_status')
  138. ->first();
  139. if (!$equipment){
  140. return json_send(['code'=>'error','msg'=>'设备不存在']);
  141. }
  142. if ((int)$equipment['task_status'] !== 1){
  143. return json_send(['code'=>'success','msg'=>'设备当前未执行任务','data'=>[]]);
  144. }
  145. $ttl = (int)request('ttl',self::HEARTBEAT_DEFAULT_TTL);
  146. if ($ttl < 60){
  147. $ttl = 60;
  148. }
  149. if ($ttl > 3600){
  150. $ttl = 3600;
  151. }
  152. $now = time();
  153. cache()->put($this->heartbeatCacheKey($collectEquipmentId),$now,$ttl);
  154. return json_send(['code'=>'success','msg'=>'心跳上报成功','data'=>['heartbeat_time'=>$now]]);
  155. }
  156. }