基本信息集映射处理及相关逻辑提交

This commit is contained in:
huzhengkao 2025-06-03 16:04:50 +08:00
parent 2857b0c4d7
commit 45f372cec8
28 changed files with 326 additions and 569 deletions

16
HELP.md
View File

@ -1,16 +0,0 @@
# Getting Started
### Reference Documentation
For further reference, please consider the following sections:
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/maven-plugin/)
* [Spring Web](https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/htmlsingle/#boot-features-developing-web-applications)
### Guides
The following guides illustrate how to use some features concretely:
* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)

BIN
d2d.pfx

Binary file not shown.

310
mvnw vendored
View File

@ -1,310 +0,0 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

Binary file not shown.

View File

@ -100,6 +100,12 @@
<artifactId>spring-boot-starter-data-jpa</artifactId> <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> </dependency>
<!--Jackson XML-->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
</dependencies> </dependencies>
<build> <build>

View File

@ -2,10 +2,11 @@ package com.alihealth.d2d.provtest.controller;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo; import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo;
import com.alihealth.d2d.provtest.domain.DomesticProducer; import com.alihealth.d2d.provtest.domain.ReceiveDataLog;
import com.alihealth.d2d.provtest.entity.VTTSBasic; import com.alihealth.d2d.provtest.entity.VTTSBasic;
import com.alihealth.d2d.provtest.enums.BuzStatusEnum; import com.alihealth.d2d.provtest.enums.BuzStatusEnum;
import com.alihealth.d2d.provtest.service.IDomesticPharmaBaseInfoService; import com.alihealth.d2d.provtest.service.IDomesticPharmaBaseInfoService;
import com.alihealth.d2d.provtest.service.IReceiveDataLogService;
import com.alihealth.d2d.provtest.service.XmlParserService; import com.alihealth.d2d.provtest.service.XmlParserService;
import com.alihealth.d2d.provtest.utils.*; import com.alihealth.d2d.provtest.utils.*;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -58,6 +59,9 @@ public class ProvTestServerController {
@Autowired @Autowired
private XmlParserService xmlParserService; private XmlParserService xmlParserService;
@Autowired
private IReceiveDataLogService receiveDataLogService;
@RequestMapping("/receive") @RequestMapping("/receive")
public @ResponseBody public @ResponseBody
Map<String,Object> receive(HttpServletRequest request) throws IOException { Map<String,Object> receive(HttpServletRequest request) throws IOException {
@ -96,20 +100,41 @@ public class ProvTestServerController {
String xml = StreamUtil.getUnStreamContent(de); String xml = StreamUtil.getUnStreamContent(de);
logger.info("解密之后的文件内容:{}", xml); logger.info("解密之后的文件内容:{}", xml);
//保存数据日志
ReceiveDataLog log=new ReceiveDataLog();
log.setEventId(eventId);
log.setProcessId(processId);
log.setEventType(eventType);
log.setSubType(eventPojo.getSubType());
log.setData(eventPojo.getData());
log.setVer(ver);
receiveDataLogService.save(log);
//解析xml //解析xml
// List<DomesticPharmaBaseInfo> list= XmlStringParser.parseVaccineManufacturers(xml,eventPojo.getSubType()); // List<DomesticPharmaBaseInfo> list= XmlStringParser.parseVaccineManufacturers(xml,eventPojo.getSubType());
//解析并保存数据 //解析并保存数据
XmlStringParser.parseXml(xml, "1011", data -> { // XmlStringParser.parseXml(xml, "1011", data -> {
domesticPharmaBaseInfoService.save((DomesticPharmaBaseInfo) data); // domesticPharmaBaseInfoService.save((DomesticPharmaBaseInfo) data);
}); // });
// List<DomesticProducer> producers = xmlParserService.parseMultiDataXml( // List<DomesticPharmaBaseInfo> producers = xmlParserService.parseXml1(
// xml, // xml,
// DomesticProducer.class // DomesticPharmaBaseInfo.class
// ); // );
VTTSBasic<DomesticPharmaBaseInfo> result = xmlParserService.parseDataXml(
logger.info("解析后的数据条数:{}", ""); xml,
DomesticPharmaBaseInfo.class
);
List<DomesticPharmaBaseInfo> list = result.getDataset();
if(list!=null && !list.isEmpty()){
list.stream()
.forEach(item -> {
item.setEventId(eventId);
});
domesticPharmaBaseInfoService.saveBatch(list);
}
logger.info("入库的数据条数:{}", list.size());
return ResponseBuilder.success(); return ResponseBuilder.success();
}catch (Exception e){ }catch (Exception e){

View File

@ -1,69 +1,134 @@
package com.alihealth.d2d.provtest.domain; package com.alihealth.d2d.provtest.domain;
import com.baomidou.mybatisplus.annotation.IdType; import com.alihealth.d2d.provtest.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import javax.persistence.Column;
import java.time.LocalDate; import javax.xml.bind.annotation.*;
import java.util.Date;
/** /**
* @author Jason 境内药品生产企业基本信息实体 * @author Jason
* @date 2025年05月29日 10:28:21 * @date 2025年05月30日 09:59:21
*/ */
@Data @Data
@TableName("domestic_pharma_base_info") @TableName("domestic_pharma_base_info")
public class DomesticPharmaBaseInfo implements Serializable { @JacksonXmlRootElement(localName = "data")
private static final long serialVersionUID = 1L; public class DomesticPharmaBaseInfo extends BaseEntity<DomesticPharmaBaseInfo>{
@Column(name = "tyshxydm", unique = true)
@JacksonXmlProperty(localName = "TYSHXYDM")
private String tyshxydm;
/** @Column(name = "jnypscqymc")
* 主键id @JacksonXmlProperty(localName = "JNYPSCQYMC")
*/ private String jnypscqymc;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
// 企业基础信息 @Column(name = "jnypscqylx")
private String tyshxydm; // 统一社会信用代码 @JacksonXmlProperty(localName = "JNYPSCQYLX")
private String jnypscqymc; // 疫苗生产企业名称 private String jnypscqylx;
private String jnypscqylx; // 企业类型
// 注册地址信息 @Column(name = "zsdz")
private String zsdz; // 注册地址 @JacksonXmlProperty(localName = "ZSDZ")
private String zsdz;
@Column(name = "zsdzgjhdq")
@JacksonXmlProperty(localName = "ZSDZGJHDQ")
private String zsdzgjhdq; // 注册地址国家/地区代码 private String zsdzgjhdq; // 注册地址国家/地区代码
@Column(name = "zsdzszxszzq")
@JacksonXmlProperty(localName = "ZSDZSZXSZZQ")
private String zsdzszxszzq; // 注册地址所在行政区 private String zsdzszxszzq; // 注册地址所在行政区
@Column(name = "zsdzsqzzzm")
@JacksonXmlProperty(localName = "ZSDZSQZZZM")
private String zsdzsqzzzm; // 注册地址社区// private String zsdzsqzzzm; // 注册地址社区//
@Column(name = "zsdzxzzxxjs")
@JacksonXmlProperty(localName = "ZSDZXZZXXJS")
private String zsdzxzzxxjs; // 注册地址乡镇/街道 private String zsdzxzzxxjs; // 注册地址乡镇/街道
@Column(name = "zsdzxzjdbsc")
@JacksonXmlProperty(localName = "ZSDZXZJDBSC")
private String zsdzxzjdbsc; // 注册地址详细街道办/社区 private String zsdzxzjdbsc; // 注册地址详细街道办/社区
@Column(name = "zsdzcjlld")
@JacksonXmlProperty(localName = "ZSDZCJLLD")
private String zsdzcjlld; // 注册地址村居//楼栋 private String zsdzcjlld; // 注册地址村居//楼栋
@Column(name = "zsdzmphm")
@JacksonXmlProperty(localName = "ZSDZMPHM")
private String zsdzmphm; // 注册地址门牌号码 private String zsdzmphm; // 注册地址门牌号码
// 企业负责人信息 // 企业负责人信息
@Column(name = "fddbr")
@JacksonXmlProperty(localName = "FDDBR")
private String fddbr; // 法定代表人 private String fddbr; // 法定代表人
@Column(name = "zczb")
@JacksonXmlProperty(localName = "ZCZB")
private String zczb; // 注册资本(万元) private String zczb; // 注册资本(万元)
// 日期信息 // 日期信息
private LocalDate clrq; // 成立日期 @Column(name = "clrq")
@JacksonXmlProperty(localName = "CLRQ")
private String clrq; // 成立日期
@Column(name = "yyqx")
@JacksonXmlProperty(localName = "YYQX")
private String yyqx; // 营业期限 private String yyqx; // 营业期限
// 经营信息 // 经营信息
@Column(name = "jyfw")
@JacksonXmlProperty(localName = "JYFW")
private String jyfw; // 经营范围 private String jyfw; // 经营范围
@Column(name = "djjg")
@JacksonXmlProperty(localName = "DJJG")
private String djjg; // 登记机关 private String djjg; // 登记机关
// 联系方式 // 联系方式
@Column(name = "gddhhm")
@JacksonXmlProperty(localName = "GDDHHM")
private String gddhhm; // 固定电话号码 private String gddhhm; // 固定电话号码
@Column(name = "czhm")
@JacksonXmlProperty(localName = "CZHM")
private String czhm; // 传真号码 private String czhm; // 传真号码
@Column(name = "dzxx")
@JacksonXmlProperty(localName = "DZXX")
private String dzxx; // 电子信箱 private String dzxx; // 电子信箱
@Column(name = "qywz")
@JacksonXmlProperty(localName = "QYWZ")
private String qywz; // 企业网址 private String qywz; // 企业网址
@Column(name = "lxr")
@JacksonXmlProperty(localName = "LXR")
private String lxr; // 联系人 private String lxr; // 联系人
@Column(name = "lxdh")
@JacksonXmlProperty(localName = "LXDH")
private String lxdh; // 联系电话 private String lxdh; // 联系电话
// 地理坐标 // 地理坐标
@Column(name = "zsgps")
@JacksonXmlProperty(localName = "ZSGPS")
private String zsgps; // GPS坐标(经度,纬度) private String zsgps; // GPS坐标(经度,纬度)
// 系统字段
private Date createTime; // 创建时间
private Date updateTime; // 更新时间 @Override
private Integer isDeleted; // 是否删除(0- 1-) public Class<DomesticPharmaBaseInfo> getEntityClass() {
return DomesticPharmaBaseInfo.class;
}
@Override
public String getDatasetName() {
return "境内药品生产企业基本信息数据子集";
}
} }

View File

@ -1,138 +0,0 @@
package com.alihealth.d2d.provtest.domain;
import com.alihealth.d2d.provtest.entity.BaseEntity;
import com.alihealth.d2d.provtest.entity.XmlEntity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.xml.bind.annotation.*;
import java.time.LocalDate;
/**
* @author Jason
* @date 2025年05月30日 09:59:21
*/
@Data
@TableName("domestic_pharma_base_info")
@XmlRootElement(name = "data")
@XmlAccessorType(XmlAccessType.FIELD) // 明确指定字段访问
public class DomesticProducer extends BaseEntity<DomesticProducer>{
@Column(name = "tyshxydm", unique = true)
@XmlElement(name = "TYSHXYDM")
private String tyshxydm;
@Column(name = "jnypscqymc")
@XmlElement(name = "JNYPSCQYMC")
private String jnypscqymc;
@Column(name = "jnypscqylx")
@XmlElement(name = "JNYPSCQYLX")
private String jnypscqylx;
@Column(name = "zsdz")
@XmlElement(name = "ZSDZ")
private String zsdz;
@Column(name = "zsdzgjhdq")
@XmlElement(name = "ZSDZGJHDQ")
private String zsdzgjhdq; // 注册地址国家/地区代码
@Column(name = "zsdzszxszzq")
@XmlElement(name = "ZSDZSZXSZZQ")
private String zsdzszxszzq; // 注册地址所在行政区
@Column(name = "zsdzsqzzzm")
@XmlElement(name = "ZSDZSQZZZM")
private String zsdzsqzzzm; // 注册地址社区//
@Column(name = "zsdzxzzxxjs")
@XmlElement(name = "ZSDZXZZXXJS")
private String zsdzxzzxxjs; // 注册地址乡镇/街道
@Column(name = "zsdzxzjdbsc")
@XmlElement(name = "ZSDZXZJDBSC")
private String zsdzxzjdbsc; // 注册地址详细街道办/社区
@Column(name = "zsdzcjlld")
@XmlElement(name = "ZSDZCJLLD")
private String zsdzcjlld; // 注册地址村居//楼栋
@Column(name = "zsdzmphm")
@XmlElement(name = "ZSDZMPHM")
private String zsdzmphm; // 注册地址门牌号码
// 企业负责人信息
@Column(name = "fddbr")
@XmlElement(name = "FDDBR")
private String fddbr; // 法定代表人
@Column(name = "zczb")
@XmlElement(name = "ZCZB")
private String zczb; // 注册资本(万元)
// 日期信息
@Column(name = "clrq")
@XmlElement(name = "CLRQ")
private LocalDate clrq; // 成立日期
@Column(name = "yyqx")
@XmlElement(name = "YYQX")
private String yyqx; // 营业期限
// 经营信息
@Column(name = "jyfw")
@XmlElement(name = "JYFW")
private String jyfw; // 经营范围
@Column(name = "djjg")
@XmlElement(name = "DJJG")
private String djjg; // 登记机关
// 联系方式
@Column(name = "gddhhm")
@XmlElement(name = "GDDHHM")
private String gddhhm; // 固定电话号码
@Column(name = "czhm")
@XmlElement(name = "CZHM")
private String czhm; // 传真号码
@Column(name = "dzxx")
@XmlElement(name = "DZXX")
private String dzxx; // 电子信箱
@Column(name = "qywz")
@XmlElement(name = "QYWZ")
private String qywz; // 企业网址
@Column(name = "lxr")
@XmlElement(name = "LXR")
private String lxr; // 联系人
@Column(name = "lxdh")
@XmlElement(name = "LXDH")
private String lxdh; // 联系电话
// 地理坐标
@Column(name = "zsgps")
@XmlElement(name = "ZSGPS")
private String zsgps; // GPS坐标(经度,纬度)
@Override
public Class<DomesticProducer> getEntityClass() {
return DomesticProducer.class;
}
@Override
public String getDatasetName() {
return "境内药品生产企业基本信息数据子集1111";
}
}

View File

@ -0,0 +1,57 @@
package com.alihealth.d2d.provtest.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import lombok.Data;
import javax.persistence.Column;
import java.util.Date;
/**
* @author Jason 接收数据日志
* @date 2025年06月03日 15:28:25
*/
@Data
@TableName("receive_data_log")
public class ReceiveDataLog {
@Column(name = "event_id", unique = true)
private String eventId;
@Column(name = "process_id")
private String processId;
@Column(name = "event_type")
private String eventType;
@Column(name = "sub_type")
private String subType;
@Column(name = "data")
private String data;
@Column(name = "ver")
private String ver;
@Column(name = "create_time")
private Date createTime;
@Column(name = "update_time")
private Date updateTime;
@Column(name = "is_deleted")
private Date isDeleted;
}

View File

@ -1,5 +1,6 @@
package com.alihealth.d2d.provtest.entity; package com.alihealth.d2d.provtest.entity;
import lombok.Data;
import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Id;
import javax.persistence.*; import javax.persistence.*;
@ -12,6 +13,7 @@ import java.time.LocalDateTime;
*/ */
@MappedSuperclass @MappedSuperclass
@XmlTransient @XmlTransient
@Data
public abstract class BaseEntity<T extends BaseEntity<T>> implements XmlEntity<T>{ public abstract class BaseEntity<T extends BaseEntity<T>> implements XmlEntity<T>{
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@ -1,30 +1,43 @@
package com.alihealth.d2d.provtest.entity; package com.alihealth.d2d.provtest.entity;
import com.alihealth.d2d.provtest.domain.DomesticProducer; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import lombok.Data; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import javax.xml.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* @author Jason * @author Jason 基本信息集公共类
* @date 2025年05月30日 11:45:00 * @date 2025年05月30日 11:45:00
*/ */
@XmlRootElement(name = "VTTSBasic") @JacksonXmlRootElement(localName = "VTTSBasic")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@XmlSeeAlso({DomesticProducer.class})
public class VTTSBasic<T> { public class VTTSBasic<T> {
@XmlElement(name = "datasetName") @JacksonXmlProperty(localName = "datasetName")
private String datasetName; private String datasetName;
@XmlElementWrapper(name = "dataset") @JacksonXmlElementWrapper(localName = "dataset")
//@XmlElements(@XmlElement(name = "data")) @JacksonXmlProperty(localName = "data")
@XmlElement(name = "data") private List<T> dataset=new ArrayList<>(); // 必须初始化集合
// private List<T> dataset; // 必须初始化集合
private List<DomesticProducer> dataset;
// 确保有无参构造器 // 确保有无参构造器
public VTTSBasic() {} public VTTSBasic() {}
public String getDatasetName() {
return datasetName;
}
public void setDatasetName(String datasetName) {
this.datasetName = datasetName;
}
public List<T> getDataset() {
return dataset;
}
public void setDataset(List<T> dataset) {
this.dataset = dataset;
}
} }

View File

@ -1,7 +1,6 @@
package com.alihealth.d2d.provtest.factory; package com.alihealth.d2d.provtest.factory;
import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo; import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo;
import com.alihealth.d2d.provtest.utils.XmlStringParser;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.w3c.dom.Node; import org.w3c.dom.Node;
@ -35,34 +34,34 @@ public class DomesticPharmaBaseInfoFactory implements EntityFactory {
return; return;
} }
DomesticPharmaBaseInfo baseInfo = (DomesticPharmaBaseInfo) entity; // DomesticPharmaBaseInfo baseInfo = (DomesticPharmaBaseInfo) entity;
baseInfo.setTyshxydm(getElementText(dataElement, "TYSHXYDM")); // baseInfo.setTyshxydm(getElementText(dataElement, "TYSHXYDM"));
baseInfo.setJnypscqymc(getElementText(dataElement, "JNYPSCQYMC")); // baseInfo.setJnypscqymc(getElementText(dataElement, "JNYPSCQYMC"));
baseInfo.setJnypscqylx(getElementText(dataElement, "JNYPSCQYLX")); // baseInfo.setJnypscqylx(getElementText(dataElement, "JNYPSCQYLX"));
baseInfo.setZsdz(getElementText(dataElement, "ZSDZ")); // baseInfo.setZsdz(getElementText(dataElement, "ZSDZ"));
baseInfo.setZsdzgjhdq(getElementText(dataElement, "ZSDZGJHDQ")); // baseInfo.setZsdzgjhdq(getElementText(dataElement, "ZSDZGJHDQ"));
baseInfo.setZsdzszxszzq(getElementText(dataElement, "ZSDZSZXSZZQ")); // baseInfo.setZsdzszxszzq(getElementText(dataElement, "ZSDZSZXSZZQ"));
baseInfo.setJnypscqylx(getElementText(dataElement, "JNYPSCQYLX")); // baseInfo.setJnypscqylx(getElementText(dataElement, "JNYPSCQYLX"));
baseInfo.setZsdzsqzzzm(getElementText(dataElement, "ZSDZSQZZZM")); // baseInfo.setZsdzsqzzzm(getElementText(dataElement, "ZSDZSQZZZM"));
baseInfo.setZsdzxzzxxjs(getElementText(dataElement, "ZSDZXZZXXJS")); // baseInfo.setZsdzxzzxxjs(getElementText(dataElement, "ZSDZXZZXXJS"));
baseInfo.setZsdzxzjdbsc(getElementText(dataElement, "ZSDZXZJDBSC")); // baseInfo.setZsdzxzjdbsc(getElementText(dataElement, "ZSDZXZJDBSC"));
//
baseInfo.setZsdzcjlld(getElementText(dataElement, "ZSDZCJLLD")); // baseInfo.setZsdzcjlld(getElementText(dataElement, "ZSDZCJLLD"));
baseInfo.setZsdzmphm(getElementText(dataElement, "ZSDZMPHM")); // baseInfo.setZsdzmphm(getElementText(dataElement, "ZSDZMPHM"));
baseInfo.setFddbr(getElementText(dataElement, "FDDBR")); // baseInfo.setFddbr(getElementText(dataElement, "FDDBR"));
baseInfo.setZczb(getElementText(dataElement, "ZCZB")); // baseInfo.setZczb(getElementText(dataElement, "ZCZB"));
baseInfo.setClrq(parseDate(getElementText(dataElement, "CLRQ"))); // baseInfo.setClrq(parseDate(getElementText(dataElement, "CLRQ")));
baseInfo.setYyqx(getElementText(dataElement, "YYQX")); // baseInfo.setYyqx(getElementText(dataElement, "YYQX"));
baseInfo.setJyfw(getElementText(dataElement, "JYFW")); // baseInfo.setJyfw(getElementText(dataElement, "JYFW"));
baseInfo.setDjjg(getElementText(dataElement, "DJJG")); // baseInfo.setDjjg(getElementText(dataElement, "DJJG"));
baseInfo.setGddhhm(getElementText(dataElement, "GDDHHM")); // baseInfo.setGddhhm(getElementText(dataElement, "GDDHHM"));
baseInfo.setCzhm(getElementText(dataElement, "CZHM")); // baseInfo.setCzhm(getElementText(dataElement, "CZHM"));
baseInfo.setDzxx(getElementText(dataElement, "DZXX")); // baseInfo.setDzxx(getElementText(dataElement, "DZXX"));
baseInfo.setQywz(getElementText(dataElement, "QYWZ")); // baseInfo.setQywz(getElementText(dataElement, "QYWZ"));
baseInfo.setLxr(getElementText(dataElement, "LXR")); // baseInfo.setLxr(getElementText(dataElement, "LXR"));
//
baseInfo.setLxdh(getElementText(dataElement, "LXDH")); // baseInfo.setLxdh(getElementText(dataElement, "LXDH"));
baseInfo.setZsgps(getElementText(dataElement, "ZSGPS")); // baseInfo.setZsgps(getElementText(dataElement, "ZSGPS"));
} }

View File

@ -0,0 +1,11 @@
package com.alihealth.d2d.provtest.mapper;
import com.alihealth.d2d.provtest.domain.ReceiveDataLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Jason
* @date 2025年06月03日 15:35:00
*/
public interface ReceiveDataLogMapper extends BaseMapper<ReceiveDataLog> {
}

View File

@ -0,0 +1,7 @@
package com.alihealth.d2d.provtest.service;
import com.alihealth.d2d.provtest.domain.ReceiveDataLog;
import com.baomidou.mybatisplus.extension.service.IService;
public interface IReceiveDataLogService extends IService<ReceiveDataLog> {
}

View File

@ -1,21 +1,18 @@
package com.alihealth.d2d.provtest.service; package com.alihealth.d2d.provtest.service;
import com.alihealth.d2d.provtest.domain.DomesticProducer; import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo;
import com.alihealth.d2d.provtest.entity.VTTSBasic; import com.alihealth.d2d.provtest.entity.VTTSBasic;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.XMLConstants;
import javax.xml.bind.*; import javax.xml.bind.*;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.stream.StreamSource; import javax.xml.transform.stream.StreamSource;
import java.io.IOException;
import java.io.StringReader; import java.io.StringReader;
import java.io.StringWriter; import java.io.StringWriter;
import java.lang.reflect.Field;
import java.util.*; import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -29,13 +26,32 @@ public class XmlParserService {
private static final Map<Class<?>, JAXBContext> CONTEXT_CACHE = new ConcurrentHashMap<>(); private static final Map<Class<?>, JAXBContext> CONTEXT_CACHE = new ConcurrentHashMap<>();
private static final XmlMapper xmlMapper = new XmlMapper();
/**
* 使用Jackson XML 解析xml
* @param xml
* @param dataType
* @return
* @param <T>
* @throws IOException
*/
public static <T> VTTSBasic<T> parseDataXml(String xml, Class<T> dataType) throws IOException {
JavaType type = xmlMapper.getTypeFactory().constructParametricType(
VTTSBasic.class,
dataType
);
return xmlMapper.readValue(xml, type);
}
/** /**
* 解析包含多个data节点的XML * 解析包含多个data节点的XML
* @param xml 完整XML内容 * @param xml 完整XML内容
* @param dataClass 内部data节点对应的实体类 * @param dataClass 内部data节点对应的实体类
*/ */
public <T> List<DomesticProducer> parseMultiDataXml( public <T> List<DomesticPharmaBaseInfo> parseMultiDataXml(
String xml, String xml,
Class<T> dataClass) throws Exception { Class<T> dataClass) throws Exception {
@ -57,30 +73,13 @@ public class XmlParserService {
// 4. 解析XML // 4. 解析XML
try (StringReader reader = new StringReader(xml)) { try (StringReader reader = new StringReader(xml)) {
// XMLStreamReader xsr = xif.createXMLStreamReader(reader);
// JAXBElement<VTTSBasic> root = unmarshaller.unmarshal(xsr, VTTSBasic.class);
//
// // 5. 获取解析结果
// VTTSBasic<T> wrapper = root.getValue();
// List<T> result = wrapper.getDataset();
//
// // 6. 类型安全检查
// if (!result.isEmpty() && !dataClass.isInstance(result.get(0))) {
// throw new ClassCastException("XML中包含类型不匹配的数据");
// }
//
// return result;
// 创建 JAXBContext 时包含所有相关类
// JAXBContext jc = JAXBContext.newInstance(VTTSBasic.class, Data.class);
//Unmarshaller unmarshaller = jc.createUnmarshaller();
// 解析 XML // 解析 XML
XMLStreamReader xsr = xif.createXMLStreamReader(reader); XMLStreamReader xsr = xif.createXMLStreamReader(reader);
JAXBElement<VTTSBasic> root = unmarshaller.unmarshal(xsr, VTTSBasic.class); JAXBElement<VTTSBasic> root = unmarshaller.unmarshal(xsr, VTTSBasic.class);
// 获取解析结果 // 获取解析结果
VTTSBasic wrapper = root.getValue(); VTTSBasic wrapper = root.getValue();
List<DomesticProducer> result = wrapper.getDataset(); List<DomesticPharmaBaseInfo> result = wrapper.getDataset();
return result; return result;
} }
@ -100,6 +99,21 @@ public class XmlParserService {
return element.getValue(); return element.getValue();
} }
public static <T> VTTSBasic<T> parse(String xml, Class<T> dataType) throws Exception {
// 创建包含具体类型的JAXBContext
JAXBContext context = JAXBContext.newInstance(
VTTSBasic.class,
dataType
);
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader reader = new StringReader(xml);
@SuppressWarnings("unchecked")
VTTSBasic<T> result = (VTTSBasic<T>) unmarshaller.unmarshal(reader);
return result;
}
public static <T> String toXml(VTTSBasic<T> vttsBasic, Class<T> dataType) throws Exception { public static <T> String toXml(VTTSBasic<T> vttsBasic, Class<T> dataType) throws Exception {
JAXBContext context = getOrCreateContext(VTTSBasic.class, dataType); JAXBContext context = getOrCreateContext(VTTSBasic.class, dataType);

View File

@ -0,0 +1,15 @@
package com.alihealth.d2d.provtest.service.impl;
import com.alihealth.d2d.provtest.domain.ReceiveDataLog;
import com.alihealth.d2d.provtest.mapper.ReceiveDataLogMapper;
import com.alihealth.d2d.provtest.service.IReceiveDataLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author Jason
* @date 2025年06月03日 15:37:17
*/
@Service
public class ReceiveDataLogServiceImpl extends ServiceImpl<ReceiveDataLogMapper, ReceiveDataLog> implements IReceiveDataLogService {
}

View File

@ -1,6 +1,5 @@
package com.alihealth.d2d.provtest.utils; package com.alihealth.d2d.provtest.utils;
import com.alihealth.d2d.provtest.domain.DomesticPharmaBaseInfo;
import com.alihealth.d2d.provtest.factory.EntityFactory; import com.alihealth.d2d.provtest.factory.EntityFactory;
import com.alihealth.d2d.provtest.factory.EntityFactoryManager; import com.alihealth.d2d.provtest.factory.EntityFactoryManager;
import org.slf4j.Logger; import org.slf4j.Logger;

View File

@ -0,0 +1,8 @@
<?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.alihealth.d2d.provtest.mapper.ReceiveDataLogMapper">
</mapper>

View File

@ -2,6 +2,7 @@ com\alihealth\d2d\provtest\entity\BaseEntity.class
com\alihealth\d2d\provtest\factory\EntityFactoryManager.class com\alihealth\d2d\provtest\factory\EntityFactoryManager.class
com\alihealth\d2d\provtest\utils\XmlStringParser.class com\alihealth\d2d\provtest\utils\XmlStringParser.class
com\alihealth\d2d\provtest\service\impl\DomesticPharmaBaseInfoServiceImpl.class com\alihealth\d2d\provtest\service\impl\DomesticPharmaBaseInfoServiceImpl.class
com\alihealth\d2d\provtest\domain\Test.class
com\alihealth\d2d\provtest\service\XmlParserService.class com\alihealth\d2d\provtest\service\XmlParserService.class
com\alihealth\d2d\provtest\mapper\DomesticPharmaBaseInfoMapper.class com\alihealth\d2d\provtest\mapper\DomesticPharmaBaseInfoMapper.class
com\alihealth\d2d\provtest\service\IDomesticPharmaBaseInfoService.class com\alihealth\d2d\provtest\service\IDomesticPharmaBaseInfoService.class
@ -20,7 +21,6 @@ com\alihealth\d2d\provtest\entity\XmlEntity.class
com\alihealth\d2d\provtest\utils\KeyStoreUtil.class com\alihealth\d2d\provtest\utils\KeyStoreUtil.class
com\alihealth\d2d\provtest\enums\BuzStatusEnum.class com\alihealth\d2d\provtest\enums\BuzStatusEnum.class
com\alihealth\d2d\provtest\enums\StatusEnum.class com\alihealth\d2d\provtest\enums\StatusEnum.class
com\alihealth\d2d\provtest\domain\DomesticProducer.class
com\alihealth\d2d\provtest\ProvtestApplication.class com\alihealth\d2d\provtest\ProvtestApplication.class
com\alihealth\d2d\provtest\entity\VTTSBasic.class com\alihealth\d2d\provtest\entity\VTTSBasic.class
com\alihealth\d2d\provtest\ProvTestClient.class com\alihealth\d2d\provtest\ProvTestClient.class

View File

@ -16,6 +16,7 @@ D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\EntityProce
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\service\XmlParserService.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\service\XmlParserService.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\KeyStoreUtil.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\KeyStoreUtil.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\service\IDomesticPharmaBaseInfoService.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\service\IDomesticPharmaBaseInfoService.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\domain\Test.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\Base64.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\Base64.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\ResponseBuilder.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\utils\ResponseBuilder.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\domain\DomesticPharmaBaseInfo.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\domain\DomesticPharmaBaseInfo.java
@ -23,4 +24,3 @@ D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\factory\EntityFac
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\entity\BaseEntity.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\entity\BaseEntity.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\factory\EntityFactory.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\factory\EntityFactory.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\entity\VTTSBasic.java D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\entity\VTTSBasic.java
D:\work-tcct\provtest\src\main\java\com\alihealth\d2d\provtest\domain\DomesticProducer.java