Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 
 
 

281 Zeilen
11 KiB

  1. <?php
  2. namespace backend\modules\api\models;
  3. use backend\modules\motorcade\models\BusDocLog;
  4. use backend\modules\motorcade\models\BusOilDoc;
  5. use common\models\zModel;
  6. use yii\data\ActiveDataProvider;
  7. use Yii;
  8. use yii\base\Exception;
  9. /**
  10. * This is the model class for table "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_id
  19. * @property integer $expense_subject_id
  20. * @property integer $expense_type
  21. * @property string $expense_price
  22. * @property string $receive_value
  23. * @property string $expense_destination
  24. * @property string $start_value
  25. * @property string $end_value
  26. */
  27. class BusExpenses extends zModel
  28. {
  29. public $card_no;
  30. public $start_date;
  31. public $end_date;
  32. public $record_type;
  33. public $cost_type;
  34. public $bind_bus;
  35. public function load($post, $formName = null)
  36. {
  37. $this->card_no = isset($post['card_no']) ? $post['card_no'] : '';
  38. $this->start_date = isset($post['start_date']) ? $post['start_date'] : date('Y-m-01');
  39. $this->end_date = isset($post['end_date']) ? $post['end_date'] : date('Y-m-t');
  40. $this->bind_bus = isset($post['bind_bus']) ? $post['bind_bus'] : '';
  41. $this->record_type = isset($post['record_type']) ? $post['record_type'] : '';
  42. $this->cost_type = isset($post['cost_type']) ? $post['cost_type'] : '';
  43. return parent::load($post);
  44. }
  45. /**
  46. * @inheritdoc
  47. */
  48. public static function tableName()
  49. {
  50. return 'bus_expenses';
  51. }
  52. /**
  53. * @inheritdoc
  54. */
  55. public function rules()
  56. {
  57. return [
  58. [['create_user_id', 'create_time', 'update_user_id', 'cancel_flag', 'expense_destination'], 'required'],
  59. [['create_user_id', 'update_user_id', 'cancel_flag', 'bus_id', 'expense_subject_id', 'expense_type'], 'integer'],
  60. [['update_time'], 'safe'],
  61. [['expense_price', 'start_value', 'end_value', 'doc_id'], 'number'],
  62. [['create_time', 'receive_value', 'expense_destination'], 'string', 'max' => 255],
  63. ];
  64. }
  65. /**
  66. * @inheritdoc
  67. */
  68. public function attributeLabels()
  69. {
  70. return [
  71. 'ID' => 'ID',
  72. 'create_user_id' => 'Create User ID',
  73. 'create_time' => 'Create Time',
  74. 'update_user_id' => 'Update User ID',
  75. 'update_time' => 'Update Time',
  76. 'cancel_flag' => 'Cancel Flag',
  77. 'bus_id' => '车辆ID',
  78. 'expense_subject_id' => '支出科目(如:加油,充电) 对应dict_type.id 479加油 480 充电',
  79. 'expense_type' => '支出方式 对应dict_type.id',
  80. 'expense_price' => '支付金额',
  81. 'receive_value' => '量(如油量、电量)',
  82. 'expense_destination' => '支出去向',
  83. 'start_value' => '记录车辆节点开始时状态属性值(如:加油前里程数)',
  84. 'end_value' => '记录车辆节点开始时状态属性值',
  85. ];
  86. }
  87. public function getbase_bus()
  88. {
  89. return $this->hasOne(BaseBus::className(), ['BUS_ID' => 'bus_id']);
  90. }
  91. public function getdict_type()
  92. {
  93. return $this->hasOne(DictType::className(), ['ID' => 'expense_type']);
  94. }
  95. public function getbus_doc_log()
  96. {
  97. return $this->hasOne(BusDocLog::className(), ['ID' => 'doc_id']);
  98. }
  99. public function getbase_driver()
  100. {
  101. return $this->hasOne(BaseDriver::className(), ['DRIVER_ID' => 'create_user_id']);
  102. }
  103. public function getList()
  104. {
  105. $query = BusExpenses::find();
  106. $query->innerJoinWith(BaseBus::tableName());
  107. $query->innerJoinWith([BusDocLog::tableName()]);
  108. $query->leftJoin(BusOilDoc::tableName(),'bus_doc_log.CARD_ID=bus_oil_doc.ID');
  109. $query->andFilterWhere(['bus_expenses.cancel_flag' => 0]);
  110. $query->andFilterWhere(['between', 'bus_doc_log.OPERATION_DATE', $this->start_date, $this->end_date]);
  111. $query->andFilterWhere(['like', 'CARD_NO', $this->card_no]);
  112. $query->andFilterWhere(['bus_oil_doc.MAIN_CORP_ID'=> $this->login_user->MAIN_CORP_ID2]);
  113. $query->andFilterWhere(['bus_doc_log.cancel_flag'=> 0]);
  114. $query->orderBy('OPERATION_DATE desc');
  115. if ($this->bind_bus !== '') {
  116. $query->andFilterWhere(['base_bus.BUS_ID' => $this->bind_bus]);
  117. }
  118. $dataProvider = new ActiveDataProvider([
  119. 'query' => $query,
  120. 'pagination' => [
  121. 'pagesize' => 15,
  122. ],
  123. 'sort' => false
  124. // 'sort' => [
  125. // 'defaultOrder' =>
  126. // [
  127. // 'bus_doc_log.OPERATION_DATE' => SORT_DESC,
  128. // ],
  129. // 'attributes' => [
  130. // 'base_bus.BUS_NO',
  131. // 'bus_doc_log.OPERATION_DATE',
  132. // 'receive_value',
  133. // 'expense_price',
  134. // 'start_value',
  135. // 'dict_type.TYPE_NAME',
  136. // 'bus_doc_log.bus_oil_doc.CARD_NO',
  137. // 'expense_destination',
  138. // 'base_driver.DRIVER_NAME',
  139. // ]
  140. // ]
  141. ]);
  142. return $dataProvider;
  143. }
  144. /**
  145. * Function Description:加油
  146. * Function Name: addOil
  147. * @param int $driver_id 司机id
  148. * @param int $bus_id 巴士id
  149. * @param string $expense_destination 支出去向
  150. * @param double $start_value 开始里程
  151. * @param double $receive_value 油量
  152. * @param double $expense_price 支付金额
  153. *
  154. * @return bool
  155. *
  156. * @author 张帅
  157. */
  158. public function addOil($driver_id, $bus_id, $expense_destination, $start_value, $receive_value, $expense_price)
  159. {
  160. $this->writeLog( "↓↓↓↓↓开始加油处理:".$driver_id."|".$bus_id."|".$expense_destination."|".$start_value."|".$receive_value."|".$expense_price );
  161. #region 1.修改数据
  162. $transaction = Yii::$app->db->beginTransaction();
  163. try {
  164. //(1)补充上次加油的残缺数据
  165. $pre_oil = self::find()->where(['bus_id' => $bus_id, 'cancel_flag' => 0, 'expense_subject_id' => 479])->orderBy(['id' => SORT_DESC])->asArray()->one();
  166. if (count($pre_oil) > 0) {
  167. $pre_oil = self::findOne(['ID' => $pre_oil['ID']]);
  168. $pre_oil->attributes = ['update_user_id' => $driver_id, 'update_time' => date('Y-m-d H:i:s', time()), 'end_value' => $start_value];
  169. $res = $pre_oil->update();
  170. if (!$res) {
  171. $this->writeLog( "补充上次加油的残缺数据失败:".$pre_oil['ID']."|".$driver_id."|".$start_value );
  172. throw new Exception('输入数据不符合格式');
  173. }
  174. }
  175. //(2插入bus_doc_log)
  176. $bus_oil_doc_info = BusOilDoc::findOne( ['BIND_BUS' => $bus_id, 'CARD_TYPE' => 1] );
  177. if( false != $bus_oil_doc_info && isset($bus_oil_doc_info["ID"]) ) {
  178. $card_balance = $bus_oil_doc_info["CARD_BALANCE"] - $expense_price;
  179. $bus_doc_log = new BusDocLog();
  180. $bus_doc_log->attributes = [
  181. 'CREATE_USER_ID' => $driver_id,
  182. 'CREATE_TIME' => date("Y-m-d H:i:s"),
  183. 'UPDATE_USER_ID' => $driver_id,
  184. 'UPDATE_TIME' => date("Y-m-d H:i:s"),
  185. 'CARD_ID' => $bus_oil_doc_info["ID"],
  186. 'BUS_ID' => $bus_oil_doc_info['BIND_BUS'],
  187. 'OPERATION_TYPE' => 601,
  188. 'OPERATION_DRIVER' => $driver_id,
  189. 'OPERATION_DATE' => date("Y-m-d"),
  190. 'VALUE' => $expense_price,
  191. 'VALUE_OLD' => $bus_oil_doc_info["CARD_BALANCE"],
  192. 'NOTE' => "APP司机加油报账"
  193. ];
  194. $bus_doc_log->save();
  195. $doc_log_id = $bus_doc_log->ID;
  196. if( $expense_price > 0 ) {
  197. $bus_oil_doc_info->attributes = ['CARD_BALANCE' => $card_balance, 'UPDATE_TIME' => date('Y-m-d H:i:s', time()), 'UPDATE_USER_ID' => $driver_id];
  198. $bus_oil_doc_info->update();
  199. }
  200. } else {
  201. $doc_log_id = 0;
  202. }
  203. //(3)录入加油数据
  204. $value = [
  205. 'create_user_id' => $driver_id,
  206. 'create_time' => date('Y-m-d H:i:s', time()),
  207. 'update_user_id' => $driver_id,
  208. 'update_time' => date('Y-m-d H:i:s', time()),
  209. 'cancel_flag' => 0,
  210. 'bus_id' => $bus_id,
  211. 'expense_subject_id' => 479,
  212. 'expense_type' => 483,
  213. 'expense_price' => $expense_price,
  214. 'receive_value' => $receive_value,
  215. 'expense_destination' => $expense_destination,
  216. 'start_value' => $start_value,
  217. 'doc_id' => $doc_log_id,
  218. ];
  219. $this->attributes = $value;
  220. $res = $this->insert();
  221. if (!$res) {
  222. $this->writeLog( "录入加油数据失败:".$driver_id."|".$bus_id."|".$expense_price."|".$receive_value."|".$expense_destination."|".$start_value."|".$doc_log_id );
  223. throw new Exception('输入数据不符合格式');
  224. }
  225. //(4.更新油价)
  226. $bus_one = BaseBus::findOne(['bus_id' => $bus_id]);
  227. $new_oil_price = round(($expense_price / $receive_value), 2);
  228. $bus_one->attributes = ['OIL_PRICE' => $new_oil_price];
  229. $res = $bus_one->update();
  230. if ( $res === false ) {
  231. $this->writeLog( "更新油价失败:".$expense_price."/".$receive_value."=".$new_oil_price );
  232. throw new Exception('输入数据不符合格式');
  233. }
  234. $transaction->commit();
  235. $result = true;
  236. } catch (Exception $e) {
  237. # 回滚事务
  238. $result = false;
  239. }
  240. if( $result ) {
  241. $this->writeLog( "↑↑↑↑↑开始加油处理成功:".$driver_id."|".$bus_id."|".$expense_destination."|".$start_value."|".$receive_value."|".$expense_price."|".$doc_log_id );
  242. } else {
  243. $this->writeLog( "↑↑↑↑↑加油处理失败:".$driver_id."|".$bus_id."|".$expense_destination."|".$start_value."|".$receive_value."|".$expense_price."|".$doc_log_id );
  244. }
  245. #endregion
  246. return $result;
  247. #endregion
  248. }
  249. protected function writeLog($string)
  250. {
  251. $string = date('Y-m-d H:i:s') . PHP_EOL . $string . PHP_EOL;
  252. if (!file_exists(__DIR__ . '/../../../runtime/logs/DriveApp')) {
  253. mkdir(__DIR__ . '/../../../runtime/logs/DriveApp', 0777, true);
  254. }
  255. file_put_contents(__DIR__ . '/../../../runtime/logs/DriveApp/' . date('Y-m-d') . '.log', $string, FILE_APPEND);
  256. }
  257. }