导出国标病历
parent
132d6bbbbe
commit
e0b1e07b67
@ -0,0 +1,18 @@
|
||||
package com.emr.dao;
|
||||
|
||||
import com.emr.vo.ExportTaskVo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @InterfaceName BatchExportMapper
|
||||
* @Description 国家病历批量导出接口
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 11:44
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface BatchExportMapper {
|
||||
|
||||
//查询所有任务
|
||||
List<ExportTaskVo> selectAll(int taskState);
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.emr.dao;
|
||||
|
||||
import com.emr.vo.ExportTaskDetailsVo;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @InterfaceName ExportTaskDetailsMapper
|
||||
* @Description 批量导出详情接口
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 14:03
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface ExportTaskDetailsMapper {
|
||||
|
||||
List<ExportTaskDetailsVo> selectAllByTaskId(int taskId);
|
||||
|
||||
List<String> getMasterId(@Param("inpNo") String inpNo, @Param("dischargeDateTime") String dischargeDateTime);
|
||||
|
||||
int upStatc(@Param("state") int state,@Param("id") int id);
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.emr.dao;
|
||||
|
||||
import com.emr.vo.ExportPdfVo;
|
||||
import com.emr.vo.ExportZdAssortVo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ExportZdAssortMapper {
|
||||
|
||||
List<ExportPdfVo>getPdfPath(String masterId);
|
||||
|
||||
List<ExportZdAssortVo>selectAll();
|
||||
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package com.emr.service;
|
||||
|
||||
import com.emr.vo.ExportTaskVo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @InterfaceName BatchExportService
|
||||
* @Description 国家病历批量导出接口
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 11:40
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface BatchExportService {
|
||||
//查询所有任务
|
||||
List<ExportTaskVo> selectAll(int taskState);
|
||||
|
||||
//批量导出
|
||||
String batchExportPdf(int taskid)throws Exception;
|
||||
}
|
@ -0,0 +1,207 @@
|
||||
package com.emr.service.ipml;
|
||||
|
||||
import com.emr.dao.BatchExportMapper;
|
||||
import com.emr.dao.ExportTaskDetailsMapper;
|
||||
import com.emr.dao.ExportZdAssortMapper;
|
||||
import com.emr.service.BatchExportService;
|
||||
import com.emr.util.Logger;
|
||||
import com.emr.vo.ExportPdfVo;
|
||||
import com.emr.vo.ExportTaskDetailsVo;
|
||||
import com.emr.vo.ExportTaskVo;
|
||||
import com.itextpdf.kernel.pdf.PdfDocument;
|
||||
import com.itextpdf.text.Document;
|
||||
import com.itextpdf.text.pdf.*;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.*;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @ClassName BatchExportServiceImpl
|
||||
* @Description 国家病历批量导出实现类
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 11:41
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Service
|
||||
public class BatchExportServiceImpl implements BatchExportService {
|
||||
private static Logger logger = new Logger();
|
||||
@Autowired
|
||||
BatchExportMapper batchExportMapper;
|
||||
@Autowired
|
||||
ExportTaskDetailsMapper exportTaskDetailsMapper;
|
||||
@Autowired
|
||||
private ExportZdAssortMapper exportZdAssortMapper;
|
||||
@Value("${export_pdf_hospital_info}")
|
||||
private String flieName;
|
||||
@Value("${export_pdf_path}")
|
||||
private String exportPdfPath;
|
||||
|
||||
|
||||
@Override
|
||||
public List<ExportTaskVo> selectAll(int taskState) {
|
||||
return batchExportMapper.selectAll(taskState);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String batchExportPdf(int taskid) throws Exception {
|
||||
//是否存在目录不存在创建
|
||||
File file = new File (exportPdfPath);
|
||||
if(!file.isDirectory ()){
|
||||
file.mkdirs ();
|
||||
}
|
||||
//导出文件名
|
||||
String fileName=null;
|
||||
//根据taskid查询所有需要导出病历的住院号出院日期
|
||||
List<ExportTaskDetailsVo> taskList = exportTaskDetailsMapper.selectAllByTaskId(taskid);
|
||||
if (taskList==null) {
|
||||
return "没有任务";
|
||||
}
|
||||
for (ExportTaskDetailsVo list : taskList) {
|
||||
//根据住院号出院日期查询需要导出病历路径
|
||||
List<String> masterIds = exportTaskDetailsMapper.getMasterId(list.getInpNo(), list.getDischargeDateTime());
|
||||
if (masterIds==null) {
|
||||
logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历找不到。");
|
||||
continue;
|
||||
}
|
||||
for (String masterId : masterIds) {
|
||||
List<ExportPdfVo> pdfPathList = exportZdAssortMapper.getPdfPath(masterId);
|
||||
if (pdfPathList==null){
|
||||
logger.log("病案号为:" + list.getInpNo() + "出院时间为:" + list.getDischargeDateTime() + "的病历查询不到影像");
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
//组织导出文件名
|
||||
fileName = exportFlieName(list);
|
||||
} catch (ParseException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
// downPdfResponse(fileName,response);
|
||||
Boolean aBoolean = exportPdf(pdfPathList,fileName,exportPdfPath);
|
||||
//为true时修改任务状态1完成2失败
|
||||
if (aBoolean){
|
||||
exportTaskDetailsMapper.upStatc(1,list.getId());
|
||||
}else {
|
||||
exportTaskDetailsMapper.upStatc(2,list.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
return "下载完成";
|
||||
}
|
||||
|
||||
|
||||
private void downPdfResponse(String pdfName, HttpServletResponse response) {
|
||||
try {
|
||||
pdfName = java.net.URLEncoder.encode(pdfName, "UTF-8");
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
response.reset();
|
||||
response.setContentType("application/pdf");
|
||||
response.setHeader("content-disposition", "attachment; filename=" + pdfName + ".pdf");
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static Boolean exportPdf(List<ExportPdfVo> pdfPathList,String fileName,String exportPdfPath) {
|
||||
//上一个目录名称
|
||||
String lastOutline = null;
|
||||
//是否增加标签
|
||||
boolean outFlag = true;
|
||||
//标签顺序
|
||||
Integer outNum = 1;
|
||||
Integer pageNum=1;
|
||||
Document document = new Document();
|
||||
PdfCopy writer = null;
|
||||
try {
|
||||
FileOutputStream fileOutputStream = new FileOutputStream(exportPdfPath+fileName+".pdf");
|
||||
writer = new PdfCopy(document,fileOutputStream);
|
||||
document.open();
|
||||
PdfContentByte cb = writer.getDirectContent();
|
||||
cb.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12);
|
||||
cb.beginText();
|
||||
cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "目录", 300, 780, 0);
|
||||
cb.endText();
|
||||
// 创建目录
|
||||
PdfOutline root = cb.getRootOutline();
|
||||
for (int i = 0; i < pdfPathList.size(); i++) {
|
||||
try {
|
||||
String assortName = pdfPathList.get(i).getAssortName();
|
||||
if (StringUtils.isNotBlank(lastOutline) && lastOutline.equals(assortName)) {
|
||||
outFlag = false;
|
||||
}
|
||||
if (StringUtils.isBlank(lastOutline)) {
|
||||
lastOutline = assortName;
|
||||
outFlag=true;
|
||||
}
|
||||
if (!lastOutline.equals(assortName)){
|
||||
lastOutline = assortName;
|
||||
outFlag=true;
|
||||
}
|
||||
PdfReader reader = new PdfReader(pdfPathList.get(i).getPdfPath());
|
||||
int n = reader.getNumberOfPages();
|
||||
for (int s = 1; s <= n; s++) {
|
||||
PdfImportedPage page = writer.getImportedPage(reader, s);
|
||||
writer.addPage(page);
|
||||
}
|
||||
if (outFlag) {
|
||||
//目录跳转页面内容设置。
|
||||
PdfAction action = PdfAction.gotoLocalPage(pageNum, new PdfDestination(PdfDestination.FIT), writer);
|
||||
//标题目录
|
||||
String title = outNum+"."+pdfPathList.get(i).getAssortName();
|
||||
new PdfOutline(root, action, title, false);
|
||||
outNum++;
|
||||
}
|
||||
pageNum =pageNum+getPageNum(pdfPathList.get(i));
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (document != null) {
|
||||
document.close();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
//获取pdf页码
|
||||
private static int getPageNum(ExportPdfVo obj) {
|
||||
FileInputStream is;
|
||||
com.itextpdf.kernel.pdf.PdfReader pdfReader = null;
|
||||
int pages = 0;
|
||||
//创建File类
|
||||
File file = new File(obj.getPdfPath());
|
||||
//判断文件是否存在
|
||||
if (file.exists()) {
|
||||
try {
|
||||
is = new FileInputStream(file);
|
||||
pdfReader = new com.itextpdf.kernel.pdf.PdfReader(is);
|
||||
com.itextpdf.kernel.pdf.PdfDocument redDocument = new com.itextpdf.kernel.pdf.PdfDocument(pdfReader);
|
||||
pages = redDocument.getNumberOfPages();
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
return pages;
|
||||
}
|
||||
//生成文件名
|
||||
private String exportFlieName(ExportTaskDetailsVo dto) throws ParseException {
|
||||
SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd");
|
||||
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyyMMdd");
|
||||
Date date = originalFormat.parse(dto.getDischargeDateTime());
|
||||
String formattedDate = targetFormat.format(date);
|
||||
return flieName + "_" + dto.getInpNo() + "_" + formattedDate;
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package com.emr.util;
|
||||
|
||||
/**
|
||||
* @InterfaceName FieldSelector
|
||||
* @Description
|
||||
* @Author linjj
|
||||
* @Date 2023/6/29 16:41
|
||||
* @Version 1.0
|
||||
*/
|
||||
public interface FieldSelector<Type, FieldType> {
|
||||
FieldType select(Type type);
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
package com.emr.util;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class ListPropertySetter<T> {
|
||||
|
||||
private final List<T> values;
|
||||
|
||||
public ListPropertySetter(List<T> values) {
|
||||
this.values = values;
|
||||
}
|
||||
|
||||
public List<T> cycleSetProperties(PropertySetter<T> setter) {
|
||||
|
||||
if (null == values) return values;
|
||||
|
||||
for (T value : values) {
|
||||
setter.apply(value);
|
||||
}
|
||||
return values;
|
||||
}
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package com.emr.util;
|
||||
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public final class ListUtil {
|
||||
public static <T, K> Map<K, T> toMap(List<T> list, FieldSelector<T, K> selector) {
|
||||
if (CollectionUtils.isEmpty(list)) return Collections.emptyMap();
|
||||
Map<K, T> map = new HashMap<>(list.size());
|
||||
for (T t : list) {
|
||||
K key = selector.select(t);
|
||||
if (key != null) map.put(key, t);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
public static <T, K> Map<K, List<T>> groupBy(List<T> list, FieldSelector<T, K> selector) {
|
||||
if (CollectionUtils.isEmpty(list)) return Collections.emptyMap();
|
||||
Map<K, List<T>> map = new HashMap<>();
|
||||
for (T t : list) {
|
||||
K key = selector.select(t);
|
||||
if (key == null) continue;
|
||||
if (!map.containsKey(key)) {
|
||||
map.put(key, new ArrayList<T>());
|
||||
}
|
||||
map.get(key).add(t);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
public static <T, K> List<K> select(List<T> list, FieldSelector<T, K> selector) {
|
||||
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
|
||||
List<K> filedList = new ArrayList<>(list.size());
|
||||
for (T t : list) {
|
||||
K key = selector.select(t);
|
||||
if (key != null) filedList.add(key);
|
||||
}
|
||||
return filedList;
|
||||
}
|
||||
|
||||
public static <T, K> List<K> distinctSelect(List<T> list, FieldSelector<T, K> selector) {
|
||||
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
|
||||
Set<K> filedSet = new HashSet<>();
|
||||
for (T t : list) {
|
||||
K key = selector.select(t);
|
||||
if (key != null) filedSet.add(key);
|
||||
}
|
||||
return new ArrayList<>(filedSet);
|
||||
}
|
||||
|
||||
@SafeVarargs
|
||||
public static <T> List<T> unionWithoutDuplicate(List<T>... values) {
|
||||
if (null == values || values.length <= 0) return Collections.emptyList();
|
||||
Set<T> unionFiledSet = new HashSet<>();
|
||||
for (List<T> value : values) {
|
||||
if (!CollectionUtils.isEmpty(value)) {
|
||||
unionFiledSet.addAll(value);
|
||||
}
|
||||
}
|
||||
return new ArrayList<>(unionFiledSet);
|
||||
}
|
||||
|
||||
public static <T, K> List<T> skipDuplicateKey(List<T> list, FieldSelector<T, K> selector) {
|
||||
if (CollectionUtils.isEmpty(list)) return Collections.emptyList();
|
||||
List<T> filedList = new ArrayList<>(list.size());
|
||||
Map<K, T> map = toMap(list, selector);
|
||||
for (K key : map.keySet()) {
|
||||
filedList.add(map.get(key));
|
||||
}
|
||||
return filedList;
|
||||
}
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package com.emr.util;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
|
||||
public class Logger {
|
||||
|
||||
@Value("${export_pdf_path}")
|
||||
private String exportPdfPath;
|
||||
|
||||
public void log(String info) {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat ("yyyy-MM-dd");
|
||||
String format = dateFormat.format (new Date());
|
||||
File file = new File (exportPdfPath+format);
|
||||
if(!file.isDirectory ()){
|
||||
file.mkdirs ();
|
||||
}
|
||||
OutputStream out = null;
|
||||
try {
|
||||
out = getOutputStream(file.getAbsolutePath ()+"\\log.log");
|
||||
out.write(info.getBytes("utf-8"));
|
||||
out.write("\r\n".getBytes());
|
||||
out.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public OutputStream getOutputStream(String localpath) throws IOException {
|
||||
File file = new File(localpath);
|
||||
if (!file.exists()) {
|
||||
file.createNewFile();
|
||||
return new FileOutputStream(file);
|
||||
} else {
|
||||
return new FileOutputStream(file, true);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package com.emr.util;
|
||||
|
||||
public interface PropertySetter<T> {
|
||||
|
||||
void apply(T t);
|
||||
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package com.emr.util;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Setters<T> {
|
||||
|
||||
public static <T> Setters<T> instance() {
|
||||
return new Setters<>();
|
||||
}
|
||||
|
||||
public ListPropertySetter<T> list(List<T> values) {
|
||||
return new ListPropertySetter<>(values);
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.emr.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @ClassName ExportPdfVo
|
||||
* @Description 导出pdf返回
|
||||
* @Author linjj
|
||||
* @Date 2024/4/11 8:47
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
public class ExportPdfVo {
|
||||
|
||||
private String pdfPath;
|
||||
private String assortID;
|
||||
private String assortSort;
|
||||
private String assortName;
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package com.emr.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @ClassName ExportTaskDetailsVo
|
||||
* @Description 导出任务详情
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 14:01
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
public class ExportTaskDetailsVo {
|
||||
|
||||
private int id;
|
||||
//任务id
|
||||
private int taskId;
|
||||
//住院号
|
||||
private String inpNo;
|
||||
|
||||
//出院日期
|
||||
private String dischargeDateTime;
|
||||
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package com.emr.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @ClassName ExportTaskVo
|
||||
* @Description 导出任务主表
|
||||
* @Author linjj
|
||||
* @Date 2024/4/12 11:37
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
public class ExportTaskVo {
|
||||
//批次id
|
||||
private int id;
|
||||
//开始时间
|
||||
private String startTime;
|
||||
//结束时间
|
||||
private String endTime;
|
||||
//0未开始1正在下载2下载完成
|
||||
private int taskState;
|
||||
//完成数量
|
||||
private int completeNum;
|
||||
//需求数量
|
||||
private int needNum;
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package com.emr.vo;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* @ClassName ExportZdAssortVo
|
||||
* @Description 导出分段详情
|
||||
* @Author linjj
|
||||
* @Date 2024/4/10 16:52
|
||||
* @Version 1.0
|
||||
*/
|
||||
@Data
|
||||
public class ExportZdAssortVo {
|
||||
|
||||
private String assortId;
|
||||
private String assortName;
|
||||
private String assortSort;
|
||||
private String exportFlag;
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
<?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.emr.dao.BatchExportMapper">
|
||||
|
||||
|
||||
<select id="selectAll" resultType="com.emr.vo.ExportTaskVo">
|
||||
select * from Export_Task
|
||||
<where>1=1
|
||||
<if test="taskState != null">
|
||||
taskState=#{taskState}
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
</mapper>
|
@ -0,0 +1,21 @@
|
||||
<?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.emr.dao.ExportTaskDetailsMapper">
|
||||
<update id="upStatc">
|
||||
update Export_Task_Details set state=#{state} where id=#{id}
|
||||
</update>
|
||||
|
||||
<select id="selectAllByTaskId" resultType="com.emr.vo.ExportTaskDetailsVo">
|
||||
SELECT id,
|
||||
taskId,
|
||||
inpNo,
|
||||
CONVERT(VARCHAR (100), dischargeDateTime, 23) as dischargeDateTime
|
||||
FROM Export_Task_Details
|
||||
WHERE taskId = #{taskId}
|
||||
AND state = 0
|
||||
</select>
|
||||
<select id="getMasterId" resultType="java.lang.String">
|
||||
select id from Archive_Master where inp_no=#{inpNo} AND CONVERT(VARCHAR (100), discharge_date_time, 23) = #{dischargeDateTime}
|
||||
</select>
|
||||
|
||||
</mapper>
|
@ -0,0 +1,22 @@
|
||||
<?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.emr.dao.ExportZdAssortMapper">
|
||||
|
||||
<select id="getPdfPath" resultType="com.emr.vo.ExportPdfVo">
|
||||
SELECT
|
||||
a.PDF_PATH,
|
||||
a.AssortID ,
|
||||
e.assort_sort,
|
||||
e.gj_assort_name as assortName
|
||||
FROM
|
||||
export_zd_assort e
|
||||
INNER JOIN Archive_Detail a ON a.AssortID= e.assort_id
|
||||
WHERE
|
||||
a.MasterID= #{masterID}
|
||||
AND e.export_flag='1'
|
||||
ORDER BY e.assort_sort
|
||||
</select>
|
||||
<select id="selectAll" resultType="com.emr.vo.ExportZdAssortVo">
|
||||
select * from export_zd_assort where export_flag='1'
|
||||
</select>
|
||||
</mapper>
|
Loading…
Reference in New Issue