This commit is contained in:
牛子源 2025-04-17 09:30:19 +08:00
commit 750570fdf2
58 changed files with 3172 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf

33
.gitignore vendored Normal file
View File

@ -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/

19
.mvn/wrapper/maven-wrapper.properties vendored Normal file
View File

@ -0,0 +1,19 @@
# 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
#
# http://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.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip

1
dbhelper.bat Normal file
View File

@ -0,0 +1 @@
java -jar dbhelper.jar %*

BIN
dbhelper.jar Normal file

Binary file not shown.

259
mvnw vendored Normal file
View File

@ -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
#
# http://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 "$@"

149
mvnw.cmd vendored Normal file
View File

@ -0,0 +1,149 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM http://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.2
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
if ($env:MAVEN_USER_HOME) {
$MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain"
}
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

117
pom.xml Normal file
View File

@ -0,0 +1,117 @@
<?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>3.4.4</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.syjiaer.pharmacy.proxy</groupId>
<artifactId>server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server</name>
<description>server</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 数据库 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser</artifactId>
<version>3.5.10.1</version> <!-- 确保版本和 MyBatis Plus 主包一致 -->
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.12.3</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.12.3</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.12.3</version>
<scope>runtime</scope>
</dependency>
<!-- 其他依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.32</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.38</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,15 @@
package com.syjiaer.pharmacy.server;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.syjiaer.pharmacy.server.modules.*.mapper")
public class ServerApplication {
public static void main(String[] args) {
SpringApplication.run(ServerApplication.class, args);
}
}

View File

@ -0,0 +1,35 @@
package com.syjiaer.pharmacy.server.common.config;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonConfig;
import com.syjiaer.pharmacy.server.modules.base.service.ICommonConfigService;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class Config {
private Map<String, String> config_map;
@Autowired
private ICommonConfigService iCommonConfigService;
@PostConstruct
private void init() {
config_map = new HashMap<>();
List<CommonConfig> list = iCommonConfigService.list();
for (CommonConfig commonConfig : list) {
config_map.put(commonConfig.getK(), commonConfig.getVal());
}
}
public String get(String group, String key) {
return config_map.get(group + "_" + key);
}
public Map<String, String> list() {
return config_map;
}
}

View File

@ -0,0 +1,39 @@
package com.syjiaer.pharmacy.server.common.config;
import com.syjiaer.pharmacy.server.common.exception.MessageException;
import com.syjiaer.pharmacy.server.common.exception.VerifyException;
import com.syjiaer.pharmacy.server.common.vo.Result;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component // 将当前类交给spring管理
@Aspect // 声明这是一个AOP类
public class ControllerAspect {
@Pointcut("execution(public * *(..)) && within(com.syjiaer.pharmacy.server.modules.*.controller.*+) && within(com.syjiaer.pharmacy.server.modules.base.controller.BaseController+)")
public void controllerPointcut() {
}
@Around("controllerPointcut()")
public Object messageExceptionAop(ProceedingJoinPoint joinPoint) throws Throwable {
try {
Object result = joinPoint.proceed();
return result;
} catch (MessageException e) {
Result<Object> result = new Result<Object>();
result.setMessage(e.getMessage());
result.setData(null);
result.setCode(101);
return result;
} catch (VerifyException e) {
Result<Object> result = new Result<Object>();
result.setMessage(e.getMessage());
result.setData(null);
result.setCode(301);
return result;
}
}
}

View File

@ -0,0 +1,32 @@
package com.syjiaer.pharmacy.server.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
// 1. 添加 CORS 配置信息
CorsConfiguration config = new CorsConfiguration();
// 允许的域名可使用 * 表示允许所有域名
config.addAllowedOriginPattern("*");
// 允许的请求头
config.addAllowedHeader("*");
// 允许的请求方法
config.addAllowedMethod("*");
// 允许携带凭证 cookie
config.setAllowCredentials(true);
// 2. URL 路径添加 CORS 配置
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 3. 返回 CorsFilter 实例
return new CorsFilter(source);
}
}

View File

@ -0,0 +1,16 @@
package com.syjiaer.pharmacy.server.common.config;
import com.syjiaer.pharmacy.server.common.inteceptor.MvcInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
@Autowired
private MvcInterceptor mvcInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(mvcInterceptor).addPathPatterns("/**");
}
}

View File

@ -0,0 +1,18 @@
package com.syjiaer.pharmacy.server.common.constants;
public class Constants {
public static final String IPurchaseCodePrefix = "IP";
public static final String IInitCodePrefix = "II";
public static final String RetailFeedetlSn = "FFLS";
public static final Integer DetailPageSize = 20;
public static final String InitInventory = "初始化库存";
public static final String PurchaseInventory = "采购入库";
public static final String Sold = "售出";
public static final String Apply = "领用";
public static final String Social = "医保";
public static final Integer numberWarningLimit = 10;
public static final Integer expiryDateWarningLimit = 20;
public static final Integer OneDaySecond= 24*60*60;
}

View File

@ -0,0 +1,39 @@
package com.syjiaer.pharmacy.server.common.exception;
public class MessageException extends RuntimeException {
/**
* 无参构造方法
*/
public MessageException() {
super();
}
/**
* 带有错误信息的构造方法
*
* @param message 错误信息
*/
public MessageException(String message) {
super(message);
}
/**
* 带有错误信息和原始异常的构造方法
*
* @param message 错误信息
* @param cause 原始异常
*/
public MessageException(String message, Throwable cause) {
super(message, cause);
}
/**
* 带有原始异常的构造方法
*
* @param cause 原始异常
*/
public MessageException(Throwable cause) {
super(cause);
}
}

View File

@ -0,0 +1,39 @@
package com.syjiaer.pharmacy.server.common.exception;
public class VerifyException extends RuntimeException {
/**
* 无参构造方法
*/
public VerifyException() {
super();
}
/**
* 带有错误信息的构造方法
*
* @param message 错误信息
*/
public VerifyException(String message) {
super(message);
}
/**
* 带有错误信息和原始异常的构造方法
*
* @param message 错误信息
* @param cause 原始异常
*/
public VerifyException(String message, Throwable cause) {
super(message, cause);
}
/**
* 带有原始异常的构造方法
*
* @param cause 原始异常
*/
public VerifyException(Throwable cause) {
super(cause);
}
}

View File

@ -0,0 +1,136 @@
package com.syjiaer.pharmacy.server.common.inteceptor;
import com.alibaba.fastjson2.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.syjiaer.pharmacy.server.common.util.HeadersUtil;
import com.syjiaer.pharmacy.server.common.util.InfoUtil;
import com.syjiaer.pharmacy.server.common.util.ParmsUtil;
import com.syjiaer.pharmacy.server.common.vo.Result;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
@Component
public class MvcInterceptor implements HandlerInterceptor {
private final ObjectMapper objectMapper = new ObjectMapper();
@Value("${jwt.secret}")
protected String jwtSecret;
@Autowired
private ParmsUtil parmsUtil;
@Autowired
private HeadersUtil headersUtil;
@Autowired
private InfoUtil infoUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
setParms(request);
setHeaders(request);
// 排除 /user/login 接口的校验
if (!request.getRequestURI().endsWith("/manager/user/login")) {
return checkManage(response);
}
return true;
}
private Boolean checkManage(HttpServletResponse response) throws IOException {
Map<String, String> headers =headersUtil.getMap();
String token = headers.get("authorization");
if (token == null || token.isEmpty()) {
setErrorResult(response,"登陆令牌不存在,请重新登陆",301);
return false;
}
Jws<Claims> claimsJws = null;
try {
claimsJws = Jwts.parser()
.verifyWith(Keys.hmacShaKeyFor(jwtSecret.getBytes()))
.build()
.parseSignedClaims(token);
} catch (JwtException e) {
setErrorResult(response,"登录令牌已失效,请重新登陆",301);
return false;
} catch (Exception e) {
setErrorResult(response,"登录令牌已失效,请重新登陆",301);
return false;
}
if (claimsJws == null) {
setErrorResult(response,"登录令牌已失效,请重新登陆",301);
return false;
}
Claims claims = claimsJws.getPayload();
ManagerUser managerUser = new ManagerUser();
managerUser.setId(Integer.parseInt(claims.getSubject()));
managerUser.setUsername(claims.get("username", String.class));
managerUser.setName(claims.get("name", String.class));
return true;
}
private void setHeaders(HttpServletRequest request){
Map<String, String> headers = new HashMap<>();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String key = headerNames.nextElement();
String value = request.getHeader(key);
headers.put(key, value);
}
}
headersUtil.setMap(headers);
}
private void setParms(HttpServletRequest request) {
Map<String,Object> map=null;
try {
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(request.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
String input_str = stringBuilder.toString();
map = JSON.parseObject(input_str, Map.class);
} catch (Exception e) {
map=new HashMap();
}
if(map==null){
map=new HashMap();
}
parmsUtil.setMap(map);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
parmsUtil.remove();
headersUtil.remove();
}
private void setErrorResult(HttpServletResponse response, String msg,int code) throws IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
Result result = new Result();
result.setCode(code);
result.setMessage(msg);
response.getWriter().write(objectMapper.writeValueAsString(result));
}
private void setErrorResult(HttpServletResponse response, String msg) throws IOException {
setErrorResult(response, msg,101);
}
}

