<?php
namespace App\Module\Goods;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DealZip
{
public $uploadName;
public $exportName;
public function uploadFile($request, $savePath)
{
$this->uploadName = time() . rand(1, 10000);
$savePath = $savePath . $this->uploadName;
if (!$request->hasFile('file')) {
return ['status' => 0, 'msg' => '缺少文件'];
}
$file = $request->file('file');
if (!$file->isValid()) {
return ['status' => 0, 'msg' => '上传出错'];
}
$extension = $file->getClientOriginalExtension();
if ($extension != 'zip') {
return ['status' => 0, 'msg' => '上传格式错误'];
}
$saveName = 'upload.' . $extension;
$target = $file->move($savePath, $saveName);
if ($target) {
return ['status' => 1, 'msg' => '上传成功'];
} else {
return ['status' => 0, 'msg' => '上传失败'];
}
}
function extractZipToFile($zipName, $dir)
{
$zip = new \ZipArchive;
if ($zip->open($this->transcoding($zipName)) === TRUE) {
if (!is_dir($this->transcoding($dir))) mkdir($this->transcoding($dir), 0775, true);
$num = $zip->numFiles;
$dirArr = [];
$fileArr = [];
for ($i = 0; $i < $num; $i++) {
$statInfo = $zip->statIndex($i);
$item = [
'statInfo' => $statInfo,
'key' => $i,
];
if ($statInfo['crc'] == 0) {
$dirArr[$statInfo['name']] = $item;
} else {
$fileArr[$statInfo['name']] = $item;
}
}
ksort($dirArr, SORT_STRING);
ksort($fileArr, SORT_STRING);
$create = array_merge($dirArr, $fileArr);
foreach ($create as $value) {
$statInfo = $value['statInfo'];
$filename = $this->transcoding($statInfo['name']);
if ($statInfo['crc'] == 0) {
if (!is_dir($this->transcoding($dir . '/' . substr($filename, 0, -1)))) mkdir($this->transcoding($dir . '/' . substr($filename, 0, -1)), 0777, true);
} else {
copy('zip://' . $zipName . '#' . $statInfo['name'], $this->transcoding($dir . '/' . $filename));
}
}
$name = $zip->getNameIndex(0);
$name = $this->transcoding($name);
$name = substr($name, 0, -1);
$zip->close();
@rename($dir . '/' . $name, $dir . '/extract');
if ($handle = @opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry == "." || $entry == "..") {
continue;
}
if (is_dir($dir . '/' . $entry)) {
@rename($dir . '/' . $entry, $dir . '/extract');
}
}
closedir($handle);
}
$path = $dir . '/extract';
if ($handle = @opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if ($entry == "." || $entry == "..") {
continue;
}
if (is_dir($path . '/' . $entry)) {
@rename($path . '/' . $entry, $path . '/pic');
} else {
$extension = explode('.', $entry)[1];
@rename($path . '/' . $entry, $path . '/goods.' . $extension);
}
}
closedir($handle);
}
return true;
} else {
return false;
}
}
function transcoding($fileName)
{
$encoding = mb_detect_encoding($fileName, ['UTF-8', 'GBK', 'BIG5', 'CP936']);
if (DIRECTORY_SEPARATOR == '/') {
$filename = mb_convert_encoding($fileName, 'UTF-8', $encoding);
} else {
$filename = mb_convert_encoding($fileName, 'GBK', $encoding);
}
return $filename;
}
public function clearDirAndFiles($path)
{
if ($handle = @opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if ($entry == "." || $entry == "..") {
continue;
}
if (is_dir($path_child = $path . '/' . $entry)) {
$this->clearDirAndFiles($path_child);
@rmdir($path_child);
} else {
@unlink($path_child);
}
}
closedir($handle);
}
@rmdir($path);
}
public function zipFiles($path)
{
$zip = new \ZipArchive();
@unlink($path . '/goods.zip');
if ($zip->open($path . '/goods.zip', \ZIPARCHIVE::CREATE) === true) {
$zip->addEmptyDir('压缩包');
$zip->addEmptyDir('压缩包/图片');
$filename = $path . '/build/goods.xlsx';
$content = file_get_contents($filename);
$zip->addFromString('压缩包/商品列表.xlsx', $content);
if ($handle = opendir($path . '/build/pic')) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != ".." && !is_dir($entry)) {
$zip->addFile($path . '/build/pic/' . $entry, '压缩包/图片/' . $entry);
}
}
closedir($handle);
}
$zip->close();
}
}
public function combine($arr, $str = ';')
{
$result = array_reduce($arr, function ($v, $m) use ($str) {
$temp = [];
foreach ($v as $vv) {
foreach ($m as $mm) {
if (empty($vv)) {
$temp[] = $mm;
} else {
$temp[] = $vv . $str . $mm;
}
}
}
return $temp;
}, ['']);
return $result;
}
public function generateExcelHead($number)
{
$num = $number;
$begin = 'A';
$jj = 0;
$nn = 0;
$aLetter = [];
for ($sii = 0; $sii < 26; $sii++) {
$char = chr(65 + $sii);
$char_list[$sii] = $char;
}
for ($i = 0; $i <= $num; $i++) {
$beginstr = ord($begin);
$cel = chr($beginstr + $i);
if ($beginstr + $i <= 90) {
$aLetter[] = $cel;
}
if ($beginstr + $i > 90) {
$startnum = '65';
$kkk = ((int)$jj / 26);
$cel = chr($startnum + $nn);
$aLetter[] = $char_list[$kkk] . $cel;
$nn++;
if ($nn > 25) {
$nn = 0;
}
$jj++;
}
}
return $aLetter;
}
public function verifyFile($path,$table)
{
$verifyExcel = $this->verifyExcel($path,$table);
if ($verifyExcel['status'] == 0) {
return $verifyExcel;
}
$data['lists'] = $verifyExcel['data']['lists'];
$verifyPic = $this->verifyPic($path, $data['lists'],$table);
if ($verifyPic['status'] == 0) {
return $verifyPic;
}
$data['picArray'] = $verifyPic['data']['picArray'];
return ['status' => 1, 'msg' => '验证通过', 'data' => $data];
}
private function verifyExcel($path,$table)
{
$excelName = '';
$ext = 'xlsx';
if ($handle = @opendir($path)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
if (substr_count($entry, 'goods') > 0) {
$pathInfo = pathinfo($path . '/' . $entry);
$excelName = $entry;
$ext = strtolower($pathInfo['extension']);
}
}
}
closedir($handle);
}
if (empty($excelName) || ($ext != 'xlsx' && $ext != 'xls')) {
return ['status' => 0, 'msg' => '导入失败,Excel文件不存在或者名称不正确'];
}
$file_path = $path . '/' . $excelName;
$objReader = \PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load($file_path, 'utf-8');
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow();
$highestColumn = $sheet->getHighestColumn();
$data = [];
for ($i = 1; $i <= $highestRow; $i++) {
$rowData = [];
for ($k = 'A'; $k <= $highestColumn; $k++) {
$rowData[] = (string)trim($objPHPExcel->getActiveSheet()->getCell("$k$i")->getValue());
}
array_push($data, $rowData);
}
$headerInfo = $data[0];
unset($data[0]);
if ($table == 'woo_retail_goods'){
$heads = ['商品条码','商品名称','参与优惠','零售价','会员价','规格条码'];
$return = $this->verifyHeaders($heads,$headerInfo);
}elseif ($table == 'woo_admin_goods'){
$heads = ['商品条码','商品名称','库存单位','单规格','建议零售价','规格条码','规格'];
$headerInfo = array_slice($headerInfo,0,7);
$return = $this->verifyHeaders($heads,$headerInfo);
}elseif ($table == 'woo_takeout_goods'){
$heads = ['商品条码', '商品名称', '商品分类', '参与优惠', '打包费', '商品属性','零售价', '会员价', '规格条码', '库存', '设库存'];
$headerInfo = array_slice($headerInfo,0,7);
$return = $this->verifyHeaders($heads,$headerInfo);
}else{
$heads = ['商品条码','商品名称','商品分类','库存单位','参与优惠','单规格','建议零售价','规格条码','规格'];
$headerInfo = array_slice($headerInfo,0,9);
$return = $this->verifyHeaders($heads,$headerInfo);
}
if ($return['status'] == 1){
$return['data']= ['lists' => $data];
}
return $return;
}
public function verifyHeaders($heads,$headerInfo)
{
$return = ['status'=>0,'msg'=>'模板不符合规范'];
foreach ($headerInfo as $key=>&$head){
$head = str_replace(array("\r\n", "\r", "\n","\t"," "), "", $head);
if ($head != $heads[$key]){
return $return;
}
}
return ['status'=>1,'msg'=>'验证通过'];
}
public function delEmptyColumn($data)
{
$max = 0;
foreach ($data as $key => $value) {
$max = max($max, count($value));
}
$deleteIndex = [];
for ($j = 0; $j < $max; $j++) {
$result = array_filter(array_column($data, $j));
if (empty($result)) {
array_push($deleteIndex, $j);
}
}
array_walk($data, function (&$value) use ($deleteIndex) {
$value = array_slice($value, 0, $deleteIndex[0]);
});
return $data;
}
public function verifyPic($path, $lists,$table)
{
$picPath = $path . '/pic';
$barCodeArr = [];
$picArray = [];
if ($handle = @opendir($picPath)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$pathInfo = pathinfo($picPath . '/' . $entry);
$barCode = explode('-', $pathInfo['filename'])[0];
if (!in_array($barCode, $barCodeArr)) {
$barCodeArr[] = $barCode;
}
$picArray[$barCode][] = $pathInfo['basename'];
}
}
closedir($handle);
}
$code = array_filter(array_column($lists, 0));
$goodsCodeArr = DB::table($table)->whereIn('code', $barCodeArr)->pluck('code')->toArray();
$isVerify = true;
foreach ($barCodeArr as $v) {
if (!in_array($v, $code) && !in_array($v, $goodsCodeArr)) {
$isVerify = false;
break;
}
}
if ($isVerify) {
return ['status' => 1, 'msg' => '图片验证成功', 'data' => ['picArray' => $picArray]];
} else {
return ['status' => 0, 'msg' => '模板不符合规范'];
}
}
public function buildFiles($data)
{
$list = $data['returnLists'];
if (!is_dir($data['path'] . '/pic')) {
mkdir($data['path'] . '/pic', 0775, true);
}
if (!empty($data['picLists'])) {
foreach ($data['picLists'] as $goodCode=>$goodPics){
foreach ($goodPics as $pic) {
if (file_exists($data['picPath'].$pic)){
$picContent = file_get_contents($data['picPath'].$pic);
file_put_contents($data['path'] . '/pic/'.$goodCode.'-'.$pic,$picContent);
}
}
}
}
$headers = $this->generateExcelHead($data['max']-1);
$file = $data['path'] . 'goods.xlsx';
$PHPExcel = new \PHPExcel();
$PHPExcel->getDefaultStyle()->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
$PHPExcel->getDefaultStyle()->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
$PHPSheet = $PHPExcel->getActiveSheet();
$styleThinBlackBorderOutline = array(
'borders' => array (
'allborders' => array (
'style' => \PHPExcel_Style_Border::BORDER_THIN,
'color' => array ('argb' => '000000'),
),
),
);
foreach ($headers as $k => $header) {
$PHPSheet->getColumnDimension($header)->setWidth(16);
$PHPSheet->setCellValue($header . '1', $data['heads'][$k])->getStyle($header . '1')->applyFromArray($styleThinBlackBorderOutline);
foreach ($list as $key => $row) {
$PHPSheet->setCellValueExplicit($header . ($key + 2), $row[$k],\PHPExcel_Cell_DataType::TYPE_STRING)->getStyle($header . ($key + 2))->applyFromArray($styleThinBlackBorderOutline)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_TEXT);
}
}
$PHPSheet->getRowDimension(1)->setRowHeight(26);
for ($i = 0; $i < count($list); $i++) {
$PHPSheet->getRowDimension($i + 2)->setRowHeight(26);
}
$PHPSheet->getDefaultRowDimension()->setRowHeight(26);
$PHPWriter = \PHPExcel_IOFactory::createWriter($PHPExcel, "Excel2007");
$PHPWriter->save($file);
if (is_file($file)) {
return ['status' => 1, 'msg' => '创建文件成功'];
} else {
return ['status' => 0, 'msg' => '创建文件失败'];
}
}
}