orderBy('created_at', 'ASC') ->chunk(100, function ($logs) { foreach ($logs as $log) { if (preg_match('/^YSD/', $log->redemptionCode, $matches)) { $type = Coupon::TYPE_YSD; } else { $type = Coupon::TYPE_PINGAN; } $log->type = $type; $log->save(); } }); dd(); $count = TestLog::whereBetween('created_at', ['2020-11-10 11:06:40', '2020-11-11 10:42:26']) ->where('type', 'freezecoupon') ->where('back', '0') ->orderBy('created_at', 'ASC') ->count(); dump($count); // $list = TestLog::whereBetween('created_at', ['2020-11-10 11:06:40', '2020-11-11 10:42:26']) // ->where('type', 'freezecoupon') // ->where('back', '0') // ->orderBy('created_at', 'ASC') // ->get(); // //// $data = []; //// foreach ($list as $cou) { //// $data[] = $cou->in_source['jiemi']['redemptionCode']; //// } //// dump($data); if ($count > 1) { try { TestLog::whereBetween('created_at', ['2020-11-10 11:06:40', '2020-11-11 10:42:26']) ->where('type', 'freezecoupon') ->where('back', '0') ->orderBy('created_at', 'ASC') ->chunk(100, function ($logs) { $su = $er = []; foreach ($logs as $log) { $this->jiemi = $log->in_source['jiemi']; $this->user = User::where('outlet_id', $this->jiemi['outletId'])->first(); $this->getQuery(); if (is_string($this->queryData)) { $er[$this->jiemi['redemptionCode']] = $this->queryData; continue; } if ($this->jiemi['redemptionCode'] == '157922465040') { dump($this->jiemi); dump($this->ticket); dump($this->queryData); } $this->checkCode(); if (is_string($this->ticket)) { $er[$this->jiemi['redemptionCode']] = $this->ticket; $er[] = $this->jiemi['redemptionCode']; continue; } $status = isset($log->out_source['code']) ? 2 : 3; $exists = Coupon::where('status', $status) ->where('redemptionCode', $this->jiemi['redemptionCode'])->exists(); if ($exists && $status != 3) { $er[$this->jiemi['redemptionCode']] = [ $log->out_source, ]; continue; } $couponData = [ 'user_id' => $this->user->parent->id, 'type' => Coupon::TYPE_YSD, 'outletId' => $this->user->outlet_id, 'orderid' => '', 'PaOutletId' => $this->queryData['PaOutletId'], 'redemptionCode' => $this->jiemi['redemptionCode'], 'thirdPartyGoodsId' => $this->queryData['thirdPartyGoodsId'], 'couponName' => $this->queryData['couponName'], 'price' => $this->ticket['price'], 'total' => $this->jiemi['total'], 'profit' => $this->ticket['profit'], 'status' => $status, 'remark' => isset($log->out_source['code']) ? '核销成功!' : $log->out_source[0], 'startTime' => $this->queryData['startTime'], 'endTime' => $this->queryData['endTime'], 'created_at' => $log->created_at->format('Y-m-d H:i:s'), ]; // dump($this->jiemi); // dump($this->ticket); // dump($couponData); // dd($this->queryData); $coupon = Coupon::create($couponData); $coupon->profit(); $log->back = 1; $log->save(); } if (count($er) > 1) { dump($er); } }); } catch (\Exception $e) { dd($e->getMessage()); } } } public function getQuery() { if (preg_match('/^YSD/', $this->jiemi['redemptionCode'], $matches)) { $this->query_coupon = (new YsdQuery)->setOutletId($this->jiemi['outletId']) ->setCode($this->jiemi['redemptionCode']) ->start(); $this->type = 'ysd'; } else { $this->query_coupon = (new Query)->setOutletId($this->jiemi['outletId']) ->setCode($this->jiemi['redemptionCode']) ->start(); $this->type = 'pingan'; } if ($this->type == 'ysd') { return $this->getYsdPro(); } else { return $this->getPro(); } } public function getYsdPro() { $rule_code = $this->query_coupon->activity->rule->code; $code = $this->user->parent->code->where('code', $rule_code)->first(); if (!$code) { $this->queryData = "核销失败,您没有权限使用此卡券优惠活动。"; } $ticket = explode('-', $rule_code); if (!is_array($ticket) || count($ticket) != 3) { $this->queryData = "核销失败,卡券规则格式不正确"; } $full = $ticket[1]; //full100 $price = $ticket[2]; // preg_match('/(\d{3}(\.\d+)?)/is', $full, $match); preg_match('/\d+/', $full, $match); if (!is_array($match)) { $this->queryData = "核销失败,卡券规则格式不正确。"; } if (!is_numeric($this->jiemi['total'])) { $this->queryData = "核销失败,订单金额必须是数字"; } if ($match[0] > $this->jiemi['total']) { $this->queryData = '核销失败,订单金额不足。'; } $this->queryData = [ 'couponName' => $this->query_coupon->activity->title, 'thirdPartyGoodsId' => $rule_code, 'productId' => '', 'PaOutletId' => '', 'startTime' => $this->query_coupon->start_at->format('Y-m-d H:i:s'), 'endTime' => $this->query_coupon->end_at->format('Y-m-d H:i:s'), ]; return $this->ticket = [ 'total' => $match[0], 'price' => $price, 'profit' => $code->profit, ]; } public function getPro() { if (is_string($this->query_coupon)) { return $this->query_coupon; } $profitOfferItemVersion = $this->query_coupon['profitOfferItemVersion']; $productItemList = $this->query_coupon['productItemList']; if (!is_array($productItemList) || !is_array($productItemList[0])) { $this->queryData = '核销失败,平安券数据有误,可能是未配置网点。'; } //循环查找 $first = ''; foreach ($productItemList as $key => $item) { $productId = $item['productId']; $thirdPartyGoodsId = $item['thirdPartyGoodsId']; $outletList = $item['outletList']; if (!is_array($outletList) || !is_array($outletList[0])) { $this->queryData = '核销失败,网点信息有误!请检查平安券配置信息。'; break; } $outletList = collect($outletList); //判断是新版还是旧版 if ($profitOfferItemVersion) { //新版通过第三方查询 $first = $outletList->firstWhere('thirdOutletNo', $this->user->outlet_id); if ($first) { break; } } else { //旧版通过平安网点查询 $first = $outletList->firstWhere('outletNo', $this->user->PaOutletId); if ($first) { break; } } } if (!$first) { $this->queryData = '核销失败,未找到可用网点信息。'; } if (!$thirdPartyGoodsId) { $this->queryData = '核销失败,平安券编号规则有误。'; } if (!$productId) { $this->queryData = '核销失败,未查询到平安券商品id。'; } return $this->queryData = [ 'couponName' => $this->query_coupon['couponName'], 'thirdPartyGoodsId' => $thirdPartyGoodsId, 'productId' => $productId, 'PaOutletId' => $first['outletNo'], 'startTime' => $this->query_coupon['startTime'], 'endTime' => $this->query_coupon['endTime'], ]; } public function checkCode() { if ($this->type == 'ysd') { return $this->ticket; } $code = $this->user->parent->code->where('code', $this->queryData['thirdPartyGoodsId'])->first(); if (!$code) { $this->ticket = "核销失败,未找到此项平安券规则,请联系管理人员检查渠道配置。"; } $ticket = explode('-', $this->queryData['thirdPartyGoodsId']); if (!is_array($ticket) || count($ticket) != 3) { $this->ticket = "核销失败,平安券规则格式不正确。"; } $full = $ticket[1]; //full100 $price = $ticket[2]; preg_match('/\d+/', $full, $result); if (empty($result) || !is_array($result)) { $this->ticket = "核销失败,平安券规则格式不正确。"; } if (!is_numeric($this->jiemi['total'])) { $this->ticket = "核销失败,订单金额必须是数字"; } if ($result[0] > $this->jiemi['total']) { $this->ticket = '核销失败,订单金额不足,平安券不可使用。'; } $this->ticket = [ 'total' => $result[0], 'price' => $price, 'profit' => $code->profit, ]; return $this->ticket; } }