View File

@ -0,0 +1,66 @@
package com.syjiaer.pharmacy.server.common.util;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class DateUtil {
public static final String DATE_FORMAT = "yyyy-MM-dd";
public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public LocalDateTime now() {
return LocalDateTime.now();
}
public static String getDateStr(LocalDateTime dateTime) {
return dateTime.format(DateTimeFormatter.ofPattern(DATE_FORMAT));
}
public static String getDateTimeStr(LocalDateTime dateTime) {
return dateTime.format(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT));
}
public static LocalDateTime getDate(String dateStr) {
return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(DATE_FORMAT));
}
public static LocalDateTime getDateTime(String dateTimeStr) {
//如果传入dateStr
if (dateTimeStr.length() == 10) {
dateTimeStr = dateTimeStr + " 00:00:00";
}
return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern(DATE_TIME_FORMAT));
}
//加一天
public static LocalDateTime addDay(LocalDateTime dateTime) {
return dateTime.plusDays(1);
}
public static LocalDateTime addDay(LocalDateTime dateTime, int day) {
return dateTime.plusDays(day);
}
//减一天
public static LocalDateTime subDay(LocalDateTime dateTime) {
return dateTime.minusDays(1);
}
public static LocalDateTime subDay(LocalDateTime dateTime, int day) {
return dateTime.minusDays(day);
}
// 新增方法获取两个日期之间所有的日期
public static List<LocalDate> getDatesBetween(LocalDateTime startDateTime, LocalDateTime endDateTime) {
List<LocalDate> dates = new ArrayList<>();
LocalDate startDate = startDateTime.toLocalDate();
LocalDate endDate = endDateTime.toLocalDate();
while (!startDate.isAfter(endDate)) {
dates.add(startDate);
startDate = startDate.plusDays(1);
}
return dates;
}
}

View File

@ -0,0 +1,76 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
@Component
public class DictoryUtil {
private Logger logger = Logger.getLogger(this.getClass().getName());
public List<JSONObject> getColumnList(int type) {
List<JSONObject> result_list = new ArrayList<JSONObject>();
JSONArray list = FileToJsonList(String.valueOf(type));
for (int i = 0; i < list.size(); i++) {
JSONObject obj = list.getJSONObject(i);
String key = null;
for (String _key : obj.keySet()) {
key = _key;
}
JSONObject field_obj = obj.getJSONObject(key);
if (field_obj.containsKey("column_width") && field_obj.getInteger("column_width") != 0) {
logger.info(field_obj + "");
result_list.add(field_obj);
}
}
return result_list;
}
public Map<String, String> getTitleMap(String no) {
JSONArray list = FileToJsonList(no);
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < list.size(); i++) {
JSONObject obj = list.getJSONObject(i);
for (String key : obj.keySet()) {
map.put(key, obj.getJSONObject(key).getString("en"));
}
}
return map;
}
private JSONArray FileToJsonList(String no) {
List<String> titleList = new ArrayList<>();
ClassLoader classLoader = getClass().getClassLoader();
// 资源文件的路径
String resourceName = "doc_title/" + no + ".json";
StringBuilder content = new StringBuilder();
try (InputStream inputStream = classLoader.getResourceAsStream(resourceName);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
if (inputStream != null) {
String line;
while ((line = reader.readLine()) != null) {
content.append(line);
}
} else {
logger.info("未找到资源文件: " + resourceName);
}
} catch (IOException e) {
e.printStackTrace();
}
JSONArray list = JSON.parseArray(content.toString());
return list;
}
}

View File

@ -0,0 +1,151 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson.JSONObject;
import com.syjiaer.pharmacy.server.modules.social.api.input.IM1312;
import com.syjiaer.pharmacy.server.modules.social.api.output.OM1312;
import com.syjiaer.pharmacy.server.modules.social.api.request.SocialRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class Download1312 {
@Autowired
private SocialRequest socialRequest;
private Instant startTime;
private int totalPages = 3575;
private AtomicInteger processedPages = new AtomicInteger(0); // 使用 AtomicInteger
public void download() throws InterruptedException {
startTime = Instant.now();
// 创建一个队列来存储页码
ConcurrentLinkedQueue<Integer> pageQueue = new ConcurrentLinkedQueue<>();
for (int i = 1; i <= totalPages; i++) {
pageQueue.add(i);
}
// 创建并启动4个线程
Thread[] threads = new Thread[8];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new PageProcessor(pageQueue));
threads[i].start();
}
// 等待所有线程完成
for (Thread thread : threads) {
thread.join();
}
System.out.println("所有页面处理完成");
}
private void processPage(int page) {
File file = new File("D:/1312/" + page + ".json");
if (file.exists()) {
// System.out.println("" + page + "页文件已存在,跳过处理");
return;
}
IM1312 im1312 = new IM1312();
System.out.println("正在处理第" + page + "");
String dateTimeString = "2020-01-01 00:00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
im1312.setUpdtTime(LocalDateTime.parse(dateTimeString, formatter));
im1312.setValiFlag("1");
im1312.setPageNum(page);
im1312.setPageSize(1000);
OM1312 om1312 = socialRequest.call1312(im1312);
System.out.println(page + "/" + om1312.getPages());
List<Map<String, Object>> data = om1312.getData();
saveDataToFile(data, "D:/1312/" + page + ".json");
processedPages.incrementAndGet(); // 增加已处理的页面数
printEstimatedRemainingTime(); // 打印剩余时间估计
}
private void printEstimatedRemainingTime() {
Instant now = Instant.now();
Duration elapsedTime = Duration.between(startTime, now);
int currentProcessedPages = processedPages.get(); // 使用 get 方法获取当前处理的页面数
if (currentProcessedPages == 0) {
return; // 避免除以零
}
double averageTimePerPage = elapsedTime.toMillis() / (double) currentProcessedPages;
int remainingPages = totalPages - currentProcessedPages;
long estimatedRemainingTimeInMillis = (long) (averageTimePerPage * remainingPages);
Duration estimatedRemainingTime = Duration.ofMillis(estimatedRemainingTimeInMillis);
System.out.println("Estimated remaining time: " + estimatedRemainingTime.toHoursPart() + " hours, " +
estimatedRemainingTime.toMinutesPart() + " minutes, " +
estimatedRemainingTime.getSeconds() + " seconds");
}
private void saveDataToFile(List<Map<String, Object>> data, String filePath) {
try {
if (data == null || data.isEmpty()) {
return;
}
// data 转换为 JSON 字符串
String jsonString = JSONObject.toJSONString(data);
// 创建文件夹如果不存在
File folder = new File("D:/1312");
if (!folder.exists()) {
folder.mkdirs();
}
// 写入文件
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
try (FileWriter writer = new FileWriter(file)) {
writer.write(jsonString);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Failed to save data to file", e);
}
}
// 定义一个内部类来处理页码
private class PageProcessor implements Runnable {
private final ConcurrentLinkedQueue<Integer> pageQueue;
public PageProcessor(ConcurrentLinkedQueue<Integer> pageQueue) {
this.pageQueue = pageQueue;
}
@Override
public void run() {
while (true) {
Integer page = pageQueue.poll();
if (page == null) {
// 队列为空退出循环
break;
}
try{
processPage(page);
}catch (Exception e){
System.out.println(""+page+"页出错");
e.printStackTrace();
}
}
}
}
}

