基础数据同步

首页签出2023/07/24
宇宙皮皮娃 2 years ago
parent 008e63c412
commit 3c8dc48918

@ -0,0 +1,4 @@
{
"startTime":"2022-12-26 00:00:00",
"pageNum":"1"
}

@ -287,7 +287,7 @@
<configuration>
<resources>
<resource>
<directory>../../dataConfig</directory>
<directory>dataConfig</directory>
<filtering>true</filtering>
</resource>
</resources>

@ -12,9 +12,6 @@ import lombok.Data;
*/
@Data
public class TBasicDto {
private String serialId;
private String receive;
private String send;
private String jzh;
private String inpatientNo;
private String admissTimes;
@ -23,15 +20,15 @@ public class TBasicDto {
private String disDate ;
private String admissDeptName ;
private String disDeptName ;
private String attending;
private String attendingName;
private String dutyNurse;
private String age;
private String sex;
private String idCard;
private String disDept;
private String sexName;
private String admissDept;
private String bedNum;
private String isDead;
private String admissDays;
private String wardCode;
private String wardName;
}

@ -0,0 +1,12 @@
package com.docus.server.collection.httpservices;
import com.docus.server.collection.dto.TBasicDto;
import java.util.List;
import java.util.Map;
public interface HttpTBasicService {
List<TBasicDto> getTBasicDto(String url, Map<String,String> headers, Map<String,Object> params);
}

@ -0,0 +1,123 @@
package com.docus.server.collection.httpservices.impl;
import com.docus.core.util.Func;
import com.docus.server.collection.dto.TBasicDto;
import com.docus.server.collection.httpservices.HttpTBasicService;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.http.util.HttpUtil;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @BelongsProject: docus-mzzy-collector
* @BelongsPackage: com.docus.server.collection.httpservices.impl
* @Author: chierhao
* @CreateTime: 2023-03-10 11:46
* @Description: TODO
* @Version: 1.0
*/
@Service
@Slf4j
public class HttpTBasicServiceImpl implements HttpTBasicService {
@Override
public List<TBasicDto> getTBasicDto(String url, Map<String,String> headers, Map<String,Object> params) {
List<TBasicDto> tBasicDtos=null;
try {
//发送get请求获取返货值
String resultStr = HttpUtil.get(url, headers, params);
//解析返货值字符串
tBasicDtos=parsing(resultStr);
}catch (Exception e){
log.error(e.getMessage(),e);
}
return tBasicDtos;
}
private List<TBasicDto> parsing(String resultStr){
if(Func.isEmpty(resultStr)){
return null;
}
Map result = Func.readJson(resultStr, Map.class);
if(Func.isEmpty(result)){
return null;
}
Map data =(Map) result.get("data");
if(Func.isEmpty(data)){
return null;
}
List<Map<String,String>> list =(List) data.get("list");
if(Func.isEmpty(list)){
return null;
}
List<TBasicDto> tBasicDtos=new ArrayList<TBasicDto>();
for(Map<String,String> map:list){
//记帐号
String jzh=map.get("inpatientNo");
//病案号
String inpatientNo =map.get("patientNo");
//患者姓名
String name=map.get("patientName");
//住院次数
String admissTimes=map.get("inTimes");
//入院时间
String admissDate=map.get("inDate");
//出院时间
String disDate=map.get("outDate");
//入院科室编号
String admissDept=map.get("deptCode");
//入院科室名称
String admissDeptName=map.get("deptName");
//出院科室编号
String disDept=map.get("deptCode");
//出院科室名称
String disDeptName=map.get("deptName");
//主管医生编号
String attending=map.get("directorDocCode");
//主管医生姓名
String attendingName=map.get("directorDocName");
//责任护士编号
String dutyNurse=map.get("dutyNurseName");
//年龄
String age=map.get("age");
//性别
String sex=map.get("sexCode");
//身份证号
String idCard=map.get("idenno");
//住院天数
String admissDays=map.get("inDays");
//是否死亡
String isDead=map.get("");
//床位号
String bedNum=map.get("bedNo");
TBasicDto tBasicDto=new TBasicDto();
tBasicDto.setAdmissDays(admissDays);
tBasicDto.setIsDead(isDead);
tBasicDto.setBedNum(bedNum);
tBasicDto.setDisDept(disDept);
tBasicDto.setAdmissDept(admissDept);
tBasicDto.setIdCard(idCard);
tBasicDto.setSex(sex);
tBasicDto.setAge(age);
tBasicDto.setAttendingName(attendingName);
tBasicDto.setAttending(attending);
tBasicDto.setAdmissTimes(admissTimes);
tBasicDto.setDisDate(disDate);
tBasicDto.setAdmissDate(admissDate);
tBasicDto.setDisDeptName(disDeptName);
tBasicDto.setAdmissDeptName(admissDeptName);
tBasicDto.setJzh(jzh);
tBasicDto.setName(name);
tBasicDto.setInpatientNo(inpatientNo);
tBasicDto.setDutyNurse(dutyNurse);
tBasicDtos.add(tBasicDto);
}
return tBasicDtos;
}
}

@ -35,33 +35,18 @@ public class TBasic implements Serializable {
@ApiModelProperty(value = "病案号")
private String inpatientNo;
@ApiModelProperty(value = "住院ID号")
private String admissId;
@ApiModelProperty(value = "患者姓名")
private String name;
@ApiModelProperty(value = "盘号")
private String ph;
@ApiModelProperty(value = "性别")
private String sex;
@ApiModelProperty(value = "年龄_岁")
private Integer age;
@ApiModelProperty(value = "年龄_月")
private Integer ageMonth;
@ApiModelProperty(value = "年龄_天")
private Integer ageDay;
@ApiModelProperty(value = "身份证")
private String idCard;
@ApiModelProperty(value = "手机号码")
private String telphone;
@ApiModelProperty(value = "住院日期")
private Date admissDate;
@ -89,65 +74,12 @@ public class TBasic implements Serializable {
@ApiModelProperty(value = "主管医生名称")
private String attendingName;
@ApiModelProperty(value = "主要诊断编码")
private String mainDiagCode;
@ApiModelProperty(value = "主要诊断名称")
private String mainDiagName;
@ApiModelProperty(value = "主要手术编码")
private String mainOperateCode;
@ApiModelProperty(value = "主要手术名称")
private String mainOperateName;
@ApiModelProperty(value = "是否死亡")
private Integer isDead;
@ApiModelProperty(value = "是否作废(01是)")
private Integer isCancel;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "修改时间")
private Date updateTime;
@ApiModelProperty(value = "是否归档 1已归档0未归档")
private Integer isArchive;
@ApiModelProperty(value = "归档时间")
private Date archiveTime;
@ApiModelProperty(value = "文件来源 1:af_archive_detail,2:t_scan_assort")
private Integer fileSource;
@ApiModelProperty(value = "完整性描述")
private String integrityDesc;
private String bColumn1;
private String bColumn2;
private String bColumn3;
private String bColumn4;
private String bColumn5;
private Integer bColumn6;
private Integer bColumn7;
private Integer bColumn8;
private Integer bColumn9;
private Integer bColumn10;
@ApiModelProperty(value = "姓名缩写(内部构成)")
private String nameSpell;
@ApiModelProperty(value = "性别名称")
private String sexName;
@ -156,4 +88,7 @@ public class TBasic implements Serializable {
@ApiModelProperty(value = "床位号")
private String bedNum;
@ApiModelProperty(value = "责任护士")
private String dutyNurse;
}

@ -2,9 +2,10 @@ package com.docus.server.collection.infrastructure.dao.mapper;
import com.docus.server.collection.infrastructure.dao.entity.TBasic;
import com.docus.server.collection.infrastructure.dao.entity.TBasicExtend;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* Mapper
@ -17,8 +18,6 @@ public interface TBasicMapper{
Integer selectOne(@Param("jzh") String jzh);
Integer insert(@Param("tBasic") TBasic tBasic);
Integer insertExtend(@Param("tBasicExtend") TBasicExtend tBasicExtend);
Integer insertBatch(@Param("tBasicList") List<TBasic> tBasicList);
}

@ -1,8 +1,8 @@
package com.docus.server.collection.service;
import com.docus.server.collection.dto.TBasicDto;
import java.io.IOException;
public interface ITBasicService {
public void setTBasic(TBasicDto dto) throws Exception;
public void setTBasic() throws IOException, Exception;
}

@ -5,15 +5,19 @@ import com.docus.core.util.DateUtil;
import com.docus.core.util.Func;
import com.docus.infrastructure.redis.service.IdService;
import com.docus.server.collection.dto.TBasicDto;
import com.docus.server.collection.httpservices.HttpTBasicService;
import com.docus.server.collection.infrastructure.dao.entity.TBasic;
import com.docus.server.collection.infrastructure.dao.entity.TBasicExtend;
import com.docus.server.collection.infrastructure.dao.mapper.TBasicMapper;
import com.docus.server.collection.service.ITBasicService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.io.*;
import java.time.Duration;
import java.util.*;
/**
* @BelongsProject: docus-webservice-sdry
@ -24,83 +28,236 @@ import java.util.Date;
* @Version: 1.0
*/
@Service
@Slf4j
public class TBasicServiceImpl implements ITBasicService {
@Resource
private TBasicMapper tBasicMapper;
@Resource
private HttpTBasicService httpTBasicService;
@Resource
private IdService idService;
@Value("${TBasic.url}")
private String url;
private String headers="{\"Content-Type\":\"application/json\",\"domain\":\"b91b0ac7-665f-4874-a282-2f5511a44263\",\"key\":\"WZHBA\"}\n";
@Override
@Transactional
public void setTBasic(TBasicDto tBasicDto) throws Exception {
//判断jzh是否重复
Integer num = tBasicMapper.selectOne(tBasicDto.getJzh());
if (num>0) {
throw new Exception("记帐号已存在");
}
Long patientId = idService.getDateSeq();
//数据类型转化,格式处理
Date admissDate = Func.parseDate(tBasicDto.getAdmissDate(), DateUtil.PATTERN_DATETIME_MINI);
Date disDate = Func.parseDate(tBasicDto.getDisDate(), DateUtil.PATTERN_DATETIME_MINI);
String admissTimesStr = tBasicDto.getAdmissTimes();
Integer admissTimes=null;
if(NumberUtil.isInteger(admissTimesStr)){
admissTimes=Integer.parseInt(admissTimesStr);
public void setTBasic() throws Exception {
//读取配置文件
File dir = new File(".");
String path ="";
path = dir.getCanonicalPath()+"\\dataConfig\\time.json";
File timeConfigFile= new File(path);
InputStream inputstream =null;
if(timeConfigFile.isFile()){
inputstream=new FileInputStream(timeConfigFile);
}
String ageStr = tBasicDto.getAge();
ageStr =ageStr.substring(0,ageStr.length()-1);
System.out.println(ageStr);
Integer age=null;
if(NumberUtil.isInteger(ageStr)){
age=Integer.parseInt(ageStr);
}
String sexName=tBasicDto.getSexName();
if(sexName.length()>1){
sexName=sexName.substring(0,1);
}
String admissDaysStr = tBasicDto.getAdmissDays();
Integer admissDays=null;
if(NumberUtil.isInteger(admissDaysStr)){
admissDays=Integer.parseInt(admissDaysStr);
}
String isDeadStr = tBasicDto.getIsDead();
Integer isDead=0;
if("死亡".equals(isDeadStr)){
isDead=1;
byte[] bytes = IOUtils.toByteArray(inputstream);
String timeJson = new String(bytes);
Map<String,String> map = Func.readJson(timeJson, Map.class);
inputstream.close();
//获取开始时间
String startTimeStr=map.get("startTime");
Date startTime = Func.parseDate(startTimeStr, DateUtil.PATTERN_DATETIME);
//获取开始时间到昨天时间间隔
Date yesterday=DateUtil.minusDays(DateUtil.now(),1);
Duration between = DateUtil.between(startTime, yesterday);
//循环发送请求
for(int i=0;i<=between.toDays(); i++){
//开始时间
Date beginTime=DateUtil.plusDays(startTime,i);
String beginTimeStr = DateUtil.format(beginTime, DateUtil.PATTERN_DATETIME);
//结束时间
Date endTime = DateUtil.plusDays(beginTime, 1);
String endTimeStr = DateUtil.format(endTime, DateUtil.PATTERN_DATETIME);
//分页查询页面容量
Integer pageSize=500;
//分页查询当前页
Integer pageNum=Integer.parseInt(map.get("pageNum"));
//分页参数
boolean pageFlag=true;
//记录开始时间
modifyJsonFile(timeConfigFile,"startTime",beginTimeStr);
//分页查询
for(pageNum=1;true;i++){
//设置请求头信息
Map<String,String> headerMap = Func.readJson(headers, Map.class);
//设置请求参数
Map<String,Object> paramMap = new HashMap<String,Object>(5);
paramMap.put("beginTime",beginTimeStr);
paramMap.put("endTime",endTimeStr);
paramMap.put("pageSize",pageSize);
paramMap.put("pageNum",pageNum);
paramMap.put("pageFlag",pageFlag);
List<TBasicDto> tBasicDtoList = httpTBasicService.getTBasicDto(url, headerMap, paramMap);
//为空则跳出
if(Func.isEmpty(tBasicDtoList)){
break;
}
//持久化对像集合转化
List<TBasic> tBasicList=new ArrayList<TBasic>();
for(TBasicDto tBasicDto:tBasicDtoList){
//判断jzh是否重复
Integer num = tBasicMapper.selectOne(tBasicDto.getJzh());
if (num>0) {
throw new Exception("记帐号已存在");
}
Long patientId = idService.getDateSeq();
//数据类型转化,格式处理
Date admissDate = Func.parseDate(tBasicDto.getAdmissDate(), DateUtil.PATTERN_DATETIME_MINI);
Date disDate = Func.parseDate(tBasicDto.getDisDate(), DateUtil.PATTERN_DATETIME_MINI);
String admissTimesStr = tBasicDto.getAdmissTimes();
Integer admissTimes=null;
if(NumberUtil.isInteger(admissTimesStr)){
admissTimes=Integer.parseInt(admissTimesStr);
}
String ageStr = tBasicDto.getAge();
ageStr =ageStr.substring(0,ageStr.length()-1);
Integer age=null;
if(NumberUtil.isInteger(ageStr)){
age=Integer.parseInt(ageStr);
}
String admissDaysStr = tBasicDto.getAdmissDays();
Integer admissDays=null;
if(NumberUtil.isInteger(admissDaysStr)){
admissDays=Integer.parseInt(admissDaysStr);
}
String isDeadStr = tBasicDto.getIsDead();
Integer isDead=0;
if("死亡".equals(isDeadStr)){
isDead=1;
}
String sexStr = tBasicDto.getSex();
String sex="";
String sexName="";
if("M".equals(sexStr)){
sexName="男";
sex="1";
}
if("F".equals(sexStr)){
sexName="女";
sex="2";
}
//组装数据
TBasic tBasic=new TBasic();
tBasic.setPatientId(patientId);
tBasic.setJzh(tBasicDto.getJzh());
tBasic.setInpatientNo(tBasicDto.getInpatientNo());
tBasic.setAdmissTimes(admissTimes);
tBasic.setAdmissDays(admissDays);
tBasic.setName(tBasicDto.getName());
tBasic.setAge(age);
tBasic.setSexName(sexName);
tBasic.setSex(sex);
tBasic.setIsDead(isDead);
tBasic.setAttendingName(tBasicDto.getAttendingName());
tBasic.setAttending(tBasicDto.getAttending());
tBasic.setIdCard(tBasicDto.getIdCard());
tBasic.setBedNum(tBasicDto.getBedNum());
tBasic.setDutyNurse(tBasicDto.getDutyNurse());
tBasic.setAdmissDate(admissDate);
tBasic.setAdmissDept(tBasicDto.getAdmissDept());
tBasic.setAdmissDeptName(tBasicDto.getAdmissDeptName());
tBasic.setDisDate(disDate);
tBasic.setDisDept(tBasicDto.getDisDept());
tBasic.setDisDeptName(tBasicDto.getDisDeptName());
tBasic.setCreateTime(DateUtil.now());
//持久化
tBasicList.add(tBasic);
}
//批量插入
tBasicMapper.insertBatch(tBasicList);
//记录页码startTime
modifyJsonFile(timeConfigFile,"pageNum",pageNum.toString());
}
//完成重置页码为1,并更新开始时间和结束时间为结束时间
modifyJsonFile(timeConfigFile,"pageNum","1");
modifyJsonFile(timeConfigFile,"startTime",endTimeStr);
}
//组装数据
TBasic tBasic=new TBasic();
tBasic.setPatientId(patientId);
tBasic.setJzh(tBasicDto.getJzh());
tBasic.setInpatientNo(tBasicDto.getInpatientNo());
tBasic.setAdmissTimes(admissTimes);
tBasic.setName(tBasicDto.getName());
tBasic.setAdmissDate(admissDate);
tBasic.setDisDate(disDate);
tBasic.setAdmissDeptName(tBasicDto.getAdmissDeptName());
tBasic.setDisDeptName(tBasicDto.getDisDeptName());
tBasic.setAttendingName(tBasicDto.getAttendingName());
tBasic.setAge(age);
tBasic.setSex(tBasicDto.getSex());
tBasic.setIdCard(tBasicDto.getIdCard());
tBasic.setDisDept(tBasicDto.getDisDept());
tBasic.setSexName(sexName);
tBasic.setBedNum(tBasicDto.getBedNum());
tBasic.setAdmissDays(admissDays);
tBasic.setIsDead(isDead);
TBasicExtend tBasicExtend=new TBasicExtend();
tBasicExtend.setPatientId(patientId.toString());
tBasicExtend.setWardCode(tBasicDto.getWardCode());
tBasicExtend.setWardName(tBasicDto.getWardName());
//持久化
tBasicMapper.insert(tBasic);
tBasicMapper.insertExtend(tBasicExtend);
}
// public static void main(String[] args) throws IOException {
// File dir = new File(".");
// String path ="";
// path = dir.getCanonicalPath()+"\\timeConfig\\time.json";
// File timeConfigFile= new File(path);
// InputStream inputstream =null;
// if(timeConfigFile.isFile()){
// inputstream=new FileInputStream(timeConfigFile);
// }
// byte[] bytes = IOUtils.toByteArray(inputstream);
// String timeJson = new String(bytes);
//
// String str1=timeJson.substring(0,timeJson.indexOf("startTime"));
// String str2=timeJson.substring(timeJson.indexOf("startTime"));
// String str3=str2.substring(0,str2.indexOf(":")+2);
// String str4=str2.substring(str2.indexOf(":")+2);
// String str5=str4.substring(str4.indexOf("\""));
// System.out.println(str1+str3+str5);
// }
public void modifyJsonFile(File file, String key, String value) {
StringBuilder sb = new StringBuilder();
//记录替换所在的行
int rowLine = 0;
//换行符
String enter = System.getProperty("line.separator");
PrintWriter pw = null;
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
for (line = br.readLine(); line != null; line = br.readLine()) {
rowLine++;
if (line.contains(key)) {
String str1=line.substring(0,line.indexOf(key));
String str2=line.substring(line.indexOf(key));
String str3=str2.substring(0,str2.indexOf(":")+2);
String str4=str2.substring(str2.indexOf(":")+2);
String str5=str4.substring(str4.indexOf("\""));
line=str1+str3+value+str5;
}
//数据暂存在 StringBuilder 中
if (rowLine == 1) {
sb.append(line);
} else {
sb.append(enter).append(line);
}
}
pw = new PrintWriter(new FileWriter(file));
pw.print(sb);
} catch (IOException ex) {
ex.printStackTrace();
} finally {
if (pw != null) {
pw.close();
}
}
}
}

@ -0,0 +1,35 @@
package com.docus.server.collection.util;
import com.docus.server.collection.service.ITBasicService;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @BelongsProject: docus-mzzy-collector
* @BelongsPackage: com.docus.server.collection.util
* @Author: chierhao
* @CreateTime: 2023-03-13 11:33
* @Description: TODO
* @Version: 1.0
*/
@Component
@Slf4j
public class jobUtil {
@Autowired
private ITBasicService tBasicService;
@XxlJob("tBasicJob")
public void tBasicJob(){
try {
log.info("tBasicJob------开始");
tBasicService.setTBasic();
log.info("tBasicJob------结束");
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -65,13 +65,17 @@ xxl:
admin:
addresses: http://job.docus.cn:8180/xxl-job-admin
executor:
appname: docus-inspection
appname: docus-mzzy-collector
address:
ip:
port: 17781
logretentiondays: 30
logpath: D:/xxl-job/inspection
TBasic:
url: http://localhost:8989/tbasic
# url: http://199.168.91.110:7800/roc/curr-web/api/v1/common/in-patient/query
# com.ibm.mq连接方式集群模式需要配置两个地址
ibm:
@ -85,4 +89,4 @@ ibm:
replica:
queueManager: MqManager02
channel: chl_server02
connName: 127.0.0.1(1415)
connName: 127.0.0.1(1415)

@ -3,21 +3,58 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.docus.server.collection.infrastructure.dao.mapper.TBasicMapper">
<insert id="insert">
<insert id="insertBatch">
INSERT INTO `docus_medicalrecord`.`t_basic`
(`admiss_days`,`is_dead`,`sex_name`,`bed_num`,`age`,`sex`,`id_card`,`dis_dept`,`patient_id`, `admiss_times`, `inpatient_no`,`name`, `admiss_date`, `admiss_dept_name`, `dis_date`, `dis_dept_name`,`attending_name`,`jzh`)
(`duty_nurse`,
`admiss_dept`,
`attending`,
`create_time`,
`admiss_days`,
`is_dead`,
`sex_name`,
`bed_num`,
`age`,
`sex`,
`id_card`,
`dis_dept`,
`patient_id`,
`admiss_times`,
`inpatient_no`,
`name`,
`admiss_date`,
`admiss_dept_name`,
`dis_date`,
`dis_dept_name`,
`attending_name`,
`jzh`)
VALUES
(#{tBasic.admissDays},#{tBasic.isDead},#{tBasic.sexName},#{tBasic.bedNum},#{tBasic.age},#{tBasic.sex},#{tBasic.idCard},#{tBasic.disDept},#{tBasic.patientId},#{tBasic.admissTimes},#{tBasic.inpatientNo},#{tBasic.name},
#{tBasic.admissDate},#{tBasic.admissDeptName},#{tBasic.disDate},#{tBasic.disDeptName},#{tBasic.attendingName},#{tBasic.jzh})
</insert>
<insert id="insertExtend">
INSERT INTO `docus_medicalrecord`.`t_basic_extend`
(`patient_id`,`ward_code`,`ward_name`)
VALUES
(#{tBasicExtend.patientId},#{tBasicExtend.wardCode},#{tBasicExtend.wardName})
<foreach collection="tBasicList" item="tBasic" separator=",">
(#{tBasic.dutyNurse},
#{tBasic.admissDept},
#{tBasic.attending},
#{tBasic.createTime},
#{tBasic.admissDays},
#{tBasic.isDead},
#{tBasic.sexName},
#{tBasic.bedNum},
#{tBasic.age},
#{tBasic.sex},
#{tBasic.idCard},
#{tBasic.disDept},
#{tBasic.patientId},
#{tBasic.admissTimes},
#{tBasic.inpatientNo},
#{tBasic.name},
#{tBasic.admissDate},
#{tBasic.admissDeptName},
#{tBasic.disDate},
#{tBasic.disDeptName},
#{tBasic.attendingName},
#{tBasic.jzh})
</foreach>
</insert>
<select id="selectOne" resultType="java.lang.Integer">
select count(patient_id) from t_basic where jzh=#{jzh}
select count(patient_id) from docus_medicalrecord.t_basic where jzh=#{jzh}
</select>
</mapper>

Loading…
Cancel
Save