Commit 26bebfcf by wangweidong

霍煤鸿骏修改

parent 7de7533e
FROM java:8
VOLUME /tmp
EXPOSE 8005
# Path to jar created by gradle build
ADD build/libs/patzn-cloud-service-lims-1.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
\ No newline at end of file
ext {
configuration = [
javaVersion = JavaVersion.VERSION_1_8
]
// 仓库配置
repositories {
mavenLocal()
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://repo.spring.io/release' }
maven { url 'https://repo.spring.io/milestone' }
maven { url 'http://repo.spring.io/snapshot' }
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
maven { url 'http://119.3.176.130:8081/repository/patzn-releases/' }
maven { url 'http://119.3.176.130:8081/repository/patzn-snapshots/' }
jcenter()
}
}
// 编译脚本
buildscript {
ext {
springBootVersion = "2.3.0.RELEASE"
springCloudVersion = "Hoxton.SR5"
nettyAllVersion = '4.1.43.Final'
}
// 仓库配置
repositories {
mavenLocal()
maven { url 'https://maven.aliyun.com/repository/central' }
maven { url 'https://repo.spring.io/release' }
maven { url 'https://repo.spring.io/milestone' }
maven { url 'http://repo.spring.io/snapshot' }
maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' }
jcenter()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: "java"
apply plugin: "maven"
apply plugin: "idea"
apply plugin: 'org.springframework.boot'
apply plugin: "io.spring.dependency-management"
group = "com.patzn.cloud"
version = "1.0"
description "计量检定服务"
sourceCompatibility = "${javaVersion}"
targetCompatibility = "${javaVersion}"
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
configurations {
compile.exclude group: "ch.qos.logback"
compile.exclude group: "com.amazonaws"
compile.exclude group: "org.apache.tomcat"
// 使用Undertow 替代Tomcat
compile.exclude module: "spring-boot-starter-tomcat"
compile.exclude module: "undertow-websockets-jsr"
compile.exclude module: "spring-boot-starter-logging"
compile.exclude module: "slf4j-simple"
compile.exclude module: "slf4j-log4j12"
}
// 依赖管理
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
compile fileTree(dir: "libs", include: "*.jar")
// 报表依赖 Begin
compile("org.apache.commons:commons-lang3:3.5")
compile("commons-beanutils:commons-beanutils-core:1.8.3")
compile("com.itextpdf:itextpdf:5.5.13")
compile("com.google.zxing:core:3.3.3")
compile("org.codehaus.jackson:jackson-mapper-asl:1.9.13")
compile("commons-io:commons-io:2.5")
compile("commons-fileupload:commons-fileupload:1.3.3")
compile("org.antlr:antlr4-runtime:4.7.1")
compile("org.dom4j:dom4j:2.1.1")
// 报表依赖 End
compile("com.baomidou:jobs-spring-boot-starter:1.0.3.3")
compile("io.netty:netty-all:${nettyAllVersion}")
compile("com.cronutils:cron-utils:9.0.2")
compile("com.caucho:hessian:4.0.62")
compile("com.patzn.cloud:patzn-entitys:2.0")
compile("com.patzn.cloud:patzn-entity-project:2.0")
compile("com.patzn.cloud:patzn-feign-base:2.0")
compile("com.patzn.cloud:patzn-feign-lims:2.0")
compile("com.patzn.cloud:patzn-feign-project:2.0")
compile("com.patzn.cloud:patzn-service-parent:2.0")
compile("com.patzn.cloud:patzn-oss-starter:2.0")
compile("com.patzn.cloud:patzn-mq-starter:2.0")
compile("org.springframework.boot:spring-boot-starter-mail")
compile('org.springframework.boot:spring-boot-starter-freemarker')
compile("org.springframework.boot:spring-boot-starter-data-redis")
compile("com.belerweb:pinyin4j:2.5.1")
compile("com.patzn.cloud:patzn-poi-box:2.0")
compile("net.coobird:thumbnailator:0.4.8")
compile("com.google.guava:guava:25.1-jre")
compile("net.java.dev.jna:jna-platform:4.5.2")
compile("net.coobird:thumbnailator:0.4.13")
compile("net.java.dev.jna:jna:4.5.2")
compile("com.google.zxing:core:3.3.3")
compile("org.samba.jcifs:jcifs:1.2.9")
compile("com.google.zxing:javase:3.3.3")
compile("com.baomidou:dynamic-datasource-spring-boot-starter:2.5.7")
compile("com.qcloud:cos_api:5.2.4") {
exclude module: 'slf4j-log4j12'
}
compile("org.json:json:20170516")
// compile group: 'cn.afterturn',name:'easypoi-spring-boot-starter',version:'4.0.0'
// 开发环境经常自动启动导致报错
// compileOnly("org.springframework.boot:spring-boot-devtools")
/*compile("mysql:mysql-connector-java:8.0.12")*/
// 监控客户端
compile("de.codecentric:spring-boot-admin-starter-client:2.2.0")
// 编译测试
testCompile("com.patzn.cloud:patzn-test-parent:2.0")
implementation('org.springframework.boot:spring-boot-starter-data-mongodb')
}
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
\ No newline at end of file
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
\ No newline at end of file
// 帕特智能 - 云平台计量检测服务模块
rootProject.name = 'patzn-cloud-service-hmhj'
package com.patzn.cloud.service.lims;
import com.patzn.cloud.commons.lock.EnableRedisDistributedLock;
import com.patzn.cloud.commons.spring.SpringHelper;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* LimsService 实验室管理服务
*
* @author hubin
* @since 2017-08-28
*/
@EnableAsync
@EnableCaching
@EnableSwagger2
@EnableDiscoveryClient
@EnableRedisDistributedLock
@SpringBootApplication
@EnableTransactionManagement
@EnableFeignClients(basePackages = {"com.patzn.cloud.feign"})
public class HmhjServiceApplication {
public static void main(String[] args) {
try {
SpringApplication application = new SpringApplication(HmhjServiceApplication.class);
application.setBannerMode(Banner.Mode.CONSOLE);
SpringHelper.setApplicationContext(application.run(args));
System.out.println("SoilService start!\thttp://api.dev.patzn.com:7000/hmhj/swagger-ui.html");
} catch (Throwable t) {
t.printStackTrace();
}
}
}
package com.patzn.cloud.service.lims.common;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import com.baomidou.mybatisplus.toolkit.CollectionUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
public class AsposeUtil {
protected static final Logger logger = LoggerFactory.getLogger(AsposeUtil.class);
public static File mergeWork(String name,Workbook workbook, List<Workbook> workbooksList){
if (CollectionUtils.isEmpty(workbooksList)){
return null;
}
FileOutputStream fileOutputStream=null;
FileOutputStream fileOut=null;
try {
for (Workbook book:workbooksList) {
workbook.combine(book);
}
File tempFile = File.createTempFile(name+"pre",".xlsx");
fileOut =new FileOutputStream(tempFile);
workbook.save(fileOut, SaveFormat.XLSX);
XSSFWorkbook workbookOk = new XSSFWorkbook(tempFile);
workbookOk.setActiveSheet(0);
workbookOk.removeSheetAt(workbookOk.getNumberOfSheets()-1);
File file = File.createTempFile(name,".xlsx");
fileOutputStream=new FileOutputStream(file);
workbookOk.write(fileOutputStream);
fileOut.flush();
return file;
}catch (Exception e){
logger.error("合并EXCEL失败"+e.getMessage());
e.printStackTrace();
}finally {
try {
if (null !=fileOut){
fileOut.close();
}
if (null !=fileOutputStream){
fileOutputStream.close();
}
}catch (Exception e){
}
}
return null;
}
}
package com.patzn.cloud.service.lims.common;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.EncryptedDocumentException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class ChangeExcelData {
public static void main(String[] args) throws IOException, EncryptedDocumentException, InvalidFormatException {
String path = "D:\\HHKJ\\project\\test\\excel.xlsx";
String outPath = "D:\\HHKJ\\project\\test\\excel1.xlsx";
Map<String, Object> params = new HashMap<String, Object>();
params.put("county", "阳朔");
params.put("patroltime", "2019年1月15日");
params.put("address", "具体地点");
params.put("slyz_type", "乱建");
params.put("rectify", "2019年1月15日");
params.put("rectifyrequest", "拆除乱建");
params.put("sendtime", "2019年1月15日");
new ChangeExcelData().replaceExcel(path,outPath,params);
}
public void replaceExcel(String inPath, String outPath, Map params) throws IOException, InvalidFormatException {
InputStream is = new FileInputStream(new File(inPath));
Workbook wb = WorkbookFactory.create(is);
Sheet sheet = wb.getSheetAt(0);//获取Excel的工作表sheet,下标从0开始。
int trLength = sheet.getLastRowNum();//获取Excel的行数
for (int i = 0; i < trLength; i++) {
Row row = sheet.getRow(i);//获取Excel的行,下标从0开始
if (row == null) {//若行为空,则遍历下一行
continue;
}
int minColIx = row.getFirstCellNum();
int maxColIx = row.getLastCellNum();
for (int colIx = minColIx; colIx < maxColIx; colIx++) {
Cell cell = row.getCell(colIx);//获取指定单元格,单元格从左到右下标从0开始
String runText = cell.getStringCellValue();
if (runText.equals("")){
continue;
}
System.out.println(cell);
Matcher matcher = this.matcher(runText);
if (matcher.find()) {
while ((matcher = this.matcher(runText)).find()) {
runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
}
cell.setCellValue(runText);
}
}
}
OutputStream out = new FileOutputStream(new File(outPath));
wb.write(out);
is.close();
out.close();
}
/**
* 正则匹配字符串
* @param str
* @return
*/
private Matcher matcher(String str) {
Pattern pattern = Pattern.compile("\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher;
}
}
package com.patzn.cloud.service.lims.common;
import com.aspose.cells.License;
import com.aspose.cells.SaveFormat;
import com.aspose.cells.Workbook;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
/**
* @version 1.0 说明 :
*/
public class Excel2Pdf {
public static boolean getLicense() {
boolean result = false;
try {
InputStream is = Word2Pdf.class.getClassLoader()
.getResourceAsStream("classpath:statis/license.xml");
License aposeLic = new License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void excel2pdf(String sourceFilePath, String desFilePath) {
// 验证License 若不验证则转化出的pdf文档会有水印产生
if (!getLicense()) {
return;
}
try {
// 输出路径
File pdfFile = new File(desFilePath);
// 原始excel路径
Workbook wb = new Workbook(sourceFilePath);
FileOutputStream fileOS = new FileOutputStream(pdfFile);
wb.save(fileOS, SaveFormat.PDF);
fileOS.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.patzn.cloud.service.lims.common;
import com.patzn.cloud.commons.api.RestAssert;
import com.patzn.poibox.xwpf.HSSFWorkbookUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class ExcelReader {
protected static final Logger logger = LoggerFactory.getLogger(ExcelReader.class);
public static <T> Collection<T> readSheetAtOne(Class<T> type, MultipartFile file, List<String> listTemplate, List<String> listColumn) {
InputStream io = null;
XSSFWorkbook workbook = null;
try {
io=file.getInputStream();
workbook = new XSSFWorkbook(io);
}catch (Exception e){
logger.error("ExcelReader error :"+e.getMessage());
e.printStackTrace();
}
XSSFSheet sheet0= workbook.getSheetAt(0);
XSSFRow row0= sheet0.getRow(0);
int cellNum= row0.getLastCellNum();
List<String> listTitle=new ArrayList<>();
for (int i = 0; i < cellNum; i++) {
XSSFCell cell= row0.getCell(i);
String value = HSSFWorkbookUtil.getJavaValue(cell).toString();
listTitle.add(value);
}
RestAssert.fail(listTitle.size()!=listTemplate.size(),"请下载模板按照模板填写数据后导入");
int size = listTemplate.size();
for (int i = 0; i < size; i++) {
String c1 = listTitle.get(i);
String c2 = listTemplate.get(i);
RestAssert.fail(!c2.equals(c1),"请下载模板按照模板填写数据后导入");
}
int rowNum = sheet0.getLastRowNum();
Collection<T> etos = new ArrayList<>();
try {
for (int i = 1; i <= rowNum ; i++) {
T eto = type.newInstance();
XSSFRow row = sheet0.getRow(i);
for (int j = 0; j < size; j++) {
Field f = eto.getClass().getDeclaredField(listColumn.get(j));
f.setAccessible(true);
f.set(eto, HSSFWorkbookUtil.getJavaValue(row.getCell(j)).toString());
}
etos.add(eto);
}
}catch (Exception e){
RestAssert.fail("导入失败");
}finally {
try {
io.close();
workbook.close();
}catch (Exception e){
e.printStackTrace();
}
}
return etos;
}
}
package com.patzn.cloud.service.lims.common;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
public class LabreOfficeUtil {
private static final Logger logger = LoggerFactory.getLogger(LabreOfficeUtil.class);
//
//
//
//
//
//
//
// public static synchronized File libreOffice2PDF(String url,File inputfile) {
// logger.error("LabreOfficeUtil开始转化PDF");
// String fileName = inputfile.getName().replace(".xlsx","");
// File outputfile=null;
// String LibreOffice_HOME = url;
// DefaultOfficeManagerConfiguration configuration = new DefaultOfficeManagerConfiguration();
// OfficeManager officeManager=null;
// logger.error("fileName"+fileName);
// try {
//
//
// outputfile= File.createTempFile(fileName,".pdf");
//
//
// logger.error("outputfile"+outputfile.getName());
//
//
// // libreOffice的安装目录
// configuration.setOfficeHome(new File(LibreOffice_HOME));
// // 端口号
// configuration.setPortNumber(8100);
// //configuration.setPortNumbers(ports);
// logger.error("configuration.setPortNumber(8100);F");
// configuration.setTaskExecutionTimeout(1000 * 60 * 25L);
//// 设置任务执行超时为10分钟
// configuration.setTaskQueueTimeout(1000 * 60 * 60 * 24L);
//// 设置任务队列超时为24小时
// officeManager = configuration.buildOfficeManager();
// officeManager.start();
// OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
// converter.getFormatRegistry();
// converter.convert(inputfile, outputfile);
// } catch (Exception e) {
// logger.error("pdf转化失败"+e.getMessage());
// e.printStackTrace();
// } finally {
// officeManager.stop();
// }
//
// return outputfile;
//
//
//
// }
public static void main(String[] args) {
convertOffice2PDF("D:/patzn-lims/libreoffice6.1/libreoffice6.1",new File("D:/icps/aaa.xlsx"));
}
public static synchronized File convertOffice2PDF(String url,File inputFile){
long start = System.currentTimeMillis();
boolean flag;
String parent= inputFile.getParent();
String pdfFile = parent+"/"+(inputFile.getName().replace(".xlsx",".pdf"));
// String osName = System.getProperty("os.name");
// if (osName.contains("Windows")) {
// }else {
// command = "libreoffice --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile + " --outdir " + pdfFile;
// }
String osName = System.getProperty("os.name");
String command="";
if(osName.contains("win")||osName.contains("Win")){
command = "cmd /c soffice --headless --invisible --convert-to pdf " + inputFile.getPath() + " --outdir " + parent;
flag = executeLibreOfficeCommand(command,url);
}else{
command = "libreoffice6.2 --headless --invisible --convert-to pdf:writer_pdf_Export " + inputFile.getPath() + " --outdir " + parent;
flag = executeLibreOfficeCommand(command);
}
long end = System.currentTimeMillis();
logger.debug("用时:{} ms", end - start);
if (true){
return new File(pdfFile);
}
return null;
}
/**
* 执行command指令
* @param command
* @return
*/
public static boolean executeLibreOfficeCommand(String command,String url) {
logger.info("开始进行转化.......");
Process process;// Process可以控制该子进程的执行或获取该子进程的信息
try {
logger.debug("convertOffice2PDF cmd : {}", command);
process = Runtime.getRuntime().exec(command,null,new File(url+"/program"));// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
// 下面两个可以获取输入输出流
// InputStream errorStream = process.getErrorStream();
// InputStream inputStream = process.getInputStream();
} catch (IOException e) {
logger.error(" convertOffice2PDF {} error", command, e);
return false;
}
int exitStatus = 0;
try {
exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
// 第二种接受返回值的方法
int i = process.exitValue(); // 接收执行完毕的返回值
logger.debug("i----" + i);
} catch (InterruptedException e) {
logger.error("InterruptedException convertOffice2PDF {}", command, e);
return false;
}
if (exitStatus != 0) {
logger.error("convertOffice2PDF cmd exitStatus {}", exitStatus);
} else {
logger.debug("convertOffice2PDF cmd exitStatus {}", exitStatus);
}
process.destroy(); // 销毁子进程
logger.info("转化结束.......");
return true;
}
public static boolean executeLibreOfficeCommand(String command) {
logger.info("开始进行转化.......");
Process process;// Process可以控制该子进程的执行或获取该子进程的信息
try {
logger.debug("convertOffice2PDF cmd : {}", command);
process = Runtime.getRuntime().exec(command);// exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。
// 下面两个可以获取输入输出流
// InputStream errorStream = process.getErrorStream();
// InputStream inputStream = process.getInputStream();
} catch (IOException e) {
logger.error(" convertOffice2PDF {} error", command, e);
return false;
}
int exitStatus = 0;
try {
exitStatus = process.waitFor();// 等待子进程完成再往下执行,返回值是子线程执行完毕的返回值,返回0表示正常结束
// 第二种接受返回值的方法
int i = process.exitValue(); // 接收执行完毕的返回值
logger.debug("i----" + i);
} catch (InterruptedException e) {
logger.error("InterruptedException convertOffice2PDF {}", command, e);
return false;
}
if (exitStatus != 0) {
logger.error("convertOffice2PDF cmd exitStatus {}", exitStatus);
} else {
logger.debug("convertOffice2PDF cmd exitStatus {}", exitStatus);
}
process.destroy(); // 销毁子进程
logger.info("转化结束.......");
return true;
}
}
package com.patzn.cloud.service.lims.common;
public class LongHandleUtils {
public static boolean isYes(Integer num){
return null!=num&&num.equals(1);
}
}
package com.patzn.cloud.service.lims.common;
import java.util.*;
public final class MsgUrlDataUtils {
public static final String REVIEW_URL = "/entrust/entrust_review";
}
package com.patzn.cloud.service.lims.common;
import com.patzn.cloud.commons.toolkit.StringHandleUtils;
import java.util.Comparator;
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if (StringHandleUtils.isNumeric(o1)&&StringHandleUtils.isNumeric(o2)) {
return Integer.parseInt(o1)-Integer.parseInt(o2);
} else{
return o1.compareTo(o2);
}
}
@Override
public boolean equals(Object obj) {
return false;
}
}
package com.patzn.cloud.service.lims.common;
import java.time.Instant;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.FastDateFormat;
/**
* 订单编号策略
*
* @project common-utils
* @fileName ODDGenerator.java
* @Description
* @author light-zhang
* @date 2018年5月11日
* @version 1.0.0
*/
public abstract class ODDGenerator {
private static final FastDateFormat pattern = FastDateFormat.getInstance("yyyyMMddHHmmss");
private static final AtomicInteger atomicInteger = new AtomicInteger(1);
private static ThreadLocal<StringBuilder> threadLocal = new ThreadLocal<StringBuilder>();
/**
* 【长码生成策略】
*
* @时间20180511231532
* @二位随机数
* @lock的hash-code编码
* @param lock 生成的UUID32位参数
* @return 长码机制
*/
public static String getC(String lock) {
StringBuilder builder = new StringBuilder(pattern.format(Instant.now().toEpochMilli()));// 取系统当前时间作为订单号前半部分
builder.append(Math.abs(lock.hashCode()));// HASH-CODE
builder.append(atomicInteger.getAndIncrement());// 自增顺序
threadLocal.set(builder);
return threadLocal.get().toString();
}
/**
* 【短码生成策略】
*
* @param lock
* @return
*/
public static String getD(String lock) {
StringBuilder builder = new StringBuilder(ThreadLocalRandom.current().nextInt(0,999));// 随机数
builder.append(Math.abs(lock.hashCode()));// HASH-CODE
builder.append(atomicInteger.getAndIncrement());// 自增顺序
threadLocal.set(builder);
return threadLocal.get().toString();
}
/**
* 1000个线程并发测试
*
* @param args
* @throws InterruptedException
* @throws ExecutionException
*/
public static void main(String[] args) throws InterruptedException, ExecutionException {
Set<String> set = new HashSet<String>();
FutureTask<String> task = null;
long startTime = System.currentTimeMillis();
for (int i = 0; i <1; i++) {
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
// System.out.println("当前线程:>>>>> ".concat(Thread.currentThread().getName()));
// return getC(StringUtils.replace(UUID.randomUUID().toString(), "-", ""));
return getD(StringUtils.replace(UUID.randomUUID().toString(), "-", ""));
}
};
task = new FutureTask<String>(callable);
new Thread(task).start();
//System.out.println(task.get());
set.add(task.get());
}
System.out.println("总共耗时:" + ((System.currentTimeMillis() - startTime)) + "ms");
System.out.println("*************** " + set.size());
}
}
\ No newline at end of file
package com.patzn.cloud.service.lims.common;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class OrderNumUtil {
public final static Map<String, Integer> psdMap= new HashMap<>();
static {
psdMap.put("00",5);
psdMap.put("01",9);
psdMap.put("02",0);
psdMap.put("03",8);
psdMap.put("04",1);
psdMap.put("05",7);
psdMap.put("06",2);
psdMap.put("07",6);
psdMap.put("08",4);
psdMap.put("09",3);
psdMap.put("10",3);
psdMap.put("11",4);
psdMap.put("12",6);
psdMap.put("13",2);
psdMap.put("14",7);
psdMap.put("15",7);
psdMap.put("16",8);
psdMap.put("17",0);
psdMap.put("18",9);
psdMap.put("19",5);
psdMap.put("20",1);
psdMap.put("21",3);
psdMap.put("22",5);
psdMap.put("23",7);
psdMap.put("24",9);
psdMap.put("25",2);
psdMap.put("26",4);
psdMap.put("27",6);
psdMap.put("28",8);
psdMap.put("29",0);
psdMap.put("30",0);
psdMap.put("31",8);
psdMap.put("32",6);
psdMap.put("33",4);
psdMap.put("34",2);
psdMap.put("35",9);
psdMap.put("36",7);
psdMap.put("37",5);
psdMap.put("38",3);
psdMap.put("39",1);
psdMap.put("40",1);
psdMap.put("41",9);
psdMap.put("42",2);
psdMap.put("43",8);
psdMap.put("44",3);
psdMap.put("45",7);
psdMap.put("46",4);
psdMap.put("47",6);
psdMap.put("48",5);
psdMap.put("49",0);
psdMap.put("50",0);
psdMap.put("51",5);
psdMap.put("52",6);
psdMap.put("53",4);
psdMap.put("54",7);
psdMap.put("55",3);
psdMap.put("56",8);
psdMap.put("57",2);
psdMap.put("58",9);
psdMap.put("59",1);
psdMap.put("60",9);
psdMap.put("61",8);
psdMap.put("62",7);
psdMap.put("63",6);
psdMap.put("64",5);
psdMap.put("65",0);
psdMap.put("66",1);
psdMap.put("67",2);
psdMap.put("68",3);
psdMap.put("69",4);
psdMap.put("70",4);
psdMap.put("71",3);
psdMap.put("72",2);
psdMap.put("73",1);
psdMap.put("74",0);
psdMap.put("75",5);
psdMap.put("76",6);
psdMap.put("77",7);
psdMap.put("78",8);
psdMap.put("79",9);
}
public static String makePsd(String num) {
Map<Integer, Integer> indexNumMap= new HashMap<>();
int length = num.length();
for (int i=0;i<length;i++){
String indexNum= String.valueOf(num.charAt(i));
indexNumMap.put(i, Integer.parseInt(indexNum));
}
StringBuffer buffer = new StringBuffer();
for (Map.Entry<Integer, Integer> e:indexNumMap.entrySet()) {
int index = e.getKey();
int value = e.getValue();
String numKey = index+""+value;
numKey.intern();
Integer valueOk= psdMap.get(numKey);
if (null == valueOk){
valueOk= value;
}
buffer.append(valueOk);
}
return buffer.toString();
}
public static String getPsdNum(String num) {
Map<String, Integer> jiemi = new HashMap<>();
for (Map.Entry<String, Integer> e:psdMap.entrySet()) {
String index = e.getKey();
String first= String.valueOf(index.charAt(0)) ;
String next= String.valueOf(index.charAt(1)) ;
int firstNum = Integer.parseInt(first);
int nextNum = Integer.parseInt(next);
int trueNum = e.getValue();
jiemi.put(firstNum+"---"+trueNum,nextNum);
}
StringBuffer buffer = new StringBuffer();
int length = num.length();
for (int i=0;i<length;i++){
String indexNum= String.valueOf(num.charAt(i));
String key = i+"---"+indexNum;
key.intern();
Integer okValue= jiemi.get(key);
if (null == okValue){
okValue = Integer.parseInt(indexNum);
}
buffer.append(okValue);
}
return buffer.toString();
}
public static String getOrderNum(String code){
SimpleDateFormat sd = new SimpleDateFormat("yyMMddHHmmss");
return "NO"+sd.format(new Date())+""+makePsd(code);
}
public static void main(String[] args) {
System.out.println(getOrderNum("1234"));
System.out.println(getPsdNum("67509271099672"));
}
}
package com.patzn.cloud.service.lims.common;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
/**
* @version 1.0
* 说明 :
*/
public class Word2Pdf {
public static void main(String[] args) {
String sourceFilePath="L:/testPDF/test.xls";//可生成PDF 没问题
String desFilePath="L:\\testPDF\\PDF\\test.pdf";
word2pdf(sourceFilePath, desFilePath);
}
public static boolean getLicense() {
boolean result = false;
try {
InputStream is = Word2Pdf.class.getClassLoader().getResourceAsStream(
"classpath:statis/license.xml");
com.aspose.words.License aposeLic = new com.aspose.words.License();
aposeLic.setLicense(is);
result = true;
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static void word2pdf(String sourceFilePath,String desFilePath) {
if (!getLicense()) { // 验证License 若不验证则转化出的PDP文档会有水印产生
return;
}
try {
File file = new File(desFilePath); // 新建一个空白pdf文档
FileOutputStream os = new FileOutputStream(file);
Document doc = new Document(sourceFilePath); // Address是将要被转化的word文档
doc.save(os, SaveFormat.PDF); // 全面支持DOC, DOCX, OOXML, RTF HTML,
// OpenDocument, PDF, EPUB, XPS, SWF
// 相互转换 os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.patzn.cloud.service.lims.common.service;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.Map;
public interface IExportService {
String storageWord(XWPFDocument doc, String filePath);
Map<String, Object> wordToMap(String docFilePath);
String filePath(String fileName);
InputStream entrustInputStreamPath(String fileName);
InputStream inputStreamPath(String fileName);
String fileFolderPath(String folder, String fileName);
/**
* <p>
* 下载 DOCX 文件
* </p>
*
* @param response 响应流
* @param fileName 文件名
* @param doc DOCX 文档对象
*/
void downloadDoc(HttpServletResponse response, String fileName, XWPFDocument doc);
void downloadXls(HttpServletResponse response, String fileName, HSSFWorkbook workbook);
void downloadXlsx(HttpServletResponse response, String fileName, XSSFWorkbook workbook);
void downloadXlsxs(HttpServletResponse response, String fileName, SXSSFWorkbook workbook);
XWPFDocument getXWPFDoc(String folder, String modelName);
XWPFDocument getXWPFDoc(InputStream io);
XSSFWorkbook getXSSFWorkbook(String modelName);
SXSSFWorkbook getSXSSFWorkbook(String modelName);
XSSFWorkbook getXSSFWorkbook(InputStream io);
HSSFWorkbook getHSSFWorkbook(String modelName);
}
package com.patzn.cloud.service.lims.common.service;
import com.patzn.cloud.commons.controller.Account;
import java.util.List;
public interface ILmsMsgService {
/**
* <p>
* 发送消息通知
* </p>
*
* @param uri 取拥有uri权限人员的参数
* @param content 发送消息的主体内容
* @param title 标题
* @param account 发送消息的人
* @param toUserId 接受消息的人
*/
void sendMsg(String uri, String content, String title, Account account, List<Long> toUserId);
/**
* <p>
* 发送消息通知
* </p>
*
* @param uri 取拥有uri权限人员的参数
* @param msgType 消息类型
* @param content 发送消息的主体内容
* @param title 标题
* @param account 发送消息的人
* @param toUserId 接受消息的人
*/
void sendMsg(String uri, String msgType, String content, String title, Account account, List<Long> toUserId);
/**
* <p>
* 给审批组下的人发消息
* </p>
*
* @param businessType 消息业务类型
* @param groupAlias 审批组别名
* @param content 消息主题内容
* @param title 标题
* @param account 发送消息的人
*/
void sendMsg(int businessType, String groupAlias, String content, String title, Account account);
}
package com.patzn.cloud.service.lims.common.service;
import com.patzn.cloud.commons.controller.Account;
import java.util.List;
public interface ISteelMsgService {
void sendMsg(String uri, String content, String title, Account account, List<Long> toUserId);
}
package com.patzn.cloud.service.lims.common.service.impl;
import com.patzn.cloud.commons.api.RestAssert;
import com.patzn.cloud.service.lims.common.service.IExportService;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* 导出相关
* </p>
*
* @author wwd
* @since 2018-06-13
*/
@Service
public class ExportServiceImpl implements IExportService {
private final Logger logger = LoggerFactory.getLogger(ExportServiceImpl.class);
@Override
public String storageWord(XWPFDocument doc, String filePath) {
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
FileOutputStream out = new FileOutputStream(filePath, true)
) {
doc.write(bos);
out.write(bos.toByteArray());
} catch (Exception e) {
logger.error("保存 word 异常", e);
return null;
}
return filePath;
}
@Override
public Map<String, Object> wordToMap(String docFilePath) {
String filePath = String.format("templates/word/model/%s", docFilePath);
// 兼容打包 JAR 压缩情况处理
logger.debug("doc 文件路径 {}", docFilePath);
XWPFDocument doc = null;
try (InputStream in = this.getClass().getClassLoader().getResourceAsStream(filePath)) {
doc = new XWPFDocument(in);
} catch (Exception e) {
logger.error("word 转 map 异常", e);
}
Map<String, Object> map = new HashMap<>(2);
if (null!=doc&&null != doc.getTables()) {
map.put("table", doc.getTables().iterator());
}
map.put("doc", doc);
return map;
}
@Override
public String filePath(String fileName) {
URL url = this.getClass().getClassLoader().getResource("templates/word/model/" + fileName);
RestAssert.fail(null == url, fileName + "不存在");
return url.getPath();
}
@Override
public String fileFolderPath(String folder,String fileName) {
URL url = this.getClass().getClassLoader().getResource("templates/word/"+folder+"/" + fileName);
RestAssert.fail(null == url, fileName + "不存在");
return url.getPath();
}
public String fileFolderPath(String fileName) {
URL url = this.getClass().getClassLoader().getResource("templates/excel/"+fileName);
RestAssert.fail(null == url, fileName + "不存在");
return url.getPath();
}
public InputStream fileInputStreamPath(String fileName) {
InputStream url = this.getClass().getClassLoader().getResourceAsStream("templates/excel/"+fileName);
return url;
}
@Override
public InputStream entrustInputStreamPath(String fileName) {
InputStream url = this.getClass().getClassLoader().getResourceAsStream("templates/word/entrust/"+fileName);
return url;
}
@Override
public InputStream inputStreamPath(String fileName) {
InputStream url = this.getClass().getClassLoader().getResourceAsStream("templates/"+fileName);
return url;
}
@Override
public void downloadDoc(HttpServletResponse response, String fileName, XWPFDocument doc) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.addHeader("Content-Disposition", String.format("attachment; filename=%s;charset=UTF-8", fileName));
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream os = response.getOutputStream()
) {
doc.write(bos);
os.write(bos.toByteArray());
os.flush();
} catch (Exception e) {
logger.error("word 转 map 异常", e);
}
}
@Override
public void downloadXls(HttpServletResponse response, String fileName, HSSFWorkbook workbook) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.addHeader("Content-Disposition", String.format("attachment; filename=%s;charset=UTF-8", fileName));
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream os = response.getOutputStream()
) {
workbook.write(bos);
os.write(bos.toByteArray());
os.flush();
} catch (Exception e) {
logger.error("excel 转 map 异常", e);
}
}
@Override
public void downloadXlsx(HttpServletResponse response, String fileName, XSSFWorkbook workbook) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.addHeader("Content-Disposition", String.format("attachment; filename=%s;charset=UTF-8", fileName));
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream os = response.getOutputStream()
) {
workbook.write(bos);
os.write(bos.toByteArray());
os.flush();
} catch (Exception e) {
logger.error("excel 转 map 异常", e);
}
}
@Override
public void downloadXlsxs(HttpServletResponse response, String fileName, SXSSFWorkbook workbook) {
response.reset();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.addHeader("Content-Disposition", String.format("attachment; filename=%s;charset=UTF-8", fileName));
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
OutputStream os = response.getOutputStream()
) {
workbook.write(bos);
os.write(bos.toByteArray());
os.flush();
} catch (Exception e) {
logger.error("excel 转 map 异常", e);
}
}
@Override
public XWPFDocument getXWPFDoc(String folder, String modelName) {
FileInputStream in;
XWPFDocument doc = null;
try {
in = new FileInputStream(new File(fileFolderPath(folder,modelName)));
doc = new XWPFDocument(in);
} catch (Exception e1) {
e1.printStackTrace();
}
return doc;
}
@Override
public XWPFDocument getXWPFDoc(InputStream io) {
XWPFDocument doc = null;
try {
doc = new XWPFDocument(io);
} catch (Exception e1) {
e1.printStackTrace();
}
return doc;
}
@Override
public XSSFWorkbook getXSSFWorkbook(String modelName){
InputStream is;
XSSFWorkbook xssfWorkbook=null;
try {
is = fileInputStreamPath(modelName);
xssfWorkbook = new XSSFWorkbook(is);
} catch (Exception e1) {
e1.printStackTrace();
}
return xssfWorkbook;
}
@Override
public SXSSFWorkbook getSXSSFWorkbook(String modelName){
InputStream is;
SXSSFWorkbook xssfWorkbook=null;
try {
is = fileInputStreamPath(modelName);
xssfWorkbook = new SXSSFWorkbook(new XSSFWorkbook(is));
xssfWorkbook.setCompressTempFiles(true); //压缩临时文件,很重要,否则磁盘很快就会被写满
} catch (Exception e1) {
e1.printStackTrace();
}
return xssfWorkbook;
}
@Override
public XSSFWorkbook getXSSFWorkbook(InputStream io) {
XSSFWorkbook xssfWorkbook=null;
try {
xssfWorkbook = new XSSFWorkbook(io);
} catch (Exception e1) {
e1.printStackTrace();
}
return xssfWorkbook;
}
@Override
public HSSFWorkbook getHSSFWorkbook(String modelName){
FileInputStream is;
HSSFWorkbook xssfWorkbook=null;
try {
is = new FileInputStream(new File(fileFolderPath(modelName)));
xssfWorkbook = new HSSFWorkbook(is);
} catch (Exception e1) {
e1.printStackTrace();
}
return xssfWorkbook;
}
}
\ No newline at end of file
package com.patzn.cloud.service.lims.common.service.impl;
import com.patzn.cloud.commons.controller.Account;
import com.patzn.cloud.mq.MqMsg;
import com.patzn.cloud.mq.MqProperties;
import com.patzn.cloud.service.lims.common.service.ILmsMsgService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class LmsMsgService implements ILmsMsgService {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private AmqpTemplate amqpTemplate;
@Autowired
private MqProperties mqProperties;
@Value("${spring.application.name}")
private String service;
@Override
public void sendMsg(String uri, String content, String title, Account account, List<Long> toUserId) {
sendMsg(uri, null, content, title, account, toUserId);
}
@Override
public void sendMsg(String uri, String msgType, String content, String title, Account account, List<Long> toUserId) {
try {
MqMsg mqMsg = getMqMsg(uri, msgType, content, title, account, toUserId, 0, null);
mqMsg.setService(service);
amqpTemplate.convertAndSend(mqProperties.getTopic().getSoilWorkMsg(), mqMsg);
} catch (AmqpException e) {
logger.error("发送消息异常:", e);
}
}
@Override
public void sendMsg(int businessType, String groupAlias, String content, String title, Account account) {
try {
MqMsg mqMsg = getMqMsg(null, null, content, title, account, null, businessType, groupAlias);
amqpTemplate.convertAndSend(mqProperties.getTopic().getSoilWorkMsg(), mqMsg);
} catch (AmqpException e) {
logger.error("发送消息异常:", e);
}
}
private MqMsg getMqMsg(String uri, String msgType, String content, String title, Account account, List<Long> toUserId, int businessType, String groupAlias) {
MqMsg mqMsg = new MqMsg();
mqMsg.setUid(account.getUserId());
// 消息类型
mqMsg.setMsgType(msgType);
// 路由
mqMsg.setUri(uri);
// 企业ID
mqMsg.setCompanyId(account.getCompanyId());
// 发送人
mqMsg.setSender(account.getUserName());
// 标题
mqMsg.setTitle(title);
// 内容
mqMsg.setContent(content);
// 类型
mqMsg.setType(1);
// 服务名称
mqMsg.setService(service);
// 接收人集合
mqMsg.setReceiverIds(toUserId);
mqMsg.setBusinessType(businessType);
mqMsg.setBusiness(groupAlias);
return mqMsg;
}
}
package com.patzn.cloud.service.lims.config;
import com.netflix.loadbalancer.IRule;
import com.patzn.cloud.zuul.LocalRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.patzn.cloud.commons.controller.LoginHelper;
import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
/**
* <p>
* Feign拦截器
* </p>
*
* @author hubin
* @since 2017-09-28
*/
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
LoginHelper.setAccessToken(requestTemplate);
}
@Bean
public Request.Options options() {
return new Request.Options(
10000,
10000
);
}
}
package com.patzn.cloud.service.lims.config;
import com.patzn.cloud.commons.spring.ServiceExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* <p>
* 全局异常处理
* </p>
*
* @author hubin
* @since 2017-02-18
*/
@RestControllerAdvice
public class GlobalExceptionHandler extends ServiceExceptionHandler {
}
package com.patzn.cloud.service.lims.config;
import com.baomidou.jobs.starter.EnableJobs;
import org.springframework.context.annotation.Configuration;
/**
* @author dingzg
* @since 2019/10/18
*/
//@EnableJobs
//@Configuration
public class JobsConfig {
}
package com.patzn.cloud.service.lims.config;
import com.baomidou.dynamic.datasource.plugin.MasterSlaveAutoRoutingPlugin;
import com.baomidou.mybatisplus.mapper.MetaObjectHandler;
import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.plugins.parser.ISqlParser;
import com.baomidou.mybatisplus.plugins.parser.SqlInfo;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantHandler;
import com.baomidou.mybatisplus.plugins.parser.tenant.TenantSqlParser;
import com.baomidou.mybatisplus.toolkit.PluginUtils;
import com.patzn.cloud.commons.controller.LoginHelper;
import com.patzn.cloud.commons.service.BlockAttackSqlParser;
import com.patzn.cloud.commons.spring.PatznMetaObjectHandler;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.insert.Insert;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.reflection.MetaObject;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* MybatisPlus 配置
* </p>
*
* @author hubin
* @since 2017-03-31
*/
@EnableTransactionManagement
@Configuration
@MapperScan("com.patzn.cloud.service.lims.*.mapper*")
public class MybatisPlusConfig {
@Autowired
protected HttpServletRequest request;
private Long currentCompanyId() {
try {
return LoginHelper.getAccount(request).getCompanyId();
} catch (Throwable t) {
// 不处理
return null;
}
}
/**
* mybatis-plus分页插件<br>
* 文档:http://mp.baomidou.com<br>
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
List<ISqlParser> sqlParserList = new ArrayList<>();
TenantSqlParser tenantSqlParser = new TenantSqlParser() {
@Override
public SqlInfo processParser(Statement statement) {
if (statement instanceof Insert) {
// 不处理插入操作
return null;
}
return super.processParser(statement);
}
@Override
protected BinaryExpression andExpression(Table table, Expression where) {
return super.andExpression(table, where);
}
@Override
public boolean allowProcess(MetaObject metaObject) {
MappedStatement mappedStatement = PluginUtils.getMappedStatement(metaObject);
if ("com.baomidou.mybatisplus.mapper.SqlRunner.SelectList".equals(mappedStatement.getId())) {
return false;
}
return true;
}
};
tenantSqlParser.setTenantHandler(new TenantHandler() {
@Override
public Expression getTenantId() {
return new LongValue(currentCompanyId());
}
@Override
public String getTenantIdColumn() {
return "company_id";
}
@Override
public boolean doTableFilter(String tableName) {
// 过滤不存在企业 ID 的表,兼容企业 ID 不存在定时任务可用
if (null == currentCompanyId()
|| "lms_chemical_stock_delivery".equals(tableName)
|| "lms_customer_detail".equals(tableName)
|| "lms_supplier_detail".equals(tableName)
|| "lms_equip_product".equals(tableName)
|| "lms_staff_rel_org".equals(tableName)
|| "lms_staff_item".equals(tableName)
|| "lms_staff_equip".equals(tableName)
|| "lms_staff_professional".equals(tableName)
|| "food_keywords".equals(tableName)) {
return true;
}
return false;
}
});
sqlParserList.add(tenantSqlParser);
sqlParserList.add(new BlockAttackSqlParser());
paginationInterceptor.setSqlParserList(sqlParserList);
return paginationInterceptor;
}
/**
* mybatis-plus SQL执行效率插件
*/
@Bean
@Profile({"dev", "test"})
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
/**
* 注入自动填充器
*/
@Bean
public MetaObjectHandler metaObjectHandler() {
return new PatznMetaObjectHandler();
}
/**
* 读写分离配置
*/
@Bean
@Profile({"test"})
public MasterSlaveAutoRoutingPlugin masterSlaveAutoRoutingPlugin(){
return new MasterSlaveAutoRoutingPlugin();
}
}
\ No newline at end of file
package com.patzn.cloud.service.lims.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.patzn.cloud.mq.MqAutoConfiguration;
import com.patzn.cloud.mq.log.LogDisruptor;
/**
* <p>
* RabbitMQ 消息推送服务配置
* </p>
*
* @author hubin
* @since 2018-01-05
*/
@Configuration
public class RabbitMQConfig extends MqAutoConfiguration {
/**
* 初始化耗材归类报警队列
*/
@Bean
public Queue chemicalClassifyWarningQueue() {
return new Queue(mqProperties.getTopic().getChemicalClassifyWarning());
}
/**
* 初始化跟踪日志队列
*/
@Bean
public Queue syslog() {
// 启动 lmax Disruptor
LogDisruptor.INSTANCE.start();
return new Queue(mqProperties.getTopic().getSyslog());
}
/**
* 初始化推送消息队列
*/
@Bean
public Queue pushMsgQueue() {
return new Queue(mqProperties.getTopic().getPushMsg());
}
/**
* 初始化霍煤鸿骏
*/
@Bean
public Queue hmhjQueue() {
return new Queue(mqProperties.getTopic().getHmhjWorkMsg());
}
}
package com.patzn.cloud.service.lims.config;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;
import com.patzn.report.console.ReportServlet;
/**
* <p>
* 报表配置
* </p>
*
* @author hubin
* @since 2018-12-03
*/
//@Configuration
//@ImportResource("classpath:report-context.xml")
public class ReportConfig {
// @Bean
public ServletRegistrationBean initUReport() {
return new ServletRegistrationBean(new ReportServlet(), "/report/*");
}
}
\ No newline at end of file
package com.patzn.cloud.service.lims.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* <p>
* 服务配置属性,对应 yml 中配置
* </p>
*
* @author hubin
* @since 2018-07-17
*/
@Configuration
@ConfigurationProperties(prefix = "service")
public class ServiceProperties {
/**
* LibreOffice 转换路径 soffice
*/
private String soffice;
private String url;
public String getSoffice() {
return soffice;
}
public void setSoffice(String soffice) {
this.soffice = soffice;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
package com.patzn.cloud.service.lims.config;
import java.util.ArrayList;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* <p>
* RESTful 服务 API 管理框架 Swagger 配置初始化 <br>
* 官方地址:http://swagger.io<br>
* </p>
*
* @author hubin
* @since 2017-08-23
*/
@Configuration
@EnableSwagger2
@ConditionalOnProperty(prefix = "swagger", value = "enable")
public class SwaggerConfig {
/**
* 可以定义多个组,比如本类中定义把test和demo区分开了 (访问页面就可以看到效果了)
*/
@Bean
public Docket testApi() {
//全局参数配置
// List<Parameter> params = new ArrayList<>();
// Parameter jwtHeader = new ParameterBuilder()
// .name(RestConstants.TOKEN_FLAG)
// .defaultValue(RestConstants.TOKEN_DEFAULT)
// .description("访问 Token 登录授权 KEY")
// .modelRef(new ModelRef("string"))
// .parameterType("header")
// .required(false)
// .build();
// params.add(jwtHeader);
// API 配置
ApiSelectorBuilder asb = new Docket(DocumentationType.SWAGGER_2)
// .globalOperationParameters(params)
.apiInfo(this.apiInfo()).select();
asb.apis(RequestHandlerSelectors.basePackage("com.patzn.cloud.service"));
asb.paths(PathSelectors.any());
return asb.build();
}
private ApiInfo apiInfo() {
return new ApiInfo("Lims Service API",
"Lims 服务 API",
"1.0",
"NO terms of service",
new Contact("帕特智能", "", ""),
"帕特智能云",
"http://patzn.com"
, new ArrayList()
);
}
}
package com.patzn.cloud.service.lims.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import com.baomidou.kisso.web.interceptor.SSOSpringInterceptor;
import com.patzn.cloud.commons.spring.LoginHandlerInterceptor;
import com.patzn.cloud.commons.spring.WebServiceConfigurer;
import com.patzn.cloud.mq.log.LogInterceptor;
/**
* <p>
* WEB 初始化相关配置
* </p>
*
* @author hubin
* @since 2017-03-31
*/
@ControllerAdvice
@Configuration
public class WebConfig extends WebServiceConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// SSO 授权拦截器
SSOSpringInterceptor ssoInterceptor = new SSOSpringInterceptor();
ssoInterceptor.setHandlerInterceptor(new LoginHandlerInterceptor());
registry.addInterceptor(ssoInterceptor).addPathPatterns("/**");
// 表单重复提交拦截器
// registry.addInterceptor(new RepeatFormInterceptor()).excludePathPatterns("/list");
// 注入跟踪访问日志
registry.addInterceptor(new LogInterceptor().setService("lims"));
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
package com.patzn.cloud.service.lims.excel.controller;
import com.patzn.cloud.commons.api.RestAssert;
import com.patzn.cloud.commons.controller.ServiceController;
import com.patzn.cloud.commons.toolkit.IoUtils;
import com.patzn.poibox.excel.ExcelHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
/**
* <p>
* Excel 相关控制器
* </p>
*
* @author hubin
* @since 2018-04-08
*/
@Api(description = "Excel 相关操作")
@RestController
@RequestMapping("/v1/excel")
public class ExcelController extends ServiceController {
private static final Map<String, String> TPL = new HashMap<>();
static {
ExcelController.TPL.put("QuotationList", "报价单导入模板");
ExcelController.TPL.put("MeterAptitudeItemImport", "授权资质检测项目导入模板");
ExcelController.TPL.put("MeterSampleImport", "样品导入模板");
ExcelController.TPL.put("MeterAptitudeImport", "授权资质导入模板");
ExcelController.TPL.put("MeterOutAptitudeImport", "资质外计量器具导入模板");
ExcelController.TPL.put("MeterSendSampleImport", "出检样品导入模板");
ExcelController.TPL.put("SoilEntrustImport", "试验委托单导入模板");
ExcelController.TPL.put("SoilAptExpImport", "试样项目导入模板");
ExcelController.TPL.put("TenderContractSupplement.docx", "标书合同(协议)补充单.docx");
ExcelController.TPL.put("TenderContractEvaluationForm.docx", "标书合同(协议)评审表.docx");
ExcelController.TPL.put("TestEntrustBook.docx", "检测委托书.docx");
ExcelController.TPL.put("AnnualTrainingSchedule.doc", "年度培训计划表.doc");
ExcelController.TPL.put("EquipAll.docx", "仪器设备总览表.docx");
ExcelController.TPL.put("ChixuGaiJinJILu.docx", "持续改进记录.docx");
ExcelController.TPL.put("GaiJinPlan.docx", "改进计划.docx");
ExcelController.TPL.put("JinceWuPinDengJI.docx", "检测物品登记表.docx");
ExcelController.TPL.put("KehuTouShuDengJI.docx", "客户投诉登记表.docx");
ExcelController.TPL.put("LiuYangDengJI.docx", "留样登记表.docx");
ExcelController.TPL.put("QuYang.docx", "取(采)样记录.docx");
ExcelController.TPL.put("YangPinBiaoShiKa.docx", "样品标识卡.docx");
ExcelController.TPL.put("YangPinChouYangDan.docx", "样品抽样单.docx");
}
@ApiOperation(value = "根据模板名称下载模板", notes = "根据模板名称下载导入模板")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称", required = true, paramType = "path", dataType = "String"),
})
@GetMapping("/template/{name}")
public void template(@PathVariable("name") String name) {
RestAssert.fail(null == ExcelController.TPL.get(name), "导入模板不存请联系管理员");
try {
// 文件路径
String filePath = String.format("templates/excel/input/%s.xlsx", name);
// 兼容打包 JAR 压缩情况处理
ExcelHelper.excelTemplateDownload(response, ExcelController.TPL.get(name), getClass().getClassLoader().getResourceAsStream(filePath));
} catch (Throwable t) {
RestAssert.fail("该模板不存在");
}
}
@ApiOperation(value = "根据模板名称下载模板", notes = "根据模板名称下载导入模板")
@ApiImplicitParams({
@ApiImplicitParam(name = "name", value = "模板名称", required = true, paramType = "path", dataType = "String"),
})
@GetMapping("/template_soil/{name}")
public void templateSoil(@PathVariable("name") String name) {
RestAssert.fail(null == ExcelController.TPL.get(name), "导入模板不存请联系管理员");
try {
// 文件路径
String filePath = String.format("templates/soil/%s", name);
// 兼容打包 JAR 压缩情况处理
templateDownload(response, ExcelController.TPL.get(name),
new ClassPathResource(filePath).getInputStream());
} catch (Throwable t) {
RestAssert.fail("该模板不存在");
}
}
public static void templateDownload(HttpServletResponse response, String templateName, InputStream in) {
if (null != in || StringUtils.isNotEmpty(templateName)) {
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
setExcelHeader(response, templateName);
ServletOutputStream out = response.getOutputStream();
bis = new BufferedInputStream(in);
bos = new BufferedOutputStream(out);
byte[] buff = new byte[2048];
int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception var11) {
} finally {
IoUtils.close(new Closeable[]{bis, bos, in});
}
}
}
public static void setExcelHeader(HttpServletResponse response, String templateName) throws UnsupportedEncodingException {
response.reset();
response.setContentType("application/msword;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(templateName, "UTF-8"));
}
}
# 开发环境
server:
exception:
enable: false
swagger:
enable: true
service:
api-url: http://api.dev.patzn.com:7000
url: http://api.dev.patzn.com:7000
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:postgresql://localhost:5432/dev_lims_meter
username: postgres
password: 123456
url: jdbc:postgresql://192.168.0.115:5432/dev_lims_hmhj
driver-class-name: org.postgresql.Driver
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: 192.168.0.115
discovery:
health-check-interval: 5s
# host: localhost
rabbitmq:
host: 124.70.150.247
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: dev.topic.push.msg
sys-log: dev.topic.sys.log
chemical-classify-warning: dev.topic.chemical.classify.warning
equip-check-msg: dev.topic.equip.check.msg
report-make-msg: dev.topic.report.make.msg
hmhj-work-msg: dev.topic.hmhj.work.msg
### jobs
jobs:
admin-address: http://api.dev.patzn.com:7000/print
# 对象存储配置
oss:
bucket-name: pt-web-sys
aliyun:
endpoint: http://oss.test.patzn.com
folder: dev/hmhj
#libreOffice 安装信息
libreOffice:
url: C:/Program Files/LibreOffice
# ribbon 路由配置
food.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
print.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
res.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
convert.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
hmhj.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
# 开发环境
server:
exception:
enable: false
swagger:
enable: true
service:
api-url: http://api.dev.patzn.com:7000
url: http://api.dev.patzn.com:7000
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:postgresql://localhost:5432/dev_lims_meter
username: dbmeter
password: sfdWrE39&d!Pt
url: jdbc:postgresql://139.9.144.39:5432/pertest_lims_soil
driver-class-name: org.postgresql.Driver
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: localhost
discovery:
health-check-interval: 5s
# host: localhost
rabbitmq:
host: 121.36.130.208
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: dev.topic.push.msg
sys-log: dev.topic.sys.log
chemical-classify-warning: dev.topic.chemical.classify.warning
equip-check-msg: dev.topic.equip.check.msg
env-work-msg: dev.topic.env.work.msg
food-work-msg: dev.topic.food.work.msg
food-statistics-customer-contract: dev.topic.food.statistics.customer.contract
food-statistics-contract-progress: dev.topic.food.statistics.contract.progress
food-statistics-sample-progress: dev.topic.food.statistics.sample.progress
report-make-msg: dev.topic.report.make.msg
### jobs
jobs:
admin-address: http://api.dev.patzn.com:7000/print
# 对象存储配置
oss:
bucket-name: pt-web-sys
aliyun:
endpoint: http://oss.test.patzn.com
folder: dev/soil
# ribbon 路由配置
food.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
print.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
res.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
convert.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
# 测试环境
server:
exception:
enable: false
swagger:
enable: true
service:
api-url: http://api.devtest.patzn.com
url: http://api.devtest.patzn.com
food-url: http://food.devtest.patzn.com
province-item-url: http://60.216.97.250:8087/
soffice: /opt/libreoffice6.1/program/soffice
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://114.116.10.31:5432/devtest_lims
username: dbdevtest
password: devTest&10@31!Bg
# 注册中心配置
cloud:
consul:
host: 114.116.10.31
rabbitmq:
host: 114.116.10.31
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: devtest.topic.push.msg
sys-log: devtest.topic.sys.log
chemical-classify-warning: devtest.topic.chemical.classify.warning
equip-check-msg: devtest.topic.equip.check.msg
env-work-msg: devtest.topic.env.work.msg
food-work-msg: devtest.topic.food.work.msg
food-statistics-customer-contract: devtest.topic.food.statistics.customer.contract
food-statistics-contract-progress: devtest.topic.food.statistics.contract.progress
food-statistics-sample-progress: devtest.topic.food.statistics.sample.progress
report-make-msg: devtest.topic.report.make.msg
# Mongodb GridFS
data:
mongodb:
uri: mongodb://114.116.10.31:27017/lims
grid-fs-database: lims
# Mongodb GridFS 存储
oss:
grid-fs: true
bucket-name: base
\ No newline at end of file
# 开发环境
server:
exception:
enable: false
swagger:
enable: true
service:
api-url: http://api.dev.patzn.com:7000
url: http://api.dev.patzn.com:7000
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# url: jdbc:postgresql://localhost:5432/dev_lims_meter
url: jdbc:postgresql://139.9.144.39:5432/test_lims_soil
username: dbsoil
password: sfdWrE39&d!Pt
driver-class-name: org.postgresql.Driver
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: localhost
discovery:
health-check-interval: 5s
# host: localhost
rabbitmq:
host: 121.36.130.208
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: dev.topic.push.msg
sys-log: dev.topic.sys.log
chemical-classify-warning: dev.topic.chemical.classify.warning
equip-check-msg: dev.topic.equip.check.msg
report-make-msg: dev.topic.report.make.msg
soil-work-msg: dev.topic.soil.work.msg
### jobs
jobs:
admin-address: http://api.dev.patzn.com:7000/print
# 对象存储配置
oss:
bucket-name: pt-web-sys
aliyun:
endpoint: http://oss.test.patzn.com
folder: dev/soil
#libreOffice 安装信息
libreOffice:
url: C:/Program Files/LibreOffice
# ribbon 路由配置
food.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
print.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
res.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
convert.ribbon.NFLoadBalancerRuleClassName: com.patzn.cloud.zuul.LocalRule
# 测试环境
server:
exception:
to: 1327531085@qq.com;18463106881@163.com
form: ptlims@163.com
subject: 测试 soil服务异常
swagger:
enable: true
service:
api-url: http://api.pertest.patzn.com
url: http://api.pertest.patzn.com
food-url: http://food.pertest.patzn.com
province-item-url: http://60.216.97.250:8087/
soffice: /opt/libreoffice6.2/program/soffice
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://139.9.144.39:5432/test_lims_soil
username: dbsoil
password: sfdWrE39&d!Pt
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: 124.70.150.247
redis:
host: 124.70.150.247
password: patzn123TQa
mail:
host: smtp.163.com
username: ptlims@163.com
password: HFQYDSHMSKTVYRQW
port: 25
protocol: smtp
default-encoding: UTF-8
rabbitmq:
host: 124.70.150.247
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: test.topic.push.msg
sys-log: test.topic.sys.log
chemical-classify-warning: test.topic.chemical.classify.warning
equip-check-msg: test.topic.equip.check.msg
report-make-msg: test.topic.report.make.msg
soil-work-msg: test.topic.soil.work.msg
# 对象存储配置
oss:
bucket-name: pt-web-sys
aliyun:
endpoint: http://oss.test.patzn.com
folder: pertest/soil
#libreOffice 安装信息
libreOffice:
url: /opt/libreOffice6.2
### jobs
jobs:
admin-address: http://api.pertest.patzn.com/print
\ No newline at end of file
# 生产环境
service:
api-url: http://api.patzn.com
url: http://api.patzn.com
food-url: http://food.patzn.com
province-item-url: http://60.216.97.250:8087
soffice: /opt/libreoffice6.1/program/soffice
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://121.36.94.193:5432/pc_lims_soil
username: dbsoil
password: ptd435%a!381
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: 124.70.154.133
rabbitmq:
host: 124.70.154.133
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: pro.topic.push.msg
sys-log: pro.topic.sys.log
chemical-classify-warning: pro.topic.chemical.classify.warning
equip-check-msg: pro.topic.equip.check.msg
report-make-msg: pro.topic.report.make.msg
soil-work-msg: pro.topic.soil.work.msg
redis:
database: 0
host: 124.70.154.133
port: 6379
password: patzn123TQa
#服务监控
boot:
admin:
client:
instance:
service-url: http://${network-ip}:${server.port}
name: food
username: "patznAdmin"
password: "asd9*765"
url:
- http://springadmin.patzn.com
# 对象存储配置
oss:
aliyun:
folder: soil
### jobs
jobs:
admin-address: http://api.patzn.com/print
# 日志
logging:
config: classpath:log4j2-pro.xml
#libreOffice 安装信息
libreOffice:
url: /opt/libreoffice6.2
# 测试环境
server:
exception:
to: 1327531085@qq.com;18463106881@163.com
subject: 测试 food 服务异常
swagger:
enable: true
service:
api-url: http://api.test.patzn.com
url: http://api.test.patzn.com
food-url: http://food.test.patzn.com
province-item-url: http://60.216.97.250:8087/
soffice: /opt/libreoffice6.1/program/soffice
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://121.36.94.193:5432/test_lims_soil
username: dbsoil
password: ptd434%b!361
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: 121.36.130.208
rabbitmq:
host: 121.36.130.208
port: 5672
username: mqbase
password: mqb123#@$5
virtual-host: /
topic:
push-msg: test.topic.push.msg
sys-log: test.topic.sys.log
chemical-classify-warning: test.topic.chemical.classify.warning
equip-check-msg: test.topic.equip.check.msg
env-work-msg: test.topic.env.work.msg
food-work-msg: test.topic.food.work.msg
food-statistics-customer-contract: test.topic.food.statistics.customer.contract
food-statistics-contract-progress: test.topic.food.statistics.contract.progress
food-statistics-sample-progress: test.topic.food.statistics.sample.progress
report-make-msg: test.topic.report.make.msg
# 对象存储配置
oss:
bucket-name: pt-web-sys
aliyun:
endpoint: http://oss.test.patzn.com
folder: test/food
#libreOffice 安装信息
libreOffice:
url: C:/Program Files/LibreOffice
### jobs
jobs:
admin-address: http://api.test.patzn.com/print
\ No newline at end of file
server:
exception:
to: 929339256@qq.com;1516330897@qq.com;18463106881@163.com
subject: 中海油服 soil 服务异常
service:
api-url: http://api.lims.com
url: http://api.lims.com
food-url: http://food.lims.com
province-item-url: http://60.216.97.250:8087
soffice: /opt/libreoffice6.1/program/soffice
spring:
datasource:
username: dbsoiladmin
password: ptoil!%&wzhj768
url: jdbc:postgresql://127.0.0.1:5432/pc_lims_soil
driver-class-name: org.postgresql.Driver
dynamic:
enabled: false
# 注册中心配置
cloud:
consul:
host: 127.0.0.1
rabbitmq:
host: 127.0.0.1
port: 5672
username: patznsomq
password: mqsoil456#@$5
virtual-host: /
topic:
push-msg: pro.topic.push.msg
sys-log: pro.topic.sys.log
chemical-classify-warning: pro.topic.chemical.classify.warning
equip-check-msg: pro.topic.equip.check.msg
report-make-msg: pro.topic.report.make.msg
soil-work-msg: pro.topic.soil.work.msg
redis:
host: 127.0.0.1
password: ptsoil476TMa
# Mongodb GridFS
data:
mongodb:
uri: mongodb://mgluser:soild574ld@127.0.0.1:27017/lims
grid-fs-database: lims
# Mongodb GridFS 存储
oss:
grid-fs: true
bucket-name: base
### jobs
jobs:
admin-address: http://api.lims.com/print
# 日志
logging:
config: classpath:log4j2-pro.xml
server:
port: 8038
exception:
to: 1781849245@qq.com
subject: hmhj 服务异常
compression:
enabled: true
mime-types: application/json
spring:
# 环境 dev|test|pro
profiles:
active: dev
application:
name: hmhj
# 模板引擎配置
freemarker:
prefix: classpath:/templates/html
suffix: .html
cache: false
# thymeleaf模板配置
thymeleaf:
template-loader-path: classpath:/templates/
suffix: .html
cache: false
encoding: UTF-8
# 文件上传大小设置 50MB
servlet:
multipart:
max-request-size: 50MB
max-file-size: 50MB
datasource:
driver-class-name: org.postgresql.Driver
platform: postgres
continue-on-error: true
hikari:
minimum-idle: 5 #最小连接数量
idle-timeout: 180000 #空闲连接存活最大时间
maximum-pool-size: 20 #最大连接数,默认是10
max-lifetime: 1800000 #在连接池中的最长生命周期
connection-timeout: 600000 #超时时间
#validation-timeout: #默认是5秒
cloud:
loadbalancer:
retry:
enabled: true # 是否重试机制,默认 fasle
# 注册中心配置
consul:
host: localhost
port: 8500
discovery:
prefer-ip-address: true
ip-address: ${network-ip:${spring.cloud.client.ip-address}}
tags: version=1.0,author=pt
health-check-path: /actuator/health
health-check-interval: 15s
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}
acl-token: 26fcba2e-c460-2644-be78-584ea3b91a0c
# 缓存配置
cache:
infinispan.config: infinispan.xml
caffeine.spec: maximumSize=500,expireAfterAccess=60s
# Redis 数据库索引(默认为0),如果设置为1,那么存入的key-value都存放在select 1中
redis:
database: 0
host: 124.70.150.247
port: 6379
password: patzn123TQa
mail:
host: smtp.exmail.qq.com
username: admin@qd-partner.com
password: 5Ddz2stH4yrcixo3
port: 587
protocol: smtp
default-encoding: UTF-8
main:
allow-bean-definition-overriding: true
#ribbon超时设置
ribbon:
OkToRetryOnAllOperations: true
MaxAutoRetriesNextServer: 2
MaxAutoRetries: 1
ReadTimeout: 600000
ConnectTimeout: 100000
res:
ribbon:
ReadTimeout: 600000
ConnectTimeout: 100000
standard:
ribbon:
ReadTimeout: 600000
ConnectTimeout: 100000
### jobs
#jobs:
# app-name: soil
# app-port: 8026
#mybatis
mybatis-plus:
mapper-locations: classpath:/mapper/*/*Mapper.xml
type-aliases-package: com.patzn.cloud.service.hmhj.entity
type-enums-package: com.patzn.cloud.service.hmhj.enums
global-config:
#字段策略 0:"忽略判断",1:"非 NULL 判断",2:"非空判断"
field-strategy: 2
# 逻辑删除
logic-delete-value: 1
logic-not-delete-value: 0
# 自定义 SQL 注入器
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector
sql-parser-cache: true
configuration:
cache-enabled: false
map-underscore-to-camel-case: true
# 单点登录
kisso:
config:
signAlgorithm: RS512
rsaCertstore: public.cert
# 日志
logging:
config: classpath:log4j2.xml
pattern:
console: "%-5level - %msg%n"
management:
health:
defaults:
enabled: false
db:
enabled: true
endpoint:
health:
show-details: always
\ No newline at end of file
__________ __ .__ .___
\______ \_____ _/ |_________ ____ ____ | | ____ __ __ __| _/
| ___/\__ \\ __\___ // \ _/ ___\| | / _ \| | \/ __ |
| | / __ \| | / /| | \ \ \___| |_( <_> ) | / /_/ |
|____| (____ /__| /_____ \___| / \___ >____/\____/|____/\____ |
\/ \/ \/ \/ \/
Service-hmhj 霍煤鸿骏LIMS平台服务
<?xml version="1.0" encoding="UTF-8"?>
<infinispan>
<cache-container default-cache="default">
<local-cache name="default"/>
<local-cache name="resource">
<eviction max-entries="200"/>
<expiration lifespan="600000"/>
</local-cache>
</cache-container>
</infinispan>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。-->
<!--monitorInterval:Log4j2能够自动检测修改配置 文件和重新配置本身,设置间隔秒数。-->
<Configuration status="off" monitorInterval="600">
<properties>
<!--通用变量-->
<property name="LOG_HOME">../logs/patzn-service-soil</property>
<property name="ERROR_LOG_FILE_NAME">error</property>
<property name="INFO_LOG_FILE_NAME">info</property>
<Property name="PATTERN">[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} - (%F:%L) - %m%n</Property>
</properties>
<Appenders>
<!-- ELK 日志分析 http://logging.apache.org/log4j/2.x/manual/appenders.html#SocketAppender
<Socket name="Logstash" host="114.115.217.147" port="5044">
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY" />
</Filters>
<JsonLayout properties="true" compact="true" eventEol="true"/>
</Socket>
-->
<!-- 控制台日志打印 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<Filters>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!--输出日志的格式-->
<PatternLayout pattern="${PATTERN}"/>
</Console>
<!-- 服务器日志文件记录 -->
<RollingRandomAccessFile name="ErrorLog" fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log"
filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
<PatternLayout pattern="${PATTERN}"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="128MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="InfoLog" fileName="${LOG_HOME}/${INFO_LOG_FILE_NAME}.log"
filePattern="${LOG_HOME}/${INFO_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
<PatternLayout pattern="${PATTERN}"/>
<Filters>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="200MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--AsyncLogger-->
<AsyncLogger name="com.patzn.cloud" level="debug" includeLocation="true"/>
<AsyncLogger name="org.apache.ibatis" level="error" includeLocation="true"/>
<AsyncLogger name="org.springframework.web" level="error" includeLocation="true"/>
<!--root的logger-->
<AsyncRoot level="error" includeLocation="true">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoLog"/>
<AppenderRef ref="ErrorLog"/>
<AppenderRef ref="Logstash"/>
</AsyncRoot>
</Loggers>
</Configuration>
<?xml version="1.0" encoding="UTF-8"?>
<!--status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出。-->
<!--monitorInterval:Log4j2能够自动检测修改配置 文件和重新配置本身,设置间隔秒数。-->
<Configuration status="off" monitorInterval="600">
<properties>
<!--通用变量-->
<property name="LOG_HOME">../logs/patzn-service-soil</property>
<property name="ERROR_LOG_FILE_NAME">error</property>
<property name="INFO_LOG_FILE_NAME">info</property>
<Property name="PATTERN">[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} - (%F:%L) - %m%n</Property>
</properties>
<Appenders>
<!-- 控制台日志打印 -->
<Console name="Console" target="SYSTEM_OUT">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<Filters>
<ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<!--输出日志的格式-->
<PatternLayout pattern="${PATTERN}"/>
</Console>
<!-- 服务器日志文件记录 -->
<RollingRandomAccessFile name="ErrorLog" fileName="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log"
filePattern="${LOG_HOME}/${ERROR_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
<PatternLayout pattern="${PATTERN}"/>
<Filters>
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="128MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
<RollingRandomAccessFile name="InfoLog" fileName="${LOG_HOME}/${INFO_LOG_FILE_NAME}.log"
filePattern="${LOG_HOME}/${INFO_LOG_FILE_NAME}.log.%d{yyyy-MM-dd}.gz">
<PatternLayout pattern="${PATTERN}"/>
<Filters>
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="128MB"/>
</Policies>
<DefaultRolloverStrategy max="30"/>
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<!--AsyncLogger-->
<AsyncLogger name="com.patzn.cloud" level="debug" includeLocation="true"/>
<AsyncLogger name="org.apache.ibatis" level="error" includeLocation="true"/>
<AsyncLogger name="springfox.documentation" level="error" includeLocation="true"/>
<AsyncLogger name="org.springframework.web" level="error" includeLocation="true"/>
<!--root的logger-->
<AsyncRoot level="error" includeLocation="true">
<AppenderRef ref="Console"/>
<AppenderRef ref="InfoLog"/>
<AppenderRef ref="ErrorLog"/>
</AsyncRoot>
</Loggers>
</Configuration>
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAucwkbQyl33CAIod4NT64
2Swwjh8izNBdXju6EQTBTGAWBcCBPG3Q2IoNN64jQzRURLlSDZ1oJIB0e65KBkQM
0y8IZcHKRG97f1lYQVWwlqdwtVkn1BwDdBNTRf2CO6fDwxGhukugX91f0KkgNv8B
NXB8AzB3f03XEyzxLFMD0Az8KaYfauc5CV+OP2aPUNEaChhmW2G5Nmmg45iFKCY9
I/UBKFsAeP7rrUxKErY1CSWdbPKeDSwNM+BRqDDNLudxN8Rz1XJzt3Zx2NPNEYbZ
VQDqm2ze/8baozvSsqvnIA3Izd6VuswCIhWkBStypO/q66jOjkv4qWifgNyccIPu
LQIDAQAB
-----END PUBLIC KEY-----
\ No newline at end of file
# 关闭默认报表存储器
report.disableFileProvider=true
report.service=food
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<import resource="classpath:report-console-context.xml"/>
<bean id="propertyConfigurer" parent="report.props">
<property name="location">
<value>classpath:report-config.properties</value>
</property>
</bean>
</beans>
\ No newline at end of file
var CreatedOKLodop7766=null;
//====判断是否需要安装CLodop云打印服务器:====
function needCLodop(){
try{
var ua=navigator.userAgent;
if (ua.match(/Windows\sPhone/i) !=null) return true;
if (ua.match(/iPhone|iPod/i) != null) return true;
if (ua.match(/Android/i) != null) return true;
if (ua.match(/Edge\D?\d+/i) != null) return true;
var verTrident=ua.match(/Trident\D?\d+/i);
var verIE=ua.match(/MSIE\D?\d+/i);
var verOPR=ua.match(/OPR\D?\d+/i);
var verFF=ua.match(/Firefox\D?\d+/i);
var x64=ua.match(/x64/i);
if ((verTrident==null)&&(verIE==null)&&(x64!==null))
return true; else
if ( verFF !== null) {
verFF = verFF[0].match(/\d+/);
if ((verFF[0]>= 41)||(x64!==null)) return true;
} else
if ( verOPR !== null) {
verOPR = verOPR[0].match(/\d+/);
if ( verOPR[0] >= 32 ) return true;
} else
if ((verTrident==null)&&(verIE==null)) {
var verChrome=ua.match(/Chrome\D?\d+/i);
if ( verChrome !== null ) {
verChrome = verChrome[0].match(/\d+/);
if (verChrome[0]>=41) return true;
};
};
return false;
} catch(err) {return true;};
};
//====页面引用CLodop云打印必须的JS文件:====
if (needCLodop()) {
var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
var oscript = document.createElement("script");
oscript.src ="http://localhost:8000/CLodopfuncs.js?priority=1";
head.insertBefore( oscript,head.firstChild );
//引用双端口(8000和18000)避免其中某个被占用:
oscript = document.createElement("script");
oscript.src ="http://localhost:18000/CLodopfuncs.js?priority=0";
head.insertBefore( oscript,head.firstChild );
};
//====获取LODOP对象的主过程:====
function getLodop(oOBJECT,oEMBED){
var strHtmInstall="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
var strHtmUpdate="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
var strHtm64_Install="<br><font color='#FF00FF'>打印控件未安装!点击这里<a href='install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。</font>";
var strHtm64_Update="<br><font color='#FF00FF'>打印控件需要升级!点击这里<a href='install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。</font>";
var strHtmFireFox="<br><br><font color='#FF00FF'>(注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它)</font>";
var strHtmChrome="<br><br><font color='#FF00FF'>(如果此前正常,仅因浏览器升级或重安装而出问题,需重新执行以上安装)</font>";
var strCLodopInstall="<br><font color='#FF00FF'>CLodop云打印服务(localhost本地)未安装启动!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行安装</a>,安装后请刷新页面。</font>";
var strCLodopUpdate="<br><font color='#FF00FF'>CLodop云打印服务需升级!点击这里<a href='CLodop_Setup_for_Win32NT.exe' target='_self'>执行升级</a>,升级后请刷新页面。</font>";
var LODOP;
try{
var isIE = (navigator.userAgent.indexOf('MSIE')>=0) || (navigator.userAgent.indexOf('Trident')>=0);
if (needCLodop()) {
try{ LODOP=getCLodop();} catch(err) {};
if (!LODOP && document.readyState!=="complete") {alert("C-Lodop没准备好,请稍后再试!"); return;};
if (!LODOP) {
if (isIE) document.write(strCLodopInstall); else
document.body.innerHTML=strCLodopInstall+document.body.innerHTML;
return;
} else {
if (CLODOP.CVERSION<"3.0.3.7") {
if (isIE) document.write(strCLodopUpdate); else
document.body.innerHTML=strCLodopUpdate+document.body.innerHTML;
};
if (oEMBED && oEMBED.parentNode) oEMBED.parentNode.removeChild(oEMBED);
if (oOBJECT && oOBJECT.parentNode) oOBJECT.parentNode.removeChild(oOBJECT);
};
} else {
var is64IE = isIE && (navigator.userAgent.indexOf('x64')>=0);
//=====如果页面有Lodop就直接使用,没有则新建:==========
if (oOBJECT!=undefined || oEMBED!=undefined) {
if (isIE) LODOP=oOBJECT; else LODOP=oEMBED;
} else if (CreatedOKLodop7766==null){
LODOP=document.createElement("object");
LODOP.setAttribute("width",0);
LODOP.setAttribute("height",0);
LODOP.setAttribute("style","position:absolute;left:0px;top:-100px;width:0px;height:0px;");
if (isIE) LODOP.setAttribute("classid","clsid:2105C259-1E0C-4534-8141-A753534CB4CA");
else LODOP.setAttribute("type","application/x-print-lodop");
document.documentElement.appendChild(LODOP);
CreatedOKLodop7766=LODOP;
} else LODOP=CreatedOKLodop7766;
//=====Lodop插件未安装时提示下载地址:==========
if ((LODOP==null)||(typeof(LODOP.VERSION)=="undefined")) {
if (navigator.userAgent.indexOf('Chrome')>=0)
document.body.innerHTML=strHtmChrome+document.body.innerHTML;
if (navigator.userAgent.indexOf('Firefox')>=0)
document.body.innerHTML=strHtmFireFox+document.body.innerHTML;
if (is64IE) document.write(strHtm64_Install); else
if (isIE) document.write(strHtmInstall); else
document.body.innerHTML=strHtmInstall+document.body.innerHTML;
return LODOP;
};
};
if (LODOP.VERSION<"6.2.2.1") {
if (!needCLodop()){
if (is64IE) document.write(strHtm64_Update); else
if (isIE) document.write(strHtmUpdate); else
document.body.innerHTML=strHtmUpdate+document.body.innerHTML;
};
return LODOP;
};
//===如下空白位置适合调用统一功能(如注册语句、语言选择等):===
//===========================================================
return LODOP;
} catch(err) {alert("getLodop出错:"+err);};
};
table {border-collapse: collapse; border-style: double;border-width:3px;border-color: black;}
td {border-width: 1px;border-style: solid;}
\ No newline at end of file
function test_script(){
document.write('<font color="red">这是用script加入的动态内容</font>');
}
\ No newline at end of file
<License>
<Data>
<Products>
<Product>Aspose.Total for Java</Product>
<Product>Aspose.Words for Java</Product>
</Products>
<EditionType>Enterprise</EditionType>
<SubscriptionExpiry>20991231</SubscriptionExpiry>
<LicenseExpiry>20991231</LicenseExpiry>
<SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
</Data>
<Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>
\ No newline at end of file
12
\ No newline at end of file
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>打开Excel文件</title>
<script type="text/javascript">
function Save() {
document.getElementById("PageOfficeCtrl1").WebSave();
}
</script>
<script type="text/javascript">
function AddSeal() {
try{
document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
}catch (e){ };
}
</script>
</head>
<body>
<div style="width:auto;height:700px;" th:utext="${pageoffice}"></div>
</body>
</html>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>打开Word文件</title>
<script type="text/javascript">
function Save() {
document.getElementById("PageOfficeCtrl1").WebSave();
}
</script>
<script type="text/javascript">
function AddSeal() {
try{
document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
}catch (e){ };
}
</script>
</head>
<body>
<div style="width:1000px;height:700px;" th:utext="${pageoffice}"> </div>
</body>
</html>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<SCRIPT type=text/javascript src="/lims/PrintSample10.js"></SCRIPT>
<title>WEB打印控件演示demo</title>
<style id="style1">
table {
border-width: 5px;
border-style: solid;
border-color: #0000FF;
}
td {
border-width: 1px;
border-style: solid;
}
</style>
<script language="javascript" src="/lims/LodopFuncs.js"></script>
</head>
<body id="body01">
<h2><font color="#009999">演示clodop打印</font>
</h2>
<p><a href="javascript:myPreview1()">打印设计</a></p>
<script language="javascript" type="text/javascript">
var LODOP; //声明为全局变量
function myPreview1(){
LODOP=getLodop();
LODOP.PRINT_INITA("0mm","0mm","60.01mm","40.01mm","打印标签");
LODOP.ADD_PRINT_TEXT(0,55,100,20,"备样标签");
LODOP.SET_PRINT_STYLEA(0,"FontName","楷体");
LODOP.SET_PRINT_STYLEA(0,"FontSize",12);
LODOP.SET_PRINT_STYLEA(0,"Alignment",2);
LODOP.SET_PRINT_STYLEA(0,"Bold",1);
LODOP.ADD_PRINT_TEXT(18,11,67,20,"样品名称:");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(19,67,155,19,"2017-04-06");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(44,11,64,20,"样品编号:");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(45,66,152,20,"14578411425");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_BARCODE(59,11,204,35,"128A","20170017-001");
LODOP.SET_PRINT_STYLEA(0,"FontSize",6);
LODOP.ADD_PRINT_TEXT(99,9,80,20,"收样日期:");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(98,72,135,20,"2017-08-06");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(115,9,80,20,"保存条件:");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.ADD_PRINT_TEXT(114,73,136,20,"shd=shhhwveedwsdsds");
LODOP.SET_PRINT_STYLEA(0,"FontSize",8);
LODOP.PRINT_DESIGN();
};
</script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>正在打开编辑文档</title>
<script src="//s1.pstatp.com/cdn/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="http://api.dev.patzn.com:7000/lims/pageoffice.js" id="po_js_main"></script>
</head>
<body>
<a href="javascript:POBrowser.openWindowModeless('/lims/v1/page_office/word','width=1200px;height=800px;');">打开文件 </a>
<script>
function pageOffice() {
POBrowser.openWindowModeless('/lims/v1/page_office/word', 'width=1200px;height=800px;');
}
window.onload = pageOffice();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑原始记录</title>
<script type="text/javascript">
function Save() {
document.getElementById("PageOfficeCtrl1").WebSave();
}
</script>
<script type="text/javascript">
function AddSeal() {
try {
document.getElementById("PageOfficeCtrl1").ZoomSeal.AddSeal();
} catch (e) {
}
}
</script>
</head>
<body>
<div style="width:100%;height:1000px;">${pageoffice}</div>
</body>
</html>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment