狩猎人员清洗

develop
hanrenchun 9 months ago
parent bf60b15bc7
commit 3149599e25

@ -0,0 +1,44 @@
package com.ssf.mysqloracletest.domain;
import lombok.Data;
@Data
public class TSlryRyjbxxYjxx {
private String YJXXID;
private String XM;
private String SFZH;
private String YJLX;
private String YJJB;
private String YJNR;
private String YJSJ;
private String KEY1;
private String VALUE1;
private String KEY2;
private String VALUE2;
private String KEY3;
private String VALUE3;
private String KEY4;
private String VALUE4;
private String KEY5;
private String VALUE5;
private String KEY6;
private String VALUE6;
private String KEY7;
private String VALUE7;
private String KEY8;
private String VALUE8;
private String XZDZRQ;
private String XZDZRQDM;
private String ZDRYLBBJ;
private String HJDZRQ;
private String HJDZRQDM;
private String KEY10;
private String VALUE10;
private String KEY9;
private String VALUE9;
private String KEY11;
private String VALUE11;
}

@ -0,0 +1,219 @@
package com.ssf.mysqloracletest.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/**
*
* @TableName transit_hunters_user_model_record
*/
@TableName(value ="transit_hunters_user_model_record")
@Data
public class TransitHuntersUserModelRecord implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
*
*/
@TableField(value = "hunters_user_name")
private String huntersUserName;
/**
*
*/
@TableField(value = "hunters_user_id_card")
private String huntersUserIdCard;
/**
*
*/
@TableField(value = "hunters_user_type")
private Integer huntersUserType;
/**
*
*/
@TableField(value = "warning_type")
private Integer warningType;
/**
*
*/
@TableField(value = "warning_level")
private Integer warningLevel;
/**
*
*/
@TableField(value = "warning_time")
private String warningTime;
/**
*
*/
@TableField(value = "warning_content")
private String warningContent;
/**
*
*/
@TableField(value = "first_global_pic")
private String firstGlobalPic;
/**
*
*/
@TableField(value = "first_user_pic")
private String firstUserPic;
/**
*
*/
@TableField(value = "first_pass_time")
private String firstPassTime;
/**
*
*/
@TableField(value = "first_device_code")
private String firstDeviceCode;
/**
*
*/
@TableField(value = "first_device_address")
private String firstDeviceAddress;
/**
*
*/
@TableField(value = "first_longitude")
private BigDecimal firstLongitude;
/**
*
*/
@TableField(value = "first_latitude")
private BigDecimal firstLatitude;
/**
*
*/
@TableField(value = "end_global_pic")
private String endGlobalPic;
/**
*
*/
@TableField(value = "end_pass_time")
private String endPassTime;
/**
*
*/
@TableField(value = "end_user_pic")
private String endUserPic;
/**
*
*/
@TableField(value = "end_device_code")
private String endDeviceCode;
/**
*
*/
@TableField(value = "end_device_address")
private String endDeviceAddress;
/**
*
*/
@TableField(value = "end_longitude")
private BigDecimal endLongitude;
/**
*
*/
@TableField(value = "end_latitude")
private BigDecimal endLatitude;
/**
*
*/
@TableField(value = "capture_frequency")
private Integer captureFrequency;
/**
*
*/
@TableField(value = "house_hold_police_station_code")
private String houseHoldPoliceStationCode;
/**
*
*/
@TableField(value = "house_hold_police_station_name")
private String houseHoldPoliceStationName;
/**
*
*/
@TableField(value = "habitation_police_station_code")
private String habitationPoliceStationCode;
/**
*
*/
@TableField(value = "habitation_police_station_name")
private String habitationPoliceStationName;
/**
*
*/
@TableField(value = "partition_field")
private Date partitionField;
/**
*
*/
@TableField(value = "create_time")
private Date createTime;
/**
*
*/
@TableField(value = "create_by")
private Integer createBy;
/**
*
*/
@TableField(value = "update_time")
private Date updateTime;
/**
*
*/
@TableField(value = "update_by")
private Integer updateBy;
/**
* 0:,1:
*/
@TableField(value = "is_active")
private Integer isActive;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -0,0 +1,30 @@
package com.ssf.mysqloracletest.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxGjxx;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxYjxx;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
/**
* @author 28758
* @description v_sy_sydw_cyryMapper
* @createDate 2023-11-29 20:30:59
* @Entity com.ssf.mysqloracletest.domain.VSySydwCyry
*/
@Mapper
public interface TSlryRyjbxxYjxxOracleMapper extends BaseMapper<TSlryRyjbxxYjxx> {
public int countSlry();
public List<TSlryRyjbxxYjxx> getSlryList(Map map);
public List<TSlryRyjbxxYjxx> getSlryListByTime(Map map);
public List<TSlryRyjbxxYjxx> getRealTimeRecording(String maxTime);
}

