Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 
 
 

923 linhas
33 KiB

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: admin
  5. * Date: 2017/5/31
  6. * Time: 16:50
  7. */
  8. namespace backend\modules\zzcs\service;
  9. use backend\modules\zzcs\models\OrderFinanceBalanceAccount;
  10. use backend\modules\zzcs\models\OrderFinanceStatus;
  11. use backend\modules\zzcs\models\BaseUser;
  12. use backend\modules\zzcs\models\OrderMain;
  13. use yii\db\Exception;
  14. use Yii;
  15. class Payment
  16. {
  17. /**
  18. * Des:获取参数
  19. * Name: getParam
  20. * @return array
  21. * @author 倪宗锋
  22. */
  23. public function getParam()
  24. {
  25. $param = array(
  26. 'date_type' => Yii::$app->request->post('date_type', ''),//时间类型
  27. 'start_date' => Yii::$app->request->post('start_date', ''),//开始时间
  28. 'end_date' => Yii::$app->request->post('end_date', ''),//接收时间
  29. 'org_id' => Yii::$app->request->post('org_id', ''),//渠道商ID
  30. 'settlement_status' => Yii::$app->request->post('settlement_status', 0),//结算状态值
  31. 'prod_type' => Yii::$app->request->post('prod_type', 0),//订单产品类型
  32. 'more_search' => Yii::$app->request->post('more_search', ''),//更多查询条件
  33. 'current_page' => Yii::$app->request->post('current_page', '1'),//当前页
  34. 'page_size' => Yii::$app->request->post('page_size', '10'),//每页展示条数
  35. );
  36. return $param;
  37. }
  38. /**
  39. * Des:获取参数
  40. * Name: getParam
  41. * @return array
  42. * @author 倪宗锋
  43. */
  44. public function getGetParam()
  45. {
  46. $param = array(
  47. 'date_type' => Yii::$app->request->get('date_type', ''),//时间类型
  48. 'start_date' => Yii::$app->request->get('start_date', ''),//开始时间
  49. 'end_date' => Yii::$app->request->get('end_date', ''),//接收时间
  50. 'org_id' => Yii::$app->request->get('org_id', ''),//渠道商ID
  51. 'settlement_status' => Yii::$app->request->get('settlement_status', 0),//结算状态值
  52. 'prod_type' => Yii::$app->request->get('prod_type', 0),//订单产品类型
  53. 'more_search' => Yii::$app->request->get('more_search', ''),//更多查询条件
  54. 'current_page' => Yii::$app->request->get('current_page', '1'),//当前页
  55. 'page_size' => Yii::$app->request->get('page_size', '10'),//每页展示条数
  56. );
  57. return $param;
  58. }
  59. public static function to_excel($file_name, $title, $fin_list)
  60. {
  61. ob_clean();
  62. $fileName = $file_name . '.csv';
  63. $fileName = iconv("utf-8", "gb2312", $fileName);
  64. header("Content-type:text/csv");
  65. header("Content-Disposition:attachment;filename=" . $fileName);
  66. header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
  67. header('Expires:0');
  68. header('Pragma:public');
  69. $data = '';
  70. foreach ($fin_list as $key => $val) {
  71. if ($key == 0) {
  72. $data .= implode(',', $title) . "\n";
  73. }
  74. $data .= '"' . implode('","', array_values($val)) . "\"\n";
  75. }
  76. $data = chr(0xEF) . chr(0xBB) . chr(0xBF) . $data;
  77. echo $data;
  78. return '';
  79. }
  80. /**
  81. * Function Description:管理页面查询条件
  82. * Function Name: getWhere
  83. * @param $param
  84. * @return array
  85. * @author 倪宗锋
  86. */
  87. public function getWhere($param)
  88. {
  89. #region 获取用户信息
  90. //获取cookies
  91. $cookies = Yii::$app->request->cookies;
  92. //账号权限
  93. $user_id = $cookies->getValue('user_id');
  94. $user_info = BaseUser::find()
  95. ->select('main_corp_id')
  96. ->where(['id' => $user_id, 'cancel_flag' => 0])
  97. ->asArray()
  98. ->one();
  99. $main_corp_id = $user_info['main_corp_id'];
  100. if ($main_corp_id == 0) {
  101. $main_corp_id = 1;
  102. }
  103. #endregion
  104. /**==========拼接订单的查询条件============**/
  105. //$order_where = " a.main_corp_id={$main_corp_id} and a.CANCEL_FLAG=0 and (a.order_status in(146,147,314) or a.CHANNEL_ORDER_STATUS in (551,554,553)) and a.ORDER_PROD_TYPE not in (81,82,38,369) and a.PARENT_ORDER_ID = 0 ";//获取所有已完成的有效的主订单
  106. //需要新增代售线路成本
  107. $order_where = " a.main_corp_id={$main_corp_id} and a.CANCEL_FLAG=0 and (a.order_status in(146,147,314) ) and ((a.ORDER_PROD_TYPE not in (81,82,38,369)) or (a.ORDER_PROD_TYPE in (81,82,38,369) and a.main_corp_id!=a.source_main_corp_id)) and a.PARENT_ORDER_ID = 0 ";//获取所有已完成的有效的主订单
  108. //结算时间
  109. if ($param['date_type'] == '2' && $param['start_date']) {
  110. $order_where .= " and (SELECT if(a.ORDER_PROD_TYPE in (25,26),a.PROD_END_STATION_DATE,MAX(RUN_DATE)) from order_main WHERE a.ORDER_ID = PARENT_ORDER_ID) >= '{$param['start_date']}'";//大于等于起始日期
  111. }
  112. if ($param['date_type'] == '2' && $param['end_date']) {
  113. $order_where .= " and (SELECT if(a.ORDER_PROD_TYPE in (25,26),a.PROD_END_STATION_DATE,MAX(RUN_DATE)) from order_main WHERE a.ORDER_ID = PARENT_ORDER_ID) < date_add('{$param['end_date']}', INTERVAL 1 day)";//小于日期
  114. }
  115. if ($param['date_type'] == '3' && $param['start_date']) {
  116. $order_where .= " and (SELECT if(a.ORDER_PROD_TYPE in (25,26),a.PROD_START_STATION_DATE,MAX(RUN_DATE)) from order_main WHERE a.ORDER_ID = PARENT_ORDER_ID) >= '{$param['start_date']}'";//大于等于起始日期
  117. }
  118. if ($param['date_type'] == '3' && $param['end_date']) {
  119. $order_where .= " and (SELECT if(a.ORDER_PROD_TYPE in (25,26),a.PROD_START_STATION_DATE,MAX(RUN_DATE)) from order_main WHERE a.ORDER_ID = PARENT_ORDER_ID) < date_add('{$param['end_date']}', INTERVAL 1 day)";//小于日期
  120. }
  121. //收款状态
  122. if ($param['settlement_status']) {
  123. $order_where .= " and IFNULL(b.payment_status,1) = {$param['settlement_status']}";
  124. }
  125. //预定时间
  126. if ($param['date_type'] == '1' && $param['start_date']) {
  127. $order_where .= " and a.CREATE_TIME >= DATE_FORMAT('{$param['start_date']}' ,'%Y-%m-%d %H:%i:%s')";//大于等于起始日期
  128. }
  129. if ($param['date_type'] == '1' && $param['end_date']) {
  130. $order_where .= " and a.CREATE_TIME < date_add(DATE_FORMAT('{$param['end_date']}' ,'%Y-%m-%d %H:%i:%s'), INTERVAL 1 day)";//小于结束日期的第二天凌晨
  131. }
  132. //渠道商ID
  133. if ($param['org_id']) {
  134. $order_where .= " and a.PROD_TOP_ORG_ID = '{$param['org_id']}'";
  135. }
  136. //订单产品类型
  137. if ($param['prod_type']) {
  138. $order_where .= " and a.ORDER_PROD_TYPE in ({$param['prod_type']})";
  139. }
  140. //更多查询
  141. if ($param['more_search']) {
  142. $order_where .= " and (a.ORDER_ID like '%{$param['more_search']}%' or a.CUSTOMER_MOBILE like '%{$param['more_search']}%'
  143. or a.CUSTOMER_NAME like '%{$param['more_search']}%' or a.OUTSIDE_ORDER_NO like '%{$param['more_search']}%' )";
  144. }
  145. /**==========拼接巴士bus的查询条件============**/
  146. $bus_where = " a.TOTAL_COST_PRICE > 0 and a.CANCEL_FLAG=0 and d.main_corp_id={$main_corp_id} ";//获取所有巴士
  147. //结算-预定时间 巴士的出发时间即预定时间
  148. if ($param['start_date']) {
  149. $bus_where .= " and a.START_TIME >= '{$param['start_date']}'";//大于等于起始日期
  150. }
  151. if ($param['end_date']) {
  152. $bus_where .= " and a.START_TIME < date_add('{$param['end_date']}', INTERVAL 1 day)";//小于日期
  153. }
  154. //收款状态
  155. if ($param['settlement_status']) {
  156. $bus_where .= " and IFNULL(b.payment_status,1) = {$param['settlement_status']}";
  157. }
  158. //渠道商ID
  159. if ($param['org_id']) {
  160. $bus_where .= " and a.BUS_ORG_ID = '{$param['org_id']}'";
  161. }
  162. //订单产品类型
  163. if (!empty($param['prod_type']) && $param['prod_type'] != '81,82,38,369') {//不是车的则不统计
  164. $bus_where .= " and a.ID = 0 ";
  165. }
  166. //更多查询
  167. if ($param['more_search']) {
  168. $bus_where .= " and (a.id like '%{$param['more_search']}%' or d.LINE_NAME like '%{$param['more_search']}%')";
  169. }
  170. return array('order_where' => $order_where, 'bus_where' => $bus_where, 'param' => $param);
  171. }
  172. /**
  173. * Des:获取总记录数
  174. * Name: getTotal
  175. * @param $getWhere
  176. * @return mixed
  177. * @author 倪宗锋
  178. */
  179. public function getTotal($getWhere)
  180. {
  181. /**==========获取记录数和总金额============**/
  182. $sql_1 = "
  183. SELECT SUM(x.cnt) 'cnt',FORMAT(SUM(x.base_price),2) 'total_price',SUM(x.reparations_price) 'reparations_price'
  184. FROM (
  185. SELECT COUNT(1) cnt,SUM(a.TOTAL_COST_PRICE) 'base_price',
  186. SUM(
  187. (SELECT IFNULL(SUM(v.reparations),0) from order_main u
  188. JOIN order_finance_reparations v on u.order_id = v.order_id
  189. WHERE u.RUN_ID = a.RUN_ID and u.RUN_BUS_ORDER_ID = a.BUS_ORDER_ID
  190. )
  191. )
  192. as 'reparations_price'
  193. from bus_cost a
  194. LEFT JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  195. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  196. WHERE {$getWhere['bus_where']}
  197. union ALL
  198. SELECT COUNT(1) cnt,SUM(a.BASE_PRICE) 'base_price',
  199. IFNULL((SELECT reparations from order_finance_reparations WHERE order_id=a.ORDER_ID),0) 'reparations_price'
  200. from order_main a
  201. LEFT JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  202. WHERE {$getWhere['order_where']}
  203. ) x
  204. ";
  205. $getTotal = \Yii::$app->getDb()->createCommand($sql_1)->queryAll();
  206. if (empty($getTotal['0']['cnt'])) {
  207. $getTotal[0]['cnt'] = 0;
  208. $getTotal[0]['total_price'] = 0;
  209. $getTotal[0]['total_commission'] = 0;
  210. $getTotal[0]['reparations_price'] = 0;
  211. }
  212. $data['page']['total_count'] = $getTotal[0]['cnt'];
  213. $data['page']['total_page'] = (string)ceil($getTotal[0]['cnt'] / $getWhere['param']['page_size']);
  214. $data['sum_info'] = $getTotal[0];
  215. return $data;
  216. }
  217. /**
  218. * Des:获取列表记录
  219. * Name: getList
  220. * @param $getWhere
  221. * @return array
  222. * @author 倪宗锋
  223. */
  224. public function getList($getWhere, $excel_flag = 0)
  225. {
  226. /**==========获取列表============**/
  227. $offset = ($getWhere['param']['current_page'] - 1) * $getWhere['param']['page_size'];
  228. //非0则为导出
  229. if ($excel_flag == 0) {
  230. $limit = "LIMIT {$getWhere['param']['page_size']} offset $offset";
  231. } else {
  232. $limit = '';
  233. }
  234. $sql_2 = "
  235. SELECT a.ID 'order_id','-' as 'outside_order_no',a.START_TIME 'create_time',
  236. d.LINE_NAME 'parent_prod_name','' as 'order_prod_type',
  237. ifnull((SELECT SUPPLIER_NAME FROM base_supplier WHERE a.BUS_ORG_ID = ID),'-') 'supplier_name' ,
  238. a.TOTAL_COST_PRICE 'base_price',
  239. (SELECT IFNULL(SUM(v.reparations),0)
  240. from order_main u
  241. JOIN order_finance_reparations v on u.order_id = v.order_id
  242. WHERE u.RUN_ID = a.RUN_ID and u.RUN_BUS_ORDER_ID = a.BUS_ORDER_ID
  243. ) as 'reparations_price',
  244. IFNULL(b.payment_status,1) 'status',
  245. CASE IFNULL(b.payment_status,1)
  246. WHEN 1 THEN '待结算'
  247. WHEN 2 THEN '已关账'
  248. WHEN 3 THEN '结算中'
  249. WHEN 4 THEN '已结算'
  250. ELSE '待结算' END AS 'status_des' ,
  251. a.START_TIME as 'run_date',
  252. '巴士' as 'prod_type_des',
  253. '-' as 'order_description',
  254. '-' as 'prodNum',
  255. '-' as 'prodName'
  256. from bus_cost a
  257. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  258. LEFT JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  259. WHERE {$getWhere['bus_where']}
  260. union ALL
  261. SELECT a.ORDER_ID 'order_id',a.OUTSIDE_ORDER_NO,a.CREATE_TIME 'create_time',
  262. (SELECT CONCAT(PARENT_PROD_NAME, '<br />',PROD_START_STATION_RES_NAME,' - ',PROD_END_STATION_RES_NAME) from order_main WHERE PARENT_ORDER_ID = a.ORDER_ID LIMIT 1) 'parent_prod_name',
  263. a.ORDER_PROD_TYPE 'order_prod_type',
  264. ifnull((SELECT SUPPLIER_NAME from base_supplier WHERE ID = a.PROD_TOP_ORG_ID),'-') 'supplier_name',
  265. a.BASE_PRICE 'base_price',
  266. IFNULL((SELECT reparations from order_finance_reparations WHERE order_id=a.ORDER_ID),0) 'reparations_price',
  267. IFNULL(b.payment_status,1) 'status',
  268. CASE IFNULL(b.payment_status,1)
  269. WHEN 1 THEN '待结算'
  270. WHEN 2 THEN '已关账'
  271. WHEN 3 THEN '结算中'
  272. WHEN 4 THEN '已结算'
  273. ELSE '待结算' END AS 'status_des' ,
  274. (SELECT MAX(RUN_DATE) from order_main WHERE a.ORDER_ID = PARENT_ORDER_ID) 'run_date',
  275. CASE
  276. WHEN a.ORDER_PROD_TYPE in (25,26) THEN '酒店'
  277. WHEN a.ORDER_PROD_TYPE in (81,82,38,369) THEN '车票'
  278. WHEN a.ORDER_PROD_TYPE in (258,282,311) THEN '门票'
  279. else '-' END as 'prod_type_des',
  280. a.ORDER_DESCRIPTION 'order_description',
  281. '-' as 'prodNum',
  282. '-' as 'prodName'
  283. from order_main a
  284. LEFT JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  285. WHERE {$getWhere['order_where']}
  286. {$limit};
  287. ";
  288. $list = \Yii::$app->getDb()->createCommand($sql_2)->queryAll();
  289. /**==========设置返回值============**/
  290. if (empty($list) == false) {
  291. foreach ($list as $key => $value) {
  292. if (empty($value['order_description'])) {
  293. continue;
  294. }
  295. $list[$key]['prodNum'] = 0;
  296. $list[$key]['prodName'] = '-';
  297. $scripTionArr = explode('|', $value['order_description']);
  298. foreach ($scripTionArr as $vl) {
  299. if (empty($vl)) {
  300. continue;
  301. }
  302. $vls = explode(',', $vl);
  303. if (empty($vls['2'])) {
  304. $list[$key]['prodNum'] = $vls[0];
  305. } else {
  306. $list[$key]['prodNum'] = $vls['2'];
  307. $list[$key]['prodName'] = $vls['0'];
  308. }
  309. }
  310. unset($list[$key]['order_description']);
  311. }
  312. }
  313. return $list;
  314. }
  315. /**
  316. * Des:校验是否可以关账
  317. * Name: checkClosesAmount
  318. * @param $getWhere
  319. * @return bool
  320. * @author 倪宗锋
  321. */
  322. public function checkClosesAmount($getWhere)
  323. {
  324. /**============判断是否可以关账===================**/
  325. $sql_1 = "
  326. SELECT SUM(x.cnt) cnt
  327. FROM (
  328. SELECT COUNT(1) cnt
  329. from bus_cost a
  330. LEFT JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  331. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  332. WHERE {$getWhere['bus_where']}
  333. and IFNULL(b.payment_status,1) != 1
  334. union ALL
  335. SELECT COUNT(1) cnt
  336. from order_main a
  337. LEFT JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  338. WHERE {$getWhere['order_where']}
  339. and IFNULL(b.payment_status,1) != 1
  340. ) x
  341. ";
  342. $getTotal = \Yii::$app->getDb()->createCommand($sql_1)->queryOne();
  343. if ($getTotal['cnt'] >= 1) {
  344. return false;
  345. }
  346. return true;
  347. }
  348. /**
  349. * Function Description:关账
  350. * Function Name: closeByOrderId
  351. * @param $order_id
  352. *
  353. * @return bool
  354. * @throws Exception
  355. *
  356. * @author 李健
  357. */
  358. public function closeByOrderId($order_id)
  359. {
  360. $transaction = \Yii::$app->db->beginTransaction();
  361. try{
  362. //没有在状态表的数据 插入到状态表
  363. $sql = "select order_id from order_finance_status where order_id in (".$order_id.")";
  364. $res = \Yii::$app->getDb()->createCommand($sql)->queryAll();
  365. $str = '';
  366. $arr = explode(',',trim($order_id,','));
  367. foreach ($res as $v){
  368. if(!in_array($v['order_id'],$arr)){
  369. $str .= $v['order_id'].' ,';
  370. }
  371. }
  372. $str = trim($str,',');
  373. if(!empty($str)){
  374. $sql1 = "
  375. INSERT into order_finance_status(main_corp_id,order_id,update_time, type)
  376. SELECT x.main_corp_id,x.order_id,NOW(),1
  377. from (
  378. SELECT a.ORDER_ID 'order_id',a.main_corp_id 'main_corp_id'
  379. from order_main a
  380. where a.order_id in (".$str.")
  381. )x
  382. ";
  383. $res1 = \Yii::$app->getDb()->createCommand($sql1)->execute();
  384. if (!$res1) {
  385. $transaction->rollBack();
  386. return false;
  387. }
  388. }
  389. /**==========更新已有状态表记录=============**/
  390. $sql2 = "UPDATE order_finance_status SET payment_status = 2 WHERE order_id in (".$order_id.") and payment_status=1";
  391. $res2 = Yii::$app->getDb()->createCommand($sql2)->execute();
  392. if (!$res2) {
  393. $transaction->rollBack();
  394. return false;
  395. }
  396. $transaction->commit();
  397. return true;
  398. }catch(Exception $e) {
  399. $transaction->rollBack();
  400. return false;
  401. }
  402. }
  403. /**
  404. * Des:执行关账操作
  405. * Name: closesAmount
  406. * @param $getWhere
  407. * @return bool
  408. * @author 倪宗锋
  409. */
  410. public function closesAmount($getWhere)
  411. {
  412. $transaction = \Yii::$app->db->beginTransaction();
  413. try {
  414. //没有在状态表的数据 插入到状态表
  415. $sql1 = "
  416. INSERT into order_finance_status(main_corp_id,order_id, update_time, type)
  417. SELECT {$getWhere["main_corp_id"]},z.* FROM (
  418. SELECT a.ID,NOW(),2
  419. from bus_cost a
  420. LEFT JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  421. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  422. WHERE {$getWhere['bus_where']}
  423. and b.payment_status is null
  424. union ALL
  425. SELECT a.ORDER_ID,NOW(),1
  426. from order_main a
  427. LEFT JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  428. WHERE {$getWhere['order_where']}
  429. and b.payment_status is null and a.CANCEL_FLAG=0
  430. ) z
  431. ";
  432. $flag1 = \Yii::$app->getDb()->createCommand($sql1)->execute();
  433. // if (!$flag1) {
  434. // $transaction->rollBack();
  435. // return false;
  436. // }
  437. /**==========更新已有状态表记录=============**/
  438. $sql2 = "
  439. update order_main a
  440. JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  441. set b.payment_status = 2
  442. WHERE {$getWhere['order_where']};
  443. ";
  444. $sql3 = "update bus_cost a
  445. JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  446. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  447. SET b.payment_status = 2
  448. WHERE {$getWhere['bus_where']}; ";
  449. $flag2 = \Yii::$app->getDb()->createCommand($sql2)->execute();
  450. $flag3 = \Yii::$app->getDb()->createCommand($sql3)->execute();
  451. if (!$flag3 && !$flag2 && !$flag1) {
  452. $transaction->rollBack();
  453. return false;
  454. }
  455. $transaction->commit();
  456. } catch (Exception $e) {
  457. $transaction->rollBack();
  458. return false;
  459. }
  460. return true;
  461. }
  462. /**
  463. * Des:检测是否所有记录都是以关账状态
  464. * Name: checkIsAllCloses
  465. * @param $getWhere
  466. * @return bool
  467. * @author 倪宗锋
  468. */
  469. public function checkIsAllCloses($getWhere)
  470. {
  471. /**============判断是否可以生成对账单===================**/
  472. $sql_1 = "
  473. SELECT SUM(x.cnt) cnt
  474. FROM (
  475. SELECT COUNT(1) cnt
  476. from bus_cost a
  477. LEFT JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  478. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  479. WHERE {$getWhere['bus_where']}
  480. and IFNULL(b.payment_status,1) != 2
  481. union ALL
  482. SELECT COUNT(1) cnt
  483. from order_main a
  484. LEFT JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  485. WHERE {$getWhere['order_where']}
  486. and IFNULL(b.payment_status,1) != 2
  487. ) x
  488. ";
  489. $getTotal = \Yii::$app->getDb()->createCommand($sql_1)->queryOne();
  490. if ($getTotal['cnt'] >= 1) {
  491. return false;
  492. }
  493. return true;
  494. }
  495. /**
  496. * Des:生成对账单
  497. * Name: addBalance
  498. * @param $getWhere
  499. * @return bool
  500. * @author 倪宗锋
  501. */
  502. public function addBalance($getWhere)
  503. {
  504. $transaction = \Yii::$app->db->beginTransaction();
  505. try {
  506. $time = microtime(true) * 10000;
  507. $financeBalance = new OrderFinanceBalanceAccount();
  508. $flag = $financeBalance->addBalanceForPayment($getWhere, $time);//插入对账单记录
  509. if (!$flag) {
  510. $transaction->rollBack();
  511. return false;
  512. }
  513. //对账单生成后修改订单对账状态并关联对账单
  514. $financeStatus = new OrderFinanceStatus();
  515. $flag1 = $financeStatus->setStatusForAddBalanceForPayment($getWhere, $time);
  516. if (!$flag1) {
  517. $transaction->rollBack();
  518. return false;
  519. }
  520. $transaction->commit();
  521. } catch (Exception $e) {
  522. $transaction->rollBack();
  523. return false;
  524. }
  525. return true;
  526. }
  527. /**
  528. * Function Description:生成对账单
  529. * Function Name: addBalanceByOrderId
  530. * @param $order_id
  531. * @param $start_date
  532. * @param $end_date
  533. * @param $main_corp_id
  534. *
  535. * @return bool
  536. * @throws Exception
  537. *
  538. * @author 李健
  539. */
  540. public function addBalanceByOrderId($order_id,$start_date,$end_date,$main_corp_id)
  541. {
  542. $transaction = \Yii::$app->db->beginTransaction();
  543. try {
  544. $time = microtime(true) * 10000;
  545. $financeBalance = new OrderFinanceBalanceAccount();
  546. $flag = $financeBalance->addBalanceForPayment2($order_id,$start_date,$end_date,$main_corp_id, $time);//插入对账单记录
  547. if (!$flag) {
  548. $transaction->rollBack();
  549. return false;
  550. }
  551. //对账单生成后修改订单对账状态并关联对账单
  552. $financeStatus = new OrderFinanceStatus();
  553. $flag1 = $financeStatus->setStatusForAddBalanceForPayment2($order_id, $time);
  554. if (!$flag1) {
  555. $transaction->rollBack();
  556. return false;
  557. }
  558. $transaction->commit();
  559. return true;
  560. } catch (Exception $e) {
  561. $transaction->rollBack();
  562. return false;
  563. }
  564. }
  565. /**
  566. * Des:取消关账
  567. * Name: cancelCloses
  568. * @param $getWhere
  569. * @return bool
  570. * @author 倪宗锋
  571. */
  572. public function cancelCloses($getWhere)
  573. {
  574. $sql = "
  575. update order_main a
  576. JOIN order_finance_status b ON a.ORDER_ID = b.order_id and b.type=1
  577. set b.payment_status = 1
  578. WHERE {$getWhere['order_where']};
  579. ";
  580. $sql1 = "update bus_cost a
  581. JOIN order_finance_status b on a.ID = b.order_id and b.type=2
  582. LEFT JOIN opera_line d ON a.LINE_ID = d.LINE_ID
  583. SET b.payment_status = 1
  584. WHERE {$getWhere['bus_where']}";
  585. $flag = \Yii::$app->getDb()->createCommand($sql)->execute();
  586. $flag1 = \Yii::$app->getDb()->createCommand($sql1)->execute();
  587. if (!$flag && !$flag1) {
  588. return false;
  589. }
  590. return true;
  591. }
  592. /**
  593. * Function Description:取消关账
  594. * Function Name: cancelByOrderId
  595. * @param $order_id
  596. *
  597. * @return bool
  598. * @throws Exception
  599. *
  600. * @author 李健
  601. */
  602. public function cancelByOrderId($order_id)
  603. {
  604. $sql = "UPDATE order_finance_status SET payment_status = 1 WHERE order_id in (".$order_id.") and payment_status=2";
  605. $res = Yii::$app->getDb()->createCommand($sql)->execute();
  606. if(!$res){
  607. return false;
  608. }
  609. return true;
  610. }
  611. /**
  612. * Des: 获取对账单列表
  613. * Name: getBalance
  614. * @param $param
  615. * @return bool
  616. * @author 倪宗锋
  617. */
  618. public function getBalance($param)
  619. {
  620. $where = array();
  621. $where[] = ' type = 1 ';
  622. if (!empty($param['org_id'])) {
  623. $where[] = " org_id = {$param['org_id']} ";
  624. }
  625. if (!empty($param['batch_id'])) {
  626. $where[] = " batch_id like '%{$param['batch_id']}%' ";
  627. }
  628. if (!empty($param['status'])) {
  629. $where[] = " status = {$param['status']} ";
  630. }
  631. if (!empty($param['main_corp_id'])) {
  632. $where[] = " main_corp_id = {$param['main_corp_id']} ";
  633. }
  634. $whereStr = '';
  635. if (count($where)) {
  636. $whereStr .= implode(' and ', $where);
  637. }
  638. /**============第一页时返回总记录数和总页数==============**/
  639. $sql_1 = "SELECT count(1) cnt
  640. FROM order_finance_balance_account
  641. WHERE $whereStr
  642. ";
  643. $getTotal = Yii::$app->getDb()->createCommand($sql_1)->queryOne();
  644. $data['page']['total_count'] = $getTotal['cnt'];
  645. $data['page']['total_page'] = (string)ceil($getTotal['cnt'] / $param['page_size']);
  646. /**============获取分页列表数据==============**/
  647. $offset = ($param['current_page'] - 1) * $param['page_size'];
  648. $sql_2 = "SELECT id,org_id,org_name,price,commission_price,reparations_price,date,start_date,end_date,
  649. account_bank,account_num,account_name,sett_frequency,batch_id,remark,
  650. CASE status
  651. WHEN 1 THEN '待核对'
  652. WHEN 2 THEN '待结算'
  653. WHEN 3 THEN '已结算'
  654. WHEN 4 THEN '已取消'
  655. ELSE 'error' END as 'status_des',
  656. status
  657. from order_finance_balance_account
  658. WHERE $whereStr
  659. ORDER BY id DESC
  660. LIMIT {$param['page_size']} OFFSET {$offset}";
  661. $list = Yii::$app->getDb()->createCommand($sql_2)->queryAll();
  662. $data['order_list'] = $list;
  663. return $data;
  664. }
  665. /**
  666. * Des:校验对账单的状态
  667. * Name: checkBalanceStatus
  668. * @param $id
  669. * @param $status
  670. * @return bool
  671. * @author 倪宗锋
  672. */
  673. public function checkBalanceStatus($id, $status)
  674. {
  675. $sql = "SELECT `status`
  676. from order_finance_balance_account
  677. WHERE id = $id";
  678. $info = Yii::$app->getDb()->createCommand($sql)->queryOne();
  679. if (empty($info['status']) || !in_array($info['status'], $status)) {
  680. return false;
  681. }
  682. return true;
  683. }
  684. /**
  685. * Des:取消对账单
  686. * Name: cancelBalance
  687. * @param $id
  688. * @return bool
  689. * @author 倪宗锋
  690. */
  691. public function cancelBalance($id)
  692. {
  693. //更改状态
  694. $sql = "
  695. update order_finance_balance_account a
  696. join order_finance_status b on a.batch_id=b.payment_batch_id
  697. set a.`status` =4,b.payment_status = 2
  698. WHERE a.`status` in(1) and a.id = $id
  699. ";
  700. $flag = Yii::$app->getDb()->createCommand($sql)->execute();
  701. if (!$flag) {
  702. return false;
  703. } else {
  704. return true;
  705. }
  706. }
  707. /**
  708. * Des:修改对账单状态
  709. * Name: confirmedBalance
  710. * @param $id
  711. * @return bool
  712. * @author 倪宗锋
  713. */
  714. public function confirmedBalance($id)
  715. {
  716. $financeAccount = new OrderFinanceBalanceAccount();
  717. return $financeAccount->editStatus($id);
  718. }
  719. /**
  720. * Des:确认对账
  721. * Name: balancing
  722. * @param $id
  723. * @return bool
  724. * @author 倪宗锋
  725. */
  726. public function balancing($id)
  727. {
  728. //更改状态
  729. //更改状态
  730. $sql = "
  731. update order_finance_balance_account a
  732. join order_finance_status b on a.batch_id=b.payment_batch_id
  733. set a.`status` =3,b.payment_status =4
  734. WHERE a.`status` in(2) and a.id = $id
  735. ";
  736. $flag = Yii::$app->getDb()->createCommand($sql)->execute();
  737. if (!$flag) {
  738. return false;
  739. } else {
  740. return true;
  741. }
  742. }
  743. /**
  744. * Des:获取对账单详情
  745. * Name: getAccountInfo
  746. * @param $id
  747. * @return array|bool
  748. * @author 倪宗锋
  749. */
  750. public function getAccountInfo($id)
  751. {
  752. $financeAccount = new OrderFinanceBalanceAccount();
  753. $info = $financeAccount->getInfoById($id);//获取详情
  754. if (empty($info['id'])) {
  755. return false;
  756. }
  757. return $info;
  758. }
  759. /**
  760. * Des:获取导出excel数据
  761. * Name: getListForExcel
  762. * @param $info
  763. * @return array
  764. * @author 倪宗锋
  765. */
  766. public function getListForExcel($info)
  767. {
  768. $financeAccount = new OrderFinanceBalanceAccount();
  769. $getList = $financeAccount->getExcelForPayment($info);
  770. return $getList;
  771. }
  772. /**
  773. * Function Description:获取分页数组
  774. * Function Name: getPage
  775. *
  776. * @param int $total_row 总条数
  777. * @param int $page_size 每页条数
  778. * @param int $current_page 当前页
  779. *
  780. * @return array
  781. *
  782. * @author 张帅
  783. */
  784. public function getPage($total_row, $page_size, $current_page)
  785. {
  786. $total_page = ceil($total_row / $page_size);
  787. if ($total_page <= 1) {
  788. $page_arr = [];
  789. return $page_arr;
  790. }
  791. #region 页首
  792. $page_arr = ['首页', '<上一页', 1];
  793. #endregion
  794. #region 页前
  795. if ($current_page <= 5) {
  796. for ($i = 2; $i <= $current_page; $i++) {
  797. $page_arr[] = $i;
  798. }
  799. } else {
  800. if ($total_page > 6) {
  801. $page_arr[] = '...';
  802. }
  803. if ($total_page - $current_page <= 2) {
  804. for ($i = $total_page - 4; $i <= $current_page; $i++) {
  805. $page_arr[] = $i;
  806. }
  807. } else {
  808. $page_arr[] = $current_page - 2;
  809. $page_arr[] = $current_page - 1;
  810. $page_arr[] = $current_page;
  811. }
  812. }
  813. #endregion
  814. #region 页后
  815. if ($total_page - $current_page <= 4) {
  816. for ($i = $current_page + 1; $i < $total_page; $i++) {
  817. $page_arr[] = $i;
  818. }
  819. } else {
  820. if ($current_page >= 3) {
  821. $page_arr[] = $current_page + 1;
  822. $page_arr[] = $current_page + 2;
  823. if ($total_page > 6) {
  824. $page_arr[] = '...';
  825. }
  826. } else {
  827. for ($i = $current_page + 1; $i <= 5; $i++) {
  828. $page_arr[] = $i;
  829. }
  830. if ($total_page > 6) {
  831. $page_arr[] = '...';
  832. }
  833. }
  834. }
  835. #endregion
  836. #region 页尾
  837. if ($current_page != $total_page) {
  838. $page_arr[] = $total_page;
  839. }
  840. $page_arr[] = '下一页>';
  841. $page_arr[] = '末页';
  842. #endregion
  843. return $page_arr;
  844. }
  845. /**
  846. * Function Description:得到结算状态
  847. * Function Name: getStatus
  848. * @param $order_id
  849. *
  850. * @return array|false
  851. * @throws Exception
  852. *
  853. * @author 李健
  854. */
  855. public function getStatus($order_id)
  856. {
  857. $order_finance_status = new OrderFinanceStatus();
  858. return $order_finance_status->getStatus($order_id);
  859. }
  860. /**
  861. * Function Description:修改账单备注
  862. * Function Name: changeRemark
  863. * @param $account_id
  864. * @param $remark
  865. *
  866. * @return array
  867. *
  868. * @author 娄梦宁
  869. */
  870. public function changeRemark($account_id,$remark)
  871. {
  872. if($account_id==0){
  873. return [
  874. 'code'=>1,
  875. 'info'=>'参数错误',
  876. ];
  877. }
  878. $order_finance_balance_account=new OrderFinanceBalanceAccount();
  879. $order_finance_balance_account::updateAll(['remark'=>$remark],['id'=>$account_id]);
  880. return [
  881. 'code'=>0,
  882. 'info'=>'修改成功'
  883. ];
  884. }
  885. }