Commit 6d68da3c authored by 赵啸非's avatar 赵啸非

Initial commit

parents
*.iml
node_modules/
.idea/
*.class
target/
\ No newline at end of file
package com.lilosoft.business.rocr.bean;
import com.lilosoft.core.base.BaseBean;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 机器人无人受理办件管理Bean
* @author pengtangshu
* @version 2021-04-13
*/
@Data
public class RobotCase1 extends BaseBean {
/**
* 无人受理办件流水批次号
*/
private String batchId;
/**
* 图谱事项id
*/
private String projectId;
/**
* 办事人姓名
*/
private String name;
/**
* 办事人身份证号
*/
private String idcard;
/**
* 办事人联系电话
*/
private String phone;
/**
* 无人受理机器人id
*/
private String serviceId;
/**
* 资料袋id或编号
*/
private String rfid;
/**
* 是否已发送短信 0 否 1是
*/
private String isSendMsg;
/**
* 办件状态,0:暂存,1:预审通过,2:预审未通过,3:已存柜,4:已取件
*/
private String status;
/**
* 事项名称(临时扩展字段)
*/
private String projectName;
/**
* 政务中心客户名字(临时扩展字段)
*/
private String enterpriseName;
/**
* 政务中心客户Id(临时扩展字段)
*/
private String enterpriseId;
/**
* 智能预审来源,为空或0则为无人受理机器人,1:web在线预审(临时扩展字段)
*/
private String source;
/**
* web在线预审用户id,用于连接websocket推送消息,当source为1时有值,否则为空
*/
private String userId;
/**
* 报告标题
*/
private String title;
/**
* 报告第一段内容
*/
private String contentOne;
/**
* 预审通过时报告第二段内容
*/
private String contentYes;
/**
* 预审不通过时报告第二段内容
*/
private String contentNo;
/**
* 预审不通过时报告第三段内容
*/
private String contentThree;
/**
* 是否打印回执单(1打印,0不打印)
*/
private String isReceipt;
/**
* 回执单需要的数据(base64)
*/
private String receiptData;
/**
* 是否需要人工干预 0:普通订正;1:远程核验
*/
private String artificialType;
/**
* 填入表格map数据
*/
private Map<String,String> wordMap;
/**
* 是否打印word表格 0:不打印 1:打印
*/
private String isPrintWord;
/**
* 办件材料确认提示语
*/
private String wordTips;
private String template;
/**
* 存放错误坐标ListMapLables
*/
private Object coordMapList;
/**
* 是否需要RPA流程 0:不需要 1:需要
*/
private String isRpa;
/**
* RPAUrl
*/
private String rpaUrl;
/**
* RPA需要的数据
*/
private String rpaData;
/**
* RPA参数前缀
*/
private String RPAPrefix;
/**
* RPA参数跳转页面
*/
private String pageUrl;
/**
* RPA参数是否跳转页面(0:不需要,1:需要)
*/
private String isSkip;
/**
* word打印模板类型
*/
private String wordType;
/**
* 是否发送短信
*/
private String isSendNote;
/**
* 接收事项办理短信人员
*/
private List<Map<String,Object>> projectNotePerson;
/**
* 接收统计短信人员
*/
private List<Map<String,Object>> allNotePerson;
/**
* 资料存放(0:本地,1:云端)
*/
private String isFastdfs;
/**
* 服务器IP
*/
private String serverIp;
public RobotCase() {
super();
}
}
\ No newline at end of file
package com.lilosoft.business.rocr.bean;
import com.lilosoft.core.base.BaseBean;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
* 机器人无人受理办件管理Bean
* @author pengtangshu
* @version 2021-04-13
*/
@Data
public class RobotCase extends BaseBean {
/**
* 无人受理办件流水批次号
*/
private String batchId;
/**
* 图谱事项id
*/
private String projectId;
/**
* 办事人姓名
*/
private String name;
/**
* 办事人身份证号
*/
private String idcard;
/**
* 办事人联系电话
*/
private String phone;
/**
* 无人受理机器人id
*/
private String serviceId;
/**
* 资料袋id或编号
*/
private String rfid;
/**
* 是否已发送短信 0 否 1是
*/
private String isSendMsg;
/**
* 办件状态,0:暂存,1:预审通过,2:预审未通过,3:已存柜,4:已取件
*/
private String status;
/**
* 事项名称(临时扩展字段)
*/
private String projectName;
/**
* 政务中心客户名字(临时扩展字段)
*/
private String enterpriseName;
/**
* 政务中心客户Id(临时扩展字段)
*/
private String enterpriseId;
/**
* 智能预审来源,为空或0则为无人受理机器人,1:web在线预审(临时扩展字段)
*/
private String source;
/**
* web在线预审用户id,用于连接websocket推送消息,当source为1时有值,否则为空
*/
private String userId;
/**
* 报告标题
*/
private String title;
/**
* 报告第一段内容
*/
private String contentOne;
/**
* 预审通过时报告第二段内容
*/
private String contentYes;
/**
* 预审不通过时报告第二段内容
*/
private String contentNo;
/**
* 预审不通过时报告第三段内容
*/
private String contentThree;
/**
* 是否打印回执单(1打印,0不打印)
*/
private String isReceipt;
/**
* 回执单需要的数据(base64)
*/
private String receiptData;
/**
* 是否需要人工干预 0:普通订正;1:远程核验
*/
private String artificialType;
/**
* 填入表格map数据
*/
private Map<String,String> wordMap;
/**
* 是否打印word表格 0:不打印 1:打印
*/
private String isPrintWord;
/**
* 办件材料确认提示语
*/
private String wordTips;
private String template;
/**
* 存放错误坐标ListMapLables
*/
private Object coordMapList;
/**
* 是否需要RPA流程 0:不需要 1:需要
*/
private String isRpa;
/**
* RPAUrl
*/
private String rpaUrl;
/**
* RPA需要的数据
*/
private String rpaData;
/**
* RPA参数前缀
*/
private String RPAPrefix;
/**
* RPA参数跳转页面
*/
private String pageUrl;
/**
* RPA参数是否跳转页面(0:不需要,1:需要)
*/
private String isSkip;
/**
* word打印模板类型
*/
private String wordType;
/**
* 是否发送短信
*/
private String isSendNote;
/**
* 接收事项办理短信人员
*/
private List<Map<String,Object>> projectNotePerson;
/**
* 接收统计短信人员
*/
private List<Map<String,Object>> allNotePerson;
/**
* 资料存放(0:本地,1:云端)
*/
private String isFastdfs;
/**
* 服务器IP
*/
private String serverIp;
public RobotCase() {
super();
}
}
\ No newline at end of file
package com.lilosoft.business.rocr.bean;
import com.lilosoft.core.base.BaseBean;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
/**
* 资料预审方法管理Bean
* @author pengtangshu
* @version 2021-07-01
*/
@SuppressWarnings("serial")
@Data
public class RobotCaseMethod1 extends BaseBean {
/**
* 事项id
*/
private String projectId;
/**
* 事项名称
*/
private String projectName;
/**
* 调用的类包路径,如com.lilosoft.business.rapi.service.AiCaseService
*/
private String className;
/**
* 调用的service层注入的bean名称,如aiCaseService
*/
private String classCode;
/**
* 调用的方法名
*/
private String methodName;
/**
* 政务中心客户ID(临时扩展字段)
*/
private String enterpriseId;
/**
* 政务中心客户名称
*/
private String enterpriseName;
/**
* 备注描述
*/
private String remark;
/**
* 报告标题
*/
private String title;
/**
* 报告第一段内容
*/
private String contentOne;
/**
* 预审通过时报告第二段内容
*/
private String contentYes;
/**
* 预审不通过时报告第二段内容
*/
private String contentNo;
/**
* 预审不通过时报告第三段内容
*/
private String contentThree;
/**
* 是否打印回执单(1打印,0不打印)
*/
private String isReceipt;
/**
* 模板
*/
private String xmlStr;
/**
* 办件材料确认提示语
*/
private String wordTips;
/**
* rpa参数前缀
*/
private String rpaPrefix;
/**
* 是否需要开启rpa
*/
private String isRpa;
/**
* 是否需要远程打印 0:不需要 1:需要
*/
private String isRemotePrint;
/**
* 远程打印机名称
*/
private String remotePrintName;
/**
* 文件领取窗口
*/
private String windowName;
public RobotCaseMethod1() {
super();
}
public String getMethodName() {
// methodName = StringUtils.isNotEmpty(methodName) ? methodName : "accept";
// return methodName;
return "accept";
}
}
\ No newline at end of file
#!/bin/sh
RESOURCE_NAME=liloAiCase-1.0.jar
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'App is running.'
else
echo 'App is NOT running.'
fi
rm -f tpid
nohup java -Xms128m -Xmx256m -jar ./$RESOURCE_NAME >/dev/null &
echo $! > tpid
echo Start Success!
#!/bin/sh
RESOURCE_NAME=liloAiCase-1.0.jar
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'App is running.'
else
echo 'App is NOT running.'
fi
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for robot_apply_material
-- ----------------------------
DROP TABLE IF EXISTS `robot_apply_material`;
CREATE TABLE `robot_apply_material` (
`id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',
`file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名',
`file_suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件后缀',
`file_url` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件存储在fastdfs文件系统中的url地址',
`file_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '高拍仪设备拍摄的附件id',
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '资料识别分类类型,对应数据字典1013',
`success` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '资料识别信息提取成功与否,0:失败,1:成功',
`error_msg` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '资料识别信息提取失败异常信息',
`json_data` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '资料识别返回json串',
`use_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '可用标志,0:不可用,1:可用',
`apply_type` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '应用类型:1-资料验证,2-智能填报',
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '应用办件资料表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for robot_case_material
-- ----------------------------
DROP TABLE IF EXISTS `robot_case_material`;
CREATE TABLE `robot_case_material` (
`id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '主键id',
`case_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '关联办件表id',
`batch_id` varchar(36) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '办件流水批次号',
`file_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件名',
`file_suffix` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件后缀',
`file_url` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件存储在fastdfs文件系统中的url地址',
`file_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '高拍仪设备拍摄的附件id',
`type` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '资料识别分类类型,对应数据字典1013',
`success` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '资料识别信息提取成功与否,0:失败,1:成功',
`error_msg` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '资料识别信息提取失败异常信息',
`json_data` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '资料识别返回json串',
`use_flag` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '可用标志,0:不可用,1:可用',
`create_time` datetime(0) DEFAULT NULL COMMENT '创建时间',
`temp` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '1' COMMENT '办件受理最终报告文书还是单个资料识别文件,0:最终报告文书,1:单个资料识别文件',
`mark_json` json COMMENT '材料标注结果json',
`word_json` json COMMENT '办件word文档回显数据',
`form_json` json COMMENT '表单数据',
`correct_json_data` text CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '人工纠正后的资料识别json',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '无人受理机器人办件资料表' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
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 source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
## application.yml字段释义
### tempFilePath
本地文件存储根目录
### fastdfs_img_url
Fastdfs文件存储路径
### newImageOcrUrl
OCR文件识别接口地址
### isFastdfs
文件存储位置,值为1或0;
当值为1时-文件存储在Fastdfs;当值为0时-文件存储在本地
### isApiData:
资料数据存储位置,值为1或0;
当值为1时-数据走api接口传输数据,数据存储在云端;
当值为0时-数据通过项目sql操作,存储在本地数据库
### serverUrl
本应用对外地址
### rdsmsApiUrl
api接口地址
### websocketApiUrl
websocket接口地址
\ No newline at end of file
package com.lilosoft;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/*import org.springframework.cloud.client.discovery.EnableDiscoveryClient;*/
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class LiLoAiCaseExampleApplication extends SpringBootServletInitializer {
private final static Logger logger = LoggerFactory.getLogger(LiLoAiCaseExampleApplication.class);
public static void main(String[] args) {
SpringApplication app = new SpringApplication(LiLoAiCaseExampleApplication.class);
app.setBannerMode(Banner.Mode.CONSOLE);
app.run(args);
logger.info("ヾ(@°^°@)ヾ liloAiCase启动成功 ヾ(@°^°@)ヾ\n");
logger.info("SpringbootApplication "+" is success!");
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(LiLoAiCaseExampleApplication.class);
}
}
\ No newline at end of file
package com.lilosoft.business.jdbc.dao;
import com.lilosoft.business.jdbc.bean.RobotApplyMaterial;
import com.lilosoft.core.annotation.MyBatisDao;
import com.lilosoft.core.base.CrudDao;
import java.util.HashMap;
/**
* 应用办件资料dao接口
*/
@MyBatisDao
public interface RobotApplyMaterialDao extends CrudDao<RobotApplyMaterial> {
/**
* 根据fileId查询资料信息
* @param fileId 文件fileId
* @return
*/
HashMap<String, Object> getByFileId(String fileId);
}
\ No newline at end of file
package com.lilosoft.business.jdbc.dao;
import com.lilosoft.business.jdbc.bean.RobotCaseMaterial;
import com.lilosoft.core.annotation.MyBatisDao;
import com.lilosoft.core.base.CrudDao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 机器人无人受理办件资料库管理DAO接口
* @author pengtangshu
* @version 2021-04-13
*/
@MyBatisDao
public interface RobotCaseMaterialDao extends CrudDao<RobotCaseMaterial> {
HashMap<String, Object> getByFileId(String fileId);
List<Map<String, Object>> getByBatchId(Map<String, Object> paramsMap);
Map<String, Object> getMapByBatchId(Map<String, Object> paramsMap);
List<Map<String, Object>> getFilesByBatchId(String batchId);
List<HashMap<String, Object>> getFileIdsByBatchId(String batchId);
void updateByFileID(Map<String,Object> params);
void updateFormJsonByBatchId(Map<String,Object> params);
Map<String,Object> getFormJson(Map<String, String> find);
Map<String, Object> getByParams(Map<String, String> find);
}
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lilosoft.business.jdbc.dao.RobotApplyMaterialDao">
<sql id="RobotApplyMaterialColumns">
a.id AS "id",
a.file_id AS "fileId",
a.file_name AS "fileName",
a.file_suffix AS "fileSuffix",
a.file_url AS "fileUrl",
a.type AS "type",
a.success AS "success",
a.error_msg AS "errorMsg",
a.json_data AS "jsonData",
a.use_flag AS "useFlag",
a.apply_type AS "applyType",
a.create_time AS "createTime"
</sql>
<select id="getById" resultType="HashMap">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
WHERE a.id = #{id}
</select>
<select id="getByFileId" resultType="HashMap">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
WHERE a.file_id = #{fileId} LIMIT 1
</select>
<select id="getBeanById" resultType="com.lilosoft.business.jdbc.bean.RobotApplyMaterial">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
WHERE a.id = #{id}
</select>
<select id="getByParams" resultType="HashMap">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
<where>
<if test="id != null and id != ''">
AND a.id=#{id}
</if>
<if test="fileId != null and fileId != ''">
AND a.file_id=#{fileId}
</if>
<if test="fileName != null and fileName != ''">
AND a.file_name=#{fileName}
</if>
<if test="fileSuffix != null and fileSuffix != ''">
AND a.file_suffix=#{fileSuffix}
</if>
<if test="fileUrl != null and fileUrl != ''">
AND a.file_url=#{fileUrl}
</if>
<if test="type != null and type != ''">
AND a.type=#{type}
</if>
<if test="success != null and success != ''">
AND a.success=#{success}
</if>
<if test="jsonData != null and jsonData != ''">
AND a.json_data=#{jsonData}
</if>
<if test="useFlag != null and useFlag != ''">
AND a.use_flag=#{useFlag}
</if>
<if test="applyType != null and applyType != ''">
AND a.apply_type=#{applyType}
</if>
<if test="createTime != null and createTime != ''">
AND a.create_time=#{createTime}
</if>
</where>
</select>
<select id="getBeanByParams" resultType="com.lilosoft.business.jdbc.bean.RobotApplyMaterial">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
<where>
<if test="id != null and id != ''">
AND a.id=#{id}
</if>
<if test="fileId != null and fileId != ''">
AND a.file_id=#{fileId}
</if>
<if test="fileName != null and fileName != ''">
AND a.file_name=#{fileName}
</if>
<if test="fileSuffix != null and fileSuffix != ''">
AND a.file_suffix=#{fileSuffix}
</if>
<if test="fileUrl != null and fileUrl != ''">
AND a.file_url=#{fileUrl}
</if>
<if test="type != null and type != ''">
AND a.type=#{type}
</if>
<if test="success != null and success != ''">
AND a.success=#{success}
</if>
<if test="jsonData != null and jsonData != ''">
AND a.json_data=#{jsonData}
</if>
<if test="useFlag != null and useFlag != ''">
AND a.use_flag=#{useFlag}
</if>
<if test="applyType != null and applyType != ''">
AND a.apply_type=#{applyType}
</if>
<if test="createTime != null and createTime != ''">
AND a.create_time=#{createTime}
</if>
</where>
</select>
<select id="findListMap" resultType="HashMap">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
<where>
<if test="id != null and id != ''">
AND a.id=#{id}
</if>
<if test="fileId != null and fileId != ''">
AND a.file_id=#{fileId}
</if>
<if test="fileName != null and fileName != ''">
AND a.file_name=#{fileName}
</if>
<if test="fileSuffix != null and fileSuffix != ''">
AND a.file_suffix=#{fileSuffix}
</if>
<if test="fileUrl != null and fileUrl != ''">
AND a.file_url=#{fileUrl}
</if>
<if test="type != null and type != ''">
AND a.type=#{type}
</if>
<if test="success != null and success != ''">
AND a.success=#{success}
</if>
<if test="jsonData != null and jsonData != ''">
AND a.json_data=#{jsonData}
</if>
<if test="useFlag != null and useFlag != ''">
AND a.use_flag=#{useFlag}
</if>
<if test="createTime != null and createTime != ''">
AND a.create_time=#{createTime}
</if>
<if test="applyType != null and applyType != ''">
AND a.apply_type=#{applyType}
</if>
</where>
</select>
<select id="findList" resultType="com.lilosoft.business.jdbc.bean.RobotApplyMaterial">
SELECT
<include refid="RobotApplyMaterialColumns"/>
FROM robot_apply_material a
<where>
<if test="id != null and id != ''">
AND a.id=#{id}
</if>
<if test="fileId != null and fileId != ''">
AND a.file_id=#{fileId}
</if>
<if test="fileName != null and fileName != ''">
AND a.file_name=#{fileName}
</if>
<if test="fileSuffix != null and fileSuffix != ''">
AND a.file_suffix=#{fileSuffix}
</if>
<if test="fileUrl != null and fileUrl != ''">
AND a.file_url=#{fileUrl}
</if>
<if test="type != null and type != ''">
AND a.type=#{type}
</if>
<if test="success != null and success != ''">
AND a.success=#{success}
</if>
<if test="jsonData != null and jsonData != ''">
AND a.json_data=#{jsonData}
</if>
<if test="useFlag != null and useFlag != ''">
AND a.use_flag=#{useFlag}
</if>
<if test="applyType != null and applyType != ''">
AND a.apply_type=#{applyType}
</if>
<if test="createTime != null and createTime != ''">
AND a.create_time=#{createTime}
</if>
</where>
</select>
<insert id="insert">
INSERT INTO robot_apply_material(
<trim suffixOverrides=",">
<if test="id != null">id,</if>
<if test="fileId != null">file_id,</if>
<if test="fileName != null">file_name,</if>
<if test="fileSuffix != null">file_suffix,</if>
<if test="fileUrl != null">file_url,</if>
<if test="type != null">type,</if>
<if test="success != null">success,</if>
<if test="errorMsg != null">error_msg,</if>
<if test="jsonData != null">json_data,</if>
<if test="useFlag != null">use_flag,</if>
<if test="applyType != null">apply_type,</if>
<if test="createTime != null">create_time,</if>
</trim>
) VALUES (
<trim suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="fileId != null">#{fileId},</if>
<if test="fileName != null">#{fileName},</if>
<if test="fileSuffix != null">#{fileSuffix},</if>
<if test="fileUrl != null">#{fileUrl},</if>
<if test="type != null">#{type},</if>
<if test="success != null">#{success},</if>
<if test="errorMsg != null">#{errorMsg},</if>
<if test="jsonData != null">#{jsonData},</if>
<if test="useFlag != null">#{useFlag},</if>
<if test="applyType != null">#{applyType},</if>
<if test="createTime != null">#{createTime},</if>
</trim>
)
</insert>
<update id="update">
UPDATE robot_apply_material
<trim prefix="SET" suffixOverrides=",">
<if test="fileName != null">
file_name = #{fileName},
</if>
<if test="fileSuffix != null">
file_suffix = #{fileSuffix},
</if>
<if test="fileUrl != null">
file_url = #{fileUrl},
</if>
<if test="type != null">
type = #{type},
</if>
<if test="success != null">
success = #{success},
</if>
<if test="errorMsg != null">
error_msg = #{errorMsg},
</if>
<if test="jsonData != null">
json_data = #{jsonData},
</if>
<if test="useFlag != null">
use_flag = #{useFlag},
</if>
<if test="applyType != null">
apply_type = #{applyType},
</if>
<if test="createTime != null">
create_time = #{createTime},
</if>
</trim>
WHERE id = #{id}
</update>
<delete id="delete" parameterType="string">
delete FROM robot_apply_material WHERE id=#{id}
</delete>
</mapper>
\ No newline at end of file
package com.lilosoft.business.jdbc.service;
import com.lilosoft.business.jdbc.bean.RobotApplyMaterial;
import com.lilosoft.business.jdbc.dao.RobotApplyMaterialDao;
import com.lilosoft.business.rocr.api.RobotApplyMaterialApi;
import com.lilosoft.business.rocr.api.RobotCaseApi;
import com.lilosoft.business.rocr.service.apply.OcrCallService;
import com.lilosoft.business.rocr.threads.ThreadPoolManager;
import com.lilosoft.business.rocr.threads.ThreadTaskFactory;
import com.lilosoft.core.base.CrudService;
import com.lilosoft.core.result.JsonResult;
import com.lilosoft.core.utils.commons.UUIDUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Base64;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 应用办件资料Service
*/
@Service
@SuppressWarnings("all")
@Transactional(readOnly = false,propagation = Propagation.NOT_SUPPORTED)
public class RobotApplyMaterialServiceImpl extends CrudService<RobotApplyMaterialDao, RobotApplyMaterial> implements RobotApplyMaterialService {
@Value("${aicase.isFastdfs}")
private String isFastdfs;
@Value("${aicase.fastdfs_img_url}")
private String fastdfsImgUrl;
@Value("${aicase.tempFilePath}")
private String tempFilePath;
@Value("${aicase.serverUrl}")
private String serverUrl;
@Value("${aicase.isApiData}")
private String isApiData;
@Autowired
private OcrCallService ocrCallService;
@Autowired
private RobotCaseApi robotCaseApi;
@Autowired
private RobotApplyMaterialApi robotApplyMaterialApi;
/**
* 获取ocr识别信息
* @param paramsMap
* @return
* @throws Exception
*/
public RobotApplyMaterial uploadFile(HashMap<String, Object> paramsMap) throws Exception {
RobotApplyMaterial apply= addFile(paramsMap);
Map<String,Object> resultOcr = ocrCallService.getOcrData(paramsMap);
apply.setFileName(resultOcr.get(apply.getFileId())!=null ? resultOcr.get(apply.getFileId()).toString():"");
apply.setType(resultOcr.get("type")!=null?resultOcr.get("type").toString():"");
apply.setJsonData(resultOcr.get("idcardJson")!=null?resultOcr.get("idcardJson").toString():"");
return apply;
}
/**
* 资料文件上传,保存资料信息
* @param paramsMap
* @return
* @throws Exception
*/
public RobotApplyMaterial addFile(HashMap<String, Object> paramsMap) throws Exception {
RobotApplyMaterial material = new RobotApplyMaterial();
String base64 = paramsMap.get("base64").toString(); //文件base64数据
String fileName = paramsMap.get("fileName").toString(); //文件名称
String extName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
boolean flag = false;
if ("1".equals(isFastdfs)) {//为1表示存储路径为fastdfs;不为1表示存储路径为本地
Map<String,String> map = new HashMap<>();
map.put("base64",base64);
map.put("extName",extName);
JsonResult jsonResult = robotCaseApi.uploadFile(map);
String urlToFastdfs = jsonResult.getMsg();
material.setFileUrl(urlToFastdfs);
material.setFileName(fileName);
flag = true;
} else {
//本地存储根路径
byte[] bytes = Base64.getMimeDecoder().decode(base64);
//获取当前日期年月
String yyyymm = DateFormatUtils.format(new Date(), "yyyyMM");
//获取当前日期年月日
String yyyymmdd = DateFormatUtils.format(new Date(), "yyyyMMdd");
String parentPath = "temp/" + yyyymm + "/" + yyyymmdd + "/";
String localFileName = System.currentTimeMillis() + extName;
File file = new File(tempFilePath, parentPath + localFileName);
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
if (!file.exists()) {
file.createNewFile();
}
try (FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream bos = new BufferedOutputStream(fos)) {
bos.write(bytes);
material.setFileUrl(parentPath + localFileName);
material.setFileName(fileName);
flag = true;
} catch (Exception e) {
logger.error("办件资料上传失败,服务器异常!", e);
throw new Exception("办件资料上传失败,服务器异常!");
}
}
if (flag) {
material.setUseFlag("0");
material.setSuccess("0");
material.setFileSuffix(extName);
material.setCreateTime(new Date());
material.setId(UUIDUtils.createUUId());
material.setFileId(paramsMap.get("fileId").toString());
material.setApplyType(paramsMap.get("applyType").toString());
if ("1".equals(isApiData)){
robotApplyMaterialApi.save(material);
}else{
dao.insert(material);//保资料信息存数据库
}
//为1表示存储路径为fastdfs;不为1表示存储路径为本地
if ("1".equals(isFastdfs)) {
material.setFileUrl(fastdfsImgUrl + material.getFileUrl());
} else {
material.setFileUrl(serverUrl + "lilo/aiCase/view?fileUrl=" + material.getFileUrl());
}
}
return material;
}
/**
* 资料文件删除
* @param paramsMap
* @throws Exception
*/
public void deleteFile(HashMap<String,Object> paramsMap) throws Exception{
HashMap<String, Object> map =getByFileId(paramsMap.get("fileId").toString());
if(map != null){
if ("1".equals(isApiData)){
robotApplyMaterialApi.delete(map.get("id").toString());
}else{
dao.delete(map.get("id").toString());
}
//异步删除已上传的文件
if(StringUtils.isNotEmpty(map.get("fileUrl").toString())){
if (isFastdfs.equals("1")){
ThreadPoolManager.getInstance().execute(ThreadTaskFactory.deleteFile(robotCaseApi, map.get("fileUrl").toString()));
}else {
ThreadPoolManager.getInstance().execute(ThreadTaskFactory.deleteLocalFile(tempFilePath+map.get("fileUrl").toString()));
}
}
}
}
/**
* 根据fileId查询资料信息
* @param fileId 文件fileId
* @return
*/
public HashMap<String, Object> getByFileId(String fileId){
HashMap<String,Object> result=new HashMap<>();
if ("1".equals(isApiData)){
JsonResult jsonResult = robotApplyMaterialApi.getByFileId(fileId);
result = (HashMap<String, Object>) jsonResult.getObj();
}else{
result = dao.getByFileId(fileId);
}
return result;
}
}
\ No newline at end of file
package com.lilosoft.business.rocr.bean;
public class ArtificialType {
/**
* 普通订正(发送mq)
*/
public final static String putongdingzheng = "0";
/**
* 材料中有部分材料不通过的情况下该事项需要远程核验(发送mq)
*/
public final static String yuanchengheyanBTG = "1";
/**
* 全部材料通过情况下该事项需要远程核验(发送mq)
*/
public final static String yuanchengheyanTG = "2";
/**
* 类型:普通订正(判断事项是否需要普通订正) 0:普通订正
*/
public final static String putongdingzhengType = "0";
/**
* 类型:远程核验(判断事项是否需要远程核验) 1:远程核验
*/
public final static String yuanchengheyanType = "1";
}
package com.lilosoft.business.rocr.checkData;
import java.util.List;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
/**
*
* @author sq
*
*/
@Data
public class CheckData {
/**
* code
*/
private String code;
/**
* 图像名称
*/
private String name;
/**
* 01:申请表,02:文书,03身份证复印件(正反面),04:平面图,05:地图,06:营业执照;
*/
private String type;
/**
* 图像页数
*/
private Integer pageNum;
/**
* 图像识别出的印章
*/
private List<Seal> Seals;
/**
* 图像识别出的字段
*/
private List<Property> properties;
/**
* 图像资料识别文件id
*/
private String fileId;
public Property getPropertyByCode(String code) {
if (code == null || code.equals("")) {
return null;
}
for (Property property : this.properties) {
if (code.equals(property.getCode())) {
return property;
}
}
return null;
}
/**
* 根据属性code获取属性值
*
* @param code
* @return
*/
public String getPropertyStringValueByCode(String code) {
if (code == null || code.equals("")) {
return null;
}
try {
for (Property property : this.properties) {
if (code.equals(property.getCode())) {
String a = (String) property.getValue();
a = a.replaceAll("\\s*", ""); //去除所有空格字符
return a;
}
}
} catch (Exception e) {
return null;
}
return null;
}
/**
* 根据属性code获取属性值
*
* @param code
* @return
*/
public Integer getPropertyIntValueByCode(String code) {
if (code == null || code.equals("")) {
return null;
}
try {
for (Property property : this.properties) {
if (code.equals(property.getCode())) {
return Integer.valueOf((int) property.getValue());
}
}
} catch (Exception e) {
return null;
}
return null;
}
/**
* 根据属性code获取属性值
*
* @param code
* @return
*/
public JSONArray getPropertyJSONArrayValueByCode(String code) {
if (code == null || code.equals("")) {
return null;
}
try {
for (Property property : this.properties) {
if (code.equals(property.getCode())) {
return (JSONArray) property.getValue();
}
}
} catch (Exception e) {
return null;
}
return null;
}
/**
* 根据属性code获取属性值
*
* @param code
* @return
*/
public JSONObject getPropertyJSONObjectValueByCode(String code) {
if (code == null || code.equals("")) {
return null;
}
try {
for (Property property : this.properties) {
if (code.equals(property.getCode())) {
return (JSONObject) property.getValue();
}
}
} catch (Exception e) {
return null;
}
return null;
}
/**
* 获取公章
* @return
*/
public Seal getOfficialSeal() {
return null;
}
/**
* 获取签字章
* @return
*/
public Seal getSignatureSeal() {
return null;
}
}
package com.lilosoft.business.rocr.checkData;
import java.util.List;
import lombok.Data;
/**
*
* @author sq
*
*/
@Data
public class Property {
/**
* 字段编码
*/
private String code;
/**
* 字段名称
*/
private String name;
/**
* 字段类型
*/
private String type;
/**
* 字段值
*/
private Object value;
}
\ No newline at end of file
package com.lilosoft.business.rocr.checkData;
import java.util.Date;
import lombok.Data;
/**
*
* @author sq
*图像识别返回公章识别信息实体类
*/
@Data
public class Seal {
/**
* 公章类型 1单位公章2签字方章
*/
private Integer type;
/**
* 公章内容
*/
private String content;
/**
* 公章位置是否正确 1正确0不正确
*
*
*/
private Integer positionCorrect;
/**
* 备注
*/
private String remark;
/**
* 签字日期
*
*/
private Date signDate;
/**
* 签字人姓名
*/
private String name;
}
package com.lilosoft.business.rocr.service.project.example;
import com.lilosoft.business.rocr.bean.RobotCase;
import com.lilosoft.business.rule.service.PublicService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 危险经营许可变更 -- 样例 (规则引擎)
*/
@Service
public class WXJYXKBGSYService extends PublicService {
/**
* 日志对象
*/
public Logger logger = LoggerFactory.getLogger(getClass());
public void accept(String fileData, RobotCase rc){
Map<String, Object> accept = super.acceptData(fileData, rc);
super.genCaseResult(accept);
super.saveCaseMaterialMark(accept);
//super.apply(accept,rc);
}
}
\ No newline at end of file
package com.lilosoft.business.rocr.service.project.example.web;
import com.lilosoft.business.rocr.bean.RobotCase;
import com.lilosoft.business.rule.service.PublicNewService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* 危险经营许可变更 (样例2.0)
*/
@Service
public class WXJYXKBGSYNewService extends PublicNewService {
/**
* 日志对象
*/
public Logger logger = LoggerFactory.getLogger(getClass());
public void accept(String fileData, RobotCase rc) throws Exception {
Map<String, Object> accept = super.acceptData(fileData, rc);
rc.setArtificialType("0");//是否远程核验
super.genCaseResult(accept, rc);
super.saveCaseMaterialMark(accept);
//super.apply(accept,rc);
}
public void preprocessResult(Map<String,Object> dests,Map<String,Object> result){
super.handelProcessResult(dests, result);
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
package com.lilosoft.core.aspect;
import com.lilosoft.core.annotation.AuthIgnore;
import com.lilosoft.core.bean.SysSession;
import com.lilosoft.core.exception.AuthorizeException;
import com.lilosoft.core.utils.ServletUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
/**
* 身份验证切面
* @author qiusheng
*/
@Aspect
@Component
public class LoginAspect {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Pointcut("execution(* com.lilosoft.business.*.controller.SysLoginController.*(..))")
public void cutMethod() {}
/**
* 控制层方法执行后(环绕切面:带返回值的切面)
* @param pjp
* @throws Exception
*/
@Around("cutMethod()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
Object target = pjp.getTarget();
// 获取拦截的方法名
Signature sig = pjp.getSignature();
MethodSignature msig = null;
if (!(sig instanceof MethodSignature)) {
throw new IllegalArgumentException("该注解只能用于方法");
}
msig = (MethodSignature) sig;
Method currentMethod = target.getClass().getMethod(msig.getName(), msig.getParameterTypes());
AuthIgnore authIgnore = currentMethod.getAnnotation(AuthIgnore.class);
if(authIgnore == null) {
HttpServletRequest request = ServletUtils.getRequest();
HttpServletResponse response = ServletUtils.getResponse();
// 如果当前用户未登录
SysSession sysSession = (SysSession)request.getSession().getAttribute(SysSession.key);
if (sysSession==null) {
if (ServletUtils.isAjaxRequest(request)) {
throw new AuthorizeException("你还未登录或登录超时,请先登录系统!",401);
}else {
throw new AuthorizeException("你还未登录或登录超时,请先登录系统!");
}
}
}
return pjp.proceed();
}
@AfterThrowing(pointcut="cutMethod() && target(obj)",throwing="exception",argNames="obj,exception")
public void AfterThrowingAspect(Object obj,RuntimeException exception){
logger.info(obj.getClass().getName(),exception);
}
}
\ 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.
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