view->config = Zend_Registry::get('config');
$this->db=Zend_Registry::get('db');
$this->messenger=$this->_helper->getHelper('FlashMessenger');
$this->view->messages = $this->messenger->getMessages();
}
/*
* indexAction() 元数据评审首页
*/
function indexAction()
{
//最新10个收稿
$sql="select m.uuid,m.title,date(s.ts_created) as ts_created from mdstatus s right join metadata m on m.uuid=s.uuid where s.status=0 order by s.ts_created desc limit 10";
$this->view->mdreceived = $this->db->fetchAll($sql);
//最新10个接收
$sql="select m.uuid,m.title,s.ts_accepted from mdstatus s right join metadata m on m.uuid=s.uuid where s.status=1 order by s.ts_created desc limit 10";
$this->view->mdaccepted = $this->db->fetchAll($sql);
//最新10个送审
$sql="select m.uuid,m.title,s.ts_accepted from mdstatus s right join metadata m on m.uuid=s.uuid where s.status in (2,3,4) order by s.ts_created desc limit 10";
$this->view->mdinreview = $this->db->fetchAll($sql);
//最新10个已审
$sql="select m.uuid,m.title,s.ts_accepted from mdstatus s right join metadata m on m.uuid=s.uuid where s.status=5 order by s.ts_created desc limit 10";
$this->view->mdreviewed = $this->db->fetchAll($sql);
//统计数字
$sql="select (select count(*) from mdexperts) as experts,(select count(*) from mdstatus where status=0) as draft,(select count(*) from mdstatus where status=1) as accept,(select count(*) from mdstatus where status in (2,3,4)) as inreview,(select count(*) from mdstatus where status=5) as reviewed,(select count(*) from mdreview) as openreview,(select count(distinct(userid)) from mdreview) as openreviewuser";
$this->view->stat=$this->db->fetchRow($sql);
}// 元数据评审首页
/*
* myreviewAction() 我参数的元数据
*
* 通过用户ID来获得此列表,未登录用户无权限浏览该页面
*/
function myreviewAction(){
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$uid = $user->id;
}else{
$this->_redirect('/account/login/?href=/review/myreview');
}
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s left join normalmetadata m on s.uuid=m.uuid where m.uuid in (select uuid from mdexpertreview er where er.id=$uid union select uuid from mdreview r where r.userid=$uid)");
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,s.ts_accepted,s.ts_finished,g.id as gid,t.filename from mdstatus s left join normalmetadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where m.uuid in (select uuid from mdexpertreview er where er.id=$uid union select uuid from mdreview r where r.userid=$uid) order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
foreach($this->view->metadata as $k=>$v)
{
$this->view->metadata[$k]['statustext']=$this->rewritestatus($v['status']);
}
}//我参审的
/*
* draftAction() 最新收稿的元数据
*
* [@param $page int]
*
* mdstatus 中status 字段值为 0 的元数据为收稿元数据
*/
function draftAction(){
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s left join metadata m on s.uuid=m.uuid where s.status in (0)");
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,s.ts_created,g.id as gid,t.filename from mdstatus s right join metadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where s.status in (0) order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
}//最新收稿
/*
* acceptAction() 最新进入评审的元数据
*
* [@param $page int]
*
* mdstatus 中 status 字段值为 1 的元数据为进入评审的元数据
*/
function acceptAction(){
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s right join normalmetadata m on s.uuid=m.uuid where s.status in (1)");
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,s.ts_accepted,g.id as gid,t.filename from mdstatus s right join normalmetadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where s.status in (1) order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
}
/*
* inreviewAction() 在审元数据
*
* [@param $page(int)]
*
* mdstatus 中 status 字段值为 2,3,4 的元数据为正在进行评审的元数据
*/
function inreviewAction(){
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s right join normalmetadata m on s.uuid=m.uuid where s.status in (2,3,4)");
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,s.ts_accepted,g.id as gid,t.filename from mdstatus s right join normalmetadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where s.status in (2,3,4) order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
}//在审阶段的元数据
/*
* reviewedAction() 已通过评审的元数据
*
* [@param $page int]
*
* mdstatus 中 status 字段值为 5 的元数据为已经通过评审的元数据
*/
function reviewedAction(){
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s left join normalmetadata m on s.uuid=m.uuid where s.status in (5)");
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,s.ts_finished,g.id as gid,t.filename from mdstatus s left join normalmetadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where s.status in (5) order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
}//已完成评审的元数据
/*
* rewritestatus() 将评审状态转化为文字说明
*
* @param $status int
*
* return string
*/
function rewritestatus($status){
if($status==-1)
{return "取消评审";}
else if($status==0)
{return "投稿元数据";}
else if($status==1)
{return "接收元数据";}
else if($status==2)
{return "专家评审中";}
else if($status==3)
{return "专家评审中";}
else if($status==4)
{return "专家反馈";}
else if($status==5)
{return "已发布";}
else
{return "";}
}//function rewriterstatus
/*
* replace() 重写表单中提交的html数据
*
* @param $string string
*
* return string
*/
function replace($string){
$patterns = array("/\"/i","/\'/i");
$replacements = array("“","‘");
ksort($patterns);
ksort($replacements);
return preg_replace($patterns, $replacements, $string);
}
/*
* reviewAction() 元数据评审页面
*
* @param $uuid uuid
*
* return view
*/
function reviewAction() {
$uuid = $this->_request->getParam('uuid');
$sql=$this->db->quoteInto("select m.id,m.uuid,m.title,m.description,m.title_en,r.status from metadata m
left join mdstatus r on r.uuid=m.uuid
where m.uuid=?",$uuid);
$md = $this->db->fetchRow($sql);
$this->view->metadata = $md;
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$userid = $user->id;
$sql = "select * from mdreview where userid='$userid' and uuid='$uuid'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
$this->view->review = $row;
}
}//reviewAction()
/*
* allreviewAction() 列出所有评审意见
*
* @param $uuid uuid
* @param $page int default 0
*
* return string
*
* 使用ajax输出所有评审意见,UUID为数据评审页面的uuid参数。包含列表的html标签,包含分页代码
* 分页模板:review/pagination_ajax.phtml
*/
function allreviewAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$uuid = $this->_request->getParam('uuid');
$sql = "select r.id,r.is_expert,r.uuid,r.userid,r.ts_created,u.username,r.mdcomment,r.conclusion,ratt.reviewid from mdreview r
left join users u on u.id=r.userid
left join mdreviewattach ratt on r.id=ratt.reviewid
where r.uuid='$uuid' and r.status>-1
group by r.id,r.is_expert,r.uuid,r.userid,r.ts_created,u.username,r.mdcomment,r.conclusion,ratt.reviewid
order by r.id desc
";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
$paginator = Zend_Paginator::factory($rows);
$paginator->setCurrentPageNumber($this->_getParam('page'));
$paginator->setItemCountPerPage(5);
$paginator->setView($this->view);
Zend_View_Helper_PaginationControl::setDefaultViewPartial('review/pagination_ajax.phtml');
$list = "";
foreach($paginator as $k=>$v)
{
$list.='
评审人:';
if(!$v['is_expert'])
{
$list .= $v['username'];
}else
{
$list.= '专家';
}
$list .= '
';
if($v['reviewid']!="")
{
$list.='[
查看评审附件] ';
}
$list .='
评审时间:'.date("Y-m-d H:i",strtotime($v['ts_created'])).'
'.str_replace(array("\r\n", "\n", "\r"),'
',$v['mdcomment']).'
';
}
if(empty($list))
{
$list="暂无评审数据
";
}
$stringbuffer = "";
echo $stringbuffer.''.$paginator.'
';
}//allreviewAction() 所有评论 ajax
/*
* saveAction() 保存/提交评审意见
*
* @param $do string //空值或其它时为存草稿,submit为提交到后台
* @param $conclusion int //总体意见
* @param $mdcomment string //给元数据意见
* @param $datacomment string //给数据中心意见
* @param $editorcomment string //给元数据作者意见
* @param $att array[] //附件
* @param $uuid uuid
*
* return string
*
* ajax保存、提交元数据评审意见,返回提示html提示信息
* 当用户未删除附件直接离开页面会产生冗余,因为附件没有即时删除(是否在离开事件中添加ajax删除未提交的附件?)
* 评审成功后发送邮件到系统邮箱,并为后台推送管理员消息
*/
function saveAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$do = $this->_request->getParam('do');
$conclusion = $this->_request->getParam('conclusion');
$mdcomment = $this->replace(trim($this->_request->getParam('mdcomment')));
$datacomment = $this->replace(trim($this->_request->getParam('datacomment')));
$editorcomment = $this->replace(trim($this->_request->getParam('editorcomment')));
$uuid = $this->_request->getParam('uuid');
$sql=$this->db->quoteInto("select m.id,m.uuid,m.title,m.description,m.title_en,r.status from metadata m
left join mdstatus r on r.uuid=m.uuid
where m.uuid=?",$uuid);
$md = $this->db->fetchRow($sql);
if($md['status']>4)
{
echo '该数据已经通过评审,不能再发表评审意见,如需提交问题,请联系数据管理员
';
exit();
}
if($md['status']<1)
{
echo '已被数据中心接收的数据才可以进行评审
';
exit();
}
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$userid = $user->id;
$sql = "select id,userid,status from mdreview where userid='$userid' and uuid='$uuid'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
if($row['id']!='' && $row['status']>-1)
{
echo '您已经对该元数据发表过评审了
';
exit();
}
}else{
echo '读取用户信息失败,请刷新页面后重试 :(
';
exit();
}
if(empty($conclusion))
{
echo '请选择评审意见
';
exit();
}
if(!is_numeric($conclusion) || !in_array($conclusion,array(-1,1,2,3)))
{
echo '参数有误,请刷新页面 :(
';
exit();
}
if(empty($mdcomment) )
{
echo '请填写元数据意见 :(
';
exit();
}
try{
if($row['status']<0)
{
$sql = "delete from mdreview where id='{$row['id']}'";
if($this->db->exec($sql)<1)
{
echo '处理出错,请重试
';
exit();
}
}
$data = array(
'userid' => $userid,
'uuid' => $uuid,
'mdcomment' => $mdcomment,
'ts_created' => 'now()',
'datacomment' => $datacomment,
'editorcomment' => $editorcomment,
'conclusion' => $conclusion,
'status' => -1
);
if($do=='submit')
{
$data['status'] = 0;
}
$sql = "select id from mdexpertreview where id='$userid' and uuid='$uuid'";
$rs = $this->db->query($sql);
$row = $rs->fetch();
if($row['id']!='')
{
$data['is_expert'] = 'true';
}
$keys = array();
$values = array();
foreach ($data as $k=>$v)
{
$keys[]=$k;
$values[]=$v;
}
$keys = join(",",$keys);
$values = "'".join("','",$values)."'";
$sql = "insert into mdreview ($keys) values ($values) RETURNING id";
$sth = $this->db->prepare($sql);
if($sth->execute())
{
$review = $sth->fetch(PDO::FETCH_ASSOC);
$reviewid=$review['id'];
if(isset($_POST['atts']))
{
foreach($_POST['atts'] as $v)
{
$sql = "insert into mdreviewattach (attachid,reviewid) values ('$v','$reviewid')";
$this->db->exec($sql);
}
echo '保存成功!';
echo "
";
}
if($data['status']>=0)
{
echo '';
$title = "收到新元数据评审意见";
$msg = "用户".$user->username."对元数据《".$md['title']."》发布了评审意见,点击查看";
include_once("message.php");
message::post($this->db,0,-1,$title,$msg);
$mail=new WestdcMailer($this->view->config->smtp);
$mail->setFrom($this->view->config->service->email,'西部数据中心服务组');
if(@$data['is_expert']=='true')
{
$mailtp=new EmailText($this->db,"review-expert-comment",array(
'user' => $user->username,
'uuid' => $uuid,
'title'=> $md['title'],
'content' => $mdcomment
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
$mail->addTo($this->view->config->service->email); //管理员邮箱
}else{
$mailtp=new EmailText($this->db,"review-post-comment",array(
'user' => $user->username,
'uuid' => $uuid,
'title'=> $md['title'],
'content' => $mdcomment
));
$mail->setBodyText($mailtp->getBody());
$mail->setSubject($mailtp->getSubject());
$sql="select distinct(res.email) from responsible res left join role r on res.id=r.resid where r.role in ('author','resourceProvider') and r.uuid=?";
$rows=$this->db->fetchAll($this->db->quoteInto($sql,$uuid));
foreach($rows as $row)
$mail->addTo($row['email']); //元数据作者
$mail->addCc($this->view->config->service->email); //管理员
}
$mail->send();
}
}else{
echo '保存出错,请稍后再试!
';
exit();
}
}catch (Exception $e){
echo '保存失败,请重试!
';
exit();
}
}// saveAction 存草稿 ajax
/*
* searchAction() 搜索
*
* @param $key string
*
* 搜索包含输入关键词的评审元数据
*/
function searchAction()
{
$key=$this->_request->getParam('q');
if(preg_match("/\"|'|<|>/",$key))
{
$data=array(
'<'=>'<',
'>'=>'>',
"\'"=>'’',
"\""=>'”',
);
$patterns = array();
$replacements = array();
foreach($data as $k=>$v)
{
$patterns[]='/'.$k.'/i';
$replacements[]=$v;
}
ksort($patterns);
ksort($replacements);
$key=preg_replace($patterns, $replacements, $key);
}
if (!empty($key)) {
$search=new Search($key);
$where=$search->sql_expr(array("m.title","m.description"));
$page=@(int)$this->_request->getParam('page');
if (empty($page)) $page=1;
$offset=$this->limit*($page-1);
$row=$this->db->fetchAll("select count(s.*) from mdstatus s left join normalmetadata m on s.uuid=m.uuid where s.status>0 and ".$where);
$sum=$row[0]['count'];
$sql="select m.uuid,m.title,m.id,m.description,s.status,g.id as gid,t.filename from mdstatus s left join normalmetadata m on s.uuid=m.uuid left join geonetworkmetadata g on g.uuid=m.uuid left join thumbnail t on t.id=m.id where s.status>0 and ".$where." order by s.ts_created desc,m.title limit ? offset ?";
$this->view->metadata=$this->db->fetchAll($sql,array($this->limit,$offset));
$this->view->page=new Pagination($sum,$page,$this->limit);
$this->view->key=$key;
foreach($this->view->metadata as $k=>$v)
{
$this->view->metadata[$k]['statustext']=$this->rewritestatus($v['status']);
}
}
}
function helpAction()
{
}
/*
* attlistAction() 元数据评审附件列表
*
* @param $rid status //元数据评审意见的ID
*
* return string
*
* ajax获得评审意见的附件列表,输出html
*/
function attlistAction()
{
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$rid = $this->_request->getParam('id');
$list = array();
$list[]= '
附件列表:
[关闭]
';
$sql = "select att.realname,att.id,att.filesize from attachments att
left join mdreviewattach ratt on ratt.attachid = att.id
where ratt.reviewid = $rid";
$rs = $this->db->query($sql);
$rows = $rs->fetchAll();
foreach($rows as $k=>$v)
{
if($v['filesize'] > 1024*1024)
{
$v['filesize'] = round($v['filesize']/1024/1024,2) . "MB";
}
else
{
$v['filesize'] = round($v['filesize']/1024,2) . "KB";
}
$list[] = '
'.$v['realname'].' ('.$v['filesize'].')
下载
';
}
if(count($rows)>0)
{
echo "";
}else{
echo "无附件";
}
exit();
}// ajax 评审附件列表
/*
* downattAction() 附加下载
*
* @param $id int //附件ID
*
* return file
*
* 判断附件类型后输出相应下载
* 如果输出html错误提示,需要输出完整的html页面
*/
function downattAction(){
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$id = $this->_request->getParam('id');
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
try{
$sql = "select * from attachments where id='$id'";
$re = $this->db->query($sql);
$row = $re->fetch();
$fullPath = $this->view->config->upload.$row['filename'];
if(!file_exists($fullPath))
{
echo '
错误提示!文件读取出错,请稍后重试';
exit();
}
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
default: $ctype="application/force-download";
}
$content=file_get_contents($fullPath);
$this->_helper->layout->disableLayout();
$this->_helper->viewRenderer->setNoRender();
$this->getResponse()->setHeader('Content-Type', 'application/octet-stream')
->setHeader('Content-Disposition','attachment; filename="'.$row['realname'].'"')
->setHeader('Content-Length', $fsize)
->setHeader('Content-Type','application/force-download')
->setHeader('Content-Type','application/download')
->setHeader('Content-Type',$ctype)
->setHeader('Content-Description','File Transfer')
->setHeader('Content-Transfer-Encoding','binary')
->setHeader('Expires',0)
->setHeader('Cache-Control','must-revalidate, post-check=0, pre-check=0')
->setHeader('Pragma','public')
->setBody($content);
$sql = "update attachments set downtimes=downtimes+1 where id = $id";
@$this->db->exec($sql);
}catch(Exception $e){
echo '
错误提示!文件读取出错,请稍后重试';
exit();
}
}else{
echo '
错误提示!读取用户信息出错,请先登录再下载附件重试';
exit();
}
}// downattAction 下载附件
/*
* denyinviteAction() 专家拒绝邀请
*
* @param id int //用户ID
* @param uuid uuid //元数据UUID
*
* return view->message
*
* 要求专家后会发送通知邮件到专家邮箱,邮箱中包含拒绝邀请的链接
* 链接地址 /review/denyinvite/id/{userid}/uuid/{uuid}
*/
function denyinviteAction()
{
$id = $this->_request->getParam('id');
$uuid = $this->_request->getParam('uuid');
if(empty($id) || empty($uuid) || !is_numeric($id) ||!preg_match("/^[0-9A-Za-z]{8}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{4}-[0-9A-Za-z]{12}$/",$uuid))
{
$this->view->message = "参数错误";
}else{
$auth = Zend_Auth::getInstance();
if($auth->hasIdentity())
{
$user = $auth->getIdentity();
$userid = $user->id;
if($id==$userid)
{
try{
$sql = "update mdexpertreview set status=-1 where id='$id' and uuid='$uuid'";
if($this->db->exec($sql))
$this->view->message = "您已经拒绝该元数据的评审邀请";
else
$this->view->message = "您无权限进行此操作";
}catch(Exception $e){
$this->view->message = $e->getMessage();
}
}//end if
else
{
$this->view->message = "您无权使用此通知";
}//非本人操作,或尝试删除他人信息
}//end if
else
{
$this->view->message = '请登录后再执行此操作,请点击此处登录';
}//未登录
}
}// denyinviteAction() 专家拒绝邀请
}