View File

@ -0,0 +1,151 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson.JSONObject;
import com.syjiaer.pharmacy.server.modules.social.api.input.IM1318;
import com.syjiaer.pharmacy.server.modules.social.api.output.OM1318;
import com.syjiaer.pharmacy.server.modules.social.api.request.SocialRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class Download1318 {
@Autowired
private SocialRequest socialRequest;
private Instant startTime;
private int totalPages = 1719;
private AtomicInteger processedPages = new AtomicInteger(0); // 使用 AtomicInteger
public void download() throws InterruptedException {
startTime = Instant.now();
// 创建一个队列来存储页码
ConcurrentLinkedQueue<Integer> pageQueue = new ConcurrentLinkedQueue<>();
for (int i = 1; i <= totalPages; i++) {
pageQueue.add(i);
}
// 创建并启动4个线程
Thread[] threads = new Thread[8];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new PageProcessor(pageQueue));
threads[i].start();
}
// 等待所有线程完成
for (Thread thread : threads) {
thread.join();
}
System.out.println("所有页面处理完成");
}
private void processPage(int page) {
File file = new File("D:/1318/" + page + ".json");
if (file.exists()) {
// System.out.println("" + page + "页文件已存在,跳过处理");
return;
}
IM1318 im1318 = new IM1318();
System.out.println("正在处理第" + page + "");
String dateTimeString = "2020-01-01 00:00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
im1318.setUpdtTime(LocalDateTime.parse(dateTimeString, formatter));
im1318.setValiFlag("1");
im1318.setPageNum(page);
im1318.setPageSize(1000);
OM1318 om1318 = socialRequest.call1318(im1318);
System.out.println(page + "/" + om1318.getPages());
List<Map<String, Object>> data = om1318.getData();
saveDataToFile(data, "D:/1318/" + page + ".json");
processedPages.incrementAndGet(); // 增加已处理的页面数
printEstimatedRemainingTime(); // 打印剩余时间估计
}
private void printEstimatedRemainingTime() {
Instant now = Instant.now();
Duration elapsedTime = Duration.between(startTime, now);
int currentProcessedPages = processedPages.get(); // 使用 get 方法获取当前处理的页面数
if (currentProcessedPages == 0) {
return; // 避免除以零
}
double averageTimePerPage = elapsedTime.toMillis() / (double) currentProcessedPages;
int remainingPages = totalPages - currentProcessedPages;
long estimatedRemainingTimeInMillis = (long) (averageTimePerPage * remainingPages);
Duration estimatedRemainingTime = Duration.ofMillis(estimatedRemainingTimeInMillis);
System.out.println("Estimated remaining time: " + estimatedRemainingTime.toHoursPart() + " hours, " +
estimatedRemainingTime.toMinutesPart() + " minutes, " +
estimatedRemainingTime.getSeconds() + " seconds");
}
private void saveDataToFile(List<Map<String, Object>> data, String filePath) {
try {
if (data == null || data.isEmpty()) {
return;
}
// data 转换为 JSON 字符串
String jsonString = JSONObject.toJSONString(data);
// 创建文件夹如果不存在
File folder = new File("D:/1318");
if (!folder.exists()) {
folder.mkdirs();
}
// 写入文件
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
try (FileWriter writer = new FileWriter(file)) {
writer.write(jsonString);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Failed to save data to file", e);
}
}
// 定义一个内部类来处理页码
private class PageProcessor implements Runnable {
private final ConcurrentLinkedQueue<Integer> pageQueue;
public PageProcessor(ConcurrentLinkedQueue<Integer> pageQueue) {
this.pageQueue = pageQueue;
}
@Override
public void run() {
while (true) {
Integer page = pageQueue.poll();
if (page == null) {
// 队列为空退出循环
break;
}
try{
processPage(page);
}catch (Exception e){
System.out.println(""+page+"页出错");
e.printStackTrace();
}
}
}
}
}

View File

@ -0,0 +1,151 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson.JSONObject;
import com.syjiaer.pharmacy.server.modules.social.api.input.IM1319;
import com.syjiaer.pharmacy.server.modules.social.api.output.OM1319;
import com.syjiaer.pharmacy.server.modules.social.api.request.SocialRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class Download1319 {
@Autowired
private SocialRequest socialRequest;
private Instant startTime;
private int totalPages = 3547;
private AtomicInteger processedPages = new AtomicInteger(0); // 使用 AtomicInteger
public void download() throws InterruptedException {
startTime = Instant.now();
// 创建一个队列来存储页码
ConcurrentLinkedQueue<Integer> pageQueue = new ConcurrentLinkedQueue<>();
for (int i = 1; i <= totalPages; i++) {
pageQueue.add(i);
}
// 创建并启动4个线程
Thread[] threads = new Thread[8];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new PageProcessor(pageQueue));
threads[i].start();
}
// 等待所有线程完成
for (Thread thread : threads) {
thread.join();
}
System.out.println("所有页面处理完成");
}
private void processPage(int page) {
File file = new File("D:/1319/" + page + ".json");
if (file.exists()) {
// System.out.println("" + page + "页文件已存在,跳过处理");
return;
}
IM1319 im1319 = new IM1319();
System.out.println("正在处理第" + page + "");
String dateTimeString = "2020-01-01 00:00:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
im1319.setUpdtTime(LocalDateTime.parse(dateTimeString, formatter));
im1319.setSelfpayPropPsnType("310");
im1319.setValiFlag("1");
im1319.setPageNum(page);
im1319.setPageSize(1000);
OM1319 om1319 = socialRequest.call1319(im1319);
System.out.println(page + "/" + om1319.getPages());
List<Map<String, Object>> data = om1319.getData();
saveDataToFile(data, "D:/1319/" + page + ".json");
processedPages.incrementAndGet(); // 增加已处理的页面数
printEstimatedRemainingTime(); // 打印剩余时间估计
}
private void printEstimatedRemainingTime() {
Instant now = Instant.now();
Duration elapsedTime = Duration.between(startTime, now);
int currentProcessedPages = processedPages.get(); // 使用 get 方法获取当前处理的页面数
if (currentProcessedPages == 0) {
return; // 避免除以零
}
double averageTimePerPage = elapsedTime.toMillis() / (double) currentProcessedPages;
int remainingPages = totalPages - currentProcessedPages;
long estimatedRemainingTimeInMillis = (long) (averageTimePerPage * remainingPages);
Duration estimatedRemainingTime = Duration.ofMillis(estimatedRemainingTimeInMillis);
System.out.println("Estimated remaining time: " + estimatedRemainingTime.toHoursPart() + " hours, " +
estimatedRemainingTime.toMinutesPart() + " minutes, " +
estimatedRemainingTime.getSeconds() + " seconds");
}
private void saveDataToFile(List<Map<String, Object>> data, String filePath) {
try {
if (data == null || data.isEmpty()) {
return;
}
// data 转换为 JSON 字符串
String jsonString = JSONObject.toJSONString(data);
// 创建文件夹如果不存在
File folder = new File("D:/1319");
if (!folder.exists()) {
folder.mkdirs();
}
// 写入文件
File file = new File(filePath);
if (file.exists()) {
file.delete();
}
try (FileWriter writer = new FileWriter(file)) {
writer.write(jsonString);
}
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Failed to save data to file", e);
}
}
// 定义一个内部类来处理页码
private class PageProcessor implements Runnable {
private final ConcurrentLinkedQueue<Integer> pageQueue;
public PageProcessor(ConcurrentLinkedQueue<Integer> pageQueue) {
this.pageQueue = pageQueue;
}
@Override
public void run() {
while (true) {
Integer page = pageQueue.poll();
if (page == null) {
// 队列为空退出循环
break;
}
try{
processPage(page);
}catch (Exception e){
System.out.println(""+page+"页出错");
e.printStackTrace();
}
}
}
}
}

