Browse Source

停车场

lchao 1 year ago
parent
commit
9fd38c7c4d

+ 97 - 0
songhua-admin/src/main/java/com/songhua/web/controller/park/ParkingLotController.java

@@ -0,0 +1,97 @@
+package com.songhua.web.controller.park;
+
+import com.songhua.common.utils.SignatureUtil;
+import com.songhua.system.domain.dto.ParkData;
+import com.songhua.system.service.IParkDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+
+
+@Slf4j
+@RestController
+public class ParkingLotController {
+
+    @Autowired
+    private IParkDataService parkDataService;
+
+    private static final String API_URL = "https://parking.youboyun.com.cn/thirdServer/v1/openApi";
+    private static final String SIGN_FIELD = "sign";
+
+    private static final Map<Integer, String> PARK_API_KEY_MAP = new HashMap<>();
+
+    static {
+        PARK_API_KEY_MAP.put(15305, "R3UuBEhxnkyhqLj8uJwEjHGBff8WxM");
+        PARK_API_KEY_MAP.put(15338, "MQvp2y2DVzagEzhijar9iJ7rs2utaV");
+    }
+
+    @PostMapping("/getParkData")
+    @ResponseBody
+    public void getParkData(@RequestBody Map<String, Object> request) {
+        // 获取停车场 ID
+        int parkId = (int) request.get("park_id");
+        // 获取对应的 API 密钥
+        String apiKey = PARK_API_KEY_MAP.get(parkId);
+        if (apiKey == null) {
+            // 处理停车场 ID 对应的 API 密钥不存在的情况
+            System.out.println("停车场 ID 对应的 API 密钥不存在");
+            return;
+        }
+        // 准备请求体
+        Map<String, Object> requestBody = prepareRequestBody(request);
+
+        // 生成签名
+        Object sign = SignatureUtil.sign2(requestBody, apiKey, SIGN_FIELD);
+        requestBody.put(SIGN_FIELD, sign);
+
+        // 发送POST请求到API
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, Object> response = restTemplate.postForObject(API_URL, requestBody, Map.class);
+
+        // 验证签名并保存数据
+        if (response != null && response.containsKey("code") && response.get("code").equals(1)) {
+            if(!CollectionUtils.isEmpty((Collection<?>) response.get("data"))){
+                saveParkData(response);
+            }
+        } else {
+            log.error("调用接口失败:{}", response);
+        }
+    }
+
+    private Map<String, Object> prepareRequestBody(Map<String, Object> request) {
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("service_name", "query_parkData");
+        requestBody.put("park_id", request.get("park_id"));
+        requestBody.put("reservedStr", request.get("reservedStr"));
+        return requestBody;
+    }
+
+    private void saveParkData(Map<String, Object> response) {
+        Map<String, Object> data = ((List<Map<String, Object>>) response.get("data")).get(0);
+        ParkData statistics = new ParkData();
+        statistics.setParkId(data.get("park_id").toString());
+        statistics.setAllSpaceNumber(Integer.parseInt(data.get("allSpaceNumber").toString()));
+        statistics.setUseSpaceNumber(Integer.parseInt(data.get("useSpaceNumber").toString()));
+        statistics.setRemainSpaceNumber(Integer.parseInt(data.get("remainSpaceNumber").toString()));
+        statistics.setInParkCount(Integer.parseInt(data.get("inParkCount").toString()));
+        statistics.setOutParkCount(Integer.parseInt(data.get("outParkCount").toString()));
+        statistics.setTotalOutMoney(Integer.parseInt(data.get("totalOutMoney").toString()));
+        statistics.setTotalPreMoney(Integer.parseInt(data.get("totalPreMoney").toString()));
+        parkDataService.save(statistics);
+    }
+
+
+    @GetMapping("/selectParkData")
+    public List<ParkData> selectParkData(ParkData parkData) {
+        List<ParkData> list = parkDataService.selectParkData(parkData);
+        return list;
+    }
+}

+ 80 - 0
songhua-admin/src/main/java/com/songhua/web/quzrtz/ParkingLotJob.java

