diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..549e00a2a96fa9d7c5dbc9859664a78d980158c2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 639900d13c6182e452e33a3bd638e70a0146c785..accd6296789966b9f3392c7a4dc3a987a7532182 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/out" />
   </component>
 </project>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index fa1044b809851ebaf420b45a5348192c9d7d1daa..0000000000000000000000000000000000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="ProjectModuleManager">
-    <modules>
-      <module fileurl="file://$PROJECT_DIR$/.idea/ai-chat-pilot.iml" filepath="$PROJECT_DIR$/.idea/ai-chat-pilot.iml" />
-    </modules>
-  </component>
-</project>
\ No newline at end of file
diff --git a/mvnw b/mvnw
new file mode 100644
index 0000000000000000000000000000000000000000..d7c358e5a2aaaec502839631b5876ce50e4846cd
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,259 @@
+#!/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.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Apache Maven Wrapper startup batch script, version 3.3.2
+#
+# Optional ENV vars
+# -----------------
+#   JAVA_HOME - location of a JDK home dir, required when download maven via java source
+#   MVNW_REPOURL - repo url base for downloading maven distribution
+#   MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
+#   MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
+# ----------------------------------------------------------------------------
+
+set -euf
+[ "${MVNW_VERBOSE-}" != debug ] || set -x
+
+# OS specific support.
+native_path() { printf %s\\n "$1"; }
+case "$(uname)" in
+CYGWIN* | MINGW*)
+  [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
+  native_path() { cygpath --path --windows "$1"; }
+  ;;
+esac
+
+# set JAVACMD and JAVACCMD
+set_java_home() {
+  # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
+  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"
+      JAVACCMD="$JAVA_HOME/jre/sh/javac"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+      JAVACCMD="$JAVA_HOME/bin/javac"
+
+      if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
+        echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
+        echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
+        return 1
+      fi
+    fi
+  else
+    JAVACMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v java
+    )" || :
+    JAVACCMD="$(
+      'set' +e
+      'unset' -f command 2>/dev/null
+      'command' -v javac
+    )" || :
+
+    if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
+      echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
+      return 1
+    fi
+  fi
+}
+
+# hash string like Java String::hashCode
+hash_string() {
+  str="${1:-}" h=0
+  while [ -n "$str" ]; do
+    char="${str%"${str#?}"}"
+    h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
+    str="${str#?}"
+  done
+  printf %x\\n $h
+}
+
+verbose() { :; }
+[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
+
+die() {
+  printf %s\\n "$1" >&2
+  exit 1
+}
+
+trim() {
+  # MWRAPPER-139:
+  #   Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds.
+  #   Needed for removing poorly interpreted newline sequences when running in more
+  #   exotic environments such as mingw bash on Windows.
+  printf "%s" "${1}" | tr -d '[:space:]'
+}
+
+# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
+while IFS="=" read -r key value; do
+  case "${key-}" in
+  distributionUrl) distributionUrl=$(trim "${value-}") ;;
+  distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;;
+  esac
+done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
+
+case "${distributionUrl##*/}" in
+maven-mvnd-*bin.*)
+  MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
+  case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
+  *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
+  :Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
+  :Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
+  :Linux*x86_64*) distributionPlatform=linux-amd64 ;;
+  *)
+    echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
+    distributionPlatform=linux-amd64
+    ;;
+  esac
+  distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
+  ;;
+maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
+*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
+esac
+
+# apply MVNW_REPOURL and calculate MAVEN_HOME
+# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
+[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
+distributionUrlName="${distributionUrl##*/}"
+distributionUrlNameMain="${distributionUrlName%.*}"
+distributionUrlNameMain="${distributionUrlNameMain%-bin}"
+MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}"
+MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
+
+exec_maven() {
+  unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
+  exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
+}
+
+if [ -d "$MAVEN_HOME" ]; then
+  verbose "found existing MAVEN_HOME at $MAVEN_HOME"
+  exec_maven "$@"
+fi
+
+case "${distributionUrl-}" in
+*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
+*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
+esac
+
+# prepare tmp dir
+if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
+  clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
+  trap clean HUP INT TERM EXIT
+else
+  die "cannot create temp dir"
+fi
+
+mkdir -p -- "${MAVEN_HOME%/*}"
+
+# Download and Install Apache Maven
+verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
+verbose "Downloading from: $distributionUrl"
+verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
+
+# select .zip or .tar.gz
+if ! command -v unzip >/dev/null; then
+  distributionUrl="${distributionUrl%.zip}.tar.gz"
+  distributionUrlName="${distributionUrl##*/}"
+fi
+
+# verbose opt
+__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
+[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
+
+# normalize http auth
+case "${MVNW_PASSWORD:+has-password}" in
+'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
+esac
+
+if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
+  verbose "Found wget ... using wget"
+  wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
+elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
+  verbose "Found curl ... using curl"
+  curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
+elif set_java_home; then
+  verbose "Falling back to use Java to download"
+  javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
+  targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
+  cat >"$javaSource" <<-END
+	public class Downloader extends java.net.Authenticator
+	{
+	  protected java.net.PasswordAuthentication getPasswordAuthentication()
+	  {
+	    return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
+	  }
+	  public static void main( String[] args ) throws Exception
+	  {
+	    setDefault( new Downloader() );
+	    java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
+	  }
+	}
+	END
+  # For Cygwin/MinGW, switch paths to Windows format before running javac and java
+  verbose " - Compiling Downloader.java ..."
+  "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
+  verbose " - Running Downloader.java ..."
+  "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
+fi
+
+# If specified, validate the SHA-256 sum of the Maven distribution zip file
+if [ -n "${distributionSha256Sum-}" ]; then
+  distributionSha256Result=false
+  if [ "$MVN_CMD" = mvnd.sh ]; then
+    echo "Checksum validation is not supported for maven-mvnd." >&2
+    echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  elif command -v sha256sum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  elif command -v shasum >/dev/null; then
+    if echo "$distributionSha256Sum  $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
+      distributionSha256Result=true
+    fi
+  else
+    echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
+    echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
+    exit 1
+  fi
+  if [ $distributionSha256Result = false ]; then
+    echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
+    echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
+    exit 1
+  fi
+fi
+
+# unzip and move
+if command -v unzip >/dev/null; then
+  unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
+else
+  tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
+fi
+printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
+mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
+
+clean || :
+exec_maven "$@"
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..53b403fb2f0124a088e46f7c68e8a5298de68a23
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.2.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <!-- Generated by https://start.springboot.io -->
+    <!-- 浼樿川鐨� spring/boot/data/security/cloud 妗嗘灦涓枃鏂囨。灏藉湪 => https://springdoc.cn -->
+    <groupId>com.luca</groupId>
+    <artifactId>pilot</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>pilot</name>
+    <description>pilot data clean</description>
+    <url/>
+    <licenses>
+        <license/>
+    </licenses>
+    <developers>
+        <developer/>
+    </developers>
+    <scm>
+        <connection/>
+        <developerConnection/>
+        <tag/>
+        <url/>
+    </scm>
+    <properties>
+        <java.version>11</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-mongodb</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.data</groupId>
+            <artifactId>spring-data-jpa</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.76</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/src/main/java/com/luca/pilot/PilotApplication.java b/src/main/java/com/luca/pilot/PilotApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..f511a0d74acb9aed36f271ba7f84ebee41fe3761
--- /dev/null
+++ b/src/main/java/com/luca/pilot/PilotApplication.java
@@ -0,0 +1,16 @@
+package com.luca.pilot;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+
+@SpringBootApplication
+@EnableScheduling
+public class PilotApplication {
+
+	public static void main(String[] args) {
+		SpringApplication.run(PilotApplication.class, args);
+	}
+
+}
diff --git a/src/main/java/com/luca/pilot/bizEnum/CrfQuestionTypeEnum.java b/src/main/java/com/luca/pilot/bizEnum/CrfQuestionTypeEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..5a17f728c71fd89495318d966ef72e44862df03e
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bizEnum/CrfQuestionTypeEnum.java
@@ -0,0 +1,42 @@
+package com.luca.pilot.bizEnum;
+
+import cn.hutool.core.util.ObjectUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @Classname CrfQuestionTypeEnum
+ * @Description TODO
+ * @Date 2023/7/18 10:29
+ * @Created by 鑼冨畤鍧�
+ */
+@Getter
+@AllArgsConstructor
+public enum CrfQuestionTypeEnum {
+
+    CUSTOMIZE("CUSTOMIZE", "鎰忓绫诲瀷"),
+    TEMPLATE("TEMPLATE", "澶栧眰妗嗘灦"),
+    REGULAR("REGULAR", "鍥哄畾缁撴瀯"),
+    TEXT("TEXT", "杈撳叆妗�"),
+    TEXTAREA("TEXTAREA", "澶氳杈撳叆妗�"),
+    NUMBER("NUMBER", "鏁板€�"),
+    DATE("DATE", "鏃ユ湡閫夋嫨"),
+    SELECT("SELECT", "涓嬫媺鍗曢€�"),
+    RADIO("RADIO", "鐐瑰嚮鍗曢€�"),
+    MUTISELECT("MUTISELECT", "涓嬫媺澶氶€�"),
+    CRFTABLE("CRFTABLE", "鐭╅樀濉┖"),
+    CASCADER("CASCADER", "绾ц仈閫夋嫨"),
+    ;
+
+    private String code;
+    private String desc;
+
+    public static CrfQuestionTypeEnum getDeviceEnum(String code) {
+        for (CrfQuestionTypeEnum value : CrfQuestionTypeEnum.values()) {
+            if (ObjectUtil.equal(value.code, code)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/luca/pilot/bizEnum/TableEnum.java b/src/main/java/com/luca/pilot/bizEnum/TableEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..b95133cca8235bd56ec41e547e6914ca2c7b2800
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bizEnum/TableEnum.java
@@ -0,0 +1,54 @@
+package com.luca.pilot.bizEnum;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum TableEnum {
+
+    armOutstretched("armOutstretched", "clinical_trials_arm_outstretched"),
+    bodyPosturalTremorMiddle("bodyPosturalTremorMiddle", "clinical_trials_body_postural_tremor_middle"),
+    bodyPosturalTremorMiddleBlind("bodyPosturalTremorMiddleBlind", "clinical_trials_body_postural_tremor_middle_blind"),
+    seatedSteppingLeft("seatedSteppingLeft", "clinical_trials_foot_tap_seated_left"),
+    seatedSteppingRight("seatedSteppingRight", "clinical_trials_foot_tap_seated_right"),
+    gaitStability("gaitStability", "clinical_trials_gait_and_balance"),
+    gaitUTurn("gaitUTurn", "clinical_trials_gait_u_turn"),
+    handKineticTremorLeft("handKineticTremorLeft", "clinical_trials_hand_kinetic_tremor_left"),
+    handKineticTremorRight("handKineticTremorRight", "clinical_trials_hand_kinetic_tremor_right"),
+    handPosturalTremorLeft("handPosturalTremorLeft", "clinical_trials_hand_postural_tremor_left"),
+    handPosturalTremorRight("handPosturalTremorRight", "clinical_trials_hand_postural_tremor_right"),
+    handRestTremorLeft("handRestTremorLeft", "clinical_trials_hand_rest_tremor_left"),
+    handRestTremorRight("handRestTremorRight", "clinical_trials_hand_rest_tremor_right"),
+    indexFingerTappingTwoTargetLeft("indexFingerTappingTwoTargetLeft", "clinical_trials_index_finger_tap_two_target_left"),
+    indexFingerTappingTwoTargetRight("indexFingerTappingTwoTargetRight", "clinical_trials_index_finger_tap_two_target_right"),
+    indexFingerTappingOneTargetLeft("indexFingerTappingOneTargetLeft", "clinical_trials_index_finger_tapping_one_target_left"),
+    indexFingerTappingOneTargetRight("indexFingerTappingOneTargetRight", "clinical_trials_index_finger_tapping_one_target_right"),
+    legRestTremorLeft("legRestTremorLeft", "clinical_trials_leg_rest_tremor_left"),
+    legRestTremorRight("legRestTremorRight", "clinical_trials_leg_rest_tremor_right"),
+    mci("mci", "clinical_trials_mci"),
+    handPronationSupinationLeft("handPronationSupinationLeft", "clinical_trials_palm_flip_left"),
+    handPronationSupinationRight("handPronationSupinationRight", "clinical_trials_palm_flip_right"),
+    sitToStand30s("sitToStand30s", "clinical_trials_sit_to_stand_by_thirty"),
+    tremor("tremor", "clinical_trials_tremor_detection"),
+    twoFingerTappingTwoTargetLeft("twoFingerTappingTwoTargetLeft", "clinical_trials_two_finger_tapping_two_target_left"),
+    twoFingerTappingTwoTargetRight("twoFingerTappingTwoTargetRight", "clinical_trials_two_finger_tapping_two_target_right"),
+    vision("vision", "clinical_trials_vision"),
+    visionColorBlindnessType("visionColorBlindnessType", "clinical_trials_vision_color_blindness_type"),
+    visionContrastSensitivity("visionContrastSensitivity", "clinical_trials_vision_contrast_sensitivity"),
+    visionEsdmt("visionEsdmt", "clinical_trials_vision_esdmt"),
+    visionVibrationSensitivity("visionVibrationSensitivity", "clinical_trials_vision_vibration_sensitivity"),
+    ;
+
+    private final String moudleItemType;
+    private final String tableName;
+
+    public static String getTableNameByType(String type) {
+        for (TableEnum value : TableEnum.values()) {
+            if (value.getMoudleItemType().equals(type)) {
+                return value.getTableName();
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/luca/pilot/bo/BindDataBo.java b/src/main/java/com/luca/pilot/bo/BindDataBo.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f0722df7b450994cbff76bcf93145af8ee8816c
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bo/BindDataBo.java
@@ -0,0 +1,18 @@
+package com.luca.pilot.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Classname BindDataBo
+ * @Description TODO
+ * @Date 2023/7/18 10:37
+ * @Created by 鑼冨畤鍧�
+ */
+@Data
+@Accessors(chain = true)
+public class BindDataBo {
+    private String dataType;
+    private String choiceField;
+    private String dataId;
+}
diff --git a/src/main/java/com/luca/pilot/bo/CrfJsonValueBo.java b/src/main/java/com/luca/pilot/bo/CrfJsonValueBo.java
new file mode 100644
index 0000000000000000000000000000000000000000..369cbd4325bd9bcfade1f167e1da2f9306aa3a86
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bo/CrfJsonValueBo.java
@@ -0,0 +1,21 @@
+package com.luca.pilot.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Classname CrfJsonValueBo
+ * @Description TODO
+ * @Date 2023/7/17 18:17
+ * @Created by 鑼冨畤鍧�
+ */
+@Data
+@Accessors(chain = true)
+public class CrfJsonValueBo {
+
+    private String key;
+    private String keyPrefix;
+    private String name;
+    private String value;
+    private String text;
+}
diff --git a/src/main/java/com/luca/pilot/bo/CrfJsonValueKeyBo.java b/src/main/java/com/luca/pilot/bo/CrfJsonValueKeyBo.java
new file mode 100644
index 0000000000000000000000000000000000000000..e1a12b4cced5aa095dadba6214ec400122e6f9e6
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bo/CrfJsonValueKeyBo.java
@@ -0,0 +1,22 @@
+package com.luca.pilot.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Classname CrfJsonValueBo
+ * @Description TODO
+ * @Date 2023/7/17 18:17
+ * @Created by 鑼冨畤鍧�
+ */
+@Data
+@Accessors(chain = true)
+public class CrfJsonValueKeyBo {
+
+    private String id;
+    private String keyPrefix;
+    private String title;
+    private String value;
+    private String colKey;
+    private String colName;
+}
diff --git a/src/main/java/com/luca/pilot/bo/CrfProblemBo.java b/src/main/java/com/luca/pilot/bo/CrfProblemBo.java
new file mode 100644
index 0000000000000000000000000000000000000000..ec6c0bde30fe5766c2d76e4e3ece6fea512a301c
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bo/CrfProblemBo.java
@@ -0,0 +1,26 @@
+package com.luca.pilot.bo;
+
+import com.luca.pilot.bizEnum.CrfQuestionTypeEnum;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Classname CrfProblemBo
+ * @Description TODO
+ * @Date 2023/7/18 10:37
+ * @Created by 鑼冨畤鍧�
+ */
+@Data
+@Accessors(chain = true)
+public class CrfProblemBo {
+
+    private String title;
+
+    private String key;
+
+    private CrfQuestionTypeEnum questionType;
+
+    private BindDataBo dataBo;
+
+    private String properties;
+}
diff --git a/src/main/java/com/luca/pilot/bo/CrfTableJsonTopicBo.java b/src/main/java/com/luca/pilot/bo/CrfTableJsonTopicBo.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f491d46957d7293beaba74e7418dfa0b8fa9848
--- /dev/null
+++ b/src/main/java/com/luca/pilot/bo/CrfTableJsonTopicBo.java
@@ -0,0 +1,20 @@
+package com.luca.pilot.bo;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @Classname CrfTableJsonTopicBo
+ * @Description TODO
+ * @Date 2023/7/20 13:58
+ * @Created by 鑼冨畤鍧�
+ */
+@Data
+@Accessors(chain = true)
+public class CrfTableJsonTopicBo {
+
+    private String id;
+    private String title;
+    private String dataIndex;
+    private String type;
+}
diff --git a/src/main/java/com/luca/pilot/config/MongoArchiveTemplateConfig.java b/src/main/java/com/luca/pilot/config/MongoArchiveTemplateConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..18998d4c76f25f47ffecf81383e65b0bed2756f8
--- /dev/null
+++ b/src/main/java/com/luca/pilot/config/MongoArchiveTemplateConfig.java
@@ -0,0 +1,37 @@
+package com.luca.pilot.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.mongodb.MongoDatabaseFactory;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+/**
+ * @author Wong
+ * @date 2024/1/6 14:17
+ */
+@Slf4j
+@Configuration
+@EnableMongoRepositories(mongoTemplateRef = "mongoArchiveTemplate")
+public class MongoArchiveTemplateConfig {
+
+    @Value("${spring.data.archive-mongodb.uri}")
+    private String uri;
+
+    @Bean(name = "mongoArchiveTemplate")
+    public MongoTemplate mongoECrfTemplate() {
+        log.info("-----------------------Backend Init MongoECrfTemplate Success-----------------------------------");
+        return new MongoTemplate(mongoECrfFactory());
+    }
+
+    @Bean
+    public MongoDatabaseFactory mongoECrfFactory() {
+        SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
+        return simpleMongoClientDbFactory;
+    }
+
+}
diff --git a/src/main/java/com/luca/pilot/config/MongoBaseTemplateConfig.java b/src/main/java/com/luca/pilot/config/MongoBaseTemplateConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2ff090fb15ca7d5cb0fb4ec54ca766aa88e85e9
--- /dev/null
+++ b/src/main/java/com/luca/pilot/config/MongoBaseTemplateConfig.java
@@ -0,0 +1,39 @@
+package com.luca.pilot.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.mongodb.MongoDatabaseFactory;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
+import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
+
+/**
+ * @author Wong
+ * @date 2024/1/6 14:17
+ */
+@Slf4j
+@Configuration
+//@EnableMongoRepositories(basePackages = "com.luca.pilot.entity")
+public class MongoBaseTemplateConfig {
+
+    @Value("${spring.data.base-mongodb.uri}")
+    private String uri;
+
+    @Primary
+    @Bean(name = "mongoTemplate")
+    public MongoTemplate mongoBaseTemplate() {
+        log.info("-----------------------Backend Init MongoBaseTemplate Success -----------------------------------");
+        return new MongoTemplate(mongoBaseFactory());
+    }
+
+    @Bean
+    @Primary
+    public MongoDatabaseFactory mongoBaseFactory() {
+        SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
+        return simpleMongoClientDbFactory;
+    }
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/AbstractAuditingEntity.java b/src/main/java/com/luca/pilot/entity/AbstractAuditingEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..e13fd1615c57cc13aa8b57d0c4be7a92a553fbfe
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/AbstractAuditingEntity.java
@@ -0,0 +1,35 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Field;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * Base abstract class for entities which will hold definitions for created, last modified by date.
+ */
+@Data
+public abstract class AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Field("created_by")
+    private String createdBy;
+
+    @Field("created_at")
+    private String createdAt;
+
+    @Field("last_modified_by")
+    private String lastModifiedBy;
+
+    @Field("last_modified_at")
+    private String lastModifiedAt;
+
+    /**
+     * 鍒犻櫎鏍囪锛坒alse:鏈垹闄� true:宸插垹闄わ級
+     */
+    private boolean deleted = false;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/BaseModuleView.java b/src/main/java/com/luca/pilot/entity/BaseModuleView.java
new file mode 100644
index 0000000000000000000000000000000000000000..f041064edea77d534e29e3144ddfbdeeb04dbdeb
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/BaseModuleView.java
@@ -0,0 +1,63 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+@Data
+@Accessors(chain = true)
+@Document(collection = "base_module_view")
+public class BaseModuleView {
+
+    private Long id;
+
+    @Field("tenant_id")
+    private Long tenantId;
+
+    private String name;
+
+    @Field("module_item_type")
+    private String moduleItemType;
+
+    private Integer status;
+
+    @Field("module_code")
+    private String moduleCode;
+
+    @Field("module_enabled")
+    private Boolean moduleEnabled;
+
+    @Field("module_type")
+    private String moduleType;
+
+    @Field("project_code")
+    private String projectCode;
+
+    @Field("project_enabled")
+    private Boolean projectEnabled;
+
+    @Field("collect_type")
+    private String collectType;
+
+    @Field("local_algorithm")
+    private String localAlgorithm;
+
+    @Field("supplement_img_url")
+    private String supplementImgUrl;
+
+    @Field("supplement_media_url")
+    private String supplementMediaUrl;
+
+    @Field("collect_duration")
+    private String collectDuration;
+
+    @Field("description")
+    private String description;
+
+    private String deleted;
+
+    @Field("created_at")
+    private String createdAt;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/ClinicalTrialsEvent.java b/src/main/java/com/luca/pilot/entity/ClinicalTrialsEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..66a0f9d5222e5985216a9f31cf87459b78fa3244
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/ClinicalTrialsEvent.java
@@ -0,0 +1,92 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author Wong
+ * @since 2023-11-30
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Document("clinical_trials_event")
+public class ClinicalTrialsEvent extends AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /**
+     * 椤圭洰Code
+     */
+    private String projectCode;
+
+    /**
+     * uaa鐢ㄦ埛id
+     */
+    private Long uaaUserId;
+
+    /**
+     * DBM-浜嬩欢id
+     */
+    @Field("event_id")
+    private Long eventId;
+
+    /**
+     * 璁″垝浠诲姟id
+     */
+    @Field("plan_details_id")
+    private Long planDetailsId;
+
+    /**
+     * 鍏宠仈妯″潡鍒嗙被(渚嬪: DIGITAL_MEDICAL/COLLECT_FLOW)
+     */
+    @Field("relation_type")
+    private String relationType;
+
+    /**
+     * 鍏宠仈妯″潡id
+     */
+    @Field("relation_id")
+    private Long relationId;
+
+    /**
+     * 妯″潡椤圭被鍨� (渚嬪: sitToStand/collect_module)
+     */
+    @Field("module_item_type")
+    private String moduleItemType;
+
+    /**
+     * 绉戠爺閲囬泦 - 閲囬泦绫诲瀷
+     */
+    @Field("collect_type")
+    private String collectType;
+
+    /**
+     * 绉戠爺閲囬泦 - 鏈湴绠楁硶
+     */
+    private String localAlgorithm;
+
+    /**
+     * 寮€濮嬫椂闂�
+     */
+    private String startTime;
+
+    /**
+     * 瀹屾垚鏃堕棿
+     */
+    private String finishTime;
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/CollectModule.java b/src/main/java/com/luca/pilot/entity/CollectModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..43ecb7a112aad13cbe706022ef03bfd6adc47e69
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/CollectModule.java
@@ -0,0 +1,88 @@
+package com.luca.pilot.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 绉戠爺閲囬泦淇℃伅琛�
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2023-06-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Document("collect_module")
+public class CollectModule extends AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /**
+     * 绉熸埛ID
+     */
+    private Long tenantId;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 缂栫爜
+     */
+    private String code;
+
+    /**
+     * 閲囬泦绫诲瀷
+     */
+    private String collectType;
+
+    /**
+     * 閲囬泦鏃堕暱
+     */
+    private Integer collectDuration;
+
+    /**
+     * 鏈湴绠楁硶
+     */
+    private String localAlgorithm;
+
+    /**
+     * 绀轰緥濯掍綋鏂囦欢URL
+     */
+    private String mediaUrl;
+
+    /**
+     * 绀轰緥濯掍綋鏂囦欢鍓嶇浣跨敤
+     */
+    private String audioMinioPath;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鍥剧墖鍦板潃
+     */
+    private String imgUrl;
+
+    /**
+     * 鏄惁璁℃椂 0鎴栬€卬ull 鍚� 1 鏄�
+     */
+    private String isTime;
+
+    /**
+     * 璁℃椂鏃堕棿
+     */
+    private String time;
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/Crf.java b/src/main/java/com/luca/pilot/entity/Crf.java
new file mode 100644
index 0000000000000000000000000000000000000000..7015eb92f0b4f99caf9e9343a3220b605b5ede06
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/Crf.java
@@ -0,0 +1,40 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2021-11-24
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("crf")
+public class Crf extends AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String description;
+
+    private Long sourceId;
+
+    @Field("question_json")
+    private String questionJson;
+
+    @Field("crf_top_id")
+    private Long crfTopId;
+}
diff --git a/src/main/java/com/luca/pilot/entity/CrfAnswer.java b/src/main/java/com/luca/pilot/entity/CrfAnswer.java
new file mode 100644
index 0000000000000000000000000000000000000000..b19033594d6ef6aea3aaf36be53841e25d25a29c
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/CrfAnswer.java
@@ -0,0 +1,70 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("crf_answer")
+public class CrfAnswer extends AbstractAuditingEntity implements Serializable {
+
+
+    private static final long serialVersionUID = 1L;
+
+
+    /**
+     * CrfAnswer琛ㄤ富閿甀D
+     */
+    private Long id;
+
+    /**
+     * crf琛↖D
+     */
+    @Field("crf_id")
+    private Long crfId;
+
+    /**
+     * crfTop琛ㄤ富閿甀D
+     */
+    @Field("crf_top_id")
+    private Long crfTopId;
+
+    /**
+     * 绉熸埛ID
+     */
+    private Long tenantId;
+
+
+    /**
+     * 绛旀鐨勫ぇjson
+     */
+    @Field("answer_json")
+    private String answerJson;
+
+    @Field("plan_task_details_id")
+    private Long planTaskDetailsId;
+
+    /**
+     * SiteId
+     */
+    private String siteId;
+
+    /**
+     * projectCode
+     */
+    private String projectCode;
+
+    /**
+     * patientCode
+     */
+    private String patientCode;
+
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/DigitalMedicalDetails.java b/src/main/java/com/luca/pilot/entity/DigitalMedicalDetails.java
new file mode 100644
index 0000000000000000000000000000000000000000..4c2406672e90eb20bac1670caf17f84efeed3f2e
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/DigitalMedicalDetails.java
@@ -0,0 +1,78 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * <p>
+ * 鏁板瓧闈剁偣瀛愭ā鍧楄缁嗕俊鎭〃
+ * </p>
+ *
+ * @since 2022-01-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Document(collection = "digital_medical_details")
+public class DigitalMedicalDetails extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    private Long tenantId;
+
+    /**
+     * 鍚嶇О
+     */
+    private String name;
+
+    /**
+     * code
+     */
+    private String code;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 绠楁硶id
+     */
+    private Long algorithmId;
+
+    /**
+     * 绠楁硶鍚嶇О
+     */
+    private String algorithmName;
+
+    /**
+     * 绠楁硶绫诲瀷
+     * com.luca.enumeration.DbmAlgorithmType鏋氫妇
+     * 瀵瑰簲
+     * com.lucahealthcare.luca.common.enumerations.ModuleItemType鏋氫妇
+     */
+    private String algorithmType;
+
+    /**
+     * 绠楁硶鏀寔璁惧
+     */
+    private String algorithmDevices;
+
+    /**
+     * 绠楁硶璇︽儏
+     */
+    private String algorithmDetails;
+
+    /**
+     * 鏁板瓧璇婄枟璇︽儏涓嬬殑瀛愭暟瀛楄瘖鐤梚d锛孞SONArray锛�  todo:鍐犻湒璇存斁鍒扮畻娉曚笅
+     */
+    private String subAlgorithm;
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/ModuleEntity.java b/src/main/java/com/luca/pilot/entity/ModuleEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..098fb84091b26bedfb43e0844d9700c08a4b6ef4
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/ModuleEntity.java
@@ -0,0 +1,51 @@
+package com.luca.pilot.entity;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * @author jiangbangfa
+ * @date 2021/7/20 涓婂崍9:39
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("module")
+public class ModuleEntity extends AbstractAuditingEntity {
+
+    private Long id;
+
+    /**
+     * 椤圭洰code
+     */
+    @Field("project_code")
+    private String projectCode;
+
+    /**
+     * 妯″潡code
+     */
+    private String code;
+
+    /**
+     * 妯″潡鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 妯″潡绫诲瀷
+     */
+    private String type;
+
+    /**
+     * 妯″潡鐘舵€�
+     */
+    private Boolean enabled;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/PatientScaleEvaluatingEntity.java b/src/main/java/com/luca/pilot/entity/PatientScaleEvaluatingEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e00d0ffe09e1b39b2be73489f5a9ba5b8a99a43
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PatientScaleEvaluatingEntity.java
@@ -0,0 +1,44 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * @author linfeng.yang
+ * @date 2021/8/03 涓嬪崍14:40
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("patient_scale_evaluating")
+public class PatientScaleEvaluatingEntity extends AbstractAuditingEntity {
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+    private String code;
+
+    @Field("project_code")
+    private String projectCode;
+    private String patientCode;
+    private String siteId;
+    @Field("scale_code")
+    private String scaleCode;
+    @Field("scale_result")
+    private String scaleResult;
+    private String ruleId;
+
+    /**
+     * 閲忚〃绛旈鎬诲緱鍒�
+     */
+    @Field("total_score")
+    private String totalScore;
+
+    /**
+     * 鎮h€呬换鍔¤鎯卛d
+     */
+    @Field("plan_task_details_id")
+    private Long planTaskDetailsId;
+}
diff --git a/src/main/java/com/luca/pilot/entity/Plan.java b/src/main/java/com/luca/pilot/entity/Plan.java
new file mode 100644
index 0000000000000000000000000000000000000000..8319284936bc078ba852db9e266731b99e5a198b
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/Plan.java
@@ -0,0 +1,91 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 璁″垝琛�
+ * </p>
+ *
+ * @author Lt
+ * @since 2021-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="plan")
+public class Plan extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    @Field("tenant_id")
+    private Long tenantId;
+
+    /**
+     * 椤圭洰id
+     */
+    @Field("project_id")
+    private Long projectId;
+
+    /**
+     * 璁″垝鍚嶇О
+     */
+    private String name;
+
+    /**
+     * 璁″垝缂栧彿
+     */
+    private String number;
+
+    /**
+     * 鐢熸晥鏃ユ湡
+     */
+    @Field("effective_date")
+    private LocalDate effectiveDate;
+
+    /**
+     * 璁″垝澶╂暟
+     */
+    private Integer days;
+
+    /**
+     * 鎻忚堪
+     */
+    private String description;
+
+    /**
+     * 鏄惁鍚敤(0:绂佺敤 1:鍚敤)
+     */
+    private Boolean enabled;
+
+    /**
+     * 璁″垝浜岀淮鐮�
+     */
+    @Field("plan_url")
+    private String planUrl;
+
+    /**
+     * 鏍囩ids
+     */
+    @Field("patient_tags")
+    private String patientTags;
+
+    /**
+     * 鏄惁闇€瑕佸尰鐢熷鏍�  0 涓嶉渶瑕�  1 闇€瑕�
+     */
+    @Field("doctor_audit")
+    private Integer doctorAudit;
+
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/PlanModule.java b/src/main/java/com/luca/pilot/entity/PlanModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..c990deae16017d83a341d58227098eff1589570f
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PlanModule.java
@@ -0,0 +1,84 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Data
+@Document(collection="plan_module")
+public class PlanModule {
+
+    private String key;
+    /**
+     * 鎮h€呯紪鍙�
+     */
+    private String subjectId;
+    /**
+     * 闅忔満鏁�
+     */
+    private String randomizationId;
+
+
+    /**
+     * plan
+     */
+    private String projectCode;
+    private String projectName;
+    private String siteName;
+    private Long planId;
+    private String planCode;
+    private String planEffectiveDate;
+    private Integer planDuration;
+
+    /**
+     * plan task
+     */
+    private String planTaskName;
+    private String planTaskdescription;
+    private Integer planTaskType;
+    private Integer planTaskTaskCount;
+    private Integer planTaskFinishDay;
+    private Integer planTaskLoopType;
+    private Boolean planTaskEnabled;
+    private Integer planTaskIsCirculation;
+    private Integer planTaskBeginDay;
+    private Integer planTaskCirculationDay;
+    private Integer planTaskWindowPhase;
+    private Integer planTaskEndDay;
+
+    /**
+     * plan task detail
+     */
+    private String taskStartDate;
+    private String taskEndDate;
+    private Integer taskCompleteStatus;
+    private String taskCompleteTime;
+    private Integer taskEnabled;
+    private Integer taskCompleteOrder;
+
+    /**
+     * plan module relate
+     */
+    private String moduleType;
+    private Long moduleId;
+    private String moduleName;
+
+
+
+    /**
+     * plan task detail module
+     */
+    private Integer moduleComplete;
+    private String moduleIgnoreRemark;
+    private String moduleFinishTime;
+
+    /**
+     * 缁勮
+     */
+    private String result;
+    private String digitalModuleTableName;
+
+    /**
+     * event
+     */
+    private Long digitalModuleEventId;
+}
diff --git a/src/main/java/com/luca/pilot/entity/PlanTask.java b/src/main/java/com/luca/pilot/entity/PlanTask.java
new file mode 100644
index 0000000000000000000000000000000000000000..d7cff83fdfb70f47e89f575162451e8cee7038ac
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PlanTask.java
@@ -0,0 +1,157 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * <p>
+ * 鎮h€呬换鍔¤鍒�
+ * </p>
+ *
+ * @author Lt
+ * @since 2021-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="plan_task")
+public class PlanTask extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    @Field("tenant_id")
+    private Long tenantId;
+
+    /**
+     * 椤圭洰id
+     */
+    @Field("project_id")
+    private Long projectId;
+
+    /**
+     * 璁″垝id
+     */
+    @Field("plan_id")
+    private Long planId;
+
+    /**
+     * 浠诲姟鍚嶇О
+     */
+    @Field("name")
+    private String name;
+
+    /**
+     * 浠诲姟鎻忚堪
+     */
+    @Field("description")
+    private String description;
+
+    /**
+     * 寰幆绫诲瀷(1:鍛� 2:鏈� 3:椤圭洰)
+     */
+    @Field("loop_type")
+    private Integer loopType;
+
+    /**
+     * 鎵ц绫诲瀷(寰幆绫诲瀷=鍛� 1:鎸囧畾鏄熸湡 2:寰幆鍛ㄥ唴鍑犳;  寰幆绫诲瀷=鏈� 1:浠庡綋鏈堝嚑鏃ュ紑濮� 2:鎸囧畾鏃ユ湡)
+     */
+    @Field("execute_type")
+    private Integer executeType;
+
+    /**
+     * 鎵ц鏃ユ湡(cron琛ㄨ揪寮忕畝鍖�)
+     */
+    @Field("execute_cron")
+    private String executeCron;
+
+    /**
+     * 鍛ㄦ墽琛岄娆�(寰幆绫诲瀷涓哄懆绫诲瀷,寰幆鍛ㄥ唴鍑犳鏃惰鍊�)
+     */
+    @Field("week_frequency")
+    private Integer weekFrequency;
+
+    /**
+     * 鏄惁鍚敤(0:绂佺敤 1:鍚敤)
+     */
+    @Field("enabled")
+    private Boolean enabled;
+
+    /**
+     * 璁″垝鐩爣id
+     */
+    @Field("target_id")
+    private Long targetId;
+    /**
+     * 绐楀彛鏈�
+     */
+    @Field("window_phase")
+    private Integer windowPhase;
+
+    /**
+     * 棰勭害鏃堕棿
+     */
+    @Field("reserve_time")
+    private String reserveTime;
+
+    /**
+     * 鍏遍渶澶氬皯澶�
+     */
+    @Field("finish_day")
+    private Integer finishDay;
+
+    /**
+     * 浠诲姟绫诲瀷(0:鎮h€呬换鍔� 1:鍖荤敓闅忚)
+     */
+    @Field("task_type")
+    private Integer taskType;
+
+    /**
+     * 涓€鏃ラ渶瀹屾垚娆℃暟
+     */
+    @Field("task_count")
+    private Integer taskCount;
+
+    /**
+     * 鏄惁寮€鍚獥鍙f湡 1寮€鍚� 0 鏈紑鍚�
+     */
+    @Field("is_window_phase")
+    private Integer isWindowPhase;
+
+    /**
+     * 鏄惁寰幆 1鏄� 0 鍚�
+     */
+    @Field("is_circulation")
+    private Integer isCirculation;
+
+    /**
+     * 绗嚑澶╁惊鐜�
+     */
+    @Field("circulation_day")
+    private Integer circulationDay;
+
+    /**
+     * 绗嚑澶╁紑濮�
+     */
+    @Field("begin_day")
+    private Integer beginDay;
+
+    /**
+     * 鍏ョ粍绫诲瀷闅忚缁撴潫浜庣鍑犲ぉ锛�0涓鸿嚦闅忚缁撴潫
+     */
+    @Field("end_day")
+    private Integer endDay;
+
+    /**
+     * 鍒嗙粍id
+     */
+    @Field("group_id")
+    private Long groupId;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/PlanTaskDetails.java b/src/main/java/com/luca/pilot/entity/PlanTaskDetails.java
new file mode 100644
index 0000000000000000000000000000000000000000..2b2209f4a6d39d563cf1d512c965a6e9738c0e05
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PlanTaskDetails.java
@@ -0,0 +1,100 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 鎮h€呬换鍔¤鍒掕鎯呰〃
+ * </p>
+ *
+ * @author Lt
+ * @since 2021-11-08
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="plan_task_details")
+public class PlanTaskDetails extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 璁″垝code  //todo 涓存椂瀛楁
+     */
+    @Field("schedule_task_code")
+    private String scheduleTaskCode;
+
+    /**
+     * 绉熸埛id
+     */
+    @Field("tenant_id")
+    private Long tenantId;
+
+    /**
+     * 椤圭洰id
+     */
+    @Field("project_id")
+    private Long projectId;
+
+    /**
+     * 鎮h€呬换鍔¤鍒抜d
+     */
+    @Field("plan_task_id")
+    private Long planTaskId;
+
+    /**
+     * 鎮h€卌ode
+     */
+    @Field("patient_code")
+    private String patientCode;
+
+    /**
+     * 璁″垝寮€濮嬫棩鏈�
+     */
+    @Field("start_date")
+    private String startDate;
+
+    /**
+     * 璁″垝缁撴潫鏃ユ湡
+     */
+    @Field("end_date")
+    private String endDate;
+
+    /**
+     * 璁″垝瀹屾垚鐘舵€�(0:鏈畬鎴� 1:宸插畬鎴�)
+     */
+    @Field("complete_status")
+    private Integer completeStatus;
+
+    /**
+     * 璁″垝瀹屾垚鏃堕棿
+     */
+    @Field("complete_time")
+    private String completeTime;
+
+    /**
+     * 鍛戒腑鏉′欢(鑻ユ槸寰幆鍛ㄥ唴鍑犳1111100:鏍囪瘑 鍛ㄤ竴鍒板懆浜斿仛,鍛ㄥ叚鍛ㄥぉ涓嶅仛; 鍏跺畠绫诲瀷浠诲姟:1)
+     */
+    private String hit;
+
+    /**
+     * 瀹屾垚椤哄簭
+     */
+    @Field("complete_order")
+    private Integer completeOrder;
+
+    /**
+     * 0 绂佺敤 1 鍚敤
+     */
+    private Integer enabled;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/PlanTaskDetailsModule.java b/src/main/java/com/luca/pilot/entity/PlanTaskDetailsModule.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a4a1e6fdc223b65572a033c876372344b99791d
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PlanTaskDetailsModule.java
@@ -0,0 +1,62 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * <p>
+ * 鎮h€呬换鍔¤鍒掕鎯呰〃
+ * </p>
+ *
+ * @author Lt
+ * @since 2021-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Document(collection = "plan_task_details_module")
+public class PlanTaskDetailsModule extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+//    @TableId(type = IdType.INPUT)
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    private Long tenantId;
+
+    /**
+     * 鎮h€呬换鍔¤鍒掕鎯卛d
+     */
+    @Field("plan_task_details_id")
+    private Long planTaskDetailsId;
+
+    /**
+     * 鍏宠仈椤圭洰绫诲瀷
+     */
+    @Field("relation_type")
+    private String relationType;
+
+    /**
+     * 鍏宠仈id
+     */
+    @Field("relation_id")
+    private Long relationId;
+
+    /**
+     * 妯″潡浠诲姟瀹屾垚鐘舵€�(0:鏈畬鎴� 1:宸插畬鎴�)
+     */
+    @Field("module_complete")
+    private Integer moduleComplete;
+
+    /**
+     * 蹇界暐澶囨敞
+     */
+    @Field("ignore_remark")
+    private String ignoreRemark;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/PlanTaskModuleRelate.java b/src/main/java/com/luca/pilot/entity/PlanTaskModuleRelate.java
new file mode 100644
index 0000000000000000000000000000000000000000..380f87c5bc6995f892d50b2e510517770745c6a9
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/PlanTaskModuleRelate.java
@@ -0,0 +1,51 @@
+package com.luca.pilot.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * <p>
+ * 鎮h€呬换鍔¤鍒掍笌妯″潡鍏宠仈琛�
+ * </p>
+ *
+ * @author Lt
+ * @since 2021-11-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="plan_task_module_relate")
+public class PlanTaskModuleRelate extends AbstractAuditingEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    @Field("tenant_id")
+    private Long tenantId;
+
+    /**
+     * 鍏宠仈model绫诲瀷
+     */
+    @Field("relation_type")
+    private String relationType;
+
+    /**
+     * 鍏宠仈id
+     */
+    @Field("relation_id")
+    private Long relationId;
+
+    /**
+     * 鎮h€呬换鍔¤鍒抜d
+     */
+    @Field("plan_task_id")
+    private Long planTaskId;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/Project.java b/src/main/java/com/luca/pilot/entity/Project.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1363fbdfa2ea2fe443e90351ed6c7a3ab628cdb
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/Project.java
@@ -0,0 +1,95 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.time.LocalDate;
+
+/**
+ * @author jiangbangfa
+ * @date 2021/7/19 涓嬪崍6:13
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="project")
+public class Project extends AbstractAuditingEntity {
+
+
+    private Long id;
+
+    private String code;
+
+    private String name;
+
+    @Field("app_ids")
+    private String appIds;
+
+    @Field("invite_code")
+    private String inviteCode;
+
+    private Long type;
+
+    private String number;
+
+    @Field("tenant_id")
+    private Long tenantId;
+
+    @Field("bid_unit")
+    private String bidUnit;
+
+    private String version;
+
+//    @Field("start_at")
+//    private LocalDate startAt;
+//
+//    @Field("end_at")
+//    private LocalDate endAt;
+
+    private String url;
+    @Field("dashboard_show_code")
+    private String dashboardShowCode;
+
+    @Field("dashboard_show_name")
+    private String dashboardShowName;
+
+    /**
+     * 鏃ヨ浣跨敤 鏂规鍚嶇О 闈炲繀濉�
+     */
+    @Field("scheme_name")
+    private String schemeName;
+
+    /**
+     * 鏃ヨ浣跨敤 鏂规缂栧彿 闈炲繀濉�
+     */
+    @Field("scheme_code")
+    private String schemeCode;
+
+//    /**
+//     * 鏄惁璁よ瘉
+//     */
+//    @Field("enable_id_verification")
+//    private Boolean enableIdVerification;
+
+
+    /**
+     * 0 鏈攣搴� 1 宸查攣搴�
+     */
+    private Integer locked;
+
+    /**
+     * 鐮旂┒闅忚鏃堕暱
+     */
+    @Field("study_follow_up_time")
+    private Integer studyFollowUpTime;
+
+    /**
+     * 璁″垝浜烘暟
+     */
+    @Field("plan_people")
+    private Long planPeople;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/Questionnaire.java b/src/main/java/com/luca/pilot/entity/Questionnaire.java
new file mode 100644
index 0000000000000000000000000000000000000000..7a2dfa000ad7e9d42092482999130a5664ecc03d
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/Questionnaire.java
@@ -0,0 +1,43 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2021-10-21
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("questionnaire")
+public class Questionnaire extends AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    private Long id;
+
+    private String url;
+
+    private String name;
+
+    private String description;
+
+    private Integer status;
+
+    @Field("top_id")
+    private Long topId;
+
+    private Long sourceId;
+
+    private Long tenantId;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/QuestionnaireAnswer.java b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswer.java
new file mode 100644
index 0000000000000000000000000000000000000000..afe121971c0fadfa15b879a210dad94eae11ee83
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswer.java
@@ -0,0 +1,68 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2021-11-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Document("questionnaire_answer")
+public class QuestionnaireAnswer extends AbstractAuditingEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @Field("questionnaire_id")
+    private Long questionnaireId;
+
+    @Field("questionnaire_name")
+    private String questionnaireName;
+
+    @Field("question_id")
+    private Long questionId;
+
+    @Field("question_name")
+    private String questionName;
+
+    private String type;
+
+    private Long tenantId;
+
+
+    /**
+     * 鎮h€呬换鍔¤鎯卛d
+     */
+    @Field("plan_task_details_id")
+    private Long planTaskDetailsId;
+
+    /**
+     * 鐫$湢闂嵎鐫$湢绫诲瀷
+     */
+    private Integer sleepType;
+
+    /**
+     * site Id
+     */
+    private String siteId;
+    /**
+     * 涓昏褰昳d
+     */
+    @Field("record_id")
+    private Long recordId;
+
+//    @ApiModelProperty(value = "鍏宠仈schedule")
+//    private String scheduleTaskCode;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerOption.java b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerOption.java
new file mode 100644
index 0000000000000000000000000000000000000000..41e4b5907ab2814c5fc97c94b8b3ebf715b28372
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerOption.java
@@ -0,0 +1,55 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2021-11-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Document("questionnaire_answer_option")
+public class QuestionnaireAnswerOption extends AbstractAuditingEntity implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @Field("answer_id")
+    private Long answerId;
+
+    @Field("option_id")
+    private Long optionId;
+
+    @Field("option_name")
+    private String optionName;
+
+    @Field("question_id")
+    private Long questionId;
+
+    private String content;
+
+    @Field("date_at")
+    private String dateAt;
+
+    @Field("number_answer")
+    private BigDecimal numberAnswer;
+
+    @Field("left_min")
+    private BigDecimal leftMin;
+
+    @Field("right_max")
+    private BigDecimal rightMax;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerRecord.java b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerRecord.java
new file mode 100644
index 0000000000000000000000000000000000000000..db02ed939c32694b83075106dc84621cd5051dc6
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/QuestionnaireAnswerRecord.java
@@ -0,0 +1,56 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author linfeng.yang
+ * @since 2021-10-21
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@Document("questionnaire_answer_record")
+public class QuestionnaireAnswerRecord extends AbstractAuditingEntity implements Serializable{
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    @Field("top_id")
+    private Long topId;
+
+    @Field("project_code")
+    private String projectCode;
+
+    @Field("site_id")
+    private String siteId;
+
+    @Field("patient_code")
+    private String patientCode;
+
+    /**
+     * 鎮h€呬换鍔¤鎯卛d
+     */
+    @Field("plan_task_details_id")
+    private Long planTaskDetailsId;
+
+    /**
+     * 璁″垝瀹屾垚鏃堕棿
+     */
+    @Field("complete_time")
+    private String completeTime;
+
+
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/ScaleModuleDetailsEntity.java b/src/main/java/com/luca/pilot/entity/ScaleModuleDetailsEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..39cf369a48e2b6407c676aeb53ded1d88e61864a
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/ScaleModuleDetailsEntity.java
@@ -0,0 +1,33 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.math.BigDecimal;
+
+/**
+ * @author linfeng.yang
+ * @date 2021/8/03 涓嬪崍14:40
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("scale_module_details")
+public class ScaleModuleDetailsEntity extends AbstractAuditingEntity {
+
+    private Long id;
+    private String code;
+    private String name;
+    private String description;
+    private String ruleDescription;
+    private Integer status;     //0:鏈彂甯� 1:宸插彂甯� 2:宸蹭笅鏋�
+    private String tags;
+    private String scaleImg;
+    private String url;
+    private String abbreviation;
+    private BigDecimal scaleScore;
+    private String ruleResult;
+    private String ruleContent;
+}
diff --git a/src/main/java/com/luca/pilot/entity/ScaleModuleEntity.java b/src/main/java/com/luca/pilot/entity/ScaleModuleEntity.java
new file mode 100644
index 0000000000000000000000000000000000000000..0379b662df0e1403239e7729bf2d8fc74076ec3b
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/ScaleModuleEntity.java
@@ -0,0 +1,29 @@
+package com.luca.pilot.entity;
+
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * @author linfeng.yang
+ * @date 2021/8/03 涓嬪崍14:40
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document("scale_module")
+public class ScaleModuleEntity extends AbstractAuditingEntity {
+
+    private Long id;
+    private String code;
+    @Field("project_code")
+    private String projectCode;
+    @Field("module_code")
+    private String moduleCode;
+    @Field("scale_code")
+    private String scaleCode;
+    private Boolean enabled;
+}
diff --git a/src/main/java/com/luca/pilot/entity/Site.java b/src/main/java/com/luca/pilot/entity/Site.java
new file mode 100644
index 0000000000000000000000000000000000000000..22c70b66933c0f4835dbaf1e05a8130ddc11c95a
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/Site.java
@@ -0,0 +1,89 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Document(collection="site")
+public class Site extends AbstractAuditingEntity {
+    /**
+     * siteId
+     */
+    private Long id;
+
+    /**
+     * 绉熸埛id
+     */
+    private Long tenantId;
+
+    /**
+     * 椤圭洰id
+     */
+    private Long projectId;
+
+    /**
+     * site鍚嶇О(L:32)
+     */
+    @Field("site_name")
+    private String siteName;
+
+    /**
+     * 鎻忚堪(L:128)
+     */
+    private String description;
+
+    /**
+     * logo
+     */
+    private String logoUrl;
+
+    /**
+     * 鐭ユ儏鍚屾剰涔︽枃鏈�
+     */
+    private String agreementText;
+
+    /**
+     * 鐭ユ儏鍚屾剰绫诲瀷  0 鏃� 1 閫氱敤妯℃澘  2 site鑷畾涔�
+     */
+    private Integer agreementType;
+
+    /**
+     * 鐩爣鎮h€呮暟
+     */
+    private Long targetPatientsNum;
+
+    /**
+     * 鐪佺骇id
+     */
+    private Long provinceId;
+
+    /**
+     * 甯傜骇id
+     */
+    private Long cityId;
+
+    /**
+     * 鍖�/鍘跨骇id
+     */
+    private Long areaId;
+
+    /**
+     * 鐪佺骇-甯傜骇-鍖�/鍘跨骇
+     */
+    private String address;
+
+    /**
+     * 鏃跺尯
+     */
+    private String timeZone;
+
+    /**
+     * 鍚敤鐘舵€�
+     */
+    private Boolean enable;
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/luca/pilot/entity/SynchronizeTime.java b/src/main/java/com/luca/pilot/entity/SynchronizeTime.java
new file mode 100644
index 0000000000000000000000000000000000000000..9391f86fdb6cfe251e9c2a0eec53ff7217da5f1b
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/SynchronizeTime.java
@@ -0,0 +1,14 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.time.LocalDateTime;
+@Data
+@Document(collection="synchronize_time")
+public class SynchronizeTime {
+
+    private String _id;
+    private LocalDateTime plan;
+
+}
diff --git a/src/main/java/com/luca/pilot/entity/UserArchive.java b/src/main/java/com/luca/pilot/entity/UserArchive.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e1579c025c306d0a0dfa1ae6b6c199348b99a79
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/UserArchive.java
@@ -0,0 +1,207 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+@Data
+@Accessors(chain = true)
+@Document("user_archive")
+public class UserArchive {
+
+    @Id
+    private String id;
+    /**
+     * 鍚嶅瓧
+     */
+    private String name;
+
+    /**
+     * 鎵嬫満鍙�
+     */
+    private String phoneNo;
+
+    /**
+     * 鐢穦濂�
+     */
+    private String gender;
+
+    /**
+     * YYYY-MM-DD鏍煎紡
+     */
+    private String birthday;
+
+    /**
+     * 韬唤璇佸悗鍥涗綅
+     */
+    private String idCardLastFour;
+
+    /**
+     * 韬唤璇佸彿
+     */
+    private String idCard;
+
+    /**
+     * 鍦板潃
+     */
+    private String address;
+
+    /**
+     * 瀛﹀巻
+     */
+    private String education;
+
+    /**
+     * 鑱屼笟锛堥€€浼戝墠锛�
+     */
+    private String job;
+
+    /**
+     * 濠氬Щ鐘跺喌
+     */
+    private String maritalStatus;
+
+    /**
+     * 灞呬綇鐘舵€�
+     */
+    private String dwellStatus;
+
+    /**
+     * 韬珮
+     */
+    private String height;
+
+    /**
+     * 浣撻噸
+     */
+    private String weight;
+
+    /**
+     * 鏄惁鍠滄鍚煶涔�
+     */
+    private String likeMusic;
+
+    /**
+     * 姣忓懆鍚煶涔愭椂闀�
+     */
+    private String weekMusciDuration;
+
+    /**
+     * 澶氫箙鍏ョ潯
+     */
+    private String fallAsleep;
+
+    /**
+     * 鐫$湢鍑犲皬鏃�
+     */
+    private String sleepTime;
+
+    /**
+     * 褰卞搷鐫$湢鎯呭喌
+     */
+    private String sleepAffect;
+
+    /**
+     * 鏄惁鑽墿鍔╃湢
+     */
+    private String drugHelpSleep;
+
+    /**
+     * 鏄惁鍚笉娓呭奖鍝嶇敓娲�
+     */
+    private String hearingAffectLife;
+
+    /**
+     * 鏄惁鎮f湁绯栧翱鐥�
+     */
+    private String diabetes;
+    /**
+     * 鏄惁鎮f湁楂樿鍘�
+     */
+    private String hypertension;
+    /**
+     * 鏄惁楗厭
+     */
+    private String drink;
+    /**
+     * 鏄惁鍚哥儫
+     */
+    private String smoke;
+
+    /**
+     * 瑙勫垯md5
+     */
+    private String schemaMd5;
+
+    /**
+     * 姘戞棌
+     */
+    private String nation;
+
+    /**
+     * 鏃㈠線鐥呭彶
+     */
+    private String pastMedicalHistory;
+
+    /**
+     * 闅忔満鏁�
+     */
+    private String randomizationId;
+    /**
+     * 杩囨晱鍙�
+     */
+    private String allergyHistory;
+
+    private String nlfh;//',"鍋ュ悍蹇楁効鑰咃紝骞撮緞18鑷�75宀侊紙鍖呭惈杈圭晫鍊硷級锛岀敺濂充笉闄�"
+    private String brqs;//',"鑳藉鏈汉绛剧讲鐭ユ儏鍚屾剰涔�"
+    private String yypd;//',"鎰挎剰鍦ㄧ爺绌舵湡闂翠僵鎴存墜鐜敹闆嗘暟鎹澶�"
+    private String yytgdz;//',"鎰挎剰鎻愪緵鏈夋晥鐨勮仈绯诲湴鍧€锛屼互鎺ユ敹鐮旂┒璁惧"
+    private String ywf;//',"瀹朵腑闇€鍏峰Wi-Fi缃戠粶杩炴帴锛岀綉缁滈€熷害100 Mbps鍙婁互涓�"
+    private String yysysj;//',"鎰挎剰浣跨敤閰嶅鏁版嵁濂楅鐨勬墜鏈猴紝骞堕噰鐢ㄥ悎閫傜殑鏁版嵁杩炴帴鏂瑰紡浼犺緭鐮旂┒鎵€鏀堕泦鐨勬暟鎹�"
+    private String ysjxtbs;//',"鏈夌缁忕郴缁熸垨绮剧鐤剧梾鐥呭彶锛屾垨璁ょ煡鍙楁崯鎴栧け鍘昏涓鸿兘鍔涚殑鍙楄瘯鑰�"
+    private String yhgfxshsb;//',"鏈夊緢楂橀闄╂崯鍧忚澶囨垨涓嶈兘闀挎椂闂翠僵鎴寸殑鍙楄瘯鑰咃紝濡傜粡甯告父娉宠€�"
+    private String gmpf;//',"瀵瑰彲绌挎埓璁惧杩囨晱鎴栨湁鐨偆杩囨晱鍙茬殑鍙楄瘯鑰�"
+    private String yzyfx;//',"鐢变簬鍋ュ悍鐘跺喌闂锛岃璇勪及涓烘湁浣忛櫌椋庨櫓鐨勫彈璇曡€�"
+    private String wsyznsb;//',"鏃㈠線浠庢湭浣跨敤杩囨櫤鑳借澶囩殑鍙楄瘯鑰�"
+    private String ssz;//',"鍦ㄧ瓫閫夋椂瀛樺湪闇€瑕佹不鐤楃殑鎬ユ€ф垨鎱㈡€х柧鐥呯殑鍙楄瘯鑰咃紙鍖呮嫭浣嗕笉闄愪簬鍏嶇柅缂洪櫡鎴栧厤鐤姂鍒剁柧鐥呫€佹伓鎬ц偪鐦ゆ垨鐨偆鐤剧梾绛夛級"
+    private String yywly;//',"鏈夎嵂鐗╂互鐢ㄦ垨鑽墿渚濊禆鐥呭彶鐨勫彈璇曡€�"
+    private String cyqtsy;//',"鐩墠鍙備笌鍏朵粬鑽墿鎴栧尰鐤楄澶囦复搴婅瘯楠岀殑鍙楄瘯鑰�"
+    private String zzbr;//',"鐩墠姝e湪鍝轰钩鐨勫コ鎬�"
+    private String yjzbsh;//',"鐮旂┒鑰呰涓哄彈璇曡€呭瓨鍦ㄤ笉閫傚悎鍙備笌璇曢獙鐨勫叾浠栧師鍥�"
+    private String wcglx;//',"鍙楄瘯鑰呭湪绛剧讲鐭ユ儏鍚屾剰鏃舵垨鏁翠釜鐮旂┒鏈熼棿锛屾棤鍑哄浗鏃呰璁″垝"
+
+    private String screeningNum; // 绛涢€夊彿
+    private String addressHome; // 瀹跺涵浣忓潃
+
+    // ------------------ 鎮h€呮。妗堝浐瀹氭暟鎹� -------------------
+    /**
+     * 鎮h€呯紪鍙� subjectId
+     */
+    private String subjectId;
+
+    /**
+     * 0绂佺敤  1鍚敤(榛樿)
+     */
+    private Integer enable = 1;
+
+    /**
+     * 鏄惁灏佸瓨 0鍚� 1鏄�
+     */
+    private Integer isArchive = 0;
+
+    /**
+     * 鍒涘缓鏃堕棿
+     */
+    private String createAt;
+
+    /**
+     * 鍒涘缓浜�
+     */
+    private String createBy;
+
+    /**
+     * 鏂囦欢url
+     */
+    private String fileUrl;
+}
diff --git a/src/main/java/com/luca/pilot/entity/UserArchiveMapping.java b/src/main/java/com/luca/pilot/entity/UserArchiveMapping.java
new file mode 100644
index 0000000000000000000000000000000000000000..220db1629621c6116c0d5af5f68d118f77dbef54
--- /dev/null
+++ b/src/main/java/com/luca/pilot/entity/UserArchiveMapping.java
@@ -0,0 +1,33 @@
+package com.luca.pilot.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.springframework.data.mongodb.core.mapping.Document;
+import org.springframework.data.mongodb.core.mapping.Field;
+
+/**
+ * @author linfeng.yang
+ */
+@Data
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+@Document(collection="user_archive_mapping")
+public class UserArchiveMapping extends AbstractAuditingEntity {
+    private Long id;
+    @Field("project_code")
+    private String projectCode;
+
+    @Field("site_id")
+    private Long siteId;
+
+    @Field("uaa_user_id")
+    private Long uaaUserId;
+
+    @Field("patient_code")
+    private String patientCode;
+
+    @Field("user_archive_id")
+    private String userArchiveId;
+
+}
diff --git a/src/main/java/com/luca/pilot/service/BaseModuleViewService.java b/src/main/java/com/luca/pilot/service/BaseModuleViewService.java
new file mode 100644
index 0000000000000000000000000000000000000000..78b1388a31063b82050322cde4d011111d04e4d2
--- /dev/null
+++ b/src/main/java/com/luca/pilot/service/BaseModuleViewService.java
@@ -0,0 +1,10 @@
+package com.luca.pilot.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+
+public interface BaseModuleViewService {
+
+     void synchronizeModuleView();
+}
diff --git a/src/main/java/com/luca/pilot/service/PlanService.java b/src/main/java/com/luca/pilot/service/PlanService.java
new file mode 100644
index 0000000000000000000000000000000000000000..94be7ce8a39178c3f0eacfea15c04044e05c2d10
--- /dev/null
+++ b/src/main/java/com/luca/pilot/service/PlanService.java
@@ -0,0 +1,10 @@
+package com.luca.pilot.service;
+
+public interface PlanService {
+
+
+    void synchronizePlanTask();
+
+    void test();
+
+}
diff --git a/src/main/java/com/luca/pilot/service/impl/BaseModuleViewServiceImpl.java b/src/main/java/com/luca/pilot/service/impl/BaseModuleViewServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..a1ee7124e801e350b868c8d640954f559a5666e6
--- /dev/null
+++ b/src/main/java/com/luca/pilot/service/impl/BaseModuleViewServiceImpl.java
@@ -0,0 +1,57 @@
+package com.luca.pilot.service.impl;
+
+import com.luca.pilot.entity.BaseModuleView;
+import com.luca.pilot.entity.ModuleEntity;
+import com.luca.pilot.entity.ScaleModuleDetailsEntity;
+import com.luca.pilot.entity.ScaleModuleEntity;
+import com.luca.pilot.service.BaseModuleViewService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class BaseModuleViewServiceImpl implements BaseModuleViewService {
+
+    @Resource(name = "mongoTemplate")
+    private MongoTemplate mongoTemplate;
+
+    @Override
+    public void synchronizeModuleView() {
+        queryScale();
+    }
+
+    private void queryScale() {
+        List<ScaleModuleDetailsEntity> scaleModuleDetailsList = mongoTemplate.findAll(ScaleModuleDetailsEntity.class);
+        List<ScaleModuleEntity> scaleModuleList = mongoTemplate.findAll(ScaleModuleEntity.class);
+        List<ModuleEntity> moduleList = mongoTemplate.findAll(ModuleEntity.class);
+
+        List<BaseModuleView> views = scaleModuleDetailsList.stream().map(x -> {
+            ScaleModuleEntity sm = scaleModuleList.stream().filter(y -> y.getScaleCode().equals(x.getCode())).findFirst().orElse(null);
+            if(Objects.nonNull(sm)) {
+                ModuleEntity m = moduleList.stream().filter(y -> y.getCode().equals(sm.getModuleCode())).findFirst().orElse(null);
+                BaseModuleView view = new BaseModuleView()
+                        .setId(x.getId())
+                        .setName(x.getName())
+                        .setStatus(x.getStatus())
+                        .setModuleCode(Objects.isNull(sm) ? "" : sm.getScaleCode())
+                        .setModuleEnabled(Objects.isNull(sm) ? null : sm.getEnabled())
+                        .setModuleType(Objects.isNull(m) ? "" : m.getType())
+                        .setProjectCode(Objects.isNull(m) ? "" : m.getProjectCode())
+                        .setProjectEnabled(Objects.isNull(m) ? null : m.getEnabled());
+                return view;
+            }
+            return null;
+        }).collect(Collectors.toList());
+
+        mongoTemplate.insertAll(views);
+    }
+
+}
diff --git a/src/main/java/com/luca/pilot/service/impl/PlanServiceImpl.java b/src/main/java/com/luca/pilot/service/impl/PlanServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..8e4dc42ea8e2b7361e00e67c190f3002534cbb7c
--- /dev/null
+++ b/src/main/java/com/luca/pilot/service/impl/PlanServiceImpl.java
@@ -0,0 +1,643 @@
+package com.luca.pilot.service.impl;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.json.JSONUtil;
+import com.luca.pilot.bizEnum.TableEnum;
+import com.luca.pilot.entity.*;
+import com.luca.pilot.service.PlanService;
+import com.luca.pilot.util.CrfUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.mongodb.core.BulkOperations;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.data.mongodb.core.query.Update;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
+
+import javax.annotation.Resource;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+@Slf4j
+@Service
+public class PlanServiceImpl implements PlanService {
+
+    @Resource(name = "mongoTemplate")
+    private MongoTemplate mongoTemplate;
+
+    @Resource(name = "mongoArchiveTemplate")
+    private MongoTemplate mongoArchiveTemplate;
+
+    @Override
+    @Scheduled(cron ="0 0/5 * * * ?")
+    public void synchronizePlanTask() {
+        log.info("-----------synchronizePlanTask start-----------");
+        LocalDateTime now = LocalDateTime.now();
+
+        SynchronizeTime synchronizeTime = findSynchronizeTime();
+
+        LocalDateTime lastSynchronizeTime = null;
+        if (Objects.nonNull(synchronizeTime)) {
+            lastSynchronizeTime = synchronizeTime.getPlan();
+        }
+
+        Query countQuery = new Query();
+        if (Objects.nonNull(lastSynchronizeTime)) {
+            countQuery.addCriteria(Criteria.where("last_modified_at").gt(String.valueOf(lastSynchronizeTime)));
+        }
+        long totalPlanTaskDetailsCount = mongoTemplate.count(countQuery, PlanTaskDetails.class);
+        log.info("PlanTaskDetails 鍦ㄥぇ浜� {} 鏃堕棿鍐呮湭鏌ヨ鍒版暟鎹� {} 鏉�", lastSynchronizeTime, totalPlanTaskDetailsCount);
+
+        if (totalPlanTaskDetailsCount == 0) {
+            return;
+        }
+
+        saveSynchronizeTime(synchronizeTime, now);
+
+        long skip = totalPlanTaskDetailsCount / 10000;
+        if (totalPlanTaskDetailsCount % 10000 > 0) {
+            skip++;
+        }
+
+        long totalPlanModuleCount = mongoTemplate.count(countQuery, PlanModule.class);
+
+        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, PlanModule.class);
+
+        for (int i = 0; i < skip; i++) {
+            countQuery.skip(i * 10000L);
+            countQuery.limit(10000);
+            List<PlanTaskDetails> planTaskDetails = mongoTemplate.find(countQuery, PlanTaskDetails.class);
+            log.info("绗瑊}娆℃煡璇� planTaskDetails count:{}", i + 1, planTaskDetails.size());
+            // 鑾峰彇瀵瑰簲妗f锛屽彇subjectId 鍜� randomId
+            List<UserArchiveMapping> userArchiveMappings = queryArchiveMapping(planTaskDetails);
+            List<UserArchive> userArchives = queryArchive(userArchiveMappings);
+
+            List<Project> projects = queryProjct(planTaskDetails);
+            List<Site> sites = querySites(userArchiveMappings);
+
+            List<PlanTask> planTasks = queryPlanTasks(planTaskDetails);
+            List<Plan> plans = queryPlans(planTasks);
+            List<PlanTaskModuleRelate> planMoudleRelates = queryPlanMoudleRelates(planTasks);
+            List<PlanTaskDetailsModule> planTaskDetailsModules = queryPlanTaskDetaiMoudles(planTaskDetails);
+
+            Map<Long, String> relationNameMap = queryRelateMoudleName(planMoudleRelates);
+
+            Map<Long, Map<String, String>> resultMap = queryPlanTaskDetailResult(planTaskDetails);
+
+            Map<Long, Map<Long, Long>> digitalMedicalEventMap = queryDigitalMedicalEvent(planTaskDetails);
+            Map<Long, Map<Long, String>> digitalMedicalTypeMap = queryDigitalMedicalType(planTaskDetails);
+
+            List<PlanModule> planMoudles = new ArrayList<>();
+
+
+            //浠� planTaskDetail 鍜� planMoudleRelate 涓哄熀鍑�
+            // 涓€涓� planTaskDetail 鑳藉搴斿涓� planMoudleRelate锛屽嵆涓€娆′换鍔¢厤缃簡澶氬皯涓ā鍧楋紙闂嵎锛岄噺琛紝鏁板瓧闈剁偣锛�
+            for (PlanTaskDetails planTaskDetail : planTaskDetails) {
+                UserArchiveMapping userArchiveMapping = userArchiveMappings.stream().filter(x -> x.getPatientCode().equals(planTaskDetail.getPatientCode())).findFirst().orElse(null);
+
+                UserArchive userArchive = userArchives.stream().filter(x -> Objects.nonNull(userArchiveMapping) && x.getId().equals(userArchiveMapping.getUserArchiveId())).findFirst().orElse(null);
+
+                Project project = projects.stream().filter(x -> x.getId().equals(planTaskDetail.getProjectId())).findFirst().orElse(null);
+
+                Site site = sites.stream().filter(x -> Objects.nonNull(userArchiveMapping) && x.getId().equals(userArchiveMapping.getSiteId())).findFirst().orElse(null);
+
+                PlanTask planTask = planTasks.stream().filter(x -> x.getId().equals(planTaskDetail.getPlanTaskId())).findFirst().orElse(null);
+
+                Plan plan = plans.stream().filter(x -> Objects.nonNull(planTask) && x.getId().equals(planTask.getPlanId())).findFirst().orElse(null);
+
+                List<PlanTaskModuleRelate> relates = planMoudleRelates.stream().filter(x -> Objects.nonNull(planTask) && x.getPlanTaskId().equals(planTask.getId())).collect(Collectors.toList());
+
+                List<PlanTaskDetailsModule> modules = planTaskDetailsModules.stream().filter(x -> Objects.nonNull(planTaskDetail) && x.getPlanTaskDetailsId().equals(planTaskDetail.getId())).collect(Collectors.toList());
+
+                for (PlanTaskModuleRelate relate : relates) {
+                    PlanModule planMoudle = new PlanModule();
+
+                    planMoudle.setKey(planTaskDetail.getId() + String.valueOf(relate.getId()));
+
+                    if (Objects.nonNull(userArchive)) {
+                        planMoudle.setSubjectId(userArchive.getSubjectId());
+                        planMoudle.setRandomizationId(userArchive.getRandomizationId());
+                    }
+
+                    if (Objects.nonNull(project)) {
+
+                        planMoudle.setProjectName(project.getName());
+                    }
+                    if (Objects.nonNull(site)) {
+                        planMoudle.setSiteName(site.getSiteName());
+                    }
+
+                    if (Objects.nonNull(plan)) {
+                        planMoudle.setPlanId(plan.getId());
+                        planMoudle.setPlanCode(plan.getNumber());
+                        planMoudle.setPlanEffectiveDate(parseTimeFromDate(plan.getEffectiveDate()));
+                        planMoudle.setPlanDuration(plan.getDays());
+                    }
+
+                    if (Objects.nonNull(planTask)) {
+                        planMoudle.setPlanTaskName(planTask.getName());
+                        planMoudle.setPlanTaskdescription(planTask.getDescription());
+                        planMoudle.setPlanTaskType(planTask.getTaskType());
+                        planMoudle.setPlanTaskTaskCount(planTask.getTaskCount());
+                        planMoudle.setPlanTaskFinishDay(planTask.getFinishDay());
+                        planMoudle.setPlanTaskLoopType(planTask.getLoopType());
+                        planMoudle.setPlanTaskEnabled(planTask.getEnabled());
+                        planMoudle.setPlanTaskIsCirculation(planTask.getIsCirculation());
+                        planMoudle.setPlanTaskBeginDay(planTask.getBeginDay());
+                        planMoudle.setPlanTaskCirculationDay(planTask.getCirculationDay());
+                        planMoudle.setPlanTaskWindowPhase(planTask.getWindowPhase());
+                        planMoudle.setPlanTaskEndDay(planTask.getEndDay());
+                    }
+
+                    if (Objects.nonNull(planTaskDetail)) {
+                        planMoudle.setProjectCode(String.valueOf(planTaskDetail.getProjectId()));
+                        planMoudle.setTaskStartDate(planTaskDetail.getStartDate());
+                        planMoudle.setTaskEndDate(planTaskDetail.getEndDate());
+                        planMoudle.setTaskCompleteStatus(planTaskDetail.getCompleteStatus());
+                        planMoudle.setTaskCompleteTime(planTaskDetail.getCompleteTime());
+                        planMoudle.setTaskEnabled(planTaskDetail.getEnabled());
+                        planMoudle.setTaskCompleteOrder(planTaskDetail.getCompleteOrder());
+                    }
+
+                    if (Objects.nonNull(relate)) {
+                        planMoudle.setModuleType(relate.getRelationType());
+                        planMoudle.setModuleId(relate.getRelationId());
+                    }
+
+                    if (MapUtil.isNotEmpty(relationNameMap) && Objects.nonNull(relationNameMap.get(relate.getRelationId()))) {
+                        planMoudle.setModuleName(relationNameMap.get(relate.getRelationId()));
+                    }
+
+                    if (MapUtil.isNotEmpty(resultMap)) {
+                        Map<String, String> planTaskDetailMap = resultMap.get(planTaskDetail.getId());
+
+                        if (MapUtil.isNotEmpty(planTaskDetailMap)) {
+                            String result = planTaskDetailMap.get(String.valueOf(relate.getRelationId()));
+                            if (!StringUtils.isEmpty(result)) {
+                                planMoudle.setResult(result);
+                            }
+                        }
+                    }
+
+                    if (relate.getRelationType().equals("DIGITAL_MEDICAL")) {
+                        if (MapUtil.isNotEmpty(digitalMedicalEventMap)) {
+                            Map<Long, Long> eventMap = digitalMedicalEventMap.get(planTaskDetail.getId());
+                            if (MapUtil.isNotEmpty(eventMap)) {
+                                Long eventId = eventMap.get(relate.getRelationId());
+                                if (Objects.nonNull(eventId)) {
+                                    planMoudle.setDigitalModuleEventId(eventId);
+                                }
+                            }
+                        }
+                        if (MapUtil.isNotEmpty(digitalMedicalTypeMap)) {
+                            Map<Long, String> typeMap = digitalMedicalTypeMap.get(planTaskDetail.getId());
+                            if (MapUtil.isNotEmpty(typeMap)) {
+                                String eventType = typeMap.get(relate.getRelationId());
+                                if (Objects.nonNull(eventType)) {
+                                    String tableName = TableEnum.getTableNameByType(eventType);
+                                    if (Objects.nonNull(tableName)) {
+                                        planMoudle.setDigitalModuleTableName(tableName);
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    PlanTaskDetailsModule module = modules.stream().filter(x -> x.getRelationId().equals(relate.getRelationId())).findFirst().orElse(null);
+                    if (Objects.nonNull(module)) {
+                        planMoudle.setModuleComplete(module.getModuleComplete());
+                        planMoudle.setModuleIgnoreRemark(module.getIgnoreRemark());
+                        if (Objects.nonNull(module.getModuleComplete()) && module.getModuleComplete().equals(1)) {
+                            planMoudle.setModuleFinishTime(module.getLastModifiedAt());
+                        }
+                    } else {
+                        planMoudle.setModuleComplete(0);
+                    }
+
+                    // 鏄惁绗竴娆″叏閲忔彃鍏�
+                    if (totalPlanModuleCount > 0) {
+                        Query upsertQuery = new Query(Criteria.where("key").is(planMoudle.getKey()));
+                        Update update = buildUpdate(planMoudle);
+                        bulkOps.upsert(upsertQuery, update);
+                    }
+                    planMoudles.add(planMoudle);
+                }
+            }
+
+            // 鏄惁绗竴娆″叏閲忔彃鍏�
+            if (totalPlanModuleCount > 0) {
+                bulkOps.execute();
+                log.info("bulkOps 鏇存柊鎴栨柊澧�:{} 鏉�", planMoudles.size());
+            } else {
+                if (!CollectionUtils.isEmpty(planMoudles)) {
+                    mongoTemplate.insert(planMoudles, PlanModule.class);
+                    log.info("mongoTemplate 鐩存帴鏂板:{} 鏉�", planMoudles.size());
+                }
+            }
+
+        }
+
+        log.info("synchronizePlanTask end, 鑰楁椂:{} 绉�", LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) - now.toEpochSecond(ZoneOffset.of("+8")));
+
+    }
+
+    private SynchronizeTime findSynchronizeTime() {
+        Query query = new Query().limit(1);
+        return mongoTemplate.findOne(query, SynchronizeTime.class);
+    }
+
+    private void saveSynchronizeTime(SynchronizeTime synchronizeTime, LocalDateTime now) {
+        if (Objects.isNull(synchronizeTime)) {
+            SynchronizeTime time = new SynchronizeTime();
+            time.setPlan(now);
+            mongoTemplate.save(time);
+        } else {
+            Query updateQuery = new Query();
+            updateQuery.addCriteria(Criteria.where("_id").is(synchronizeTime.get_id()));
+            Update update = new Update();
+            update.set("plan", now);
+            mongoTemplate.updateFirst(updateQuery, update, SynchronizeTime.class);
+        }
+    }
+
+    private Update buildUpdate(PlanModule planMoudle) {
+        return new Update()
+                .set("key", planMoudle.getKey())
+                .set("subjectId", planMoudle.getSubjectId())
+                .set("randomizationId", planMoudle.getRandomizationId())
+                .set("projectCode", planMoudle.getProjectCode())
+                .set("projectName", planMoudle.getProjectName())
+                .set("siteName", planMoudle.getSiteName())
+                .set("planId", planMoudle.getPlanId())
+                .set("planCode", planMoudle.getPlanCode())
+                .set("planDuration", planMoudle.getPlanDuration())
+                .set("planTaskName", planMoudle.getPlanTaskName())
+                .set("planTaskdescription", planMoudle.getPlanTaskdescription())
+                .set("planTaskType", planMoudle.getPlanTaskType())
+                .set("planTaskTaskCount", planMoudle.getPlanTaskTaskCount())
+                .set("planTaskFinishDay", planMoudle.getPlanTaskFinishDay())
+                .set("planTaskLoopType", planMoudle.getPlanTaskLoopType())
+                .set("planTaskEnabled", planMoudle.getPlanTaskEnabled())
+                .set("planTaskIsCirculation", planMoudle.getPlanTaskIsCirculation())
+                .set("planTaskBeginDay", planMoudle.getPlanTaskBeginDay())
+                .set("planTaskCirculationDay", planMoudle.getPlanTaskCirculationDay())
+                .set("planTaskWindowPhase", planMoudle.getPlanTaskWindowPhase())
+                .set("planTaskEndDay", planMoudle.getPlanTaskEndDay())
+                .set("taskStartDate", planMoudle.getTaskStartDate())
+                .set("taskEndDate", planMoudle.getTaskEndDate())
+                .set("taskCompleteStatus", planMoudle.getTaskCompleteStatus())
+                .set("taskCompleteTime", planMoudle.getTaskCompleteTime())
+                .set("taskEnabled", planMoudle.getTaskEndDate())
+                .set("taskCompleteOrder", planMoudle.getTaskCompleteOrder())
+                .set("moduleType", planMoudle.getModuleType())
+                .set("moduleId", planMoudle.getModuleId())
+                .set("moduleName", planMoudle.getModuleName())
+                .set("moduleComplete", planMoudle.getModuleComplete())
+                .set("moduleIgnoreRemark", planMoudle.getModuleIgnoreRemark())
+                .set("moduleFinishTime", planMoudle.getModuleFinishTime())
+                .set("result", planMoudle.getResult())
+                .set("digitalModuleTableName", planMoudle.getDigitalModuleTableName())
+                .set("digitalModuleEventId", planMoudle.getDigitalModuleEventId())
+                .set("planEffectiveDate", planMoudle.getPlanEffectiveDate());
+    }
+
+    @Override
+    public void test() {
+
+    }
+
+
+    private String parseTimeFromDate(LocalDate timeStr) {
+        LocalDateTime localDateTime = timeStr.atStartOfDay();
+        DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        return localDateTime.format(fmt);
+    }
+
+    private List<PlanTaskDetailsModule> queryPlanTaskDetaiMoudles(List<PlanTaskDetails> planTaskDetails) {
+
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new ArrayList<>();
+        }
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_task_details_id").in(planTskDetailIds)), PlanTaskDetailsModule.class);
+
+    }
+
+    private Map<Long, Map<Long, String>> queryDigitalMedicalType(List<PlanTaskDetails> planTaskDetails) {
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new HashMap<>();
+        }
+
+        Map<Long, List<ClinicalTrialsEvent>> eventMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_details_id").in(planTskDetailIds).and("relation_type").is("DIGITAL_MEDICAL")), ClinicalTrialsEvent.class)
+                .stream().collect(Collectors.groupingBy(ClinicalTrialsEvent::getPlanDetailsId));
+
+        Map<Long, Map<Long, String>> map = new HashMap<>();
+        eventMap.forEach((k, v) -> {
+            Map<Long, String> innerMap = new HashMap<>();
+            if (!CollectionUtils.isEmpty(v)) {
+                v.forEach(event -> {
+                    innerMap.put(event.getRelationId(), event.getModuleItemType());
+                });
+                map.put(k, innerMap);
+            }
+        });
+
+        return map;
+    }
+
+    private Map<Long, Map<Long, Long>> queryDigitalMedicalEvent(List<PlanTaskDetails> planTaskDetails) {
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new HashMap<>();
+        }
+
+        Map<Long, List<ClinicalTrialsEvent>> eventMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_details_id").in(planTskDetailIds).and("relation_type").is("DIGITAL_MEDICAL")), ClinicalTrialsEvent.class)
+                .stream().collect(Collectors.groupingBy(ClinicalTrialsEvent::getPlanDetailsId));
+
+        Map<Long, Map<Long, Long>> map = new HashMap<>();
+        eventMap.forEach((k, v) -> {
+            Map<Long, Long> innerMap = new HashMap<>();
+            if (!CollectionUtils.isEmpty(v)) {
+                v.forEach(event -> {
+                    innerMap.put(event.getRelationId(), event.getEventId());
+                });
+                map.put(k, innerMap);
+            }
+        });
+
+        return map;
+    }
+
+    private Map<Long, Map<String, String>> queryPlanTaskDetailResult(List<PlanTaskDetails> planTaskDetails) {
+        Map<Long, Map<String, String>> map = new HashMap<>();
+        Map<Long, Map<String, String>> scaleMap = queryScaleResult(planTaskDetails);
+        map.putAll(scaleMap);
+        Map<Long, Map<String, String>> questonaireMap = queryQuestionaireResult(planTaskDetails);
+
+        questonaireMap.forEach((k, v) -> {
+            if (map.containsKey(k)) {
+                map.get(k).putAll(v);
+            } else {
+                map.put(k, v);
+            }
+        });
+
+        Map<Long, Map<String, String>> crfMap = queryCrfResult(planTaskDetails);
+        crfMap.forEach((k, v) -> {
+            if (map.containsKey(k)) {
+                map.get(k).putAll(v);
+            } else {
+                map.put(k, v);
+            }
+        });
+
+        return map;
+    }
+
+    private Map<Long, Map<String, String>> queryCrfResult(List<PlanTaskDetails> planTaskDetails) {
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new HashMap<>();
+        }
+
+        List<CrfAnswer> crfAnswers = mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_task_details_id").in(planTskDetailIds)), CrfAnswer.class);
+
+        Map<Long, List<CrfAnswer>> crfAnswersMap = crfAnswers.stream().collect(Collectors.groupingBy(CrfAnswer::getPlanTaskDetailsId));
+
+        Set<Long> crfIds = crfAnswers.stream().map(CrfAnswer::getCrfId).collect(Collectors.toSet());
+        Map<Long, String> crfMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(crfIds)), Crf.class)
+                .stream().collect(Collectors.toMap(Crf::getId, Crf::getQuestionJson, (k1, k2) -> k2));
+
+        Map<Long, Map<String, String>> map = new HashMap<>();
+        crfAnswersMap.forEach((k, v) -> {
+            if (!CollectionUtils.isEmpty(v)) {
+                Map<String, String> innerMap = new HashMap<>();
+                v.forEach(crfAnswer -> {
+                    String questionJson = crfMap.get(crfAnswer.getCrfId());
+                    if (Objects.nonNull(questionJson) && Objects.nonNull(crfAnswer.getAnswerJson())) {
+                        try {
+                            String result = CrfUtil.parseCrfProblemAndAnswer(questionJson, crfAnswer.getAnswerJson());
+                            if (Objects.nonNull(result)) {
+                                innerMap.put(crfAnswer.getCrfTopId().toString(), result);
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+
+                        }
+                    }
+                });
+                map.put(k, innerMap);
+            }
+        });
+
+        return map;
+    }
+
+    private Map<Long, Map<String, String>> queryQuestionaireResult(List<PlanTaskDetails> planTaskDetails) {
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new HashMap<>();
+        }
+
+        List<QuestionnaireAnswerRecord> records = mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_task_details_id").in(planTskDetailIds)), QuestionnaireAnswerRecord.class);
+
+        if (CollectionUtils.isEmpty(records)) {
+            return new HashMap<>();
+        }
+
+        Set<Long> recordIds = records.stream().map(QuestionnaireAnswerRecord::getId).collect(Collectors.toSet());
+        List<QuestionnaireAnswer> answers = mongoTemplate.find(new Query().addCriteria(Criteria.where("record_id").in(recordIds)), QuestionnaireAnswer.class);
+
+        Set<Long> ansowerIds = answers.stream().map(QuestionnaireAnswer::getId).collect(Collectors.toSet());
+        List<QuestionnaireAnswerOption> answerOptions = mongoTemplate.find(new Query().addCriteria(Criteria.where("answer_id").in(ansowerIds)), QuestionnaireAnswerOption.class);
+
+        Map<Long, Map<String, String>> map = new HashMap<>();
+
+        for (QuestionnaireAnswerRecord record : records) {
+
+            List<QuestionnaireAnswer> answerList = answers.stream().filter(x -> x.getRecordId().equals(record.getId())).collect(Collectors.toList());
+
+            Map<String, String> resultMap = new HashMap<>();
+            List<String> keyValueNewVos = new ArrayList<>();
+            for (QuestionnaireAnswer answer : answerList) {
+                Stream<QuestionnaireAnswerOption> questionnaireAnswerOptionStream = answerOptions.stream().filter(x -> x.getAnswerId().equals(answer.getId()) && x.getQuestionId().equals(answer.getQuestionId()));
+                Optional<QuestionnaireAnswerOption> optionalAnswerOption = questionnaireAnswerOptionStream.findAny();
+
+                switch (answer.getType()) {
+                    case "CHOICE":
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + optionalAnswerOption.map(QuestionnaireAnswerOption::getOptionName).orElse("-"));
+                        break;
+                    case "SLIDE":
+                    case "DATE_SELECT":
+                    case "NUMBER":
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + optionalAnswerOption.map(option -> String.valueOf(option.getNumberAnswer())).orElse("-"));
+                        break;
+                    case "MULTIPLE_CHOICE":
+                        List<String> optionNames = answerOptions.stream()
+                                .filter(x -> x.getAnswerId().equals(answer.getId()) && x.getQuestionId().equals(answer.getQuestionId()))
+                                .map(QuestionnaireAnswerOption::getOptionName)
+                                .collect(Collectors.toList());
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + (optionNames.isEmpty() ? "-" : String.join(",", optionNames)));
+                        break;
+                    case "DATE":
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + optionalAnswerOption.map(QuestionnaireAnswerOption::getDateAt).orElse("-"));
+                        break;
+
+                    case "SECTION_NUMBER":
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + (optionalAnswerOption.map(option -> option.getLeftMin() + "-" + option.getRightMax()).orElse("-")));
+                        break;
+                    case "TEXT":
+                        keyValueNewVos.add(answer.getQuestionName() + ":" + optionalAnswerOption.map(QuestionnaireAnswerOption::getContent).orElse("-"));
+                        break;
+                }
+            }
+            resultMap.put(String.valueOf(record.getTopId()), JSONUtil.toJsonStr(keyValueNewVos));
+            map.put(record.getPlanTaskDetailsId(), resultMap);
+        }
+
+        return map;
+    }
+
+    private Map<Long, Map<String, String>> queryScaleResult(List<PlanTaskDetails> planTaskDetails) {
+        Set<Long> planTskDetailIds = planTaskDetails.stream().map(PlanTaskDetails::getId).collect(Collectors.toSet());
+        if (CollectionUtils.isEmpty(planTskDetailIds)) {
+            return new HashMap<>();
+        }
+
+        Map<Long, List<PatientScaleEvaluatingEntity>> scaleEvaluatMap =
+                mongoTemplate.find(new Query().addCriteria(Criteria.where("plan_task_details_id").in(planTskDetailIds)), PatientScaleEvaluatingEntity.class)
+                        .stream().collect(Collectors.groupingBy(PatientScaleEvaluatingEntity::getPlanTaskDetailsId));
+
+        Map<Long, Map<String, String>> map = new HashMap<>();
+
+        scaleEvaluatMap.forEach((k, v) -> {
+            if (!CollectionUtils.isEmpty(v)) {
+                Map<String, String> result = new HashMap<>();
+                v.forEach(item -> {
+                    List<String> sb = new ArrayList<>();
+                    if (Objects.nonNull(item.getScaleResult())) {
+                        sb.add("result:" + item.getScaleResult());
+                    }
+                    if (Objects.nonNull(item.getTotalScore())) {
+                        sb.add("totalScore:" + item.getTotalScore());
+                    }
+                    if (!CollectionUtils.isEmpty(sb)) {
+                        result.put(item.getScaleCode(), JSONUtil.toJsonStr(sb));
+                    }
+
+                });
+
+                map.put(k, result);
+            }
+        });
+
+        return map;
+    }
+
+    private Map<Long, String> queryRelateMoudleName(List<PlanTaskModuleRelate> planMoudleRelates) {
+        /**
+         * QUESTIONNAIRE 1
+         * SCALE 1
+         * DIGITAL_MEDICAL
+         * CRF 1
+         * COLLECT_FLOW
+         *
+         * INTELLIGENT_DEVICE
+         * EXERCISE_MODULE
+         *
+         * E_DIARY
+         */
+        Map<Long, String> map = new HashMap<>();
+        List<Long> questionnaireIds = planMoudleRelates.stream().filter(relate -> relate.getRelationType().equals("QUESTIONNAIRE")).map(PlanTaskModuleRelate::getRelationId).collect(Collectors.toList());
+        Map<Long, String> questionaireMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("top_id").in(questionnaireIds)), Questionnaire.class)
+                .stream().collect(Collectors.toMap(Questionnaire::getTopId, Questionnaire::getName, (k1, k2) -> k2));
+        if (MapUtil.isNotEmpty(questionaireMap)) {
+            map.putAll(questionaireMap);
+        }
+
+        List<Long> crfTopIds = planMoudleRelates.stream().filter(relate -> relate.getRelationType().equals("CRF")).map(PlanTaskModuleRelate::getRelationId).collect(Collectors.toList());
+        Map<Long, String> crfMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("crf_top_id").in(crfTopIds)), Crf.class)
+                .stream().collect(Collectors.toMap(Crf::getCrfTopId, Crf::getName, (k1, k2) -> k2));
+        if (MapUtil.isNotEmpty(crfMap)) {
+            map.putAll(crfMap);
+        }
+
+        List<Long> scaleIds = planMoudleRelates.stream().filter(relate -> relate.getRelationType().equals("SCALE")).map(PlanTaskModuleRelate::getRelationId).collect(Collectors.toList());
+        Map<Long, String> scaleMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(scaleIds)), ScaleModuleDetailsEntity.class)
+                .stream().collect(Collectors.toMap(ScaleModuleDetailsEntity::getId, ScaleModuleDetailsEntity::getName, (k1, k2) -> k2));
+        if (MapUtil.isNotEmpty(scaleMap)) {
+            map.putAll(scaleMap);
+        }
+
+        List<Long> digitalMedicalIds = planMoudleRelates.stream().filter(relate -> relate.getRelationType().equals("DIGITAL_MEDICAL")).map(PlanTaskModuleRelate::getRelationId).collect(Collectors.toList());
+        Map<Long, String> digitalMedicalMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(digitalMedicalIds)), DigitalMedicalDetails.class)
+                .stream().collect(Collectors.toMap(DigitalMedicalDetails::getId, DigitalMedicalDetails::getName, (k1, k2) -> k2));
+        if (MapUtil.isNotEmpty(digitalMedicalMap)) {
+            map.putAll(digitalMedicalMap);
+        }
+
+        List<Long> collectMoudleIds = planMoudleRelates.stream().filter(relate -> relate.getRelationType().equals("COLLECT_FLOW")).map(PlanTaskModuleRelate::getRelationId).collect(Collectors.toList());
+        Map<Long, String> collectMoudleMap = mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(collectMoudleIds)), CollectModule.class)
+                .stream().collect(Collectors.toMap(CollectModule::getId, CollectModule::getName, (k1, k2) -> k2));
+        if (MapUtil.isNotEmpty(collectMoudleMap)) {
+            map.putAll(collectMoudleMap);
+        }
+
+        return map;
+    }
+
+    private List<UserArchiveMapping> queryArchiveMapping(List<PlanTaskDetails> planTaskDetails) {
+        List<String> patientCodes = planTaskDetails.stream().map(PlanTaskDetails::getPatientCode).collect(Collectors.toList());
+        Query archiveMappingquery = new Query();
+        archiveMappingquery.addCriteria(Criteria.where("patient_code").in(patientCodes));
+        return mongoTemplate.find(archiveMappingquery, UserArchiveMapping.class);
+    }
+
+    private List<PlanTaskModuleRelate> queryPlanMoudleRelates(List<PlanTask> planTasks) {
+        List<Long> planTaskIds = planTasks.stream().map(PlanTask::getId).collect(Collectors.toList());
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("planTaskId").in(planTaskIds)), PlanTaskModuleRelate.class);
+    }
+
+    private List<Site> querySites(List<UserArchiveMapping> userArchiveMappings) {
+        List<Long> siteIds = userArchiveMappings.stream().map(UserArchiveMapping::getSiteId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(siteIds)) {
+            return new ArrayList<>();
+        }
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(siteIds)),
+                Site.class);
+    }
+
+    private List<Project> queryProjct(List<PlanTaskDetails> planTaskDetails) {
+        List<Long> projectIds = planTaskDetails.stream().map(PlanTaskDetails::getProjectId).collect(Collectors.toList());
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(projectIds)), Project.class);
+    }
+
+    private List<Plan> queryPlans(List<PlanTask> planTasks) {
+        List<Long> planIds = planTasks.stream().map(PlanTask::getPlanId).collect(Collectors.toList());
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(planIds)),
+                Plan.class);
+    }
+
+    private List<PlanTask> queryPlanTasks(List<PlanTaskDetails> planTaskDetails) {
+        List<Long> planTaskIds = planTaskDetails.stream().map(PlanTaskDetails::getPlanTaskId).collect(Collectors.toList());
+        return mongoTemplate.find(new Query().addCriteria(Criteria.where("id").in(planTaskIds)),
+                PlanTask.class);
+    }
+
+    private List<UserArchive> queryArchive(List<UserArchiveMapping> userArchiveMappings) {
+        List<String> archiveIds = userArchiveMappings
+                .stream().map(UserArchiveMapping::getUserArchiveId).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(archiveIds)) {
+            return new ArrayList<>();
+        }
+        return mongoArchiveTemplate.find(new Query().addCriteria(Criteria.where("_id").in(archiveIds)),
+                UserArchive.class);
+    }
+}
diff --git a/src/main/java/com/luca/pilot/util/CrfUtil.java b/src/main/java/com/luca/pilot/util/CrfUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..6efcca4e435e15628b016aa19146018414131092
--- /dev/null
+++ b/src/main/java/com/luca/pilot/util/CrfUtil.java
@@ -0,0 +1,228 @@
+package com.luca.pilot.util;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.luca.pilot.bizEnum.CrfQuestionTypeEnum;
+import com.luca.pilot.bo.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class CrfUtil {
+
+    public static String parseCrfProblemAndAnswer(String crfProblemJson, String crfAswerJson) {
+        if (Objects.isNull(crfProblemJson) || "".equals(crfProblemJson)
+                || Objects.isNull(crfAswerJson) || "".equals(crfAswerJson)) {
+            return "";
+        }
+
+        List<CrfProblemBo> crfProblemBos = crfProblemJsonAnalysisNew(crfProblemJson);
+
+        List<String> dataIds = crfProblemBos.stream().map(CrfProblemBo::getDataBo).filter(Objects::nonNull).collect(Collectors.toList())
+                .stream().map(BindDataBo::getDataId).collect(Collectors.toList());
+
+        List<CrfJsonValueBo> crfJsonValueBos = crfJsonAnalysis(crfAswerJson);
+
+        List<String> crfAswers = new ArrayList<>();
+        crfJsonValueBos.stream().filter(x -> dataIds.contains(x.getKey())).forEach(item -> {
+            if (Objects.nonNull(item.getName()) && Objects.nonNull(item.getText())) {
+                crfAswers.add(item.getName() + ":" + item.getText());
+            }
+        });
+        if (CollectionUtil.isEmpty(crfAswers)) {
+            return null;
+        }
+        return JSONUtil.toJsonStr(crfAswers);
+    }
+
+    /**
+     * crf 闂json 瑙f瀽
+     */
+    public static List<CrfProblemBo> crfProblemJsonAnalysisNew(String crfProblemJson) {
+        if (Objects.isNull(crfProblemJson) || "".equals(crfProblemJson)) {
+            return Collections.emptyList();
+        }
+        var jsonObject = JSONObject.parseObject(crfProblemJson, Feature.OrderedField);
+        if (jsonObject == null) {
+            return Collections.emptyList();
+        }
+        List<JSONObject> bos = new ArrayList<>();
+        problemJsonNew(bos, jsonObject, null);
+
+        if (CollectionUtil.isEmpty(bos)) {
+            return Collections.emptyList();
+        }
+        return bos.stream().filter(item -> Objects.nonNull(item.get("questionType"))).map(item -> {
+            var crfProblemBo = new CrfProblemBo()
+                    .setTitle(String.valueOf(item.get("title")))
+                    .setProperties(JSONObject.toJSONString(item.get("properties")))
+                    .setQuestionType(CrfQuestionTypeEnum.getDeviceEnum(JSONObject.toJSONString(item.get("questionType")).replace("\"", "")));
+            var bindData = JSONObject.toJSONString(item.get("BindData"));
+            if (!"".equals(bindData)) {
+                crfProblemBo.setDataBo(
+                        new BindDataBo()
+                                .setDataId(JSONObject.parseObject(bindData).getString("dataId"))
+                                .setDataType(JSONObject.parseObject(bindData).getString("dataType"))
+                                .setChoiceField(JSONObject.parseObject(bindData).getString("choiceField"))
+                );
+            }
+            return crfProblemBo;
+        }).collect(Collectors.toList());
+    }
+
+    private static void problemJsonNew(List<JSONObject> array, JSONObject data, String prefix) {
+        if (Objects.isNull(data)) {
+            return;
+        }
+
+        var title = data.get("title");
+        if (Objects.nonNull(prefix)) {
+            title = prefix + "," + title;
+            data.put("title", title);
+
+        }
+        var properties = data.get("properties");
+        if (Objects.isNull(properties)) {
+            var columns = data.get("columns");
+            var defaultValue = data.get("defaultValue");
+            if (Objects.isNull(defaultValue)) {
+                array.add(data);
+                return;
+            }
+            try {
+                var head = JSONObject.parseObject(data.get("BindData").toString(), Feature.OrderedField).get("dataId").toString();
+                var columnsBos = JSONObject.parseArray(JSONObject.toJSONString(columns), CrfTableJsonTopicBo.class).stream()
+                        .filter(bo -> !"title".equals(bo.getDataIndex())) // 鍘绘帀鏈€宸︿竴鍒� dataIndex 涓� title 鐨勫垪
+                        .collect(Collectors.toList());
+                var defaultValueBos = JSONObject.parseArray(JSONObject.toJSONString(defaultValue), CrfTableJsonTopicBo.class);
+                for (int i = 0; i < columnsBos.size(); i++) {
+                    for (int j = 0; j < defaultValueBos.size(); j++) {
+                        JSONObject jsonObject = new JSONObject();
+                        jsonObject.put("title", title + "," + defaultValueBos.get(j).getTitle() + "-" + columnsBos.get(i).getTitle());
+                        jsonObject.put("questionType", CrfQuestionTypeEnum.CRFTABLE.getCode());
+                        jsonObject.put("BindData",
+                                new BindDataBo()
+                                        .setChoiceField("MH")
+                                        .setDataType("CUSTOMIZE")
+                                        .setDataId(head + "-" + columnsBos.get(i).getDataIndex() + "-" + defaultValueBos.get(j).getId())
+                        );
+                        array.add(jsonObject);
+                    }
+                }
+            } catch (Exception e) {
+                array.add(data);
+                return;
+            }
+            return;
+        }
+
+        var propertiesJsonObject = JSONObject.parseObject(properties.toString(), Feature.OrderedField);
+        array.add(data);
+        var keySet = propertiesJsonObject.keySet();
+        var collect = keySet.stream().map(key -> JSONObject.parseObject(JSONObject.toJSONString(propertiesJsonObject.get(key)), Feature.OrderedField)).collect(Collectors.toList());
+        for (JSONObject item : collect) {
+            problemJsonNew(array, item, Objects.nonNull(title) ? title.toString() : null);
+        }
+    }
+
+    /**
+     * crf 绛旀json 瑙f瀽
+     */
+    public static List<CrfJsonValueBo> crfJsonAnalysis(String crfJson) {
+        Map<String, String> map = new HashMap<>();
+        if (Objects.isNull(crfJson) || "".equals(crfJson)) {
+            return Collections.emptyList();
+        }
+        var jsonObject = JSONObject.parseObject(crfJson);
+        if (jsonObject == null) {
+            return Collections.emptyList();
+        }
+        var formStr = JSONObject.toJSONString(jsonObject.get("form"));
+        if ("".equals(formStr)) {
+            return Collections.emptyList();
+        }
+        var array = JSONObject.parseArray(formStr, CrfJsonValueBo.class);
+        if (CollectionUtil.isNotEmpty(array)) {
+            var bos = jsonArray(array);
+            if (CollectionUtil.isEmpty(bos)) {
+                return Collections.emptyList();
+            }
+            var collect = bos.stream().map(item -> {
+                try {
+                    var boList = JSONObject.parseArray(item.getText(), CrfJsonValueKeyBo.class);
+                    if (CollectionUtil.isEmpty(boList)) {
+                        return null;
+                    }
+                    List<CrfJsonValueBo> valueBos = new ArrayList<>();
+                    var colKey = JSONObject.parseArray(boList.get(0).getColKey());
+                    for (int i = 0; i < colKey.size(); i++) {
+                        for (CrfJsonValueKeyBo crfJsonValueKeyBo : boList) {
+                            var valueArray = JSONObject.parseArray(crfJsonValueKeyBo.getValue());
+                            valueBos.add(
+                                    new CrfJsonValueBo()
+                                            .setKey(item.getKey() + "-" + colKey.get(i) + "-" + crfJsonValueKeyBo.getId())
+                                            .setName(crfJsonValueKeyBo.getTitle())
+                                            .setValue(crfJsonValueKeyBo.getValue())
+                                            .setText(Objects.isNull(valueArray.get(i)) ? "-" : valueArray.get(i).toString())
+                            );
+                        }
+                    }
+                    return valueBos;
+                } catch (Exception e) {
+                    // log.info("銆怌OPD-DATA-DOCTOR銆� 鈽� crf json 瑙f瀽寮傚父");
+                    return null;
+                }
+            }).filter(java.util.Objects::nonNull).collect(Collectors.toList());
+            if (CollectionUtil.isNotEmpty(collect)) {
+                collect.forEach(bos::addAll);
+            }
+            return bos.stream().peek(item -> {
+                item.setKeyPrefix(item.getKey());
+            }).collect(Collectors.toList());
+        }
+        return Collections.emptyList();
+    }
+
+
+    /**
+     * 閫掑綊瑙f瀽
+     *
+     * @param array
+     * @return
+     */
+    private static List<CrfJsonValueBo> jsonArray(List<CrfJsonValueBo> array) {
+        var collect = array.stream().filter(item -> Objects.nonNull(item.getValue()) && !"".equals(item.getValue())).collect(Collectors.toList());
+        if (CollectionUtil.isEmpty(collect)) {
+            return collect;
+        }
+        List<CrfJsonValueBo> bos = new ArrayList<>();
+        for (CrfJsonValueBo item : collect) {
+            if (Objects.nonNull(item) && Objects.nonNull(item.getValue()) && !"".equals(item.getValue()) && !"null".equals(item.getValue())) {
+                try {
+                    var boList = JSONObject.parseArray(item.getValue(), CrfJsonValueBo.class).stream().filter(Objects::nonNull).collect(Collectors.toList());
+                    if (CollectionUtil.isNotEmpty(boList)) {
+                        bos.addAll(jsonArray(boList));
+                    }
+                } catch (Exception e) {
+                    continue;
+                }
+            }
+        }
+        collect.addAll(bos);
+        return collect;
+    }
+
+    public static void main(String[] args) {
+
+        String a = "{\"form\":[{\"name\":\"鍩烘湰淇℃伅\",\"key\":\"baseInfo_q2OjsA\",\"value\":[{\"key\":\"patientType\",\"name\":\"缁勫埆\",\"value\":null,\"text\":null},{\"key\":\"patientName\",\"name\":\"鍞竴璇嗗埆鐮乗",\"value\":\"78N6A\",\"text\":\"78N6A\"},{\"key\":\"patientGender\",\"name\":\"鎬у埆\",\"value\":[\"F\"],\"text\":\"濂砛"},{\"key\":\"patientNation\",\"name\":\"姘戞棌\",\"value\":null,\"text\":null},{\"key\":\"patientBirthmonth\",\"name\":\"鍑虹敓骞存湀\",\"value\":\"19930509\",\"text\":\"19930509\"},{\"key\":\"patientAge\",\"name\":\"骞撮緞\",\"value\":\"29\",\"text\":\"29 宀乗"},{\"key\":\"patientHeight\",\"name\":\"韬珮\",\"value\":\"167\",\"text\":\"167 cm\"},{\"key\":\"patientWeight\",\"name\":\"浣撻噸\",\"value\":\"54\",\"text\":\"54 kg\"},{\"key\":\"tips\",\"name\":\"澶囨敞\",\"value\":null,\"text\":null}]},{\"name\":\"涓汉鍙瞈",\"key\":\"smokeHistory_2NufHa\",\"value\":[{\"key\":\"smokeHis\",\"name\":\"鍚哥儫鍙瞈",\"value\":[\"2\"],\"text\":\"鎴掔儫瓒呰繃1骞碶"},{\"key\":\"ApreviousSurgical\",\"name\":\"鏃㈠線鎵嬫湳鍙瞈",\"value\":null,\"text\":null},{\"key\":\"previousSurgical\",\"name\":\"鏃㈠線鎵嬫湳鍙�-鍚嶇О\",\"value\":null,\"text\":null},{\"key\":\"surgicalTime\",\"name\":\"鎵嬫湳鏃堕棿(骞存湀)\",\"value\":null,\"text\":null},{\"key\":\"AIndtoxins\",\"name\":\"宸ヤ笟姣掔墿鎺ヨЕ鍙瞈",\"value\":[\"0\"],\"text\":\"鏃燶"},{\"key\":\"Indtoxins\",\"name\":\"宸ヤ笟姣掔墿鎺ヨЕ鏃堕暱\",\"value\":null,\"text\":null},{\"key\":\"AdustRemoval\",\"name\":\"绮夊皹鎺ヨЕ\",\"value\":[\"1\"],\"text\":\"鏈塡"},{\"key\":\"dustRemoval\",\"name\":\"绮夊皹鎺ヨЕ鏃堕暱\",\"value\":null,\"text\":null},{\"key\":\"Aradioactive\",\"name\":\"鏀惧皠鎬х墿璐ㄦ帴瑙",\"value\":[\"0\"],\"text\":\"鏃燶"},{\"key\":\"radioactive\",\"name\":\"鏀惧皠鎬х墿璐ㄦ帴瑙︽椂闀縗",\"value\":null,\"text\":null},{\"key\":\"foodAllergies\",\"name\":\"椋熺墿杩囨晱鍙瞈",\"value\":[\"no\"],\"text\":\"鏃燶"},{\"key\":\"drugAllergies\",\"name\":\"鑽墿杩囨晱鍙瞈",\"value\":[\"yes\"],\"text\":\"鏈塡"},{\"key\":\"drugAllergiesother\",\"name\":\"鍏朵粬杩囨晱鍙�(濡傝姳绮�)\",\"value\":null,\"text\":null},{\"key\":\"familyAllergies\",\"name\":\"鐖舵瘝/绁栫埗姣嶆槸鍚︽湁杩囨晱\",\"value\":[\"yes\"],\"text\":\"鏈塡"},{\"key\":\"ispollutionpollution\",\"name\":\"鏄惁鏇鹃暱鏈燂紙澶т簬浜斿勾锛夋帴瑙︾┖姘旀薄鏌擄紵\",\"value\":[\"no\"],\"text\":\"鍚"},{\"key\":\"COVID\",\"name\":\"杩�1涓湀鏄惁鏂板啝鎰熸煋\",\"value\":[\"1\"],\"text\":\"鏄痋"}]},{\"name\":\"鐜扮梾鍙�(鍛煎惛绯荤粺鐤剧梾)-杩戜袱鍛╘",\"key\":\"CM_history_45UfkY\",\"value\":[{\"key\":\"nowDiseaseTime\",\"name\":\"褰撳墠鐤剧梾璇婃柇鏃堕棿\",\"value\":null,\"text\":null},{\"key\":\"isHot\",\"name\":\"鍙戠儹\",\"value\":null,\"text\":null},{\"key\":\"nasalObstruction\",\"name\":\"榧诲\",\"value\":null,\"text\":null},{\"key\":\"runNose\",\"name\":\"娴佹稌\",\"value\":null,\"text\":null},{\"key\":\"frequency\",\"name\":\"鍜冲椊(娌℃湁鎰熷啋鏃�)\",\"value\":null,\"text\":null},{\"key\":\"expectoration\",\"name\":\"鍜崇棸閲廫",\"value\":null,\"text\":null},{\"key\":\"vomicaNt\",\"name\":\"鍜宠創鐥癨",\"value\":null,\"text\":null},{\"key\":\"pant\",\"name\":\"鍛煎惛鍥伴毦\",\"value\":null,\"text\":null},{\"key\":\"isBlood\",\"name\":\"鍜\",\"value\":null,\"text\":null},{\"key\":\"chestPain\",\"name\":\"鑳哥棝\",\"value\":null,\"text\":null},{\"key\":\"otherqtzz\",\"name\":\"鍏朵粬鐥囩姸\",\"value\":null,\"text\":null},{\"key\":\"everyDayBreathBad\",\"name\":\"姣忓ぉ閮芥湁鍛煎惛鐥囩姸锛屽湪浣撳姏娲诲姩涔嬪悗鍠樻唻鍔犻噸\",\"value\":null,\"text\":null},{\"key\":\"nowWorseAir\",\"name\":\"鏄惁閬囧埌鍒烘縺鎬ф皵浣撶瓑杩囨晱鎬х墿璐紝鎴栬€呮儏缁縺鍔ㄦ椂锛屼細寮曞彂鍛煎惛閬撶棁鐘讹紝浣嗘槸涔嬪悗鑳芥仮澶嶆甯竆",\"value\":null,\"text\":null},{\"key\":\"NDDrugNameis\",\"name\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"value\":null,\"text\":null},{\"key\":\"XBSHDetail\",\"name\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"value\":null,\"text\":null}]},{\"name\":\"鐜扮梾鍙�(鍏朵粬鍛煎惛绯荤粺鐤剧梾)\",\"key\":\"CMO_history_g3RXLT\",\"value\":[{\"key\":\"isHaveOtherBreath\",\"name\":\"鏄惁鏈夊叾浠栧懠鍚哥郴缁熺柧鐥匼",\"value\":null,\"text\":null},{\"key\":\"otherDiseaseTime\",\"name\":\"璇婃柇鏃堕棿\",\"value\":null,\"text\":null},{\"key\":\"otherDiseaseName\",\"name\":\"鐤剧梾鍚嶇О\",\"value\":null,\"text\":null},{\"key\":\"NDOBDrugNameis\",\"name\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"value\":null,\"text\":null},{\"key\":\"XBSOBDetail\",\"name\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"value\":null,\"text\":null}]},{\"name\":\"鐜扮梾鍙�(闈炲懠鍚哥郴缁熺柧鐥�)\",\"key\":\"CMF_history_q4Z5Br\",\"value\":[{\"key\":\"isHaveFBreath\",\"name\":\"鏄惁鏈夐潪鍛煎惛绯荤粺鐤剧梾\",\"value\":null,\"text\":null},{\"key\":\"FDiseaseTime\",\"name\":\"璇婃柇鏃堕棿\",\"value\":null,\"text\":null},{\"key\":\"FDiseaseName\",\"name\":\"鐤剧梾鍚嶇О\",\"value\":null,\"text\":null},{\"key\":\"NDFDrugNameis\",\"name\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"value\":null,\"text\":null},{\"key\":\"XBSFDetail\",\"name\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"value\":null,\"text\":null}]},{\"name\":\"COPD杩囧幓1骞村唴鎬ユ€у姞閲嶆儏鍐�(浠匔OPD鎮h€呭~鍐�)\",\"key\":\"AEstatus_j4CJXr\",\"value\":[{\"key\":\"AETimes\",\"name\":\"AE鎬绘鏁癨",\"value\":null,\"text\":null},{\"key\":\"MidAE\",\"name\":\"涓害AE\",\"value\":null,\"text\":null},{\"key\":\"highAE\",\"name\":\"閲嶅害AE\",\"value\":null,\"text\":null}]},{\"name\":\"HRCT\",\"key\":\"lungCTcheck_qHV_iL\",\"value\":[{\"key\":\"HRCTclear\",\"name\":\"鏄惁宸插畬鎴怘RCT妫€鏌",\"value\":null,\"text\":null},{\"key\":\"HRCTtime\",\"name\":\"HRCT妫€鏌ユ棩鏈焅",\"value\":null,\"text\":null},{\"key\":\"HRCTcheck\",\"name\":\"HRCT璇婃柇\",\"value\":null,\"text\":null},{\"key\":\"HRCTdescribe\",\"name\":\"HRCT鎻忚堪\",\"value\":null,\"text\":null}]},{\"name\":\"鑳搁儴X绾縗",\"key\":\"lungCTcheckLower_DPV4NP\",\"value\":[{\"key\":\"chestXDateclear\",\"name\":\"鏄惁宸插畬鎴愯兏閮╔绾挎鏌",\"value\":null,\"text\":null},{\"key\":\"chestXDate\",\"name\":\"鑳搁儴X绾挎鏌ユ棩鏈焅",\"value\":null,\"text\":null},{\"key\":\"chestXresult\",\"name\":\"鑳搁儴X绾挎鏌ョ粨鏋淺",\"value\":null,\"text\":null},{\"key\":\"chestXdescribe\",\"name\":\"鑳搁儴X绾挎鏌ユ弿杩癨",\"value\":null,\"text\":null}]},{\"name\":\"鑲哄姛鑳斤紙鍝枠涓嶤OPD蹇呭~锛塡",\"key\":\"lungFunction_inf_PtaUZb\",\"value\":[{\"key\":\"zqgkzjEight\",\"name\":\"鏄惁鍋滄敮姘旂鑸掑紶鍓傛垨婵€绱犵被8h浠ヤ笂\",\"value\":null,\"text\":null},{\"key\":\"pulResult\",\"name\":\"鑸掑紶璇曢獙\",\"value\":null,\"text\":null},{\"key\":\"sdacJl\",\"name\":\"娌欎竵鑳洪唶鍚稿叆鍓傞噺\",\"value\":null,\"text\":null},{\"key\":\"before\",\"name\":\"鏀皵绠℃墿寮犲墏鍚稿叆鍓峔",\"value\":[{\"predicted\":\"--\",\"real\":\"--\",\"percent\":\"--\",\"id\":\"0\",\"title\":\"FEV1%\"},{\"predicted\":\"--\",\"real\":\"--\",\"percent\":\"--\",\"id\":\"1\",\"title\":\"FEV1\"},{\"predicted\":\"--\",\"real\":\"--\",\"percent\":\"--\",\"id\":\"2\",\"title\":\"FVC\"},{\"predicted\":\"--\",\"real\":\"--\",\"percent\":\"--\",\"id\":\"3\",\"title\":\"FEV1/FVC\"}],\"text\":[{\"title\":\"FEV1%\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"predicted\",\"real\",\"percent\"],\"colName\":[\"棰勮鍊糪",\"鍓嶆\",\"鍓�/棰刓"],\"id\":\"0\"},{\"title\":\"FEV1\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"predicted\",\"real\",\"percent\"],\"colName\":[\"棰勮鍊糪",\"鍓嶆\",\"鍓�/棰刓"],\"id\":\"1\"},{\"title\":\"FVC\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"predicted\",\"real\",\"percent\"],\"colName\":[\"棰勮鍊糪",\"鍓嶆\",\"鍓�/棰刓"],\"id\":\"2\"},{\"title\":\"FEV1/FVC\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"predicted\",\"real\",\"percent\"],\"colName\":[\"棰勮鍊糪",\"鍓嶆\",\"鍓�/棰刓"],\"id\":\"3\"}]},{\"key\":\"after\",\"name\":\"鏀皵绠℃墿寮犲墏鍚稿叆鍚嶾",\"value\":[{\"real\":\"--\",\"percent\":\"--\",\"better\":\"--\",\"id\":\"0\",\"title\":\"FEV1%\"},{\"real\":\"--\",\"percent\":\"--\",\"better\":\"--\",\"id\":\"1\",\"title\":\"FEV1\"},{\"real\":\"--\",\"percent\":\"--\",\"better\":\"--\",\"id\":\"2\",\"title\":\"FVC\"},{\"real\":\"--\",\"percent\":\"--\",\"better\":\"--\",\"id\":\"3\",\"title\":\"FEV1/FVC\"}],\"text\":[{\"title\":\"FEV1%\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"real\",\"percent\",\"better\"],\"colName\":[\"鍚庢\",\"鍚�/棰刓",\"鏀瑰杽鐜嘰"],\"id\":\"0\"},{\"title\":\"FEV1\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"real\",\"percent\",\"better\"],\"colName\":[\"鍚庢\",\"鍚�/棰刓",\"鏀瑰杽鐜嘰"],\"id\":\"1\"},{\"title\":\"FVC\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"real\",\"percent\",\"better\"],\"colName\":[\"鍚庢\",\"鍚�/棰刓",\"鏀瑰杽鐜嘰"],\"id\":\"2\"},{\"title\":\"FEV1/FVC\",\"value\":[\"--\",\"--\",\"--\"],\"colKey\":[\"real\",\"percent\",\"better\"],\"colName\":[\"鍚庢\",\"鍚�/棰刓",\"鏀瑰杽鐜嘰"],\"id\":\"3\"}]}]}],\"crfId\":\"1828353427575558144\",\"answer\":{\"patientName\":\"78N6A\",\"patientGender\":[\"F\"],\"patientPhone\":\"\",\"patientBirth\":\"\",\"patientHeight\":\"167\",\"patientWeight\":\"54\",\"patientAge\":\"29\",\"patientBirthmonth\":\"19930509\",\"smokeHis\":[\"2\"],\"AIndtoxins\":[\"0\"],\"AdustRemoval\":[\"1\"],\"Aradioactive\":[\"0\"],\"foodAllergies\":[\"no\"],\"drugAllergies\":[\"yes\"],\"familyAllergies\":[\"yes\"],\"ispollutionpollution\":[\"no\"],\"COVID\":[\"1\"],\"before\":[{\"id\":\"0\",\"title\":\"FEV1%\"},{\"id\":\"1\",\"title\":\"FEV1\"},{\"id\":\"2\",\"title\":\"FVC\"},{\"id\":\"3\",\"title\":\"FEV1/FVC\"}],\"after\":[{\"id\":\"0\",\"title\":\"FEV1%\"},{\"id\":\"1\",\"title\":\"FEV1\"},{\"id\":\"2\",\"title\":\"FVC\"},{\"id\":\"3\",\"title\":\"FEV1/FVC\"}]}}";
+        String form = "{\"displayType\":\"column\",\"code\":\"patient_inf\",\"name\":\"鎮h€呭綍鍏ヨ〃鍗昞",\"type\":\"object\",\"properties\":{\"baseInfo_q2OjsA\":{\"type\":\"object\",\"description\":\"\",\"title\":\"鍩烘湰淇℃伅\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"baseInfo\"},\"properties\":{\"radio_pZJcYQ\":{\"title\":\"缁勫埆\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"patientType\"},\"options\":[{\"id\":\"0\",\"name\":\"COPD\",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏀皵绠″摦鍠榎",\"code\":\"2\"},{\"id\":\"2\",\"name\":\"鏀皵绠℃墿寮燶",\"code\":\"3\"},{\"id\":\"3\",\"name\":\"涓婂懠鍚搁亾鎰熸煋\",\"code\":\"4\"},{\"id\":\"4\",\"name\":\"涓嬪懠鍚搁亾鎰熸煋\",\"code\":\"5\"},{\"id\":\"5\",\"name\":\"鎱㈡€ф敮姘旂鐐嶾",\"code\":\"7\"},{\"id\":\"6\",\"name\":\"鍜冲椊\",\"code\":\"8\"},{\"id\":\"7\",\"name\":\"鍋ュ悍浜篭",\"code\":\"6\"}],\"enum\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"7\",\"8\",\"6\"],\"enumNames\":[\"COPD\",\"鏀皵绠″摦鍠榎",\"鏀皵绠℃墿寮燶",\"涓婂懠鍚搁亾鎰熸煋\",\"涓嬪懠鍚搁亾鎰熸煋\",\"鎱㈡€ф敮姘旂鐐嶾",\"鍜冲椊\",\"鍋ュ悍浜篭"]},\"input_eI5d5N\":{\"title\":\"鍞竴璇嗗埆鐮乗",\"type\":\"string\",\"questionType\":\"TEXT\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"patientName\"},\"rangeLength\":{\"min\":1,\"max\":5},\"min\":1,\"max\":5,\"show\":{\"questions\":[],\"options\":[]}},\"radio_2BZqLQ\":{\"title\":\"鎬у埆\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"patientGender\"},\"options\":[{\"id\":\"0\",\"name\":\"鐢穃",\"code\":\"M\"},{\"id\":\"1\",\"name\":\"濂砛",\"code\":\"F\"}],\"enum\":[\"M\",\"F\"],\"enumNames\":[\"鐢穃",\"濂砛"]},\"input_1vS3p_\":{\"title\":\"姘戞棌\",\"type\":\"string\",\"questionType\":\"TEXT\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"patientNation\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"input_BBOEYs\":{\"title\":\"鍑虹敓骞存湀\",\"type\":\"string\",\"questionType\":\"TEXT\",\"description\":\"濡�1990骞�12鏈堬紝璇疯緭鍏�199012\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"patientBirthmonth\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"number_GfRINe\":{\"title\":\"骞撮緞\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"patientAge\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"宀乗",\"min\":0,\"max\":0,\"required\":true},\"number_xhJFdf\":{\"title\":\"韬珮\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"patientHeight\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"cm\",\"min\":0,\"max\":0,\"required\":true},\"number_2NItPR\":{\"title\":\"浣撻噸\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"patientWeight\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"kg\",\"min\":0,\"max\":0,\"required\":true},\"textarea_InDWcs\":{\"title\":\"澶囨敞\",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"tips\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"smokeHistory_2NufHa\":{\"type\":\"object\",\"description\":\"\",\"title\":\"涓汉鍙瞈",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"smokeHistory\"},\"required\":true,\"properties\":{\"radio_wxrmgo\":{\"title\":\"鍚哥儫鍙瞈",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"smokeHis\"},\"options\":[{\"id\":\"0\",\"name\":\"姝e湪鍚哥儫/鎴掔儫鏈弧1骞碶",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鎴掔儫瓒呰繃1骞碶",\"code\":\"2\"},{\"id\":\"2\",\"name\":\"浠庝笉鍚哥儫\",\"code\":\"3\"}],\"enum\":[\"1\",\"2\",\"3\"],\"enumNames\":[\"姝e湪鍚哥儫/鎴掔儫鏈弧1骞碶",\"鎴掔儫瓒呰繃1骞碶",\"浠庝笉鍚哥儫\"]},\"radio_PjH1Z_\":{\"title\":\"鏃㈠線鎵嬫湳鍙瞈",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"ApreviousSurgical\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"input_ELJeHV\":{\"title\":\"鏃㈠線鎵嬫湳鍙�-鍚嶇О\",\"type\":\"string\",\"questionType\":\"TEXT\",\"description\":\"\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"previousSurgical\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"input_meEqwd\":{\"title\":\"鎵嬫湳鏃堕棿(骞存湀)\",\"type\":\"string\",\"questionType\":\"TEXT\",\"description\":\"濡�1990骞�12鏈堬紝璇疯緭鍏�199012\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"surgicalTime\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"radio_Sk6gDE\":{\"title\":\"宸ヤ笟姣掔墿鎺ヨЕ鍙瞈",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"AIndtoxins\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"number_ML7RDe\":{\"title\":\"宸ヤ笟姣掔墿鎺ヨЕ鏃堕暱\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"description\":\"\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"Indtoxins\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"骞碶",\"min\":0,\"max\":0},\"radio_ksSICF\":{\"title\":\"绮夊皹鎺ヨЕ\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"AdustRemoval\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"number_0Pj-iN\":{\"title\":\"绮夊皹鎺ヨЕ鏃堕暱\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"description\":\"\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"dustRemoval\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"骞碶",\"min\":0,\"max\":0},\"radio_IFLN4Y\":{\"title\":\"鏀惧皠鎬х墿璐ㄦ帴瑙",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"Aradioactive\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"number_xhGgoA\":{\"title\":\"鏀惧皠鎬х墿璐ㄦ帴瑙︽椂闀縗",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"description\":\"\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"radioactive\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"骞碶",\"min\":0,\"max\":0},\"radio_CoFBNM\":{\"title\":\"椋熺墿杩囨晱鍙瞈",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"foodAllergies\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_9lmZfk\":{\"title\":\"鑽墿杩囨晱鍙瞈",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"drugAllergies\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"input_-LeeUZ\":{\"title\":\"鍏朵粬杩囨晱鍙�(濡傝姳绮�)\",\"type\":\"string\",\"questionType\":\"TEXT\",\"required\":false,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"drugAllergiesother\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"radio_VHyLEJ\":{\"title\":\"鐖舵瘝/绁栫埗姣嶆槸鍚︽湁杩囨晱\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"杩囨晱鎬ч蓟鐐庛€佹箍鐤圭毊鑲よ繃鏁忋€侀鐗╄繃鏁忕瓑\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"familyAllergies\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_nnqvcY\":{\"title\":\"鏄惁鏇鹃暱鏈燂紙澶т簬浜斿勾锛夋帴瑙︾┖姘旀薄鏌擄紵\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"绌烘皵姹℃煋鍖呭惈绮夊皹銆佸埡婵€姘斾綋銆侀夯灏嗗鑼堕瀹や簩鎵嬬儫锛屾垨甯稿勾宸ヤ綔鍦ㄥ寲宸ャ€佺汉缁囪溅闂寸瓑鏈夌┖姘旀薄鏌撶殑鐜\",\"required\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"ispollutionpollution\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"radio_5veO9S\":{\"title\":\"杩�1涓湀鏄惁鏂板啝鎰熸煋\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"榧绘垨鍜芥嫮瀛愭姉鍘�/鑱氬悎閰堕摼鍙嶅簲 (PCR)妫€娴嬮槼鎬",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"COVID\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"2\"}],\"enum\":[\"1\",\"2\"],\"enumNames\":[\"鏄痋",\"鍚"],\"required\":true}}},\"CM_history_45UfkY\":{\"type\":\"object\",\"title\":\"鐜扮梾鍙�(鍛煎惛绯荤粺鐤剧梾)-杩戜袱鍛╘",\"description\":\"\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"CM_history\"},\"properties\":{\"date_SZbSoa\":{\"title\":\"褰撳墠鐤剧梾璇婃柇鏃堕棿\",\"type\":\"string\",\"format\":\"date\",\"questionType\":\"DATE\",\"widget\":\"CrfDatePick\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"nowDiseaseTime\"}},\"radio_RRlBks\":{\"title\":\"鍙戠儹\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"isHot\"},\"options\":[{\"id\":\"0\",\"name\":\"37.3~38鈩僜",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"38.1~39鈩僜",\"code\":\"2\"},{\"id\":\"2\",\"name\":\"39.1~41鈩僜",\"code\":\"3\"},{\"id\":\"3\",\"name\":\"鈮�41鈩僜",\"code\":\"4\"}],\"enum\":[\"1\",\"2\",\"3\",\"4\"],\"enumNames\":[\"37.3~38鈩僜",\"38.1~39鈩僜",\"39.1~41鈩僜",\"鈮�41鈩僜"]},\"radio_9Wf2Pa\":{\"title\":\"榧诲\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"nasalObstruction\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_BKQTvO\":{\"title\":\"娴佹稌\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"runNose\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_3oCGKT\":{\"title\":\"鍜冲椊(娌℃湁鎰熷啋鏃�)\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"VS\",\"dataId\":\"frequency\"},\"options\":[{\"id\":\"0\",\"name\":\"鏃犳槑鏄惧挸鍡絓",\"code\":\"neverCough\"},{\"id\":\"1\",\"name\":\"鏃╂櫒灞呭\",\"code\":\"mornMore\"},{\"id\":\"2\",\"name\":\"澶滈棿灞呭\",\"code\":\"nightMore\"},{\"id\":\"3\",\"name\":\"鍏ㄥぉ鍋舵湁鍜冲椊\",\"code\":\"occasionalCough\"},{\"id\":\"4\",\"name\":\"鍜冲椊棰戠箒\",\"code\":\"frequentCough\"}],\"enum\":[\"neverCough\",\"mornMore\",\"nightMore\",\"occasionalCough\",\"frequentCough\"],\"enumNames\":[\"鏃犳槑鏄惧挸鍡絓",\"鏃╂櫒灞呭\",\"澶滈棿灞呭\",\"鍏ㄥぉ鍋舵湁鍜冲椊\",\"鍜冲椊棰戠箒\"]},\"radio_4MD3cs\":{\"title\":\"鍜崇棸閲廫",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"VS\",\"dataId\":\"expectoration\"},\"options\":[{\"id\":\"0\",\"name\":\"鏃犳槑鏄惧挸鐥癨",\"code\":\"neverExpectorate\"},{\"id\":\"1\",\"name\":\"鍜崇棸10ml浠ヤ笅\",\"code\":\"belowTen\"},{\"id\":\"2\",\"name\":\"鍜崇棸10ml浠ヤ笂\",\"code\":\"aboveTen\"}],\"enum\":[\"neverExpectorate\",\"belowTen\",\"aboveTen\"],\"enumNames\":[\"鏃犳槑鏄惧挸鐥癨",\"鍜崇棸10ml浠ヤ笅\",\"鍜崇棸10ml浠ヤ笂\"]},\"radio_svNkPO\":{\"title\":\"鍜宠創鐥癨",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"vomicaNt\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_EKR86w\":{\"title\":\"鍛煎惛鍥伴毦\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"VS\",\"dataId\":\"pant\"},\"options\":[{\"id\":\"0\",\"name\":\"鏃燶",\"code\":\"neverPant\"},{\"id\":\"1\",\"name\":\"鍓х儓娲诲姩鏃跺嚭鐜癨",\"code\":\"occasionallyPant\"},{\"id\":\"2\",\"name\":\"鏃ュ父娲诲姩鏃跺彂鐢燂紝浼戞伅鏃朵笉鍙戠敓\",\"code\":\"whenActive\"},{\"id\":\"3\",\"name\":\"鍠樻伅涓嶈兘骞宠汉锛屽奖鍝嶄紤鎭笌娲诲姩\",\"code\":\"alwaysPant\"}],\"enum\":[\"neverPant\",\"occasionallyPant\",\"whenActive\",\"alwaysPant\"],\"enumNames\":[\"鏃燶",\"鍓х儓娲诲姩鏃跺嚭鐜癨",\"鏃ュ父娲诲姩鏃跺彂鐢燂紝浼戞伅鏃朵笉鍙戠敓\",\"鍠樻伅涓嶈兘骞宠汉锛屽奖鍝嶄紤鎭笌娲诲姩\"]},\"radio_H-oWj_\":{\"title\":\"鍜\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"isBlood\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"radio_iFybYL\":{\"title\":\"鑳哥棝\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"chestPain\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"input_Tv2xuD\":{\"title\":\"鍏朵粬鐥囩姸\",\"type\":\"string\",\"questionType\":\"TEXT\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"otherqtzz\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"radio_pMRb1u\":{\"title\":\"姣忓ぉ閮芥湁鍛煎惛鐥囩姸锛屽湪浣撳姏娲诲姩涔嬪悗鍠樻唻鍔犻噸\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"鍠樻伅锛屽挸鍡斤紝鍛煎惛鍥伴毦锛岃兏闂锋垨鐤肩棝\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"everyDayBreathBad\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"radio_6FzCNg\":{\"title\":\"鏄惁閬囧埌鍒烘縺鎬ф皵浣撶瓑杩囨晱鎬х墿璐紝鎴栬€呮儏缁縺鍔ㄦ椂锛屼細寮曞彂鍛煎惛閬撶棁鐘讹紝浣嗘槸涔嬪悗鑳芥仮澶嶆甯竆",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"description\":\"鍠樻伅锛屽挸鍡斤紝鍛煎惛鍥伴毦锛岃兏闂锋垨鐤肩棝\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"nowWorseAir\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"radio_mN0BSK\":{\"title\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"NDDrugNameis\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"textarea_VcEcqT\":{\"title\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"description\":\"濉啓绀轰緥锛氳嵂鐗�1锛�2mg锛屽彛鏈嶏紝姣忓ぉ2娆",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"XBSHDetail\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"CMO_history_g3RXLT\":{\"type\":\"object\",\"description\":\"\",\"title\":\"鐜扮梾鍙�(鍏朵粬鍛煎惛绯荤粺鐤剧梾)\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"CMO_history\"},\"properties\":{\"radio_gmS0wy\":{\"title\":\"鏄惁鏈夊叾浠栧懠鍚哥郴缁熺柧鐥匼",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"isHaveOtherBreath\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"date_SZbSoa\":{\"title\":\"璇婃柇鏃堕棿\",\"type\":\"string\",\"format\":\"date\",\"questionType\":\"DATE\",\"widget\":\"CrfDatePick\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"otherDiseaseTime\"}},\"input_sXY8NP\":{\"title\":\"鐤剧梾鍚嶇О\",\"type\":\"string\",\"questionType\":\"TEXT\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"otherDiseaseName\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"radio_bsMHh_\":{\"title\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"NDOBDrugNameis\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"textarea_ju4cIb\":{\"title\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"description\":\"濉啓绀轰緥锛氳嵂鐗�1锛�2mg锛屽彛鏈嶏紝姣忓ぉ2娆",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"XBSOBDetail\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"CMF_history_q4Z5Br\":{\"type\":\"object\",\"description\":\"\",\"title\":\"鐜扮梾鍙�(闈炲懠鍚哥郴缁熺柧鐥�)\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"CMF_history\"},\"properties\":{\"radio_gmS0wy\":{\"title\":\"鏄惁鏈夐潪鍛煎惛绯荤粺鐤剧梾\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"isHaveFBreath\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"date_SZbSoa\":{\"title\":\"璇婃柇鏃堕棿\",\"type\":\"string\",\"format\":\"date\",\"questionType\":\"DATE\",\"widget\":\"CrfDatePick\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"FDiseaseTime\"}},\"input_sXY8NP\":{\"title\":\"鐤剧梾鍚嶇О\",\"type\":\"string\",\"questionType\":\"TEXT\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"FDiseaseName\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"radio_Arisrv\":{\"title\":\"鏄惁鏈夎嵂鐗╂不鐤梊",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"NDFDrugNameis\"},\"options\":[{\"id\":\"0\",\"name\":\"鏈塡",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"鏃燶",\"code\":\"0\"}],\"enum\":[\"1\",\"0\"],\"enumNames\":[\"鏈塡",\"鏃燶"]},\"textarea_FrL9N0\":{\"title\":\"娌荤枟鑽墿璇︽儏锛堣嵂鐗╁悕绉�/鍓傞噺/缁欒嵂閫斿緞/棰戠巼锛塡",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"description\":\"濉啓绀轰緥锛氳嵂鐗�1锛�2mg锛屽彛鏈嶏紝姣忓ぉ2娆",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"XBSFDetail\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"AEstatus_j4CJXr\":{\"type\":\"object\",\"description\":\"\",\"title\":\"COPD杩囧幓1骞村唴鎬ユ€у姞閲嶆儏鍐�(浠匔OPD鎮h€呭~鍐�)\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"AEstatus\"},\"properties\":{\"number_d3YdWP\":{\"title\":\"AE鎬绘鏁癨",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"AETimes\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"娆",\"min\":0,\"max\":0},\"number_s3YyoQ\":{\"title\":\"涓害AE\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"description\":\"浣跨敤鐭晥鏀皵绠℃墿寮犲墏鍜屾姉鐢熺礌娌荤枟鍜�/鎴栧彛鏈嶇硸鐨川婵€绱燶",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"MidAE\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"娆",\"min\":0,\"max\":0},\"number_b5HNLY\":{\"title\":\"閲嶅害AE\",\"type\":\"number\",\"questionType\":\"NUMBER\",\"widget\":\"CrfInputNumber\",\"description\":\"闇€瑕佷綇闄㈡垨鎬ヨ瘖銆両CU 娌荤枟\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"highAE\"},\"range\":{\"min\":0,\"max\":0},\"unit\":\"娆",\"min\":0,\"max\":0}}},\"lungCTcheck_qHV_iL\":{\"type\":\"object\",\"description\":\"\",\"title\":\"HRCT\",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"lungCTcheck\"},\"properties\":{\"radio_eQ7i2_\":{\"title\":\"鏄惁宸插畬鎴怘RCT妫€鏌",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"HRCTclear\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"date_eLLo3o\":{\"title\":\"HRCT妫€鏌ユ棩鏈焅",\"type\":\"string\",\"format\":\"date\",\"questionType\":\"DATE\",\"widget\":\"CrfDatePick\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"HRCTtime\"}},\"input_REgSRb\":{\"title\":\"HRCT璇婃柇\",\"type\":\"string\",\"questionType\":\"TEXT\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"HRCTcheck\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"textarea_1nJhSZ\":{\"title\":\"HRCT鎻忚堪\",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"HRCTdescribe\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"lungCTcheckLower_DPV4NP\":{\"type\":\"object\",\"description\":\"\",\"title\":\"鑳搁儴X绾縗",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"lungCTcheckLower\"},\"properties\":{\"radio_F3h09O\":{\"title\":\"鏄惁宸插畬鎴愯兏閮╔绾挎鏌",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"chestXDateclear\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"date_OPurFU\":{\"title\":\"鑳搁儴X绾挎鏌ユ棩鏈焅",\"type\":\"string\",\"format\":\"date\",\"questionType\":\"DATE\",\"widget\":\"CrfDatePick\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"chestXDate\"}},\"input_GhAtyb\":{\"title\":\"鑳搁儴X绾挎鏌ョ粨鏋淺",\"type\":\"string\",\"questionType\":\"TEXT\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"chestXresult\"},\"rangeLength\":{\"min\":0,\"max\":200},\"min\":0,\"max\":200},\"textarea_V0f1S3\":{\"title\":\"鑳搁儴X绾挎鏌ユ弿杩癨",\"type\":\"string\",\"format\":\"textarea\",\"questionType\":\"TEXTAREA\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"chestXdescribe\"},\"rangeLength\":{\"min\":0,\"max\":400},\"min\":0,\"max\":400}}},\"lungFunction_inf_PtaUZb\":{\"type\":\"object\",\"description\":\"\",\"title\":\"鑲哄姛鑳斤紙鍝枠涓嶤OPD蹇呭~锛塡",\"questionType\":\"TEMPLATE\",\"lucaBanpickDataId\":true,\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"lungFunction_inf\"},\"properties\":{\"radio_eiDPtt\":{\"title\":\"鏄惁鍋滄敮姘旂鑸掑紶鍓傛垨婵€绱犵被8h浠ヤ笂\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"zqgkzjEight\"},\"options\":[{\"id\":\"0\",\"name\":\"鏄痋",\"code\":\"yes\"},{\"id\":\"1\",\"name\":\"鍚",\"code\":\"no\"}],\"enum\":[\"yes\",\"no\"],\"enumNames\":[\"鏄痋",\"鍚"]},\"radio_TwQ-dW\":{\"title\":\"鑸掑紶璇曢獙\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"pulResult\"},\"options\":[{\"id\":\"0\",\"name\":\"闃虫€",\"code\":\"positive\"},{\"id\":\"1\",\"name\":\"闃存€",\"code\":\"negative\"}],\"enum\":[\"positive\",\"negative\"],\"enumNames\":[\"闃虫€",\"闃存€"]},\"radio_g2D3JC\":{\"title\":\"娌欎竵鑳洪唶鍚稿叆鍓傞噺\",\"type\":\"string\",\"widget\":\"radio\",\"questionType\":\"RADIO\",\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"MH\",\"dataId\":\"sdacJl\"},\"options\":[{\"id\":\"0\",\"name\":\"100渭g\",\"code\":\"1\"},{\"id\":\"1\",\"name\":\"200渭g\",\"code\":\"2\"},{\"id\":\"2\",\"name\":\"400渭g\",\"code\":\"3\"},{\"id\":\"3\",\"name\":\"涓嶈\",\"code\":\"4\"}],\"enum\":[\"1\",\"2\",\"3\",\"4\"],\"enumNames\":[\"100渭g\",\"200渭g\",\"400渭g\",\"涓嶈\"]},\"newTabel_CeMggW\":{\"title\":\"鏀皵绠℃墿寮犲墏鍚稿叆鍓峔",\"type\":\"array\",\"questionType\":\"CRFTABLE\",\"widget\":\"CrfTable\",\"items\":{\"type\":\"object\",\"properties\":{}},\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"VS\",\"dataId\":\"before\"},\"columns\":[{\"id\":\"0\",\"title\":\"鎸囨爣\",\"dataIndex\":\"title\",\"type\":\"TEXT\"},{\"id\":\"1\",\"title\":\"棰勮鍊糪",\"dataIndex\":\"predicted\",\"type\":\"INPUT\"},{\"id\":\"2\",\"title\":\"鍓嶆\",\"dataIndex\":\"real\",\"type\":\"INPUT\"},{\"id\":\"3\",\"title\":\"鍓�/棰刓",\"dataIndex\":\"percent\",\"type\":\"INPUT\"}],\"defaultValue\":[{\"id\":\"0\",\"title\":\"FEV1%\"},{\"id\":\"1\",\"title\":\"FEV1\"},{\"id\":\"2\",\"title\":\"FVC\"},{\"id\":\"3\",\"title\":\"FEV1/FVC\"}],\"description\":\"\"},\"newTabel_U738QJ\":{\"title\":\"鏀皵绠℃墿寮犲墏鍚稿叆鍚嶾",\"type\":\"array\",\"questionType\":\"CRFTABLE\",\"widget\":\"CrfTable\",\"items\":{\"type\":\"object\",\"properties\":{}},\"BindData\":{\"dataType\":\"CUSTOMIZE\",\"choiceField\":\"DM\",\"dataId\":\"after\"},\"columns\":[{\"id\":\"0\",\"title\":\"鎸囨爣\",\"dataIndex\":\"title\",\"type\":\"TEXT\"},{\"id\":\"1\",\"title\":\"鍚庢\",\"dataIndex\":\"real\",\"type\":\"INPUT\"},{\"id\":\"2\",\"title\":\"鍚�/棰刓",\"dataIndex\":\"percent\",\"type\":\"INPUT\"},{\"id\":\"3\",\"title\":\"鏀瑰杽鐜嘰",\"dataIndex\":\"better\",\"type\":\"INPUT\"}],\"defaultValue\":[{\"id\":\"0\",\"title\":\"FEV1%\"},{\"id\":\"1\",\"title\":\"FEV1\"},{\"id\":\"2\",\"title\":\"FVC\"},{\"id\":\"3\",\"title\":\"FEV1/FVC\"}],\"description\":\"\"}}}}}";
+
+        System.out.println(JSONUtil.toJsonStr(crfProblemJsonAnalysisNew(form)));
+        System.out.println(JSONUtil.toJsonStr(crfJsonAnalysis(a)));
+
+        System.out.println(parseCrfProblemAndAnswer(form, a));
+    }
+
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ba66105a3fa27b853666aea6b3d68f2e23a36a81
--- /dev/null
+++ b/src/main/resources/application-dev.yml
@@ -0,0 +1,11 @@
+# server
+SERVER-PORT: 8181
+
+#MGDB
+MGDB-ADDRESS: 47.92.245.13:30606
+MGDB-NAME: root
+MGDB-PASSWORD: 123456
+MGDB-DATABASE: luca-copy-dev
+MGDB-AUTHSOURCE: admin
+
+ARCHIVE-MGDB-DATABASE: luca_dev
diff --git a/src/main/resources/application-hj.yml b/src/main/resources/application-hj.yml
new file mode 100644
index 0000000000000000000000000000000000000000..24c2218b8f0fe48c8f091afb9d0ec08fbe839a9f
--- /dev/null
+++ b/src/main/resources/application-hj.yml
@@ -0,0 +1,15 @@
+# server
+SERVER-PORT: 8181
+
+#MGDB
+MGDB-ADDRESS: 47.92.245.13:30606
+MGDB-NAME: root
+MGDB-PASSWORD: 123456
+MGDB-DATABASE: luca-copy-dev
+#MGDB-DATABASE: luca-copy-uat
+MGDB-AUTHSOURCE: admin
+
+ARCHIVE-MGDB-DATABASE: luca_dev
+#ARCHIVE-MGDB-DATABASE: luca_uat
+
+
diff --git a/src/main/resources/application-uat.yml b/src/main/resources/application-uat.yml
new file mode 100644
index 0000000000000000000000000000000000000000..830c61099987c637c00011e96e9fed9d4aaa6ba3
--- /dev/null
+++ b/src/main/resources/application-uat.yml
@@ -0,0 +1,13 @@
+# server
+SERVER-PORT: 8181
+
+#MGDB
+MGDB-ADDRESS: 47.92.245.13:30606
+MGDB-NAME: root
+MGDB-PASSWORD: 123456
+MGDB-DATABASE: luca-copy-uat
+MGDB-AUTHSOURCE: admin
+
+ARCHIVE-MGDB-DATABASE: luca_uat
+
+
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5026fde96eb33503ef3d1dd09bfd7fabb81359d8
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,15 @@
+server:
+  port: ${SERVER-PORT:8181}
+
+spring:
+  profiles:
+    active: ${ACTIVE-PROFILES:local}
+  application:
+    name: BACKEND
+  data:
+    base-mongodb:
+      uri: mongodb://${MGDB-NAME}:${MGDB-PASSWORD}@${MGDB-ADDRESS}/${MGDB-DATABASE}?authSource=${MGDB-AUTHSOURCE}
+    archive-mongodb:
+      uri: mongodb://${MGDB-NAME}:${MGDB-PASSWORD}@${MGDB-ADDRESS}/${ARCHIVE-MGDB-DATABASE}?authSource=${MGDB-AUTHSOURCE}
+
+
diff --git a/src/test/java/com/luca/pilot/PilotApplicationTests.java b/src/test/java/com/luca/pilot/PilotApplicationTests.java
new file mode 100644
index 0000000000000000000000000000000000000000..94907188461bba8d08faa388602f9551b2396f43
--- /dev/null
+++ b/src/test/java/com/luca/pilot/PilotApplicationTests.java
@@ -0,0 +1,13 @@
+package com.luca.pilot;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class PilotApplicationTests {
+
+	@Test
+	void contextLoads() {
+	}
+
+}
diff --git a/src/test/java/com/luca/pilot/PlanTaskTest.java b/src/test/java/com/luca/pilot/PlanTaskTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9460f7cdf808c1f42976fb78ba85e0e5d272f4c9
--- /dev/null
+++ b/src/test/java/com/luca/pilot/PlanTaskTest.java
@@ -0,0 +1,90 @@
+package com.luca.pilot;
+
+import cn.hutool.json.JSONUtil;
+import com.luca.pilot.entity.UserArchive;
+import com.luca.pilot.service.BaseModuleViewService;
+import com.luca.pilot.service.PlanService;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.test.context.ActiveProfiles;
+
+import java.util.List;
+
+@Slf4j
+@SpringBootTest
+@ActiveProfiles("hj")
+public class PlanTaskTest {
+    @Autowired
+    private MongoTemplate mongoTemplate;
+    @Autowired
+    private PlanService planService;
+    @Autowired
+    private BaseModuleViewService baseModuleViewService;
+
+
+    @Test
+    void synchronizePlanTask2() {
+        // 鍒涘缓鏌ヨ鏉′欢
+        Query query = new Query();
+        query.addCriteria(Criteria.where("createAt").lt("2023-12-07 14:50"));
+        long count = mongoTemplate.count(query, UserArchive.class);
+        log.info("total count:{}", count);
+
+        long skip = count / 10;
+        if (count % 10 > 0) {
+            skip++;
+        }
+
+
+        for (int i = 0; i < skip; i++) {
+            query.skip(i * 10L);
+            query.limit(10);
+            List<UserArchive> userArchives = mongoTemplate.find(query, UserArchive.class);
+            log.info("userArchives count:{}", userArchives.size());
+        }
+
+    }
+
+    @Test
+    void synchronizeModuleView() {
+        baseModuleViewService.synchronizeModuleView();
+    }
+
+
+
+    @Test
+    void synchronizePlanTask() {
+        planService.synchronizePlanTask();
+    }
+
+    @Test
+    void contextLoads() {
+        Book book = new Book();
+        book.setId(10);
+        book.setName("testMongoDB");
+        book.setType("testMongoDB");
+        book.setDescription("testMongoDB");
+        mongoTemplate.save(book);
+    }
+
+    @Test
+    void find() {
+        List<Book> all = mongoTemplate.findAll(Book.class);
+        System.out.println(all);
+    }
+
+    @Data
+    class Book {
+        private int id;
+        private String name;
+        private String type;
+        private String description;
+    }
+}
+