View File

@ -0,0 +1,105 @@
package com.syjiaer.pharmacy.server.common.util;
import com.syjiaer.pharmacy.server.common.exception.MessageException;
import org.springframework.stereotype.Component;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
@Component
public class FileUtil {
public List<String> readToList(List<String> file_list) {
List<String> list = new ArrayList<String>();
for (String file : file_list) {
List<String> child_list = readToList(file);
list.addAll(child_list);
}
return list;
}
public List<String> readToList(String file) {
List<String> list = new ArrayList<String>();
int i = 0;
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
throw new MessageException("读取文件失败");
}
return list;
}
public String readFileToString(String path) {
StringBuilder content = new StringBuilder();
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
String line;
while ((line = br.readLine()) != null) {
content.append(line).append("\n");
}
} catch (IOException e) {
throw new MessageException("读取文件失败");
}
return content.toString();
}
public List<String> unzip(String path, String filename) {
List<String> file_list = new ArrayList<String>();
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(path + "/" + filename))) {
byte[] buffer = new byte[4096];
ZipEntry zipEntry;
while ((zipEntry = zipInputStream.getNextEntry()) != null) {
String fileName = zipEntry.getName();
String txtfilename = path + File.separator + fileName;
File newFile = new File(txtfilename);
if (txtfilename.endsWith(".txt")) {
file_list.add(txtfilename);
}
// Create directories if needed
new File(newFile.getParent()).mkdirs();
// Write the extracted file to disk
try (FileOutputStream fos = new FileOutputStream(newFile)) {
int length;
while ((length = zipInputStream.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
}
zipInputStream.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
}
return file_list;
}
public void zipFiles(String[] srcFiles, String zipFile) {
try (FileOutputStream fos = new FileOutputStream(zipFile);
ZipOutputStream zos = new ZipOutputStream(fos)) {
for (String srcFile : srcFiles) {
File fileToZip = new File(srcFile);
FileInputStream fis = new FileInputStream(fileToZip);
ZipEntry zipEntry = new ZipEntry(fileToZip.getName());
zos.putNextEntry(zipEntry);
byte[] bytes = new byte[1024];
int length;
while ((length = fis.read(bytes)) >= 0) {
zos.write(bytes, 0, length);
}
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,21 @@
package com.syjiaer.pharmacy.server.common.util;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class HeadersUtil {
private static final ThreadLocal<Map<String, String>> threadLocal = new ThreadLocal<>();
public void setMap(Map<String, String> map) {
threadLocal.set(map);
}
public Map<String, String> getMap() {
return threadLocal.get();
}
public void remove() {
threadLocal.remove();
}
}

View File

@ -0,0 +1,380 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.syjiaer.pharmacy.server.common.config.Config;
import com.syjiaer.pharmacy.server.common.exception.MessageException;
import com.syjiaer.pharmacy.server.modules.social.api.input.IM9101;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.UUID;
import java.util.logging.Logger;
@Slf4j
@Component
public class HttpUtil {
@Autowired
private Config config;
private Logger logger = Logger.getLogger(HttpUtil.class.getName());
private JSONObject post(String posturl, String params,Boolean isLog) {
String result = "";
try {
StringBuffer resultBuffer = new StringBuffer();
logger.info("调用医保请求入参==》" + params);
URL url = new URL(posturl);
URLConnection conn = url.openConnection();
//2.处理设置参数和一般请求属性
//2.1设置参数
//可以根据请求的需要设置参数
conn.setDoInput(true); //默认为true 所以不设置也可以
conn.setDoOutput(true); //默认为false 发送post请求必须设置setDoOutput(true)
conn.setUseCaches(false); //是否可以使用缓存 不使用缓存
conn.setConnectTimeout(120000);//请求超时时间
//2.2请求属性
//设置通用的请求属性 消息报头 即设置头字段 更多的头字段信息可以查阅HTTP协议
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/json");
//2.3设置请求正文 即要提交的数据
PrintWriter pw = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
pw.print(params);
pw.flush();
pw.close();
//3.使用 connect 方法建立到远程对象的实际连接
conn.connect();
//4.远程对象变为可用远程对象的头字段和内容变为可访问
BufferedReader reader = null;
String tempLine = null;
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"));
while ((tempLine = reader.readLine()) != null) {
resultBuffer.append(tempLine);
}
reader.close();
result = resultBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
logger.info("调用医保请求出参==》" + result);
JSONObject result_json = JSON.parseObject(result);
if (!result_json.getString("err_msg").equals("成功") &&!result_json.getString("err_msg").equals("success") && !result_json.getString("err_msg").isEmpty()) {
throw new MessageException(result_json.getString("err_msg"));
}
JSONObject output = result_json.getJSONObject("output");
//清理一周前记录
return output;
}
private JSONArray postArray(String posturl, String params) {
String result = "";
try {
StringBuffer resultBuffer = new StringBuffer();
logger.info("调用医保请求入参==》" + params);
URL url = new URL(posturl);
URLConnection conn = url.openConnection();
//2.处理设置参数和一般请求属性
//2.1设置参数
//可以根据请求的需要设置参数
conn.setDoInput(true); //默认为true 所以不设置也可以
conn.setDoOutput(true); //默认为false 发送post请求必须设置setDoOutput(true)
conn.setUseCaches(false); //是否可以使用缓存 不使用缓存
conn.setConnectTimeout(120000);//请求超时时间
//2.2请求属性
//设置通用的请求属性 消息报头 即设置头字段 更多的头字段信息可以查阅HTTP协议
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/json");
//2.3设置请求正文 即要提交的数据
PrintWriter pw = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
pw.print(params);
pw.flush();
pw.close();
//3.使用 connect 方法建立到远程对象的实际连接
conn.connect();
//4.远程对象变为可用远程对象的头字段和内容变为可访问
BufferedReader reader = null;
String tempLine = null;
reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"));
while ((tempLine = reader.readLine()) != null) {
resultBuffer.append(tempLine);
}
reader.close();
result = resultBuffer.toString();
} catch (Exception e) {
e.printStackTrace();
}
logger.info("调用医保请求出参==》" + result);
JSONObject result_json = JSON.parseObject(result);
if (!result_json.getString("err_msg").equals("success") && !result_json.getString("err_msg").isEmpty()) {
throw new MessageException(result_json.getString("err_msg"));
}
JSONArray output = result_json.getJSONArray("output");
return output;
}
private String download(String posturl, String params, String saveFilePath) {
StringBuffer resultBuffer = new StringBuffer();
try {
URL url = new URL(posturl);
URLConnection conn = url.openConnection();
//2.处理设置参数和一般请求属性
//2.1设置参数
//可以根据请求的需要设置参数
conn.setDoInput(true); //默认为true 所以不设置也可以
conn.setDoOutput(true); //默认为false 发送post请求必须设置setDoOutput(true)
conn.setUseCaches(false); //是否可以使用缓存 不使用缓存
conn.setConnectTimeout(120000);//请求超时时间
//2.2请求属性
//设置通用的请求属性 消息报头 即设置头字段 更多的头字段信息可以查阅HTTP协议
conn.setRequestProperty("Connection", "Keep-Alive");
conn.setRequestProperty("Content-Type", "application/json");
//2.3设置请求正文 即要提交的数据
PrintWriter pw = new PrintWriter(new OutputStreamWriter(conn.getOutputStream()));
pw.print(params);
pw.flush();
pw.close();
//3.使用 connect 方法建立到远程对象的实际连接
conn.connect();
//4.远程对象变为可用远程对象的头字段和内容变为可访问
InputStream inputStream = conn.getInputStream();
FileOutputStream outputStream = new FileOutputStream(saveFilePath);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.close();
inputStream.close();
log.info("文件下载完成");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public JSONObject call(String infno,Map<String, Object> input) {
JSONObject output = post(config.get("social", "url"), JSON.toJSONString(getparms(infno, input)),true);
return output;
}
public JSONObject call(String infno, String tag, Map<String, Object> input) {
JSONObject output = post(config.get("social", "url"), JSON.toJSONString(getparms(infno, tag, input)),true);
return output;
}
public JSONObject callWithOutLog(String infno, String tag, Map<String, Object> input) {
JSONObject output = post(config.get("social", "url"), JSON.toJSONString(getparms(infno, tag, input)), false);
return output;
}
public JSONObject callMutiply(String infno, String tag, Map<String, Object> input, Map<String, Object> inputs) {
Map<String, Object> map = getparms(infno, tag, input);
@SuppressWarnings("unchecked")
Map<String, Object> inputMap = (Map<String, Object>)map.get("input");
for (String key : inputs.keySet()){
inputMap.put(key, inputs.get(key));
}
JSONObject output = post(config.get("social", "url"), JSON.toJSONString(map),true);
return output;
}
public void callToFile(String infno, String tag, Map<String, Object> input, String saveFilePath) {
download(config.get("social", "url"), JSON.toJSONString(getparms(infno, tag, input)), saveFilePath);
}
public JSONObject callUploadFile(String filePath){
return uploadFile(config.get("social", "url"), filePath);
}
private Map<String, Object> getparms(String infno, String tag, Object input) {
Random random = new Random();
int randomNumber = random.nextInt(9000) + 1000;
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter now_str = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
DateTimeFormatter now_str2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Map<String, Object> map = new HashMap<>();
map.put("infno", infno);
map.put("insuplc_admdvs", config.get("social", "insuplcAdmdvs"));
map.put("msgid", config.get("social", "msgid") + now_str.format(now) + String.valueOf(randomNumber));
map.put("infver", "V1.0");
map.put("inf_time", now.format(now_str2));
map.put("opter", config.get("social", "opter"));
map.put("opter_name", config.get("social", "opterName"));
map.put("opter_type", "1");
map.put("fixmedins_code", config.get("social", "fixmedinsCode"));
map.put("fixmedins_name", config.get("social", "fixmedinsName"));
map.put("mdtrtarea_admvs", config.get("social", "mdtrtareaAdmvs"));
map.put("recer_sys_code", config.get("social", "recerSysCode"));
map.put("cainfo", config.get("social", "cainfo"));
map.put("sign_no", "");
HashMap<String, Object> inputMap = new HashMap<>();
inputMap.put(tag, input);
map.put("input", inputMap);
return map;
}
private Map<String, Object> getparms(String infno, Object input) {
Random random = new Random();
int randomNumber = random.nextInt(9000) + 1000;
LocalDateTime now = LocalDateTime.now();
DateTimeFormatter now_str = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
DateTimeFormatter now_str2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Map<String, Object> map = new HashMap<>();
map.put("infno", infno);
map.put("insuplc_admdvs", config.get("social", "insuplcAdmdvs"));
map.put("msgid", config.get("social", "msgid") + now_str.format(now) + String.valueOf(randomNumber));
map.put("infver", "V1.0");
map.put("inf_time", now.format(now_str2));
map.put("opter", config.get("social", "opter"));
map.put("opter_name", config.get("social", "opterName"));
map.put("opter_type", "1");
map.put("fixmedins_code", config.get("social", "fixmedinsCode"));
map.put("fixmedins_name", config.get("social", "fixmedinsName"));
map.put("mdtrtarea_admvs", config.get("social", "mdtrtareaAdmvs"));
map.put("recer_sys_code", config.get("social", "recerSysCode"));
map.put("cainfo", config.get("social", "cainfo"));
map.put("sign_no", "");
map.put("input", input);
return map;
}
// private JSONObject uploadFile(String posturl, String filePath) {
// String result = "";
// try {
// URL url = new URL(posturl);
// URLConnection conn = url.openConnection();
//
// // 设置请求属性
// conn.setDoInput(true);
// conn.setDoOutput(true);
// conn.setUseCaches(false);
// conn.setConnectTimeout(120000);
// conn.setRequestProperty("Connection", "Keep-Alive");
// conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
//
// // 写入请求正文
// try (OutputStream os = conn.getOutputStream()) {
// // 读取文件字节数组
// byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
// String fileName = Paths.get(filePath).getFileName().toString();
//
// // 写入文件部分
// os.write(("--" + boundary + "\r\n").getBytes());
// os.write(("Content-Disposition: form-data; name=\"file\"; filename=\"" + fileName + "\"\r\n").getBytes());
// os.write(("Content-Type: application/octet-stream\r\n\r\n").getBytes());
//
// os.write(fileBytes);
// os.write(("\r\n--" + boundary + "\r\n").getBytes());
// IM9101 im9101 = new IM9101();
// IM9101.Data data = new IM9101.Data();
// data.setIn(fileBytes);
// data.setFilename(fileName);
// data.setFixmedinsCode(config.get("social", "fixmedinsCode"));
// im9101.setData(data);
// Map<String, Object> parms = getparms("9101", im9101.buildToMap());
// // 构建JSON参数部分
// String jsonString = JSON.toJSONString(parms);
// logger.info("调用医保请求入参==》" + parms);
// // 写入JSON参数部分
// os.write(("Content-Disposition: form-data; name=\"params\"\r\n").getBytes());
// os.write(("Content-Type: application/json\r\n\r\n").getBytes());
// os.write((jsonString + "\r\n").getBytes());
//
// os.write(("--" + boundary + "--\r\n").getBytes());
// }
//
//// // 获取响应
//// try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "GBK"))) {
//// String tempLine;
//// StringBuilder resultBuffer = new StringBuilder();
//// while ((tempLine = reader.readLine()) != null) {
//// resultBuffer.append(tempLine);
//// }
//// result = resultBuffer.toString();
//// }
// } catch (Exception e) {
// e.printStackTrace();
// }
// logger.info("调用医保请求出参==》" + result);
// JSONObject result_json = JSON.parseObject(result);
//
// if (!result_json.getString("err_msg").equals("成功") && !result_json.getString("err_msg").equals("success") && !result_json.getString("err_msg").isEmpty()) {
// throw new MessageException(result_json.getString("err_msg"));
// }
// JSONObject output = result_json.getJSONObject("output");
// return output;
// }
private static final String boundary = UUID.randomUUID().toString();
private JSONObject uploadFile(String posturl, String filePath) {
// 写入请求正文
try {
// 读取文件字节数组
byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
String fileName = Paths.get(filePath).getFileName().toString();
IM9101 im9101 = new IM9101();
IM9101.FsUploadIn fsUploadIn = new IM9101.FsUploadIn();
fsUploadIn.setIn(fileBytes);
fsUploadIn.setFilename(fileName);
fsUploadIn.setFixmedins_code(config.get("social", "fixmedinsCode"));
im9101.setFsUploadIn(fsUploadIn);
Map<String, Object> parms = getparms("9101", im9101.buildToMap());
// 构建JSON参数部分
String jsonString = JSON.toJSONString(parms);
// 写入JSON参数部分
JSONObject result = post(posturl, jsonString, true);
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}

View File

@ -0,0 +1,30 @@
package com.syjiaer.pharmacy.server.common.util;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class InfoUtil {
private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
public void setMap(Map<String, Object> map) {
threadLocal.set(map);
}
public Map<String, Object> getMap() {
return threadLocal.get();
}
public void remove() {
threadLocal.remove();
}
public Boolean isEmpty(String key){
Map<String, Object> map = getMap();
if(map.get(key)==null||map.get(key).equals("")){
return true;
}
return false;
}
}

View File

@ -0,0 +1,60 @@
package com.syjiaer.pharmacy.server.common.util;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.ArrayList;
import java.util.List;
public class JoinQueryWrapper<T> extends QueryWrapper<T> {
private List<JoinCondition> joins = new ArrayList<>(); // 存储连接条件
// 定义连接条件类
private static class JoinCondition {
private String alias;
private String table;
private String type;
private String onCondition;
public JoinCondition(String alias, String table, String type, String onCondition) {
this.alias = alias;
this.table = table;
this.type = type;
this.onCondition = onCondition;
}
public String getAlias() {
return alias;
}
public String getTable() {
return table;
}
public String getType() {
return type;
}
public String getOnCondition() {
return onCondition;
}
}
// 实现左连接方法
public JoinQueryWrapper<T> leftJoin(String tableAlias, String tableName, String onCondition) {
joins.add(new JoinCondition(tableAlias, tableName, "LEFT JOIN", onCondition));
return this;
}
// 实现右连接方法
public JoinQueryWrapper<T> rightJoin(String tableAlias, String tableName, String onCondition) {
joins.add(new JoinCondition(tableAlias, tableName, "RIGHT JOIN", onCondition));
return this;
}
// 重写 instance 方法
@Override
protected JoinQueryWrapper<T> instance() {
return this;
}
}

View File

@ -0,0 +1,124 @@
package com.syjiaer.pharmacy.server.common.util;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.syjiaer.pharmacy.server.common.exception.MessageException;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class ParmsUtil {
private static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
public void setMap(Map<String, Object> map) {
threadLocal.set(map);
}
public Map<String, Object> getMap() {
return threadLocal.get();
}
public void remove() {
threadLocal.remove();
}
public Boolean isEmpty(String key){
Map<String, Object> map = getMap();
if(map.get(key)==null||map.get(key).equals("")){
return true;
}
return false;
}
public String getString(String key){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return "";
}
return map.get(key).toString();
}
public <T> T getObject(String key, Class<T> clazz){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return null;
}
T t = JSON.parseObject(JSON.toJSONString(map.get(key)), clazz);
return t;
}
public Map<String,Object> getMap(String key){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return null;
}
return JSON.parseObject(JSON.toJSONString(map.get(key)), Map.class);
}
public <T> List<T> getList(String key, Class<T> clazz,String empty_message){
Map<String, Object> map = getMap();
if(isEmpty(key)){
throw new MessageException(empty_message);
}
List<T> list = getList(key, clazz);
if(list==null|| list.isEmpty()){
throw new MessageException(empty_message);
}
return list;
}
public List<Integer> getIntList(String key){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return null;
}
List<Integer> _list= (List) map.get(key);
if(_list==null||_list.size()==0){
return null;
}
List<Integer> list=new ArrayList<>();
for (int i = 0; i < _list.size(); i++) {
list.add(_list.get(i));
}
return list;
}
public <T> List<T> getList(String key, Class<T> clazz){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return null;
}
List<JSONObject> _list= (List) map.get(key);
if(_list==null||_list.size()==0){
return null;
}
List<T> list=new ArrayList<>();
for (int i = 0; i < _list.size(); i++) {
JSONObject jsonObject = _list.get(i);
T t=jsonObject.toJavaObject(clazz);
list.add(t);
}
return list;
}
public Integer getInteger(String key){
Map<String, Object> map = getMap();
if(isEmpty(key)){
return null;
}
return Integer.parseInt(map.get(key).toString());
}
public String getString(String key,String empty_message){
Map<String, Object> map = getMap();
if(isEmpty(key)){
throw new MessageException(empty_message);
}
return map.get(key).toString();
}
public Integer getInteger(String key,String empty_message){
Map<String, Object> map = getMap();
if(isEmpty(key)){
throw new MessageException(empty_message);
}
return Integer.parseInt(map.get(key).toString());
}
}

View File

@ -0,0 +1,50 @@
package com.syjiaer.pharmacy.server.common.util;
import com.syjiaer.pharmacy.server.common.exception.MessageException;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@Component
public class PdfUtil {
public void setPdf(String templateName,String fileName, Map map, List<Map<String,String>> list) {
InputStream inputStream = PdfUtil.class.getClassLoader().getResourceAsStream("jasTemplate\\"+templateName+".jasper");
JRDataSource dataSource = null;
if(list == null){
dataSource = new JREmptyDataSource();
}else{
dataSource = new JRBeanCollectionDataSource(list);
}
if(map==null){
map = new HashMap();
}
try {
JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, map, dataSource);
// 生成随机文件名
String randomFileName = UUID.randomUUID().toString() + ".pdf";
// 导出PDF到指定路径
JasperExportManager.exportReportToPdfFile(jasperPrint, fileName);
// 返回随机文件名
return;
} catch (Exception e) {
e.printStackTrace();
throw new MessageException("生成PDF出错");
} finally {
try {
if (inputStream != null) {
inputStream.close(); // 确保输入流关闭
}
} catch (Exception e) {
e.printStackTrace();
throw new MessageException("关闭PDF流出错");
}
}
}
}

View File

@ -0,0 +1,21 @@
package com.syjiaer.pharmacy.server.common.util;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
public class RsaUtil {
private final String publicKeyText="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuZIsQPculdbnvQhgNN6DyvMgnr1NhYfUcL6hYbUTrO1aF/GJDBOL8HTHnII8rz5CNmG/R55Ev6nMb9kLHnhjXujDsdNpNjVtH1EZkvjxIIl87sPP0xQCeI2qScLX2Jb/41g6zv2iopwISV/tbKk4KchJaMByJFpUfA1Dpc35sjQugI2j4+MY7OSd6JFO2i/xmtwev2cBQqZ6y7YX6BgMyKxBnaYZ9sFTa5AkMZoIfMyfllQm/MFtStHcLPM/sycooQOGwYGsFCShY/4oSwaG+WlVdW28+JOHgWlNAMR7S5ebb8PkGF+Kyva/KR+EG1b8bL5MkA1iZ5+dRFrQXwE3gwIDAQAB" ;
public String decryp(String encryptedDataStr) throws Exception {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyText));
PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] encryptedData = Base64.getDecoder().decode(encryptedDataStr);
return new String(cipher.doFinal(encryptedData));
}
}

View File

@ -0,0 +1,12 @@
package com.syjiaer.pharmacy.server.common.util;
import org.springframework.stereotype.Component;
import java.util.UUID;
@Component
public class StringUtil {
public String generateRandomId() {
return UUID.randomUUID().toString();
}
}

View File

@ -0,0 +1,21 @@
package com.syjiaer.pharmacy.server.common.vo;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.function.Function;
@Setter
@Getter
public class Page<T> {
private int total_page;
private long total_count;
private List<T> list;
public Page<T> process(Page<T> page, Function<List<T>, List<T>> processor) {
List<T> processedList = processor.apply(page.getList());
page.setList(processedList);
return page;
}
}

View File

@ -0,0 +1,31 @@
package com.syjiaer.pharmacy.server.common.vo;
public class Result<T> {
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}

View File

@ -0,0 +1,137 @@
package com.syjiaer.pharmacy.server.modules.base.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.syjiaer.pharmacy.server.common.exception.VerifyException;
import com.syjiaer.pharmacy.server.common.util.HeadersUtil;
import com.syjiaer.pharmacy.server.common.util.InfoUtil;
import com.syjiaer.pharmacy.server.common.util.ParmsUtil;
import com.syjiaer.pharmacy.server.common.vo.Page;
import com.syjiaer.pharmacy.server.common.vo.Result;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
import com.syjiaer.pharmacy.server.modules.base.service.ICommonLogService;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
public abstract class BaseController {
@Value("${jwt.secret}")
protected String jwtSecret;
@Autowired
protected ParmsUtil parmsUtil;
@Autowired
protected HeadersUtil headersUtil;
@Autowired
protected InfoUtil infoUtil;
@Autowired
private ICommonLogService commonLogService;
// 使用 ThreadLocal 来缓存请求参数
public Boolean isEmpty(String key, Map<String, Object> map) {
if (map.get(key) == null || map.get(key).toString().isEmpty()) {
return true;
}
return false;
}
protected <T> Result<T> success() {
Result<T> result = new Result<>();
result.setCode(0);
return result;
}
protected <T> Result<T> success(T data) {
Result<T> result = new Result<>();
result.setCode(0);
result.setData(data);
return result;
}
protected <T> Result<T> error(String message) {
Result<T> result = new Result<>();
result.setCode(1001);
result.setMessage(message);
return result;
}
protected <T> Result<T> error(int code, String message) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMessage(message);
return result;
}
;
protected Map<String, Object> getParms() {
return parmsUtil.getMap();
}
protected Map<String, String> getHeaders() {
return headersUtil.getMap();
}
protected HttpServletRequest getRequest() {
return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
}
protected ManagerUser getManagerUser() {
Map<String, String> headers = getHeaders();
String token = headers.get("authorization");
if (token == null || token.isEmpty()) {
throw new VerifyException("登陆令牌不存在,请重新登陆");
}
Jws<Claims> claimsJws = null;
try {
claimsJws = Jwts.parser()
.verifyWith(Keys.hmacShaKeyFor(jwtSecret.getBytes()))
.build()
.parseSignedClaims(token);
} catch (JwtException e) {
throw new VerifyException("用户身份验证已失效,请重新登陆");
} catch (Exception e) {
throw new VerifyException("未知验证错误,请重新登陆");
}
if (claimsJws == null) {
throw new VerifyException("用户身份验证已失效,请重新登陆");
}
Claims claims = claimsJws.getPayload();
ManagerUser managerUser = new ManagerUser();
managerUser.setId(Integer.parseInt(claims.getSubject()));
managerUser.setUsername(claims.get("username", String.class));
managerUser.setName(claims.get("name", String.class));
return managerUser;
}
protected DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
protected Page pageHelper(int pageNum, int pageSize, QueryWrapper queryWrapper, IService iservice){
Long totalCount = iservice.count(queryWrapper);
queryWrapper.last("LIMIT " + (pageNum - 1) * pageSize + ", " + pageSize);
List list = iservice.list(queryWrapper);
Page page = new Page();
page.setList(list);
page.setTotal_count(totalCount);
page.setTotal_page((int) Math.ceil(totalCount / (double) pageSize));
return page;
}
protected void saveLog(String message){
ManagerUser managerUser = getManagerUser();
commonLogService.saveLog(message,managerUser.getId());
}
}

