westdc-zf1/application/module/Order/Order.php

479 lines
12 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Order;
use \Helpers\View as view;
use \Mail\Mail;
use \Order\Listener\OrderListener;
use \Files\Output;
class Order
{
private $db;
private $config;
protected $events = NULL;
public $projectType = array(
"National Funding" => "National Funding",
"Thesis or Dissertation"=>"Thesis or Dissertation",
"Others" => "Others",
);//申请中的项目类型
public $pdfData;
function __construct($db = NULL)
{
if(empty($db))
{
$this->db = \Zend_Registry::get('db');
}else{
$this->db = $db;
}
$this->config = \Zend_Registry::get('config');
$Listener = new OrderListener();
@$this->events()->attachAggregate($Listener);
}
public function events(\Zend_EventManager_EventCollection $events = NULL)
{
if ($events !== NULL) {
$this->events = $events;
} elseif ($this->events === NULL) {
$this->events = new \Zend_EventManager_EventManager(__CLASS__);
}
return $this->events;
}
/*************
status:
1 开始进入离线申请申请程序中
2 填写并提交离线申请表
3 邮寄离线申请表
4 收到离线申请表
5 处理离线申请表
10:离线申请完成?
-1: 取消了在线下载进程
**************/
//添加到数据篮
public function addOrder($uuid,$selection = NULL,$uid = 0){
if(empty($uid))
{
$uid = view::User('id');
}
if(!is_numeric($uid))
{
$uid = view::User('id');
}
if(!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))
{
return "Wrong parameter.";
}
$results = $this->events()->trigger('submit', $this, compact('uuid','uid'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
if(empty($selection))
{
$results = $this->events()->trigger('checksource', $this, compact('uuid'));
$data = $results->bottom();
if(!empty($data))
{
return $data;
}
if($this->pushToDataorder($uuid,$uid) === true)
{
return true;
}else{
return "Errors, please retry.";
}
}else{
if($this->pushToDataorder($uuid,$uid,$selection) === true)
{
return true;
}else{
return "Errors, please retry.";
}
}
}//addOrder
//放到数据篮中
public function pushToDataorder($uuid,$uid = 0,$selection = NULL)
{
if(empty($uid))
{
$uid = view::User('id');
}
if(empty($selection))
{
$sql="insert into dataorder (uuid,ts_created,userid,status) values(?,now(),?,?)";
$rs = $this->db->query($sql,array($uuid,$uid,1));
}else{
$sql="insert into dataorder (uuid,ts_created,userid,status,selection) values(?,now(),?,?,?)";
if(!is_array($selection))
{
$rs = $this->db->query($sql,array($uuid,$uid,1,$selection));
}else{
$rs = $this->db->query($sql,array($uuid,$uid,1,json_encode($selection,JSON_NUMERIC_CHECK)));
}
}
if($rs)
{
return true;
}else{
return false;
}
}//pushToDataorder
//提交
public function apply($id,$uid = 0)
{
if(!is_numeric($id) || !is_numeric($uid))
{
return "Wrong parameter.";
}
if(empty($uid))
{
$uid = view::User('id');
}
$sql = "select count(*) as cnt from dataorder where status=1 and uuid in (select uuid from en.mdstatus) and userid=".$uid;
$row=$this->db->FetchRow($sql);
if ($row['cnt']>=$this->config->download->max) return "Reached the maximum limits of one offline application. Please remove some data.";
$sql = "select count(*) as cnt from dataorder where status=1 and userid=".$uid;
$row=$this->db->FetchRow($sql);
if ($row['cnt']>$this->config->download->max) return "一次申请不能大于5条数据请移除部分数据。";
if($id == -1)
{
$sql = $this->db->quoteInto("update dataorder set status=2 where status=1 and uuid in (select uuid from en.mdstatus) and userid=?",$uid);
if($this->db->exec($sql))
{
return true;
}else{
return "Errors, please retry.";
}
}
if($id > 0)
{
$sql = $this->db->quoteInto("update dataorder set status=2 where status=1 and uuid in (select uuid from en.mdstatus) and userid=$uid and id=?",$id);
if($this->db->exec($sql))
{
return true;
}else{
return "Errors, please retry.";
}
}
return "Wrong parameter.";
}//apply()
//删除
public function del($id,$uid = 0)
{
if(!is_numeric($id) || !is_numeric($uid))
{
return "Wrong parameter.";
}
if(empty($uid))
{
$uid = view::User('id');
}
if($id > 0)
{
$sql = $this->db->quoteInto("delete from dataorder where userid=$uid and status in (1,2) and id=?",$id);
if($this->db->exec($sql))
{
return true;
}else{
return "Errors, please retry.";
}
}
return "Wrong parameter.";
}
//设置PDF上显示的内容 getOrderItemForPdf() 的返回结果
public function setPdfData($data)
{
$this->pdfData = $data;
}
//保存预览
public function SaveOrder($formData,$uid = 0)
{
if(empty($uid) || !is_numeric($uid))
{
$uid = view::User('id');
}
$results = $this->events()->trigger('order.formcheck', $this, compact('formData'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$results = $this->events()->trigger('order.pdfNumCheck', $this, compact('uid'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$results = $this->events()->trigger('order.onUpdate', $this, compact('formData','uid'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$this->pdfPrint($formData,$uid);
return true;
}//SaveOrder
//生成并下载PDF
public function SubmitOrder($formData,$uid = 0)
{
if(empty($uid) || !is_numeric($uid))
{
$uid = view::User('id');
}
$results = $this->events()->trigger('order.formcheck', $this, compact('formData'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$results = $this->events()->trigger('order.pdfNumCheck', $this, compact('uid'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$pdf = $this->pdfPrint($formData,$uid,true,true);
$returnid = true;
$results = $this->events()->trigger('order.onUpdate', $this, compact('formData','uid','returnid'));
$oid = $results->bottom();
if(!is_numeric($oid) || $oid<1)
{
return "Wrong parameter.";
}
$results = $this->events()->trigger('order.onSubmited', $this, compact('formData','uid','oid','pdf'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$this->pushPdfDownload($pdf->pdflink);
return true;
}//SubmitOrder()
public function pushPdfDownload($fn)
{
$output = new Output();
$path = realpath($this->config->offline->savepath);
$content = file_get_contents($path.DIRECTORY_SEPARATOR.$fn);
$output->pushDownload($content,"Application.pdf",'pdf');
exit();
}
//生成pdf
public function pdfPrint($formData,$userid = 0,$save = false,$returnpdf = false)
{
/*$sql="SELECT m.title||'('||m.filesize::text||'MB)' as title FROM dataorder d
RIGHT JOIN heihemetadata m ON d.uuid=m.uuid
WHERE d.status=2 AND d.userid=?";
$list = $this->db->fetchAll($sql,array($userid));
foreach($list as $i=>$row){
@$formData['heihelist'].=($i+1).". ".$row['title'].";";
}*/
$sql="SELECT m.title||'('||m.filesize::text||'MB)' as title FROM dataorder d
RIGHT JOIN en.normalmetadata m ON d.uuid=m.uuid WHERE d.status=2 AND d.userid=?";
$list = $this->db->fetchAll($sql,array($userid));
foreach($list as $i=>$row){
@$formData['westdclist'].=($i+1).". ".$row['title'].";";
}
$pdf = new \ApplicantPDF();
$pdf->template = $this->config->offline->template;
$pdf->heihetemplate = $this->config->offline->heihetemplate;
$formData['project'].='['.$formData['project_title'].' | '.$formData['project_type'].' | '.$formData['project_id'].' | ' . $formData['project_leader'] . ']';
$pdf->data = $formData;
if (isset($formData['westdclist'])) $pdf->drawWestdc();
//if (isset($formData['heihelist'])) $pdf->drawHeihe();
$pdf->addRef($this->pdfData);
//$pdf->addSelection($this->pdfData);
//$pdf->addSecurity($this->config->offline->security);
if($save === false)
{
header("Content-Disposition: inline; filename=westdc-data-apply.pdf");
header("Content-Type:application/pdf");
//header("Content-Length: " . strlen($pdfstring));
echo $pdf->Output('westdc-data-apply.pdf','S');
}else{
//$fn = $formData['realname'].date('YmdHis').".pdf";
$fn = date('YmdHis').".pdf";
$path = realpath($this->config->offline->savepath);
$pdf->pdflink = $fn;
@$pdf->Output($path.DIRECTORY_SEPARATOR.$fn, 'F');
}
if($returnpdf === true)
{
return $pdf;
}
}
//获得要生成pdf的信息
public function getOrderItemForPdf($uid = 0 , $statu = 2)
{
if(empty($uid))
{
$uid = view::User('id');
}
$sql = "select m.title||'('||m.filesize::text||'MB)' as title,m.ts_published,date_part('year',doi.ts_published) as publish_year,m.citation,m.suppinfo,d.selection,
array_to_string(ARRAY(
select r.reference from mdref mr left join reference r on mr.refid=r.id
where mr.reftype=3 and mr.uuid=d.uuid order by mr.place),'\n'::text) as reference,
array_to_string(array(
select fund.fund_type_en||':'||fund.title_en||'(No: '||fund.fund_id||')'
from fund left join mdfund on fund.id=mdfund.fid where mdfund.uuid=d.uuid order by mdfund.place),'\n'::text) as fund,
doi.doi as datadoi,doi.author_en,doi.publisher_en,doi.title_en
from dataorder d right join en.metadata m on d.uuid=m.uuid left join datadoi doi on doi.uuid=d.uuid
where d.status=$statu and d.userid=? order by d.ts_created desc
";
$rows = $this->db->fetchAll($sql,array($uid));
return $rows;
}
//确认申请
public function commitApplicationForm($offlineappid)
{
$user = view::User();
if($user === false)
{
return false;
}
$uid = $user->id;
$results = $this->events()->trigger('order.pdfNumCheck', $this, compact('uid'));
$data = $results->bottom();
if($data !== true)
{
return $data;
}
$sql = "update dataorder set status=3 where status=2 and userid=$uid and offlineappid=$offlineappid";
if($this->db->exec($sql) < 0)
{
return "Could not update the status of the your shopping cart, please retry.";
}
$sql = "UPDATE offlineapp SET status=3 WHERE id=$offlineappid ";
if($this->db->exec($sql) < 0)
{
return "Error exist when update the status of the shopping card, please contact our service group by email.";
}
$data = array(
"user" => empty($user->realname) ? $user->username : $user->realname,
"link"=> view::getHostLink() . '/admin/down/offlineapp/ac/view/offlineappid/'.$offlineappid
);
$mail = new Mail();
$mail->loadTemplate("offline-pdf-commited-en",$data);
$mail->setDefaultTo();
$mail->send();
return true;
}//确认申请
//service_type 选择
public function serviceTypeTest($type)
{
if(empty($type) || !is_numeric($type))
{
return false;
}
switch($type)
{
case 0:
return "This data is online.";
break;
case 1:
return "This data has subset.";
break;
case 2:
return "This data has multiple subsets.";
break;
case 3:
return "";
break;
case 4:
return "";
break;
case 5:
return "";
break;
case 6:
return "";
break;
}
return false;
}//serviceTypeTest
}