Set.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  1. <?php
  2. namespace Cash\Lib;
  3. use Dever;
  4. class Set
  5. {
  6. public function info($audit_type, $audit)
  7. {
  8. $config = Dever::db('cash/order')->config;
  9. return $config['config_audit_type'][$audit_type] . $config['config_audit'][$audit];
  10. }
  11. public function statDate($type, $day)
  12. {
  13. if ($type == 1) {
  14. $string = 'Y年m月';
  15. } elseif ($type == 2) {
  16. $string = 'Y年W周';
  17. } else {
  18. $string = 'Y年m月d日';
  19. }
  20. return date($string, $day);
  21. }
  22. public function statYes($info, $type)
  23. {
  24. $table = 'cash/' . $type;
  25. $info = is_array($info) ? $info : Dever::db($table)->one($info);
  26. $other = Dever::db($type . '/info')->find($info[$type . '_id']);
  27. if ($type == 'store') {
  28. return $this->statDate($info['type'], $info['day']) . '与'.$other['name'].'对账单数量是否正确<br />对账数量' . $info['num'] . '个';
  29. }
  30. return $this->statDate($info['type'], $info['day']) . '与'.$other['name'].'对账单款项是否正确<br />对账金额¥' . $info['cash'] . '元';
  31. }
  32. public function statTime($start, $end)
  33. {
  34. return date('Y-m-d', $start) . ' ~ ' . date('Y-m-d', $end);
  35. }
  36. public function orderUpdate($id, $name, $data)
  37. {
  38. Dever::config('base')->hook = true;
  39. $update = array();
  40. $audit = Dever::param('audit', $data);
  41. $info = Dever::db('cash/order')->one($id);
  42. if ($audit > 1 && $info['refund_id'] && $info['refund_id'] > 0) {
  43. Dever::load('shop/lib/refund')->set('buy')->action($info['refund_id'], $audit, false, false);
  44. if ($audit == 2) {
  45. $state = Dever::db('cash/order')->update(array('where_id' => $id, 'status' => 2, 'operdate' => time(), 'fdate' => time()));
  46. $order = Dever::db('shop/buy_order')->find(array('id' => $info['source_order_id'], 'cache' => false));
  47. if ($state && $info['jstype'] == 2 && isset($order['status']) && $order['status'] == 8) {
  48. # 如果是退款结算,同时要把主订单也结算
  49. $where = array();
  50. $where['source_order_id'] = $order['id'];
  51. $where['jstype'] = 1;
  52. $where['audit'] = 1;
  53. $info = Dever::db('cash/order')->find($where);
  54. if ($info) {
  55. $set['status'] = 2;
  56. $set['audit'] = 2;
  57. $set['where_id'] = $info['id'];
  58. $set['operdate'] = time();
  59. $set['fdate'] = time();
  60. Dever::db('cash/order')->update($set);
  61. }
  62. }
  63. }
  64. }
  65. }
  66. # 审核对账
  67. public function audit_api()
  68. {
  69. $id = Dever::input('id');
  70. $type = Dever::input('type', 'shop');
  71. $table = 'cash/' . $type;
  72. $info = Dever::db($table)->one($id);
  73. if ($info) {
  74. Dever::db($table)->update(array('where_id' => $id, 'status' => 2));
  75. }
  76. return 'reload';
  77. }
  78. # 审核对账
  79. public function audit_other_api()
  80. {
  81. $id = Dever::input('id');
  82. $type = Dever::input('type', 'shop');
  83. $table = 'cash/' . $type;
  84. $info = Dever::db($table)->one($id);
  85. if ($info) {
  86. Dever::db($table)->update(array('where_id' => $id, $type . '_status' => 2));
  87. }
  88. return 'reload';
  89. }
  90. # 查看对账单详情
  91. public function view_api()
  92. {
  93. $id = Dever::input('id');
  94. if (!$id) {
  95. return false;
  96. }
  97. $show = Dever::input('show', 1);
  98. $type = Dever::input('type', 'shop');
  99. if ($type == 'shop') {
  100. $search_option_type = 1;
  101. $name = '门店';
  102. } elseif ($type == 'store') {
  103. $search_option_type = 3;
  104. $name = '仓库';
  105. } elseif ($type == 'factory') {
  106. $search_option_type = 2;
  107. $name = '工厂';
  108. }
  109. $table = 'cash/' . $type;
  110. $config = Dever::db($table)->config;
  111. $info = Dever::db($table)->one($id);
  112. $status = $config['config_status'][$info['status']];
  113. $other_status = $config['config_status'][$info[$type . '_status']];
  114. $other = Dever::db($type . '/info')->find($info[$type . '_id']);
  115. $html = '<div class="layui-col-md12"><div class="layui-card"><div class="layui-card-header">对账单详情</div><div class="layui-card-body">';
  116. $html .= '<table class="layui-table"><tbody>';
  117. $html .= '<tr>
  118. <td width="100">对账'.$name.'</td>
  119. <td>'.$this->table(false, array(array($other['name']))).'</td>
  120. </tr>';
  121. $html .= '<tr>
  122. <td width="80">对账时间</td>
  123. <td>'.$this->table(false, array(array($this->statDate($info['type'], $info['day'])))).'</td>
  124. </tr>';
  125. $html .= '<tr>
  126. <td width="80">对账周期</td>
  127. <td>'.$this->table(false, array(array($this->statTime($info['start'], $info['end'])))).'</td>
  128. </tr>';
  129. $html .= '<tr>
  130. <td width="80">对账金额</td>
  131. <td>'.$this->table(false, array(array('¥' . round($info['cash'], 2)))).'</td>
  132. </tr>';
  133. if ($type == 'store') {
  134. $html .= '<tr>
  135. <td width="80">商品数量</td>
  136. <td>'.$this->table(false, array(array($info['num']))).'</td>
  137. </tr>';
  138. }
  139. if ($show == 1) {
  140. $html .= '<tr>
  141. <td width="80">'.$name.'对账状态</td>
  142. <td>'.$this->table(false, array(array($other_status))).'</td>
  143. </tr>';
  144. $html .= '<tr>
  145. <td width="100">平台对账状态</td>
  146. <td>'.$this->table(false, array(array($status))).'</td>
  147. </tr>';
  148. } else {
  149. $html .= '<tr>
  150. <td width="80">对账状态</td>
  151. <td>'.$this->table(false, array(array($other_status))).'</td>
  152. </tr>';
  153. }
  154. $button = array();
  155. if ($show == 1) {
  156. if ($info['status'] == 1) {
  157. $url = Dever::url('lib/set.audit&id='.$id.'&type=' . $type, 'cash');
  158. $button[] = '<button class="layui-btn layui-btn-primary" onclick="load(\''.$url.'\', \''.$this->statYes($info, $type).'\', \'请确认\')">立即确认</button>';
  159. }
  160. $config['phone'] = '联系人:' . $other['truename'] . ',联系电话:' . $other['mobile'];
  161. $button[] = '<button class="layui-btn layui-btn-primary" onclick="showAlert(\''.$config['phone'].'\')">联系'.$name.'</button>';
  162. $start = date('Y-m-d H:i:s', $info['start']);
  163. $end = date('Y-m-d H:i:s', $info['end']);
  164. $out = Dever::url('lib/set.excel?id=' . $info['id'] . '&type=' . $type, 'cash');
  165. $button[] = '<a class="layui-btn layui-btn-primary" href="'.$out.'">导出对账单</a>';
  166. } elseif ($show == 2) {
  167. if ($info[$type . '_status'] == 1 && $show != 1) {
  168. $url = Dever::url('lib/set.audit_other&id='.$id.'&type=' . $type, 'cash');
  169. $button[] = '<button class="layui-btn layui-btn-primary" onclick="load(\''.$url.'\', \''.$this->statYes($info, $type).'\', \'请确认\')">立即确认</button>';
  170. }
  171. $config = Dever::load('factory/admin/auth.config');
  172. $config['phone'] = '联系电话:' . $config['dz_phone'];
  173. $button[] = '<button class="layui-btn layui-btn-primary" onclick="showAlert(\''.$config['phone'].'\')">联系对账专员</button>';
  174. $print = Dever::url('admin/stat.print?id=' . $info['id'] . '&type=' . $type, $type);
  175. $button[] = '<a class="layui-btn layui-btn-primary" href="'.$print.'" target="_blank">打印对账单</a>';
  176. }
  177. $html .= '<tr>
  178. <td>功能按钮</td>
  179. <td>'.$this->table(false, array($button)).'</td>
  180. </tr>';
  181. $html .= '</tbody></table></div></div>';
  182. $data = $this->getOrderData($type, $info, '');
  183. if ($data) {
  184. $body = array();
  185. $config = Dever::db('cash/order')->config;
  186. foreach ($data as $k => $v) {
  187. $cdate = date('Y-m-d H:i', $v['cdate']);
  188. $fdate = $v['fdate'] ? date('Y-m-d H:i', $v['fdate']) : '';
  189. $operdate = $v['operdate'] ? date('Y-m-d H:i', $v['operdate']) : '';
  190. $noprice = 2;
  191. if ($type == 'factory') {
  192. $set_type = 2;
  193. $cash = '¥' . round($v['p_cash'], 2);
  194. } else {
  195. $cash = '¥' . round($v['cash'], 2);
  196. $set_type = 1;
  197. }
  198. if ($show == 1) {
  199. $url = Dever::url('project/database/list?project=shop&table=buy_order_goods&order_id='.$v['source_order_id'].'&page_type=1&noprice=' . $noprice . '&type=' . $set_type, 'manage');
  200. $v['source_order_num'] = '<a href="'.$url.'" style="color:blue">'.$v['source_order_num'].'</a>';
  201. $head = array('结算单号', '订货单号', '结算类型', '下单日期', '完成日期', '结算日期', '对账金额');
  202. if ($type == 'store') {
  203. $head[] = '商品数量';
  204. }
  205. $head[] = '结算状态';
  206. $d = array
  207. (
  208. $v['order_num'],
  209. $v['source_order_num'],
  210. $config['config_jstype'][$v['jstype']],
  211. $cdate,
  212. $fdate,
  213. $operdate,
  214. $cash,
  215. );
  216. if ($type == 'store') {
  217. $d[] = $v['num'];
  218. }
  219. $d[] = '已入账';
  220. $body[] = $d;
  221. } else {
  222. $head = array('订货单号', '下单日期', '完成日期', '对账金额');
  223. if ($type == 'store') {
  224. $head[] = '商品数量';
  225. }
  226. $head[] = '状态';
  227. $d = array
  228. (
  229. $v['source_order_num'],
  230. $cdate,
  231. $fdate,
  232. $cash,
  233. );
  234. if ($type == 'store') {
  235. $d[] = $v['num'];
  236. }
  237. $d[] = '已入账';
  238. $body[] = $d;
  239. }
  240. }
  241. $page = Dever::page("current");
  242. $html .= '<div class="layui-card"><div class="layui-card-header">对账清单</div><div class="layui-card-body" style="max-heights: 500px;overflow: auto;">' . $this->table($head, $body) . $page . '</div></div>';
  243. }
  244. $html .= '</div>';
  245. return '<div class="layui-card-body">' . $html . '</div>';
  246. }
  247. private function table($head, $data)
  248. {
  249. $html = '';
  250. if ($head) {
  251. $html = '<table class="layui-table">';
  252. $html .= '<thead><tr>';
  253. foreach ($head as $k => $v) {
  254. $html .= '<th>'.$v.'</th>';
  255. }
  256. $html .= '</tr></thead>';
  257. $html .= '<tbody>';
  258. foreach ($data as $k => $v) {
  259. $html .= '<tr>';
  260. foreach ($v as $k1 => $v1) {
  261. $html .= '<td>'.$v1.'</td>';
  262. }
  263. $html .= '</tr>';
  264. }
  265. $html .= '</tbody>';
  266. $html .= '</table>';
  267. } else {
  268. foreach ($data as $k => $v) {
  269. $html .= '';
  270. foreach ($v as $k1 => $v1) {
  271. $html .= $v1 . '&nbsp;&nbsp;&nbsp;&nbsp;';
  272. }
  273. $html .= '';
  274. }
  275. }
  276. return $html;
  277. }
  278. # 导出对账单
  279. public function excel_api()
  280. {
  281. $type = Dever::input('type');
  282. $id = Dever::input('id');
  283. $table = 'cash/' . $type;
  284. $config = Dever::db($table)->config;
  285. $info = Dever::db($table)->one($id);
  286. $data = $this->getOrderData($type, $info);
  287. $stat_type = Dever::db('cash/shop')->config['config_type'];
  288. $other = Dever::db($type . '/info')->find($id);
  289. $status = $config['config_status'][$info['status']];
  290. $other_status = $config['config_status'][$info[$type . '_status']];
  291. $info['name'] = Dever::load('cash/lib/set')->statDate($stat_type, $info['day']);
  292. $info['status_name'] = $status;
  293. $file = $other['name'] . '的' . $info['name'] . '对账单';
  294. $header = $body = array();
  295. $header = array
  296. (
  297. 'top' => array
  298. (
  299. $file . ' ' . $info['status_name'] . ' 对账金额¥' . $info['cash']. ' 商品数量¥' . $info['num'],
  300. ),
  301. '结算单号',
  302. '订货单号',
  303. '结算类型',
  304. '下单日期',
  305. '完成日期',
  306. '结算日期',
  307. '对账金额',
  308. );
  309. if ($type == 'store') {
  310. $head[] = '商品数量';
  311. }
  312. $head[] = '结算状态';
  313. if ($data) {
  314. $body = array();
  315. foreach ($data as $k => $v) {
  316. $cdate = date('Y-m-d H:i', $v['cdate']);
  317. $fdate = $v['fdate'] ? date('Y-m-d H:i', $v['fdate']) : '';
  318. $operdate = $v['operdate'] ? date('Y-m-d H:i', $v['operdate']) : '';
  319. if ($type == 'factory') {
  320. $cash = '¥' . round($v['p_cash'], 2);
  321. } else {
  322. $cash = '¥' . round($v['cash'], 2);
  323. }
  324. $jstype = Dever::db('cash/order')->config['config_jstype'][$v['jstype']];
  325. $body[$k][0] = $v['order_num'];
  326. $body[$k][1] = $v['source_order_num'];
  327. $body[$k][2] = $jstype;
  328. $body[$k][3] = $cdate;
  329. $body[$k][4] = $operdate;
  330. $body[$k][5] = $fdate;
  331. $body[$k][6] = $cash;
  332. if ($type == 'store') {
  333. $body[$k][] = $v['num'];
  334. }
  335. $body[$k][] = '已入账';
  336. }
  337. }
  338. Dever::excelExport($body, $header, $file);
  339. }
  340. # 打印订单单
  341. public function printer($user)
  342. {
  343. $id = Dever::input('id');
  344. if (!$id) {
  345. return false;
  346. }
  347. $type = Dever::input('type', 'shop');
  348. if ($type == 'shop') {
  349. $name = '门店';
  350. } elseif ($type == 'store') {
  351. $name = '仓库';
  352. } elseif ($type == 'factory') {
  353. $name = '工厂';
  354. }
  355. $table = 'cash/' . $type;
  356. $config = Dever::db($table)->config;
  357. $info = Dever::db($table)->one($id);
  358. $status = $config['config_status'][$info['status']];
  359. $other_status = $config['config_status'][$info[$type . '_status']];
  360. $other = Dever::db($type . '/info')->find($info[$type . '_id']);
  361. $member = Dever::db($type . '/member')->find($user['id']);
  362. $factory_config = Dever::db('main/factory_config')->find();
  363. $main_config = Dever::db('main/config')->find();
  364. $pdf = Dever::load('pdf/lib/base')->init();
  365. $pdf->hr('-', $other['name']);
  366. $pdf->br()->font(20)->center('对账周期:' . $this->statTime($info['start'], $info['end']));
  367. $pdf->font(10);
  368. $pdf->br();
  369. $pdf->br()->left('对账日期:' . $this->statDate($info['type'], $info['day']), 80)->left('制单人:' . $member['name'], 60)->left('制单时间:' . date('Y-m-d H:i'), 40);
  370. $pdf->hr();
  371. $data = $this->getOrderData($type, $info);
  372. $body = array();
  373. $body_total = array();
  374. $body_total['cash'] = 0;
  375. $body_total['num'] = 0;
  376. if ($data) {
  377. foreach ($data as $k => $v) {
  378. $cdate = date('Y-m-d H:i', $v['cdate']);
  379. $fdate = $v['fdate'] ? date('Y-m-d H:i', $v['fdate']) : '';
  380. $operdate = $v['operdate'] ? date('Y-m-d H:i', $v['operdate']) : '';
  381. $prefix = '¥';
  382. if ($type == 'store') {
  383. $cash = $v['num'];
  384. $prefix = '';
  385. } elseif ($type == 'factory') {
  386. $cash = $v['p_cash'];
  387. } else {
  388. $cash = $v['cash'];
  389. }
  390. $cash = round($cash, 2);
  391. $body[] = array
  392. (
  393. $v['source_order_num'],
  394. $cdate,
  395. $fdate,
  396. $prefix . $cash,
  397. '已入账'
  398. );
  399. $body_total['cash'] += $cash;
  400. $body_total['num'] += 1;
  401. }
  402. }
  403. $head = array(array('订单号', 60), array('下单日期', 43), array('完成日期', 43), array('对账金额', 30), array('状态', 20));
  404. if ($type == 'store') {
  405. $head[3][0] = '对账数量';
  406. }
  407. if ($body) {
  408. $pdf->br();
  409. foreach ($head as $k => $v) {
  410. $pdf->left($v[0], $v[1]);
  411. }
  412. foreach ($body as $k => $v) {
  413. $pdf->br();
  414. foreach ($head as $k1 => $v1) {
  415. $pdf->left($v[$k1], $v1[1]);
  416. }
  417. }
  418. $pdf->br();
  419. if ($type == 'store') {
  420. $pdf->right('共'.$body_total['num'].'个订单,合计对账数量' . $body_total['cash'] . '个');
  421. } else {
  422. $pdf->right('共'.$body_total['num'].'个订单,合计对账金额¥' . $body_total['cash'] . '元');
  423. }
  424. $pdf->hr();
  425. }
  426. $pdf->br(1);
  427. //$pdf->SetY(-100);
  428. $pdf->right('如遇任何问题请致电客服');
  429. $pdf->br();
  430. $pdf->font(20);
  431. $pdf->left($main_config['name'], 160);
  432. $pdf->font(10);
  433. $pdf->right('电话:' . $factory_config['phone'], 30);
  434. $pdf->br();
  435. $pdf->left($main_config['site'], 160);
  436. $pdf->font(10);
  437. $pdf->right($main_config['worktime'], 30);
  438. $pdf->out('对账单');
  439. }
  440. # 获取对账单数据
  441. public function getOrderData($type, $info, $page = 'NoPage')
  442. {
  443. $id = $info[$type . '_id'];;
  444. if ($type == 'shop') {
  445. $where['type'] = 1;
  446. $where['type_id'] = $id;
  447. $m = 'getAll';
  448. } elseif ($type == 'factory') {
  449. $where['source_type'] = 3;
  450. $where['source_id'] = $id;
  451. $m = 'getAll';
  452. } else {
  453. $where['type'] = 2;
  454. $where['type_id'] = $id;
  455. $where['source_type'] = 2;
  456. $where['source_id'] = $id;
  457. $m = 'getAllByStore';
  458. }
  459. $m .= $page;
  460. $where['status'] = 2;
  461. $where['start'] = $info['start'];
  462. $where['end'] = $info['end'];
  463. return Dever::db('cash/order')->$m($where);
  464. }
  465. }