Money.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457
  1. <?php
  2. namespace app\admin\controller\money;
  3. use app\admin\model\institution\Institution;
  4. use app\common\controller\Backend;
  5. use think\Db;
  6. use think\Exception;
  7. use think\exception\DbException;
  8. use think\Session;
  9. use Mpdf;
  10. /**
  11. * @icon fa fa-circle-o
  12. */
  13. class Money extends Backend
  14. {
  15. /**
  16. * Money模型对象
  17. * @var \app\admin\model\money\Money
  18. */
  19. protected $model = null;
  20. protected $bill = null;
  21. protected $order_status = [
  22. 'DEFAULT' => 1 ,
  23. 'PROCESSING' => 2 ,
  24. 'COMPLETED' => 3
  25. ];
  26. public function _initialize()
  27. {
  28. parent::_initialize();
  29. $this->model = new \app\admin\model\money\Money;
  30. $this->bill = new \app\admin\model\money\Bill();
  31. }
  32. /**
  33. * 查看
  34. */
  35. public function index()
  36. {
  37. //设置过滤方法
  38. $this->request->filter(['strip_tags']);
  39. if ($this->request->isAjax()) {
  40. //如果发送的来源是Selectpage,则转发到Selectpage
  41. if ($this->request->request('keyField')) {
  42. return $this->selectpage();
  43. }
  44. list($where , $sort , $order , $offset , $limit) = $this->buildparams();
  45. $more_where = [
  46. 'order_status' => 1,
  47. 'type' => 2
  48. ];
  49. $total = $this->model
  50. ->where($where)
  51. ->where($more_where)
  52. ->order($sort , $order)
  53. ->count();
  54. $list = $this->model
  55. ->where($where)
  56. ->where($more_where)
  57. ->order($sort , $order)
  58. ->limit($offset , $limit)
  59. ->select();
  60. $list = collection($list)->toArray();
  61. $result = array (
  62. "total" => $total ,
  63. "rows" => $list
  64. );
  65. return json($result);
  66. }
  67. return $this->view->fetch();
  68. }
  69. /**
  70. * 生成账单
  71. * @param $disable $ids
  72. * @throws DbException
  73. * @throws Exception
  74. */
  75. public function makePaymentOrder($disable = false)
  76. {
  77. $params = $this->request->param();
  78. $ids = $params['ids'];
  79. $moneys = $this->model->whereIn('id' , $ids)->select();
  80. $ins_id = array_unique(array_column($moneys , 'institution_id'));
  81. if (count($ins_id) != 1) {
  82. $this->error('选择错误');
  83. }
  84. $ins_data = Institution::where('id' , $ins_id[0])->find();
  85. if ($this->request->isPost()) {
  86. $admin = Session::get('admin');
  87. // 提交缴费单
  88. $order_num = $this->makeOrderNum();
  89. Db::startTrans();
  90. try {
  91. $this->bill->insert([
  92. 'order_num' => $order_num ,
  93. 'institution_id' => $ins_data['id'] ,
  94. 'institution_name' => $ins_data['name'] ,
  95. 'water_ids' => implode(',' , $ids) ,
  96. 'create_user_id' => $admin['id'] ,
  97. 'create_user_name' => $admin['nickname'],
  98. 'remark' => $params['remark']
  99. ]);
  100. $res = $this->model
  101. ->whereIn('id', $ids)
  102. ->update(['order_status' => $this->order_status['PROCESSING']]);
  103. if(!$res){
  104. Db::rollback();
  105. $this->error('修改流水状态失败');
  106. }
  107. Db::commit();
  108. $this->success('成功!单号为:'. $order_num);
  109. } catch (Exception $e){
  110. Db::rollback();
  111. $this->error($e->getMessage());
  112. }
  113. }
  114. // 预览缴费单
  115. $data = [
  116. '1' => [
  117. 'ZS' => 0 ,
  118. 'TK' => 0 ,
  119. 'HZZF' => 0 ,
  120. 'YYTG' => 0 ,
  121. 'YYDS' => 0 ,
  122. ] ,
  123. '2' => [
  124. 'ZS' => 0 ,
  125. 'TK' => 0 ,
  126. 'HZZF' => 0 ,
  127. 'YYTG' => 0 ,
  128. 'YYDS' => 0 ,
  129. ]
  130. ];
  131. $total = 0;
  132. foreach ($moneys as $val) {
  133. $data[$val['type']]['ZS']++;
  134. $money = $val['money'] / 100;
  135. if ($val['pay_type'] == '1') {
  136. $total += $money;
  137. switch ($val['order_type']) {
  138. case '1':
  139. $data[$val['type']]['HZZF'] += $money;
  140. break;
  141. case '2':
  142. $data[$val['type']]['YYTG'] += $money;
  143. break;
  144. case '3':
  145. $data[$val['type']]['YYDS'] += $money;
  146. break;
  147. }
  148. } else {
  149. $data[$val['type']]['TK'] += $money;
  150. }
  151. }
  152. $this->view->disable = $disable;
  153. $this->view->result = $data;
  154. $this->view->total = $total;
  155. $this->view->institution = $ins_data;
  156. $html = $this->view->fetch();
  157. $this->success('ok' , '' , $html);
  158. }
  159. public function downOrder($id)
  160. {
  161. $params = $this->request->param();
  162. $ids = $this->bill->where('id',$id)->value('water_ids');
  163. $moneys = $this->model->whereIn('id' , $ids)->select();
  164. $ins_id = array_unique(array_column($moneys , 'institution_id'));
  165. if (count($ins_id) != 1) {
  166. $this->error('选择错误');
  167. }
  168. $ins_data = Institution::where('id' , $ins_id[0])->find();
  169. if ($this->request->isPost()) {
  170. $admin = Session::get('admin');
  171. // 提交缴费单
  172. $order_num = $this->makeOrderNum();
  173. Db::startTrans();
  174. try {
  175. $this->bill->insert([
  176. 'order_num' => $order_num ,
  177. 'institution_id' => $ins_data['id'] ,
  178. 'institution_name' => $ins_data['name'] ,
  179. 'water_ids' => implode(',' , $ids) ,
  180. 'create_user_id' => $admin['id'] ,
  181. 'create_user_name' => $admin['nickname'],
  182. 'remark' => $params['remark']
  183. ]);
  184. $res = $this->model
  185. ->whereIn('id', $ids)
  186. ->update(['order_status' => $this->order_status['PROCESSING']]);
  187. if(!$res){
  188. Db::rollback();
  189. $this->error('修改流水状态失败');
  190. }
  191. Db::commit();
  192. $this->success('成功!单号为:'. $order_num);
  193. } catch (Exception $e){
  194. Db::rollback();
  195. $this->error($e->getMessage());
  196. }
  197. }
  198. // 预览缴费单
  199. $data = [
  200. '1' => [
  201. 'ZS' => 0 ,
  202. 'TK' => 0 ,
  203. 'HZZF' => 0 ,
  204. 'YYTG' => 0 ,
  205. 'YYDS' => 0 ,
  206. ] ,
  207. '2' => [
  208. 'ZS' => 0 ,
  209. 'TK' => 0 ,
  210. 'HZZF' => 0 ,
  211. 'YYTG' => 0 ,
  212. 'YYDS' => 0 ,
  213. ]
  214. ];
  215. $total = 0;
  216. foreach ($moneys as $val) {
  217. $data[$val['type']]['ZS']++;
  218. $money = $val['money'] / 100;
  219. if ($val['pay_type'] == '1') {
  220. $total += $money;
  221. switch ($val['order_type']) {
  222. case '1':
  223. $data[$val['type']]['HZZF'] += $money;
  224. break;
  225. case '2':
  226. $data[$val['type']]['YYTG'] += $money;
  227. break;
  228. case '3':
  229. $data[$val['type']]['YYDS'] += $money;
  230. break;
  231. }
  232. } else {
  233. $data[$val['type']]['TK'] += $money;
  234. }
  235. }
  236. $this->view->disable = true;
  237. $this->view->result = $data;
  238. $this->view->total = $total;
  239. $this->view->institution = $ins_data;
  240. $html = $this->makeHtml($ins_data,$data,$total);
  241. $this->htmlToPdf($html);
  242. // $this->word($html);
  243. }
  244. public function makeHtml($ins_data,$data,$total)
  245. {
  246. $html = '<style>
  247. .JF-content{
  248. padding-left: 50px;
  249. }
  250. .JF-content .NR{
  251. font-size: 14px;
  252. float: left;
  253. width: 100%;
  254. }
  255. .JF-content .NR .val{
  256. float: left;
  257. width: 8%;
  258. font-weight: bold;
  259. }
  260. .JF-content .NR .text{
  261. float: left;
  262. width: 15%;
  263. }
  264. .JF-content .NR .unit{
  265. float: left;
  266. width: 77%;
  267. font-style: italic;
  268. color: grey;
  269. }
  270. </style>
  271. <div class="JFD">
  272. <h3 style="padding: 0 50px;">'.$ins_data['name'].'</h3>
  273. <hr>
  274. <div class="JF-content">
  275. <div class="NR">
  276. <div class="text">检查共计 : '.$data[2]['ZS'].' 个( '.($ins_data['film_price']/100).' 元 / 个 )</div>
  277. </div>
  278. <div class="NR">
  279. <div class="text">患者支付 : '.$data[2]['HZZF'].' RMB</div>
  280. </div>
  281. <div class="NR">
  282. <div class="text">医院托管 : '.$data[2]['YYTG'].' RMB</div>
  283. </div>
  284. <div class="NR">
  285. <div class="text">医院代收 : '.$data[2]['YYDS'].' RMB</div>
  286. </div>
  287. <div class="NR">
  288. <hr>
  289. </div>
  290. <div class="NR">
  291. <div class="text">远程诊断共计 : '.$data[1]['ZS'].' 个</div>
  292. </div>
  293. <div class="NR">
  294. <div class="text">患者支付 : '.$data[1]['HZZF'].' RMB</div>
  295. </div>
  296. <div class="NR">
  297. <div class="text">退款 : '.$data[1]['TK'].' RMB</div>
  298. </div>
  299. <div class="NR">
  300. <div class="text">医院托管 : '.$data[1]['YYTG'].' RMB</div>
  301. </div>
  302. <div class="NR">
  303. <div class="text">医院代收 : '.$data[1]['YYDS'].' RMB</div>
  304. </div>
  305. <div class="NR">
  306. <hr>
  307. </div>
  308. <div class="NR">
  309. <div class="text" style="width: 10%;">共计 : '.$total.' RMB</div>
  310. </div>
  311. </div>
  312. </div>';
  313. return $html;
  314. }
  315. public function word($html)
  316. {
  317. $data = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40">'.$html.'</html>';
  318. $dir = "../public/word/";
  319. if(!file_exists($dir)) mkdir($dir,777,true);
  320. $name = date('His').'.doc';
  321. $fileName=$dir.$name;
  322. $writefile = fopen($fileName,'wb') or die("创建文件失败"); //wb以二进制写入
  323. fwrite($writefile,$data);
  324. fclose($writefile);
  325. $this->down($name);
  326. return '';
  327. }
  328. public function htmlToPdf($html='',$title="对账单",$fileName="bill"){
  329. require_once ROOT_PATH.'vendor/autoload.php';
  330. require_once ROOT_PATH.'/vendor/tecnickcom/tcpdf/tcpdf.php';
  331. $pdf=new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  332. // 设置打印模式
  333. //设置文件信息,头部的信息设置
  334. $pdf->SetCreator(PDF_CREATOR);
  335. $pdf->SetAuthor("");
  336. $pdf->SetTitle($title);
  337. $pdf->SetSubject('TCPDF Tutorial');
  338. $pdf->SetKeywords('TCPDF, PDF, example, test, guide');//设置关键字
  339. // 是否显示页眉
  340. $pdf->setPrintHeader(false);
  341. // 设置页眉显示的内容
  342. $pdf->SetHeaderData('logo.png', 60, 'owndraw.com', '', array(0,64,255), array(0,64,128));
  343. // 设置页眉字体
  344. $pdf->setHeaderFont(Array('deja2vusans', '', '12'));
  345. // 页眉距离顶部的距离
  346. $pdf->SetHeaderMargin('5');
  347. // 是否显示页脚
  348. $pdf->setPrintFooter(true);
  349. // 设置页脚显示的内容
  350. $pdf->setFooterData(array(0,64,0), array(0,64,128));
  351. // 设置页脚的字体
  352. $pdf->setFooterFont(Array('dejavusans', '', '10'));
  353. // 设置页脚距离底部的距离
  354. $pdf->SetFooterMargin('10');
  355. // 设置默认等宽字体
  356. $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
  357. // 设置行高
  358. $pdf->setCellHeightRatio(1);
  359. // 设置左、上、右的间距
  360. $pdf->SetMargins('10', '10', '10');
  361. // 设置是否自动分页 距离底部多少距离时分页
  362. $pdf->SetAutoPageBreak(TRUE, '15');
  363. // 设置图像比例因子
  364. $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  365. $pdf->setFontSubsetting(true);
  366. $pdf->AddPage("A4","Landscape",true,true);
  367. // 设置字体
  368. $pdf->SetFont('stsongstdlight', '', 14, '', true);
  369. $pdf->writeHTML($html);//HTML生成PDF
  370. //$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true);
  371. $showType= 'D';//PDF输出的方式。I,在浏览器中打开;D,以文件形式下载;F,保存到服务器中;S,以字符串形式输出;E:以邮件的附件输出。
  372. ob_end_clean();
  373. $path=ROOT_PATH.'public/template/pdf/';
  374. //判断保存目录是否存在,不存在则进行建立
  375. if(!is_dir($path)){
  376. mkdir($path,'0777',true);
  377. }
  378. $pdf->Output($fileName.".pdf", $showType);
  379. }
  380. public function down($fileName)
  381. {
  382. $file_name = $fileName; // 下载文件名
  383. $file_dir = ROOT_PATH."public/word/"; // 下载文件存放目录
  384. // 检查文件是否存在
  385. if (!file_exists($file_dir . $file_name)) {
  386. header('HTTP/1.1 404 NOT FOUND');
  387. } else {
  388. // 以只读和二进制模式打开文件
  389. $file = fopen($file_dir . $file_name, "rb");
  390. // 告诉浏览器这是一个文件流格式的文件
  391. Header("Content-type: application/octet-stream");
  392. // 请求范围的度量单位
  393. Header("Accept-Ranges: bytes");
  394. // Content-Length是指定包含于请求或响应中数据的字节长度
  395. Header("Accept-Length: " . filesize($file_dir . $file_name));
  396. // 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
  397. Header("Content-Disposition: attachment; filename=" . $file_name);
  398. // 读取文件内容并直接输出到浏览器
  399. echo fread($file, filesize($file_dir . $file_name));
  400. fclose($file);
  401. exit ();
  402. }
  403. }
  404. /**
  405. * 生成订单号
  406. * @return string
  407. */
  408. protected function makeOrderNum()
  409. {
  410. $count = (int) $this->bill
  411. ->whereTime('createdAt','today')
  412. ->count();
  413. return 'BILL' . date('Ymd') . str_pad($count+1,4,0,STR_PAD_LEFT);
  414. }
  415. }