Commit 8d21094c authored by “yiyousong”'s avatar “yiyousong”
parents 429d1d62 ad402e34
......@@ -81,7 +81,6 @@
<a-button
type="link"
class="primary pointer"
:disabled="record.used ? true : false"
@click="handleUse(record.id)"
>使用</a-button
>
......
This diff is collapsed.
This diff is collapsed.
......@@ -85,6 +85,7 @@
<id>qiling</id>
<properties>
<profiles.active>qiling</profiles.active>
<profiles.server.debug>-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5513</profiles.server.debug>
<profiles.nacos.server-addr>127.0.0.1:8848</profiles.nacos.server-addr>
</properties>
</profile>
......@@ -241,6 +242,25 @@
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.1.193</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<!-- Spring Boot Data Elasticsearch依赖 -->
<!--
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.7.18</version>
</dependency>
-->
</dependencies>
......
......@@ -62,7 +62,6 @@ exec "$JAVACMD" $JAVA_OPTS \
-Dapp.port="$PORT" \
-Dbasedir="$BASEDIR" \
-Dfile.encoding=utf-8 \
-Djava.io.tmpdir=$TEMP_PATH \
-jar $MAIN_CLASS \
> /dev/null &
......
package com.mortals.xhx.base.framework.aspect;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import com.mortals.framework.model.OperateLogPdu;
import com.mortals.framework.service.ILogService;
import com.mortals.framework.service.impl.FileLogServiceImpl;
import com.mortals.xhx.base.system.oper.service.OperLogService;
import com.mortals.xhx.system.MessageProducer;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.checkerframework.checker.units.qual.A;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.mortals.framework.service.ILogService;
import com.mortals.framework.service.impl.FileLogServiceImpl;
import com.mortals.xhx.base.system.oper.service.OperLogService;
import java.util.Date;
/**
* 操作日志记录
......
package com.mortals.xhx.base.framework.config;
import com.alibaba.fastjson.parser.ParserConfig;
import com.mortals.framework.thirty.dm.DmTransInterceptor;
import com.mortals.xhx.module.site.model.SiteTreeSelect;
import org.mybatis.spring.boot.autoconfigure.ConfigurationCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
......@@ -18,6 +20,8 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Bean
public CorsFilter corsFilter(){
ParserConfig.getGlobalInstance().putDeserializer(SiteTreeSelect.class, new SiteTreeSelect.Deserializer());
......
//package com.mortals.xhx.base.framework.config;
//
//import org.apache.http.HttpHost;
//import org.elasticsearch.client.RestClient;
//import org.elasticsearch.client.RestHighLevelClient;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.data.elasticsearch.client.ClientConfiguration;
//import org.springframework.data.elasticsearch.client.RestClients;
//import org.springframework.data.elasticsearch.config.AbstractElasticsearchConfiguration;
//import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
//
//@Configuration
//public class ElasticsearchConfig extends AbstractElasticsearchConfiguration {
//
//
// @Value("${elasticSearch.url}")
// private String esUrl;
//
// /**
// * @return
// */
// @Override
// //localhost:9200 写在配置文件中就可以了
// public RestHighLevelClient elasticsearchClient() {
//
// final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
// .connectedTo(esUrl) //localhost:9200
// .build();
//
// return RestClients.create(clientConfiguration).rest();
//
// }
//
//
//}
......@@ -64,6 +64,9 @@ public class AuthUserInterceptor extends BaseInterceptor {
String referer = request.getHeader("Referer");
RedisTemplate<String, String> redisTemplate = cacheService.selectDbRedisTemplate(portalDb);
String trustedReferer =redisTemplate.opsForValue().get(RedisKey.KEY_REFERERS_CACHE);
if (!ObjectUtils.isEmpty(referer)) {
//校验host即可
URI host = URLUtil.getHost(new URL(referer));
......
......@@ -8,6 +8,7 @@
package com.mortals.xhx.base.system.oper.service.impl;
import cn.hutool.extra.servlet.ServletUtil;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.ap.GlobalSysInfo;
import com.mortals.framework.ap.SysConstains;
......@@ -68,7 +69,8 @@ public class OperLogServiceImpl extends AbstractCRUDServiceImpl<OperLogDao,OperL
@Override
public void insertOperLog(HttpServletRequest request, IUser user, BaseEntity oldEntity, BaseEntity newEntity, OperTypeEnum operType, String content, String id) {
OperLogEntity operLogEntity = new OperLogEntity();
operLogEntity.setIp(HttpUtil.getRequestIP(request));
//operLogEntity.setIp(HttpUtil.getRequestIP(request));
operLogEntity.setIp( ServletUtil.getClientIP(request));
operLogEntity.setLogDate(new Date());
operLogEntity.setPlatformMark(GlobalSysInfo.getPropertyValue(SysConstains.PROP_PLATFORM_MARK));
......
......@@ -393,6 +393,7 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE
}
});
log.info("用户更新站点树!");
siteService.updateAllSiteTree(null);
......@@ -479,8 +480,8 @@ public class UserServiceImpl extends AbstractCRUDCacheServiceImpl<UserDao, UserE
//eba467f81fb265befdf1f6ab041d39ab 原始admin密码
System.out.println(SecurityUtil.md5DoubleEncoding(" 123456 "));
System.out.println(SecurityUtil.md5DoubleEncoding("123"));
System.out.println(SecurityUtil.md5DoubleEncoding("wasd111623227!!@"));
System.out.println(SecurityUtil.md5DoubleEncoding("p@ssw0rd"));
// System.out.println(SecurityUtil.md5DoubleEncoding("Qt123456@"));
/*
......
//package com.mortals.xhx.busiz;
//import com.nowcoder.community.entity.DiscussPost;
//import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
//import org.springframework.stereotype.Repository;
//
///*
//ElasticsearchRepository<DiscussPost, Integer>
//DiscussPost:接口要处理的实体类
//Integer:实体类中的主键是什么类型
//ElasticsearchRepository:父接口,其中已经事先定义好了对es服务器访问的增删改查各种方法。Spring会给它自动做一个实现,我们直接去调就可以了。
// */
//@Repository
//public interface DiscussPostRepository extends ElasticsearchRepository<DiscussPost, Integer> {
//
//}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
/**
* @author karlhoo
*/
@Data
public class ApiDoworkResp<T> {
/**
* 结果编码
*/
private int res;
/**
* 结果描述
*/
private String messages;
/**
* 响应数据
*/
private T rows;
}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
/**
* @author karlhoo
*/
@Data
public class ApiZwfwResp<T> {
/**
* 结果编码
*/
private int code;
/**
* 结果描述
*/
private String msg;
protected Boolean success;
/**
* 响应数据
*/
private T data;
}
......@@ -352,7 +352,9 @@ public class DemoWebApiController {
List<MatterEntity> matterList = matterService.getDao().getMatterListByAreaCode(new MatterQuery().areaCode(siteQuery.getAreaCode()).source(SourceEnum.政务网.getValue()));
List<SiteMatterEntity> targetSiteMatterEntities = new ArrayList<>();
for (MatterEntity matterEntity : matterList) {
DeptEntity deptEntity = deptService.getExtCache(matterEntity.getDeptCode());
DeptEntity deptEntity =deptService.selectOne(new DeptQuery().deptNumber(matterEntity.getDeptCode()));
//DeptEntity deptEntity = deptService.getExtCache(matterEntity.getDeptCode());
SiteMatterEntity siteMatterEntity = new SiteMatterEntity();
siteMatterEntity.initAttrValue();
//SiteEntity siteEntity = siteService.get(siteId);
......
//package com.mortals.xhx.busiz.web;
//
//import com.alibaba.fastjson.JSONObject;
//import lombok.extern.slf4j.Slf4j;
//import org.elasticsearch.action.search.SearchRequest;
//import org.elasticsearch.action.search.SearchResponse;
//import org.elasticsearch.client.RequestOptions;
//import org.elasticsearch.client.RestHighLevelClient;
//
//import org.elasticsearch.index.query.QueryBuilders;
//import org.elasticsearch.search.SearchHit;
//import org.elasticsearch.search.builder.SearchSourceBuilder;
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
//import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
//import org.elasticsearch.search.sort.SortBuilders;
//import org.elasticsearch.search.sort.SortOrder;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.io.IOException;
//import java.util.LinkedList;
//
//@RestController
//@RequestMapping("elTest")
//@Slf4j
//public class ElasticsearchTestsController {
//
// @Qualifier("client")
// @Autowired
// private RestHighLevelClient restHighLevelClient;
//
// //判断某id的文档(数据库中的行)是否存在
// public void testExist(){
//
// }
//
// //一次保存一条数据
// public void testInsert() {
// //把id为241的DiscussPost的对象保存到discusspost索引(es的索引相当于数据库的表)
// }
//
//
// //不带高亮的查询
// public void noHighlightQuery() throws IOException {
// SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名
//
// //构建搜索条件
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
// //在discusspost索引的title和content字段中都查询“互联网寒冬”
// .query(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
// // matchQuery是模糊查询,会对key进行分词:searchSourceBuilder.query(QueryBuilders.matchQuery(key,value));
// // termQuery是精准查询:searchSourceBuilder.query(QueryBuilders.termQuery(key,value));
// .sort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
// .sort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
// .sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
// //一个可选项,用于控制允许搜索的时间:searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
// .from(0)// 指定从哪条开始查询
// .size(10);// 需要查出的总记录条数
//
// searchRequest.source(searchSourceBuilder);
// SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//
// System.out.println(JSONObject.toJSON(searchResponse));
//
///* List<DiscussPost> list = new LinkedList<>();
// for (SearchHit hit : searchResponse.getHits().getHits()) {
// DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);
// System.out.println(discussPost);
// list.add(discussPost);
// }*/
// }
//
//
// //带高亮的查询
// public void highlightQuery() throws Exception{
// SearchRequest searchRequest = new SearchRequest("discusspost");//discusspost是索引名,就是表名
//
// //高亮
// HighlightBuilder highlightBuilder = new HighlightBuilder();
// highlightBuilder.field("title");
// highlightBuilder.field("content");
// highlightBuilder.requireFieldMatch(false);
// highlightBuilder.preTags("<span style='color:red'>");
// highlightBuilder.postTags("</span>");
//
// //构建搜索条件
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder()
// .query(QueryBuilders.multiMatchQuery("互联网寒冬", "title", "content"))
// .sort(SortBuilders.fieldSort("type").order(SortOrder.DESC))
// .sort(SortBuilders.fieldSort("score").order(SortOrder.DESC))
// .sort(SortBuilders.fieldSort("createTime").order(SortOrder.DESC))
// .from(0)// 指定从哪条开始查询
// .size(10)// 需要查出的总记录条数
// .highlighter(highlightBuilder);//高亮
//
// searchRequest.source(searchSourceBuilder);
// SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
///*
// List<DiscussPost> list = new LinkedList<>();
// for (SearchHit hit : searchResponse.getHits().getHits()) {
// DiscussPost discussPost = JSONObject.parseObject(hit.getSourceAsString(), DiscussPost.class);
//
// // 处理高亮显示的结果
// HighlightField titleField = hit.getHighlightFields().get("title");
// if (titleField != null) {
// discussPost.setTitle(titleField.getFragments()[0].toString());
// }
// HighlightField contentField = hit.getHighlightFields().get("content");
// if (contentField != null) {
// discussPost.setContent(contentField.getFragments()[0].toString());
// }
// System.out.println(discussPost);
// list.add(discussPost);
// }*/
// }
//
//
//}
......@@ -137,4 +137,8 @@ public final class Constant {
public final static String USER_SITE_TREE = "user:site:tree";
public final static String QR_CODE = "https://tftb.sczwfw.gov.cn:8085/jmopenpub/jmopen_files/unzip/708da07c16d8405bbaaa542d2c64e8f9/dzqyfwsxwbzqyvpty/html/matterDetails.html?";
}
......@@ -10,6 +10,7 @@ import com.mortals.framework.util.DataUtil;
import com.mortals.xhx.common.code.SourceEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.module.dept.model.DeptEntity;
import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.matter.model.MatterEntity;
import com.mortals.xhx.utils.SpringUtils;
......@@ -201,7 +202,8 @@ public class MatterHtmlParseUtil {
//todo 如果部门编码与初始编码不一致,切不在部门列表中,添加默认部门
String sourceDeptCode = params.getOrDefault("deptCode", "");
DeptService deptService = SpringUtils.getBean(DeptService.class);
DeptEntity cache = deptService.getCache(deptCode);
// DeptEntity cache = deptService.getCache(deptCode);
DeptEntity cache =deptService.selectOne(new DeptQuery().deptNumber(deptCode));
if(ObjectUtils.isEmpty(cache)){
//抓取事项的部门编码未找到 用初始的部门编码
deptCode=sourceDeptCode;
......@@ -367,6 +369,32 @@ public class MatterHtmlParseUtil {
System.out.println(JSON.toJSONString(rest1));
*/
//创建 sign https://tftb.sczwfw.gov.cn:8085/api/jmas-api-gateway-server/createsign.do
//参数
//app_id gysqfyjqyyapp
//interface_id tjtyjk
//version 1.0
//header {}
//biz_content {"code":"511722000000"}
//charset UTF-8
//timestamp 1749537093014
//origin 1
//统计接口1 https://tftb.sczwfw.gov.cn:8085/api/jmas-api-gateway-server/gateway.do
//app_id gysqfyjqyyapp
//interface_id tjtyjk
//version 1.0
//header {}
//biz_content {"code":"511722000000"}
//charset UTF-8
//timestamp 1749537093014
//origin 1
//sign v8ehGvo/ZG47wZQU3Trp/bWfUCIdHwVH1JqSU9rx1A2NYUZNMicXDyuMbguxMUXaYpy69zpJuYtrPCzuw0CWHZnfpT3bx0iygtDfqaQrZtemCVnGaLWXLYOxr9cZMC1FFbSXkJuqbaLej+k/tonBj1my7MPpEeYLHN9mx5rbQM4=
//办结进度 https://zxbl.sczwfw.gov.cn/app/affairPublicity/getMainData/v3
}
......
package com.mortals.xhx.common.utils;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters;
import java.security.NoSuchAlgorithmException;
/**
* 安全服务工具类
*
* @author zxfei
*/
@Slf4j
public class SecurityUtils {
private static Cipher SM4Cipher = null;
private static Cipher SM4DecryptCipher;
static {
try {
SM4DecryptCipher = Cipher.getInstance("SM4/ECB/PKCS7Padding", new BouncyCastleProvider());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
} catch (NoSuchPaddingException e) {
throw new RuntimeException(e);
}
}
private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
public static BouncyCastleProvider geBouncyCastleProvider() {
return bouncyCastleProvider;
}
public synchronized static Cipher getSM4Cipher(String key) {
try {
if (SM4Cipher == null) {
//创建实例之前可能会有一些准备性的耗时工作
Thread.sleep(300);
synchronized (SecurityUtils.class) {
if (SM4Cipher == null) {//二次检查
SM4Cipher = Cipher.getInstance("SM4/ECB/PKCS7Padding", new BouncyCastleProvider());
}
}
}
} catch (Exception e) {
log.error("SM4Cipher init error", e);
}
return SM4Cipher;
}
public synchronized static Cipher getSM4DecryptCipher(String key) {
try {
if (SM4DecryptCipher == null) {
//创建实例之前可能会有一些准备性的耗时工作
Thread.sleep(300);
synchronized (SecurityUtils.class) {
if (SM4DecryptCipher == null) {//二次检查
//SM4DecryptCipher = Cipher.getInstance("SM4/ECB/PKCS7Padding", new BouncyCastleProvider());
SM4DecryptCipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "SM4"), (AlgorithmParameters) null);
}
}
}
SM4DecryptCipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "SM4"), (AlgorithmParameters) null);
} catch (Exception e) {
log.error("SM4Cipher init error", e);
}
return SM4DecryptCipher;
}
/**
* 获取Authentication
*/
//public static Authentication getAuthentication() {
// return SecurityContextHolder.getContext().getAuthentication();
// }
/**
* 生成BCryptPasswordEncoder密码
*
* @param password 密码
* @return 加密字符串
*/
public static String encryptPassword(String password) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.encode(password);
}
/**
* 判断密码是否相同
*
* @param rawPassword 真实密码
* @param encodedPassword 加密后字符
* @return 结果
*/
public static boolean matchesPassword(String rawPassword, String encodedPassword) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
return passwordEncoder.matches(rawPassword, encodedPassword);
}
/**
* 是否为管理员
*
* @param userId 用户ID
* @return 结果
*/
public static boolean isAdmin(Long userId) {
return userId != null && 1L == userId;
}
}
......@@ -33,6 +33,12 @@ public class SyncTreeSiteThread implements Runnable {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
}
SiteService siteService = SpringUtils.getBean(SiteService.class);
List<SiteTreeSelect> siteTreeSelects = siteService.siteTree(context);
......
......@@ -4,15 +4,19 @@ import com.mortals.framework.service.ICacheService;
import com.mortals.framework.springcloud.service.IApplicationStartedService;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.feign.user.IUserFeign;
import com.mortals.xhx.module.dowork.model.DoworkStatQuery;
import com.mortals.xhx.module.dowork.service.DoworkStatService;
import com.mortals.xhx.module.process.model.ProcessResultQuery;
import com.mortals.xhx.module.process.service.ProcessResultService;
import com.mortals.xhx.module.site.model.SiteEntity;
import com.mortals.xhx.module.site.model.SiteQuery;
import com.mortals.xhx.module.site.service.SiteService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import java.util.List;
import static com.mortals.xhx.common.key.Constant.USER_SITE_TREE;
@Component
......@@ -22,9 +26,13 @@ public class DemoStartedService implements IApplicationStartedService {
@Autowired
private ICacheService cacheService;
@Autowired
private SiteService siteService;
private ProcessResultService processResultService;
@Autowired
private DoworkStatService doworkStatService;
@Autowired
private UserService userService;
@Autowired
private SiteService siteService;
@Override
public void start() {
......@@ -32,9 +40,31 @@ public class DemoStartedService implements IApplicationStartedService {
log.info("开始服务..[初始化用户站点树]");
//删除redis 中的 站点树
cacheService.del(USER_SITE_TREE);
//从门户获取所有站点用户
userService.refreshUser();
try {
userService.refreshUser();
} catch (Exception e) {
log.error("获取所有站点用户失败", e);
}
try {
List<SiteEntity> siteEntities = siteService.find(new SiteQuery());
for (SiteEntity siteEntity : siteEntities) {
String areaCode = siteEntity.getAreaCode();
DoworkStatQuery doworkStatQuery = new DoworkStatQuery();
doworkStatQuery.setAreaCode(areaCode);
doworkStatService.queryListForWeb(doworkStatQuery);
doworkStatService.getForWeb(doworkStatQuery);
ProcessResultQuery processResultQuery = new ProcessResultQuery();
processResultQuery.setAreaCode(areaCode);
processResultService.queryListForWeb(processResultQuery);
}
} catch (Exception e) {
log.error("获取办件结果异常", e);
}
}
@Override
......
package com.mortals.xhx.face;
import com.arcsoft.face.*;
import com.arcsoft.face.toolkit.ImageInfo;
import com.google.common.collect.Lists;
import com.mortals.xhx.face.factory.FaceEnginePoolFactory;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.impl.AbandonedConfig;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;
@Slf4j
@Component
public class ArcsoftFaceUtil {
@Value(value = "${faceAppId}")
private String appId;
@Value(value = "${winSdkKey}")
private String winSdkKey;
@Value(value = "${linuxSdkkey}")
private String linuxSdkKey;
public Integer threadPoolSize=5;
private GenericObjectPool<FaceEngine> faceEngineGenericObjectPool;
public ArcsoftFaceUtil(){
String sdkLibPath = getClass().getResource(getOsName()).getPath();
String sdkKey = getSdkKey(sdkLibPath);
// 对象池工厂
FaceEnginePoolFactory personPoolFactory = new FaceEnginePoolFactory(appId,sdkKey,sdkLibPath);
// 对象池配置
GenericObjectPoolConfig<FaceEngine> objectPoolConfig = new GenericObjectPoolConfig<>();
objectPoolConfig.setMaxTotal(threadPoolSize);
AbandonedConfig abandonedConfig = new AbandonedConfig();
//在Maintenance的时候检查是否有泄漏
abandonedConfig.setRemoveAbandonedOnMaintenance(true);
//borrow 的时候检查泄漏
abandonedConfig.setRemoveAbandonedOnBorrow(true);
//如果一个对象borrow之后10秒还没有返还给pool,认为是泄漏的对象
abandonedConfig.setRemoveAbandonedTimeout(10);
// 对象池
faceEngineGenericObjectPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
faceEngineGenericObjectPool.setAbandonedConfig(abandonedConfig);
faceEngineGenericObjectPool.setTimeBetweenEvictionRunsMillis(5000); //5秒运行一次维护任务
log.info("引擎池开启成功");
}
private String getOsName() {
String os = System.getProperty("os.name");
String osName = os.toLowerCase().startsWith("win") ? "/face_lib/win64" : "/face_lib/linux";
return osName;
}
private String getSdkKey(String sdkLibPath) {
return sdkLibPath.equals("/face_lib/win64") ? winSdkKey : linuxSdkKey;
}
/**
* 人脸检测
*
* @param fileInputStream
* @return
*/
public List<FaceInfo> faceFind(InputStream fileInputStream) throws IOException {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
ImageInfo imageInfo = getRGBData(fileInputStream);
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
int errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
return faceInfoList;
} catch (Exception e) {
log.error("人脸检测出现了异常");
e.printStackTrace();
return new ArrayList<FaceInfo>();
} finally {
fileInputStream.close();
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸截取
*
* @param fileInputStream
* @param rect
* @return
*/
public String faceCrop(InputStream fileInputStream, Rect rect) {
try {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
BufferedImage bufImage = ImageIO.read(fileInputStream);
int height = bufImage.getHeight();
int width = bufImage.getWidth();
int top = rect.getTop();
int bottom = rect.getBottom();
int left = rect.getLeft();
int right = rect.getRight();
//System.out.println(top + "-" + bottom + "-" + left + "-" + right);
try {
BufferedImage subimage = bufImage.getSubimage(left, top, right - left, bottom - left);
ImageIO.write(subimage, "png", stream);
String base64 = Base64.encode(stream.toByteArray());
return base64;
}catch (Exception e){
return null;
}finally {
stream.close();
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
}
return null;
}
/**
* 人脸特征值提取
*/
public byte[] faceFeature(byte[] bytes) {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
ImageInfo imageInfo = getRGBData(bytes);
//人脸检测得到人脸列表
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);
FaceFeature faceFeature = new FaceFeature();
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);
byte[] featureData = faceFeature.getFeatureData();
return featureData;
} catch (Exception e) {
log.error("人脸特征值提取出现了异常");
e.printStackTrace();
return new byte[0];
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸对比
*/
public float faceCompared(byte [] source,byte [] des) throws IOException {
FaceEngine faceEngine = null;
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
FaceFeature targetFaceFeature = new FaceFeature();
targetFaceFeature.setFeatureData(source);
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(des);
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
return score;
} catch (Exception e) {
log.error("人脸对比出现了异常");
e.printStackTrace();
return 0;
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
}
/**
* 人脸搜索
*/
public List<SysFaceEntity> faceSearch(FaceFeature targetFaceFeature,List<SysFaceEntity> sourceList) throws IOException {
FaceEngine faceEngine = null;
List<SysFaceEntity> resultFaceInfoList = Lists.newLinkedList();//识别到的人脸列表
try {
faceEngine = faceEngineGenericObjectPool.borrowObject();
for(SysFaceEntity faceUserInfo : sourceList) {
FaceFeature sourceFaceFeature = new FaceFeature();
sourceFaceFeature.setFeatureData(faceUserInfo.getFaceFeature());
FaceSimilar faceSimilar = new FaceSimilar();
faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);
float score = faceSimilar.getScore();
if(score > 0.8){
faceUserInfo.setSimilarValue(plusHundred(score));
resultFaceInfoList.add(faceUserInfo);
}
}
} catch (Exception e) {
log.error("人脸对比出现了异常");
e.printStackTrace();
} finally {
// 回收对象到对象池
if (faceEngine != null) {
faceEngineGenericObjectPool.returnObject(faceEngine);
}
}
return resultFaceInfoList;
}
private int plusHundred(Float value) {
BigDecimal target = new BigDecimal(value);
BigDecimal hundred = new BigDecimal(100f);
return target.multiply(hundred).intValue();
}
}
package com.mortals.xhx.face.factory;
import com.arcsoft.face.ActiveFileInfo;
import com.arcsoft.face.EngineConfiguration;
import com.arcsoft.face.FaceEngine;
import com.arcsoft.face.FunctionConfiguration;
import com.arcsoft.face.enums.DetectMode;
import com.arcsoft.face.enums.DetectOrient;
import com.arcsoft.face.enums.ErrorInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
@Slf4j
public class FaceEnginePoolFactory extends BasePooledObjectFactory<FaceEngine> {
private String appId;
private String sdkKey;
private String sdkLibPath;
public FaceEnginePoolFactory(String appId, String sdkKey, String sdkLibPath) {
this.appId = appId;
this.sdkKey = sdkKey;
this.sdkLibPath = sdkLibPath;
//this.sdkLibPath = "D:\\face\\win64";
}
/**
* 在对象池中创建对象
* @return
* @throws Exception
*/
@Override
public FaceEngine create() throws Exception {
FaceEngine faceEngine = new FaceEngine(sdkLibPath);
//激活引擎
int errorCode = faceEngine.activeOnline(appId, sdkKey);
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
log.warn("引擎激活失败");
}
ActiveFileInfo activeFileInfo=new ActiveFileInfo();
errorCode = faceEngine.getActiveFileInfo(activeFileInfo);
if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {
log.warn("获取激活文件信息失败");
}
//引擎配置
EngineConfiguration engineConfiguration = new EngineConfiguration();
engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);
engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);
engineConfiguration.setDetectFaceMaxNum(10);
engineConfiguration.setDetectFaceScaleVal(16);
//功能配置
FunctionConfiguration functionConfiguration = new FunctionConfiguration();
functionConfiguration.setSupportAge(true);
functionConfiguration.setSupportFace3dAngle(true);
functionConfiguration.setSupportFaceDetect(true);
functionConfiguration.setSupportFaceRecognition(true);
functionConfiguration.setSupportGender(true);
functionConfiguration.setSupportLiveness(true);
functionConfiguration.setSupportIRLiveness(true);
engineConfiguration.setFunctionConfiguration(functionConfiguration);
//初始化引擎
errorCode = faceEngine.init(engineConfiguration);
if (errorCode != ErrorInfo.MOK.getValue()) {
log.error("初始化引擎失败");
}
return faceEngine;
}
/**
* 包装对象
* @param faceEngine
* @return
*/
@Override
public PooledObject<FaceEngine> wrap(FaceEngine faceEngine) {
return new DefaultPooledObject<>(faceEngine);
}
/**
* 销毁对象
* @param faceEngine 对象池
* @throws Exception 异常
*/
@Override
public void destroyObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.destroyObject(faceEngine);
}
/**
* 校验对象是否可用
* @param faceEngine 对象池
* @return 对象是否可用结果,boolean
*/
@Override
public boolean validateObject(PooledObject<FaceEngine> faceEngine) {
return super.validateObject(faceEngine);
}
/**
* 激活钝化的对象系列操作
* @param faceEngine 对象池
* @throws Exception 异常信息
*/
@Override
public void activateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.activateObject(faceEngine);
}
/**
* 钝化未使用的对象
* @param faceEngine 对象池
* @throws Exception 异常信息
*/
@Override
public void passivateObject(PooledObject<FaceEngine> faceEngine) throws Exception {
super.passivateObject(faceEngine);
}
}
......@@ -60,7 +60,7 @@ public class AppVersionServiceImpl extends AbstractCRUDServiceImpl<AppVersionDao
throw new AppException("部署文件不存在!");
}
if (!FileUtil.getSuffix(appVersionEntity.getFilePath()).equals("zip")) {
throw new AppException("部署只支持zip文件!");
throw new AppException("部署只支持zip文件!fileName:" + appVersionEntity.getFilePath());
}
//部署路径是否存在 如果不存在 创建目录,
//文件构成目录 基础path +站点编码+应用编码 /basepath/sitecode/appcode/v2/
......
......@@ -85,6 +85,7 @@ public class BusinessController extends BaseCRUDJsonBodyMappingController<Busine
* 查询业务扁平结构
*/
@PostMapping(value = "flatList")
@UnAuth
public String flatList(@RequestBody BusinessEntity query) {
JSONObject jsonObject = new JSONObject();
Map<String, Object> model = new HashMap<>();
......
......@@ -19,6 +19,8 @@ import com.mortals.xhx.module.dept.model.DeptEntity;
import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.model.vo.DeptVo;
import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.matter.model.MatterQuery;
import com.mortals.xhx.module.matter.service.MatterService;
import com.mortals.xhx.module.matters.model.MattersDeptEntity;
import com.mortals.xhx.module.matters.model.MattersDeptQuery;
import com.mortals.xhx.module.matters.service.MattersDeptService;
......@@ -64,11 +66,13 @@ public class DeptServiceImpl extends AbstractCRUDCacheServiceImpl<DeptDao, DeptE
private WindowMatterService windowMatterService;
@Autowired
private SiteMatterService siteMatterService;
@Autowired
private MatterService matterService;
@Override
protected String getExtKey(DeptEntity data) {
return data.getDeptNumber();
return data.getDeptNumber() + "_" + data.getSiteId();
}
/**
......@@ -79,8 +83,8 @@ public class DeptServiceImpl extends AbstractCRUDCacheServiceImpl<DeptDao, DeptE
@Override
protected void saveBefore(DeptEntity entity, Context context) throws AppException {
super.saveBefore(entity, context);
//新增校验部门编码是否重复
DeptEntity extCache = this.getExtCache(entity.getDeptNumber());
//新增校验部门编码与站点是否重复
DeptEntity extCache = this.getExtCache(entity.getDeptNumber() + "_" + entity.getSiteId());
if (!ObjectUtils.isEmpty(extCache)) {
throw new AppException("部门编码重复!deptCode:" + extCache.getDeptNumber());
}
......@@ -95,12 +99,30 @@ public class DeptServiceImpl extends AbstractCRUDCacheServiceImpl<DeptDao, DeptE
protected void updateBefore(DeptEntity entity, Context context) throws AppException {
super.updateBefore(entity, context);
DeptEntity beforeEntity = this.get(entity.getId(), context);
if (!beforeEntity.getDeptNumber().equals(entity.getDeptNumber())) {
DeptEntity extCache = this.getExtCache(entity.getDeptNumber());
if (!(beforeEntity.getDeptNumber() + "_" + beforeEntity.getSiteId()).equals(entity.getDeptNumber() + "_" + entity.getSiteId())) {
DeptEntity extCache = this.getExtCache(entity.getDeptNumber() + "_" + entity.getSiteId());
if (!ObjectUtils.isEmpty(extCache)) {
throw new AppException("部门编码重复!deptCode:" + extCache.getDeptNumber());
}
}
//todo 判断部门名称是否修改,如果一体化的部门 修改名称则同步修改对应事项的部门名称
if (!ObjectUtils.isEmpty(entity.getSiteId()) &&
!ObjectUtils.isEmpty(entity.getName()) &&
!ObjectUtils.isEmpty(beforeEntity) &&
!entity.getName().equals(beforeEntity.getName())) {
SiteEntity siteCache = siteService.getCache(entity.getSiteId().toString());
//matterService.
MatterQuery condition = new MatterQuery();
condition.setAreaCode(siteCache.getAreaCode());
condition.setDeptName(beforeEntity.getName());
MatterQuery updateQuery = new MatterQuery();
updateQuery.setDeptName(entity.getName());
matterService.getDao().update(updateQuery, condition);
}
}
@Override
......@@ -142,7 +164,7 @@ public class DeptServiceImpl extends AbstractCRUDCacheServiceImpl<DeptDao, DeptE
for (Map.Entry<String, String> item : data.entrySet()) {
String deptCode = item.getKey();
String deptName = item.getValue();
DeptEntity deptEntity = deptService.selectOne(new DeptQuery().deptNumber(deptCode));
DeptEntity deptEntity = deptService.selectOne(new DeptQuery().siteId(siteEntity.getId()).deptNumber(deptCode));
if (ObjectUtils.isEmpty(deptEntity)) {
deptEntity = new DeptEntity();
deptEntity.initAttrValue();
......
package com.mortals.xhx.module.identity.dao;
package com.mortals.xhx.module.dowork.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.identity.model.PeopleInfoEntity;
import com.mortals.xhx.module.dowork.model.DoworkStatEntity;
import java.util.List;
/**
* 用户信息Dao
* 用户信息 DAO接口
* 办件统计Dao
* 办件统计 DAO接口
*
* @author zxfei
* @date 2022-08-08
* @date 2025-06-10
*/
public interface PeopleInfoDao extends ICRUDDao<PeopleInfoEntity,Long>{
public interface DoworkStatDao extends ICRUDDao<DoworkStatEntity,Long>{
}
package com.mortals.xhx.module.identity.dao.ibatis;
package com.mortals.xhx.module.dowork.dao.ibatis;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.identity.dao.PeopleInfoDao;
import com.mortals.xhx.module.identity.model.PeopleInfoEntity;
import com.mortals.xhx.module.dowork.dao.DoworkStatDao;
import com.mortals.xhx.module.dowork.model.DoworkStatEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.List;
/**
* 用户信息DaoImpl DAO接口
* 办件统计DaoImpl DAO接口
*
* @author zxfei
* @date 2022-08-08
* @date 2025-06-10
*/
@Repository("peopleInfoDao")
public class PeopleInfoDaoImpl extends BaseCRUDDaoMybatis<PeopleInfoEntity,Long> implements PeopleInfoDao {
@Repository("doworkStatDao")
public class DoworkStatDaoImpl extends BaseCRUDDaoMybatis<DoworkStatEntity,Long> implements DoworkStatDao {
......
package com.mortals.xhx.module.dowork.model;
import lombok.Data;
@Data
public class DoworkInfo<T> {
private String ifResult;
private String msgId;
private T ifResultInfo;
}
package com.mortals.xhx.module.dowork.model;
import lombok.Data;
@Data
public class DoworkSign<T> {
private T sign;
}
package com.mortals.xhx.module.dowork.model;
import java.util.List;
import java.util.ArrayList;
import java.math.BigDecimal;
import cn.hutool.core.date.DateUtil;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.dowork.model.vo.DoworkStatVo;
import lombok.Data;
/**
* 办件统计实体对象
*
* @author zxfei
* @date 2025-06-10
*/
@Data
public class DoworkStatEntity extends DoworkStatVo {
private static final long serialVersionUID = 1L;
/**
* 站点id
*/
private Long siteId;
/**
* 站点名称
*/
private String siteName;
/**
* 区域编码
*/
private String areaCode;
/**
* 区域名称
*/
private String areaName;
/**
* 平均等待时间,单位s
*/
private Integer waitTime;
/**
* 事项数量
*/
private Integer matterNum;
/**
* 业务办结总量
*/
private Integer doworkNum;
/**
* 满意率
*/
private String satisfactionRate;
/**
* 年
*/
private Integer year;
/**
* 月
*/
private Integer month;
/**
* 日
*/
private Integer day;
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof DoworkStatEntity) {
DoworkStatEntity tmp = (DoworkStatEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public void initAttrValue(){
this.siteId = null;
this.siteName = "";
this.areaCode = "";
this.areaName = "";
this.waitTime = 0;
this.matterNum = 0;
this.doworkNum = 0;
this.satisfactionRate = "";
this.year = null;
this.month = null;
this.day = null;
}
}
\ No newline at end of file
package com.mortals.xhx.module.dowork.model;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.mortals.framework.common.Rest;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.busiz.rsp.ApiZwfwResp;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
public class DoworkStatInfo {
private String month;
private Integer apply;
private Integer review;
private Integer conclude;
private Integer accept;
private Integer matter;
private Integer activeReview;
private String activeReviewRate;
private String satisfiedRate;
public static void main(String[] args) {
String statInfo = "{\n" +
" \"success\": true,\n" +
" \"code\": 200,\n" +
" \"msg\": \"请求成功\",\n" +
" \"data\": \"{\\\"ifResult\\\":\\\"0\\\",\\\"ifResultInfo\\\":\\\"{\\\\\\\"code\\\\\\\":200,\\\\\\\"msg\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"data\\\\\\\":{\\\\\\\"matter\\\\\\\":17671,\\\\\\\"apply\\\\\\\":11079,\\\\\\\"accept\\\\\\\":10969,\\\\\\\"conclude\\\\\\\":10958,\\\\\\\"review\\\\\\\":7004,\\\\\\\"activeReview\\\\\\\":6995,\\\\\\\"activeReviewRate\\\\\\\":99.87,\\\\\\\"satisfiedRate\\\\\\\":100.0}}\\\",\\\"msgId\\\":\\\"\\\"}\"\n" +
"}";
// ApiResp
ApiZwfwResp<String> apiZwfwResp = JSON.parseObject(statInfo, new TypeReference<ApiZwfwResp<String>>() {
});
System.out.println(apiZwfwResp.getData());
String data = apiZwfwResp.getData();
DoworkInfo<String> doworkInfoResp = JSON.parseObject(data, new TypeReference<DoworkInfo<String>>() {
});
System.out.println(doworkInfoResp.getIfResultInfo());
String ifResultInfo = doworkInfoResp.getIfResultInfo();
Rest<DoworkStatInfo> doworkStatInfoRest = JSON.parseObject(ifResultInfo, new TypeReference<Rest<DoworkStatInfo>>() {
});
System.out.println(doworkStatInfoRest.getData().getAccept());
String statMonthsInfo = "{\n" +
" \"success\": true,\n" +
" \"code\": 200,\n" +
" \"msg\": \"请求成功\",\n" +
" \"data\": \"{\\\"ifResult\\\":\\\"0\\\",\\\"ifResultInfo\\\":\\\"{\\\\\\\"code\\\\\\\":200,\\\\\\\"msg\\\\\\\":\\\\\\\"\\\\\\\",\\\\\\\"data\\\\\\\":[{\\\\\\\"month\\\\\\\":\\\\\\\"2024年12月\\\\\\\",\\\\\\\"apply\\\\\\\":22526,\\\\\\\"review\\\\\\\":19146,\\\\\\\"conclude\\\\\\\":22485,\\\\\\\"accept\\\\\\\":22450},{\\\\\\\"month\\\\\\\":\\\\\\\"2025年01月\\\\\\\",\\\\\\\"apply\\\\\\\":26590,\\\\\\\"review\\\\\\\":23820,\\\\\\\"conclude\\\\\\\":26532,\\\\\\\"accept\\\\\\\":26563},{\\\\\\\"month\\\\\\\":\\\\\\\"2025年02月\\\\\\\",\\\\\\\"apply\\\\\\\":28372,\\\\\\\"review\\\\\\\":21842,\\\\\\\"conclude\\\\\\\":28382,\\\\\\\"accept\\\\\\\":28359},{\\\\\\\"month\\\\\\\":\\\\\\\"2025年03月\\\\\\\",\\\\\\\"apply\\\\\\\":18886,\\\\\\\"review\\\\\\\":14840,\\\\\\\"conclude\\\\\\\":18854,\\\\\\\"accept\\\\\\\":18855},{\\\\\\\"month\\\\\\\":\\\\\\\"2025年04月\\\\\\\",\\\\\\\"apply\\\\\\\":17006,\\\\\\\"review\\\\\\\":13586,\\\\\\\"conclude\\\\\\\":16972,\\\\\\\"accept\\\\\\\":16983},{\\\\\\\"month\\\\\\\":\\\\\\\"2025年05月\\\\\\\",\\\\\\\"apply\\\\\\\":11079,\\\\\\\"review\\\\\\\":7004,\\\\\\\"conclude\\\\\\\":10958,\\\\\\\"accept\\\\\\\":10969}]}\\\",\\\"msgId\\\":\\\"\\\"}\"\n" +
"}";
}
}
package com.mortals.xhx.module.dowork.model.vo;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.dowork.model.DoworkStatEntity;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
import com.mortals.framework.annotation.Excel;
import java.math.BigDecimal;
import java.util.Date;
/**
* 办件统计视图对象
*
* @author zxfei
* @date 2025-06-10
*/
@Data
public class DoworkStatVo extends BaseEntityLong {
/** 开始 年 */
private Integer yearStart;
/** 结束 年 */
private Integer yearEnd;
/** 开始 月 */
private Integer monthStart;
/** 结束 月 */
private Integer monthEnd;
}
\ No newline at end of file
package com.mortals.xhx.module.dowork.service;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.dowork.model.DoworkStatEntity;
import com.mortals.xhx.module.dowork.dao.DoworkStatDao;
import java.util.List;
/**
* DoworkStatService
* <p>
* 办件统计 service接口
*
* @author zxfei
* @date 2025-06-10
*/
public interface DoworkStatService extends ICRUDService<DoworkStatEntity, Long> {
DoworkStatDao getDao();
/**
* 同步查询结果
*
* @param entity
* @return
*/
Rest<List<DoworkStatEntity>> queryListForWeb(DoworkStatEntity entity);
/**
* 同步查询当月结果
*
* @param entity
* @return
*/
Rest<DoworkStatEntity> getForWeb(DoworkStatEntity entity);
}
\ No newline at end of file
package com.mortals.xhx.module.dowork.web;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.framework.model.OrderCol;
import com.mortals.framework.util.ThreadPool;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.module.dowork.model.DoworkStatEntity;
import com.mortals.xhx.module.dowork.model.DoworkStatQuery;
import com.mortals.xhx.module.dowork.service.DoworkStatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
import java.util.Map;
/**
* 办件统计
*
* @author zxfei
* @date 2025-06-10
*/
@RestController
@RequestMapping("dowork/stat")
public class DoworkStatController extends BaseCRUDJsonBodyMappingController<DoworkStatService, DoworkStatEntity, Long> {
@Autowired
private ParamService paramService;
@Autowired
private DoworkStatService doworkStatService;
public DoworkStatController() {
super.setModuleDesc("办件统计");
}
@Override
protected void doListBefore(DoworkStatEntity query, Map<String, Object> model, Context context) throws AppException {
//todo 去请求外网 同步数据到数据库。
if (ObjectUtils.isEmpty(query.getOrderColList())) {
query.setOrderColList(Arrays.asList(new OrderCol("year"), new OrderCol("month")));
}
if (ObjectUtils.isEmpty(query.getAreaCode())) throw new AppException("区域编码不能为空!");
Runnable runnable = new Runnable() {
@Override
public void run() {
DoworkStatQuery doworkStatQuery = new DoworkStatQuery();
doworkStatQuery.setAreaCode(query.getAreaCode());
doworkStatService.queryListForWeb(doworkStatQuery);
doworkStatService.getForWeb(doworkStatQuery);
}
};
ThreadPool.getInstance().execute(runnable);
super.doListBefore(query, model, context);
}
@Override
protected void init(Map<String, Object> model, Context context) {
super.init(model, context);
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.identity.model.SysFaceEntity;
import java.util.List;
/**
* 人脸识别信息Dao
* 人脸识别信息 DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysFaceDao extends ICRUDDao<SysFaceEntity,String>{
}
package com.mortals.xhx.module.identity.dao;
import com.mortals.framework.dao.ICRUDDao;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import java.util.List;
/**
* 人员身份信息Dao
* 人员身份信息 DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
public interface SysIdentityDao extends ICRUDDao<SysIdentityEntity,String>{
/**
* 身份证号查询
* @param region
* @param birthday
* @param ase
* @param name
* @param id
* @return
*/
SysIdentityEntity findIdentity(Long region,Long birthday,String ase, String name, String id);
}
package com.mortals.xhx.module.identity.dao.ibatis;
import com.mortals.framework.model.BaseEntity;
import com.mortals.framework.model.ParamDto;
import org.springframework.stereotype.Repository;
import com.mortals.xhx.module.identity.dao.SysIdentityDao;
import com.mortals.xhx.module.identity.model.SysIdentityEntity;
import java.util.Date;
import com.mortals.framework.dao.ibatis.BaseCRUDDaoMybatis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 人员身份信息DaoImpl DAO接口
*
* @author zxfei
* @date 2022-08-03
*/
@Repository("sysIdentityDao")
public class SysIdentityDaoImpl extends BaseCRUDDaoMybatis<SysIdentityEntity,String> implements SysIdentityDao {
@Override
public SysIdentityEntity findIdentity(Long region, Long birthday, String ase, String name, String id) {
Map<String,Object> condition = new HashMap<>();
condition.put("region",region);
condition.put("birthday",birthday);
condition.put("ase",ase);
condition.put("name",name);
condition.put("id",id);
return (SysIdentityEntity)this.getSqlSession().selectOne(this.getSqlId("findIdentity"), condition);
}
}
package com.mortals.xhx.module.identity.model;
import java.util.Date;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityLong;
import com.mortals.xhx.module.identity.model.vo.PeopleInfoVo;
/**
* 用户信息实体对象
*
* @author zxfei
* @date 2022-08-08
*/
public class PeopleInfoEntity extends PeopleInfoVo {
private static final long serialVersionUID = 1L;
/**
* 姓名
*/
private String name;
/**
* 性别
*/
private String sex;
/**
* 民族
*/
private String nation;
/**
* 出生日期
*/
private String born;
/**
* 地址
*/
private String address;
/**
* 身份证号
*/
private String idCardNo;
/**
* 发证机关
*/
private String grantDept;
/**
* 有效期开始
*/
private String userLifeBegin;
/**
* 有效期结束
*/
private String userLifeEnd;
/**
* 照片
*/
private String photoFileName;
/**
* 手机
*/
private String phone;
/**
* 微信开放认证id
*/
private String openid;
/**
* 最近登录时间
*/
private Date lastTime;
/**
*
*/
private Date upTime;
/**
* 微信头像
*/
private String icon;
/**
* 微信昵称
*/
private String nickname;
/**
* 身份证正面照片
*/
private String zImg;
/**
* 身份证背面照片
*/
private String bImg;
/**
* 默认选择的站点id
*/
private Long siteid;
/**
* 天府通办用户名
*/
private String username;
public PeopleInfoEntity(){}
/**
* 获取 姓名
* @return String
*/
public String getName(){
return name;
}
/**
* 设置 姓名
* @param name
*/
public void setName(String name){
this.name = name;
}
/**
* 获取 性别
* @return String
*/
public String getSex(){
return sex;
}
/**
* 设置 性别
* @param sex
*/
public void setSex(String sex){
this.sex = sex;
}
/**
* 获取 民族
* @return String
*/
public String getNation(){
return nation;
}
/**
* 设置 民族
* @param nation
*/
public void setNation(String nation){
this.nation = nation;
}
/**
* 获取 出生日期
* @return String
*/
public String getBorn(){
return born;
}
/**
* 设置 出生日期
* @param born
*/
public void setBorn(String born){
this.born = born;
}
/**
* 获取 地址
* @return String
*/
public String getAddress(){
return address;
}
/**
* 设置 地址
* @param address
*/
public void setAddress(String address){
this.address = address;
}
/**
* 获取 身份证号
* @return String
*/
public String getIdCardNo(){
return idCardNo;
}
/**
* 设置 身份证号
* @param idCardNo
*/
public void setIdCardNo(String idCardNo){
this.idCardNo = idCardNo;
}
/**
* 获取 发证机关
* @return String
*/
public String getGrantDept(){
return grantDept;
}
/**
* 设置 发证机关
* @param grantDept
*/
public void setGrantDept(String grantDept){
this.grantDept = grantDept;
}
/**
* 获取 有效期开始
* @return String
*/
public String getUserLifeBegin(){
return userLifeBegin;
}
/**
* 设置 有效期开始
* @param userLifeBegin
*/
public void setUserLifeBegin(String userLifeBegin){
this.userLifeBegin = userLifeBegin;
}
/**
* 获取 有效期结束
* @return String
*/
public String getUserLifeEnd(){
return userLifeEnd;
}
/**
* 设置 有效期结束
* @param userLifeEnd
*/
public void setUserLifeEnd(String userLifeEnd){
this.userLifeEnd = userLifeEnd;
}
/**
* 获取 照片
* @return String
*/
public String getPhotoFileName(){
return photoFileName;
}
/**
* 设置 照片
* @param photoFileName
*/
public void setPhotoFileName(String photoFileName){
this.photoFileName = photoFileName;
}
/**
* 获取 手机
* @return String
*/
public String getPhone(){
return phone;
}
/**
* 设置 手机
* @param phone
*/
public void setPhone(String phone){
this.phone = phone;
}
/**
* 获取
* @return String
*/
public String getOpenid(){
return openid;
}
/**
* 设置
* @param openid
*/
public void setOpenid(String openid){
this.openid = openid;
}
/**
* 获取 最近登录时间
* @return Date
*/
public Date getLastTime(){
return lastTime;
}
/**
* 设置 最近登录时间
* @param lastTime
*/
public void setLastTime(Date lastTime){
this.lastTime = lastTime;
}
/**
* 获取
* @return Date
*/
public Date getUpTime(){
return upTime;
}
/**
* 设置
* @param upTime
*/
public void setUpTime(Date upTime){
this.upTime = upTime;
}
/**
* 获取 微信头像
* @return String
*/
public String getIcon(){
return icon;
}
/**
* 设置 微信头像
* @param icon
*/
public void setIcon(String icon){
this.icon = icon;
}
/**
* 获取 微信昵称
* @return String
*/
public String getNickname(){
return nickname;
}
/**
* 设置 微信昵称
* @param nickname
*/
public void setNickname(String nickname){
this.nickname = nickname;
}
/**
* 获取 身份证正面照片
* @return String
*/
public String getZImg(){
return zImg;
}
/**
* 设置 身份证正面照片
* @param zImg
*/
public void setZImg(String zImg){
this.zImg = zImg;
}
/**
* 获取 身份证背面照片
* @return String
*/
public String getBImg(){
return bImg;
}
/**
* 设置 身份证背面照片
* @param bImg
*/
public void setBImg(String bImg){
this.bImg = bImg;
}
/**
* 获取 默认选择的站点id
* @return Long
*/
public Long getSiteid(){
return siteid;
}
/**
* 设置 默认选择的站点id
* @param siteid
*/
public void setSiteid(Long siteid){
this.siteid = siteid;
}
/**
* 获取 天府通办用户名
* @return String
*/
public String getUsername(){
return username;
}
/**
* 设置 天府通办用户名
* @param username
*/
public void setUsername(String username){
this.username = username;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof PeopleInfoEntity) {
PeopleInfoEntity tmp = (PeopleInfoEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",name:").append(getName());
sb.append(",sex:").append(getSex());
sb.append(",nation:").append(getNation());
sb.append(",born:").append(getBorn());
sb.append(",address:").append(getAddress());
sb.append(",idCardNo:").append(getIdCardNo());
sb.append(",grantDept:").append(getGrantDept());
sb.append(",userLifeBegin:").append(getUserLifeBegin());
sb.append(",userLifeEnd:").append(getUserLifeEnd());
sb.append(",photoFileName:").append(getPhotoFileName());
sb.append(",phone:").append(getPhone());
sb.append(",openid:").append(getOpenid());
sb.append(",lastTime:").append(getLastTime());
sb.append(",upTime:").append(getUpTime());
sb.append(",icon:").append(getIcon());
sb.append(",nickname:").append(getNickname());
sb.append(",zImg:").append(getZImg());
sb.append(",bImg:").append(getBImg());
sb.append(",siteid:").append(getSiteid());
sb.append(",username:").append(getUsername());
return sb.toString();
}
public void initAttrValue(){
this.name = "";
this.sex = "";
this.nation = "";
this.born = "";
this.address = "";
this.idCardNo = "";
this.grantDept = "";
this.userLifeBegin = "";
this.userLifeEnd = "";
this.photoFileName = "";
this.phone = "";
this.openid = "微信开放认证id";
this.lastTime = null;
this.upTime = null;
this.icon = "";
this.nickname = "";
this.zImg = "";
this.bImg = "";
this.siteid = 0L;
this.username = "";
}
}
\ No newline at end of file
package com.mortals.xhx.module.identity.model;
import java.util.List;
import java.util.ArrayList;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.mortals.framework.annotation.Excel;
import com.mortals.framework.model.BaseEntityStr;
import com.mortals.xhx.module.identity.model.vo.SysFaceVo;
/**
* 人脸识别信息实体对象
*
* @author zxfei
* @date 2022-08-03
*/
public class SysFaceEntity extends SysFaceVo {
private static final long serialVersionUID = 1L;
/**
* 场所名称
*/
private String placeName;
/**
* 场所ID
*/
private String placeId;
/**
* 人脸缩略图
*/
private byte[] face;
/**
* 人脸特征
*/
private byte[] faceFeature;
/**
* 身份ID
*/
private String idCard;
/**
* 删除标识
*/
private Integer deleted;
public SysFaceEntity(){}
/**
* 获取 场所名称
* @return String
*/
public String getPlaceName(){
return placeName;
}
/**
* 设置 场所名称
* @param placeName
*/
public void setPlaceName(String placeName){
this.placeName = placeName;
}
/**
* 获取 场所ID
* @return String
*/
public String getPlaceId(){
return placeId;
}
/**
* 设置 场所ID
* @param placeId
*/
public void setPlaceId(String placeId){
this.placeId = placeId;
}
/**
* 获取 人脸缩略图
* @return String
*/
public byte[] getFace(){
return face;
}
/**
* 设置 人脸缩略图
* @param face
*/
public void setFace(byte[] face){
this.face = face;
}
/**
* 获取 人脸特征
* @return String
*/
public byte[] getFaceFeature(){
return faceFeature;
}
/**
* 设置 人脸特征
* @param faceFeature
*/
public void setFaceFeature(byte[] faceFeature){
this.faceFeature = faceFeature;
}
/**
* 获取 身份ID
* @return String
*/
public String getIdCard(){
return idCard;
}
/**
* 设置 身份ID
* @param idCard
*/
public void setIdCard(String idCard){
this.idCard = idCard;
}
/**
* 获取 删除标识
* @return Integer
*/
public Integer getDeleted(){
return deleted;
}
/**
* 设置 删除标识
* @param deleted
*/
public void setDeleted(Integer deleted){
this.deleted = deleted;
}
@Override
public int hashCode() {
return this.getId().hashCode();
}
@Override
public boolean equals(Object obj) {
if (obj == null) return false;
if (obj instanceof SysFaceEntity) {
SysFaceEntity tmp = (SysFaceEntity) obj;
if (this.getId() == tmp.getId()) {
return true;
}
}
return false;
}
public String toString(){
StringBuilder sb = new StringBuilder("");
sb.append(",placeName:").append(getPlaceName());
sb.append(",placeId:").append(getPlaceId());
sb.append(",face:").append(getFace());
sb.append(",faceFeature:").append(getFaceFeature());
sb.append(",idCard:").append(getIdCard());
sb.append(",deleted:").append(getDeleted());
return sb.toString();
}
public void initAttrValue(){
this.placeName = "";
this.placeId = "";
this.face = null;
this.faceFeature = null;
this.idCard = "0";
this.deleted = 0;
}
}
\ 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.
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