167 lines
4.8 KiB
PHP
167 lines
4.8 KiB
PHP
<?php
|
|
|
|
namespace addons\csmtable\controller;
|
|
|
|
use addons\csmtable\library\xcore\xcore\utils\XcConfigUtils;
|
|
use addons\csmtable\library\xcore\xcore\utils\XcDaoUtils;
|
|
use addons\csmtable\library\xcore\xcore\utils\XcRequestUtils;
|
|
use addons\csmtable\library\xcore\xcore\base\XcAAdminApi;
|
|
use addons\csmtable\library\xapp\csmtable\utils\CsmTableUtils;
|
|
use addons\csmtable\library\xapp\csmtable\utils\CsmgenerateTask;
|
|
|
|
class Csmgenerate extends XcAAdminApi
|
|
{
|
|
protected $noNeedRight = ["*"];
|
|
protected $xlstaskdao = null;
|
|
|
|
// config 配置
|
|
protected $excelmaxrecoredcount = null;
|
|
protected $controlpagesize = null;
|
|
|
|
protected $uploadtmppath = RUNTIME_PATH . 'temp' . DS;
|
|
|
|
protected function xinit()
|
|
{
|
|
$this->xlstaskdao = new \app\admin\model\csmtable\Xlstask();
|
|
|
|
$this->excelmaxrecoredcount = (int)XcConfigUtils::config("excelmaxrecoredcount");
|
|
$this->controlpagesize = XcConfigUtils::config("controlpagesize");
|
|
}
|
|
|
|
public function index()
|
|
{
|
|
|
|
$id = XcRequestUtils::get("id", true);
|
|
$ret = $this->_index($id);
|
|
if ($ret === true) {
|
|
echo "操作成功!";
|
|
} else {
|
|
echo $ret;
|
|
}
|
|
}
|
|
|
|
private function _index($id)
|
|
{
|
|
static::p('----generateExcelByClassname begin:');
|
|
set_time_limit(0);
|
|
|
|
$params = $this->getXlstaskParams($id);
|
|
$this->setProgress($id, 10);
|
|
// 按记录数切分多个任务
|
|
$recordtotal = $this->getDataRecordTotal($params);
|
|
|
|
$excelCount = (int) ($recordtotal / $this->excelmaxrecoredcount); // 总记录数/单个xls记录数=200/100=2
|
|
|
|
if ($recordtotal == 0) {
|
|
// 没有数据,则报错
|
|
$errmsg = "没有数据,无法下载";
|
|
$this->setErrorXlstask($id, $errmsg);
|
|
static::p('----generateExcelByClassname end:');
|
|
return $errmsg;
|
|
}
|
|
|
|
$result = '';
|
|
$excelFiles = [];
|
|
for ($i = 0; $i <= $excelCount; $i++) {
|
|
static::p($i);
|
|
$fileno = ($i + 1);
|
|
$offset = $i * $this->excelmaxrecoredcount;
|
|
|
|
$task = new CsmgenerateTask();
|
|
$filename = $task->index($id, $fileno, $offset);
|
|
$result = $filename . ';';
|
|
|
|
$progress = (int) 80 * ($i + 1) / ($excelCount + 2) + 10;
|
|
$this->setProgress($id, $progress);
|
|
|
|
|
|
if ($filename != null) {
|
|
$excelFiles[] = $filename;
|
|
static::p($filename);
|
|
} else {
|
|
$errmsg = '下载报错,可能是PHP内存设置过小或数据查询报错造成';
|
|
$this->setErrorXlstask($id, $errmsg);
|
|
return $errmsg;
|
|
}
|
|
}
|
|
|
|
$this->setProgress($id, 90);
|
|
|
|
$zipfilename = static::saveExcelToZip($excelFiles);
|
|
$this->setProgress($id, 100, $zipfilename, $result);
|
|
static::p('----generateExcelByClassname end:' . $result);
|
|
return true;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public function saveExcelToZip(&$excelFiles)
|
|
{
|
|
$zipfn = 'csmtable_' . time() . '.zip';
|
|
$zipfilename = $this->uploadtmppath . $zipfn;
|
|
$zip = new \ZipArchive();
|
|
$zip->open($zipfilename, \ZipArchive::CREATE | \ZipArchive::CREATE);
|
|
static::p('saveExcelToZip');
|
|
static::p($excelFiles);
|
|
foreach ($excelFiles as $item) {
|
|
$zip->addFile($this->uploadtmppath . $item, $item);
|
|
}
|
|
$zip->close();
|
|
|
|
foreach ($excelFiles as $item) {
|
|
unlink($this->uploadtmppath . $item);
|
|
}
|
|
return $zipfn;
|
|
}
|
|
|
|
|
|
|
|
private function setProgress(&$csmtable_xlstask_id, $progress, $filename = '', $errormsg = '')
|
|
{
|
|
$this->xlstaskdao->where("id", "=", $csmtable_xlstask_id)->update([
|
|
'progress' => $progress,
|
|
'filename' => $filename,
|
|
'updatetime' => time(),
|
|
'errormsg' => $errormsg //v2.1.8 增加日志和查询日志调试功能,便于排查问题
|
|
]);
|
|
static::p('progress:' . $progress);
|
|
}
|
|
|
|
private function setErrorXlstask($csmtable_xlstask_id, $errormsg)
|
|
{
|
|
XcDaoUtils::getRowById($this->xlstaskdao, $csmtable_xlstask_id)->save([
|
|
'iserror' => 'Y',
|
|
'errormsg' => substr($errormsg, 0, 1000),
|
|
'updatetime' => time()
|
|
]);
|
|
static::p('progress:' . $errormsg);
|
|
}
|
|
|
|
|
|
// 获取记录数
|
|
public function getDataRecordTotal(&$params)
|
|
{
|
|
$controlData = CsmTableUtils::callRemoteControl($params, 0, 1);
|
|
return $controlData->getData()['total'];
|
|
}
|
|
|
|
public function getXlstaskParams($id)
|
|
{
|
|
|
|
$xlstaskrow = XcDaoUtils::getRowById($this->xlstaskdao, $id);
|
|
if ($xlstaskrow == null) {
|
|
return;
|
|
}
|
|
return json_decode($xlstaskrow->param, true);
|
|
}
|
|
|
|
|
|
private static function p($str)
|
|
{
|
|
trace($str);
|
|
//echo($str."<BR>");
|
|
}
|
|
}
|