Files
stemcell/app/code/Stemcell/Customer/Controller/Avatr/Post.php
T
2026-09-15 10:26:34 +08:00

175 lines
7.3 KiB
PHP

<?php
namespace Stemcell\Customer\Controller\Avatr;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Framework\Exception\FileSystemException;
use Magento\Framework\Exception\LocalizedException;
use Magento\MediaStorage\Model\File\UploaderFactory;
use Magento\Framework\Filesystem;
use Magento\Framework\Message\ManagerInterface as MessageManagerInterface;
use Stemcell\Customer\Api\AvatrRepositoryInterface;
use Stemcell\Customer\Helper\Avatr as AvatrHelper;
use Stemcell\Customer\Helper\CarSeriesClueFactory;
use Stemcell\Customer\Model\AvatrFactory;
use Stemcell\Customer\Helper\Avatr\Transformers as TransformersHelper;
class Post implements HttpPostActionInterface
{
private \Magento\Framework\App\Request\Http $request;
private UploaderFactory $fileUploader;
private \Magento\Framework\Filesystem\Directory\WriteInterface $filesystem;
private RedirectFactory $redirectFactory;
private \Magento\Framework\File\Csv $csv;
private AvatrFactory $avatrFactory;
private AvatrRepositoryInterface $avatrRepository;
private AvatrHelper $avatrHelper;
private MessageManagerInterface $messageManager;
private TransformersHelper $transformersHelper;
//正式环境,默认测试环境
protected array $config = [
'media_id' => 6110,
'media_name' => 'SHANGHAILIQI',
'ak' => 6110,
'sk' => 'OvsbfYqDXcqr',
'aes_key' => 'oEr4HdIIouvveWL0Jjk74tA8Cf3fkaqQ',
'aes_iv' => 'WUPXlZGkfu7yo4gi',
'host' => 'https://sl-api-amstp.avatr.com'
];
private CarSeriesClueFactory $clueHelperFactory;
/**
* @throws FileSystemException
*/
public function __construct(
\Magento\Framework\App\Request\Http $request,
UploaderFactory $fileUploader,
Filesystem $filesystem,
RedirectFactory $redirectFactory,
\Magento\Framework\File\Csv $csv,
AvatrFactory $avatrFactory,
AvatrRepositoryInterface $avatrRepository,
AvatrHelper $avatrHelper,
TransformersHelper $transformersHelper,
MessageManagerInterface $messageManager,
CarSeriesClueFactory $clueHelperFactory
) {
$this->request = $request;
$this->fileUploader = $fileUploader;
$this->redirectFactory = $redirectFactory;
$this->csv = $csv;
$this->avatrFactory = $avatrFactory;
$this->avatrRepository = $avatrRepository;
$this->avatrHelper = $avatrHelper;
$this->transformersHelper = $transformersHelper;
$this->messageManager = $messageManager;
$this->clueHelperFactory = $clueHelperFactory;
$this->filesystem = $filesystem->getDirectoryWrite(DirectoryList::VAR_IMPORT_EXPORT);
}
private function encode(array $data)
{
foreach ($data as $key=>$val){
$data[$key] = mb_convert_encoding($val, 'UTF-8', ['gb2312', 'gbk']);
}
return $data;
}
/**
* 注意:上传的csv第三个列一定要是意向车型
* @return \Magento\Framework\App\ResponseInterface|\Magento\Framework\Controller\Result\Redirect|\Magento\Framework\Controller\ResultInterface
*/
public function execute()
{
ini_set('max_execution_time', -1);
set_time_limit(0);
$file = $this->request->getFiles('avatr');
/* @var $logger \Psr\Log\LoggerInterface */
$logger = \Magento\Framework\App\ObjectManager::getInstance()->get(\Psr\Log\LoggerInterface::class);
if (file_exists($file['tmp_name'])) {
$this->csv->setDelimiter(",");
$index = 1;
$rawData=[];
try {
$failRow = [];
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx();
$reader->setReadDataOnly(true);
$workSheet = $reader->load($file['tmp_name'])->getSheet(0);
$count = 0;
foreach ($workSheet->toArray() as $row => $item) {
if ($row > 0 && !empty($item[2])){
$rawData = $item;
$index = $row;
// not count the empty row
$count++;
$env = $this->request->getParam('env');
$clueHelper = $this->clueHelperFactory->create($item[2], $env=='dev');
try {
$rowData = $clueHelper->transform($item);
$item = array_combine(
['name', 'telephone', 'favorite_vehicle', 'province_id', 'city_id'],
$rowData
);
$avatr = $this->avatrRepository->getByTelephone($item['telephone'], $item['favorite_vehicle']);
if (!$avatr->getId()) {
$avatr = $this->avatrFactory->create();
}
foreach ($item as $key=>$value) {
$avatr->setData($key, $value);
}
$avatr = $this->avatrRepository->save($avatr);
$clueHelper->setClue($avatr)->post();
$avatr->setIsSent(0);
if ($clueHelper->isSuccess()) {
$avatr->setIsSent(1);
} else {
$failRow[] = $row;
}
$requestLog = [
'response' => $clueHelper->getResponse(),
'request' => $clueHelper->getRequestData()
];
$avatr->setResponse(json_encode($requestLog, JSON_UNESCAPED_UNICODE));
$this->avatrRepository->save($avatr);
} catch (LocalizedException $e) {
$failRow[] = $row;
// echo '第'.$row.'行数据发送异常, 原因:'.$e->getMessage().'<br/>';
$this->messageManager->addErrorMessage('第'.$row.'行数据发送异常, 原因:'.$e->getMessage());
}
}
}
$this->messageManager->addSuccessMessage(
'总共: '.($count).' 条数据, '
.$count-count($failRow).' 条数据发送成功, '.count($failRow).' 条数据发送失败 '
);
if (count($failRow)) {
$this->messageManager->addErrorMessage('第'.implode('、', $failRow).'行数据发送失败');
}
} catch (\Exception $e) {
// echo '数据发送失败, 原因:'.$e->getMessage().'<br/>';
$this->messageManager->addErrorMessage(sprintf('第%d条数据发送失败', $index).', '.$e->getMessage());
$logger->alert('详细信息: '.$e->getMessage(), $e->getTrace());
$logger->alert(sprintf('第%d条数据发送失败', $index), $rawData);
}
}
return $this->redirectFactory->create()->setPath('*/*/');
}
}