Export.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <?php
  2. /**
  3. +-----------------------------------------------------------------------------------------------
  4. * GouGuOPEN [ 左手研发,右手开源,未来可期!]
  5. +-----------------------------------------------------------------------------------------------
  6. * @Copyright (c) 2021~2025 http://www.gouguoa.com All rights reserved.
  7. +-----------------------------------------------------------------------------------------------
  8. * @Licensed 勾股OA,开源且可免费使用,但并不是自由软件,未经授权许可不能去除勾股OA的相关版权信息
  9. +-----------------------------------------------------------------------------------------------
  10. * @Author 勾股工作室 <hdm58@qq.com>
  11. +-----------------------------------------------------------------------------------------------
  12. */
  13. declare (strict_types = 1);
  14. namespace app\api\controller;
  15. use app\api\BaseController;
  16. use think\facade\Db;
  17. use think\facade\View;
  18. use Mpdf\Mpdf;
  19. use PhpOffice\PhpWord\TemplateProcessor;
  20. use app\adm\model\MeetingRecords;
  21. use app\adm\model\MeetingOrder;
  22. use app\home\model\Leaves;
  23. use app\home\model\Trips;
  24. use app\home\model\Outs;
  25. use app\adm\model\Seal;
  26. use app\user\model\PersonalQuit;
  27. use app\user\model\DepartmentChange;
  28. use app\user\model\Talent;
  29. use app\adm\model\OfficialDocs;
  30. use app\finance\model\Loan;
  31. use app\finance\model\Expense;
  32. use app\finance\model\Invoice;
  33. use app\finance\model\Ticket;
  34. use app\contract\model\Contract;
  35. use app\contract\model\Purchase;
  36. class Export extends BaseController
  37. {
  38. public function pdf($types='',$id=0)
  39. {
  40. $name='PDF文件';
  41. $is_header=true;
  42. $check_record=true;
  43. $is_page=false;
  44. $logo = CMS_ROOT.'public/static/home/images/logo.png';
  45. //请假审批
  46. if($types=='leaves'){
  47. $model = new Leaves();
  48. $detail= $model->getById($id);
  49. $detail['types_name'] = leaves_types_name($detail['types']);
  50. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的请假审批单';
  51. }
  52. //出差审批
  53. if($types=='trips'){
  54. $model = new Trips();
  55. $detail= $model->getById($id);
  56. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的出差审批单';
  57. }
  58. //外出审批
  59. if($types=='outs'){
  60. $model = new Outs();
  61. $detail= $model->getById($id);
  62. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的外出审批单';
  63. }
  64. //加班审批
  65. if($types=='overtimes'){
  66. $model = new Outs();
  67. $detail= $model->getById($id);
  68. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的加班审批单';
  69. }
  70. //用印审批
  71. if($types=='seal'){
  72. $model = new Seal();
  73. $detail= $model->getById($id);
  74. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的用章审批单';
  75. }
  76. //离职审批
  77. if($types=='personal_quit'){
  78. $model = new PersonalQuit();
  79. $detail= $model->getById($id);
  80. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的离职审批单';
  81. }
  82. //人事调动审批单
  83. if($types=='department_change'){
  84. $model = new DepartmentChange();
  85. $detail= $model->getById($id);
  86. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的人事调动审批单';
  87. }
  88. //入职审批单
  89. if($types=='talent'){
  90. $model = new Talent();
  91. $detail= $model->getById($id);
  92. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的入职审批单';
  93. }
  94. //公文审批
  95. if($types=='official_docs'){
  96. $model = new OfficialDocs();
  97. $detail= $model->getById($id);
  98. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的公文审批单';
  99. }
  100. //借支审批
  101. if($types=='loan'){
  102. $model = new Loan();
  103. $detail= $model->getById($id);
  104. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的借支审批单';
  105. }
  106. //报销审批
  107. if($types=='expense'){
  108. $model = new Expense();
  109. $detail= $model->getById($id);
  110. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的报销审批单';
  111. }
  112. //开票回款
  113. if($types=='invoice'){
  114. $model = new Invoice();
  115. $detail= $model->getById($id);
  116. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的发票开票审批单';
  117. }
  118. //无票回款
  119. if($types=='invoicea'){
  120. $model = new Invoice();
  121. $detail= $model->getById($id);
  122. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的无发票回款审批单';
  123. }
  124. //收票付款
  125. if($types=='ticket'){
  126. $model = new Ticket();
  127. $detail= $model->getById($id);
  128. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的收票审批单';
  129. }
  130. //无发票付款单
  131. if($types=='ticketa'){
  132. $model = new Ticket();
  133. $detail= $model->getById($id);
  134. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的无发票付款审批单';
  135. }
  136. //销售合同
  137. if($types=='contract'){
  138. $model = new Contract();
  139. $detail= $model->getById($id);
  140. $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
  141. $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
  142. $detail['department'] = $detail['sign_department'];
  143. $detail['content_array'] = unserialize($detail['content']);
  144. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的销售合同审批单';
  145. }
  146. //采购合同
  147. if($types=='purchase'){
  148. $model = new Purchase();
  149. $detail= $model->getById($id);
  150. $detail['cate_title'] = Db::name('ContractCate')->where(['id' => $detail['cate_id']])->value('title');
  151. $detail['subject_title'] = Db::name('Enterprise')->where(['id' => $detail['subject_id']])->value('title');
  152. $detail['department'] = $detail['sign_department'];
  153. $detail['content_array'] = unserialize($detail['content']);
  154. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的采购合同审批单';
  155. }
  156. //会议记录
  157. if($types=='meeting'){
  158. $model = new MeetingRecords();
  159. $detail= $model->getById($id);
  160. $name = date('Ymd',$detail['meeting_date']).$detail['did_name'].'_会议纪要';
  161. $check_record=false;
  162. }
  163. //会议室预定
  164. if($types=='meeting_order'){
  165. $model = new MeetingOrder();
  166. $detail= $model->getById($id);
  167. $name = to_date($detail['create_time'],'Ymd').$detail['admin_name'].'提交的会议室预定';
  168. }
  169. //员工档案
  170. if($types=='files'){
  171. $detail = get_admin($id);
  172. $detail['pname'] = Db::name('Admin')->where('id',$detail['pid'])->value('name');
  173. $detail['position'] = Db::name('Position')->where('id',$detail['position_id'])->value('title');
  174. $detail['department'] = Db::name('Department')->where('id',$detail['did'])->value('title');
  175. $department_ids = Db::name('DepartmentAdmin')->where('admin_id',$id)->column('department_id');
  176. $department_names = Db::name('Department')->whereIn('id',$department_ids)->column('title');
  177. $detail['department_names'] = implode(',',$department_names);
  178. if($detail['file_ids'] !=''){
  179. $file_array = Db::name('File')->where('id','in',$detail['file_ids'])->select();
  180. $detail['file_array'] = $file_array;
  181. }
  182. $edu = Db::name('AdminProfiles')->where(['types'=>1,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
  183. $work = Db::name('AdminProfiles')->where(['types'=>2,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
  184. $certificate = Db::name('AdminProfiles')->where(['types'=>3,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
  185. $skills = Db::name('AdminProfiles')->where(['types'=>4,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
  186. $language = Db::name('AdminProfiles')->where(['types'=>5,'admin_id'=>$id,'delete_time'=>0])->select()->toArray();
  187. View::assign('edu', $edu);
  188. View::assign('work', $work);
  189. View::assign('skills', $skills);
  190. View::assign('certificate', $certificate);
  191. View::assign('language', $language);
  192. View::assign('detail', $detail);
  193. $name = $detail['name'].'_档案信息';
  194. $check_record=false;
  195. $is_page=true;
  196. }
  197. if($check_record){
  198. if(!empty($detail['check_copy_uids'])){
  199. $check_copy_names = Db::name('Admin')->where([['id','in',$detail['check_copy_uids']],['status','=',1]])->column('name');
  200. $detail['check_copy_names'] = implode(',',$check_copy_names);
  201. }
  202. $detail['check_status_str'] = check_status_name($detail['check_status']);
  203. //审批记录
  204. $check_table = $types;
  205. if($types=='invoicea'){
  206. $check_table = 'invoice';
  207. }
  208. if($types=='ticketa'){
  209. $check_table = 'ticket';
  210. }
  211. $check_record_array = Db::name('FlowRecord')
  212. ->field('f.*,a.name')
  213. ->alias('f')
  214. ->join('Admin a', 'a.id = f.check_uid', 'left')
  215. ->where([['f.action_id','=',$id],['f.check_table','=',$check_table],['f.delete_time','=',0],['f.step_id','>',0]])->select()->toArray();
  216. foreach ($check_record_array as $kk => &$vv) {
  217. $vv['check_time_str'] = date('Y-m-d H:i', $vv['check_time']);
  218. $vv['status_str'] = '提交';
  219. if($vv['check_status'] == 1){
  220. $vv['status_str'] = '审核通过';
  221. }
  222. else if($vv['check_status'] == 2){
  223. $vv['status_str'] = '审核拒绝';
  224. }
  225. if($vv['check_status'] == 3){
  226. $vv['status_str'] = '撤销';
  227. }
  228. if($vv['check_status'] == 4){
  229. $vv['status_str'] = '反确认';
  230. }
  231. }
  232. $detail['check_record_array'] = $check_record_array;
  233. }
  234. $detail['pdf_admin'] = Db::name('Admin')->where([['id','=',$this->uid]])->value('name');
  235. $detail['pdf_time'] = date('Y-m-d H:i:s');
  236. //var_dump($detail);exit;
  237. View::assign('detail', $detail);
  238. View::assign('logo', $logo);
  239. $html = View::fetch($types);
  240. $time = time();
  241. //tempDir指定临时文件目录,需要有可写入的权限,否则会报错
  242. $mpdf = new Mpdf([
  243. 'mode'=>'zh',//或者utf-8
  244. 'format' => 'A4',
  245. 'margin_top'=>23,
  246. 'margin_bottom'=>19,
  247. //重新定义字体路径
  248. 'fontDir' => [
  249. CMS_ROOT . "public/static/font/"
  250. ],
  251. //重新定义默认字体
  252. 'fontdata' => [
  253. "sun-exta" => [
  254. 'R' => 'MiSans-Regular.ttf', // regular font
  255. 'B' => 'MiSans-Bold.ttf', // optional: bold font
  256. 'I' => 'MiSans-Regular.ttf', // optional: italic font
  257. 'BI' => 'MiSans-Bold.ttf', // optional: bold-italic font
  258. 'useKashida' => 75,
  259. 'sip-ext' => 'MiSans-Regular.ttf', /* SIP=Plane2 Unicode (extension B) */
  260. ]
  261. ],
  262. 'tempDir' => CMS_ROOT . "public/storage/pdf/"
  263. ]);
  264. $mpdf->SetDisplayMode('fullpage');
  265. //自动分析录入内容字体
  266. $mpdf->autoScriptToLang = true;
  267. $mpdf->autoLangToFont = true;
  268. //文件名称
  269. $filename = $name."_".$time.".pdf";
  270. //文章pdf文件存储路径
  271. $path = CMS_ROOT . "public" . "/storage/pdf/".$filename;
  272. $pageNumber = count($mpdf->pages);
  273. $header= '<table width="100%" style="margin:0;padding:0"><tr>
  274. <td width="50%" style="text-align:left;font-size:12px; color:#999999;margin:0;padding:0"><img src="'.$logo.'" height="36" /></td>
  275. <td width="50%" style="text-align:right;font-size:12px; color:#999999;margin:0;padding:0">勾股OA办公系统</td>
  276. </tr></table><hr style="border-color:#f1f1f1;margin:0">';
  277. $page= '<p style="text-align:center;font-size:12px; color:#999999">第 {PAGENO}/{nbpg} 页</p>';
  278. if($is_header){
  279. $mpdf->SetHTMLHeader($header);
  280. }
  281. if($is_page){
  282. $mpdf->SetHTMLFooter($page);
  283. }
  284. //以html为标准分析写入内容
  285. $mpdf->WriteHTML($html);
  286. //直接下载文件
  287. $mpdf->Output('tmp.pdf',true);
  288. $mpdf->Output($filename,"d");
  289. exit;
  290. /*
  291. //生成磁盘文件
  292. $mpdf->Output($path);
  293. if($type==0){
  294. //下载文件
  295. if (is_file($path)){
  296. //return to_assign(0,"文件生成成功");
  297. $file = fopen($path, "rb");
  298. Header( "Content-type: application/octet-stream ");
  299. Header( "Accept-Ranges: bytes ");
  300. Header( "Content-Disposition: attachment; filename= $filename");
  301. while (!feof($file)) {
  302. echo fread($file, 8192);
  303. ob_flush();
  304. flush();
  305. }
  306. fclose($file);
  307. } else {
  308. return to_assign(1,"文件生成失败");
  309. }
  310. }
  311. */
  312. }
  313. }