@ -0,0 +1,18 @@
package com.ssf.mysqloracletest.mapper;
import com.ssf.mysqloracletest.domain.TransitHuntersUserModelRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 28758
* @description transit_hunters_user_model_record()Mapper
* @createDate 2023-12-14 09:18:21
* @Entity com.ssf.mysqloracletest.domain.TransitHuntersUserModelRecord
*/
public interface TransitHuntersUserModelRecordMapper extends BaseMapper<TransitHuntersUserModelRecord> {
}

@ -0,0 +1,23 @@
package com.ssf.mysqloracletest.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxGjxx;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxYjxx;
import java.util.List;
import java.util.Map;
/**
* @author 28758
* @description v_sy_sydw_SlryService
* @createDate 2023-11-29 20:30:59
*/
public interface TSlryRyjbxxYjxxOracleService extends IService<TSlryRyjbxxYjxx> {
public int countSlry();
public List<TSlryRyjbxxYjxx> getSlryList(Map map);
public List<TSlryRyjbxxYjxx> getSlryListByTime(Map map);
public List<TSlryRyjbxxYjxx> getRealTimeRecording(String maxTime);
}

@ -0,0 +1,13 @@
package com.ssf.mysqloracletest.service;
import com.ssf.mysqloracletest.domain.TransitHuntersUserModelRecord;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author 28758
* @description transit_hunters_user_model_record()Service
* @createDate 2023-12-14 09:18:21
*/
public interface TransitHuntersUserModelRecordService extends IService<TransitHuntersUserModelRecord> {
}

@ -0,0 +1,53 @@
package com.ssf.mysqloracletest.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxGjxx;
import com.ssf.mysqloracletest.domain.TSlryRyjbxxYjxx;
import com.ssf.mysqloracletest.mapper.TSlryRyjbxxGjxxOracleMapper;
import com.ssf.mysqloracletest.mapper.TSlryRyjbxxYjxxOracleMapper;
import com.ssf.mysqloracletest.service.TSlryRyjbxxGjxxOracleService;
import com.ssf.mysqloracletest.service.TSlryRyjbxxYjxxOracleService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author 28758
* @description SlryService
* @createDate 2023-11-29 20:30:59
*/
@Service
@DS("oracleSydz")
public class TSlryRyjbxxYjxxOracleServiceImpl extends ServiceImpl<TSlryRyjbxxYjxxOracleMapper, TSlryRyjbxxYjxx>
implements TSlryRyjbxxYjxxOracleService {
@Resource
private TSlryRyjbxxYjxxOracleMapper oracleMapper;
@Override
public int countSlry() {
return oracleMapper.countSlry();
}
@Override
public List<TSlryRyjbxxYjxx> getSlryList(Map map) {
return oracleMapper.getSlryList(map);
}
@Override
public List<TSlryRyjbxxYjxx> getSlryListByTime(Map map) {
return oracleMapper.getSlryListByTime(map);
}
@Override
public List<TSlryRyjbxxYjxx> getRealTimeRecording(String time) {
return oracleMapper.getRealTimeRecording(time);
}
}

@ -0,0 +1,22 @@
package com.ssf.mysqloracletest.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ssf.mysqloracletest.domain.TransitHuntersUserModelRecord;
import com.ssf.mysqloracletest.service.TransitHuntersUserModelRecordService;
import com.ssf.mysqloracletest.mapper.TransitHuntersUserModelRecordMapper;
import org.springframework.stereotype.Service;
/**
* @author 28758
* @description transit_hunters_user_model_record()Service
* @createDate 2023-12-14 09:18:21
*/
@Service
public class TransitHuntersUserModelRecordServiceImpl extends ServiceImpl<TransitHuntersUserModelRecordMapper, TransitHuntersUserModelRecord>
implements TransitHuntersUserModelRecordService{
}

