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; + } +} +