• 停车场系统源码


    源码下载地址(小程序开源地址):停车场系统小程序,新能源电动车充电系统,智慧社区物业人脸门禁小程序: 【涵盖内容】:城市智慧停车系统,汽车新能源充电,两轮电动车充电,物业缴费,社区到访记录,人脸门禁,上门报修等。【开发框】架:union【使用场景】:微信小程序,支付宝小程序,其它平台小程序,混合app【使用教程】:本代码全开源且完整,没有任何缺失和加密,不会存在我们故意动手脚导致你跑不起来的情况,建议使用HBuilder打开和运行本代码

    源码下载地址(后台管理开源地址):停车场系统后台管理,新能源电动车充电系统,智慧社区物业人脸门禁后台管理: 城市智慧停车系统,汽车新能源充电,两轮电动车充电,物业缴费,社区到访记录,人脸门禁,上门报修等

    代码格式浏览

    1. package com.cf.carpark.admin.controller;
    2. import com.alibaba.fastjson.JSONObject;
    3. import com.cf.carpark.admin.config.AuthenticationInterceptor;
    4. import com.cf.carpark.admin.swagger.CfCarParkUseLogSwagger;
    5. import com.cf.carpark.domain.*;
    6. import com.cf.carpark.domain.ext.CfCarParkOrder;
    7. import com.cf.carpark.domain.request.*;
    8. import com.cf.carpark.domain.type.FeeQueryMode;
    9. import com.cf.carpark.domain.type.ReleaseType;
    10. import com.cf.carpark.service.*;
    11. import com.cf.framework.domain.carpark.response.CarParkCode;
    12. import com.cf.framework.domain.pay.PayCode;
    13. import com.cf.framework.domain.report.CountByDay;
    14. import com.cf.framework.domain.response.CommonCode;
    15. import com.cf.framework.domain.response.ResponseResult;
    16. import com.cf.framework.domain.ucenter.ext.UserBasicInfo;
    17. import com.cf.framework.exception.ExceptionCast;
    18. import com.cf.framework.utils.DateUtil;
    19. import com.cf.framework.utils.FileUtils;
    20. import com.cf.framework.utils.HttpHearderUtils;
    21. import com.cf.framework.utils.StringTools;
    22. import com.cf.pay.domain.CfCoupon;
    23. import com.cf.pay.domain.CfOrder;
    24. import com.cf.pay.domain.request.CfOrderQuery;
    25. import com.cf.pay.domain.type.CouponStatus;
    26. import com.cf.pay.domain.type.GoodsType;
    27. import com.cf.pay.domain.type.PayStatus;
    28. import com.cf.pay.service.CfCouponService;
    29. import com.cf.pay.service.CfOrderService;
    30. import com.cf.ucenter.service.CfSystemConfigService;
    31. import org.apache.commons.lang3.StringUtils;
    32. import org.apache.dubbo.config.annotation.Reference;
    33. import org.apache.poi.ss.usermodel.Cell;
    34. import org.apache.poi.ss.usermodel.Row;
    35. import org.apache.poi.ss.usermodel.Sheet;
    36. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    37. import org.springframework.beans.BeanUtils;
    38. import org.springframework.beans.factory.annotation.Autowired;
    39. import org.springframework.security.access.prepost.PreAuthorize;
    40. import org.springframework.validation.annotation.Validated;
    41. import org.springframework.web.bind.annotation.RequestBody;
    42. import org.springframework.web.bind.annotation.RequestMapping;
    43. import org.springframework.web.bind.annotation.RequestMethod;
    44. import org.springframework.web.bind.annotation.RestController;
    45. import javax.servlet.http.HttpServletRequest;
    46. import javax.servlet.http.HttpServletResponse;
    47. import java.io.IOException;
    48. import java.io.OutputStream;
    49. import java.math.BigDecimal;
    50. import java.util.ArrayList;
    51. import java.util.HashMap;
    52. import java.util.List;
    53. import java.util.Map;
    54. /**
    55. * 请在此填写描述
    56. *
    57. * @ClassName CfCarParkUseLogController
    58. * @Author 隔壁小王子 981011512@qq.com
    59. * @Date 2020/5/26/026 7:34
    60. * @Version 1.0
    61. **/
    62. @RestController
    63. @RequestMapping("carparkUseLogAdmin/")
    64. @Validated
    65. public class CfCarParkUseLogController implements CfCarParkUseLogSwagger {
    66. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    67. private CfCarParkUseLogService cfCarParkUseLogService;
    68. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    69. private CfCarParkService cfCarParkService;
    70. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    71. private CfOrderService cfOrderService;
    72. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    73. private CfCarParkReleaseLogService cfCarParkReleaseLogService;
    74. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    75. private CfCarParkDeviceService cfCarParkDeviceService;
    76. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    77. private CfCarParkChargingRulesService cfCarParkChargingRulesService;
    78. @Autowired
    79. protected HttpServletRequest request;
    80. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    81. private CfCarParkLinkUserService cfCarParkLinkUserService;
    82. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    83. private CfSystemConfigService cfSystemConfigService;
    84. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    85. private CfCarParkCarTypeService cfCarParkCarTypeService;
    86. @Reference(version = "1.0.0", retries = 0, timeout = 30000, check = false)
    87. private CfCouponService cfCouponService;
    88. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-add')")
    89. @Override
    90. @RequestMapping(value = "add", method = RequestMethod.POST)
    91. public ResponseResult add(@Validated @RequestBody CfCarParkUseLogForm cfCarParkUseLogForm) {
    92. CfCarParkUseLog cfCarParkUseLog = new CfCarParkUseLog();
    93. BeanUtils.copyProperties(cfCarParkUseLogForm, cfCarParkUseLog);
    94. CfCarParkUseLog carParkUseLog = cfCarParkUseLogService.add(cfCarParkUseLog);
    95. return new ResponseResult(CommonCode.SUCCESS, carParkUseLog);
    96. }
    97. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-update')")
    98. @Override
    99. @RequestMapping(value = "update", method = RequestMethod.PUT)
    100. public ResponseResult update(@Validated @RequestBody CfCarParkUseLogForm cfCarParkUseLogForm) {
    101. CfCarParkUseLog cfCarParkUseLog = new CfCarParkUseLog();
    102. BeanUtils.copyProperties(cfCarParkUseLogForm, cfCarParkUseLog);
    103. CfCarParkUseLog carParkUseLog = cfCarParkUseLogService.update(cfCarParkUseLog);
    104. return new ResponseResult(CommonCode.SUCCESS, carParkUseLog);
    105. }
    106. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-updateLogAndOrder')")
    107. @Override
    108. @RequestMapping(value = "updateLogAndOrder", method = RequestMethod.PUT)
    109. public ResponseResult updateLogAndOrder(@RequestBody @Validated UpdateLogAndOrderForm updateLogAndOrderForm) throws Exception {
    110. if(StringUtils.isEmpty(updateLogAndOrderForm.getActionType())){
    111. ExceptionCast.cast(CommonCode.INVALID_PARAM, "miss actionType");
    112. }
    113. UserBasicInfo userBasicInfo = AuthenticationInterceptor.parseJwt(HttpHearderUtils.getAuthorization(request));
    114. CfCarParkUseLog cfCarParkUseLog = cfCarParkUseLogService.findById(updateLogAndOrderForm.getCarParkUseLogId(), false);
    115. CfOrderQuery cfOrderQuery = new CfOrderQuery();
    116. cfOrderQuery.setGoodsId(updateLogAndOrderForm.getCarParkUseLogId());
    117. List cfOrderList = cfOrderService.getListByQuery(cfOrderQuery);
    118. if(cfOrderList==null || cfOrderList.size()==0){
    119. return new ResponseResult(PayCode.ORDER_DOES_NOT_EXIST);
    120. }
    121. //禁止操作非停车账单
    122. if(cfOrderList.get(0).getGoodsType()!= GoodsType.CARPARK_PAYMENT){
    123. return new ResponseResult(CommonCode.FAIL, null,"该账单并非停车账单");
    124. }
    125. if(cfOrderList.get(0).getStatus()==PayStatus.PAID){
    126. return new ResponseResult(CommonCode.FAIL, null,"该订单已支付");
    127. }
    128. if(StringUtils.isNotEmpty(cfOrderList.get(0).getUid()) && (System.currentTimeMillis()-cfOrderList.get(0).getUpdateTime()<10000)){
    129. return new ResponseResult(CommonCode.FREQUENT_OPERATION);
    130. }
    131. if(!userBasicInfo.getId().equals(cfCarParkUseLog.getInHandleUid()) && !userBasicInfo.getId().equals(cfCarParkUseLog.getOutHandleUid())){
    132. return new ResponseResult(CarParkCode.NO_PERMISSION);
    133. }
    134. if(updateLogAndOrderForm.getActionType().equals("cash_pay") || updateLogAndOrderForm.getActionType().equals("abnormal_termination_of_order")){
    135. cfCarParkUseLog.setPayTime(System.currentTimeMillis());
    136. }else if(updateLogAndOrderForm.getActionType().equals("cancel_release")){
    137. cfCarParkUseLog.setPayTime(0L);
    138. }
    139. cfCarParkUseLog.setOutReleaseType(ReleaseType.ARTIFICIAL);
    140. cfCarParkUseLogService.update(cfCarParkUseLog);
    141. // CfOrder cfOrder = cfOrderService.findById(orderId, false);
    142. //计算应付金额
    143. CfCarParkOrder cfCarParkOrder = cfCarParkChargingRulesService.calculateTheAmounPayable(updateLogAndOrderForm.getCarParkUseLogId(), null, FeeQueryMode.QUERY_MODE_QUERY_ONLY);
    144. CfOrder cfOrder = cfCarParkOrder.getCfOrder();
    145. if(cfOrder.getStatus()==PayStatus.PAID){
    146. return new ResponseResult(CommonCode.FAIL, null,"该订单已支付");
    147. }
    148. if((updateLogAndOrderForm.getActionType().equals("cash_pay") || updateLogAndOrderForm.getActionType().equals("abnormal_termination_of_order")) && StringUtils.isNotEmpty(updateLogAndOrderForm.getAmountOfMoney()) && (new BigDecimal(updateLogAndOrderForm.getAmountOfMoney())).doubleValue()>=0){
    149. //暂时不允许收费自己修改金额
    150. // cfOrder.setAmountActuallyPaid(new BigDecimal(amountOfMoney).add(cfOrder.getCollectionAmount()));
    151. // if(cfOrder.getCollectionAmount().doubleValue()>0){
    152. // cfOrder.setAmountActuallyPaid(cfOrder.getCollectionAmount().add(cfOrder.getAmountsPayable()));
    153. // }
    154. // if(cfOrder.getAmountsPayable().doubleValue()==0){
    155. // cfOrder.setAmountsPayable(cfOrder.getAmountActuallyPaid());
    156. // }
    157. if(System.currentTimeMillis()-cfOrder.getManualOfferSetTime()<=900000){
    158. BigDecimal amountsPayable = cfOrder.getAmountsPayable();
    159. cfOrder.setAmountsPayable(amountsPayable.subtract(cfOrder.getManualOffer()));
    160. cfOrder.setAmountActuallyPaid(cfOrder.getAmountsPayable());
    161. }else if(StringUtils.isNotEmpty(updateLogAndOrderForm.getCouponId())){
    162. CfCoupon cfCoupon = cfCouponService.findById(updateLogAndOrderForm.getCouponId(), false);
    163. if(cfCoupon.getCouponType()==(byte)2 && cfCoupon.getStatus()==CouponStatus.NOT_USED){
    164. CfCoupon coupon = new CfCoupon();
    165. coupon.setId(updateLogAndOrderForm.getCouponId());
    166. coupon.setUseTime(System.currentTimeMillis());
    167. if(cfOrder.getAmountsPayable().doubleValue()
    168. coupon.setAmountUsed(cfOrder.getAmountsPayable());
    169. }else{
    170. coupon.setAmountUsed(cfCoupon.getDenomination());
    171. }
    172. coupon.setStatus(CouponStatus.USED);
    173. cfCouponService.updateByPrimaryKeySelective(coupon);
    174. cfOrder.setCouponId(updateLogAndOrderForm.getCouponId());
    175. if(cfOrder.getAmountsPayable().doubleValue()
    176. cfOrder.setCouponPaid(cfOrder.getAmountsPayable());
    177. cfOrder.setAmountActuallyPaid(new BigDecimal(0.00));
    178. }else{
    179. cfOrder.setCouponPaid(cfCoupon.getDenomination());
    180. cfOrder.setAmountActuallyPaid(cfOrder.getAmountsPayable().subtract(cfCoupon.getDenomination()));
    181. }
    182. }
    183. }else{
    184. cfOrder.setAmountActuallyPaid(cfOrder.getAmountsPayable());
    185. }
    186. cfOrder.setStatus(PayStatus.PAID);
    187. cfOrder.setPayTime(System.currentTimeMillis());
    188. if(updateLogAndOrderForm.getActionType().equals("cash_pay")){
    189. cfOrder.setPaymentAgencyShortName("cash_pay_cny");
    190. if(StringUtils.isNotEmpty(cfCarParkUseLog.getOutCheckPointId())){
    191. cfCarParkReleaseLogService.executeReleaseByCarParkUseLog(cfCarParkUseLog,"岗亭人员确认现金收费手动放行",(byte)1);
    192. }
    193. }else{
    194. cfOrder.setPaymentAgencyShortName("abnormal_termination_of_order");
    195. //异常放行 实付金额为0
    196. cfOrder.setAmountActuallyPaid(new BigDecimal(0.00));
    197. if(StringUtils.isNotEmpty(cfCarParkUseLog.getOutCheckPointId())){
    198. cfCarParkReleaseLogService.executeReleaseByCarParkUseLog(cfCarParkUseLog,"岗亭人员确认后异常放行",(byte)2);
    199. }
    200. }
    201. if(cfOrder.getCollectionAmount().doubleValue()>0){
    202. //更新停车记录支付时间(因为存在代付金额时,当前停车记录支付时间会被临时置为0)
    203. CfCarParkUseLog carParkUseLog = new CfCarParkUseLog();
    204. carParkUseLog.setId(cfCarParkUseLog.getId());
    205. carParkUseLog.setPayTime(System.currentTimeMillis());
    206. cfCarParkUseLogService.updateByPrimaryKeySelective(carParkUseLog);
    207. }
    208. }else if(updateLogAndOrderForm.getActionType().equals("cancel_release")){
    209. cfOrder.setPayTime(0L);
    210. cfOrder.setStatus(PayStatus.TO_BE_PAID);
    211. CfCarParkUseLog carParkUseLog = new CfCarParkUseLog();
    212. carParkUseLog.setId(cfCarParkUseLog.getId());
    213. carParkUseLog.setPayTime(0l);
    214. cfCarParkUseLogService.updateByPrimaryKeySelective(carParkUseLog);
    215. }else if(updateLogAndOrderForm.getActionType().equals("change_amount") && cfCarParkOrder.getCfCarPark().getAllowEditUseLog()==(byte)1){
    216. cfOrder.setManualOffer(new BigDecimal(updateLogAndOrderForm.getAmountOfMoney()));
    217. cfOrder.setManualOfferSetTime(System.currentTimeMillis());
    218. cfOrder.setAmountsPayable(cfOrder.getManualOffer());
    219. }else{
    220. return new ResponseResult(CommonCode.FAIL, null,"更新订单失败");
    221. }
    222. CfOrder order = cfOrderService.update(cfOrder);
    223. if(order==null || order.getId()==null){
    224. return new ResponseResult(CommonCode.FAIL, null,"更新订单失败");
    225. }
    226. return new ResponseResult(CommonCode.SUCCESS);
    227. }
    228. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-dutyerUpdateUseLog')")
    229. @Override
    230. @RequestMapping(value = "dutyerUpdateUseLog", method = RequestMethod.PUT)
    231. public ResponseResult dutyerUpdateUseLog(UpdateLogAndOrderForm updateLogAndOrderForm) throws Exception {
    232. if(StringUtils.isEmpty(updateLogAndOrderForm.getCarParkUseLogId()) || StringUtils.isEmpty(updateLogAndOrderForm.getNumberPlate())){
    233. ExceptionCast.cast(CommonCode.INVALID_PARAM, "miss carParkUseLogId or numberPlate");
    234. }
    235. CfCarParkUseLog carParkUseLog = cfCarParkUseLogService.findById(updateLogAndOrderForm.getCarParkUseLogId(), false);
    236. CfCarPark cfCarPark = cfCarParkService.findById(carParkUseLog.getCarParkId(), false);
    237. if(cfCarPark.getAllowEditUseLog()==(byte)0){
    238. return new ResponseResult(CommonCode.FAIL, "该停车禁止修改停车数据");
    239. }
    240. if(carParkUseLog.getOutTime()>0){
    241. return new ResponseResult(CommonCode.FAIL, "只能修改入场数据");
    242. }
    243. CfCarParkUseLog cfCarParkUseLog = new CfCarParkUseLog();
    244. cfCarParkUseLog.setId(updateLogAndOrderForm.getCarParkUseLogId());
    245. cfCarParkUseLog.setNumberPlate(updateLogAndOrderForm.getNumberPlate());
    246. cfCarParkUseLogService.updateByPrimaryKeySelective(cfCarParkUseLog);
    247. return new ResponseResult(CommonCode.SUCCESS);
    248. }
    249. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-selectListByCondition')")
    250. @Override
    251. @RequestMapping(value = "selectListByCondition", method = RequestMethod.GET)
    252. public ResponseResult selectListByCondition(String conditions)throws Exception {
    253. Map map = makeAllowData(conditions, false);
    254. ArrayList allowFileds = (ArrayList)map.get("allowFileds");
    255. Map allowFiledsMap = (Map)map.get("allowFiledsMap");
    256. Map conditionsMap = (Map)map.get("conditionsMap");
    257. Integer counts = 0;
    258. if(((Map)conditionsMap.get("limit")).get("limit")>3000){
    259. ((Map)conditionsMap.get("limit")).put("limit",3000);
    260. }
    261. List cfCarParks = cfCarParkUseLogService.selectListByCondition(conditionsMap, allowFiledsMap,allowFileds);
    262. if(((Map)conditionsMap.get("limit")).get("page")==1){
    263. counts = cfCarParkUseLogService.selectListByConditionCounts(conditionsMap, allowFiledsMap, allowFileds);
    264. }
    265. if(cfCarParks!=null && cfCarParks.size()>0){
    266. String fileSourceAddress = cfSystemConfigService.getValueByKey("file_source_address", "http://file.cfeng.wang/");
    267. for (CfCarParkUseLog cfCarParkUseLog: cfCarParks){
    268. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "inSmallImage");
    269. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "outSmallImage");
    270. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "inBigImage");
    271. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "outBigImage");
    272. }
    273. return new ResponseResult(CommonCode.SUCCESS, cfCarParks, null, counts);
    274. }
    275. return new ResponseResult(CommonCode.NO_MORE_DATAS);
    276. }
    277. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-selectListByCondition')")
    278. @Override
    279. @RequestMapping(value = "exportUseLogExcel", method = RequestMethod.GET)
    280. public void exportUseLogExcel(HttpServletResponse response, String conditions) throws Exception {
    281. Map map = makeAllowData(conditions, false);
    282. ArrayList allowFileds = (ArrayList)map.get("allowFileds");
    283. Map allowFiledsMap = (Map)map.get("allowFiledsMap");
    284. Map conditionsMap = (Map)map.get("conditionsMap");
    285. List cfCarParks = cfCarParkUseLogService.selectListByCondition(conditionsMap, allowFiledsMap,allowFileds);
    286. //声明输出流
    287. OutputStream os = null;
    288. //设置响应头
    289. setResponseHeader(response,"停车记录");
    290. try {
    291. //获取输出流
    292. os = response.getOutputStream();
    293. //内存中保留3000条数据,以免内存溢出,其余写入硬盘
    294. SXSSFWorkbook wb = new SXSSFWorkbook(3000);
    295. //获取该工作区的第一个sheet
    296. Sheet sheet1 = wb.createSheet("sheet1");
    297. int excelRow = 0;
    298. //创建标题行
    299. Row titleRow = sheet1.createRow(excelRow++);
    300. ArrayList columnList = new ArrayList<>();
    301. columnList.add("序号");
    302. columnList.add("车牌号");
    303. columnList.add("停车场");
    304. columnList.add("姓名/楼栋");
    305. columnList.add("车辆类型");
    306. columnList.add("状态");
    307. columnList.add("应付金额");
    308. columnList.add("实付金额");
    309. columnList.add("支付方式");
    310. columnList.add("到期时间");
    311. columnList.add("入场时间");
    312. columnList.add("出场时间");
    313. columnList.add("停车时间");
    314. columnList.add("入场关卡");
    315. columnList.add("出场关卡");
    316. for(int i = 0;i
    317. //创建该行下的每一列,并写入标题数据
    318. Cell cell = titleRow.createCell(i);
    319. cell.setCellValue(columnList.get(i));
    320. }
    321. //设置内容行
    322. if(cfCarParks!=null && cfCarParks.size()>0){
    323. //序号是从1开始的
    324. int count = 1;
    325. //外层for循环创建行
    326. for(CfCarParkUseLog cfCarParkUseLog: cfCarParks){
    327. Row dataRow = sheet1.createRow(excelRow++);
    328. //序号
    329. Cell serialNumberCell = dataRow.createCell(0);
    330. serialNumberCell.setCellValue(count);
    331. //车牌号
    332. Cell numberPlateCell = dataRow.createCell(1);
    333. numberPlateCell.setCellValue(cfCarParkUseLog.getNumberPlate());
    334. //停车场
    335. Cell carParkCell = dataRow.createCell(2);
    336. if(cfCarParkUseLog.getCfCarPark()!=null){
    337. carParkCell.setCellValue(cfCarParkUseLog.getCfCarPark().getName());
    338. }else{
    339. carParkCell.setCellValue("");
    340. }
    341. //姓名/楼栋
    342. Cell carOwnerNameCell = dataRow.createCell(3);
    343. carOwnerNameCell.setCellValue(cfCarParkUseLog.getVisitUnit());
    344. //车辆类型
    345. Cell carTypeCell = dataRow.createCell(4);
    346. CfCarParkCarType cfCarParkCarType = cfCarParkCarTypeService.findByKey(cfCarParkUseLog.getCarType());
    347. if(cfCarParkCarType!=null){
    348. carTypeCell.setCellValue(cfCarParkCarType.getName());
    349. }else{
    350. carTypeCell.setCellValue("临时车");
    351. }
    352. //车辆状态
    353. Cell carStatus = dataRow.createCell(5);
    354. switch (cfCarParkUseLog.getCarStatus()){
    355. case (byte)0:
    356. carStatus.setCellValue("禁用");
    357. break;
    358. case (byte)1:
    359. carStatus.setCellValue("正常");
    360. break;
    361. case (byte)2:
    362. carStatus.setCellValue("已过期");
    363. break;
    364. }
    365. //应付金额
    366. Cell amountsPayableCell = dataRow.createCell(6);
    367. if(cfCarParkUseLog.getCfOrder()!=null){
    368. amountsPayableCell.setCellValue(cfCarParkUseLog.getCfOrder().getAmountsPayable().toString());
    369. }else{
    370. amountsPayableCell.setCellValue("");
    371. }
    372. //实付金额
    373. Cell amountActuallyPaidCell = dataRow.createCell(7);
    374. if(cfCarParkUseLog.getCfOrder()!=null){
    375. amountActuallyPaidCell.setCellValue(cfCarParkUseLog.getCfOrder().getAmountActuallyPaid().toString());
    376. }else{
    377. amountActuallyPaidCell.setCellValue("");
    378. }
    379. //支付方式
    380. Cell paymentAgencyShortNameCell = dataRow.createCell(8);
    381. if(cfCarParkUseLog.getCfPaymentAgency()!=null){
    382. paymentAgencyShortNameCell.setCellValue(cfCarParkUseLog.getCfPaymentAgency().getName());
    383. }else{
    384. paymentAgencyShortNameCell.setCellValue("");
    385. }
    386. //到期时间
    387. Cell packageEndTimeCell = dataRow.createCell(9);
    388. if(cfCarParkUseLog.getCfCarParkPackage()!=null){
    389. packageEndTimeCell.setCellValue(DateUtil.stampToDate(cfCarParkUseLog.getCfCarParkPackage().getEndTime(),"yyyy-MM-dd HH:mm:ss"));
    390. }else{
    391. packageEndTimeCell.setCellValue("");
    392. }
    393. //入场时间
    394. Cell inTimeCell = dataRow.createCell(10);
    395. if(cfCarParkUseLog.getInTime()>0){
    396. inTimeCell.setCellValue(DateUtil.stampToDate(cfCarParkUseLog.getInTime(),"yyyy-MM-dd HH:mm:ss"));
    397. }else{
    398. inTimeCell.setCellValue("");
    399. }
    400. //出场时间
    401. Cell outTimeCell = dataRow.createCell(11);
    402. if(cfCarParkUseLog.getOutTime()>0){
    403. outTimeCell.setCellValue(DateUtil.stampToDate(cfCarParkUseLog.getOutTime(),"yyyy-MM-dd HH:mm:ss"));
    404. }else{
    405. outTimeCell.setCellValue("");
    406. }
    407. //停车时间
    408. Cell useTimeCell = dataRow.createCell(12);
    409. if(cfCarParkUseLog.getInTime()>0 && cfCarParkUseLog.getOutTime()>cfCarParkUseLog.getInTime()){
    410. useTimeCell.setCellValue(DateUtil.getDifferenceByTimeStamp(cfCarParkUseLog.getInTime(),cfCarParkUseLog.getOutTime()));
    411. }else{
    412. useTimeCell.setCellValue("");
    413. }
    414. //入场关卡
    415. Cell inCheckPointCell = dataRow.createCell(13);
    416. if(cfCarParkUseLog.getCfCarParkCheckpointIn()!=null){
    417. inCheckPointCell.setCellValue(cfCarParkUseLog.getCfCarParkCheckpointIn().getName());
    418. }else{
    419. inCheckPointCell.setCellValue("");
    420. }
    421. //出场关卡
    422. Cell outCheckPointCell = dataRow.createCell(14);
    423. if(cfCarParkUseLog.getCfCarParkCheckpointOut()!=null){
    424. outCheckPointCell.setCellValue(cfCarParkUseLog.getCfCarParkCheckpointOut().getName());
    425. }else{
    426. outCheckPointCell.setCellValue("");
    427. }
    428. count++;
    429. }
    430. }
    431. //将整理好的excel数据写入流中
    432. wb.write(os);
    433. } catch (IOException e) {
    434. throw e;
    435. } finally {
    436. try {
    437. // 关闭输出流
    438. if (os != null) {
    439. os.close();
    440. }
    441. } catch (IOException e) {
    442. throw e;
    443. }
    444. }
    445. }
    446. /*
    447. 设置浏览器下载响应头
    448. */
    449. private static void setResponseHeader(HttpServletResponse response, String fileName) throws Exception {
    450. fileName = new String(fileName.getBytes(),"ISO8859-1");
    451. response.setContentType("application/octet-stream;charset=UTF-8");
    452. response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
    453. response.addHeader("Pargam", "no-cache");
    454. response.addHeader("Cache-Control", "no-cache");
    455. }
    456. @Override
    457. @RequestMapping(value = "dutySelectListByCondition", method = RequestMethod.GET)
    458. public ResponseResult dutySelectListByCondition(String conditions) throws Exception {
    459. Map map = makeAllowData(conditions, true);
    460. ArrayList allowFileds = (ArrayList)map.get("allowFileds");
    461. Map allowFiledsMap = (Map)map.get("allowFiledsMap");
    462. Map conditionsMap = (Map)map.get("conditionsMap");
    463. List cfCarParks = cfCarParkUseLogService.selectListByCondition(conditionsMap, allowFiledsMap,allowFileds);
    464. Integer counts = cfCarParkUseLogService.selectListByConditionCounts(conditionsMap, allowFiledsMap, allowFileds);
    465. if(cfCarParks!=null && cfCarParks.size()>0){
    466. String fileSourceAddress = cfSystemConfigService.getValueByKey("file_source_address", "http://file.cfeng.wang/");
    467. for (CfCarParkUseLog cfCarParkUseLog: cfCarParks){
    468. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "inSmallImage");
    469. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "outSmallImage");
    470. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "inBigImage");
    471. FileUtils.handleFileSourcePrefix(cfCarParkUseLog, fileSourceAddress, "outBigImage");
    472. }
    473. return new ResponseResult(CommonCode.SUCCESS, cfCarParks, null, counts);
    474. }
    475. return new ResponseResult(CommonCode.NO_MORE_DATAS);
    476. }
    477. /**
    478. * 制作条件搜索合法数据
    479. * @param conditions
    480. * @param isDuty 是否为值班人员擦好像
    481. * @return
    482. * @throws Exception
    483. */
    484. private Map makeAllowData(String conditions, boolean isDuty)throws Exception{
    485. UserBasicInfo userBasicInfo = AuthenticationInterceptor.parseJwt(HttpHearderUtils.getAuthorization(request));
    486. ArrayList allowFileds = new ArrayList<>();
    487. allowFileds.add("id");
    488. allowFileds.add("number_plate");
    489. allowFileds.add("car_park_id");
    490. allowFileds.add("in_time");
    491. allowFileds.add("out_time");
    492. allowFileds.add("in_release_type");
    493. allowFileds.add("out_release_type");
    494. allowFileds.add("in_check_point_id");
    495. allowFileds.add("out_check_point_id");
    496. allowFileds.add("create_position");
    497. allowFileds.add("pay_time");
    498. allowFileds.add("create_time");
    499. allowFileds.add("in_handle_uid");
    500. allowFileds.add("out_handle_uid");
    501. allowFileds.add("status");
    502. allowFileds.add("car_owner_name");
    503. allowFileds.add("car_park_id$in");
    504. allowFileds.add("payment_agency_short_name$in");
    505. allowFileds.add("car_type");
    506. allowFileds.add("car_status");
    507. allowFileds.add("visit_unit");
    508. allowFileds.add("payment_agency_short_name");
    509. allowFileds.add("amounts_payable");
    510. allowFileds.add("amount_actually_paid");
    511. allowFileds.add("or_and");
    512. allowFileds.add("or_eq");
    513. allowFileds.add("like");
    514. allowFileds.add("group");
    515. allowFileds.add("order");
    516. allowFileds.add("limit");
    517. Map allowFiledsMap = new HashMap();
    518. allowFiledsMap.put("id","cpul");
    519. allowFiledsMap.put("number_plate","cpul");
    520. allowFiledsMap.put("car_park_id","cpul");
    521. allowFiledsMap.put("in_time","cpul");
    522. allowFiledsMap.put("out_time","cpul");
    523. allowFiledsMap.put("in_release_type","cpul");
    524. allowFiledsMap.put("out_release_type","cpul");
    525. allowFiledsMap.put("in_check_point_id","cpul");
    526. allowFiledsMap.put("out_check_point_id","cpul");
    527. allowFiledsMap.put("create_position","cpul");
    528. allowFiledsMap.put("pay_time","cpul");
    529. allowFiledsMap.put("create_time","cpul");
    530. allowFiledsMap.put("in_handle_uid","cpul");
    531. allowFiledsMap.put("out_handle_uid","cpul");
    532. allowFiledsMap.put("status","ord");
    533. allowFiledsMap.put("car_owner_name","cpp");
    534. allowFiledsMap.put("car_park_id$in","cpul");
    535. allowFiledsMap.put("car_type","cpul");
    536. allowFiledsMap.put("car_status","cpul");
    537. allowFiledsMap.put("visit_unit","cpul");
    538. allowFiledsMap.put("payment_agency_short_name","ord");
    539. allowFiledsMap.put("payment_agency_short_name$in","ord");
    540. allowFiledsMap.put("amounts_payable","ord");
    541. allowFiledsMap.put("amount_actually_paid","ord");
    542. allowFiledsMap.put("or_and","");
    543. allowFiledsMap.put("or_eq","");
    544. allowFiledsMap.put("like","");
    545. allowFiledsMap.put("group","");
    546. allowFiledsMap.put("order","");
    547. allowFiledsMap.put("limit","");
    548. Map map = new HashMap<>();
    549. map.put("allowFileds",allowFileds);
    550. map.put("allowFiledsMap",allowFiledsMap);
    551. Map conditionsMap = (JSONObject.parseObject(conditions));
    552. Map paymentAgencyShortNameMap = (Map) conditionsMap.get("payment_agency_short_name");
    553. Map feeMap = (Map) conditionsMap.get("is_fee");
    554. Map typeKeyMap = (Map) conditionsMap.get("type_key");
    555. if(conditionsMap.containsKey("payment_agency_short_name") && paymentAgencyShortNameMap!=null){
    556. if(StringUtils.isNotEmpty(paymentAgencyShortNameMap.get("value")) && !paymentAgencyShortNameMap.get("value").equals("cash_pay_cny") && !paymentAgencyShortNameMap.get("value").equals("abnormal_termination_of_order")){
    557. HashMap valueMap = new HashMap<>();
    558. valueMap.put("operator","in");
    559. valueMap.put("value","'wei_xin_pay_cny','ali_pay_cny','wei_xin_h5_pay_cny','ali_h5_pay_cny'");
    560. conditionsMap.put("payment_agency_short_name$in", valueMap);
    561. //干掉它
    562. conditionsMap.remove("payment_agency_short_name");
    563. }else if(StringUtils.isNotEmpty(paymentAgencyShortNameMap.get("value")) && paymentAgencyShortNameMap.get("value").equals("abnormal_termination_of_order") && conditionsMap.containsKey("or_and")){
    564. ((Map)conditionsMap.get("payment_agency_short_name")).put("or","1");
    565. ((Map) conditionsMap.get("or_and")).put("and","1");
    566. }
    567. }
    568. if(conditionsMap.containsKey("type_key") && typeKeyMap!=null && typeKeyMap.get("value").equals("temporary_car")){
    569. if(StringUtils.isNotEmpty(typeKeyMap.get("value")) && !typeKeyMap.get("value").equals("cash_pay_cny")){
    570. //干掉它
    571. conditionsMap.remove("type_key");
    572. //重制
    573. HashMap valueMap = new HashMap<>();
    574. valueMap.put("operator","is");
    575. valueMap.put("value","null");
    576. conditionsMap.put("type_key", valueMap);
    577. }
    578. }
    579. if(isDuty && conditionsMap.containsKey("is_fee") && feeMap!=null){
    580. if(StringUtils.isNotEmpty(feeMap.get("value")) && feeMap.get("value").equals("fee")){
    581. HashMap valueMap = new HashMap<>();
    582. valueMap.put("operator","in");
    583. valueMap.put("value","'wei_xin_pay_cny','ali_pay_cny','wei_xin_h5_pay_cny','ali_h5_pay_cny','cash_pay_cny'");
    584. conditionsMap.put("payment_agency_short_name$in", valueMap);
    585. HashMap valueMap2 = new HashMap<>();
    586. valueMap2.put("operator","=");
    587. valueMap2.put("value","1");
    588. conditionsMap.put("status", valueMap2);
    589. //干掉它
    590. conditionsMap.remove("fee");
    591. }else if(StringUtils.isNotEmpty(feeMap.get("value")) && feeMap.get("value").equals("free")){
    592. HashMap valueMap = new HashMap<>();
    593. valueMap.put("operator","in");
    594. valueMap.put("value","'system_free_time','coupon','package'");
    595. conditionsMap.put("payment_agency_short_name$in", valueMap);
    596. HashMap valueMap2 = new HashMap<>();
    597. valueMap2.put("operator","=");
    598. valueMap2.put("value","1");
    599. conditionsMap.put("status", valueMap2);
    600. //干掉它
    601. conditionsMap.remove("fee");
    602. }
    603. }
    604. if(StringTools.findStringInArray(userBasicInfo.getRoleFlag().split(","), "admin")<0 && StringTools.findStringInArray(userBasicInfo.getRoleFlag().split(","), "finance")<0){
    605. CfCarParkLinkUserQuery cfCarParkLinkUserQuery = new CfCarParkLinkUserQuery();
    606. cfCarParkLinkUserQuery.setUid(userBasicInfo.getId());
    607. List cfCarParkLinkUsers = cfCarParkLinkUserService.getListByQuery(cfCarParkLinkUserQuery);
    608. if(cfCarParkLinkUsers==null || cfCarParkLinkUsers.size()==0){
    609. ExceptionCast.cast(CommonCode.NO_MORE_DATAS);
    610. }
    611. String carParkIds = "";
    612. for (CfCarParkLinkUser cfCarParkLinkUser: cfCarParkLinkUsers){
    613. carParkIds += ",'"+cfCarParkLinkUser.getCarParkId()+"'";
    614. }
    615. carParkIds = carParkIds.substring(1);
    616. if(StringUtils.isNotEmpty(carParkIds)){
    617. HashMap valueMap = new HashMap<>();
    618. valueMap.put("operator","in");
    619. valueMap.put("value",carParkIds);
    620. conditionsMap.put("car_park_id$in", valueMap);
    621. }
    622. }
    623. if(isDuty && StringTools.findStringInArray(userBasicInfo.getRoleFlag().split(","), "admin")<0){
    624. HashMap valueMap1 = new HashMap<>();
    625. HashMap valueMap2 = new HashMap<>();
    626. // valueMap2.put("cpul.in_handle_uid",userBasicInfo.getId());
    627. // valueMap2.put("cpul.out_handle_uid",userBasicInfo.getId());
    628. valueMap1.put("operator","or_eq");
    629. valueMap1.put("value",valueMap2);
    630. conditionsMap.put("or_eq", valueMap1);
    631. }
    632. map.put("conditionsMap",conditionsMap);
    633. return map;
    634. }
    635. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-getCarParkUseLogListByQuery')")
    636. @Override
    637. @RequestMapping(value = "getCarParkUseLogListByQuery", method = RequestMethod.GET)
    638. public ResponseResult getCarParkUseLogListByQuery(CfCarParkUseLogQuery cfCarParkUseLogQuery) throws Exception {
    639. // cfCarParkUseLogQuery.setOrderBy("cpul.create_time desc");
    640. List cfCarParkUseLogs = cfCarParkUseLogService.selectByQuery(cfCarParkUseLogQuery);
    641. if(cfCarParkUseLogs!=null && cfCarParkUseLogs.size()>0){
    642. return new ResponseResult(CommonCode.SUCCESS, cfCarParkUseLogs);
    643. }
    644. return new ResponseResult(CommonCode.NO_MORE_DATAS);
    645. }
    646. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-delete')")
    647. @Override
    648. @RequestMapping(value = "delete", method = RequestMethod.DELETE)
    649. public ResponseResult delete(String id) {
    650. Integer delete = 0;
    651. if(id.indexOf(",")>-1){
    652. String[] ids = id.split(",");
    653. CfCarParkUseLogQuery cfCarParkUseLogQuery = new CfCarParkUseLogQuery();
    654. cfCarParkUseLogQuery.setIds(new ArrayList<>());
    655. for(int i = 0; i< ids.length; i++){
    656. cfCarParkUseLogQuery.getIds().add(ids[i]);
    657. }
    658. delete = cfCarParkUseLogService.deleteByQuery(cfCarParkUseLogQuery);
    659. }else{
    660. delete = cfCarParkUseLogService.delete(id);
    661. }
    662. if(delete==0){
    663. return new ResponseResult(CommonCode.FAIL);
    664. }
    665. return new ResponseResult(CommonCode.SUCCESS);
    666. }
    667. @Override
    668. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-countUseLogs')")
    669. @RequestMapping(value = "countUseLogs", method = RequestMethod.GET)
    670. public ResponseResult countUseLogs(CfCountCarParkUseLogQuery cfCountCarParkUseLogQuery) {
    671. if(cfCountCarParkUseLogQuery.getDate().equals("") || cfCountCarParkUseLogQuery.getDate().equals("null")){
    672. cfCountCarParkUseLogQuery.setDate(null);
    673. }
    674. if(cfCountCarParkUseLogQuery.getEndDate().equals("") || cfCountCarParkUseLogQuery.getEndDate().equals("null")){
    675. cfCountCarParkUseLogQuery.setEndDate(null);
    676. }
    677. if(cfCountCarParkUseLogQuery.getYear().equals("") || cfCountCarParkUseLogQuery.getYear().equals("null")){
    678. cfCountCarParkUseLogQuery.setYear(null);
    679. }
    680. if(cfCountCarParkUseLogQuery.getMonth().equals("") || cfCountCarParkUseLogQuery.getMonth().equals("null")){
    681. cfCountCarParkUseLogQuery.setMonth(null);
    682. }
    683. if(cfCountCarParkUseLogQuery.getDay().equals("") || cfCountCarParkUseLogQuery.getDay().equals("null")){
    684. cfCountCarParkUseLogQuery.setDay(null);
    685. }
    686. if(cfCountCarParkUseLogQuery.getCarparkId().equals("") || cfCountCarParkUseLogQuery.getCarparkId().equals("null")){
    687. cfCountCarParkUseLogQuery.setCarparkId(null);
    688. }
    689. if(cfCountCarParkUseLogQuery.getNumberPlate().equals("") || cfCountCarParkUseLogQuery.getNumberPlate().equals("null")){
    690. cfCountCarParkUseLogQuery.setNumberPlate(null);
    691. }
    692. if(cfCountCarParkUseLogQuery.getCountryId().equals("") || cfCountCarParkUseLogQuery.getCountryId().equals("null")){
    693. cfCountCarParkUseLogQuery.setCountryId(null);
    694. }
    695. if(cfCountCarParkUseLogQuery.getProvinceId().equals("") || cfCountCarParkUseLogQuery.getProvinceId().equals("null")){
    696. cfCountCarParkUseLogQuery.setProvinceId(null);
    697. }
    698. if(cfCountCarParkUseLogQuery.getStateOrCityId().equals("") || cfCountCarParkUseLogQuery.getStateOrCityId().equals("null")){
    699. cfCountCarParkUseLogQuery.setStateOrCityId(null);
    700. }
    701. if(cfCountCarParkUseLogQuery.getZoneOrCountyId().equals("") || cfCountCarParkUseLogQuery.getZoneOrCountyId().equals("null")){
    702. cfCountCarParkUseLogQuery.setZoneOrCountyId(null);
    703. }
    704. if(cfCountCarParkUseLogQuery.getTownshipId().equals("") || cfCountCarParkUseLogQuery.getTownshipId().equals("null")){
    705. cfCountCarParkUseLogQuery.setTownshipId(null);
    706. }
    707. List list = null;
    708. switch (cfCountCarParkUseLogQuery.getCountType()){
    709. case "before_day_count_by_day":
    710. list = cfCarParkUseLogService.limitDaysCountByDay(cfCountCarParkUseLogQuery);
    711. break;
    712. case "month_count_by_day":
    713. list = cfCarParkUseLogService.yearMonthCountByDay(cfCountCarParkUseLogQuery);
    714. break;
    715. case "year_count_by_month":
    716. list = cfCarParkUseLogService.yearCountByMonth(cfCountCarParkUseLogQuery);
    717. break;
    718. }
    719. if(list==null || list.size()==0){
    720. return new ResponseResult(CommonCode.NO_MORE_DATAS);
    721. }
    722. return new ResponseResult(CommonCode.SUCCESS, list, cfCarParkUseLogService.getCountByQuery(new CfCarParkUseLogQuery()));
    723. }
    724. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-countPayAmountByDuty')")
    725. @Override
    726. @RequestMapping(value = "countPayAmountByDuty", method = RequestMethod.GET)
    727. public ResponseResult countPayAmountByDuty(CountPayAmountByDutyQuery countPayAmountByDutyQuery) throws Exception {
    728. if(StringUtils.isEmpty(countPayAmountByDutyQuery.getCountMode())){
    729. countPayAmountByDutyQuery.setCountMode("real_time");
    730. }
    731. UserBasicInfo userBasicInfo = AuthenticationInterceptor.parseJwt(HttpHearderUtils.getAuthorization(request));
    732. if(countPayAmountByDutyQuery.getCountMode().equals("real_time")){
    733. CfCarParkLinkUserQuery cfCarParkLinkUserQuery = new CfCarParkLinkUserQuery();
    734. cfCarParkLinkUserQuery.setUid(userBasicInfo.getId());
    735. cfCarParkLinkUserQuery.setPage(1);
    736. cfCarParkLinkUserQuery.setSize(1);
    737. List cfCarParkLinkUsers = cfCarParkLinkUserService.getListByQuery(cfCarParkLinkUserQuery);
    738. if(cfCarParkLinkUsers!=null && cfCarParkLinkUsers.size()>0){
    739. countPayAmountByDutyQuery.setMinTime(cfCarParkLinkUsers.get(0).getStartDutyTime());
    740. }else{
    741. countPayAmountByDutyQuery.setMinTime(System.currentTimeMillis());
    742. }
    743. }else if(countPayAmountByDutyQuery.getCountMode().equals("day")){
    744. countPayAmountByDutyQuery.setMinTime(DateUtil.getSameDayMinOrMaxTimestamp("min"));
    745. }else{
    746. countPayAmountByDutyQuery.setMinTime(System.currentTimeMillis());
    747. }
    748. countPayAmountByDutyQuery.setHandleUid(userBasicInfo.getId());
    749. countPayAmountByDutyQuery.setMaxTime(DateUtil.maxMillisecondBaseOnTheDayToTimestamp(System.currentTimeMillis()));
    750. BigDecimal countPayAmountByDuty = cfCarParkUseLogService.countPayAmountByDuty(countPayAmountByDutyQuery);
    751. return new ResponseResult(CommonCode.SUCCESS, countPayAmountByDuty);
    752. }
    753. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-capture')")
    754. @Override
    755. @RequestMapping(value = "capture", method = RequestMethod.GET)
    756. public ResponseResult capture(String sn) {
    757. CfCarParkDevice cfCarParkDevice = cfCarParkDeviceService.findByCode(sn, false);
    758. Object capture = cfCarParkReleaseLogService.capture(sn, cfCarParkDevice.getBrand(), 0);
    759. return new ResponseResult(CommonCode.SUCCESS, capture);
    760. }
    761. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-countByQuery')")
    762. @Override
    763. @RequestMapping(value = "countByQuery", method = RequestMethod.GET)
    764. public ResponseResult countByQuery(CfCarParkUseLogQuery cfCarParkUseLogQuery) throws Exception {
    765. UserBasicInfo userBasicInfo = AuthenticationInterceptor.parseJwt(HttpHearderUtils.getAuthorization(request));
    766. if(StringTools.findStringInArray(userBasicInfo.getRoleFlag().split(","), "admin")<0){
    767. CfCarParkLinkUserQuery cfCarParkLinkUserQuery = new CfCarParkLinkUserQuery();
    768. cfCarParkLinkUserQuery.setUid(userBasicInfo.getId());
    769. List cfCarParkLinkUsers = cfCarParkLinkUserService.getListByQuery(cfCarParkLinkUserQuery);
    770. if(cfCarParkLinkUsers==null || cfCarParkLinkUsers.size()==0){
    771. ExceptionCast.cast(CommonCode.NO_MORE_DATAS);
    772. }
    773. List carParkIds = new ArrayList<>();
    774. for (CfCarParkLinkUser cfCarParkLinkUser: cfCarParkLinkUsers){
    775. carParkIds.add(cfCarParkLinkUser.getCarParkId());
    776. }
    777. cfCarParkUseLogQuery.setCarParkIds(carParkIds);
    778. }
    779. Integer countByQuery = cfCarParkUseLogService.countByQuery(cfCarParkUseLogQuery);
    780. return new ResponseResult(CommonCode.SUCCESS, null, countByQuery);
    781. }
    782. @PreAuthorize("hasAuthority('carpark-CfCarParkUseLogController-mergeCarUseLog')")
    783. @Override
    784. @RequestMapping(value = "mergeCarUseLog", method = RequestMethod.PUT)
    785. public ResponseResult mergeCarUseLog(String beforeCfCarParkUseLogId, String nowcfCarParkUseLogId, String numberPlate) throws Exception {
    786. UserBasicInfo userBasicInfo = AuthenticationInterceptor.parseJwt(HttpHearderUtils.getAuthorization(request));
    787. CfCarParkUseLog beforeCfCarParkUseLog = cfCarParkUseLogService.findById(beforeCfCarParkUseLogId, false);
    788. CfCarParkUseLog nowcfCarParkUseLog = cfCarParkUseLogService.findById(nowcfCarParkUseLogId, false);
    789. if(!beforeCfCarParkUseLog.getCarParkId().equals(nowcfCarParkUseLog.getCarParkId()) ||
    790. !nowcfCarParkUseLog.getOutHandleUid().equals(userBasicInfo.getId())){
    791. return new ResponseResult(CommonCode.UNAUTHORISE);
    792. }
    793. beforeCfCarParkUseLog.setOutTime(nowcfCarParkUseLog.getOutTime());
    794. beforeCfCarParkUseLog.setOutSmallImage(nowcfCarParkUseLog.getOutSmallImage());
    795. beforeCfCarParkUseLog.setOutBigImage(nowcfCarParkUseLog.getOutBigImage());
    796. beforeCfCarParkUseLog.setOutCheckPointId(nowcfCarParkUseLog.getOutCheckPointId());
    797. beforeCfCarParkUseLog.setOutHandleUid(nowcfCarParkUseLog.getOutHandleUid());
    798. if(StringUtils.isNotEmpty(numberPlate)){
    799. beforeCfCarParkUseLog.setNumberPlate(numberPlate);
    800. }else{
    801. beforeCfCarParkUseLog.setNumberPlate(nowcfCarParkUseLog.getNumberPlate());
    802. }
    803. CfCarParkUseLog newcfCarParkUseLog = cfCarParkUseLogService.update(beforeCfCarParkUseLog);
    804. cfCarParkUseLogService.delete(nowcfCarParkUseLogId);
    805. return new ResponseResult(CommonCode.SUCCESS, newcfCarParkUseLog);
    806. }
    807. }

    2、功能清单

    2.1、系统功能一览表

    1. 智慧停车

    支持模式

      • 封闭性单个停车场
      • 路边停车(车位级管理)
      • 大小场(场中场),多场子并行或嵌套

    所有者模式

      • 统一平台管理
      • 总平台下子账号(区域代理)自建场地资源,自行维护数据
      • 总平台下子账号(区域代理)再分配和单个停车场管理人员(物业管理/维保/保安/财务等人员)

    场站管理

      • 车位控制】 > 精准的实时车位统计和数据及时推送到场地led/lcd屏幕,车位满后禁止车辆进入
      • 责任制】 > 每个场地标记所有者,负责人信息,有需要直连联系实际控制负责人
      • 完整证据链】 > 详细实时记录每一辆车进出时间/场地/进出口/值班人员/图片/视频/金额/优惠/车辆情况(车辆类型|套餐|颜色|品牌)/开闸情况

    值班调度

      • 值守模式】 > 支持有人值守/无人值守/统一远程值守调度,数字数据全自动化录入,处理,资产数据产出并计算汇报展现
      • 重复过滤】 > 支持入场二次确认,避免路过和倒车车辆误拍产生歧义账单。短时间内重复多次抓拍只记录一条数据
      • 无处可逃】 > 出场跟车逃费标记,逃费入场提示追缴,补缴入场。支持单场追缴和全网追缴。黑名单通知,违法在逃车辆协同公安网络实时上报
      • 万无一失】 > 入场车牌识别错误可手动校正车牌,出场识别错误自动模糊相似车牌尝试匹配
      • 应急响应】 > 支持一键放行,处理紧急情况,手动免单。支持远程可视对讲。
      • 特殊群体】 > 支持自定义公务车自动免单放行,例如警车,军车,大使馆车,消防车等
      • 断电断网】 > 断电支持值守人员手机一键进出场拍照录入,入场录入人工放行入场,出场时值守人员向车主展示账单,车主扫码支付离场。 > 断网支持硬件设备白名单快速自动放行。保障断网解决方案:增加车牌识别相机4G模块/或者使用双网络路由器(4G/有线智能切换)
      • 安保互动】 > 支持入场时值守人员留言,出场时备注留言提示
      • 一码识车】 > 新车无牌/车牌受污/车牌变形/非常规车牌无法识别/三轮代步车等,一键扫码自助入场,扫码缴费出场。公众号/小程序/APP数据一号互通

    进出控制与显示

      • 私人定制】 > 支持自定义车辆类型,每个停车场都可以单独对每种车辆类型设定独立的进出收费规则,放行规则,文字播报,语音提示,图片,视频等 > 例如黑名单禁止入场,且禁止录入数据,并提示。免费车,在有效期内,享受不一样的停车特权
      • 停车VIP】 > 每个停车场都可以独立发行内部和公开的车辆套餐产品,车主可以通过手机端新购和续费停车套餐,生效期进出无阻,套餐即将过期通知续费 > 例如黑名单禁止入场,且禁止录入数据,并提示。免费车,在有效期内,享受不一样的停车特权
      • 特殊车辆】 > 例如日包车(白天停车免费),夜包车(晚上停车免费)。支持特殊车辆自助购买和续费,弥补车辆套餐不够灵活的缺陷

    车位管理

      • 多位多车】 > 支持一位多车和多位多车自动切换享受套餐停车特权
      • 神圣私产】 > 支持车位级别管理,车位主人一键扫码升降地锁
      • 车位共享】 > 支持公共车位扫码降锁入位,计时,超时扫码缴费降锁离场
      • 快速停车】 > 手机端实时数据显示当前位置和目的地附近停车场车位情况(余位/价格/免停时长/禁停时段/车场图片/具体位置),可一键导航到空位车
      • 反向寻车】 > 面对复杂多层大型停车场(例如:大型商场地下停车场,机场,超大型立体停车楼等),忘记了自己停在几楼哪个车位,利用车位相机自动记录 > 您车辆所在楼层和车位,使用室内导航实时引导您走到你的车辆跟前,导航精度0.5米左右

    2. 智慧充电

    新能源汽车充电

    两轮/三轮电动车充电

    3. 智慧社区

    社区管理

    物业管理

    人脸门禁

    上门维修

    4. 电子支付

    本平台聚合支付

    第三方聚合支付

    银行支付

    无感支付

    5. 用户资源

    权限分配

    资源分配

    3、硬件设置

    3.1、车牌识别相机设置

    3.1.1、千熠相机

    3.1.1.1、MQTT协议连接云平台

    【注意事项】:

    平台域名:39.174.170.81 平台端口:9004 ①:平台用户名,在录入设备到管理后台之后会有一条硬件数据,将该数据id作为用户名,如下图,复制id过来

    ②:平台密码,要与后台管理设备中的”设备登录密码“ 保持一致

    ③:设备类型标识符,要与后台管理设备中的”产品key“ 保持一致

    ④:设备品类密钥,忽略,不管它

    ⑤:客户端id,请填写该设备的”序列号“ ⑥:结果与图片:分开上传 ⑦:协议类型:阿里云 ⑧:存储域名:cfzh.oss-cn-shanghai.aliyuncs.com ⑨:存储账号:0zbW2BuyAoIHePXJhVYXeKBWOfNxaD ⑩:存储密码:远程(向日葵,或者 todesk)给我们,我们工作人员帮你填 11:发送图片/发送小图 都勾上

    3.1.2、臻识相机

    3.1.2.1、先让设备能联网

    3.1.3.1、R3/C3/R5系列

    3.1.4.1、RM系列

    3.1.6、华夏相机

    3.1.6.1、V85系列

    3.1.7.1、V87系列

    3.1.9、海康相机

    3.1.10、大华相机

    4、环境部署

    4.1、准备工作

    4.1.1、服务器

    操作系统 建议Centos7.5以上 后续所有教程都是基于Linux Centos 操作系统进行的

    请准备 最低64核128G 100M带宽 硬盘1T起步 的服务器

    本系统为超级系统,真刀真枪干大事,不是小打小闹。要私有化部署的,请提前合理规划自己的资源和预算。

    4.1.2、同步服务器时间

    安装插件: yum -y install ntp ntpdate

    同步阿里云时间: ntpdate time1.aliyun.com

    设置时区: timedatectl set-timezone Asia/Shanghai

    将系统时间同步到硬件: hwclock -w

    查看系统时间: date

    查看硬件时间: hwclock

    4.2、基础环境

    4.2.1、安装java基础JDK

    4.2.1.1、JDK1.8安装

    1. 下载

    下载地址:https://www.oracle.com/java/technologies/downloads/#java8

    【选择版本】: > 选择你对应的版本,如果不知道你系统是多少位,使用命令查看getconf LONG_BIT,如果显示64,说明你系统是64位,请选择 x64 Compressed Archive 下载选择你对应的版本,如果不知道你系统是多少位,使用命令查看getconf LONG_BIT,如果显示64,说明你系统是64位,请选择 x64 Compressed Archive 下载

    【解压复制】

    *注意,如果你下载的文件名跟老王的不一样,请根据实际情况执行命令

    解压 > tar -zxvf jdk-8u371-linux-x64.tar.gz 

    复制 > 解压 tar -zxvf jdk-8u371-linux-x64.tar.gz 复制 cp jdk1.8.0_371 /usr/local/jdk1.8.0_371 -r``cp jdk1.8.0_371 /usr/local/jdk1.8.0_371 -r

    2. 设置环境变量

    【修改对应配置文件】

    > 打开文件vim /etc/profile 追加内容 export JAVA_HOME=/usr/local/jdk1.8.0_371 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 保存并退出

    【修改对应配置文件】: > 刷新加载环境变量配置source /etc/profile

    【验证是否安装成功】

    > 执行指令java -version

    如果显示 例如

    java version "1.8.0_371" Java(TM) SE Runtime Environment (build 1.8.0_371-b11) Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)

    说明安装成功 牛逼666

    4.2.1.2、JDK20安装

    4.2.1.3、生成jks文件和公钥

    1. 进入到java的bin目录下,执行如下指令

    keytool -genkeypair -alias cfzh -keyalg RSA -keypass 这里填你的密码 -keystore cfzh.jks -storepass 这里填你的仓库密码

    > -genkey 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名,mykey中包含用户的公钥、私钥和证书 (在没有指定生成位置的情况下,keystore会存在用户系统默认目录,如:对于window xp系统,会生成在系统的C:/Documents and Settings/UserName/文件名为“.keystore”) -alias 产生别名 -keystore 指定密钥库的名称(产生的各类信息将不在.keystore文件中) -keyalg 指定密钥的算法 (如 RSA DSA(如果不指定默认采用DSA)) -validity 指定创建的证书有效期多少天 -keysize 指定密钥长度 -storepass 指定密钥库的密码(获取keystore信息所需的密码) -keypass 指定别名条目的密码(私钥的密码) -dname 指定证书拥有者信息 例如: "CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名称,ST=州或省份名称,C=单位的两字母国家代码" -list 显示密钥库中的证书信息 keytool -list -v -keystore 指定keystore -storepass 密码 -v 显示密钥库中的证书详细信息 -export 将别名指定的证书导出到文件 keytool -export -alias 需要导出的别名 -keystore 指定keystore -file 指定导出的证书位置及证书名称 -storepass 密码 -file 参数指定导出到文件的文件名 -delete 删除密钥库中某条目 keytool -delete -alias 指定需删除的别 -keystore 指定keystore -storepass 密码 -printcert 查看导出的证书信息 keytool -printcert -file yushan.crt -keypasswd 修改密钥库中指定条目口令 keytool -keypasswd -alias 需修改的别名 -keypass 旧密码 -new 新密码 -storepass keystore密码 -keystore sage -storepasswd 修改keystore口令 keytool -storepasswd -keystore e:/yushan.keystore(需修改口令的keystore) -storepass 123456(原始密码) -new yushan(新密码) -import 将已签名数字证书导入密钥库 keytool -import -alias 指定导入条目的别名 -keystore 指定keystore -file 需导入的证书 -storetype 生成证书类型(格式:标准pkcs12)

    2. 如果你需要导出 cer 格式证书,请执行如下命令

    keytool -alias cfzh -exportcert -keystore cfzh.jks -file cfzh.cer

    3. 导出密钥,注意,这个的前提是你已经安装了openssl软件,如果没有安装,请到这下载(https://slproweb.com/products/Win32OpenSSL.html ),然后安装,安装完之后,记得添加一下 openssl的bin目录到环境变量path中

    keytool -list -rfc --keystore cfzh.jks | openssl x509 -inform pem -pubkey

    4.2.2、安装数据库

    4.2.2.1、MySQL

    4.2.3.1、OceanBase

    4.2.4.1、TiDB

    4.2.6、文件服务

    4.2.6.1、FastDFS

    4.2.7.1、MiNiO

    4.2.8.1、阿里云OSS

    4.2.9.1、七牛云存储

    4.2.11、安装nacos

    4.2.12、安装Docker

    4.2.12.1、安装

    1、首先升级一下yum(高版本的操作系统不推荐使用此命令)

    yum update

    其实,也可以不升级,如果系统已经安装了其他的软件运行环境,就不要升级,我是因为之前被低版本的yum坑过,所以首先都会跑一下这个命令;

    当yum不可用的时候,可以参考这篇文章 https://www.cnblogs.com/ryanzheng/p/11263388.html

    2、如果之前安装过docker,要先把docker卸载

    > yum remove docker \                   docker-client \                   docker-client-latest \                   docker-common \                   docker-latest \                   docker-latest-logrotate \                   docker-logrotate \                   docker-engine

    3、安装所需的软件包。yum-utils 提供了 yum-config-manager,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2 3、安装所需的软件包。yum-utils 提供了 yum-config-manager,并且 device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2

    yum install -y yum-utils device-mapper-persistent-data lvm2

    4、设置稳定的源,我选择的是清华大学的源地址,你也可以设置阿里云或者其他的

    yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo

    5、安装 Docker Engine-Community

    yum install docker-ce docker-ce-cli containerd.io

    至此Docker已经安装成功,下面开始启动Docker

    6、启动Docker

    systemctl start docker

    7、设置开机启动

    systemctl enable docker

    8、运行一条Docker的命令

    docker images

    9、如果出现以上图片的结果,表示Docker已经安装成功

    4.2.13、安装Elasticsearch搜索引擎

    4.2.13.1、Docker方式安装

    1,取一个镜像,然后运行一下

    docker pull elasticsearch:7.17.5

    2、创建对应的挂载目录

    > mkdir -p /cf/data/elasticsearch/config mkdir -p /cf/data/elasticsearch/data mkdir -p /cf/data/elasticsearch/plugins

    3、设置对应的权限

    chmod 777 /cf/data/elasticsearch/data

    4、创建配置文件,并配置内容

    > touch /cf/data/elasticsearch/config/elasticsearch.yml vim /cf/data/elasticsearch/config/elasticsearch.yml

    5、配置文件内容如下:

    network.host: 0.0.0.0 http.host: 0.0.0.0 cluster.name: "cfzh_cluster" http.cors.enabled: true http.cors.allow-origin: "*"

    6、安装ik分词器

    找到对应版本的ik分词器进行下载,例如我这里是 7.17.5,我下载地址为:https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v7.17.5 如果你的版本不是这个版本,可以到这去选:https://github.com/medcl/elasticsearch-analysis-ik/releases 下载之后得到一个zip压缩包,

    创建一个目录:

    mkdir -p /cf/data/elasticsearch/plugins/ik

    将压缩包上传到该 /cf/data/elasticsearch/plugins/ik 该目录下,然后解压该压缩包:

    unzip elasticsearch-analysis-ik-7.17.5.zip

    7、最后启动容器

    docker run --name elasticsearch_a -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms84m -Xmx512m" -v /cf/data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /cf/data/elasticsearch/data:/usr/share/elasticsearch/data -v /cf/data/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.17.5

    8、访问一下Elasticsearch的地址(注意,IP根据你自己的实际情况,这里的 192.168.0.10只是示例

    4.2.14、seata分布式事务

    4.2.14.1、1.4.2

    4.2.15.1、1.6.1

    4.2.17、sentinel熔断降级

    5、使用手册

    5.1、资料和账号准备

    5.1.1、前言

    很多东西可以同时准备,微信和支付宝平台审核需要一点时间。

    所有东西都必须基于企业或者个体工商户或者组织等身份。个人开发者不要注册,注册了也会用不了。

    5.1.2、微信公众号

    注册(原来已经有公众号的可以忽略这步)

    登录微信公众号注册官网页面:https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&lang=zh_CN

    选择:服务号,下一步填写相关资料,注意邮箱和密码自己要记住,微信这个机制很搞人,忘记密码了很麻烦

    登录微信公众号后台

    进入微信公众号管理后台页面:https://mp.weixin.qq.com/

    【原来已经有公众号的可以忽略下面的资料完善】

    使用你的微信扫码,选择你对应的 公众号登录,首次注册可能需要你完善你自己的资料,按实际情况填写

    认证微信公众号后台

    如果你的公众号没有认证,记得认证一下。

    目前公众号我们虽然没使用到,但是不排除后期有使用到,因为公众号在通知方面比较方便。

    5.1.3、微信小程序

    注册(原来已经有小程序的可以忽略这步)

    进入微信公众号管理后台页面:https://mp.weixin.qq.com/,记得选择 “公众号”登录,因为这里我们要基于你的公众号注册小程序,因为这样可以免掉

    你小程序的认证时间和费用

    配置小程序开发人员

    进入微信公众号管理后台页面:https://mp.weixin.qq.com/,记得选择 “小程序”登录

    如果你们自己有前端人员开发,请在下面的把相关前端人员加进去,方便前端人员帮你开发和发布。如果需要我们帮忙发布小程序的

    ,请添加我们的前端开发人员(才风官方前端开发人员微信号:Tudutu) 到你们小程序的开发者列表中去。

    配置开发者选项

    设置你的小程序密码(如果原来已经设置了,且有其它平台在用,这里慎重 重新生成)

    将开发者账号填入到我们后台

    https://www.showdoc.com.cn/cfzhv3/10325061916555549

    配置小程序调用域名

    你自己的域名可以直接解析到我们服务,也可以自己的服务器转发到我们服务器,都支持的!如果没有域名的老板,我们会默认免费提供一个二级域名

    配置小程序二维码链接

    为啥要配置这个呢?

    方便微信扫码之后,直接跳转到指定的小程序页面,不需要经过其它业务和操作,稳定以及效果体验好,小程序也方便你广告投放并获得收益

    > 前缀占用规则:请选择“不占用”

    示例数据: > 关卡扫码支付离场:你的域名 /scene/carParkFee/checkPointId/
     小程序页面:/pages/pay/scanCode

    > 二轮充电地址:
     /scene/bicycleCharging/chargingStationId/小程序页面:/pages/pay/scanCode

    > 四轮充电地址:
    /scene/electricVehicleCharging/chargingStationId/ 小程序页面:/pages/pay/scanCode

    > 无牌车入场扫码地址:/scene/licensePlateRecognition/deviceId/
     小程序页面:/pages/my/noLicencePlateCar

    > 地锁升降锁地址(扫码降锁入场,扫码支付降锁离场):
    /scene/parkingLock/deviceId/ 小程序页面:/pages/my/noLicencePlateCar

    5.1.4、微信开放平台

    注册(原来已经有微信开放平台的可以忽略这步)

    认证通过后,将微信小程序绑定到 开放平台上

    公众号/小程序/APP等都可以绑定过来

    5.1.5、开通微信服务商

    科普:啥是服务商?

    腾讯微信支付---->你(服务商)---->子商户(小卖部/物业公司/业委会/其它单位或个体)

    服务商有哪些好处:

    > ①:你可以帮任何个人(个体工商户)/公司企业/组织 等快速申请收款账号,对方只需要提供(支行名称,银行账号,手机号,邮箱,身份证正反面照片)给你,你直接帮其进件,免去了对方还要注册啥公众号或者小程序等复杂问题,审核通过之后 子商户收的每一笔默认 给你返佣千4,即 对方收入1000元,腾讯公司会自动给划其中4元给你,自动到你微信账户(需要自己手动提现) ②:费率可调,调整每个子商户的费率后,你的收益会有影响 ③:点金计划,支付完成后可以跳转到指定的广告页面,广告费微信给你结算

    注册地址

    https://pay.weixin.qq.com/partner/public/home

    5.1.6、支付宝小程序

    注册支付宝企业开发者账号

    https://open.alipay.com/  浏览器访问这个地址进行注册

    登录支付宝开发者账号

    进入控制台

    创建你的支付宝小程序应用

    创建应用

    创建小程序完成之后,把开发者账号填入到后台

    https://www.showdoc.com.cn/2192066741521376/10325063479611314

    5.1.7、APP支付

    > 提前给您打个预防针,这个没有1-2个月搞不下来,要用APP的请提前准备好资料。没有APP源代码用户,忽略此项,直接使用我们才风官方APP即可

    准备软著

    提供APP部分源代码给软著中介公司,支付 1000-5000元不等费用,等待1-3个月时间,请自行联系当地软著代办斯

    微信APP支付

    登录微信开放平台(https://open.weixin.qq.com/),添加移动应用,注意安卓和ios都要考虑到

    支付宝APP支付

    登录支付宝开放平台(https://open.alipay.com/),添加网页移动应用,注意安卓和ios都要考虑到

    5.2、后台管理

    5.2.1、用户中心

    5.2.1.1、用户列表

    该功能只有超级管理员和私有化部署才能拥有

    可以直接后台 新增/修改/删除 用户,操作用户所有基础信息数据

    列表

    编辑

    注意不要随意删除用户,否则其相关资产(停车月卡,特殊车辆,绑定车辆,用户证件,账单,充电,业主,人脸门禁,账户钱包等)会被一起删除

    5.2.1.2、用户中心

    所有管理用户(超级管理员/独立运营商/共享运营商/物业管理员/员工/财务等)都拥有的功能界面

    方便自行后台修改自己的基础信息,当然也可以在手机APP和小程序上修改自己的用户基础信息,多端数据同步的

    5.2.1.1、权限

    5.2.1.1.1、用户列表

    该功能只有超级管理员和私有化部署才能拥有

    可以直接后台 新增/修改/删除 用户,操作用户所有基础信息数据

    列表

    编辑

    注意不要随意删除用户,否则其相关资产(停车月卡,特殊车辆,绑定车辆,用户证件,账单,充电,业主,人脸门禁,账户钱包等)会被一起删除

    5.2.1.1.1、用户中心

    所有管理用户(超级管理员/独立运营商/共享运营商/物业管理员/员工/财务等)都拥有的功能界面

    方便自行后台修改自己的基础信息,当然也可以在手机APP和小程序上修改自己的用户基础信息,多端数据同步的

    5.2.2.1、角色

    5.2.2.1.1、用户列表

    该功能只有超级管理员和私有化部署才能拥有

    可以直接后台 新增/修改/删除 用户,操作用户所有基础信息数据

    列表

    编辑

    注意不要随意删除用户,否则其相关资产(停车月卡,特殊车辆,绑定车辆,用户证件,账单,充电,业主,人脸门禁,账户钱包等)会被一起删除

    5.2.2.1.1、用户中心

    所有管理用户(超级管理员/独立运营商/共享运营商/物业管理员/员工/财务等)都拥有的功能界面

    方便自行后台修改自己的基础信息,当然也可以在手机APP和小程序上修改自己的用户基础信息,多端数据同步的

    5.2.3.1、开发者账号

    5.2.3.1.1、用户列表

    该功能只有超级管理员和私有化部署才能拥有

    可以直接后台 新增/修改/删除 用户,操作用户所有基础信息数据

    列表

    编辑

    注意不要随意删除用户,否则其相关资产(停车月卡,特殊车辆,绑定车辆,用户证件,账单,充电,业主,人脸门禁,账户钱包等)会被一起删除

    5.2.3.1.1、用户中心

    所有管理用户(超级管理员/独立运营商/共享运营商/物业管理员/员工/财务等)都拥有的功能界面

    方便自行后台修改自己的基础信息,当然也可以在手机APP和小程序上修改自己的用户基础信息,多端数据同步的

    5.2.5、支付

    5.2.6、物联网

    5.2.6.1、停车

    5.2.7.1、充电

    5.3、APP

    5.4、小程序

    5.4.1、微信

    5.4.2、支付宝

    5.5、公众号

    5.5.1、微信

    5.5.2、支付宝

  • 相关阅读:
    mvvm框架下,wpf如何实现窗口的关闭
    Couchdb-权限绕过--命令执行--(CVE-2017-12635)&&(CVE-2017-12636)--H2database命令执行--(CVE-2022-23221)
    Scala数据结构
    知识表示学习(二):TransH
    云原生K8S------K8S管理工具kubectl详解(一)
    java:jvm参数设置
    select下拉菜单自由扩展-输入框添加/options删除
    Visual Studio 集成Qt开发环境的一些注意事项
    moviepy处理视频帧和遍历的方式处理视频帧速度对比。
    pdf如何让多张图片在一页
  • 原文地址:https://blog.csdn.net/df981011512/article/details/133196224