@ -0,0 +1,122 @@
package com.ssf.mysqloracletest.task;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.ssf.mysqloracletest.domain.*;
import com.ssf.mysqloracletest.service.*;
import com.ssf.mysqloracletest.utils.ConfigParam;
import com.ssf.mysqloracletest.utils.NumKit;
import com.ssf.mysqloracletest.utils.StringKit;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
*/
@Component
@RequiredArgsConstructor
public class SlryYjxxOracleTask {
private static final Logger logger = LoggerFactory.getLogger(SlryYjxxOracleTask.class);
String pattern = "yyyyMMddHHmmss";
SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
private final TSlryRyjbxxYjxxOracleService tSlryRyjbxxYjxxOracleService;
private final DevopsDeviceInfoService devopsDeviceInfoService;
private final TransitHuntersUserModelRecordService transitHuntersUserModelRecordService;
/**
*
* //
*/
@Scheduled(initialDelay = 100, fixedDelay = 3000)
public void transSwry() {
if (!"true".equals(ConfigParam.SlryYjxxOracleSwitch)) {
return;
}
Map slryMap = new HashMap();
slryMap.put("rowStart", 1);
slryMap.put("rowEnd", 100);
try {
List<TSlryRyjbxxYjxx> slryList = tSlryRyjbxxYjxxOracleService.getSlryList(slryMap);
for (TSlryRyjbxxYjxx slry : slryList) {
TransitHuntersUserModelRecord transitHuntersUserModelRecord = new TransitHuntersUserModelRecord();
transitHuntersUserModelRecord.setHuntersUserName(slry.getXM());
transitHuntersUserModelRecord.setHuntersUserIdCard(slry.getSFZH());
if (slry.getZDRYLBBJ() != null) {
transitHuntersUserModelRecord.setHuntersUserType(NumKit.checkInt(slry.getZDRYLBBJ()));
}
if (slry.getYJLX() != null) {
transitHuntersUserModelRecord.setWarningType(NumKit.checkInt(slry.getYJLX()));
}
if (slry.getYJJB() != null) {
transitHuntersUserModelRecord.setWarningLevel(NumKit.checkInt(slry.getYJJB()));
}
transitHuntersUserModelRecord.setWarningTime(slry.getYJSJ());
transitHuntersUserModelRecord.setWarningContent(slry.getYJNR());
transitHuntersUserModelRecord.setFirstGlobalPic(slry.getVALUE5());
transitHuntersUserModelRecord.setFirstUserPic(slry.getVALUE4());
transitHuntersUserModelRecord.setFirstPassTime(String.valueOf(dateFormat.parse(slry.getVALUE1()).getTime()/1000));
transitHuntersUserModelRecord.setFirstDeviceCode(slry.getVALUE3());
transitHuntersUserModelRecord.setFirstDeviceAddress(slry.getVALUE2());
DevopsDeviceInfo one = devopsDeviceInfoService.lambdaQuery().eq(DevopsDeviceInfo::getGbsChannelNo, slry.getVALUE3()).one();
transitHuntersUserModelRecord.setFirstLongitude(one.getLongitude());
transitHuntersUserModelRecord.setFirstLatitude(one.getLatitude());
transitHuntersUserModelRecord.setEndGlobalPic(slry.getVALUE10());
transitHuntersUserModelRecord.setEndUserPic(slry.getVALUE9());
transitHuntersUserModelRecord.setEndPassTime(String.valueOf(dateFormat.parse(slry.getVALUE6()).getTime()/1000));
transitHuntersUserModelRecord.setEndDeviceCode(slry.getVALUE8());
transitHuntersUserModelRecord.setEndDeviceAddress(slry.getVALUE7());
DevopsDeviceInfo one1 = devopsDeviceInfoService.lambdaQuery().eq(DevopsDeviceInfo::getGbsChannelNo, slry.getVALUE8()).one();
transitHuntersUserModelRecord.setEndLatitude(one1.getLatitude());
transitHuntersUserModelRecord.setEndLongitude(one1.getLongitude());
transitHuntersUserModelRecord.setCaptureFrequency(NumKit.checkInt(slry.getVALUE11()));
transitHuntersUserModelRecord.setHouseHoldPoliceStationCode(slry.getHJDZRQDM());
transitHuntersUserModelRecord.setHouseHoldPoliceStationName(slry.getHJDZRQ());
transitHuntersUserModelRecord.setHabitationPoliceStationCode(slry.getXZDZRQDM());
transitHuntersUserModelRecord.setHabitationPoliceStationName(slry.getXZDZRQ());
transitHuntersUserModelRecord.setPartitionField(dateFormat.parse(slry.getYJSJ()));
TransitHuntersUserModelRecord modelRecord = transitHuntersUserModelRecordService.lambdaQuery().eq(TransitHuntersUserModelRecord::getFirstGlobalPic, slry.getVALUE5()).one();
//确定一个数据是否唯一
if (modelRecord == null) {
boolean save = transitHuntersUserModelRecordService.save(transitHuntersUserModelRecord);
if (save) {
logger.info("Slry-" + slry.getSFZH() + ":插入成功");
}
} else {
UpdateWrapper<TransitHuntersUserModelRecord> wrapper = new UpdateWrapper<>();
wrapper.eq("first_global_pic", slry.getVALUE5());
boolean update = transitHuntersUserModelRecordService.update(transitHuntersUserModelRecord, wrapper);
if (update) {
logger.info("Slry-" + slry.getSFZH() + ":更新成功");
}
}
}
} catch (Exception e) {
logger.info("cjxxs:" + e.getMessage());
}
}
}

