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>");
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |