ImportOrder.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace app\queue\redis\slow;
  3. use app\model\saas\SaasChatMsg;
  4. use app\model\saas\SaasOrder;
  5. use app\model\saas\SaasOrderExpress;
  6. use app\model\system\SystemImport;
  7. use app\model\system\SystemUser;
  8. use PhpOffice\PhpSpreadsheet\Cell\DataType;
  9. use PhpOffice\PhpSpreadsheet\IOFactory;
  10. use Webman\RedisQueue\Consumer;
  11. class ImportOrder implements Consumer
  12. {
  13. /**
  14. * 订单导入发货
  15. * 更新云打印件
  16. * @var string
  17. */
  18. public string $queue = "import-order";
  19. /**
  20. * 连接配置
  21. * @var string
  22. */
  23. public string $connection = "default";
  24. public function consume($data): bool
  25. {
  26. try {
  27. if(empty($data['logId'])) return true;
  28. if(empty($data['poi_id'])) return true;
  29. $path = public_path().$data['path'];
  30. $spreadsheet = IOFactory::load($path);
  31. $worksheet = $spreadsheet->getActiveSheet();
  32. $sheetData = $worksheet->toArray(null, true, true, true);
  33. // 5. 现在 $sheetData 就是一个二维数组,你可以遍历它处理每一行数据
  34. $orderMode = (new SaasOrder);
  35. $excelData= [];
  36. $expressData = [];
  37. foreach ($sheetData as $rowIndex => $row) {
  38. if ($rowIndex > 0 && !empty($row['A']) && !empty($row['C'])) {
  39. $excelData[$rowIndex] = $row;
  40. }
  41. }
  42. $successData = $errData = [];
  43. if (!empty($excelData)) {
  44. foreach (array_values(array_filter($excelData)) as $key=>$val) {
  45. if (!empty(trim($val['C'])) && !empty(trim($val['A']))) {
  46. $order = $orderMode->where("out_order_no",trim($val['A']))->findOrEmpty();
  47. if ($order->isEmpty()) {
  48. continue;
  49. }
  50. $order->express_status = 2;
  51. $order->save();
  52. $express = (new SaasOrderExpress)->where("express_sn",trim($val['C']))->findOrEmpty();
  53. if ($express->isEmpty()) {
  54. // 发送一条发货消息给用户
  55. $lastMsg = (new SaasChatMsg)->where(['openid' => $order['openid'],'poi_id' => $order['poi_id']])->order("id desc")->findOrEmpty();
  56. if ($lastMsg->isEmpty()) {
  57. $serviceUser = (new SystemUser)->where(['store_id' => $order['poi_id'],"type" => 3])->order("last_msg_at","asc")->findOrEmpty();
  58. $lastServiceId = $serviceUser['id'];
  59. } else {
  60. $lastServiceId = $lastMsg['service_id'];
  61. }
  62. $expressName = "";
  63. if (isset($val['D'])) {
  64. $expressName = "({$val['D']})";
  65. }
  66. (new SaasChatMsg)->insertGetId([
  67. 'openid' => $order['openid'],
  68. 'poi_id' => $order['poi_id'],
  69. "source" => 2,
  70. "service_id" => $lastServiceId,
  71. "msgId" => md5($order['openid'].time()),
  72. "content" => "您的订单({$val['A']})预计3日内到你手中,快递单号:{$val['C']} {$expressName}",
  73. "type" => "text"
  74. ]);
  75. $expressData[$key] = [
  76. 'openid' => $order['openid'],
  77. "order_sn" => trim($val['A']),
  78. "express_sn" => trim($val['C']),
  79. "mobile" => trim($val['B']),
  80. "express_name" => $val['D']?trim($val['D']):'',
  81. "last_at" => getDateFull()
  82. ];
  83. $successData[$key] = trim($val['A']);
  84. } else {
  85. $errData[$key] = trim($val['A']);
  86. }
  87. } else {
  88. $errData[$key] = trim($val['A']);
  89. }
  90. }
  91. }
  92. if (!empty($expressData)) {
  93. (new SaasOrderExpress)->insertAll(array_values($expressData));
  94. }
  95. print_r($successData);
  96. print_r($errData);
  97. (new SystemImport)->where("id",$data['logId'])->update([
  98. 'status' => 1,
  99. "last_at" => getDateFull(),
  100. 'success_num' => (!empty($successData)) ? count(array_values($successData)) : 0,
  101. 'success_data' => (!empty($successData)) ? json_encode(array_values($successData)) : [],
  102. 'error_num' => (!empty($errData)) ? count(array_values($errData)) : 0,
  103. 'error_data' => (!empty($errData)) ? json_encode(array_values($errData)) : [],
  104. ]);
  105. return true;
  106. } catch (\Throwable $throwable) {
  107. echo getDateFull()."==导入订单报错===\n";
  108. echo $throwable->getFile()."\n";
  109. echo $throwable->getLine()."\n";
  110. echo $throwable->getMessage()."\n";
  111. }
  112. return true;
  113. }
  114. }