1.获取乐享冀 预约记录接口对接

2.预约记录添加数据源筛选
3.停车场数据出入场 占用车位数更新
dev
862857010@qq.com 2 years ago
parent 1940dfe6a8
commit 247bc426e5
  1. 61
      cjy-project/src/main/java/com/cjy/happyToEnjoy/util/SignUtil.java
  2. 143
      cjy-project/src/main/java/com/cjy/happytoenjoy/domain/HappyToEnjoyEntity.java
  3. 130
      cjy-project/src/main/java/com/cjy/happytoenjoy/task/GetHappyToEnjoyTask.java
  4. 35
      cjy-project/src/main/java/com/cjy/happytoenjoy/util/SignUtil.java
  5. 18
      cjy-project/src/main/java/com/cjy/parking/domain/ParkingTurnoverData.java
  6. 1
      cjy-project/src/main/java/com/cjy/parking/mapper/ParkingTurnoverDataMapper.java
  7. 33
      cjy-project/src/main/java/com/cjy/parking/service/impl/ParkingTurnoverDataServiceImpl.java
  8. 2
      cjy-project/src/main/java/com/cjy/parkinglotdataanalysis/service/impl/ParkingLotDataAnalysisServiceImpl.java
  9. 19
      cjy-project/src/main/java/com/cjy/reservationdata/domain/AppointmentCenterData.java
  10. 12
      cjy-project/src/main/resources/mapper/parking/ParkingTurnoverDataMapper.xml
  11. 15
      cjy-project/src/main/resources/mapper/parkinglotdataanalysis/ParkingLotDataAnalysisMapper.xml
  12. 7
      cjy-project/src/main/resources/mapper/reservationdata/AppointmentCenterDataMapper.xml
  13. 2
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  14. 20
      ruoyi-ui/src/views/reservationdata/appointmentrecord/index.vue

@ -1,61 +0,0 @@
package com.cjy.happyToEnjoy.util;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @author liangjiawei
* @createDate 2023/8/21
*/
public class SignUtil {
public static String getSign(Map<String, Object> data) {
Set<String> keySet = data.keySet();
String[] keyArr = keySet.toArray(new String[keySet.size()]);
Arrays.sort(keyArr);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < keyArr.length; i++) {
String key = keyArr[i];
sb.append(key + "=" + data.get(key));
if (i != keyArr.length - 1) {
sb.append('&');
}
}
try {
return string2MD5(sb.toString()).toLowerCase();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public static String string2MD5(String inStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (Exception e) {
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}

@ -0,0 +1,143 @@
package com.cjy.happytoenjoy.domain;
/**
* @author liangjiawei
* @createDate 2023/8/22
*/
public class HappyToEnjoyEntity {
private String id;
private String scenicName;
private String name;
private String certificateType;
private String certificateCode;
private String phone;
private String carryFlag;
private String status;
private String reservationDate;
private String beginTime;
private String endingTime;
private String scanTime;
private String reservationNum;
private String exitStatus;
private String exitTime;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getScenicName() {
return scenicName;
}
public void setScenicName(String scenicName) {
this.scenicName = scenicName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCertificateType() {
return certificateType;
}
public void setCertificateType(String certificateType) {
this.certificateType = certificateType;
}
public String getCertificateCode() {
return certificateCode;
}
public void setCertificateCode(String certificateCode) {
this.certificateCode = certificateCode;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getCarryFlag() {
return carryFlag;
}
public void setCarryFlag(String carryFlag) {
this.carryFlag = carryFlag;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getReservationDate() {
return reservationDate;
}
public void setReservationDate(String reservationDate) {
this.reservationDate = reservationDate;
}
public String getBeginTime() {
return beginTime;
}
public void setBeginTime(String beginTime) {
this.beginTime = beginTime;
}
public String getEndingTime() {
return endingTime;
}
public void setEndingTime(String endingTime) {
this.endingTime = endingTime;
}
public String getScanTime() {
return scanTime;
}
public void setScanTime(String scanTime) {
this.scanTime = scanTime;
}
public String getReservationNum() {
return reservationNum;
}
public void setReservationNum(String reservationNum) {
this.reservationNum = reservationNum;
}
public String getExitStatus() {
return exitStatus;
}
public void setExitStatus(String exitStatus) {
this.exitStatus = exitStatus;
}
public String getExitTime() {
return exitTime;
}
public void setExitTime(String exitTime) {
this.exitTime = exitTime;
}
}

@ -0,0 +1,130 @@
package com.cjy.happytoenjoy.task;
import com.alibaba.fastjson2.JSONObject;
import com.cjy.happytoenjoy.domain.HappyToEnjoyEntity;
import com.cjy.happytoenjoy.util.SignUtil;
import com.cjy.media.util.WeiBoEncryption;
import com.cjy.reservationdata.domain.AppointmentCenterData;
import com.cjy.reservationdata.service.IAppointmentCenterDataService;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @author liangjiawei
* @createDate 2023/8/21
*/
@Component("GetHappyToEnjoyTask")
public class GetHappyToEnjoyTask {
@Value("${lxj.scenicId}")
private String scenicId;
@Value("${lxj.appId}")
private String appId;
@Value("${lxj.appSecret}")
private String appSecret;
@Value("${lxj.numberOfDaysAvailable}")
private Integer numberOfDaysAvailable;
@Value("${weibo.encryptionRule}")
private String rule;
@Autowired
IAppointmentCenterDataService iAppointmentCenterDataService;
//这里身份证、手机号继续加密 避免查询的时候无法解密
// @Scheduled(cron = "0 0/1 * * * ?")
public void getEnjoymentAppointmentRecord() {
String timestamp = SignUtil.create_timestamp();
String nonceStr = SignUtil.create_nonce_str();
Map<String, Object> signDatgaMap = new HashMap<>();
signDatgaMap.put("appId", appId);
signDatgaMap.put("timestamp", timestamp);
signDatgaMap.put("nonceStr", nonceStr);
signDatgaMap.put("appSecret", appSecret);
String sign = SignUtil.getSign(signDatgaMap);
signDatgaMap.put("sign", sign);
String startDate = DateUtils.getDaysTimeToString(0);
String endDate = DateUtils.getDaysTimeToString(numberOfDaysAvailable);
JSONObject jo = new JSONObject();
jo.put("scenicId", scenicId);
jo.put("startDate", startDate);
jo.put("endDate", endDate);
String responseSting = SignUtil.post("https://traveline.hebeitour.com.cn/api/reservation/getReservationRecordT", jo.toString(), signDatgaMap);
JSONObject jsonData = JSONObject.parseObject(responseSting);
List<HappyToEnjoyEntity> list = jsonData.getJSONArray("data").toList(HappyToEnjoyEntity.class);
List<AppointmentCenterData> saveList =new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
list.stream().forEach(item->{
AppointmentCenterData appointmentCenterData= new AppointmentCenterData();
//预约日期
try {
appointmentCenterData.setAppointmentDate(sdfDate.parse(item.getReservationDate()));
} catch (ParseException e) {
e.printStackTrace();
}
//预约人姓名
appointmentCenterData.setAppointmentPeopleName(item.getName());
//预约人手机号
appointmentCenterData.setAppointmentPeoplePhone(WeiBoEncryption.encrypt(item.getPhone(), rule));
//预约时间段
appointmentCenterData.setAppointmentSlot(item.getBeginTime()+"~"+item.getEndingTime());
//证件类型
if(item.getCertificateType().equals("身份证")){
appointmentCenterData.setCertificateType("5501");
//身份证号码
appointmentCenterData.setDocumentsNumber(WeiBoEncryption.encrypt(item.getCertificateCode(), rule));
}else {
appointmentCenterData.setCertificateType("5502");
appointmentCenterData.setDocumentsNumber(item.getCertificateCode());
}
//状态
if(item.getStatus().equals("2")){
appointmentCenterData.setState("3");
}else {
appointmentCenterData.setState(item.getStatus());
}
//核销时间
try {
if(item.getScanTime() !=null){
appointmentCenterData.setWriteOffTime( sdf.parse(item.getScanTime()));
}
} catch (ParseException e) {
e.printStackTrace();
}
//
appointmentCenterData.setSourceDataId(item.getId());
appointmentCenterData.setSourceType(1);
appointmentCenterData.setExternalId("783232818342789120");
appointmentCenterData.setDataSources("2");
appointmentCenterData.setCreateTime(new Date());
appointmentCenterData.setOrganCode(123L);
if(saveList.size()<1000){
saveList.add(appointmentCenterData);
}else {
iAppointmentCenterDataService.synchronousData(saveList);
saveList.clear();
saveList.add(appointmentCenterData);
}
});
if(!saveList.isEmpty()){
iAppointmentCenterDataService.synchronousData(saveList);
}
}
}

@ -1,7 +1,4 @@
package com.cjy.happyToEnjoy.task;
import com.alibaba.fastjson2.JSONObject;
import com.cjy.happyToEnjoy.util.SignUtil;
package com.cjy.happytoenjoy.util;
import java.io.BufferedReader;
import java.io.IOException;
@ -10,36 +7,16 @@ import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.util.*;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* @author liangjiawei
* @createDate 2023/8/21
*/
//scenic_id:1273900661162905602
// app_id:app1668821827566313474
// app_secret:8d5695249b71421cac834517b568c141
public class GetHappyToEnjoyTask {
public static void main(String[] args) {
String timestamp = create_timestamp();
String nonceStr = create_nonce_str();
Map<String, Object> signDatgaMap = new HashMap<>();
signDatgaMap.put("appId", "app1668821827566313474");
signDatgaMap.put("timestamp", timestamp);
signDatgaMap.put("nonceStr", nonceStr);
signDatgaMap.put("appSecret", "8d5695249b71421cac834517b568c141");
String sign = getSign(signDatgaMap);
signDatgaMap.put("sign", sign);
JSONObject jo=new JSONObject();
jo.put("scenicId", "1273900661162905602");
jo.put("startDate", "2023-08-23");
jo.put("endDate", "2023-08-23");
System.out.println(signDatgaMap);
System.out.println(post("https://traveline.hebeitour.com.cn/api/reservation/getReservationRecordT", jo.toString(),signDatgaMap));
}
public class SignUtil {
public static String getSign(Map<String, Object> data) {
Set<String> keySet = data.keySet();
String[] keyArr = keySet.toArray(new String[keySet.size()]);

@ -141,7 +141,23 @@ public class ParkingTurnoverData extends BaseEntity {
//占用车位
private int occupyParkingSpace;
public String getVehicleAttributionId() {
public int getOccupyParkingSpace() {
return occupyParkingSpace;
}
public void setOccupyParkingSpace(int occupyParkingSpace) {
this.occupyParkingSpace = occupyParkingSpace;
}
public int getRemainingParkingSpace() {
return remainingParkingSpace;
}
public void setRemainingParkingSpace(int remainingParkingSpace) {
this.remainingParkingSpace = remainingParkingSpace;
}
public String getVehicleAttributionId() {
return vehicleAttributionId;
}

@ -118,6 +118,7 @@ public interface ParkingTurnoverDataMapper
* @return
*/
int updateParkingLotParkingSpaceInfoCount(ParkingTurnoverData parkingTurnoverData);
int updateParkingLotParkingSpaceInfoCountReduce(ParkingTurnoverData parkingTurnoverData);
/**
* 添加该停车场的 剩余车位信息

@ -185,12 +185,22 @@ public class ParkingTurnoverDataServiceImpl implements IParkingTurnoverDataServi
parkingTurnoverData.setCreateTime(DateUtils.getNowDate());
//判断是否有数据 如果有install 如果没有install
if (parkingTurnoverDataMapper.getParkingLotParkingSpaceInfoCount(parkingTurnoverData) > 0) {
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCount(parkingTurnoverData);
//如果是入场
if(parkingTurnoverData.getCutsceneType().equals("1")){
// 占用车位+1
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCount(parkingTurnoverData);
}else {
// 占用车位-1
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCountReduce(parkingTurnoverData);
}
} else {
parkingTurnoverDataMapper.installPkingLotParkingSpaceInfoCount(parkingTurnoverData);
}
//如果是入场
if(parkingTurnoverData.getCutsceneType().equals("1")){
parkingTurnoverData.setOccupyParkingSpace(1);
parkingTurnoverDataMapper.installPkingLotParkingSpaceInfoCount(parkingTurnoverData);
}
}
if (parkingTurnoverData.getCutsceneType().equals("2")) {
//通过 车牌号获取 入场信息
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@ -226,10 +236,21 @@ public class ParkingTurnoverDataServiceImpl implements IParkingTurnoverDataServi
parkingTurnoverData.setUpdateTime(DateUtils.getNowDate());
if (parkingTurnoverDataMapper.getParkingLotParkingSpaceInfoCount(parkingTurnoverData) > 0) {
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCount(parkingTurnoverData);
//如果是入场
if(parkingTurnoverData.getCutsceneType().equals("1")){
// 占用车位+1
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCount(parkingTurnoverData);
}else {
// 占用车位-1
parkingTurnoverDataMapper.updateParkingLotParkingSpaceInfoCountReduce(parkingTurnoverData);
}
} else {
//如果是入场
if(parkingTurnoverData.getCutsceneType().equals("1")){
parkingTurnoverData.setOccupyParkingSpace(1);
parkingTurnoverDataMapper.installPkingLotParkingSpaceInfoCount(parkingTurnoverData);
}
}
if (parkingTurnoverData.getCutsceneType().equals("2")) {
//通过 车牌号获取 入场信息

@ -44,7 +44,7 @@ public class ParkingLotDataAnalysisServiceImpl implements ParkingLotDataAnalysis
VehicleStatisticsVO vehicleStatisticsVO = new VehicleStatisticsVO();
vehicleStatisticsVO.setPlaceNum(vehicleStatisticsDTO.getPlaceNum());
vehicleStatisticsVO.setWarningNum(vehicleStatisticsDTO.getWarningNum());
vehicleStatisticsVO.setRemainingParkingSpace(vehicleStatisticsDTO.getRemainingParkingSpace());
vehicleStatisticsVO.setRemainingParkingSpace(vehicleStatisticsDTO.getPlaceNum()-vehicleStatisticsDTO.getOccupyParkingSpace());
Float saturation;
if (vehicleStatisticsDTO.getOccupyParkingSpace() == 0 || vehicleStatisticsDTO.getPlaceNum().floatValue() == 0) {
saturation = 0f;

@ -85,6 +85,25 @@ public class AppointmentCenterData extends BaseEntity
@Excel(name = "景区编码(必填)")
private String externalId;
private int sourceType;
private String sourceDataId;
public String getSourceDataId() {
return sourceDataId;
}
public void setSourceDataId(String sourceDataId) {
this.sourceDataId = sourceDataId;
}
public int getSourceType() {
return sourceType;
}
public void setSourceType(int sourceType) {
this.sourceType = sourceType;
}
public Long getAppointmentPeopleId() {
return appointmentPeopleId;

@ -354,8 +354,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<update id="updateParkingLotParkingSpaceInfoCount">
UPDATE parking_lot_parking_space_info
SET
remaining_parking_space = #{remainingParkingSpace},
occupy_parking_space = #{occupyParkingSpace}
occupy_parking_space =occupy_parking_space+1
WHERE parking_lot_id =#{parkingLotId}
</update>
<update id="updateParkingLotParkingSpaceInfoCountReduce">
UPDATE parking_lot_parking_space_info
SET
occupy_parking_space =occupy_parking_space-1
WHERE parking_lot_id =#{parkingLotId}
</update>

@ -17,11 +17,16 @@
</if>
</select>
<select id="getDayTrafficFlow" resultType="java.lang.Integer">
SELECT count(*) from parking_turnover_data t1
left join b_public_service_info t2 on t1.parking_lot_id=t2.id
left join b_tour_info t3 on t2.resource_code = t3.resource_code
WHERE t1.cutscene_type='2' and t1.del_flag!='2' and to_days(t1.travel_time) =
to_days(now()) and t1.organ_code=#{organCode}
SELECT
count(*)
FROM
parking_turnover_data t1
LEFT JOIN b_public_service_info t2 ON t1.parking_lot_id = t2.id
LEFT JOIN b_tour_info t3 ON t2.resource_code = t3.resource_code
WHERE
t1.cutscene_type = '2'
AND t1.del_flag != '2'
and DATE_FORMAT(t1.travel_time,'%Y-%m-%d') =CURDATE()
<if test="scenicSpotId !=null and scenicSpotId!=''">
and t3.id=#{scenicSpotId}
</if>

@ -32,7 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<select id="selectAppointmentCenterDataList" parameterType="AppointmentCenterData" resultMap="AppointmentCenterDataResult">
select t1.id, t1.appointment_number, t1.appointment_date, t1.appointment_slot, t1.appointment_people_name,
t1.appointment_people_phone, t1.certificate_type, t1.documents_number, t1.verification_code, t1.state, t1.write_off_time,
t1.appointment_people_phone, t1.certificate_type, t1.documents_number, t1.verification_code, t1.state, t1.write_off_time,t1.source_type as sourceType,
t1.data_sources, t1.del_flag, t1.create_by, t1.create_time, t1.update_by, t1.update_time, t1.organ_code,t2.resource_name as scenic_name from appointment_center_data t1
left join b_tour_info t2 on t1.external_id = t2.resource_code
<where>
@ -49,6 +49,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="writeOffTime != null "> and t1.write_off_time = #{writeOffTime}</if>
<if test="dataSources != null and dataSources != ''"> and t1.data_sources = #{dataSources}</if>
<if test="organCode != null "> and t1.organ_code = #{organCode}</if>
<if test="sourceType != null and sourceType !=0"> and t1.source_type = #{sourceType}</if>
and t1.del_flag != '2'
</where>
order by t1.create_time desc
@ -116,12 +117,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
certificate_type, documents_number,
verification_code, state, write_off_time,
data_sources,
organ_code,appointment_people_id,external_id)
organ_code,appointment_people_id,external_id,source_data_id)
VALUES
<foreach item="item" collection="list" separator=",">
(#{item.appointmentNumber}, #{item.scenicName}, #{item.appointmentDate}, #{item.appointmentSlot},
#{item.appointmentPeopleName}, #{item.appointmentPeoplePhone}, #{item.certificateType}, #{item.documentsNumber}, #{item.verificationCode}, #{item.state}, #{item.writeOffTime}, #{item.dataSources},
#{item.organCode},#{item.appointmentPeopleId},#{item.externalId})
#{item.organCode},#{item.appointmentPeopleId},#{item.externalId},#{sourceDataId})
</foreach>
</insert>

@ -348,6 +348,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
System.out.println(getPreviousYearUsingCalendar());
System.out.println(getHourBeforeCurrentTime());
System.out.println(getDaysTimeToString(5));
}
public static String addSeconds(LocalDateTime dateTime, long seconds) {
LocalDateTime futureDateTime = dateTime.plus(seconds, ChronoUnit.SECONDS);

@ -38,6 +38,8 @@
/>
</el-select>
</el-form-item>
<el-form-item label="证件号码" prop="documentsNumber">
<el-input
v-model="queryParams.documentsNumber"
@ -46,6 +48,16 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据源" prop="sourceType">
<el-select v-model="queryParams.sourceType" placeholder="请选择证件类型" clearable>
<el-option
v-for="dict in dict.type.source_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="预约日期" prop="appointmentDate">
<el-date-picker clearable
v-model="queryParams.appointmentDate"
@ -176,6 +188,11 @@
<span>{{ parseTime(scope.row.writeOffTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</template>
</el-table-column>
<el-table-column label="数据源" align="center" prop="sourceType">
<template slot-scope="scope">
<dict-tag :options="dict.type.source_type" :value="scope.row.sourceType"/>
</template>
</el-table-column>
<el-table-column label="数据来源" align="center" prop="dataSources">
<template slot-scope="scope">
<dict-tag :options="dict.type.data_sources" :value="scope.row.dataSources"/>
@ -325,7 +342,7 @@ import {getResourceList} from "@/api/ticketing/site";
import autoSelect from "@/components/CommonComponents/PublicCoponents/slsect/AutoSelect";
export default {
name: 'Appointmentrecord',
dicts: ['certificate_type', 'write_off_status', 'data_sources'],
dicts: ['certificate_type', 'write_off_status', 'data_sources','source_type'],
components:{
autoSelect
},
@ -366,6 +383,7 @@ export default {
},
//
queryParams: {
sourceType: null,
pageNum: 1,
pageSize: 10,
appointmentNumber: null,

Loading…
Cancel
Save