25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 
 

817 satır
32 KiB

  1. <?php
  2. namespace backend\modules\api\models;
  3. use yii\db\ActiveRecord;
  4. use Yii;
  5. use yii\base\Exception;
  6. use backend\modules\zzcs\models\OrderSendMessage;
  7. use backend\modules\motorcade\models\BusOilDoc;
  8. use backend\modules\motorcade\models\BusDocLog;
  9. /**
  10. * This is the model class for table "run_bus_expenses".
  11. *
  12. * @property integer $ID
  13. * @property integer $create_user_id
  14. * @property string $create_time
  15. * @property integer $update_user_id
  16. * @property string $update_time
  17. * @property integer $cancel_flag
  18. * @property integer $bus_number
  19. * @property integer $use_bus_org_id
  20. * @property string $run_date
  21. * @property integer $bus_res_id
  22. * @property integer $bus_driver_res_id
  23. * @property integer $expense_subject_id
  24. * @property integer $expense_type
  25. * @property string $expense_value
  26. * @property string $start_value
  27. * @property string $end_value
  28. * @property string $doc_log_id
  29. */
  30. class RunBusExpenses extends ActiveRecord
  31. {
  32. /**
  33. * @inheritdoc
  34. */
  35. public static function tableName()
  36. {
  37. return 'run_bus_expenses';
  38. }
  39. /**
  40. * @inheritdoc
  41. */
  42. public function rules()
  43. {
  44. return [
  45. [['create_user_id', 'create_time', 'run_date'], 'required'],
  46. [['create_user_id', 'update_user_id', 'cancel_flag', 'bus_number', 'use_bus_org_id', 'bus_res_id', 'bus_driver_res_id', 'expense_subject_id', 'expense_type'], 'integer'],
  47. [['update_time'], 'safe'],
  48. [['expense_value', 'start_value', 'end_value', 'doc_log_id'], 'number'],
  49. [['create_time'], 'string', 'max' => 20],
  50. [['run_date'], 'string', 'max' => 10],
  51. ];
  52. }
  53. /**
  54. * @inheritdoc
  55. */
  56. public function attributeLabels()
  57. {
  58. return [
  59. 'ID' => 'ID',
  60. 'create_user_id' => 'Create User ID',
  61. 'create_time' => 'Create Time',
  62. 'update_user_id' => 'Update User ID',
  63. 'update_time' => 'Update Time',
  64. 'cancel_flag' => 'Cancel Flag',
  65. 'bus_number' => '出车单号',
  66. 'use_bus_org_id' => '用车单位',
  67. 'run_date' => '出车日期',
  68. 'bus_res_id' => '车辆res_id',
  69. 'bus_driver_res_id' => '司机res_id',
  70. 'expense_subject_id' => '支出科目 对应dict_type.id',
  71. 'expense_type' => '支出方式 对应dict_type.id',
  72. 'expense_value' => '支出金额',
  73. 'start_value' => '科目为邮电费时对应开始时的里程数,为路桥费时对应ETC充值卡开始时的金额',
  74. 'end_value' => '科目为邮电费时对应结束时的里程数,为路桥费时对应ETC充值卡结束时的金额',
  75. 'doc_log_id' => '对应bus_doc_log 表中的id',
  76. ];
  77. }
  78. /**
  79. * Function Description:获取司机的总里程数
  80. * Function Name: getTotalMileageByDriver
  81. * @param int $driver_id 司机id
  82. *
  83. * @return array|int|mixed|null|ActiveRecord
  84. *
  85. * @author 张帅
  86. */
  87. public function getTotalMileageByDriver($driver_id)
  88. {
  89. $result = self::find()
  90. ->select("sum(end_value-start_value) as total_mileage")
  91. ->where([
  92. 'and',
  93. ['=', 'bus_driver_res_id', $driver_id],
  94. ['=', 'expense_subject_id', 462],
  95. ['=', 'cancel_flag', 0],
  96. ['!=', 'end_value', 0],
  97. ])
  98. ->asArray()->one();
  99. $result = ($result['total_mileage'] == null ? 0 : $result['total_mileage']);
  100. return $result;
  101. }
  102. /**
  103. * Function Description:出行开始
  104. * Function Name: runStart
  105. * @param $bus_number
  106. * @param $postage
  107. * @param $toll_charge
  108. *
  109. * @return bool
  110. *
  111. * @author 张帅
  112. */
  113. public function runStart($bus_number, $postage, $toll_charge)
  114. {
  115. #region 1.通过出车单号获取行程详情
  116. $bus_order_info = BusOrder::find()
  117. ->select([
  118. 'bus_number',//出车单号
  119. 'use_bus_org_id',//用车单位
  120. 'run_date',//出车日期
  121. 'bus_res_id' => 'send_bus_res_id',//所用车辆
  122. 'bus_driver_res_id' => 'send_bus_driver_res_id',//出车司机
  123. ])
  124. ->where([
  125. 'bus_number' => $bus_number,
  126. 'cancel_flag' => 0,
  127. ])
  128. ->asArray()->one();
  129. #endregion
  130. #region 2.获取要添加的出行任务费用数据
  131. $expenses_value[] = $bus_order_info + [
  132. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  133. 'create_time' => date('Y-m-d H:i:s', time()),
  134. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  135. 'update_time' => date('Y-m-d H:i:s', time()),
  136. 'cancel_flag' => 0,
  137. 'expense_subject_id' => 462,
  138. 'expense_type' => 0,
  139. 'expense_value' => 0,
  140. 'start_value' => $postage,
  141. ];
  142. $expenses_value[] = $bus_order_info + [
  143. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  144. 'create_time' => date('Y-m-d H:i:s', time()),
  145. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  146. 'update_time' => date('Y-m-d H:i:s', time()),
  147. 'cancel_flag' => 0,
  148. 'expense_subject_id' => 463,
  149. 'expense_type' => 473,
  150. 'expense_value' => 0,
  151. 'start_value' => $toll_charge,
  152. ];
  153. #endregion
  154. #region 3.修改数据
  155. $transaction = Yii::$app->db->beginTransaction();
  156. try {
  157. //插入添加的出行任务费用
  158. $res = Yii::$app->db->createCommand()->batchInsert(self::tableName(),
  159. ['bus_number', 'use_bus_org_id', 'run_date', 'bus_res_id', 'bus_driver_res_id', 'create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'expense_subject_id', 'expense_type', 'expense_value', 'start_value'],
  160. $expenses_value)->execute();
  161. if (!$res) {
  162. throw new Exception('输入数据不符合格式');
  163. }
  164. //修改出车状态
  165. $bus_order_one = BusOrder::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0]);
  166. $bus_order_one->attributes = ['update_user_id' => $bus_order_info['bus_driver_res_id'], 'update_time' => date('Y-m-d H:i:s', time()), 'run_status' => 437];
  167. $res = $bus_order_one->update();
  168. if (!$res) {
  169. throw new Exception('输入数据不符合格式');
  170. }
  171. $transaction->commit();
  172. $result = true;
  173. } catch (Exception $e) {
  174. # 回滚事务
  175. $result = false;
  176. }
  177. return $result;
  178. #endregion
  179. }
  180. /**
  181. * Function Description:任务结束
  182. * Function Name: runEnd
  183. * @param $bus_number
  184. * @param $postage
  185. * @param $toll_charge
  186. *
  187. * @return bool
  188. *
  189. * @author 张帅
  190. */
  191. public function runEnd($bus_number, $postage, $toll_charge, $diff_distance = 0)
  192. {
  193. #region 1.通过出车单号获取行程详情
  194. $bus_order_info = BusOrder::find()
  195. ->select([
  196. 'bus_number',//出车单号
  197. 'use_bus_org_id',//用车单位
  198. 'run_date',//出车日期
  199. 'bus_res_id' => 'send_bus_res_id',//所用车辆
  200. 'bus_driver_res_id' => 'send_bus_driver_res_id',//出车司机
  201. ])
  202. ->where([
  203. 'bus_number' => $bus_number,
  204. 'cancel_flag' => 0,
  205. ])
  206. ->asArray()->one();
  207. #endregion
  208. #region 2.修改数据
  209. $transaction = Yii::$app->db->beginTransaction();
  210. try {
  211. //(1)修改邮电费
  212. $postage_one = self::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0, 'expense_subject_id' => 462]);
  213. $postage_start_value = $postage_one->start_value;
  214. if ($postage < $postage_start_value) {
  215. throw new Exception('请认真填写');
  216. }
  217. #region 获取参考油价
  218. $bus_postage = BaseBus::find()->select('mpg,oil_price,fuel_form')->where(['bus_id' => $bus_order_info['bus_res_id']])->asArray()->one();
  219. if (count($bus_postage) == 0 || empty($bus_postage['mpg']) || $bus_postage['mpg'] == 0) {//升/百公里 度/百公里
  220. $mpg = $bus_postage['fuel_form'] == 487 ? 82 : 25;
  221. } else {
  222. $mpg = $bus_postage['mpg'];
  223. }
  224. if (count($bus_postage) == 0 || empty($bus_postage['oil_price']) || $bus_postage['oil_price'] == 0) {// 元/升 元/度
  225. $oil_price = $bus_postage['fuel_form'] == 487 ? 2.2 : 6.11;
  226. } else {
  227. $oil_price = $bus_postage['oil_price'];
  228. }
  229. #endregion
  230. $expense_value = round((($postage - $postage_start_value) / 100 * $mpg * $oil_price), 2);//油耗费或者电耗费用
  231. $postage_value = [
  232. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  233. 'update_time' => date('Y-m-d H:i:s', time()),
  234. 'expense_value' => $expense_value,
  235. 'end_value' => $postage,
  236. ];
  237. $postage_one->attributes = $postage_value;
  238. $res = $postage_one->update();
  239. if (!$res) {
  240. throw new Exception('输入数据不符合格式');
  241. }
  242. //(2)修改路桥费
  243. $toll_charge_one = self::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0, 'expense_subject_id' => 463]);
  244. $toll_charge_start_value = $toll_charge_one->start_value;
  245. $expense_value = $toll_charge_start_value - $toll_charge;
  246. //插入ETC记录
  247. $doc_log_id = 0;
  248. $bus_oil_doc_info = BusOilDoc::findOne(['BIND_BUS' => $bus_order_info['bus_res_id'], 'CARD_TYPE' => 2]);
  249. if (false != $bus_oil_doc_info && isset($bus_oil_doc_info["ID"])) {
  250. $card_balance = $bus_oil_doc_info["CARD_BALANCE"] - $expense_value;
  251. $bus_doc_log = new BusDocLog();
  252. $bus_doc_log->attributes = [
  253. 'CREATE_USER_ID' => $bus_order_info['bus_driver_res_id'],
  254. 'CREATE_TIME' => date("Y-m-d H:i:s"),
  255. 'UPDATE_USER_ID' => $bus_order_info['bus_driver_res_id'],
  256. 'UPDATE_TIME' => date("Y-m-d H:i:s"),
  257. 'CARD_ID' => $bus_oil_doc_info["ID"],
  258. 'BUS_ID' => $bus_oil_doc_info['BIND_BUS'],
  259. 'OPERATION_TYPE' => 601,
  260. 'OPERATION_DRIVER' => $bus_order_info['bus_driver_res_id'],
  261. 'OPERATION_DATE' => date("Y-m-d"),
  262. 'VALUE' => $expense_value,
  263. 'VALUE_OLD' => $bus_oil_doc_info["CARD_BALANCE"],
  264. 'NOTE' => "APP司机出车报账"
  265. ];
  266. $bus_doc_log->save();
  267. $doc_log_id = $bus_doc_log->attributes['ID'];
  268. if ($expense_value > 0) {
  269. $bus_oil_doc_info->attributes = ['CARD_BALANCE' => $card_balance, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), 'UPDATE_USER_ID' => $bus_order_info['bus_driver_res_id']];
  270. $res = $bus_oil_doc_info->update();
  271. }
  272. }
  273. $toll_charge_value = [
  274. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  275. 'update_time' => date('Y-m-d H:i:s', time()),
  276. 'expense_value' => $expense_value,
  277. 'end_value' => $toll_charge,
  278. 'doc_log_id' => $doc_log_id,
  279. ];
  280. $toll_charge_one->attributes = $toll_charge_value;
  281. $res = $toll_charge_one->update();
  282. if (!$res) {
  283. throw new Exception('输入数据不符合格式');
  284. }
  285. //修改出车状态
  286. $bus_order_one = BusOrder::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0]);
  287. $bus_order_one->attributes = ['update_user_id' => $bus_order_info['bus_driver_res_id'], 'update_time' => date('Y-m-d H:i:s', time()), 'run_status' => 438];
  288. $res = $bus_order_one->update();
  289. if (!$res) {
  290. throw new Exception('输入数据不符合格式');
  291. }
  292. //以下为给乘客发送短信
  293. // $bus_order = new BusOrder();
  294. // $order_send_message = new OrderSendMessage();
  295. // $order_check_ticket = new OrderCheckTickets();
  296. // // 根据bus_number查询到run_id,为了进一步查询到检票的乘客作准备
  297. // $result = $bus_order->getRunIdByBusNumber($bus_number);
  298. // $customer_phone_list = $order_check_ticket->getCustomerMobile($result['run_id'],$result['bus_order_id']);
  299. // if(!empty($customer_phone_list)){
  300. // foreach($customer_phone_list as $k => $customer_phone){
  301. // $res_send_message = $order_send_message->sendTelMessage($customer_phone['customer_mobile'], '感谢您乘坐蜘蛛出行巴士旅游专线,祝您游玩愉快,如有门票、旅游直通车预订需求,请关注(蜘蛛行)公众号,有返佣哦!如对这次乘坐有任何建议,请拨打021-33280519进行反馈');
  302. // //短信记录插入order_send_message表
  303. // $current_time = date("Y-m-d H:i:s");
  304. // $send_msg_values = [
  305. // 'ORDER_ID' => $customer_phone['order_id'],
  306. // 'SEND_MOBILE' => $customer_phone['customer_mobile'],
  307. // 'SEND_MESSAGE' => '【蜘蛛行】感谢您乘坐蜘蛛出行巴士旅游专线,祝您游玩愉快,如有门票、旅游直通车预订需求,请关注(蜘蛛行)公众号,有返佣哦!如对这次乘坐有任何建议,请拨打021-33280519进行反馈',
  308. // 'SEND_TIME' => $current_time,
  309. // 'SEND_ERROR' => $res_send_message,
  310. // 'CREATE_USER_ID' => 2,
  311. // 'CREATE_TIME' => $current_time,
  312. // 'UPDATE_USER_ID' => 2,
  313. // 'UPDATE_TIME' => $current_time,
  314. // ];
  315. // $msgRecord = new OrderSendMessage();
  316. // $msgRecord->attributes = $send_msg_values;
  317. // $res = $msgRecord->insert();
  318. //// if (!$res) {
  319. //// throw new Exception('插入失败');
  320. //// }
  321. // }
  322. // }
  323. //司贴
  324. // $expenses_value[] = $bus_order_info + [
  325. // 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  326. // 'create_time' => date('Y-m-d H:i:s', time()),
  327. // 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  328. // 'update_time' => date('Y-m-d H:i:s', time()),
  329. // 'cancel_flag' => 0,
  330. // 'expense_subject_id' => 464,
  331. // 'expense_type' => 474,
  332. // 'expense_value' => $diff_distance*0.6,
  333. // ];
  334. // $res = Yii::$app->db->createCommand()->batchInsert(self::tableName(),
  335. // ['bus_number', 'use_bus_org_id', 'run_date', 'bus_res_id', 'bus_driver_res_id', 'create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'expense_subject_id', 'expense_type', 'expense_value'],
  336. // $expenses_value)->execute();
  337. $transaction->commit();
  338. $result = true;
  339. } catch (Exception $e) {
  340. # 回滚事务
  341. $result = false;
  342. }
  343. #endregion
  344. return $result;
  345. }
  346. /**
  347. * Function Description:获取邮电费和路桥费
  348. * Function Name: getRunOrderExpenses
  349. * @param $bus_number
  350. *
  351. * @return array
  352. *
  353. * @author 张帅
  354. */
  355. public function getRunOrderExpenses($bus_number)
  356. {
  357. #region 1.从数据库获取任务邮电费和路桥费费用
  358. $expenses_list = self::find()
  359. ->select([
  360. 'e.bus_number',
  361. 'e.expense_subject_id',//支出科目
  362. 'e.expense_value',//支出金额
  363. 'e.start_value',
  364. 'e.end_value',
  365. 'e.run_date',//报账日期
  366. 'task_name' => 'o.itinerary_name',
  367. ])
  368. ->from(self::tableName() . ' as e')
  369. ->leftJoin(BusOrder::tableName() . ' as o', 'o.bus_number = e.bus_number')
  370. ->where([
  371. 'and',
  372. ['=', 'e.cancel_flag', 0],
  373. ['=', 'o.cancel_flag', 0],
  374. ['in', 'e.expense_subject_id', [462, 463]],
  375. ['in', 'e.bus_number', $bus_number],
  376. ])
  377. ->asArray()
  378. ->all();
  379. #endregion
  380. #region 2.整理数据
  381. $result = [];
  382. foreach ($expenses_list as $key => $vel) {
  383. if (count($result) == 0) {
  384. $result['bus_number'] = $vel['bus_number'];//出行单号
  385. $result['run_date'] = $vel['run_date'];//出行日期
  386. $result['task_name'] = $vel['task_name'];//任务名称
  387. }
  388. if ($vel['expense_subject_id'] == 462) {
  389. $result['mileage'] = $vel['end_value'] - $vel['start_value'];//行驶里程
  390. }
  391. if ($vel['expense_subject_id'] == 463) {
  392. $result['toll_charge'] = $vel['expense_value'];//路桥费
  393. }
  394. }
  395. #endregion
  396. return $result;
  397. }
  398. /**
  399. * Function Description:提交报账
  400. * Function Name: getSubmitFinance
  401. * @param $bus_number
  402. * @param $food_expense
  403. * @param $hotel_expense
  404. * @param $park_expense
  405. *
  406. * @return bool
  407. *
  408. * @author 张帅
  409. */
  410. public function getSubmitFinance($bus_number, $food_expense, $hotel_expense, $park_expense)
  411. {
  412. #region 1.通过出车单号获取行程详情
  413. $bus_order_info = BusOrder::find()
  414. ->select([
  415. 'bus_number',//出车单号
  416. 'use_bus_org_id',//用车单位
  417. 'run_date',//出车日期
  418. 'bus_res_id' => 'send_bus_res_id',//所用车辆
  419. 'bus_driver_res_id' => 'send_bus_driver_res_id',//出车司机
  420. ])
  421. ->where([
  422. 'bus_number' => $bus_number,
  423. 'cancel_flag' => 0,
  424. ])
  425. ->asArray()->one();
  426. #endregion
  427. #region 2.获取要添加的出行任务费用数据
  428. //(1)餐饮费
  429. $expenses_value[] = $bus_order_info + [
  430. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  431. 'create_time' => date('Y-m-d H:i:s', time()),
  432. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  433. 'update_time' => date('Y-m-d H:i:s', time()),
  434. 'cancel_flag' => 0,
  435. 'expense_subject_id' => 466,
  436. 'expense_type' => 475,
  437. 'expense_value' => $food_expense,
  438. ];
  439. //(2)住宿费
  440. $expenses_value[] = $bus_order_info + [
  441. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  442. 'create_time' => date('Y-m-d H:i:s', time()),
  443. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  444. 'update_time' => date('Y-m-d H:i:s', time()),
  445. 'cancel_flag' => 0,
  446. 'expense_subject_id' => 467,
  447. 'expense_type' => 475,
  448. 'expense_value' => $hotel_expense,
  449. ];
  450. //(3)停车费
  451. $expenses_value[] = $bus_order_info + [
  452. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  453. 'create_time' => date('Y-m-d H:i:s', time()),
  454. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  455. 'update_time' => date('Y-m-d H:i:s', time()),
  456. 'cancel_flag' => 0,
  457. 'expense_subject_id' => 465,
  458. 'expense_type' => 475,
  459. 'expense_value' => $park_expense,
  460. ];
  461. #endregion
  462. //(4)司贴
  463. $expenses_value[] = $bus_order_info + [
  464. 'create_user_id' => $bus_order_info['bus_driver_res_id'],
  465. 'create_time' => date('Y-m-d H:i:s', time()),
  466. 'update_user_id' => $bus_order_info['bus_driver_res_id'],
  467. 'update_time' => date('Y-m-d H:i:s', time()),
  468. 'cancel_flag' => 0,
  469. 'expense_subject_id' => 464,
  470. 'expense_type' => 474,
  471. 'expense_value' => 0,
  472. ];
  473. #endregion
  474. #region 3.修改数据
  475. $transaction = Yii::$app->db->beginTransaction();
  476. try {
  477. //插入添加的出行任务费用
  478. $res = Yii::$app->db->createCommand()->batchInsert(self::tableName(),
  479. ['bus_number', 'use_bus_org_id', 'run_date', 'bus_res_id', 'bus_driver_res_id', 'create_user_id', 'create_time', 'update_user_id', 'update_time', 'cancel_flag', 'expense_subject_id', 'expense_type', 'expense_value'],
  480. $expenses_value)->execute();
  481. if (!$res) {
  482. throw new Exception('输入数据不符合格式');
  483. }
  484. //修改报账状态
  485. $bus_order_one = BusOrder::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0]);
  486. $bus_order_one->attributes = ['update_user_id' => $bus_order_info['bus_driver_res_id'], 'update_time' => date('Y-m-d H:i:s', time()), 'finance_status' => 445];
  487. $res = $bus_order_one->update();
  488. if (!$res) {
  489. throw new Exception('输入数据不符合格式');
  490. }
  491. $transaction->commit();
  492. $result = true;
  493. } catch (Exception $e) {
  494. # 回滚事务
  495. $result = false;
  496. }
  497. #endregion
  498. return $result;
  499. }
  500. /**
  501. * Function Description:获取费用详情
  502. * Function Name: getFinanceDetail
  503. * @param string $bus_number 出行单号
  504. *
  505. * @return array
  506. *
  507. * @author 张帅
  508. */
  509. public function getFinanceDetail($bus_number)
  510. {
  511. #region 1.从数据库获取任务费用
  512. $expenses_list = self::find()
  513. ->select([
  514. 'e.bus_number',
  515. 'e.expense_subject_id',//支出科目
  516. 'e.expense_value',//支出金额
  517. 'e.start_value',
  518. 'e.end_value',
  519. 'e.run_date',//报账日期
  520. 'task_name' => 'o.itinerary_name',
  521. ])
  522. ->from(self::tableName() . ' as e')
  523. ->leftJoin(BusOrder::tableName() . ' as o', 'o.bus_number = e.bus_number')
  524. ->where([
  525. 'and',
  526. ['=', 'e.cancel_flag', 0],
  527. ['=', 'o.cancel_flag', 0],
  528. ['in', 'e.expense_subject_id', [462, 463, 465, 466, 467]],
  529. ['in', 'e.bus_number', $bus_number],
  530. ])
  531. ->asArray()
  532. ->all();
  533. #endregion
  534. #region 2.整理数据
  535. $result = [];
  536. foreach ($expenses_list as $key => $vel) {
  537. if (count($result) == 0) {
  538. $result['bus_number'] = $vel['bus_number'];//出行单号
  539. $result['run_date'] = $vel['run_date'];//出行日期
  540. $result['task_name'] = $vel['task_name'];//任务名称
  541. }
  542. if ($vel['expense_subject_id'] == 462) {
  543. $result['mileage'] = $vel['end_value'] - $vel['start_value'];//行驶里程
  544. }
  545. if ($vel['expense_subject_id'] == 463) {
  546. $result['toll_charge'] = $vel['expense_value'];//路桥费
  547. }
  548. if ($vel['expense_subject_id'] == 465) {
  549. $result['food_expense'] = $vel['expense_value'];//餐饮费
  550. }
  551. if ($vel['expense_subject_id'] == 466) {
  552. $result['hotel_expense'] = $vel['expense_value'];//住宿费
  553. }
  554. if ($vel['expense_subject_id'] == 467) {
  555. $result['park_expense'] = $vel['expense_value'];//停车费
  556. }
  557. }
  558. #endregion
  559. return $result;
  560. }
  561. /**
  562. * Function Description:重新报账
  563. * Function Name: getResubmitFinance
  564. * @param $bus_number
  565. * @param $food_expense
  566. * @param $hotel_expense
  567. * @param $park_expense
  568. *
  569. * @return bool
  570. *
  571. * @author 张帅
  572. */
  573. public function getResubmitFinance($bus_number, $food_expense, $hotel_expense, $park_expense)
  574. {
  575. #region 1.修改数据
  576. $transaction = Yii::$app->db->beginTransaction();
  577. try {
  578. //(1)修改餐饮费
  579. $food_one = self::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0, 'expense_subject_id' => 465]);
  580. $food_one->attributes = ['update_time' => date('Y-m-d H:i:s', time()), 'expense_value' => $food_expense,];
  581. $res = $food_one->update();
  582. if (!$res) {
  583. throw new Exception('输入数据不符合格式1');
  584. }
  585. //(2)修改住宿费
  586. $hotel_one = self::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0, 'expense_subject_id' => 466]);
  587. $hotel_one->attributes = ['update_time' => date('Y-m-d H:i:s', time()), 'expense_value' => $hotel_expense,];
  588. $res = $hotel_one->update();
  589. if (!$res) {
  590. throw new Exception('输入数据不符合格式2');
  591. }
  592. //(3)修改停车费
  593. $park_one = self::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0, 'expense_subject_id' => 467]);
  594. $park_one->attributes = ['update_time' => date('Y-m-d H:i:s', time()), 'expense_value' => $park_expense,];
  595. $res = $park_one->update();
  596. if (!$res) {
  597. throw new Exception('输入数据不符合格式3');
  598. }
  599. //(4)修改报账状态
  600. $bus_order_one = BusOrder::findOne(['bus_number' => $bus_number, 'cancel_flag' => 0]);
  601. $bus_order_one->attributes = ['update_time' => date('Y-m-d H:i:s', time()), 'finance_status' => 445];
  602. $res = $bus_order_one->update();
  603. if (!$res) {
  604. throw new Exception('输入数据不符合格式4');
  605. }
  606. $transaction->commit();
  607. $result = true;
  608. } catch (Exception $e) {
  609. # 回滚事务
  610. $result = false;
  611. }
  612. #endregion
  613. return $result;
  614. }
  615. /**
  616. * Function Description:获取结束最大值
  617. * Function Name: getExpenseMaxEndValue
  618. * @param int $bus_res_id 巴士资源id
  619. * @param int $expense_subject_id 费用类型id
  620. *
  621. * @return mixed
  622. *
  623. * @author 邱颂
  624. */
  625. public function getExpenseMaxEndValue($bus_res_id, $expense_subject_id)
  626. {
  627. // $expense_info = self::find()
  628. // ->select([
  629. // 'MAX(end_value) as max_value'
  630. // ])
  631. // ->where([
  632. // 'and',
  633. // ['=', 'bus_res_id', $bus_res_id],
  634. // ['=', 'expense_subject_id', $expense_subject_id],
  635. // ])
  636. // ->groupBy(['bus_res_id', 'expense_subject_id'])
  637. // ->asArray()
  638. // ->one();
  639. // return $expense_info["max_value"];
  640. $end_milege = self::find()
  641. ->select('rbe.end_value')
  642. ->from(RunBusExpenses::tableName() . ' as rbe')
  643. ->innerJoin(BusOrder::tableName() . ' as bo', 'rbe.bus_number = bo.bus_number')
  644. ->where(['and', ['=', 'rbe.cancel_flag', '0'], ['=', 'bo.cancel_flag', '0'], ['=', 'rbe.bus_res_id', $bus_res_id], ['=', 'rbe.expense_subject_id', $expense_subject_id], ['=', 'bo.run_status', '438']])
  645. ->orderBy(['bo.run_date' => SORT_DESC, 'bo.start_time' => SORT_DESC])
  646. ->asArray()
  647. ->one();
  648. return ($end_milege == false || !isset($end_milege['end_value'])) ? false : intval($end_milege['end_value']);
  649. }
  650. /**
  651. * Function Description:获取上个月与本月的司贴列表
  652. * Function Name: getDriverSubsidyList
  653. * @param int $driver_id 司机id
  654. *
  655. * @return array
  656. *
  657. * @author 张帅
  658. */
  659. public function getDriverSubsidyList($driver_id)
  660. {
  661. #region 要返回的数组
  662. $result = [
  663. 'pre' => [
  664. 'day_name' => date('n', strtotime("-1 month")) . '月',
  665. 'total_expense_value' => 0,
  666. 'subsidy_list' => [],
  667. ],
  668. 'now' => [
  669. 'day_name' => date('n') . '月',
  670. 'total_expense_value' => 0,
  671. 'subsidy_list' => [],
  672. ],
  673. ];
  674. #endregion
  675. #region 获取司贴列表
  676. $driver_subsidy_list = self::find()
  677. ->select([
  678. 'run_date',
  679. 'bus_number',
  680. 'task_name' => BusOrder::find()->select('itinerary_name')->where('bus_number = e.bus_number')->limit(1),//任务名称
  681. 'expense_value',
  682. ])
  683. ->where([
  684. 'and',
  685. ['=', 'bus_driver_res_id', $driver_id],
  686. ['=', 'cancel_flag', 0],
  687. ['=', 'expense_subject_id', 464],
  688. ['>=', 'run_date', date('Y-m-d', strtotime("-1 month"))],
  689. ])
  690. ->from(self::tableName() . ' as e')
  691. ->orderBy(['run_date' => SORT_DESC])
  692. ->asArray()->all();
  693. #endregion
  694. #region 分组装入
  695. if (count($driver_subsidy_list) > 0) {
  696. foreach ($driver_subsidy_list as $key => $vel) {
  697. $vel_month = date('n', strtotime($vel['run_date']));
  698. $vel_day = date('j', strtotime($vel['run_date']));
  699. $vel['run_day'] = $vel_day . '日';
  700. $arr_key = $vel_month != date('n') ? 'pre' : 'now';
  701. $result[$arr_key]['subsidy_list'][] = $vel;
  702. $result[$arr_key]['total_expense_value'] += $vel['expense_value'];
  703. }
  704. }
  705. #endregion
  706. return $result;
  707. }
  708. /**
  709. * 通过车辆的资源id获取到结束的最大公里数
  710. * @param $bus_res_id 司机资源id
  711. * @author 傅冬荣
  712. */
  713. public function getLastMilegeByBusResId($bus_res_id)
  714. {
  715. // $end_milege = self::find()
  716. // ->select('MAX(end_value) as end_value')
  717. // ->where(['and',['=','cancel_flag',0],['=','bus_res_id',$bus_res_id],['=','expense_subject_id',462]])
  718. // ->asArray()
  719. // ->one();
  720. $end_milege = self::find()
  721. ->select('rbe.end_value')
  722. ->from(RunBusExpenses::tableName() . ' as rbe')
  723. ->innerJoin(BusOrder::tableName() . ' as bo', 'rbe.bus_number = bo.bus_number')
  724. ->where(['and', ['=', 'rbe.cancel_flag', '0'], ['=', 'bo.cancel_flag', '0'], ['=', 'rbe.bus_res_id', $bus_res_id], ['=', 'rbe.expense_subject_id', '462'], ['=', 'bo.run_status', '438']])
  725. ->orderBy(['bo.run_date' => SORT_DESC, 'TIME_FORMAT(bo.start_time,"%H:%i")' => SORT_DESC])
  726. ->asArray()
  727. ->all();
  728. return !$end_milege ? 0 : intval($end_milege[0]['end_value']);
  729. }
  730. /**
  731. * 通过bus_number获取到该行程的开始里程数
  732. * @author 傅冬荣
  733. */
  734. public function getStartMilegeByBusNumber($bus_number)
  735. {
  736. $start_value = self::find()
  737. ->select('start_value')
  738. ->where(['and', ['=', 'cancel_flag', 0], ['=', 'bus_number', $bus_number], ['=', 'expense_subject_id', 462]])
  739. ->asArray()
  740. ->one();
  741. return intval($start_value['start_value']);
  742. }
  743. /**
  744. * 通过司机姓名或者日期来获取报账列表
  745. * @param $driver_name 司机姓名
  746. * @param $bus_no 车牌号
  747. * @param $run_date 开车日期
  748. * * @author 傅冬荣
  749. */
  750. public function getExpensesListByBusNumber($bus_number)
  751. {
  752. $filter = ['and', ['=', 'rbe.cancel_flag', 0]];
  753. $filter[] = ['=', 'rbe.bus_number', $bus_number];
  754. $expenses_list = self::find()
  755. ->select(['rbe.update_time', 'rbe.update_user_id', 'rbe.run_date', 'rbe.bus_number', 'rbe.bus_res_id', 'rbe.bus_driver_res_id', 'dt.type_name', 'expense_subject_id', 'expense_value', 'start_value', 'end_value'])
  756. ->from(RunBusExpenses::tableName() . ' as rbe')
  757. ->innerJoin(DictType::tableName() . ' as dt', 'rbe.expense_subject_id = dt.id')
  758. ->filterWhere($filter)
  759. ->orderBy(['run_date' => SORT_DESC])
  760. ->asArray()->all();
  761. // ->createCommand()->getRawSql();
  762. return $expenses_list;
  763. }
  764. }