From 4ab158bd882286188747a37c9450957562e15f09 Mon Sep 17 00:00:00 2001 From: wlx Date: Thu, 21 Jun 2012 03:21:10 +0000 Subject: [PATCH] merge trunk admin DownController changes [1804]:[2452] into the branch --- .../admin/controllers/DownController.php | 349 ++++++++++++++++-- 1 file changed, 322 insertions(+), 27 deletions(-) diff --git a/application/admin/controllers/DownController.php b/application/admin/controllers/DownController.php index 8c5e96b9..e7c83a39 100644 --- a/application/admin/controllers/DownController.php +++ b/application/admin/controllers/DownController.php @@ -27,6 +27,7 @@ class Admin_DownController extends Zend_Controller_Action $deny =(int)$this->_getParam('deny'); $page =(int)$this->_getParam('page'); $reset =(int)$this->_getParam('reset'); + $status =(int)$this->_getParam('status'); if (!$page) $page=1; if ($view) { @@ -43,41 +44,322 @@ class Admin_DownController extends Zend_Controller_Action $this->db->query($sql,array($start)); $sql="select * from offlineapp where id=?"; $row=$this->db->fetchRow($sql,array($start)); + $username=$row['username']; //发送用户邮件进行信息提示和说明 $mail = new WestdcMailer($this->view->config->smtp); $datalist=str_replace(";","\n",$row['datalist']); - $mailtp=new EmailText($this->db,'offline-start',array('user'=>$row['username'],'datalist'=>$datalist)); + $mailtp=new EmailText($this->db,'offline-start',array('user'=>$username,'datalist'=>$datalist)); $mail->setBodyText($mailtp->getBody()); $mail->setSubject($mailtp->getSubject()); $mail->addTo($row['email']); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mail->send(); - $sql="select distinct(res.email) from dataorder d left join role on d.uuid=role.uuid left join responsible res on role.resid=res.id where d.offlineappid=? and role.role in ('pointOfContact','resourceProvider')"; + + $sql="select pdflink from offlineapp where id=?"; + $row=$this->db->fetchRow($sql,array($start)); + $filecontent=file_get_contents($this->view->config->offline->savepath."/".$row['pdflink']); + + //对每条数据的管理员用户发送相应的邮件通知,同一用户的邮件需要合并 + //需要取出对应数据的标题、uuid,以及对应的作者的email(一条数据可能有多个作者,一次申请可能有多条数据对应同一个作者) + //邮件中应提示用户可以选择是否委托给数据中心进行管理(这样以后就不接受相应的管理邮件,但用户仍然可以自主取消此选择) + $uuid_done=""; + // 0. 处理专题数据集 + $sql="select s.admin_email as email,m.title,d.uuid,s.title as sourcetitle from dataorder d left join datasource ds on d.uuid=ds.uuid + left join source s on ds.sourceid=s.id left join metadata m on d.uuid=m.uuid + where d.offlineappid=? and s.admin_status=1 and d.uuid<>all(s.exclude_data) + order by s.admin_email,m.title"; $rows=$this->db->fetchAll($this->db->quoteInto($sql,$start)); - $addrs=array(); + $tmp_email=''; + $data=''; + $source=''; foreach($rows as $row) { - $addrs[]=$row['email']; + if ($tmp_email!=$row['email']) + { + if (!empty($data)) + { + //发送之前的用户申请审核邮件 + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-subject',array('user'=>$username,'datalist'=>$data,'source'=>$source)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail_addrs=explode(",",substr($tmp_email,1,-1)); + $mail->addTo($mail_addrs); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + $data=""; + $source=""; + } + $tmp_email=$row['email']; + $source=$row['sourcetitle']; + } + $data.=" 数据名称:".$row['title']."\n"; + $data.=" \t数据地址:http://westdc.westgis.ac.cn/data/".$row['uuid']."\n\n"; + $uuid_done.="'".$row['uuid']."',"; + } + //发送最后一封邮件 + if (!empty($data)) + { + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-author',array('user'=>$username,'datalist'=>$data,'source'=>$source)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail_addrs=explode(",",substr($tmp_email,1,-1)); + $mail->addTo($mail_addrs); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + } + + // 1. 处理有数据作者且自行管理的数据并且未被0处理过的 + $sql="select u.email,m.title,d.uuid,a.activation from dataorder d left join mdstatus s on d.uuid=s.uuid left join users u on s.userid=u.id + left join metadata m on m.uuid=d.uuid left join mdauthor a on a.uuid=d.uuid + where d.offlineappid=? and s.status=6 and a.userid=s.userid "; + if (!empty($uuid_done)) $sql.=" and d.uuid not in (".substr($uuid_done,0,-1).") "; + $sql.=" order by u.email,m.title"; + $rows=$this->db->fetchAll($this->db->quoteInto($sql,$start)); + $tmp_email=''; + $data=''; + foreach($rows as $row) + { + if ($tmp_email!=$row['email']) + { + if (!empty($data)) + { + //发送之前的用户申请审核邮件 + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-author',array('user'=>$username,'datalist'=>$data)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail->addTo($tmp_email); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + $data=""; + } + $tmp_email=$row['email']; + } + $data.=" 数据名称:".$row['title']."\n"; + $data.=" \t数据地址:http://westdc.westgis.ac.cn/data/".$row['uuid']."\n"; + $data.=" \t如您不想收到此类数据申请审核的邮件,您可以将该数据委托给数据中心代为审核,委托后您也可以随时撤销此委托以便继续自行管理。\n"; + $data.=" \t如想委托给数据中心,请访问此网址:http://westdc.westgis.ac.cn/author/delegate/uuid/".$row['uuid']."\n"; + $data.=" \t撤销委托方法:进入数据中心->数据作者->我的数据,在该数据条上撤销委托。\n\n"; + $uuid_done.="'".$row['uuid']."',"; + } + //发送最后一封邮件 + if (!empty($data)) + { + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-author',array('user'=>$username,'datalist'=>$data)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail->addTo($tmp_email); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + } + + // 2. 处理委托数据中心进行管理的数据 + $sql="select m.title,d.uuid from dataorder d left join mdstatus s on d.uuid=s.uuid left join metadata m on m.uuid=d.uuid + left join datasource ds on ds.uuid=d.uuid left join source on ds.sourceid=source.id + where d.offlineappid=? and (s.status=7 or source.admin_status=2) "; + if (!empty($uuid_done)) $sql.=" and d.uuid not in (".substr($uuid_done,0,-1).") "; + $sql.=" order by m.title"; + $rows=$this->db->fetchAll($this->db->quoteInto($sql,$start)); + $data=""; + foreach($rows as $row) + { + $data.=" 数据名称:".$row['title']."\n"; + $data.=" \t数据地址:http://westdc.westgis.ac.cn/data/".$row['uuid']."\n\n"; + $uuid_done.="'".$row['uuid']."',"; + } + if (!empty($data)) + { + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-dcadmin',array('user'=>$username,'datalist'=>$data)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $addrs=array(); + $addrs[] = 'nztong@lzb.ac.cn'; + $addrs[] = 'wjian@lzb.ac.cn'; + $addrs[] = 'lixin@lzb.ac.cn'; + $mail->addTo($addrs); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + } + + // 3. 未认证的数据,即无明确的数据管理者,从元数据提取对应管理者的email信息进行管理 + //无数据作者的数据,根据元数据中的联系人信息发送相应的管理邮件,发送策略是多发还是少发? + //发送管理邮件同时建议用户认证为数据的作者,可以有更多的管理选择,同时邮件中应该有详细的说明为什么会收到此邮件 + $sql="select distinct res.email,d.uuid,m.title,role.role from dataorder d left join role on d.uuid=role.uuid left join responsible res on role.resid=res.id + left join metadata m on d.uuid=m.uuid where length(res.email)>4 and d.offlineappid=? + and role.role in ('pointOfContact','custodian','resourceProvider','owner','distributor','publisher','author')"; + if (!empty($uuid_done)) $sql.=" and d.uuid not in (".substr($uuid_done,0,-1).") "; + $sql.=" order by m.title,res.email"; + $rows=$this->db->fetchAll($this->db->quoteInto($sql,$start)); + unset($addrs); + $md=array(); + $tmp_title=''; + $role=array(); + $role['pointOfContact']=array(); + $role['custodian']=array(); + $role['resourceProvider']=array(); + $role['owner']=array(); + $role['distributor']=array(); + $role['publisher']=array(); + $role['author']=array(); + $single=array(); + foreach($rows as $row) + { + if ($tmp_title!=$row['title']) + { + if (count($role)) + { + $single['role']=$role; + $md[]=$single; + } + + $single['title']=$row['title']; + $single['uuid']=$row['uuid']; + + $tmp_title=$row['title']; + $role=array(); + $role['pointOfContact']=array(); + $role['custodian']=array(); + $role['resourceProvider']=array(); + $role['owner']=array(); + $role['distributor']=array(); + $role['publisher']=array(); + $role['author']=array(); + } + if ($row['role']=='resourceProvider') + { + $role['resourceProvider'][]=$row['email']; + } elseif ($row['role']=='custodian') { + $role['custodian'][]=$row['email']; + } elseif ($row['role']=='pointOfContact') { + $role['pointOfContact'][]=$row['email']; + } elseif ($row['role']=='owner') { + $role['owner'][]=$row['email']; + } elseif ($row['role']=='distributor') { + $role['distributor'][]=$row['email']; + } elseif ($row['role']=='publisher') { + $role['publisher'][]=$row['email']; + } elseif ($row['role']=='author') { + $role['author'][]=$row['email']; + } + } + if (count($role)) + { + $single['role']=$role; + $md[]=$single; + } + //再循环一次,提取最高权限email组,并发送管理邮件 + $newmd=array(); + $single=array(); + foreach($md as $row) + { + if (count($row['role'])) + { + $addrs=array(); + if (count($row['role']['pointOfContact'])) + { + $addrs=$row['role']['pointOfContact']; + } elseif (count($row['role']['custodian'])) { + $addrs=$row['role']['custodian']; + } elseif (count($row['role']['resourceProvider'])) { + $addrs=$row['role']['resourceProvider']; + } elseif (count($row['role']['owner'])) { + $addrs=$row['role']['owner']; + } elseif (count($row['role']['distributor'])) { + $addrs=$row['role']['distributor']; + } elseif (count($row['role']['publisher'])) { + $addrs=$row['role']['publisher']; + } elseif (count($row['role']['author'])) { + $addrs=$row['role']['author']; + } + $single['uuid']=$row['uuid']; + $single['title']=$row['title']; + foreach($addrs as $email) + { + $single['email']=$email; + //$newmd[]=$single; + $newmd['uuid'][]=$row['uuid']; + $newmd['title'][]=$row['title']; + $newmd['email'][]=$email; + } + } + } + //按照email排序 + array_multisort($newmd['email'],$newmd['uuid'],$newmd['title']); + $tmp_email=''; + $data=''; + foreach($newmd['email'] as $k=>$row) + { + if ($tmp_email!=$row) + { + if (!empty($data)) + { + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-mdadmin',array('user'=>$username,'datalist'=>$data)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail->addTo($tmp_email); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); + $data=''; + } + $tmp_email=$row; + } + $data.=" 数据名称:".$newmd['title'][$k]."\n"; + $data.=" \t数据地址:http://westdc.westgis.ac.cn/data/".$newmd['uuid'][$k]."\n"; + $data.=" \t如您不想收到此类数据申请审核的邮件,您可以在按如下操作办法进行处理:1. 申请成为该数据作者;2. 将该数据委托给数据中心代为审核,委托后您也可以随时撤销此委托以便继续自行管理。\n"; + $data.=" \t如要申请成为该数据作者:进入数据中心->数据作者->数据认证,查找到对应的数据后,在其下方点击申请认证即可。\n\n"; + } + if (!empty($data)) + { + unset($mail); + $mail = new WestdcMailer($this->view->config->smtp); + $mailtp=new EmailText($this->db,'offline-start-mdadmin',array('user'=>$username,'datalist'=>$data)); + $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); + $mail->setBodyText($mailtp->getBody()); + $mail->setSubject($mailtp->getSubject()); + $mail->addTo($tmp_email); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); + $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); + $mail->send(); } - //收件人邮箱 - $addrs[] = 'nztong@lzb.ac.cn'; - $addrs[] = 'wjian@lzb.ac.cn'; - $addrs[] = 'lixin@lzb.ac.cn'; - - $mailtp=new EmailText($this->db,'offline-start-admin',array('user'=>$row['username'],'datalist'=>$datalist)); - $mail->setBodyText($mailtp->getBody()); - $mail->setSubject($mailtp->getSubject()); - $mail->addTo($addrs); - $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); - $filecontent=file_get_contents("http://" . $_SERVER['HTTP_HOST'].'/admin/down/offlineapp/view/'.$start); - $mail->createAttachment($filecontent,'application/octet-stream',Zend_Mime::DISPOSITION_ATTACHMENT, Zend_Mime::ENCODING_BASE64, 'offlineapp.pdf'); - $mail->send(); //提示信息 $this->messenger->addMessage('提示信息:该离线数据已经开始处理,并发送邮件给申请人以及数据管理委员会,请在处理完成后点击“完成”。'); $this->_redirect('/admin/down/offlineapp/'.$page); } elseif ($finish) { try { + $sql = "SELECT authorpermitted FROM dataorder WHERE offlineappid=?"; + $sth = $this->db->prepare($sql); + $sth->execute(array($finish)); + $row = $sth->fetch(); + if($row['authorpermitted'] <0) + { + $this->messenger->addMessage('提示信息:数据作者明确反对该下载申请,所以不能进行进一步通过'); + $this->_redirect('/admin/down/offlineapp/'.$page); + } + $sql="update dataorder set status=5,ts_approved=now() where offlineappid=?"; $this->db->query($sql,array($finish)); $sql="update offlineapp set ts_approved=now() where id=? and ts_approved is null"; @@ -120,6 +402,7 @@ class Admin_DownController extends Zend_Controller_Action $mail->setBodyText($mailtp->getBody()); $mail->setFrom($this->view->config->service->email,'西部数据中心服务组'); $mail->addTo($row['email']); + $mail->addCc($this->view->config->service->email,'西部数据中心服务组'); $mail->setSubject($mailtp->getSubject()); $mail->send(); } //ftp1 deal @@ -163,7 +446,7 @@ class Admin_DownController extends Zend_Controller_Action } else if($reset > 0) { - $sql="update dataorder set status='1' where status='3' and offlineappid='$reset'"; + $sql="update dataorder set status='1' where (status='3' or status='4') and offlineappid='$reset'"; if($this->db->exec($sql)>0) { $this->messenger->addMessage('已经成功对该申请重置'); @@ -177,12 +460,17 @@ class Admin_DownController extends Zend_Controller_Action //if }//reset - $select="select distinct(o.*) from offlineapp o - left join dataorder d on o.id=d.offlineappid - where o.ts_approved is null - and o.pdflink is not null - and d.status=3 - order by o.ts_created desc"; + $select="select distinct(o.*),d.status as datastatus from offlineapp o + left join dataorder d on o.id=d.offlineappid"; + if ($status==4) + $select.=" where o.ts_approved is null + and o.pdflink is not null and d.status=4"; + elseif ($status==-1) + $select.=" where o.pdflink is not null and o.status=-1"; + else + $select.=" where o.ts_approved is null + and o.pdflink is not null and d.status in (3,4)"; + $select.=" order by o.ts_created desc"; $rs=$this->db->query($select); $rows=$rs->fetchAll(); $paginator = Zend_Paginator::factory($rows); @@ -242,7 +530,11 @@ class Admin_DownController extends Zend_Controller_Action $param[]=$edit; $this->db->query($sql,$param); $this->messenger->addMessage('提示信息:您已经编辑添加该记录。'); - $this->_redirect('/admin/down/offline'); + $page = $this->_getParam('page'); + if(!empty($page)) + $this->_redirect('/admin/down/offline/page/'.$page); + else + $this->_redirect('/admin/down/offline/'); } else { $form->populate($formdata); } @@ -370,13 +662,15 @@ class Admin_DownController extends Zend_Controller_Action }//下载邮箱地址列表 $select=$this->db->select(); - $select->from('offlineapp')->where('ts_approved is not null')->where('pdflink is not null')->order('ts_created desc'); + $select->from('offlineapp')->where('ts_approved is not null')->where('pdflink is not null')->where('status=0')->order('ts_created desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); $paginator->setItemCountPerPage($this->view->config->page->max); $paginator->setView($this->view); Zend_View_Helper_PaginationControl::setDefaultViewPartial('pagination.phtml'); $this->view->paginator=$paginator; + + $this->view->page = $this->_getParam('page'); } //在线数据下载情况,仅针对onlineapp表,自2011-9-8开始记录。 function onlineAction() @@ -389,6 +683,7 @@ class Admin_DownController extends Zend_Controller_Action $select=$this->db->select(); $select->from('onlineapp as o',array('id','userid','unit','username','ts_created','project','address','postcode')) ->join('metadata as m', 'o.uuid = m.uuid', array('title','uuid')) + ->where('o.id in (select distinct(onlineappid) from dataorder)') ->order('o.id desc'); $paginator = Zend_Paginator::factory($select); $paginator->setCurrentPageNumber($this->_getParam('page')); @@ -467,7 +762,7 @@ class Admin_DownController extends Zend_Controller_Action { $select=$this->db->select(); $select->from('dataorder as o',array('id','ts_created','userid','offlineappid','onlineappid')) - ->joinLeft('metadata as m', 'o.uuid = m.uuid', array('title','uuid')) + ->joinLeft('metadata as m', 'o.uuid = m.uuid', array('title','uuid','filesize')) ->joinLeft('users as u','u.id=o.userid',array('realname as username')) ->where('o.userid = ?', $show) ->where('o.status=0 or o.status=5')