Vehicle.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <?php
  2. namespace catchAdmin\yunying\controller;
  3. use catcher\base\CatchRequest as Request;
  4. use catcher\CatchResponse;
  5. use catcher\base\CatchController;
  6. // use catchAdmin\yunying\model\Vehicle as vehicleModel;
  7. use catchAdmin\yunying\excel\VehiclesExport;
  8. use catchAdmin\system\model\SysDictData;
  9. use catcher\Utils;
  10. use catcher\library\excel\Excel;
  11. use PhpOffice\PhpSpreadsheet\IOFactory;
  12. use think\facade\Env;
  13. use think\facade\Db;
  14. class Vehicle extends CatchController
  15. {
  16. // protected $vehicleModel;
  17. // public function __construct(VehicleModel $vehicleModel)
  18. // {
  19. // $this->vehicleModel = $vehicleModel;
  20. // }
  21. /**
  22. * 列表
  23. * @time 2022年01月20日 10:42
  24. * @param Request $request
  25. */
  26. public function index(Request $request)
  27. {
  28. $param=$request->param();
  29. //联表条件o.rfid_id = s.id and o.owner_id = r.id
  30. $cond=[
  31. '_string'=>'o.rfid_id = s.id and o.owner_id = r.id order by s.ID DESC',
  32. ];
  33. if($param['PLATE_NO']){
  34. $cond['o.PLATE_NO']=['like',$param['PLATE_NO']];
  35. }
  36. if($param['ID_CARD_NUMBER']){
  37. $cond['r.ID_CARD_NUMBER']=['like',$param['ID_CARD_NUMBER']];
  38. }
  39. if($param['NAME']){
  40. $cond['r.NAME']=['like',$param['NAME']];
  41. }
  42. if($param['RFID_SN']){
  43. $cond['s.RFID_SN']=['like',$param['RFID_SN']];
  44. }
  45. $count=queryOracleCount('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_NON_MOTOR_OWNER r,DSSC3.W_DW_RFID_TAGS s',$cond);
  46. // $count=queryOracleCount('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_RFID_TAGS s',$cond);
  47. $cond['page']=isset($param['page'])?$param['page']:1;
  48. $cond['limit']=isset($param['limit'])?$param['limit']:10;
  49. $rows=queryOracleSelect('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_NON_MOTOR_OWNER r,DSSC3.W_DW_RFID_TAGS s',$cond,'o.PLATE_NO,o.CAR_TYPE,o.CAR_BRAND,s.ID,s.RFID_SN,s.INSTALLER,to_char(s.INSTA_DATE,\'yyyy-mm-dd hh24:mi:ss\') INSTA_DATE,r.NAME,r.ID_CARD_NUMBER,r.MOBILE_NUMBER');
  50. // $rows=queryOracleSelect('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_RFID_TAGS s',$cond,'o.PLATE_NO,o.CAR_TYPE,o.CAR_BRAND,s.ID,s.RFID_SN,s.INSTALLER,to_char(s.INSTA_DATE,\'yyyy-mm-dd hh24:mi:ss\') INSTA_DATE');
  51. foreach($rows as &$val){
  52. $val['CAR_BRAND_TEXT']=(new SysDictData())->getValueByCode('CAR_BRAND_OPTION',$val['CAR_BRAND']);
  53. $val['CAR_TYPE_TEXT']=(new SysDictData())->getValueByCode('CAR_TYPE_OPTION',$val['CAR_TYPE']);
  54. $val['CARD_NUMBER_STR']=formatDataCardNumber($val['ID_CARD_NUMBER']);
  55. }
  56. $response=[
  57. 'code'=>10000,
  58. 'message'=>'查询成功',
  59. 'count'=>$count,
  60. 'data'=>$rows,
  61. 'current'=>isset($param['page'])?(int)$param['page']:1,
  62. 'limit'=>isset($param['limit'])?(int)$param['limit']:10,
  63. ];
  64. return $response;
  65. }
  66. public function getMapList(Request $request)
  67. {
  68. $param=$request->param();
  69. //联表条件o.rfid_id = s.id and o.owner_id = r.id
  70. $cond=[
  71. '_string'=>'o.rfid_id = s.id',
  72. ];
  73. $keywords=$param['keywords'];
  74. if($keywords){
  75. $cond['_string']= '(s.RFID_SN like \'%'.$keywords.'%\' OR o.PLATE_NO like \'%'.$keywords.'%\') AND o.rfid_id = s.id';
  76. }
  77. $count=queryOracleCount('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_RFID_TAGS s',$cond);
  78. $cond['page']=isset($param['page'])?$param['page']:1;
  79. $cond['limit']=isset($param['limit'])?$param['limit']:10;
  80. $rows=queryOracleSelect('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_RFID_TAGS s',$cond,'o.PLATE_NO,o.CAR_TYPE,o.CAR_BRAND,s.ID,s.RFID_SN,s.INSTALLER,to_char(s.INSTA_DATE,\'yyyy-mm-dd hh24:mi:ss\') INSTA_DATE');
  81. $conn=getOracleConnect();
  82. foreach($rows as &$val){
  83. $val['CAR_BRAND_TEXT']=(new SysDictData())->getValueByCode('CAR_BRAND_OPTION',$val['CAR_BRAND']);
  84. $val['CAR_TYPE_TEXT']=(new SysDictData())->getValueByCode('CAR_TYPE_OPTION',$val['CAR_TYPE']);
  85. $route_sql='select * from(SELECT RF_ID,to_char(RF_DATE,\'yyyy-mm-dd hh24:mi:ss\') RF_DATE FROM DSSC2.W_DW_RF_RECORD WHERE RF_FLAGID =\''.$val['RFID_SN'].'\' ORDER BY RF_DATE DESC )where rownum < 2';
  86. $stid = oci_parse($conn, $route_sql);
  87. oci_define_by_name($stid, 'RF_ID', $val['mac']);
  88. oci_define_by_name($stid, 'RF_DATE', $val['online_time']);
  89. oci_execute($stid);
  90. oci_fetch($stid);
  91. oci_free_statement($stid);
  92. $staion_info =Db::table('stations')->where('mac',$val['mac'])->find();
  93. if($staion_info){
  94. $wgsLoc = \algorithm\Geometry::gcj02ToWgs84((float)$staion_info['latitude'],(float)$staion_info['longitude']);
  95. $val['longitude']=$wgsLoc['lng'];
  96. $val['latitude']=$wgsLoc['lat'];
  97. $val['address']=$staion_info['name'];
  98. }else{
  99. $val['longitude']='';
  100. $val['latitude']='';
  101. $val['address']='';
  102. }
  103. }
  104. $response=[
  105. 'code'=>10000,
  106. 'message'=>'查询成功',
  107. 'count'=>$count,
  108. 'data'=>$rows,
  109. 'current'=>isset($param['page'])?(int)$param['page']:1,
  110. 'limit'=>isset($param['limit'])?(int)$param['limit']:10,
  111. ];
  112. return $response;
  113. }
  114. public function getRfidTagsList(Request $request) {
  115. $param=$request->param();
  116. //联表条件o.rfid_id = s.id and o.owner_id = r.id
  117. $cond=[];
  118. if($param['RFID_SN']){
  119. $cond['s.RFID_SN']=['like',$param['RFID_SN']];
  120. }
  121. $count=queryOracleCount('DSSC3.W_DW_RFID_TAGS s',$cond);
  122. $cond['page']=isset($param['page'])?$param['page']:1;
  123. $cond['limit']=isset($param['limit'])?$param['limit']:10;
  124. // $rows=queryOracleSelect('DSSC3.W_DW_NON_MOTOR o,DSSC3.W_DW_NON_MOTOR_OWNER r,DSSC3.W_DW_RFID_TAGS s',$cond,'o.PLATE_NO,s.RFID_SN,r. NAME,r.ID_CARD_NUMBER,r.MOBILE_NUMBER,r.HOME_ADDRESS');
  125. $rows=queryOracleSelect('DSSC3.W_DW_RFID_TAGS s',$cond,'s.ID,s.RFID_SN,s.RFID_TYPE');
  126. foreach($rows as &$val){
  127. // $val['CAR_BRAND_TEXT']=(new SysDictData())->getValueByCode('CAR_BRAND_OPTION',$val['CAR_BRAND']);
  128. $val['RFID_TYPE_TEXT']=(new SysDictData())->getValueByCode('RFID_TYPE_OPTION',$val['RFID_TYPE']);
  129. if( isset($param['bw_id']) && $param['bw_id'] ){
  130. $val['isAdd']=Db::table('rfid_with_bw')->where('bw_id',$param['bw_id'])->where('rfid',$val['RFID_SN'])->count();
  131. }
  132. }
  133. $response=[
  134. 'code'=>10000,
  135. 'message'=>'查询成功',
  136. 'count'=>$count,
  137. 'data'=>$rows,
  138. 'current'=>isset($param['page'])?(int)$param['page']:1,
  139. 'limit'=>isset($param['limit'])?(int)$param['limit']:10,
  140. ];
  141. return $response;
  142. }
  143. /**
  144. * 保存信息
  145. * @time 2022年01月20日 10:42
  146. * @param Request $request
  147. */
  148. public function save(Request $request)
  149. {
  150. $installer=$request->user()->realname;
  151. $param=$request->param();
  152. $param['RFID_SN']=strtoupper($param['RFID_SN']);
  153. $param['PLATE_NO']=strtoupper($param['PLATE_NO']);
  154. $param['INSTA_DATE']=date('Y-m-d H:i:s',time());
  155. $param['INSTALLER']=$installer;
  156. $r=$this->execSaveVehicle($param);
  157. return CatchResponse::success($r);
  158. }
  159. private function execSaveVehicle($data){
  160. $conn=getOracleConnect();
  161. $sql='declare
  162. tagId number;
  163. ownId number;
  164. begin
  165. INSERT INTO DSSC3.W_DW_RFID_TAGS("ID", "RFID_SN","INSTALLER","INSTA_DATE") VALUES (DSSC3.SEQ_W_DW_RFID_TAGS.nextval, \''.$data['RFID_SN'].'\',\''.$data['INSTALLER'].'\', TO_DATE(\''.$data['INSTA_DATE'].'\', \'SYYYY-MM-DD HH24:MI:SS\')) returning ID into tagId;
  166. INSERT INTO DSSC3.W_DW_NON_MOTOR_OWNER("ID", "NAME","ID_CARD_NUMBER","MOBILE_NUMBER") VALUES (DSSC3.SEQ_W_DW_NON_MOTOR_OWNER.nextval,\''.$data['NAME'].'\',\''.$data['ID_CARD_NUMBER'].'\',\''.$data['MOBILE_NUMBER'].'\') returning ID into ownId;
  167. INSERT INTO DSSC3.W_DW_NON_MOTOR("ID", "RFID_ID","PLATE_NO","CAR_BRAND","CAR_TYPE","OWNER_ID") VALUES (DSSC3.SEQ_W_DW_RFID_TAGS.nextval, tagId,\''.$data['PLATE_NO'].'\',\''.$data['CAR_BRAND'].'\',\''.$data['CAR_TYPE'].'\',ownId);
  168. end;';
  169. $stid = oci_parse($conn, $sql);
  170. $r = oci_execute($stid);
  171. oci_free_statement($stid);
  172. return $r;
  173. }
  174. /**
  175. * 更新
  176. * @time 2022年01月20日 10:42
  177. * @param Request $request
  178. * @param $id
  179. */
  180. public function update(Request $request, $id) : \think\Response
  181. {
  182. $params=$request->post();
  183. $params['RFID_SN']=strtoupper($params['RFID_SN']);
  184. $params['PLATE_NO']=strtoupper($params['PLATE_NO']);
  185. // var_dump($params);
  186. $conn=getOracleConnect();
  187. // //更新
  188. $sql='UPDATE DSSC3.W_DW_RFID_TAGS SET RFID_SN = \''.$params['RFID_SN'].'\' WHERE ID = \''.$id.'\' ';
  189. $stid = oci_parse($conn, $sql);
  190. $r = oci_execute($stid);
  191. if(!$r){
  192. oci_rollback($conn);
  193. return CatchResponse::fail('修改失败');
  194. }
  195. $sql='UPDATE DSSC3.W_DW_NON_MOTOR SET PLATE_NO = \''.$params['PLATE_NO'].'\',CAR_BRAND=\''.$params['CAR_BRAND'].'\',CAR_TYPE=\''.$params['CAR_TYPE'].'\' WHERE RFID_ID = \''.$id.'\' ';
  196. $stid2 = oci_parse($conn, $sql);
  197. $r2 = oci_execute($stid2);
  198. if(!$r2){
  199. oci_rollback($conn);
  200. return CatchResponse::fail('修改失败');
  201. }
  202. //查车主ID
  203. $vehicle_sql='SELECT o.OWNER_ID FROM DSSC3.W_DW_NON_MOTOR o WHERE o.RFID_ID =\''.$id.'\' ';
  204. $owner_id='';
  205. $stid = oci_parse($conn, $vehicle_sql);
  206. oci_define_by_name($stid, 'OWNER_ID', $owner_id);
  207. oci_execute($stid);
  208. oci_fetch($stid);
  209. $sql='UPDATE DSSC3.W_DW_NON_MOTOR_OWNER SET MOBILE_NUMBER=\''.$params['MOBILE_NUMBER'].'\',NAME=\''.$params['NAME'].'\',ID_CARD_NUMBER=\''.$params['ID_CARD_NUMBER'].'\' WHERE ID = \''.$owner_id.'\' ';
  210. $stid3 = oci_parse($conn, $sql);
  211. $r3 = oci_execute($stid3);
  212. if(!$r3){
  213. oci_rollback($conn);
  214. return CatchResponse::fail('修改失败');
  215. }
  216. oci_commit($conn);
  217. return CatchResponse::success('修改成功');
  218. }
  219. /**
  220. * 删除
  221. * @time 2022年01月20日 10:42
  222. * @param $id
  223. */
  224. public function delete($id) : \think\Response
  225. {
  226. $conn=getOracleConnect();
  227. //查车主ID
  228. $sql='SELECT OWNER_ID FROM DSSC3.W_DW_NON_MOTOR WHERE RFID_ID in ('.$id.')';
  229. $stid = oci_parse($conn, $sql);
  230. $r = oci_execute($stid);
  231. $rows=[];
  232. while($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
  233. $rows[]=$row['OWNER_ID'];
  234. }
  235. $owner_ids=implode(',',$rows);
  236. $sql='DELETE FROM DSSC3.W_DW_NON_MOTOR_OWNER WHERE ID in ('.$owner_ids.')';
  237. $stid = oci_parse($conn, $sql);
  238. $r = oci_execute($stid);
  239. if(!$r){
  240. oci_rollback($conn);
  241. return CatchResponse::fail('删除失败');
  242. }
  243. $sql='DELETE FROM DSSC3.W_DW_RFID_TAGS WHERE ID in ('.$id.')';
  244. $stid = oci_parse($conn, $sql);
  245. $r = oci_execute($stid);
  246. if(!$r){
  247. oci_rollback($conn);
  248. return CatchResponse::fail('删除失败');
  249. }
  250. $sql='DELETE FROM DSSC3.W_DW_NON_MOTOR WHERE RFID_ID in ('.$id.')';
  251. $stid = oci_parse($conn, $sql);
  252. $r = oci_execute($stid);
  253. if(!$r){
  254. oci_rollback($conn);
  255. return CatchResponse::fail('删除失败');
  256. }
  257. oci_commit($conn);
  258. return CatchResponse::success(true);
  259. }
  260. /**
  261. * 导出
  262. *
  263. * @time 2022年01月22日
  264. * @param Excel $excel
  265. * @param VehicleExport $vehicleExport
  266. * @throws \PhpOffice\PhpSpreadsheet\Exception
  267. * @return \think\response\Json
  268. */
  269. public function export_vehicle(Excel $excel, VehiclesExport $VehicleExport)
  270. {
  271. return CatchResponse::success($excel->save($VehicleExport, Utils::publicPath('export/vehicles'), 'local', '车辆列表'));
  272. }
  273. /**
  274. * 导入车辆
  275. *
  276. * @time 2022年02月15日
  277. * @param Excel $excel
  278. * @param DeviceExport $deviceExport
  279. * @throws \PhpOffice\PhpSpreadsheet\Exception
  280. * @return \think\response\Json
  281. */
  282. public function importVehicle(Request $request)
  283. {
  284. $url = $request->post('url');
  285. if (!$url) {
  286. return CatchResponse::fail('请上传文件');
  287. }
  288. $creator_id = $request->post('creator_id');
  289. //解析地址
  290. $parse_url = parse_url($url)['path'];
  291. //载入excel表格
  292. $objPHPExcel = IOFactory::load(public_path() . $parse_url);
  293. //获取表名,一维数组,值是表名。如:array('sheet1', 'sheet2', 'sheet3')
  294. // $nameArr = $objPHPExcel->getSheetNames();
  295. //获取表的数量
  296. $sheetCount = $objPHPExcel->getSheetCount();
  297. $fail = 0; //失败条数
  298. $success = 0; //成功条数
  299. $total = 0; //总共设备数
  300. $data = []; //设备数据
  301. //循环读取每一张表
  302. for ($index = 0; $index < $sheetCount; $index++) {
  303. //设置当前要读取的表
  304. $sheet = $objPHPExcel->getSheet($index); //excel中的第一张sheet
  305. // var_dump($sheet);exit;
  306. $highestRow = $sheet->getHighestRow(); // 取得总行数
  307. // var_dump($highestRow);
  308. if ($highestRow <= 1) {
  309. continue;
  310. }
  311. $brand_type_id = Db::table("sys_dict_type")->where('code', 'CAR_BRAND_OPTION')->value('id');
  312. $car_type_id = Db::table("sys_dict_type")->where('code', 'CAR_TYPE_OPTION')->value('id');
  313. // return $this->where('type_id', $type_id)
  314. // ->where('code', $value)
  315. // ->cache(true, 60)
  316. // ->value('remark');
  317. // $r=$this->execSaveVehicle($param);
  318. $total += $highestRow - 1;
  319. for ($j = 2; $j <= $highestRow; $j++) {
  320. $arr = array(); //每条设备信息
  321. $arr['PLATE_NO'] = strtoupper(trim($sheet->getCell("A" . $j)->getFormattedValue()));
  322. $brand = trim($sheet->getCell("B" . $j)->getFormattedValue());
  323. $brand_id=Db::table("sys_dict_data")->where('type_id', $brand_type_id)->whereLike('value','%'.$brand.'%')->cache(60)->value('code');
  324. $arr['CAR_BRAND']=$brand_id?$brand_id:'99';
  325. $type = trim($sheet->getCell("C" . $j)->getFormattedValue());
  326. $car_type=Db::table("sys_dict_data")->where('type_id', $car_type_id)->whereLike('value','%'.$type.'%')->cache(60)->value('code');
  327. $arr['CAR_BRAND']=$car_type?$car_type:'4';
  328. $arr['RFID_SN'] = trim($sheet->getCell("D" . $j)->getFormattedValue());
  329. $arr['INSTA_DATE'] = trim($sheet->getCell("E" . $j)->getFormattedValue());
  330. $arr['INSTALLER'] = trim($sheet->getCell("F" . $j)->getFormattedValue());
  331. $arr['NAME'] = trim($sheet->getCell("G" . $j)->getFormattedValue());
  332. $arr['ID_CARD_NUMBER'] = trim($sheet->getCell("H" . $j)->getFormattedValue());
  333. $arr['MOBILE_NUMBER'] = trim($sheet->getCell("I" . $j)->getFormattedValue());
  334. // var_dump($arr);
  335. $r=$this->execSaveVehicle($arr);
  336. if($r){
  337. $success++;
  338. }else{
  339. $fail++;
  340. }
  341. // var_dump($arr);
  342. // array_push($data,$arr);
  343. }
  344. }
  345. // array_unique($data, SORT_REGULAR);
  346. // // var_dump($data);return CatchResponse::success();
  347. // $count = $this->deviceModel->limit(100)->insertAll($data);
  348. // if ($success = $count) {
  349. return CatchResponse::success('共' . $total . '条数据,成功' . $success . '条,失败' . $fail . '条');
  350. // }
  351. // return CatchResponse::success(['error' => true, 'msg' => '导入失败']);
  352. }
  353. }