Commit bfd31bca authored by Spencer Chang's avatar Spencer Chang

Initial commit

parents

Too many changes to show.

To preserve performance only 1000 of 1000+ files are displayed.

# Eclipse
.classpath
.project
.settings/
# Intellij
.idea/
*.iml
*.iws
**/out
overlays/
# Mac
.DS_Store
# Maven
**/target
**/*.log
**/*.tmp
# common config rename
uncertain.local.xml
config.properties
atm_upload.svc
atm_upload_unUseSubFolder.svc
项目技术人员应此处描述一些项目基本信息,及注意事项:
* 1,使用的技术介绍
* 2,主要功能
* 3,配置信息
* WEB-INF/uncertain.local-RENAME.xml
resources/profiles/config-RENAME.properties
/atm_upload-RENAME.lsc
/atm_upload_unUseSubFolder-RENAME.lsc
* 我们只需要在本地环境拷贝一份并把-RENAME去掉即可,就可以根据自己本地环境配置文件。
再也不用担心本地的配置文件不小心提交到远程仓库了。
* 4, 覆盖依赖文件注意每次升级依赖版本请对比差异
* main.lview
* 5, 发布新版注意检查合同打印配置的路径
* WEB-INF/server-script/con_print_path.js
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-hlcm</artifactId>
<version>1.0.0-RELEASE</version>
<packaging>war</packaging>
<properties>
<leaf.version>1.4.1-RELEASE</leaf.version>
<hap.version>3.5-SNAPSHOT</hap.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<org.slf4j-version>1.7.21</org.slf4j-version>
<log4j.version>2.4.1</log4j.version>
<disruptor.version>3.2.0</disruptor.version>
<skipLiquibaseRun>true</skipLiquibaseRun>
<groovy.version>2.4.1</groovy.version>
<gmaven.version>1.5</gmaven.version>
<skipTests>true</skipTests>
<spring.security.version>4.0.4.RELEASE</spring.security.version>
<spring.version>4.3.11.RELEASE</spring.version>
<freemarker.version>2.3.21</freemarker.version>
<junit.version>4.12</junit.version>
<mybatis.version>3.3.0</mybatis.version>
<mybatis.spring.version>1.2.3</mybatis.spring.version>
<jackson.version>2.8.8</jackson.version>
<jolbox.version>0.8.0.RELEASE</jolbox.version>
<quartz.version>2.2.3</quartz.version>
<jedis.version>2.9.0</jedis.version>
<spring.redis.version>1.7.0.RELEASE</spring.redis.version>
<logback.version>1.1.7</logback.version>
<activiti.version>6.0.0</activiti.version>
<drools.version>5.6.0.Final</drools.version>
<cxf.version>3.1.7</cxf.version>
<metrics.version>3.1.2</metrics.version>
<poi.version>3.16</poi.version>
<spring.rabbit.version>1.7.1.RELEASE</spring.rabbit.version>
<xalan.version>2.7.2</xalan.version>
<sonar.exclusions>**.js</sonar.exclusions>
<httpclient.version>4.5.3</httpclient.version>
<build.war.plugin.version>3.2.2</build.war.plugin.version>
<leaf-webapp-path>/Users/spencerchang/work/IdeaProjects/leaf-hlcm/src/main/webapp</leaf-webapp-path>
</properties>
<distributionManagement>
<repository>
<id>Hls-Releases</id>
<name>Hls-Releases</name>
<url>https://hel.hand-china.com/nexus/content/repositories/Hls-Releases</url>
</repository>
<snapshotRepository>
<id>Hls-Snapshots</id>
<name>Hls-Snapshots</name>
<url>https://hel.hand-china.com/nexus/content/repositories/Hls-Snapshots</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>Hls-Public</id>
<name>Hls-Public</name>
<url>https://hel.hand-china.com/nexus/content/groups/public</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>Hls-Public</id>
<name>Hls-Public</name>
<url>https://hel.hand-china.com/nexus/content/groups/public</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-core</artifactId>
<type>war</type>
<version>${leaf.version}</version>
</dependency>
<dependency>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-core</artifactId>
<version>${leaf.version}</version>
<classifier>classes</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-service</artifactId>
<version>${leaf.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--word转pdf -->
<dependency>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-plugin-jacob</artifactId>
<version>1.1.3-RELEASE</version>
</dependency>
<!-- 网银 代扣 ftp -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>1.4.1</version>
</dependency>
<!-- 网银 代扣 ftp -->
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-core-db</artifactId>
<version>${leaf.version}</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!--end -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.48</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.1.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.6</version>
</dependency>
</dependencies>
<build>
<finalName>hlcm</finalName>
<resources>
<resource>
<directory>src/main/java/</directory>
<filtering>true</filtering>
<includes>
<include>**/*.groovy</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources/profiles/${profile.env}</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
<include>**/*.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>${build.war.plugin.version}</version>
<configuration>
<attachClasses>true</attachClasses>
<overlays>
<overlay>
<groupId>com.hand.hls</groupId>
<artifactId>leaf-core</artifactId>
<excludes>
<exclude>WEB-INF/lib/httpclient-4.3.6.jar</exclude>
<exclude>WEB-INF/lib/httpcore-4.3.3.jar</exclude>
</excludes>
</overlay>
</overlays>
<webResources>
<resource>
<directory>src/main/resources</directory>
<targetPath>WEB-INF/classes</targetPath>
</resource>
<resource>
<directory>src/main/webapp/WEB-INF</directory>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
</configuration>
</plugin>
<plugin>
<artifactId>leaf-maven-plugin</artifactId>
<groupId>com.hand.hls</groupId>
<version>1.0.0-RELEASE</version>
<configuration>
<baseDir>${leaf-webapp-path}</baseDir>
</configuration>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.env>dev</profile.env>
</properties>
</profile>
<profile>
<id>sit</id>
<activation />
<properties>
<profile.env>sit</profile.env>
</properties>
</profile>
<profile>
<id>uat</id>
<activation />
<properties>
<profile.env>uat</profile.env>
</properties>
</profile>
<profile>
<id>prod</id>
<activation/>
<properties>
<profile.env>prod</profile.env>
</properties>
</profile>
</profiles>
</project>
package com.hand.hap.core.components;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.hand.hap.core.BaseConstants;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.util.WebUtils;
import com.hand.hap.message.profile.SystemConfigListener;
@Component
public class CaptchaConfig implements SystemConfigListener,BaseConstants, InitializingBean {
public static final String LOGIN_KEY = "loginKey";
private static final int CAPTCHA_EXPIRE = 60 * 60 * 24 * 30;
@Autowired
private RedisTemplate<String, String> redisTemplate;
private String redisCatalog = HAP_CACHE+"login:";
/**
* 是否开启验证码
*/
private boolean enableCaptcha = true;
/**
* 失败几次后开启验证码 0表示不开启
*/
private Integer wrongTimes = 0;
/**
* 登录失败过期时间,一個月.
*/
private Integer expire = CAPTCHA_EXPIRE;
/**
* 登录失败次数 有效期.单位 秒.
*
* @param expire
* 过期时间
*/
public void setExpire(Integer expire) {
this.expire = expire;
}
public Integer getExpire(){
return this.expire;
}
@Value("${sys.captcha.times:3}")
public void setWrongTimes(Integer wrongTimes) {
this.wrongTimes = wrongTimes;
}
@Override
public List<String> getAcceptedProfiles() {
return Arrays.asList("CAPTCHA");
}
@Override
public void updateProfile(String configCode, String configValue) {
if ("DISABLE".equalsIgnoreCase(configValue)) {
this.enableCaptcha = false;
this.wrongTimes = 0;
} else if ("ENABLE".equalsIgnoreCase(configValue)) {
this.enableCaptcha = true;
} else if ("AFTER3".equalsIgnoreCase(configValue)) {
this.enableCaptcha = false;
this.wrongTimes = 3;
}
}
public Integer getWrongTimes() {
return wrongTimes;
}
/**
* 更新登录错误次数
* 初始化登录出错次数 为3
*/
public void updateLoginFailureInfo(Cookie cookie ) {
if (cookie != null) {
String failureTimes = redisTemplate.opsForValue().get(redisCatalog+cookie.getValue());
if (failureTimes == null) {
redisTemplate.opsForValue().set(redisCatalog+cookie.getValue(), this.wrongTimes.toString(), expire, TimeUnit.SECONDS);
} else {
Integer times = Integer.parseInt(failureTimes);
if (times < this.wrongTimes) {
redisTemplate.opsForValue().increment(redisCatalog+cookie.getValue(), 1);
}
}
}
}
/**
* 从redis中 重置这次 登录失败记录及过期时间
*/
public void resetLoginFailureInfo(HttpServletRequest request,HttpServletResponse response) {
Cookie cookie = WebUtils.getCookie(request, LOGIN_KEY);
if (cookie != null) {
cookie.setMaxAge(this.expire);
cookie.setPath(StringUtils.defaultIfEmpty(request.getContextPath(), "/"));
response.addCookie(cookie);
redisTemplate.opsForValue().set(redisCatalog+cookie.getValue(), "0", expire, TimeUnit.SECONDS);
}
}
/**
* 是否开启验证码
*/
public boolean isEnableCaptcha(Cookie cookie) {
boolean enable = this.enableCaptcha;
// if (!this.enableCaptcha && this.wrongTimes > 0) {
// if (cookie != null) {
// String failureTimes = redisTemplate.opsForValue().get(redisCatalog+cookie.getValue());
// if (failureTimes != null) {
// Integer times = Integer.parseInt(failureTimes);
// if (times.equals(wrongTimes)) {
// enable = true;
// }
// }else{
// //有cookie 但是redis中没有记录 说明是伪造的cookie 直接开启验证码
// enable = true;
// }
// }
// }
return enable;
}
@Override
public void afterPropertiesSet() throws Exception {
if(wrongTimes > 0){
enableCaptcha = false;
}else {
enableCaptcha = true;
wrongTimes = 0;
}
}
}
package com.hand.hap.generator.controllers;
import com.hand.hap.generator.service.IHapGeneratorService;
import com.hand.hap.generator.dto.GeneratorInfo;
import com.hand.hap.system.controllers.BaseController;
import com.hand.hap.system.dto.ResponseData;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
@Controller
@RequestMapping(value = "/generator")
public class HapGeneratorController extends BaseController {
@Autowired
IHapGeneratorService service;
@RequestMapping(value = "/alltables", method = RequestMethod.GET)
@ResponseBody
public ResponseData showTables() {
return new ResponseData(service.showTables());
}
@RequestMapping(value = "/alltablesandviews", method = RequestMethod.GET)
@ResponseBody
public ResponseData showTablesAndViews() {
return new ResponseData(service.showTablesAndViews());
}
@RequestMapping(value = "/newtables")
@ResponseBody
public int generatorTables(GeneratorInfo generatorInfo) {
int rs = service.generatorFile(generatorInfo);
return rs;
}
@RequestMapping(value = "/generator/newBMFile")
@ResponseBody
public ResponseData generatorBMFile(HttpServletRequest request, @RequestBody Map map) {
ResponseData responseData = new ResponseData(false);
String location = (String) map.get("location");
String tableName = (String) map.get("tableName");
String fileName = (String) map.get("fileName");
Boolean isTable = (Boolean) map.get("isTable");
if (StringUtils.isEmpty(location) ||
StringUtils.isEmpty(tableName) ||
StringUtils.isEmpty(fileName) ||
isTable == null) {
responseData.setMessage("参数为空");
return responseData;
}
try {
service.generateBMDBFile(location, tableName, fileName, isTable);
} catch (IOException e) {
responseData.setMessage(e.getMessage());
return responseData;
}
return new ResponseData();
}
}
package com.hand.hap.generator.dto;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
public class DBColumn {
private String name;
private boolean isId = false;
private boolean isNotEmpty = false;
private boolean isNotNull = false;
private String javaType;
private String jdbcType;
private String columnLength;
private boolean isMultiLanguage = false;
private String remarks;
private String dataType;
private String prompt;
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isId() {
return isId;
}
public void setId(boolean id) {
isId = id;
}
public String getJavaType() {
return javaType;
}
public void setJavaType(String javaType) {
this.javaType = javaType;
}
public String getJdbcType() {
return jdbcType;
}
public void setJdbcType(String jdbcType) {
this.jdbcType = jdbcType;
}
public boolean isMultiLanguage() {
return isMultiLanguage;
}
public void setMultiLanguage(boolean multiLanguage) {
isMultiLanguage = multiLanguage;
}
public boolean isNotEmpty() {
return isNotEmpty;
}
public void setNotEmpty(boolean notEmpty) {
isNotEmpty = notEmpty;
}
public boolean isNotNull() {
return isNotNull;
}
public void setNotNull(boolean notNull) {
isNotNull = notNull;
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks;
}
public String getColumnLength() {
return columnLength;
}
public void setColumnLength(String columnLength) {
this.columnLength = columnLength;
}
}
package com.hand.hap.generator.dto;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
public class DBTable {
private String name;
private List<DBColumn> columns;
private boolean isMultiLanguage = false;
public DBTable() {
columns = new ArrayList<DBColumn>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isMultiLanguage() {
return isMultiLanguage;
}
public void setMultiLanguage(boolean multiLanguage) {
isMultiLanguage = multiLanguage;
}
public List<DBColumn> getColumns() {
return columns;
}
public void setColumns(List<DBColumn> columns) {
this.columns = columns;
}
}
package com.hand.hap.generator.dto;
import com.hand.hap.generator.service.impl.XmlColumnsInfo;
import java.util.List;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/26.
*/
public class FtlInfo {
private String fileName;
private String packageName;
private List<String> importName;
private List<XmlColumnsInfo> columnsInfo;
private String dir;
private String projectPath;
private String htmlModelName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public List<String> getImportName() {
return importName;
}
public void setImportName(List<String> importName) {
this.importName = importName;
}
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
}
public String getProjectPath() {
return projectPath;
}
public void setProjectPath(String projectPath) {
this.projectPath = projectPath;
}
public String getHtmlModelName() {
return htmlModelName;
}
public void setHtmlModelName(String htmlModelName) {
this.htmlModelName = htmlModelName;
}
public List<XmlColumnsInfo> getColumnsInfo() {
return columnsInfo;
}
public void setColumnsInfo(List<XmlColumnsInfo> columnsInfo) {
this.columnsInfo = columnsInfo;
}
}
package com.hand.hap.generator.dto;
/**
* Created by zjl on 2016/10/28.
*/
public class GeneratorInfo {
private String projectPath;
private String parentPackagePath;
private String packagePath;
private String targetName;
private String htmlModelName;
String controllerStatus;
String controllerName;
String mapperStatus;
String mapperName;
String mapperXmlStatus;
String mapperXmlName;
String serviceStatus;
String serviceName;
String implStatus;
String implName;
String htmlStatus;
String htmlName;
String dtoStatus;
String dtoName;
public String getProjectPath() {
return projectPath;
}
public void setProjectPath(String projectPath) {
this.projectPath = projectPath;
}
public String getParentPackagePath() {
return parentPackagePath;
}
public void setParentPackagePath(String parentPackagePath) {
this.parentPackagePath = parentPackagePath;
}
public String getPackagePath() {
return packagePath;
}
public void setPackagePath(String packagePath) {
this.packagePath = packagePath;
}
public String getTargetName() {
return targetName;
}
public void setTargetName(String targetName) {
this.targetName = targetName;
}
public String getHtmlModelName() {
return htmlModelName;
}
public void setHtmlModelName(String htmlModelName) {
this.htmlModelName = htmlModelName;
}
public String getControllerStatus() {
return controllerStatus;
}
public void setControllerStatus(String controllerStatus) {
this.controllerStatus = controllerStatus;
}
public String getControllerName() {
return controllerName;
}
public void setControllerName(String controllerName) {
this.controllerName = controllerName;
}
public String getMapperStatus() {
return mapperStatus;
}
public void setMapperStatus(String mapperStatus) {
this.mapperStatus = mapperStatus;
}
public String getMapperName() {
return mapperName;
}
public void setMapperName(String mapperName) {
this.mapperName = mapperName;
}
public String getMapperXmlStatus() {
return mapperXmlStatus;
}
public void setMapperXmlStatus(String mapperXmlStatus) {
this.mapperXmlStatus = mapperXmlStatus;
}
public String getMapperXmlName() {
return mapperXmlName;
}
public void setMapperXmlName(String mapperXmlName) {
this.mapperXmlName = mapperXmlName;
}
public String getServiceStatus() {
return serviceStatus;
}
public void setServiceStatus(String serviceStatus) {
this.serviceStatus = serviceStatus;
}
public String getServiceName() {
return serviceName;
}
public void setServiceName(String serviceName) {
this.serviceName = serviceName;
}
public String getImplStatus() {
return implStatus;
}
public void setImplStatus(String implStatus) {
this.implStatus = implStatus;
}
public String getImplName() {
return implName;
}
public void setImplName(String implName) {
this.implName = implName;
}
public String getHtmlStatus() {
return htmlStatus;
}
public void setHtmlStatus(String htmlStatus) {
this.htmlStatus = htmlStatus;
}
public String getHtmlName() {
return htmlName;
}
public void setHtmlName(String htmlName) {
this.htmlName = htmlName;
}
public String getDtoStatus() {
return dtoStatus;
}
public void setDtoStatus(String dtoStatus) {
this.dtoStatus = dtoStatus;
}
public String getDtoName() {
return dtoName;
}
public void setDtoName(String dtoName) {
this.dtoName = dtoName;
}
}
package com.hand.hap.generator.mapper;
import java.util.List;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
public interface HapGeneratorMapper {
}
package com.hand.hap.generator.service;
import com.hand.hap.generator.dto.GeneratorInfo;
import com.hand.hap.system.dto.ResponseData;
import java.io.IOException;
import java.util.List;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
public interface IHapGeneratorService {
public List<String> showTables();
List<String> showTablesAndViews();
public int generatorFile(GeneratorInfo info);
ResponseData generateBMDBFile(String location, String tableName, String fileName, Boolean isTable) throws IOException;
}
package com.hand.hap.generator.service.impl;
import com.hand.hap.generator.dto.DBColumn;
import com.hand.hap.generator.dto.DBTable;
import java.io.*;
import java.util.Date;
import java.util.List;
/**
* @author: hty Date: 2018/4/28 Time: 11:48
*/
public class AuroraUtil {
/**
* 根据数据库表生成BM文件
*
* @param location 文件位置
* @param fileName 文件名
* @param table 表名
**/
public static void createBMFile(String location, String fileName, DBTable table, List<String> columnNames) throws IOException {
File file = new File(location + "/" + fileName + ".bm");
//文件路径是否存在,不存在则创建路径
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.createNewFile();
List<DBColumn> columns = table.getColumns();
for (DBColumn s : columns) {
switch (s.getJdbcType().toUpperCase()) {
case "DATE":
case "TIMESTAMP":
case "DATETIME":
case "TIME":
s.setDataType("java.util.Date");
s.setJavaType("DATE");
break;
case "BIGINT":
case "INT":
case "INTEGER":
case "DECIMAL":
case "TINYINT":
case "NUMBER":
s.setDataType("java.lang.Long");
s.setJavaType("DECIMAL");
break;
case "DOUBLE":
s.setDataType("java.lang.Double");
s.setJavaType("DECIMAL");
break;
case "FLOAT":
s.setDataType("java.lang.Float");
s.setJavaType("DECIMAL");
break;
default:
s.setDataType("java.lang.String");
s.setJavaType("VARCHAR");
break;
}
}
//写入内容
StringBuilder sb = new StringBuilder();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n");
sb.append("<!--\n" +
" $Author: Aurora Generator \n" +
" $Date: " + new Date().toString() + " \n" +
" $Revision: 1.0 \n" +
" $Purpose: \n" +
"-->\r\n");
sb.append("<bm:model xmlns:bm=\"http://www.aurora-framework.org/schema/bm\" xmlns:e=\"aurora.service.exception\" xmlns:o=\"aurora.database.local.oracle\" xmlns:f=\"aurora.database.features\" alias=\"t1\" baseTable=\"" + table.getName() + "\">\n" +
" <bm:fields>\r\n");
for (DBColumn s : columns) {
// if (columnNames.contains(s.getName())) {
sb.append(" <bm:field name=\""
+ s.getName().toLowerCase()
+ "\" databaseType=\""
+ s.getJdbcType().toUpperCase()
+ "\" datatype=\""
+ s.getDataType()
+ "\" physicalName=\""
+ s.getName().toUpperCase() + "\" prompt=\""
+ table.getName().toUpperCase() + "." + s.getName().toUpperCase() + "\"/>\r\n");
// }
}
sb.append(" </bm:fields>\n" +
" <bm:features>\n" +
" <f:standard-who xmlns:f=\"aurora.database.features\"/>\n" +
" </bm:features>\n" +
"</bm:model>");
PrintWriter p = new PrintWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
p.write(sb.toString());
p.close();
}
}
package com.hand.hap.generator.service.impl;
import org.apache.ibatis.session.SqlSession;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/25.
*/
public class DBUtil {
private static final String COLUMN_NAME = "COLUMN_NAME";
private DBUtil() {
}
/**
* 判断查询结果集中是否存在某列
*
* @param rs 查询结果集
* @param columnName 列名
* @return true 存在; false 不存咋
*/
public static boolean isExistColumn(ResultSet rs, String columnName) {
try {
if (rs.findColumn(columnName) > 0) {
return true;
}
} catch (SQLException e) {
return false;
}
return false;
}
public static Connection getConnectionBySqlSession(SqlSession sqlSession) throws SQLException {
return sqlSession.getConfiguration().getEnvironment().getDataSource().getConnection();
}
public static List<String> showAllTables(Connection conn) throws SQLException {
List<String> tables = new ArrayList<>();
DatabaseMetaData dbmd = conn.getMetaData();
String database = conn.getCatalog();
ResultSet rs = dbmd.getTables(database, null, null, new String[]{"TABLE"});
while (rs.next()) {
tables.add(rs.getString("TABLE_NAME"));
}
return tables;
}
public static List<String> showAllTablesAndViews(Connection conn) throws SQLException {
List<String> tables = new ArrayList<>();
DatabaseMetaData dbmd = conn.getMetaData();
String database = conn.getCatalog();
ResultSet rs = dbmd.getTables(database, null, null, new String[]{"TABLE", "VIEWS"});
while (rs.next()) {
tables.add(rs.getString("TABLE_NAME"));
}
return tables;
}
public static ResultSet getTableColumnInfo(String table, DatabaseMetaData dbmd) throws SQLException {
return dbmd.getColumns(null, null, table, null);
}
public static boolean isMultiLanguageTable(String table) throws SQLException {
boolean result = false;
if (table.toUpperCase().endsWith("_B")) {
result = true;
}
return result;
}
public static List<String> getNotNullColumn(String table, DatabaseMetaData dbmd) throws SQLException {
List<String> result = new ArrayList<>();
ResultSet rs = dbmd.getColumns(null, null, table, null);
while (rs.next()) {
if ("NO".equalsIgnoreCase(rs.getString("IS_NULLABLE"))) {
result.add(rs.getString(DBUtil.COLUMN_NAME));
}
}
return result;
}
public static List<String> isMultiLanguageColumn(String table, DatabaseMetaData dbmd) throws SQLException {
List<String> result = new ArrayList<>();
String tlTable = table.substring(0, table.length() - 2) + "_tl";
ResultSet rs = getTableColumnInfo(tlTable, dbmd);
boolean key = false;
while (rs.next()) {
if ("OBJECT_VERSION_NUMBER".equalsIgnoreCase(rs.getString(DBUtil.COLUMN_NAME))) {
break;
}
if (key) {
result.add(rs.getString(DBUtil.COLUMN_NAME));
}
if ("LANG".equalsIgnoreCase(rs.getString(DBUtil.COLUMN_NAME))) {
key = true;
}
}
return result;
}
public static String getPrimaryKey(String table, DatabaseMetaData dbmd) throws SQLException {
String columnPK = null;
ResultSet rs = dbmd.getPrimaryKeys(null, null, table);
while (rs.next()) {
columnPK = rs.getString(DBUtil.COLUMN_NAME);
}
return columnPK;
}
public static void closeConnection(Connection connection) throws SQLException {
if (connection != null) {
connection.close();
}
}
public static void closeResultSet(ResultSet resultSet) throws SQLException {
if (resultSet != null) {
resultSet.close();
}
}
public static void closeSqlSession(SqlSession sqlSession) throws SQLException {
if (sqlSession != null) {
sqlSession.close();
}
}
}
package com.hand.hap.generator.service.impl;
import java.io.IOException;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.hand.hap.mybatis.util.StringUtil;
import com.hand.hap.system.dto.ResponseData;
import com.mchange.v1.lang.BooleanUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import com.hand.hap.generator.dto.DBColumn;
import com.hand.hap.generator.dto.DBTable;
import com.hand.hap.generator.dto.GeneratorInfo;
import com.hand.hap.generator.service.IHapGeneratorService;
import freemarker.template.TemplateException;
/**
* Created by jialong.zuo@hand-china.com on 2016/10/24.
*/
@Service
public class HapGeneratorServiceImpl implements IHapGeneratorService {
@Autowired
@Qualifier("sqlSessionFactory")
SqlSessionFactory sqlSessionFactory;
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public List<String> showTables() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<String> tables;
Connection conn = DBUtil.getConnectionBySqlSession(sqlSession);
tables = DBUtil.showAllTables(conn);
conn.close();
return tables;
} catch (SQLException e) {
logger.error("数据库查询出错");
}
return new ArrayList<String>();
}
@Override
public List<String> showTablesAndViews() {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
List<String> tables;
Connection conn = DBUtil.getConnectionBySqlSession(sqlSession);
tables = DBUtil.showAllTablesAndViews(conn);
conn.close();
return tables;
} catch (SQLException e) {
logger.error("数据库查询出错");
}
return new ArrayList<String>();
}
@Override
public int generatorFile(GeneratorInfo info) {
int rs = 0;
String tableName = info.getTargetName();
DBTable dbTable = getTableInfo(tableName);
//FileUtil.generatorInfo = info;
try {
rs = createFile(dbTable, info);
} catch (IOException e) {
rs = -1;
logger.error(e.getMessage());
} catch (TemplateException e) {
rs = -1;
logger.error(e.getMessage());
}
return rs;
}
public DBTable getViewInfo(String tableName) {
Connection conn = null;
DBTable dbTable = new DBTable();
List<DBColumn> columns = dbTable.getColumns();
List<String> multiColumns = null;
List<String> NotNullColumns = null;
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 设置tablename
dbTable.setName(tableName);
conn = DBUtil.getConnectionBySqlSession(sqlSession);
DatabaseMetaData dbmd = conn.getMetaData();
boolean multiLanguage = DBUtil.isMultiLanguageTable(tableName);
if (multiLanguage) {
dbTable.setMultiLanguage(multiLanguage);
multiColumns = DBUtil.isMultiLanguageColumn(tableName, dbmd);
// 判断多语言字段
}
// 获取主键字段
String columnPk = DBUtil.getPrimaryKey(tableName, dbmd);
// 获取不为空的字段
NotNullColumns = DBUtil.getNotNullColumn(tableName, dbmd);
Statement stat = conn.createStatement();
String sql = "SELECT * FROM user_tab_cols WHERE table_name = '" + tableName + "'";
ResultSet rs1 = stat.executeQuery(sql);
while (rs1.next()) {
String columnName = rs1.getString("COLUMN_NAME");
if ("OBJECT_VERSION_NUMBER".equalsIgnoreCase(columnName)) {
break;
}
columns.add(setColumnInfo(rs1, columnPk, NotNullColumns, multiLanguage, multiColumns));
}
rs1.close();
conn.close();
} catch (SQLException e) {
logger.error(e.getMessage());
}
return dbTable;
}
// 获取table信息
public DBTable getTableInfo(String tableName) {
Connection conn = null;
DBTable dbTable = new DBTable();
List<DBColumn> columns = dbTable.getColumns();
List<String> multiColumns = null;
List<String> NotNullColumns = null;
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 设置tablename
dbTable.setName(tableName);
conn = DBUtil.getConnectionBySqlSession(sqlSession);
DatabaseMetaData dbmd = conn.getMetaData();
// 是否为多语言表
boolean multiLanguage = DBUtil.isMultiLanguageTable(tableName);
if (multiLanguage) {
dbTable.setMultiLanguage(multiLanguage);
multiColumns = DBUtil.isMultiLanguageColumn(tableName, dbmd);
// 判断多语言字段
}
// 获取主键字段
String columnPk = DBUtil.getPrimaryKey(tableName, dbmd);
// 获取不为空的字段
NotNullColumns = DBUtil.getNotNullColumn(tableName, dbmd);
// 获取表列信息
ResultSet rs1 = DBUtil.getTableColumnInfo(tableName, dbmd);
while (rs1.next()) {
String columnName = rs1.getString("COLUMN_NAME");
if ("OBJECT_VERSION_NUMBER".equalsIgnoreCase(columnName)) {
break;
}
columns.add(setColumnInfo(rs1, columnPk, NotNullColumns, multiLanguage, multiColumns));
}
// 是否是多语言表
rs1.close();
conn.close();
} catch (SQLException e) {
logger.error(e.getMessage());
}
return dbTable;
}
private DBColumn setColumnInfo(ResultSet rs1, String columnPk, List<String> NotNullColumns, boolean multiLanguage, List<String> multiColumns) throws SQLException {
DBColumn column = new DBColumn();
String columnName = rs1.getString("COLUMN_NAME");
column.setName(columnName);
String typeName;
if (DBUtil.isExistColumn(rs1, "TYPE_NAME")) {
typeName = rs1.getString("TYPE_NAME");
if (StringUtil.isNotEmpty(rs1.getString("REMARKS"))) {
column.setRemarks(rs1.getString("REMARKS"));
}
column.setColumnLength(rs1.getString("COLUMN_SIZE"));
} else {
typeName = rs1.getString("DATA_TYPE");
}
column.setJdbcType(typeName);
// 判断是否为主键
if (columnName.equalsIgnoreCase(columnPk)) {
column.setId(true);
}
// 判断是否为null字段
for (String n : NotNullColumns) {
if (columnName.equalsIgnoreCase(n) && !columnName.equalsIgnoreCase(columnPk)) {
if ("BIGINT".equalsIgnoreCase(typeName)) {
column.setNotNull(true);
} else if ("VARCHAR".equalsIgnoreCase(typeName)) {
column.setNotEmpty(true);
}
}
}
// 判断多语言表中的多语言字段
if (multiLanguage) {
for (String m : multiColumns) {
if (m.equals(columnName)) {
column.setMultiLanguage(true);
break;
}
}
}
return column;
}
public int createFile(DBTable table, GeneratorInfo info) throws IOException, TemplateException {
int rs = FileUtil.isFileExist(info);
if (rs == 0) {
if (!"NotOperation".equalsIgnoreCase(info.getDtoStatus())) {
FileUtil.createDto(table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getControllerStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.Controller, table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getMapperStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.Mapper, table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getImplStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.Impl, table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getServiceStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.Service, table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getMapperXmlStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.MapperXml, table, info);
}
if (!"NotOperation".equalsIgnoreCase(info.getHtmlStatus())) {
FileUtil.createFtlInfoByType(FileUtil.pType.Html, table, info);
}
}
return rs;
}
public ResponseData generateBMDBFile(String location, String tableName, String fileName, Boolean isTable) throws IOException {
DBTable dbTable;
if (isTable) {
dbTable = getTableInfo(tableName);
} else {
dbTable = getViewInfo(tableName);
}
AuroraUtil.createBMFile(location, fileName, dbTable, new ArrayList<String>());
return new ResponseData();
}
}
package com.hand.hap.generator.service.impl;
public class XmlColumnsInfo {
private String tableColumnsName;
private String dBColumnsName;
private String jdbcType;
public String getTableColumnsName() {
return tableColumnsName;
}
public void setTableColumnsName(String tableColumnsName) {
this.tableColumnsName = tableColumnsName;
}
public String getdBColumnsName() {
return dBColumnsName;
}
public void setdBColumnsName(String dBColumnsName) {
this.dBColumnsName = dBColumnsName;
}
public String getJdbcType() {
return jdbcType;
}
public void setJdbcType(String jdbcType) {
this.jdbcType = jdbcType;
}
}
\ No newline at end of file
package com.hand.hap.system.service.impl;
import com.github.pagehelper.PageHelper;
import com.hand.hap.core.IRequest;
import com.hand.hap.core.annotation.StdWho;
import com.hand.hap.core.exception.UpdateFailedException;
import com.hand.hap.extensible.components.ServiceListenerChainFactory;
import com.hand.hap.mybatis.common.Criteria;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hap.system.dto.BaseDTO;
import com.hand.hap.system.dto.DTOStatus;
import com.hand.hap.system.service.IBaseService;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @author shengyang.zhou@hand-china.com
*/
@Service
public abstract class BaseServiceImpl<T> implements IBaseService<T> {
@Autowired
protected Mapper<T> mapper;
@Autowired
private ServiceListenerChainFactory chainFactory;
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public List<T> select(IRequest request, T condition, int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
return mapper.select(condition);
}
@Override
@Transactional(rollbackFor = Exception.class)
public T insert(IRequest request, T record) {
record = (T) chainFactory.getChain(this).beforeInsert(request, record);
mapper.insert(record);
record = (T) chainFactory.getChain(this).afterInsert(request, record);
return record;
}
@Override
@Transactional(rollbackFor = Exception.class)
public T insertSelective(IRequest request, T record) {
record = (T) chainFactory.getChain(this).beforeInsert(request, record);
mapper.insertSelective(record);
record = (T) chainFactory.getChain(this).afterInsert(request, record);
return record;
}
@Override
@Transactional(rollbackFor = Exception.class)
public T updateByPrimaryKey(IRequest request, @StdWho T record) {
record = (T) chainFactory.getChain(this).beforeUpdate(request, record);
int ret = mapper.updateByPrimaryKey(record);
checkOvn(ret, record);
record = (T) chainFactory.getChain(this).afterUpdate(request, record);
return record;
}
@Override
@Transactional(rollbackFor = Exception.class)
public T updateByPrimaryKeySelective(IRequest request, @StdWho T record) {
record = (T) chainFactory.getChain(this).beforeUpdate(request, record);
int ret = mapper.updateByPrimaryKeySelective(record);
checkOvn(ret, record);
record = (T) chainFactory.getChain(this).afterUpdate(request, record);
return record;
}
@Override
@Transactional(rollbackFor = Exception.class)
public T updateByPrimaryKeyOptions(IRequest request, @StdWho T record, Criteria criteria) {
record = (T) chainFactory.getChain(this).beforeUpdate(request, record);
int ret = mapper.updateByPrimaryKeyOptions(record,criteria);
checkOvn(ret, record);
record = (T) chainFactory.getChain(this).afterUpdate(request, record);
return record;
}
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public T selectByPrimaryKey(IRequest request, T record) {
return mapper.selectByPrimaryKey(record);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int deleteByPrimaryKey(T record) {
record = (T) chainFactory.getChain(this).beforeDelete(null, record);
int ret = mapper.deleteByPrimaryKey(record);
checkOvn(ret, record);
record = (T) chainFactory.getChain(this).afterDelete(null, record);
return ret;
}
/**
* 检查乐观锁<br>
* 检测到更新,删除失败时,抛出UpdateFailedException 异常
*
* @param updateCount
* update,delete 操作返回的值
* @param record
* 操作参数
*/
protected void checkOvn(int updateCount, Object record) {
if (updateCount == 0 && record instanceof BaseDTO) {
BaseDTO baseDTO = (BaseDTO) record;
if (baseDTO.getObjectVersionNumber() != null) {
throw new RuntimeException(new UpdateFailedException(baseDTO));
}
}
}
@Override
@Deprecated
@Transactional(propagation = Propagation.SUPPORTS)
public List<T> selectAll() {
return mapper.selectAll();
}
@Override
@Transactional(propagation = Propagation.SUPPORTS)
public List<T> selectAll(IRequest request) {
return mapper.selectAll();
}
/**
* this method assume the object in list is BaseDTO.
*
* @param request
* requestContext
* @param list
* dto list
* @return the list
*/
@Override
@Transactional(rollbackFor = Exception.class)
public List<T> batchUpdate(IRequest request, List<T> list) {
IBaseService<T> self = ((IBaseService<T>) AopContext.currentProxy());
for (T t : list) {
switch (((BaseDTO) t).get__status()) {
case DTOStatus.ADD:
self.insertSelective(request, t);
break;
case DTOStatus.UPDATE:
if (useSelectiveUpdate()) {
self.updateByPrimaryKeySelective(request, t);
} else {
self.updateByPrimaryKey(request, t);
}
break;
case DTOStatus.DELETE:
self.deleteByPrimaryKey(t);
break;
default:
break;
}
}
return list;
}
/**
* 默认 true,表示在 batchUpdate 中,更新操作,使用updateByPrimaryKeySelective(只更新不为 null
* 的字段)。<br>
* 若返回 false,则使用 updateByPrimaryKey(更新所有字段)
*
* @return
*/
protected boolean useSelectiveUpdate() {
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int batchDelete(List<T> list) {
IBaseService<T> self = ((IBaseService<T>) AopContext.currentProxy());
int c = 0;
for (T t : list) {
c += self.deleteByPrimaryKey(t);
}
return c;
}
@Transactional(propagation = Propagation.SUPPORTS)
public List<T> selectOptions(IRequest request, T record, Criteria criteria) {
if(criteria == null) criteria = new Criteria(record);
IBaseService<T> self = ((IBaseService<T>) AopContext.currentProxy());
return self.selectOptions(request,record, criteria, null, null);
}
@Transactional(propagation = Propagation.SUPPORTS)
public List<T> selectOptions(IRequest request, T record, Criteria criteria, Integer pageNum, Integer pageSize) {
if(pageNum != null && pageSize != null)
PageHelper.startPage(pageNum, pageSize);
if(criteria == null) criteria = new Criteria(record);
List<T> list = mapper.selectOptions(record, criteria);
return list;
}
}
package com.hand.hls.excel.dto;
import com.hand.hap.mybatis.annotation.ExtensionAttribute;
import com.hand.hap.system.dto.BaseDTO;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@ExtensionAttribute(disable=true)
@Table(name = "excel_export_info")
public class ExcelExportInfo extends BaseDTO {
@Id
@GeneratedValue
private Long exportId;
private String sqlContent;
private String columnInfo;
private String savePath;
private String status;
private String fileName;
private String fileType;
public Long getExportId() {
return exportId;
}
public void setExportId(Long exportId) {
this.exportId = exportId;
}
public String getSqlContent() {
return sqlContent;
}
public void setSqlContent(String sqlContent) {
this.sqlContent = sqlContent;
}
public String getColumnInfo() {
return columnInfo;
}
public void setColumnInfo(String columnInfo) {
this.columnInfo = columnInfo;
}
public String getSavePath() {
return savePath;
}
public void setSavePath(String savePath) {
this.savePath = savePath;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getFileType() {
return fileType;
}
public void setFileType(String fileType) {
this.fileType = fileType;
}
}
package com.hand.hls.excel.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.excel.dto.ExcelExportInfo;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ExcelExportInfoMapper extends Mapper<ExcelExportInfo> {
}
package com.hand.hls.excel.service;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hls.excel.dto.ExcelExportInfo;
public interface IExcelExportInfoService extends IBaseService<ExcelExportInfo>, ProxySelf<IExcelExportInfoService> {
}
package com.hand.hls.excel.service.impl;
import com.hand.hap.system.service.impl.BaseServiceImpl;
import com.hand.hls.excel.dto.ExcelExportInfo;
import com.hand.hls.excel.service.IExcelExportInfoService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class ExcelExportInfoServiceImpl extends BaseServiceImpl<ExcelExportInfo> implements IExcelExportInfoService {
}
package com.hand.hls.hlcm.acr.controllers;
import com.hand.hap.core.IRequest;
import com.hand.hap.system.controllers.BaseController;
import com.hand.hap.system.dto.ResponseData;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceHd;
import com.hand.hls.hlcm.acr.service.IAcrInvoiceHdService;
import com.hand.hls.hlcm.util.ResMessageException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @Author Robert8900
* @Date: 2018/8/24 17:17
* @Description:发票 controller
* @Purpose:
**/
@Controller
public class AcrInvoiceHdController extends BaseController {
@Autowired
private IAcrInvoiceHdService iAcrInvoiceHdService;
//金税接口发票开票接口入口
@RequestMapping(value = "/acr/invoice/info/submit")
@ResponseBody
public ResponseData acrInvoiceInfoSubmit(@RequestBody List<AcrInvoiceHd> acrInvoiceHds, HttpServletRequest request) throws ResMessageException {
ResponseData responseData = new ResponseData();
IRequest requestContext = createRequestContext(request);
ResponseData data = null;
data = iAcrInvoiceHdService.acrInvoiceInfoSubmit(requestContext,acrInvoiceHds);
if(!data.isSuccess()){
responseData.setSuccess(false);
responseData.setMessage(data.getMessage());
}else{
responseData.setSuccess(true);
}
return responseData;
}
//金税接口发票下载接口入口
@RequestMapping(value = "/acr/invoice/info/download")
@ResponseBody
public ResponseData acrInvoiceInfoDownload(@RequestBody List<AcrInvoiceHd> acrInvoiceHds, HttpServletRequest request) throws ResMessageException {
ResponseData responseData = new ResponseData();
IRequest requestContext = createRequestContext(request);
ResponseData data = iAcrInvoiceHdService.acrInvoiceInfoDownload(requestContext,acrInvoiceHds);
if(!data.isSuccess()){
responseData.setSuccess(false);
responseData.setMessage(data.getMessage());
}else{
responseData.setSuccess(true);
}
return responseData;
}
}
package com.hand.hls.hlcm.acr.dto;
import com.hand.hap.mybatis.annotation.ExtensionAttribute;
import com.hand.hap.system.dto.BaseDTO;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.Date;
/**
* @Author Robert8900
* @Date: 2018/8/29 13:36
* @Description: 电子发票中间头表
* @Purpose:
**/
@ExtensionAttribute(disable = true)
@Table(name = "acr_ele_invoice_hd")
public class AcrEleInvoiceHd extends BaseDTO {
@Id
@GeneratedValue
private Long eleInvoiceHdId; //电子发票头ID/PK
private Long invoiceHdId; //发票表头ID
private String documentType; //单据类型
private String documentCategory; //单据类别
private String swno; //流水号
private String saleTax; //销方税号
private String custName; //购方名称
private String custTaxNo; //购方税号
private String custAddr; //购方地址
private String custTelephone; //购货方手机号
private String custPhone; //购方固定电话
private String custEmail; //购方邮箱
private String custBankAccount; //开户行+账号
private String custType; //购货方企业类型
private String invoMemo; //备注
private String invType; //发票类型
private Date billDate; //发票类型
private String thdh; //退货单位
private Long billType; //开票类型
private String specialRedFlag; //特殊红冲标志
private String operationCode; //操作代码
private String kpy; //开票人
private String sky; //收款员
private String fhr; //复核人
private String yfpdm; //原发票代码
private String yfphm; //原发票号码
private String chyy; //红冲原因
private String status; //电子发票状态
private String pdfUrl; //电子接口返回的pdf附件URL
private String errorCode; //电子发票返回错误code
private String errorMessage; //电子发票返回错误message
@Transient
private Long cashflowId;
@Transient
private Long cfType;
//发票余量
@Transient
private int acrEleNumber;
@Transient
private Long companyId;
public Long getEleInvoiceHdId() {
return eleInvoiceHdId;
}
public void setEleInvoiceHdId(Long eleInvoiceHdId) {
this.eleInvoiceHdId = eleInvoiceHdId;
}
public Long getInvoiceHdId() {
return invoiceHdId;
}
public void setInvoiceHdId(Long invoiceHdId) {
this.invoiceHdId = invoiceHdId;
}
public String getDocumentType() {
return documentType;
}
public void setDocumentType(String documentType) {
this.documentType = documentType;
}
public String getDocumentCategory() {
return documentCategory;
}
public void setDocumentCategory(String documentCategory) {
this.documentCategory = documentCategory;
}
public String getSwno() {
return swno;
}
public void setSwno(String swno) {
this.swno = swno;
}
public String getSaleTax() {
return saleTax;
}
public void setSaleTax(String saleTax) {
this.saleTax = saleTax;
}
public String getCustName() {
return custName;
}
public void setCustName(String custName) {
this.custName = custName;
}
public String getCustTaxNo() {
return custTaxNo;
}
public void setCustTaxNo(String custTaxNo) {
this.custTaxNo = custTaxNo;
}
public String getCustAddr() {
return custAddr;
}
public void setCustAddr(String custAddr) {
this.custAddr = custAddr;
}
public String getCustTelephone() {
return custTelephone;
}
public void setCustTelephone(String custTelephone) {
this.custTelephone = custTelephone;
}
public String getCustPhone() {
return custPhone;
}
public void setCustPhone(String custPhone) {
this.custPhone = custPhone;
}
public String getCustEmail() {
return custEmail;
}
public void setCustEmail(String custEmail) {
this.custEmail = custEmail;
}
public String getCustBankAccount() {
return custBankAccount;
}
public void setCustBankAccount(String custBankAccount) {
this.custBankAccount = custBankAccount;
}
public String getCustType() {
return custType;
}
public void setCustType(String custType) {
this.custType = custType;
}
public String getInvoMemo() {
return invoMemo;
}
public void setInvoMemo(String invoMemo) {
this.invoMemo = invoMemo;
}
public String getInvType() {
return invType;
}
public void setInvType(String invType) {
this.invType = invType;
}
public Date getBillDate() {
return billDate;
}
public void setBillDate(Date billDate) {
this.billDate = billDate;
}
public String getThdh() {
return thdh;
}
public void setThdh(String thdh) {
this.thdh = thdh;
}
public Long getBillType() {
return billType;
}
public void setBillType(Long billType) {
this.billType = billType;
}
public String getSpecialRedFlag() {
return specialRedFlag;
}
public void setSpecialRedFlag(String specialRedFlag) {
this.specialRedFlag = specialRedFlag;
}
public String getOperationCode() {
return operationCode;
}
public void setOperationCode(String operationCode) {
this.operationCode = operationCode;
}
public String getKpy() {
return kpy;
}
public void setKpy(String kpy) {
this.kpy = kpy;
}
public String getSky() {
return sky;
}
public void setSky(String sky) {
this.sky = sky;
}
public String getFhr() {
return fhr;
}
public void setFhr(String fhr) {
this.fhr = fhr;
}
public String getYfpdm() {
return yfpdm;
}
public void setYfpdm(String yfpdm) {
this.yfpdm = yfpdm;
}
public String getYfphm() {
return yfphm;
}
public void setYfphm(String yfphm) {
this.yfphm = yfphm;
}
public String getChyy() {
return chyy;
}
public void setChyy(String chyy) {
this.chyy = chyy;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public Long getCashflowId() {
return cashflowId;
}
public void setCashflowId(Long cashflowId) {
this.cashflowId = cashflowId;
}
public Long getCfType() {
return cfType;
}
public void setCfType(Long cfType) {
this.cfType = cfType;
}
public int getAcrEleNumber() {
return acrEleNumber;
}
public void setAcrEleNumber(int acrEleNumber) {
this.acrEleNumber = acrEleNumber;
}
public Long getCompanyId() {
return companyId;
}
public void setCompanyId(Long companyId) {
this.companyId = companyId;
}
public String getPdfUrl() {
return pdfUrl;
}
public void setPdfUrl(String pdfUrl) {
this.pdfUrl = pdfUrl;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMessage() {
return errorMessage;
}
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
}
package com.hand.hls.hlcm.acr.dto;
import com.hand.hap.mybatis.annotation.ExtensionAttribute;
import com.hand.hap.system.dto.BaseDTO;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
* @Author Robert8900
* @Date: 2018/8/29 13:40
* @Description: 电子发票中间行表
* @Purpose:
**/
@ExtensionAttribute(disable = true)
@Table(name = "acr_ele_invoice_ln")
public class AcrEleInvoiceLn extends BaseDTO {
@Id
@GeneratedValue
private Long eleInvoiceLnId; //电子发票行ID/PK
private Long eleInvoiceHdId; //电子发票头ID
private Long invoiceHdId; //发票头ID
private Long invoiceLnId; //发票行ID
private Long contractId; //合同ID
private Long cashflowId; //现金流ID
private String billNo; //订单号
private String name; //商品名称
private String code; //商品编号(税收分类编码)
private String lineType; //发票行性质
private String spec; //规格型号
private String unit; //计量单位
private Double taxRate; //税率
private Double quantity; //数量
private Double taxPrice; //单价
private Double totalAmount; //含税金额
private String yhzcbs; //税收优惠政策 标志
private String yhzcnr; //享受税收优惠 政策内容
private Long lslbs; //零税率标识
private String zxbm; //自行编码
private Double kce; //扣除额
public Long getEleInvoiceLnId() {
return eleInvoiceLnId;
}
public void setEleInvoiceLnId(Long eleInvoiceLnId) {
this.eleInvoiceLnId = eleInvoiceLnId;
}
public Long getEleInvoiceHdId() {
return eleInvoiceHdId;
}
public void setEleInvoiceHdId(Long eleInvoiceHdId) {
this.eleInvoiceHdId = eleInvoiceHdId;
}
public Long getInvoiceHdId() {
return invoiceHdId;
}
public void setInvoiceHdId(Long invoiceHdId) {
this.invoiceHdId = invoiceHdId;
}
public Long getInvoiceLnId() {
return invoiceLnId;
}
public void setInvoiceLnId(Long invoiceLnId) {
this.invoiceLnId = invoiceLnId;
}
public Long getContractId() {
return contractId;
}
public void setContractId(Long contractId) {
this.contractId = contractId;
}
public Long getCashflowId() {
return cashflowId;
}
public void setCashflowId(Long cashflowId) {
this.cashflowId = cashflowId;
}
public String getBillNo() {
return billNo;
}
public void setBillNo(String billNo) {
this.billNo = billNo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getLineType() {
return lineType;
}
public void setLineType(String lineType) {
this.lineType = lineType;
}
public String getSpec() {
return spec;
}
public void setSpec(String spec) {
this.spec = spec;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public Double getTaxRate() {
return taxRate;
}
public void setTaxRate(Double taxRate) {
this.taxRate = taxRate;
}
public Double getQuantity() {
return quantity;
}
public void setQuantity(Double quantity) {
this.quantity = quantity;
}
public Double getTaxPrice() {
return taxPrice;
}
public void setTaxPrice(Double taxPrice) {
this.taxPrice = taxPrice;
}
public Double getTotalAmount() {
return totalAmount;
}
public void setTotalAmount(Double totalAmount) {
this.totalAmount = totalAmount;
}
public String getYhzcbs() {
return yhzcbs;
}
public void setYhzcbs(String yhzcbs) {
this.yhzcbs = yhzcbs;
}
public String getYhzcnr() {
return yhzcnr;
}
public void setYhzcnr(String yhzcnr) {
this.yhzcnr = yhzcnr;
}
public Long getLslbs() {
return lslbs;
}
public void setLslbs(Long lslbs) {
this.lslbs = lslbs;
}
public String getZxbm() {
return zxbm;
}
public void setZxbm(String zxbm) {
this.zxbm = zxbm;
}
public Double getKce() {
return kce;
}
public void setKce(Double kce) {
this.kce = kce;
}
}
This diff is collapsed.
This diff is collapsed.
package com.hand.hls.hlcm.acr.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceHd;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceHd;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @Author Robert8900
* @Date: 2018/8/29 16:03
* @Description: 电子发票中间头表mapper
* @Purpose:
**/
public interface AcrEleInvoiceHdMapper extends Mapper<AcrEleInvoiceHd> {
//获取流水号
String getSwnoDocumentNumber(@Param("userId") Long userId, @Param("companyId") Long companyId);
//获取bpClass
String getBpClass(@Param("bpId") Long bpId);
//获取cellPhone
String getCellPhone(@Param("bpId") Long bpId);
//获取email
String getEmail(@Param("bpId") Long bpId);
//获取用户名称
String getName(@Param("userId") Long userId);
List<Map> getContractDetail(@Param("cashflowId") Long cashflowId);
List<AcrEleInvoiceHd> getAcrEleHdInfo(AcrEleInvoiceHd acrEleInvoiceHd);
void updateAcrEleHdStatus(@Param("invoiceHdId") Long invoiceHdId);
void updateAceEleHdInfo(@Param("swno") String swno,@Param("fpdm") String fpdm,@Param("fphm") String fphm,@Param("pdfUrl") String pdfUrl);
Long getEleInvoiceHdId(@Param("swno") String swno);
String getTaxClassNum(AcrEleInvoiceHd acrEleInvoiceHd);
void updateAceEleNumber(AcrEleInvoiceHd acrEleInvoiceHd);
void updateAcrEleHdErrorStatus(AcrEleInvoiceHd acrEleInvoiceHd);
void updateInvoiceHdErrorStatus(AcrInvoiceHd acrInvoiceHd);
void deleteData(@Param("eleInvoiceHdId") Long eleInvoiceHdId);
}
package com.hand.hls.hlcm.acr.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceLn;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author Robert8900
* @Date: 2018/8/29 16:03
* @Description: 电子发票中间行表mapper
* @Purpose:
**/
public interface AcrEleInvoiceLnMapper extends Mapper<AcrEleInvoiceLn> {
List<AcrEleInvoiceLn> getAcrEleLnInfo(@Param("eleInvoiceHdId") Long eleInvoiceHdId);
}
package com.hand.hls.hlcm.acr.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceHd;
/**
* @Author Robert8900
* @Date: 2018/8/24 16:28
* @Description: 发票头mapper
* @Purpose:
**/
public interface AcrInvoiceHdMapper extends Mapper<AcrInvoiceHd> {
}
package com.hand.hls.hlcm.acr.mapper;
import com.hand.hap.core.IRequest;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceLn;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author Robert8900
* @Date: 2018/8/24 16:28
* @Description: 发票行mapper
* @Purpose:
**/
public interface AcrInvoiceLnMapper extends Mapper<AcrInvoiceLn> {
List<AcrInvoiceLn> selectAcrInvoiceLnDetail (@Param("invoiceHdId") Long invoiceHdId);
}
package com.hand.hls.hlcm.acr.service;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceHd;
/**
* @Author Robert8900
* @Date: 2018/8/29 15:00
* @Description: 电子发票中间头表 service
* @Purpose:
**/
public interface IAcrEleInvoiceHdService extends IBaseService<AcrEleInvoiceHd>,ProxySelf<IAcrEleInvoiceHdService>{
}
package com.hand.hls.hlcm.acr.service;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceLn;
/**
* @Author Robert8900
* @Date: 2018/8/29 15:53
* @Description: 电子发票中间行表 service
* @Purpose:
**/
public interface IAcrEleInvoiceLnService extends IBaseService<AcrEleInvoiceLn>,ProxySelf<IAcrEleInvoiceLnService>{
}
package com.hand.hls.hlcm.acr.service;
import com.hand.hap.core.IRequest;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.dto.ResponseData;
import com.hand.hap.system.service.IBaseService;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceHd;
import com.hand.hls.hlcm.util.ResMessageException;
import java.util.List;
/**
* @Author Robert8900
* @Date: 2018/8/24 17:27
* @Description: 发票 service
* @Purpose:
**/
public interface IAcrInvoiceHdService extends IBaseService<AcrInvoiceHd>,ProxySelf<IAcrInvoiceHdService> {
ResponseData acrInvoiceInfoSubmit(IRequest iRequest,List<AcrInvoiceHd> list) throws ResMessageException;
ResponseData acrInvoiceInfoDownload(IRequest iRequest,List<AcrInvoiceHd> list) throws ResMessageException;
}
package com.hand.hls.hlcm.acr.service;
import com.hand.hap.core.ProxySelf;
import com.hand.hap.system.service.IBaseService;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceLn;
/**
* @Author Robert8900
* @Date: 2018/8/27 15:27
* @Description:
* @Purpose:
**/
public interface IAcrInvoiceLnService extends IBaseService<AcrInvoiceLn>,ProxySelf<IAcrInvoiceLnService>{
}
package com.hand.hls.hlcm.acr.service.impl;
import com.hand.hap.system.service.impl.BaseServiceImpl;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceHd;
import com.hand.hls.hlcm.acr.service.IAcrEleInvoiceHdService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author Robert8900
* @Date: 2018/8/29 15:00
* @Description: 电子发票中间头表 service实现类
* @Purpose:
**/
@Service
@Transactional(rollbackFor = Exception.class)
public class AcrEleInvoiceHdServiceImpl extends BaseServiceImpl<AcrEleInvoiceHd> implements IAcrEleInvoiceHdService {
}
package com.hand.hls.hlcm.acr.service.impl;
import com.hand.hap.system.service.impl.BaseServiceImpl;
import com.hand.hls.hlcm.acr.dto.AcrEleInvoiceLn;
import com.hand.hls.hlcm.acr.service.IAcrEleInvoiceLnService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author Robert8900
* @Date: 2018/8/29 15:54
* @Description: 电子发票中间行表 service 实现类
* @Purpose:
**/
@Service
@Transactional(rollbackFor = Exception.class)
public class AcrEleInvoiceLnServiceImpl extends BaseServiceImpl<AcrEleInvoiceLn> implements IAcrEleInvoiceLnService {
}
package com.hand.hls.hlcm.acr.service.impl;
import com.hand.hap.system.service.impl.BaseServiceImpl;
import com.hand.hls.hlcm.acr.dto.AcrInvoiceLn;
import com.hand.hls.hlcm.acr.service.IAcrInvoiceLnService;
import org.springframework.stereotype.Service;
/**
* @Author Robert8900
* @Date: 2018/8/27 15:28
* @Description:
* @Purpose:
**/
@Service
public class AcrInvoiceLnServiceImpl extends BaseServiceImpl<AcrInvoiceLn> implements IAcrInvoiceLnService {
}
package com.hand.hls.hlcm.atm.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.atm.dto.HlsFndAtmAttachment;
public interface HlsFndAtmAttachmentMapper extends Mapper<HlsFndAtmAttachment>{
}
\ No newline at end of file
package com.hand.hls.hlcm.atm.mapper;
import com.hand.hap.mybatis.common.Mapper;
import com.hand.hls.hlcm.atm.dto.HlsFndAtmAttachmentMulti;
public interface HlsFndAtmAttachmentMultiMapper extends Mapper<HlsFndAtmAttachmentMulti>{
void updateAttachmentMulti(HlsFndAtmAttachmentMulti multi);
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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