View File

@ -0,0 +1,6 @@
package com.syjiaer.pharmacy.server.modules.base.controller;
public class BaseDefaultController extends BaseController {
}

View File

@ -0,0 +1,35 @@
package com.syjiaer.pharmacy.server.modules.base.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.syjiaer.pharmacy.server.common.vo.Page;
import org.springframework.beans.factory.annotation.Value;
import java.util.List;
public class BaseSocialController extends BaseController {
@Value("${common.isdev}")
private Boolean isdev;
protected Page SelectPage(QueryWrapper queryWrapper, int page_num, int size, IService service, String order_field, String order_type) {
Long total_count = service.count(queryWrapper);
queryWrapper.last("LIMIT " + size + " OFFSET " + (page_num - 1) * size);
if (order_type.equals("asc")) {
queryWrapper.orderByAsc(order_field);
} else {
queryWrapper.orderByDesc(order_field);
}
List socialDirectoryList = service.list(queryWrapper);
int total_page = (int) Math.ceil((double) total_count / size);
Page page = new Page();
page.setTotal_page(total_page);
page.setTotal_count(total_count);
page.setList(socialDirectoryList);
return page;
}
protected Page SelectPage(QueryWrapper queryWrapper, int page_num, int size, IService service) {
return SelectPage(queryWrapper, page_num, size, service, "id", "asc");
}
}