@@ -0,0 +1,80 @@
+package com.songhua.web.quzrtz;
+
+import com.songhua.common.utils.SignatureUtil;
+import com.songhua.system.domain.dto.ParkData;
+import com.songhua.system.service.IParkDataService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Slf4j
+@Component("parkingLotJob")
+public class ParkingLotJob {
+    @Autowired
+    private IParkDataService parkDataService;
+
+    private static final String API_URL = "https://parking.youboyun.com.cn/thirdServer/v1/openApi";
+    private static final String SIGN_FIELD = "sign";
+
+    private static final Map<Integer, String> map = new HashMap<>();
+
+    static {
+        map.put(15305, "R3UuBEhxnkyhqLj8uJwEjHGBff8WxM");
+        map.put(15338, "MQvp2y2DVzagEzhijar9iJ7rs2utaV");
+    }
+
+    public void getParkData() {
+        for (Integer key : map.keySet()) {
+            // 准备请求体
+            Map<String, Object> requestBody = prepareRequestBody(key);
+            // 生成签名
+            Object sign = SignatureUtil.sign2(requestBody, map.get(key), SIGN_FIELD);
+            requestBody.put(SIGN_FIELD, sign);
+            // 发送POST请求到API
+            RestTemplate restTemplate = new RestTemplate();
+            Map<String, Object> response = restTemplate.postForObject(API_URL, requestBody, Map.class);
+            // 验证签名并保存数据
+            if (response != null && response.containsKey("code") && response.get("code").equals(1)) {
+                if(!CollectionUtils.isEmpty((Collection<?>) response.get("data"))){
+                    saveParkData(response);
+                }
+            } else {
+                log.error("调用接口失败:{}", response);
+            }
+        }
+    }
+
+    private Map<String, Object> prepareRequestBody(Integer parkId) {
+        Map<String, Object> requestBody = new HashMap<>();
+        requestBody.put("service_name", "query_parkData");
+        requestBody.put("park_id", parkId);
+        requestBody.put("reservedStr", "");
+        return requestBody;
+    }
+
+    private void saveParkData(Map<String, Object> response) {
+        Map<String, Object> data = ((List<Map<String, Object>>) response.get("data")).get(0);
+        ParkData statistics = new ParkData();
+        statistics.setParkId(data.get("park_id").toString());
+        statistics.setAllSpaceNumber(Integer.parseInt(data.get("allSpaceNumber").toString()));
+        statistics.setUseSpaceNumber(Integer.parseInt(data.get("useSpaceNumber").toString()));
+        statistics.setRemainSpaceNumber(Integer.parseInt(data.get("remainSpaceNumber").toString()));
+        statistics.setInParkCount(Integer.parseInt(data.get("inParkCount").toString()));
+        statistics.setOutParkCount(Integer.parseInt(data.get("outParkCount").toString()));
+        statistics.setTotalOutMoney(Integer.parseInt(data.get("totalOutMoney").toString()));
+        statistics.setTotalPreMoney(Integer.parseInt(data.get("totalPreMoney").toString()));
+        parkDataService.save(statistics);
+    }
+}

+ 106 - 0
songhua-common/src/main/java/com/songhua/common/utils/SignatureUtil.java

@@ -0,0 +1,106 @@
+package com.songhua.common.utils;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
+public class SignatureUtil {
+
+    private static final String CHARSET = "UTF-8";
+
+    private static final String SIGN_TYPE = "MD5";
+
+    /**
+     * 判断签名是否正确,必须包含sign字段,否则返回false。
+     * @param data Map类型数据
+     * @param key  API密钥
+     * @return 签名是否正确
+     * @throws Exception
+     */
+    public static boolean check(Map<String, Object> data, String key, String signField){
+        if (!data.containsKey(signField)) {
+            return false;
+        }
+        String sign = data.get(signField).toString();
+        String newSign=sign(data, key, signField);
+
+        System.out.println("newSign:"+newSign);
+
+        return newSign.equals(sign);
+    }
+
+
+    public static String sign(final Map<String, Object> data, String key, String signField) {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(signField)) {
+                continue;
+            }
+            // 参数值为空,则不参与签名
+            Object value = data.get(k);
+            if (value instanceof String && ((String) value).trim().length() > 0) {
+                sb.append(k).append("=").append(((String) value).trim()).append("&");
+            }
+        }
+        sb.append("key=").append(key);
+
+        System.out.println("newSign:"+sb.toString());
+
+        String result=MD5(sb.toString()).toUpperCase();
+
+        return result;
+    }
+
+
+
+    public static String sign2(final Map<String, Object> data, String key, String signField) {
+        Set<String> keySet = data.keySet();
+        String[] keyArray = keySet.toArray(new String[keySet.size()]);
+        Arrays.sort(keyArray);
+        StringBuilder sb = new StringBuilder();
+        for (String k : keyArray) {
+            if (k.equals(signField)) {
+                continue;
+            }
+            // 参数值为空,则不参与签名
+            if (data.get(k)!=null  && data.get(k).toString().trim().length() > 0) {
+                sb.append(k).append("=").append(data.get(k).toString().trim()).append("&");
+            }
+        }
+        sb.append("key=").append(key);
+
+        System.out.println("newSign:"+sb.toString());
+
+        String result=MD5(sb.toString()).toUpperCase();
+
+        return result;
+    }
+
+    /**
+     * 生成 MD5
+     *
+     * @param data 待处理数据
+     * @return MD5结果
+     */
+    public static String MD5(String data)  {
+        try {
+            MessageDigest md = MessageDigest.getInstance(SIGN_TYPE);
+            byte[] array = md.digest(data.getBytes(CHARSET));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+            return sb.toString().toUpperCase();
+        }
+        catch (Exception e){
+            throw new RuntimeException(e);
+        }
+    }
+
+
+}
+