@ -50,6 +50,7 @@ public class ConfigParam {
public static String syryToActualInfoSwitch = StringKit.toString(PropertiesUtil.queryPropertiesByKey("syryToActualInfoSwitch")); public static String syryToActualInfoSwitch = StringKit.toString(PropertiesUtil.queryPropertiesByKey("syryToActualInfoSwitch"));
public static String SlryOracleSwitch = StringKit.toString(PropertiesUtil.queryPropertiesByKey("SlryOracleSwitch")); public static String SlryOracleSwitch = StringKit.toString(PropertiesUtil.queryPropertiesByKey("SlryOracleSwitch"));
public static String SlryYjxxOracleSwitch = StringKit.toString(PropertiesUtil.queryPropertiesByKey("SlryYjxxOracleSwitch"));
public static String jwzUserInfoToActual = StringKit.toString(PropertiesUtil.queryPropertiesByKey("jwzUserInfoToActual")); public static String jwzUserInfoToActual = StringKit.toString(PropertiesUtil.queryPropertiesByKey("jwzUserInfoToActual"));

@ -0,0 +1,65 @@
<?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.ssf.mysqloracletest.mapper.TSlryRyjbxxYjxxOracleMapper">
<select id="countSlry" resultType="int">
select count(*)
from SYX_JWSZPT.T_SLRY_RYJBXX_YJXX
</select>
<resultMap id="BaseResultMap" type="com.ssf.mysqloracletest.domain.TSlryRyjbxxYjxx">
<result property="YJXXID" column="YJXXID" jdbcType="VARCHAR"/>
<result property="XM" column="XM" jdbcType="VARCHAR"/>
<result property="SFZH" column="SFZH" jdbcType="VARCHAR"/>
<result property="YJLX" column="YJLX" jdbcType="VARCHAR"/>
<result property="YJJB" column="YJJB" jdbcType="VARCHAR"/>
<result property="YJNR" column="YJNR" jdbcType="VARCHAR"/>
<result property="YJSJ" column="YJSJ" jdbcType="VARCHAR"/>
<result property="KEY1" column="KEY1" jdbcType="VARCHAR"/>
<result property="VALUE1" column="VALUE1" jdbcType="VARCHAR"/>
<result property="KEY2" column="KEY2" jdbcType="VARCHAR"/>
<result property="VALUE2" column="VALUE2" jdbcType="VARCHAR"/>
<result property="KEY3" column="KEY3" jdbcType="VARCHAR"/>
<result property="VALUE3" column="VALUE3" jdbcType="VARCHAR"/>
<result property="KEY4" column="KEY4" jdbcType="VARCHAR"/>
<result property="VALUE4" column="VALUE4" jdbcType="VARCHAR"/>
<result property="KEY5" column="KEY5" jdbcType="VARCHAR"/>
<result property="VALUE5" column="VALUE5" jdbcType="VARCHAR"/>
<result property="KEY6" column="KEY6" jdbcType="VARCHAR"/>
<result property="VALUE6" column="VALUE6" jdbcType="VARCHAR"/>
<result property="KEY7" column="KEY7" jdbcType="VARCHAR"/>
<result property="VALUE7" column="VALUE7" jdbcType="VARCHAR"/>
<result property="KEY8" column="KEY8" jdbcType="VARCHAR"/>
<result property="VALUE8" column="VALUE8" jdbcType="VARCHAR"/>
<result property="XZDZRQ" column="XZDZRQ" jdbcType="VARCHAR"/>
<result property="XZDZRQDM" column="XZDZRQDM" jdbcType="VARCHAR"/>
<result property="ZDRYLBBJ" column="ZDRYLBBJ" jdbcType="VARCHAR"/>
<result property="HJDZRQ" column="HJDZRQ" jdbcType="VARCHAR"/>
<result property="HJDZRQDM" column="HJDZRQDM" jdbcType="VARCHAR"/>
<result property="KEY10" column="KEY10" jdbcType="VARCHAR"/>
<result property="VALUE10" column="VALUE10" jdbcType="VARCHAR"/>
<result property="KEY9" column="KEY9" jdbcType="VARCHAR"/>
<result property="VALUE9" column="VALUE9" jdbcType="VARCHAR"/>
<result property="KEY11" column="KEY11" jdbcType="VARCHAR"/>
<result property="VALUE11" column="VALUE11" jdbcType="VARCHAR"/>
</resultMap>
<select id="getSlryList" parameterType="java.util.Map" resultMap="BaseResultMap">
SELECT t2.*
FROM (SELECT ROWNUM rn, t1.* FROM (SELECT * FROM SYX_JWSZPT.T_SLRY_RYJBXX_YJXX) t1 WHERE ROWNUM<![CDATA[ <= ]]> ${rowEnd}) t2
WHERE t2.rn <![CDATA[ >= ]]> ${rowStart}
</select>
<select id="getSlryListByTime" parameterType="java.util.Map" resultMap="BaseResultMap">
SELECT * FROM SYX_JWSZPT.T_SLRY_RYJBXX_YJXX where GJSJ <![CDATA[ >= ]]> #{maxTime} and GJSJ <![CDATA[ <= ]]> #{minTime}
</select>
<select id="getRealTimeRecording" parameterType="java.util.Map" resultMap="BaseResultMap">
SELECT * FROM SYX_JWSZPT.T_SLRY_RYJBXX_YJXX where GJSJ >#{maxTime}
</select>
</mapper>

@ -0,0 +1,44 @@
<?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.ssf.mysqloracletest.mapper.TransitHuntersUserModelRecordMapper">
<resultMap id="BaseResultMap" type="com.ssf.mysqloracletest.domain.TransitHuntersUserModelRecord">
<id property="id" column="id" jdbcType="BIGINT"/>
<result property="huntersUserName" column="hunters_user_name" jdbcType="VARCHAR"/>
<result property="huntersUserIdCard" column="hunters_user_id_card" jdbcType="VARCHAR"/>
<result property="huntersUserType" column="hunters_user_type" jdbcType="TINYINT"/>
<result property="warningType" column="warning_type" jdbcType="TINYINT"/>
<result property="warningLevel" column="warning_level" jdbcType="TINYINT"/>
<result property="warningTime" column="warning_time" jdbcType="VARCHAR"/>
<result property="warningContent" column="warning_content" jdbcType="VARCHAR"/>
<result property="firstGlobalPic" column="first_global_pic" jdbcType="VARCHAR"/>
<result property="firstUserPic" column="first_user_pic" jdbcType="VARCHAR"/>
<result property="firstPassTime" column="first_pass_time" jdbcType="VARCHAR"/>
<result property="firstDeviceCode" column="first_device_code" jdbcType="VARCHAR"/>
<result property="firstDeviceAddress" column="first_device_address" jdbcType="VARCHAR"/>
<result property="firstLongitude" column="first_longitude" jdbcType="DECIMAL"/>
<result property="firstLatitude" column="first_latitude" jdbcType="DECIMAL"/>
<result property="endGlobalPic" column="end_global_pic" jdbcType="VARCHAR"/>
<result property="endPassTime" column="end_pass_time" jdbcType="VARCHAR"/>
<result property="endUserPic" column="end_user_pic" jdbcType="VARCHAR"/>
<result property="endDeviceCode" column="end_device_code" jdbcType="VARCHAR"/>
<result property="endDeviceAddress" column="end_device_address" jdbcType="VARCHAR"/>
<result property="endLongitude" column="end_longitude" jdbcType="DECIMAL"/>
<result property="endLatitude" column="end_latitude" jdbcType="DECIMAL"/>
<result property="captureFrequency" column="capture_frequency" jdbcType="INTEGER"/>
<result property="houseHoldPoliceStationCode" column="house_hold_police_station_code" jdbcType="VARCHAR"/>
<result property="houseHoldPoliceStationName" column="house_hold_police_station_name" jdbcType="VARCHAR"/>
<result property="habitationPoliceStationCode" column="habitation_police_station_code" jdbcType="VARCHAR"/>
<result property="habitationPoliceStationName" column="habitation_police_station_name" jdbcType="VARCHAR"/>
<result property="partitionField" column="partition_field" jdbcType="TIMESTAMP"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="createBy" column="create_by" jdbcType="INTEGER"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="updateBy" column="update_by" jdbcType="INTEGER"/>
<result property="isActive" column="is_active" jdbcType="TINYINT"/>
</resultMap>
</mapper>
Loading…
Cancel
Save