View File

@ -0,0 +1,73 @@
package com.syjiaer.pharmacy.server.modules.base.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.syjiaer.pharmacy.server.common.vo.Result;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonConfig;
import com.syjiaer.pharmacy.server.modules.base.service.ICommonConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 前端控制器
* </p>
*
* @author NiuZiYuan
* @since 2025-02-24
*/
@RestController
@RequestMapping("/common/config")
public class CommonConfigController extends BaseController {
@Autowired
private ICommonConfigService iCommonConfigService;
@RequestMapping("list")
public Result<Object> list() {
return success(iCommonConfigService.list());
}
@RequestMapping("getall")
public Result<Object> getall() {
List<CommonConfig> list = iCommonConfigService.list();
Map<String,String> map=new HashMap<>();
for (CommonConfig commonConfig : list) {
map.put(commonConfig.getK(),commonConfig.getVal());
}
return success(map);
}
@RequestMapping("edit")
public Result<Object> edit() {
Map<String, Object> parms = getParms();
for (String key : parms.keySet()) {
CommonConfig commonConfig = new CommonConfig();
commonConfig.setK(key);
commonConfig.setVal(parms.get(key).toString());
iCommonConfigService.saveOrUpdate(commonConfig);
}
return success();
}
@RequestMapping("setcert")
public Result<Object> sercert() {
Map<String, Object> parms = getParms();
String encryptedText= parmsUtil.getString("encryptedText","请输入密文");
CommonConfig commonConfig=new CommonConfig();
commonConfig.setK("common_cert");
commonConfig.setVal(encryptedText);
iCommonConfigService.saveOrUpdate(commonConfig);
return success();
}
@RequestMapping("get")
public Result<Object> get() {
String key= parmsUtil.getString("key","请输入key");
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.eq("k",key);
return success(iCommonConfigService.getOne(queryWrapper));
}
}