+ 19 - 0
songhua-system/src/main/java/com/songhua/system/domain/dto/ParkData.java

@@ -0,0 +1,19 @@
+package com.songhua.system.domain.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class ParkData {
+    private int id;
+    private String parkId;
+    private int allSpaceNumber;
+    private int inParkCount;
+    private int useSpaceNumber;
+    private int totalOutMoney;
+    private int remainSpaceNumber;
+    private int totalPreMoney;
+    private int outParkCount;
+    private Date createTime;
+}

+ 9 - 0
songhua-system/src/main/java/com/songhua/system/domain/dto/ParkDataRequest.java

@@ -0,0 +1,9 @@
+package com.songhua.system.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class ParkDataRequest {
+    private String park_id;
+    private String reservedStr;
+}

+ 11 - 0
songhua-system/src/main/java/com/songhua/system/domain/dto/ParkDataRequestBody.java

@@ -0,0 +1,11 @@
+package com.songhua.system.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class ParkDataRequestBody {
+    private String service_name;
+    private String sign;
+    private String park_id;
+    private String reservedStr;
+}

+ 12 - 0
songhua-system/src/main/java/com/songhua/system/mapper/ParkDataMapper.java

@@ -0,0 +1,12 @@
+package com.songhua.system.mapper;
+
+import com.songhua.system.domain.dto.ParkData;
+
+import java.util.List;
+
+public interface ParkDataMapper {
+
+    void save(ParkData statistics);
+
+    List<ParkData> selectParkData(ParkData parkData);
+}

+ 11 - 0
songhua-system/src/main/java/com/songhua/system/service/IParkDataService.java

@@ -0,0 +1,11 @@
+package com.songhua.system.service;
+
+import com.songhua.system.domain.dto.ParkData;
+
+import java.util.List;
+
+public interface IParkDataService {
+    void save(ParkData statistics);
+
+    List<ParkData> selectParkData(ParkData parkData);
+}

+ 30 - 0
songhua-system/src/main/java/com/songhua/system/service/impl/ParkDataServiceImpl.java

@@ -0,0 +1,30 @@
+package com.songhua.system.service.impl;
+
+import com.songhua.common.core.redis.RedisCache;
+import com.songhua.system.domain.dto.ParkData;
+import com.songhua.system.mapper.ParkDataMapper;
+import com.songhua.system.service.IParkDataService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class ParkDataServiceImpl implements IParkDataService {
+
+
+    @Autowired
+    private ParkDataMapper parkDataMapper;
+
+    // 存储数据
+    @Override
+    public void save(ParkData parkData) {
+        parkDataMapper.save(parkData);
+    }
+
+    // 查询数据
+    @Override
+    public List<ParkData> selectParkData(ParkData parkData) {
+        return parkDataMapper.selectParkData(parkData);
+    }
+}

+ 53 - 0
songhua-system/src/main/resources/mapper/system/ParkDataMapper.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.songhua.system.mapper.ParkDataMapper">
+    
+    <resultMap type="ParkData" id="BasicCruiseShipResult">
+        <result property="id"    column="id"    />
+        <result property="parkId"    column="park_id"    />
+        <result property="allSpaceNumber"    column="all_space_number"    />
+        <result property="useSpaceNumber"    column="use_space_umber"    />
+        <result property="remainSpaceNumber"    column="remain_space_number"    />
+        <result property="inParkCount"    column="in_park_count"    />
+        <result property="outParkCount"    column="out_park_count"    />
+        <result property="totalOutMoney"    column="total_out_money"    />
+        <result property="totalPreMoney"    column="total_pre_money"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectParkDataVo">
+        select id, park_id, all_space_number, use_space_umber, remain_space_number, in_park_count, out_park_count,total_out_money,total_pre_money,create_time from parking_lot_statistics
+    </sql>
+
+    <select id="selectParkData" parameterType="ParkData" resultMap="BasicCruiseShipResult">
+        SELECT
+            id,
+            park_id,
+            all_space_number,
+            use_space_umber,
+            remain_space_number,
+            in_park_count,
+            out_park_count,
+            total_out_money,
+            total_pre_money,
+            max( create_time ) create_time
+        FROM
+            parking_lot_statistics
+        GROUP BY
+            park_id
+        ORDER BY
+            create_time DESC;
+    </select>
+
+    <insert id="save" >
+        insert into parking_lot_statistics (
+        park_id,all_space_number,use_space_umber,remain_space_number,in_park_count,out_park_count,total_out_money,total_pre_money,create_time)
+        values(
+               #{parkId},#{allSpaceNumber},#{useSpaceNumber},#{remainSpaceNumber},#{inParkCount},#{outParkCount},#{totalOutMoney},#{totalPreMoney},now()
+              )
+
+    </insert>
+
+</mapper>

+ 8 - 0
songhua-ui/src/api/park/parkLot.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request'
+
+export function getParkData() {
+  return request({
+    url: '/selectParkData',
+    method: 'get'
+  })
+}