167 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.9 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) {
 | 
						|
            $this->success("执行导出成功,正在压缩中,请稍等!");
 | 
						|
        } 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>");
 | 
						|
    }
 | 
						|
}
 |