View File

@ -0,0 +1,73 @@
package com.syjiaer.pharmacy.server.modules.base.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.syjiaer.pharmacy.server.common.vo.Result;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
import com.syjiaer.pharmacy.server.modules.base.service.IManagerUserService;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;
/**
* <p>
* 前端控制器
* </p>
*
* @author NiuZiYuan
* @since 2025-02-28
*/
@RestController
@RequestMapping("/manager/user")
public class ManagerUserController extends BaseDefaultController {
@Autowired
private IManagerUserService managerUserService;
@Value("${jwt.expiration}")
private long jwtExpiration;
@PostMapping("login")
public Result login() {
Map<String, Object> parms = getParms();
String username = (String) parms.get("username");
String password = (String) parms.get("password");
if (username == null || username.isEmpty()) {
return error("请输入用户名");
}
if (password == null || password.isEmpty()) {
return error("请输入密码");
}
ManagerUser managerUser = managerUserService.getOne(new QueryWrapper<ManagerUser>().eq("username", username).eq("password", password));
if (managerUser == null) {
return error("用户名或密码错误");
}
Date exdata = new Date(System.currentTimeMillis() + jwtExpiration * 1000);
System.out.println(exdata);
SecretKey key = Keys.hmacShaKeyFor(jwtSecret.getBytes());
String token = Jwts.builder()
.subject(managerUser.getId().toString()) // 用户ID作为主题
.expiration(exdata)
.claim("username", managerUser.getUsername()) // 添加自定义声明
.claim("name", managerUser.getName()) // 添加自定义声明
.claim("userId", managerUser.getId())
.signWith(key)
.compact();
return success(token);
}
//验证token
@PostMapping("verify")
public Result verify() {
ManagerUser managerUser =getManagerUser();
return success(managerUser);
}
}

View File

@ -0,0 +1,37 @@
package com.syjiaer.pharmacy.server.modules.base.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
* 配置信息表
* </p>
*
* @author NiuZiYuan
* @since 2025-03-09
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("common_config")
@ApiModel(value = "CommonConfig对象", description = "配置信息表")
public class CommonConfig implements Serializable {
private static final long serialVersionUID = 1L;
@TableId("k")
@ApiModelProperty("")
private String k;
@ApiModelProperty("")
private String val;
}

View File

@ -0,0 +1,41 @@
package com.syjiaer.pharmacy.server.modules.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
*
* </p>
*
* @author NiuZiYuan
* @since 2025-04-14
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("common_log")
@ApiModel(value = "CommonLog对象", description = "")
public class CommonLog implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String message;
private Integer managerId;
private LocalDateTime createDatetime;
}

View File

@ -0,0 +1,51 @@
package com.syjiaer.pharmacy.server.modules.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* <p>
*
* </p>
*
* @author NiuZiYuan
* @since 2025-04-02
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("manager_user")
@ApiModel(value = "ManagerUser对象", description = "")
public class ManagerUser implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("自增主键")
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("用户名")
private String username;
@ApiModelProperty("密码")
private String password;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("用户类型 0管理员 1销售人 2药师")
private Integer type;
@ApiModelProperty("0禁用 1启用")
private Integer status;
}

View File

@ -0,0 +1,16 @@
package com.syjiaer.pharmacy.server.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonConfig;
/**
* <p>
* Mapper 接口
* </p>
*
* @author NiuZiYuan
* @since 2025-02-24
*/
public interface CommonConfigMapper extends BaseMapper<CommonConfig> {
}

View File

@ -0,0 +1,18 @@
package com.syjiaer.pharmacy.server.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonLog;
/**
* <p>
* Mapper 接口
* </p>
*
* @author NiuZiYuan
* @since 2025-04-14
*/
public interface CommonLogMapper extends BaseMapper<CommonLog> {
}

View File

@ -0,0 +1,18 @@
package com.syjiaer.pharmacy.server.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
/**
* <p>
* Mapper 接口
* </p>
*
* @author NiuZiYuan
* @since 2025-02-28
*/
public interface ManagerUserMapper extends BaseMapper<ManagerUser> {
}

View File

@ -0,0 +1,16 @@
package com.syjiaer.pharmacy.server.modules.base.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonConfig;
/**
* <p>
* 服务类
* </p>
*
* @author NiuZiYuan
* @since 2025-02-24
*/
public interface ICommonConfigService extends IService<CommonConfig> {
}

View File

@ -0,0 +1,18 @@
package com.syjiaer.pharmacy.server.modules.base.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonLog;
/**
* <p>
* 服务类
* </p>
*
* @author NiuZiYuan
* @since 2025-04-14
*/
public interface ICommonLogService extends IService<CommonLog> {
void saveLog(String message, Integer managerId);
}

View File

@ -0,0 +1,16 @@
package com.syjiaer.pharmacy.server.modules.base.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
/**
* <p>
* 服务类
* </p>
*
* @author NiuZiYuan
* @since 2025-02-28
*/
public interface IManagerUserService extends IService<ManagerUser> {
}

View File

@ -0,0 +1,20 @@
package com.syjiaer.pharmacy.server.modules.base.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonConfig;
import com.syjiaer.pharmacy.server.modules.base.mapper.CommonConfigMapper;
import com.syjiaer.pharmacy.server.modules.base.service.ICommonConfigService;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author NiuZiYuan
* @since 2025-02-24
*/
@Service
public class CommonConfigServiceImpl extends ServiceImpl<CommonConfigMapper, CommonConfig> implements ICommonConfigService {
}

View File

@ -0,0 +1,30 @@
package com.syjiaer.pharmacy.server.modules.base.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.syjiaer.pharmacy.server.modules.base.entity.CommonLog;
import com.syjiaer.pharmacy.server.modules.base.mapper.CommonLogMapper;
import com.syjiaer.pharmacy.server.modules.base.service.ICommonLogService;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* <p>
* 服务实现类
* </p>
*
* @author NiuZiYuan
* @since 2025-04-14
*/
@Service
public class CommonLogServiceImpl extends ServiceImpl<CommonLogMapper, CommonLog> implements ICommonLogService {
@Override
public void saveLog(String message, Integer managerId) {
CommonLog commonLog = new CommonLog();
commonLog.setMessage(message);
commonLog.setManagerId(managerId);
commonLog.setCreateDatetime(LocalDateTime.now());
save(commonLog);
}
}

View File

@ -0,0 +1,20 @@
package com.syjiaer.pharmacy.server.modules.base.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.syjiaer.pharmacy.server.modules.base.entity.ManagerUser;
import com.syjiaer.pharmacy.server.modules.base.mapper.ManagerUserMapper;
import com.syjiaer.pharmacy.server.modules.base.service.IManagerUserService;
import org.springframework.stereotype.Service;
/**
* <p>
* 服务实现类
* </p>
*
* @author NiuZiYuan
* @since 2025-02-28
*/
@Service
public class ManagerUserServiceImpl extends ServiceImpl<ManagerUserMapper, ManagerUser> implements IManagerUserService {
}

View File

@ -0,0 +1,12 @@
package com.syjiaer.pharmacy.server.modules.social;
import com.syjiaer.pharmacy.server.common.util.InfoUtil;
import org.springframework.beans.factory.annotation.Autowired;
public abstract class BaseService {
@Autowired
private InfoUtil infoUtil;
public void commonLog(String message){
}
}

View File

@ -0,0 +1,59 @@
package com.syjiaer.pharmacy.server.modules.social.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.experimental.Accessors;
/**
* <p>
* 医保目录
* </p>
*
* @author NiuZiYuan
* @since 2025-04-16
*/
@Getter
@Setter
@ToString
@Accessors(chain = true)
@TableName("social_directory")
@ApiModel(value = "SocialDirectory对象", description = "医保目录")
public class SocialDirectory implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty("主键")
private String id;
@ApiModelProperty("医保目录编码")
private String code;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("检索关键词")
private String keyword;
@ApiModelProperty("类型")
private Integer type;
@ApiModelProperty("生产企业")
private String producer;
@ApiModelProperty("数据创建时间")
private LocalDateTime createDatetime;
@ApiModelProperty("数据更新时间")
private LocalDateTime updateDatetime;
@ApiModelProperty("版本名称")
private String versionName;
@ApiModelProperty("json处理后的数据")
private String data;
}

View File

@ -0,0 +1,18 @@
package com.syjiaer.pharmacy.server.modules.social.mapper;
import com.syjiaer.pharmacy.server.modules.social.entity.SocialDirectory;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 医保目录 Mapper 接口
* </p>
*
* @author NiuZiYuan
* @since 2025-04-16
*/
public interface SocialDirectoryMapper extends BaseMapper<SocialDirectory> {
}

View File

@ -0,0 +1,10 @@
package com.syjiaer.pharmacy.server.modules.social.service;
import com.syjiaer.pharmacy.server.modules.social.BaseService;
import org.springframework.stereotype.Service;
@Service
public class SocialDirectoryService extends BaseService {
}

View File

@ -0,0 +1,28 @@
spring:
application:
name: server
datasource:
driver-class-name: org.postgresql.Driver
url: jdbc:postgresql://dev.jizhiweb.cn:15321/syjiaer_pharmacy
username: postgres
password: i7L0BS91pADGuy7z
hikari:
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 300000
max-lifetime: 1800000
connection-timeout: 30000
leak-detection-threshold: 60000
initialization-fail-timeout: 60000
keepalive-time: 30000
config:
import: optional:classpath:developer-config.yml
server:
port: 8080
common:
isdev: true
jwt:
secret: Lrhcnqby4UiFnFqQIWGp8051odVDtqEHaMeDvdzwGhsUPa2nEUAPrlPHTKaABWoM
expiration: 86400
mybatis-plus:
mapper-locations: classpath*:xml/*.xml

View File

@ -0,0 +1,3 @@
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.syjiaer.pharmacy.server.modules.social.mapper.SocialDirectoryMapper">
</mapper>

View File

@ -0,0 +1,13 @@
package com.syjiaer.pharmacy.server;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ServerApplicationTests {
@Test
void contextLoads() {
}
}