Browse Source

Merge remote-tracking branch 'origin/dev' into dev

dev-v1.0.2
庄锐波 5 months ago
parent
commit
1c96f753d5
  1. 37
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEnterpriseLoginController.java
  2. 5
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/DashboardCheckRegisterAreaController.java
  3. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/DashboardCheckRegisterHighController.java
  4. 6
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java
  5. 33
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/DashboardCheckHighAreaQueryBo.java
  6. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/DashboardCheckRegisterAreaQueryBo.java
  7. 49
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/DashboardCheckHighAreaInfoVo.java
  8. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/DashboardCheckRegisterDomainMapper.java
  9. 23
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/DashboardOverviewMapper.java
  10. 9
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IDashboardOverviewService.java
  11. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java
  12. 106
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseLoginServiceImpl.java
  13. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardCheckRegisterAreaServiceImpl.java
  14. 16
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardCheckRegisterDomainServiceImpl.java
  15. 79
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardOverviewServiceImpl.java
  16. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardCheckRegisterAreaMapper.xml
  17. 31
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardCheckRegisterDomainMapper.xml
  18. 123
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardOverviewMapper.xml
  19. 10
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardTrendStatMapper.xml
  20. 2
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml
  21. 1596
      zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html
  22. 13
      zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue
  23. 25
      zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts
  24. 21
      zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts
  25. 16
      zdxt-web-client/zdxt-admin-plus-ui/src/utils/request.ts
  26. 12
      zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/index.js
  27. 56
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/home/enterpriseHome.vue

37
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEnterpriseLoginController.java

@ -8,13 +8,14 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
@ -27,17 +28,43 @@ import java.util.Map;
@RequestMapping("/app-ent/enterprise/login") @RequestMapping("/app-ent/enterprise/login")
public class AppEnterpriseLoginController { public class AppEnterpriseLoginController {
@Autowired private final IAppEnterpriseLoginService appEnterpriseLoginService;
private IAppEnterpriseLoginService appEnterpriseLoginService;
/** /**
* 企业端用户登录(深i企) * 获取深i企鉴权所需的 accessKey / accessSecret
*/
@SaIgnore
@ApiResponse(description = "获取深i企 accessKey / accessSecret")
@GetMapping("/getSiqCode")
public R<Map<String, String>> getSiqCode() {
String accessKey = "6374106c5eb449a4ad6c2430f30796e6";
String accessSecret = "434fec85aa5846e88bbeb8fac6cf6d7f";
Map<String, String> result = new HashMap<>();
result.put("accessKey", accessKey);
result.put("accessSecret", accessSecret);
return R.ok("获取成功", result);
}
/**
* 企业端用户登录(深i企)
*/ */
@SaIgnore @SaIgnore
@ApiResponse(description = "企业端-用户登录(深i企)") @ApiResponse(description = "企业端-用户登录(深i企)")
@PostMapping("/siqLogin") @PostMapping("/siqLogin")
public R<Map<String, Object>> siqLogin(@RequestBody AppEnterpriseLoginBo bo){ public R<Map<String, Object>> siqLogin(@RequestBody AppEnterpriseLoginBo bo) {
System.out.println("接收到登录请求");
Map<String, Object> result = appEnterpriseLoginService.siqLogin(bo); Map<String, Object> result = appEnterpriseLoginService.siqLogin(bo);
return R.ok("登录成功", result); return R.ok("登录成功", result);
} }
/**
* 深i企模拟登录(开发/联调)
*/
@SaIgnore
@ApiResponse(description = "企业端-深i企模拟登录")
@PostMapping("/siqLoginMock")
public R<Map<String, Object>> siqLoginMock(@RequestBody AppEnterpriseLoginBo bo) {
Map<String, Object> result = appEnterpriseLoginService.siqLoginMock(bo);
return R.ok("登录成功", result);
}
} }

5
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/DashboardCheckRegisterAreaController.java

@ -2,8 +2,10 @@ package com.zdxt.enforcementcode.controller.web.supervision;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterAreaBo; import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterAreaBo;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterAreaQueryBo; import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterAreaQueryBo;
import com.zdxt.enforcementcode.domain.bo.QueryDashboardOverviewBo;
import com.zdxt.enforcementcode.domain.vo.DashboardCheckRegisterAreaInfoVo; import com.zdxt.enforcementcode.domain.vo.DashboardCheckRegisterAreaInfoVo;
import com.zdxt.enforcementcode.domain.vo.DashboardCheckRegisterAreaVo; import com.zdxt.enforcementcode.domain.vo.DashboardCheckRegisterAreaVo;
import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo;
import com.zdxt.enforcementcode.service.IDashboardCheckRegisterAreaService; import com.zdxt.enforcementcode.service.IDashboardCheckRegisterAreaService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
@ -36,8 +38,7 @@ public class DashboardCheckRegisterAreaController extends BaseController {
public R<DashboardCheckRegisterAreaInfoVo> getCheckRegisterArea(DashboardCheckRegisterAreaQueryBo bo) { public R<DashboardCheckRegisterAreaInfoVo> getCheckRegisterArea(DashboardCheckRegisterAreaQueryBo bo) {
//1、默认查询上个月的数据 //1、默认查询上个月的数据
//2、totalCheckRegisterAreaInfo 查询条件: 年+月+城市code+level = 1 //2、totalCheckRegisterAreaInfo 查询条件: 年+月+城市code+level = 1
//3、checkRegisterAreaList 查询条件: 年+月+城市code+level = 2 //3、checkRegisterAreaList 查询条件: 年+月+城市code+level = 3
return dashboardCheckRegisterAreaService.getCheckRegisterArea(bo); return dashboardCheckRegisterAreaService.getCheckRegisterArea(bo);
} }
} }

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/DashboardCheckRegisterHighController.java

@ -1,14 +1,13 @@
package com.zdxt.enforcementcode.controller.web.supervision; package com.zdxt.enforcementcode.controller.web.supervision;
import com.zdxt.enforcementcode.common.util.StringUtils; import com.zdxt.enforcementcode.common.util.StringUtils;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterAreaQueryBo; import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterArea;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterDomainQueryBo; import com.zdxt.enforcementcode.domain.bo.*;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterHighQueryBo;
import com.zdxt.enforcementcode.domain.bo.DashboardCompanyHighFreqCheckBo;
import com.zdxt.enforcementcode.domain.vo.*; import com.zdxt.enforcementcode.domain.vo.*;
import com.zdxt.enforcementcode.service.IDashboardCheckRegisterAreaService; import com.zdxt.enforcementcode.service.IDashboardCheckRegisterAreaService;
import com.zdxt.enforcementcode.service.IDashboardCheckRegisterDomainService; import com.zdxt.enforcementcode.service.IDashboardCheckRegisterDomainService;
import com.zdxt.enforcementcode.service.IDashboardCompanyHighFreqCheckService; import com.zdxt.enforcementcode.service.IDashboardCompanyHighFreqCheckService;
import com.zdxt.enforcementcode.service.IDashboardOverviewService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
@ -38,6 +37,9 @@ public class DashboardCheckRegisterHighController extends BaseController {
private final IDashboardCompanyHighFreqCheckService dashboardCompanyHighFreqCheckService; private final IDashboardCompanyHighFreqCheckService dashboardCompanyHighFreqCheckService;
private final IDashboardCheckRegisterAreaService dashboardCheckRegisterAreaService; private final IDashboardCheckRegisterAreaService dashboardCheckRegisterAreaService;
private final IDashboardOverviewService dashboardOverviewService;
/** /**
* 大屏-高频检查预警-各领域高频检查次数排行 * 大屏-高频检查预警-各领域高频检查次数排行
* 1、高频检查次数排行: pageQuery.orderByColumn = "sqjczs" , pageQuery.isAsc = "desc" * 1、高频检查次数排行: pageQuery.orderByColumn = "sqjczs" , pageQuery.isAsc = "desc"
@ -69,9 +71,9 @@ public class DashboardCheckRegisterHighController extends BaseController {
* 前端不用默认不用传参数 * 前端不用默认不用传参数
*/ */
@GetMapping("/getHighInfoByArea") @GetMapping("/getHighInfoByArea")
public R<DashboardCheckRegisterAreaInfoVo> getHighInfoByArea(DashboardCheckRegisterAreaQueryBo bo) { public R<List<DashboardCheckHighAreaInfoVo>> getHighInfoByArea(DashboardCheckHighAreaQueryBo bo) {
return dashboardCheckRegisterAreaService.getCheckRegisterArea(bo); List<DashboardCheckHighAreaInfoVo> list = dashboardOverviewService.getHighInfoByArea(bo);
return R.ok(list);
} }
} }

6
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java

@ -285,15 +285,15 @@ public class StatisticalPanelController {
Map<String, Object> resMap = new HashMap<String, Object>(); Map<String, Object> resMap = new HashMap<String, Object>();
SysDeptBo deptParams = new SysDeptBo(); SysDeptBo deptParams = new SysDeptBo();
deptParams.setZone(2); deptParams.setZone(2);
deptParams.setDeptName(LoginHelper.getDeptName()); // deptId 入参传区名称,如「光明区」
deptParams.setDeptId(LoginHelper.getDeptId()); deptParams.setDeptName(params.getDeptId());
List<SysDeptVo> depts = sysDeptService.selectDepts(deptParams); List<SysDeptVo> depts = sysDeptService.selectDepts(deptParams);
if (depts == null || depts.isEmpty()) { if (depts == null || depts.isEmpty()) {
return R.fail("未找到相关部门信息"); return R.fail("未找到相关部门信息");
} }
params.setDeptId(depts.get(0).getDeptId()); params.setDeptId(String.valueOf(depts.get(0).getDeptId()));
resMap.put("area", deptParams.getDeptName()); resMap.put("area", deptParams.getDeptName());

33
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/DashboardCheckHighAreaQueryBo.java

@ -0,0 +1,33 @@
package com.zdxt.enforcementcode.domain.bo;
import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterArea;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.dromara.common.mybatis.core.domain.BaseEntity;
/**
* 大屏-高频检查
*
* @author Lion Li
* @date 2026-06-02
*/
@Data
public class DashboardCheckHighAreaQueryBo extends BaseEntity {
/**
* 年份
*/
private Long year;
/**
* 月份 1-12
*/
private Long month;
/**
* 级别:1-市 2-区 3-街道
*/
private Integer level;
}

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/DashboardCheckRegisterAreaQueryBo.java

@ -37,7 +37,7 @@ public class DashboardCheckRegisterAreaQueryBo extends BaseEntity {
private String cityCode; private String cityCode;
/** /**
* 级别:1-市 2-区 3-街道 * 级别:1-市 2-市直属,3-区 4-街道
*/ */
private Integer level; private Integer level;
} }

49
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/DashboardCheckHighAreaInfoVo.java

@ -0,0 +1,49 @@
package com.zdxt.enforcementcode.domain.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterArea;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 大屏-高频检查区域
*
* @author Lion Li
* @date 2026-06-02
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = DashboardCheckRegisterArea.class)
public class DashboardCheckHighAreaInfoVo implements Serializable {
/**
* 区县编码
*/
@ExcelProperty(value = "区县编码")
private String areaCode;
/**
* 区县名称
*/
@ExcelProperty(value = "区县名称")
private String areaName;
/**
* 高频检查次数
*/
private Long hpjccs;
/**
* 高频检查登记级别:级别1-4
*/
private Integer gplevel;
}

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/DashboardCheckRegisterDomainMapper.java

@ -27,7 +27,7 @@ public interface DashboardCheckRegisterDomainMapper extends BaseMapperPlus<Dashb
* @param month 月份 * @param month 月份
* @return 领域统计列表 * @return 领域统计列表
*/ */
List<DashboardCheckRegisterDomainVo> queryRegisterDomainList(Long year, Long month); List<DashboardCheckRegisterDomainVo> queryRegisterDomainList(Long year, Long month,String type);
/** /**
* 查询高频预警领域统计-按月 * 查询高频预警领域统计-按月

23
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/DashboardOverviewMapper.java

@ -5,6 +5,7 @@ import com.zdxt.enforcementcode.domain.bean.DashboardOverview;
import com.zdxt.enforcementcode.domain.bo.GenerateDataBo; import com.zdxt.enforcementcode.domain.bo.GenerateDataBo;
import com.zdxt.enforcementcode.domain.bo.LawEnforcementIntensityQueryBo; import com.zdxt.enforcementcode.domain.bo.LawEnforcementIntensityQueryBo;
import com.zdxt.enforcementcode.domain.bo.QueryDashboardOverviewCountBo; import com.zdxt.enforcementcode.domain.bo.QueryDashboardOverviewCountBo;
import com.zdxt.enforcementcode.domain.vo.DashboardCheckHighAreaInfoVo;
import com.zdxt.enforcementcode.domain.vo.DashboardOverviewVo; import com.zdxt.enforcementcode.domain.vo.DashboardOverviewVo;
import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo; import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo;
import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityCountVo; import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityCountVo;
@ -14,7 +15,7 @@ import java.util.List;
public interface DashboardOverviewMapper extends BaseMapperPlus<DashboardOverview, DashboardOverviewVo> { public interface DashboardOverviewMapper extends BaseMapperPlus<DashboardOverview, DashboardOverviewVo> {
LawEnforcementIntensityVo queryLawEnforcementIntensity(LawEnforcementIntensityQueryBo queryBo); List<LawEnforcementIntensityVo> queryLawEnforcementIntensity(LawEnforcementIntensityQueryBo queryBo);
List<LawEnforcementIntensityCountVo> queryCount(QueryDashboardOverviewCountBo bo); List<LawEnforcementIntensityCountVo> queryCount(QueryDashboardOverviewCountBo bo);
@ -22,4 +23,24 @@ public interface DashboardOverviewMapper extends BaseMapperPlus<DashboardOvervie
void generateOverviewData(GenerateDataBo bo); void generateOverviewData(GenerateDataBo bo);
/**
* 汇总生成市级大屏总览数据(level=1)
*/
void generateCityOverviewData(GenerateDataBo bo);
/**
* 更新同比、环比数据
*/
void updateYoyMom(GenerateDataBo bo);
/**
* 查询高频检查区域统计信息
*
* @param year 年份
* @param month 月份
* @param level 级别:1-市 2-区 3-街道
* @return 高频检查区域统计列表
*/
java.util.List<DashboardCheckHighAreaInfoVo> queryHighInfoByArea(Long year, Long month, Integer level);
} }

9
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IDashboardOverviewService.java

@ -100,4 +100,13 @@ public interface IDashboardOverviewService {
* @return 生成结果信息 * @return 生成结果信息
*/ */
String generateData(GenerateDataBo bo); String generateData(GenerateDataBo bo);
/**
* 高频检查预警-高频检查企业&高频检查区域统计
* 默认查询上个月数据
*
* @param bo 查询条件
* @return 高频检查区域统计列表
*/
List<com.zdxt.enforcementcode.domain.vo.DashboardCheckHighAreaInfoVo> getHighInfoByArea(com.zdxt.enforcementcode.domain.bo.DashboardCheckHighAreaQueryBo bo);
} }

7
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java

@ -18,4 +18,11 @@ public interface IAppEnterpriseLoginService {
* @return 登录结果,包含token和用户信息 * @return 登录结果,包含token和用户信息
*/ */
Map<String, Object> siqLogin(AppEnterpriseLoginBo bo); Map<String, Object> siqLogin(AppEnterpriseLoginBo bo);
/**
* 深I企模拟登录(开发/联调)
* @param bo 登录参数
* @return 登录结果,包含token和用户信息
*/
Map<String, Object> siqLoginMock(AppEnterpriseLoginBo bo);
} }

106
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseLoginServiceImpl.java

@ -30,10 +30,10 @@ import org.dromara.common.core.enums.UserType;
import org.dromara.common.core.exception.base.BaseException; import org.dromara.common.core.exception.base.BaseException;
import org.dromara.common.core.utils.DateUtils; import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.mapper.SysUserPostMapper;
import org.dromara.system.mapper.SysUserRoleMapper; import org.dromara.system.mapper.SysUserRoleMapper;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
@ -46,6 +46,7 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit;
/** /**
@ -107,34 +108,50 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService
@Autowired @Autowired
RuoYiConfig ruoYiConfig; RuoYiConfig ruoYiConfig;
@Value("${siq.mock.enabled:false}")
private boolean mockEnabled;
/** /**
* 深i企用户登录并自动注册(带分布式锁防重) * 深i企用户登录并自动注册(带分布式锁防重,流程与一期 thirdLogin/siqLogin 一致)
* *
* @param bo 登录参数 * @param bo 登录参数
* @return 登录结果,包含token和用户信息 * @return 登录结果,包含token和用户信息
*/ */
@Override @Override
public Map<String, Object> siqLogin(AppEnterpriseLoginBo bo) { public Map<String, Object> siqLogin(AppEnterpriseLoginBo bo) {
JSONObject userInfo; log.info("---> 深i企登录用户 code:{}", bo.getCode());
JSONObject userInfo = siqLoginInfo(bo);
log.info("---> 深i企登录用户信息:{}", userInfo);
log.info("---> 后面为本地登录的验证了!!! <---");
return doSiqLoginWithLock(userInfo);
}
if (mockEnabled) { /**
log.info("使用模拟数据进行深i企登录测试"); * 深i企模拟登录(开发/联调)
userInfo = getMockSiqUserInfo(bo.getCode()); */
} else { @Override
userInfo = siqLoginInfo(bo); public Map<String, Object> siqLoginMock(AppEnterpriseLoginBo bo) {
log.info("---> 深i企模拟登录 userId:{}", bo.getUserId());
JSONObject userInfo = getMockSiqUserInfo(bo.getCode());
if (StringUtils.isNotEmpty(bo.getUserId())) {
userInfo.put("userId", bo.getUserId());
} }
return doSiqLoginWithLock(userInfo);
}
String siqUserId = userInfo.getString("userId"); /**
* 加锁后完成用户注册、企业关联并签发 token
String lockKey = "siq_login_lock:" + siqUserId; */
private Map<String, Object> doSiqLoginWithLock(JSONObject userInfo) {
String lockKey = resolveLoginLockKey(userInfo);
RLock lock = redissonClient.getLock("siq_login_lock:" + lockKey);
boolean locked = false;
try { try {
log.info("深i企登录获取分布式锁成功: lockKey={}, userId={}", lockKey, siqUserId); locked = lock.tryLock(0, 1, TimeUnit.SECONDS);
if (!locked) {
log.info("用户正在登录中,用户信息:{}", userInfo.toJSONString());
throw new BaseException("用户正在登录中,请稍后再试");
}
log.info("---> 登入锁 key: {}", lockKey);
EnterpriseUser newUser = saveOrUpdateEnterpriseUser(userInfo); EnterpriseUser newUser = saveOrUpdateEnterpriseUser(userInfo);
EnterpriseInformation enterpriseInformation = addSiqUserCompany(userInfo, newUser); EnterpriseInformation enterpriseInformation = addSiqUserCompany(userInfo, newUser);
if (newUser != null && enterpriseInformation != null) { if (newUser != null && enterpriseInformation != null) {
@ -142,26 +159,49 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService
} }
String token = generateToken(newUser, enterpriseInformation); String token = generateToken(newUser, enterpriseInformation);
return buildLoginResult(newUser, enterpriseInformation, token);
Map<String, Object> result = new HashMap<>(); } catch (BaseException e) {
result.put("token", token); throw e;
result.put("userId", newUser.getUserId()); } catch (InterruptedException e) {
result.put("userName", newUser.getUserName()); Thread.currentThread().interrupt();
result.put("loginName", newUser.getLoginName()); throw new BaseException("登录处理被中断");
result.put("phonenumber", newUser.getPhonenumber() != null ? newUser.getPhonenumber() : "");
result.put("enterpriseId", enterpriseInformation.getId());
result.put("enterpriseName", enterpriseInformation.getEnterpriseName());
result.put("enterpriseNumber", enterpriseInformation.getEnterpriseNumber());
result.put("platformType", PlatformTypeEnums.ENTERPRISE.getKey());
return result;
} catch (Exception e) { } catch (Exception e) {
log.error("深i企登录处理异常: lockKey={}", lockKey, e); log.error("深i企登录处理异常: lockKey={}", lockKey, e);
throw new BaseException("登录处理失败:" + e.getMessage()); throw new BaseException("登录处理失败:" + e.getMessage());
} finally {
if (locked && lock.isHeldByCurrentThread()) {
lock.unlock();
}
} }
} }
/**
* 与一期一致:优先使用 account 作为锁键,否则使用解密后的手机号
*/
private String resolveLoginLockKey(JSONObject userInfo) {
String account = userInfo.getString("account");
if (StringUtils.isNotEmpty(account)) {
return account;
}
return IdCardCryptoUtil.symmetricDecryptIdCard(secretKey, userInfo.getString("phone"));
}
private Map<String, Object> buildLoginResult(EnterpriseUser newUser,
EnterpriseInformation enterpriseInformation,
String token) {
Map<String, Object> result = new HashMap<>();
result.put("token", token);
result.put("userId", newUser.getUserId());
result.put("userName", newUser.getUserName());
result.put("loginName", newUser.getLoginName());
result.put("phonenumber", newUser.getPhonenumber() != null ? newUser.getPhonenumber() : "");
result.put("enterpriseId", enterpriseInformation.getId());
result.put("enterpriseName", enterpriseInformation.getEnterpriseName());
result.put("enterpriseNumber", enterpriseInformation.getEnterpriseNumber());
result.put("platformType", PlatformTypeEnums.ENTERPRISE.getKey());
return result;
}
/** /**
* 保存或更新企业用户信息 * 保存或更新企业用户信息
* <p> * <p>
@ -250,16 +290,18 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService
public JSONObject siqLoginInfo(AppEnterpriseLoginBo bo) { public JSONObject siqLoginInfo(AppEnterpriseLoginBo bo) {
try { try {
Map<String, Object> params = new HashMap<>(); Map<String, Object> params = new HashMap<>();
log.info("调用深i企登录接口,参数: {}", bo);
String accessKeySign = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, bo.getCode()); String accessKeySign = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, bo.getCode());
params.put("accessKeySign", accessKeySign); params.put("accessKeySign", accessKeySign);
params.put("appCode", code); params.put("appCode", code);
log.info("调用深i企登录接口,参数加密后: {}", params);
String data = HttpUtil.httpSendPost( String data = HttpUtil.httpSendPost(
siqUrl + ApiConstants.API_SIQUSERLOGIN, siqUrl + ApiConstants.API_SIQUSERLOGIN,
JSONObject.toJSONString(params), JSONObject.toJSONString(params),
new HashMap<>() new HashMap<>()
); );
log.info("调用深i企登录接口响应: {}", data);
JSONObject jsonObject = JSONObject.parseObject(data); JSONObject jsonObject = JSONObject.parseObject(data);
JSONObject userInfo = jsonObject.getJSONObject("data"); JSONObject userInfo = jsonObject.getJSONObject("data");
@ -269,7 +311,7 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService
throw new BaseException("深i企接口返回数据异常"); throw new BaseException("深i企接口返回数据异常");
} }
log.debug("深i企登录返回用户信息: userId={}", userInfo.getString("userId")); log.info("解析深i企登录接口响应成功,用户信息: {}", userInfo);
return userInfo; return userInfo;
} catch (BaseException e) { } catch (BaseException e) {

3
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardCheckRegisterAreaServiceImpl.java

@ -1,6 +1,7 @@
package com.zdxt.enforcementcode.service.impl; package com.zdxt.enforcementcode.service.impl;
import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterArea; import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterArea;
import com.zdxt.enforcementcode.mapper.DashboardOverviewMapper;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.StringUtils;
@ -38,6 +39,8 @@ public class DashboardCheckRegisterAreaServiceImpl implements IDashboardCheckReg
private final DashboardCheckRegisterAreaMapper baseMapper; private final DashboardCheckRegisterAreaMapper baseMapper;
private final DashboardOverviewMapper dashboardOverviewMapper;
/** /**
* 查询大屏-检查登记-区域统计 * 查询大屏-检查登记-区域统计
* *

16
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardCheckRegisterDomainServiceImpl.java

@ -1,5 +1,6 @@
package com.zdxt.enforcementcode.service.impl; package com.zdxt.enforcementcode.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterDomain; import com.zdxt.enforcementcode.domain.bean.DashboardCheckRegisterDomain;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterDomainQueryBo; import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterDomainQueryBo;
import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterHighQueryBo; import com.zdxt.enforcementcode.domain.bo.DashboardCheckRegisterHighQueryBo;
@ -164,15 +165,18 @@ public class DashboardCheckRegisterDomainServiceImpl implements IDashboardCheckR
month = (long) lastMonth.getMonthValue(); month = (long) lastMonth.getMonthValue();
} }
// 组装返回结果
DashboardCheckRegisterDomainInfoVo infoVo = new DashboardCheckRegisterDomainInfoVo();
// 查询总体概览数据 // 查询总体概览数据
DashboardCheckRegisterDomainVo totalRegisterDomain = baseMapper.queryTotalRegisterDomain(year, month); List<DashboardCheckRegisterDomainVo> totalRegisterDomainList = baseMapper.queryRegisterDomainList(year, month,"2");
if(CollectionUtil.isNotEmpty(totalRegisterDomainList)){
DashboardCheckRegisterDomainVo totalRegisterDomain =
baseMapper.queryRegisterDomainList(year, month,"2").get(0);
infoVo.setTotalRegisterDomain(totalRegisterDomain);
}
// 查询领域统计列表 // 查询领域统计列表
List<DashboardCheckRegisterDomainVo> registerDomainList = baseMapper.queryRegisterDomainList(year, month); List<DashboardCheckRegisterDomainVo> registerDomainList = baseMapper.queryRegisterDomainList(year, month,"1");
// 组装返回结果
DashboardCheckRegisterDomainInfoVo infoVo = new DashboardCheckRegisterDomainInfoVo();
infoVo.setTotalRegisterDomain(totalRegisterDomain);
infoVo.setRegisterDomainList(registerDomainList); infoVo.setRegisterDomainList(registerDomainList);
return R.ok(infoVo); return R.ok(infoVo);

79
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/DashboardOverviewServiceImpl.java

@ -4,9 +4,7 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.zdxt.enforcementcode.domain.bean.DashboardOverview; import com.zdxt.enforcementcode.domain.bean.DashboardOverview;
import com.zdxt.enforcementcode.domain.bo.*; import com.zdxt.enforcementcode.domain.bo.*;
import com.zdxt.enforcementcode.domain.vo.DashboardAreaInfoVo; import com.zdxt.enforcementcode.domain.vo.*;
import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo;
import com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityCountVo;
import com.zdxt.enforcementcode.service.IDashboardAreaInfoService; import com.zdxt.enforcementcode.service.IDashboardAreaInfoService;
import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MapstructUtils;
@ -23,7 +21,6 @@ import org.dromara.common.translation.annotation.Translation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.annotation.Transient; import org.springframework.data.annotation.Transient;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.zdxt.enforcementcode.domain.vo.DashboardOverviewVo;
import com.zdxt.enforcementcode.mapper.DashboardOverviewMapper; import com.zdxt.enforcementcode.mapper.DashboardOverviewMapper;
import com.zdxt.enforcementcode.service.IDashboardOverviewService; import com.zdxt.enforcementcode.service.IDashboardOverviewService;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -73,48 +70,20 @@ public class DashboardOverviewServiceImpl implements IDashboardOverviewService {
// 类型1:大屏总览数据 // 类型1:大屏总览数据
if (bo.getType() == 1) { if (bo.getType() == 1) {
// // 先删除该年月的旧数据 // 先删除该年月的旧数据
// baseMapper.deleteByYearMonth(bo.getYear().longValue(), bo.getMonth().longValue()); baseMapper.deleteByYearMonth(bo.getYear().longValue(), bo.getMonth().longValue());
// DashboardAreaInfoBo queryBo = new DashboardAreaInfoBo();
// queryBo.setLevel(2L);//查询所有的区
// List<DashboardAreaInfoVo> areaInfoVos = dashboardAreaInfoService.queryList(queryBo);
// for (DashboardAreaInfoVo areaInfoVo : areaInfoVos) {
// DashboardOverview dashboardOverviewArea = new DashboardOverview();
// dashboardOverviewArea.setId(IdUtil.simpleUUID());
// dashboardOverviewArea.setCityCode(areaInfoVo.getParentCode());
// dashboardOverviewArea.setCityName("深圳");
// dashboardOverviewArea.setYear(bo.getYear());
// dashboardOverviewArea.setMonth(bo.getMonth());
// dashboardOverviewArea.setDistrictCode(areaInfoVo.getCode());
// dashboardOverviewArea.setDistrictName(areaInfoVo.getName());
// dashboardOverviewArea.setLevel(3L);//区
// this.baseMapper.insert(dashboardOverviewArea);
// // 查询街道
// queryBo.setLevel(3L);
// queryBo.setParentCode(areaInfoVo.getCode());//区编码
// List<DashboardAreaInfoVo> streetInfoVos = dashboardAreaInfoService.queryList(queryBo);
// if(CollectionUtil.isNotEmpty(streetInfoVos)){
// for (DashboardAreaInfoVo dashboardAreaInfoVo: streetInfoVos ) {
// DashboardOverview dashboardOverviewStreet = new DashboardOverview();
// dashboardOverviewStreet.setId(IdUtil.simpleUUID());
// dashboardOverviewStreet.setCityCode("1");
// dashboardOverviewStreet.setCityName("深圳");
// dashboardOverviewStreet.setYear(bo.getYear());
// dashboardOverviewStreet.setMonth(bo.getMonth());
// dashboardOverviewStreet.setDistrictCode(areaInfoVo.getCode());
// dashboardOverviewStreet.setDistrictName(areaInfoVo.getName());
// dashboardOverviewStreet.setStreetCode(dashboardAreaInfoVo.getCode());
// dashboardOverviewStreet.setStreetName(dashboardAreaInfoVo.getName());
// dashboardOverviewStreet.setLevel(5L);//街道
// this.baseMapper.insert(dashboardOverviewStreet);
// }
// }
} // 通过SQL批量生成区级大屏总览数据(level=2)
baseMapper.generateOverviewData(bo);
// 汇总生成市级大屏总览数据(level=1)
baseMapper.generateCityOverviewData(bo);
return "大屏总览数据生成成功,年份:" + bo.getYear() + ",月份:" + bo.getMonth(); // 计算并更新同比、环比数据
baseMapper.updateYoyMom(bo);
} }
return "大屏总览数据生成成功,年份:" + bo.getYear() + ",月份:" + bo.getMonth();
}
/** /**
* 查询大屏总览 * 查询大屏总览
@ -252,7 +221,11 @@ public class DashboardOverviewServiceImpl implements IDashboardOverviewService {
} }
// 调用 Mapper 查询 // 调用 Mapper 查询
return baseMapper.queryLawEnforcementIntensity(queryBo); List<LawEnforcementIntensityVo> list = baseMapper.queryLawEnforcementIntensity(queryBo);
if (list == null || list.isEmpty()) {
return null;
}
return baseMapper.queryLawEnforcementIntensity(queryBo).get(0);
} }
/** /**
@ -412,5 +385,23 @@ public class DashboardOverviewServiceImpl implements IDashboardOverviewService {
return baseMapper.deleteByIds(ids) > 0; return baseMapper.deleteByIds(ids) > 0;
} }
/**
* 高频检查预警-高频检查企业&高频检查区域统计
*/
@Override
public List<DashboardCheckHighAreaInfoVo> getHighInfoByArea(DashboardCheckHighAreaQueryBo bo) {
if (bo.getYear() == null || bo.getMonth() == null) {
LocalDate lastMonth = LocalDate.now().minusMonths(1);
bo.setYear((long) lastMonth.getYear());
bo.setMonth((long) lastMonth.getMonthValue());
}
if (bo.getLevel() == null) {
bo.setLevel(2);
}
List<DashboardCheckHighAreaInfoVo> list = baseMapper.queryHighInfoByArea(
bo.getYear(), bo.getMonth(), bo.getLevel());
return list;
}
} }

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardCheckRegisterAreaMapper.xml

@ -84,7 +84,7 @@
<if test="cityCode != null and cityCode != ''"> <if test="cityCode != null and cityCode != ''">
AND city_code = #{cityCode} AND city_code = #{cityCode}
</if> </if>
AND level = 2 AND level = 3
ORDER BY area_name ORDER BY area_name
</select> </select>

31
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardCheckRegisterDomainMapper.xml

@ -19,9 +19,9 @@
SUM(xzcfzs) AS xzcfzs, SUM(xzcfzs) AS xzcfzs,
SUM(xzcftb) AS xzcftb, SUM(xzcftb) AS xzcftb,
SUM(xzcfhb) AS xzcfhb, SUM(xzcfhb) AS xzcfhb,
SUM(xzzqzs) AS xzzqzs, SUM(xzqzzs) AS xzqzzs,
SUM(xzzqtb) AS xzzqtb, SUM(xzqztb) AS xzqztb,
SUM(xzzqhb) AS xzzqhb, SUM(xzqzhb) AS xzqzhb,
SUM(qtzfzs) AS qtzfzs, SUM(qtzfzs) AS qtzfzs,
SUM(qtzftb) AS qtzftb, SUM(qtzftb) AS qtzftb,
SUM(qtzfhb) AS qtzfhb SUM(qtzfhb) AS qtzfhb
@ -50,9 +50,9 @@
xzcfzs, xzcfzs,
xzcftb, xzcftb,
xzcfhb, xzcfhb,
xzzqzs, xzqzzs,
xzzqtb, xzqztb,
xzzqhb, xzqzhb,
qtzfzs, qtzfzs,
qtzftb, qtzftb,
qtzfhb, qtzfhb,
@ -63,6 +63,7 @@
WHERE is_delete = '0' WHERE is_delete = '0'
AND year = #{year} AND year = #{year}
AND month = #{month} AND month = #{month}
AND type = #{type}
ORDER BY lymc ORDER BY lymc
</select> </select>
@ -82,9 +83,9 @@
xzcfzs, xzcfzs,
xzcftb, xzcftb,
xzcfhb, xzcfhb,
xzzqzs, xzqzzs,
xzzqtb, xzqztb,
xzzqhb, xzqzhb,
qtzfzs, qtzfzs,
qtzftb, qtzftb,
qtzfhb qtzfhb
@ -111,9 +112,9 @@
SUM(xzcfzs) AS xzcfzs, SUM(xzcfzs) AS xzcfzs,
SUM(xzcftb) AS xzcftb, SUM(xzcftb) AS xzcftb,
SUM(xzcfhb) AS xzcfhb, SUM(xzcfhb) AS xzcfhb,
SUM(xzzqzs) AS xzzqzs, SUM(xzqzzs) AS xzqzzs,
SUM(xzzqtb) AS xzzqtb, SUM(xzqztb) AS xzqztb,
SUM(xzzqhb) AS xzzqhb, SUM(xzqzhb) AS xzqzhb,
SUM(qtzfzs) AS qtzfzs, SUM(qtzfzs) AS qtzfzs,
SUM(qtzftb) AS qtzftb, SUM(qtzftb) AS qtzftb,
SUM(qtzfhb) AS qtzfhb SUM(qtzfhb) AS qtzfhb
@ -143,9 +144,9 @@
SUM(xzcfzs) AS xzcfzs, SUM(xzcfzs) AS xzcfzs,
SUM(xzcftb) AS xzcftb, SUM(xzcftb) AS xzcftb,
SUM(xzcfhb) AS xzcfhb, SUM(xzcfhb) AS xzcfhb,
SUM(xzzqzs) AS xzzqzs, SUM(xzqzzs) AS xzqzzs,
SUM(xzzqtb) AS xzzqtb, SUM(xzqztb) AS xzqztb,
SUM(xzzqhb) AS xzzqhb, SUM(xzqzhb) AS xzqzhb,
SUM(qtzfzs) AS qtzfzs, SUM(qtzfzs) AS qtzfzs,
SUM(qtzftb) AS qtzftb, SUM(qtzftb) AS qtzftb,
SUM(qtzfhb) AS qtzfhb SUM(qtzfhb) AS qtzfhb

123
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardOverviewMapper.xml

@ -6,11 +6,11 @@
<select id="queryLawEnforcementIntensity" resultType="com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo"> <select id="queryLawEnforcementIntensity" resultType="com.zdxt.enforcementcode.domain.vo.LawEnforcementIntensityVo">
SELECT SELECT
COALESCE(SUM(jczs), 0) AS jczs, jczs,
COALESCE(SUM(xzjc), 0) AS xzjc, xzjc,
COALESCE(SUM(xzcf), 0) AS xzcf, xzcf,
COALESCE(SUM(xzqz), 0) AS xzqz, xzqz,
COALESCE(SUM(xzqt), 0) AS xzqt xzqt
FROM dashboard_overview FROM dashboard_overview
WHERE is_delete = '0' WHERE is_delete = '0'
<if test="cityCode != null and cityCode != ''"> <if test="cityCode != null and cityCode != ''">
@ -225,4 +225,117 @@
AND d.district_code != '' AND d.district_code != ''
</insert> </insert>
<!-- 汇总生成市级大屏总览数据(对各区数据求和) -->
<insert id="generateCityOverviewData">
INSERT INTO dashboard_overview (
id,
city_code,
city_name,
district_code,
district_name,
street_code,
street_name,
level,
year,
month,
qyzs,
ddzfs,
lhzfs,
bzfqys,
zfrys,
zfdws,
jczs,
xzjc,
xzcf,
xzqz,
xzqt,
is_delete,
create_time,
update_time,
create_by,
update_by
)
SELECT
REPLACE(UUID(), '-', '') AS id,
'440300' AS city_code,
'深圳市' AS city_name,
NULL AS district_code,
NULL AS district_name,
NULL AS street_code,
NULL AS street_name,
1 AS level,
#{year} AS year,
#{month} AS month,
COALESCE(SUM(qyzs), 0) AS qyzs,
COALESCE(SUM(ddzfs), 0) AS ddzfs,
COALESCE(SUM(lhzfs), 0) AS lhzfs,
COALESCE(SUM(bzfqys), 0) AS bzfqys,
COALESCE(SUM(zfrys), 0) AS zfrys,
COALESCE(SUM(zfdws), 0) AS zfdws,
COALESCE(SUM(jczs), 0) AS jczs,
COALESCE(SUM(xzjc), 0) AS xzjc,
COALESCE(SUM(xzcf), 0) AS xzcf,
COALESCE(SUM(xzqz), 0) AS xzqz,
COALESCE(SUM(xzqt), 0) AS xzqt,
'0' AS is_delete,
NOW() AS create_time,
NOW() AS update_time,
'system' AS create_by,
'system' AS update_by
FROM dashboard_overview
WHERE year = #{year}
AND month = #{month}
AND level = 2
AND is_delete = '0'
</insert>
<!-- 更新同比、环比数据
同比:与去年同月比较
环比:与上一个月比较 -->
<update id="updateYoyMom">
UPDATE dashboard_overview cur
LEFT JOIN dashboard_overview yoy
ON cur.district_code = yoy.district_code
AND yoy.year = #{year} - 1
AND yoy.month = #{month}
AND yoy.level = 2
AND yoy.is_delete = '0'
LEFT JOIN dashboard_overview mom
ON cur.district_code = mom.district_code
AND (
(mom.year = #{year} AND mom.month = #{month} - 1)
OR
(#{month} = 1 AND mom.year = #{year} - 1 AND mom.month = 12)
)
AND mom.level = 2
AND mom.is_delete = '0'
SET
cur.qyzstb = cur.qyzs - COALESCE(yoy.qyzs, 0),
cur.qyzshb = cur.qyzs - COALESCE(mom.qyzs, 0),
cur.ddzfstb = cur.ddzfs - COALESCE(yoy.ddzfs, 0),
cur.ddzfshb = cur.ddzfs - COALESCE(mom.ddzfs, 0),
cur.lhzfstb = cur.lhzfs - COALESCE(yoy.lhzfs, 0),
cur.lhzfshb = cur.lhzfs - COALESCE(mom.lhzfs, 0),
cur.bzfqystb = cur.bzfqys - COALESCE(yoy.bzfqys, 0),
cur.bzfqyhb = cur.bzfqys - COALESCE(mom.bzfqys, 0)
WHERE cur.year = #{year}
AND cur.month = #{month}
AND cur.level = 2
AND cur.is_delete = '0'
</update>
<!-- 查询高频检查区域统计信息 -->
<select id="queryHighInfoByArea" resultType="com.zdxt.enforcementcode.domain.vo.DashboardCheckHighAreaInfoVo">
SELECT
district_code AS areaCode,
district_name AS areaName,
COALESCE(gpjcyj, 0) AS hpjccs,
gplevel
FROM dashboard_overview
WHERE is_delete = '0'
AND year = #{year}
AND month = #{month}
AND level = #{level}
</select>
</mapper> </mapper>

10
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardTrendStatMapper.xml

@ -19,7 +19,7 @@
IFNULL(SUM(a.dj_d), 0) AS djD, IFNULL(SUM(a.dj_d), 0) AS djD,
IFNULL(SUM(a.dj_e), 0) AS djE, IFNULL(SUM(a.dj_e), 0) AS djE,
IFNULL(SUM(a.wgcs), 0) AS wgcs IFNULL(SUM(a.wgcs), 0) AS wgcs
FROM dashboard_trend_stat a FROM dashboard_trend_stat a left join dashboard_area_info b on a.district_code = b.`code` and b.`level` = 2
WHERE a.is_delete = '0' WHERE a.is_delete = '0'
<if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null"> <if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null">
AND ( AND (
@ -44,6 +44,7 @@
a.quarter a.quarter
ORDER BY ORDER BY
b.sort ,
a.district_name, a.district_name,
a.year, a.year,
a.quarter a.quarter
@ -54,7 +55,7 @@
<select id="areaQuarterDomainCheck" resultType="com.zdxt.enforcementcode.domain.vo.DashboardTrendStatVo"> <select id="areaQuarterDomainCheck" resultType="com.zdxt.enforcementcode.domain.vo.DashboardTrendStatVo">
SELECT SELECT
a.* a.*
FROM dashboard_trend_stat a FROM dashboard_trend_stat a left join dashboard_area_info b on a.district_code = b.`code` and b.`level` = 2
WHERE a.is_delete = '0' WHERE a.is_delete = '0'
<if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null"> <if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null">
AND ( AND (
@ -81,6 +82,7 @@
</if> </if>
ORDER BY ORDER BY
b.sort ,
lymc, lymc,
a.year, a.year,
a.quarter a.quarter
@ -102,7 +104,7 @@
IFNULL(SUM(a.dj_d), 0) AS djD, IFNULL(SUM(a.dj_d), 0) AS djD,
IFNULL(SUM(a.dj_e), 0) AS djE, IFNULL(SUM(a.dj_e), 0) AS djE,
IFNULL(SUM(a.wgcs), 0) AS wgcs IFNULL(SUM(a.wgcs), 0) AS wgcs
FROM dashboard_trend_stat a FROM dashboard_trend_stat a left join dashboard_domain_dept b on a.lyid = b.dept_id and b.level = 2
WHERE a.is_delete = '0' WHERE a.is_delete = '0'
<if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null"> <if test="startYear != null and startQuarter != null and endYear != null and endQuarter != null">
AND ( AND (
@ -134,7 +136,7 @@
a.quarter a.quarter
ORDER BY ORDER BY
a.lymc, b.sort,
a.year, a.year,
a.quarter a.quarter
</select> </select>

2
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml

@ -930,7 +930,7 @@
and r.is_complaint is not null and r.is_complaint is not null
and r.check_category is not null and r.check_category is not null
and r.bureau_dept_id is not null and r.bureau_dept_id is not null
<if test="params.zone != null and params.zone != ''"> and r.bureau_dept_id in (select dept_id from sys_dept where zone = #{params.zone}) </if>--> <if test="params.zone != null and params.zone != ''"> and r.bureau_dept_id in (select dept_id from sys_dept where zone = #{params.zone}) </if>
<if test="deptId != null and deptId != ''"> <if test="deptId != null and deptId != ''">
and r.bureau_dept_id in (select sd.dept_id from sys_dept sd where sd.area_node = #{deptId} or sd.dept_id = #{deptId}) and r.bureau_dept_id in (select sd.dept_id from sys_dept sd where sd.area_node = #{deptId} or sd.dept_id = #{deptId})
</if> </if>

1596
zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html

File diff suppressed because it is too large

13
zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue

@ -8,7 +8,8 @@
<navbar ref="navbarRef" @set-layout="setLayout" /> <navbar ref="navbarRef" @set-layout="setLayout" />
</div> </div>
<section class="iframe-main"> <section class="iframe-main">
<iframe :src="permissionStore.iframeUrl" class="iframe-full" frameborder="0" /> <iframe v-if="permissionStore.iframeUrl" :src="permissionStore.iframeUrl" class="iframe-full" frameborder="0" />
<router-view v-else class="iframe-full-page" />
</section> </section>
<settings ref="settingRef" /> <settings ref="settingRef" />
</div> </div>
@ -36,6 +37,7 @@ import { useSettingsStore } from '@/store/modules/settings';
import { usePermissionStore } from '@/store/modules/permission'; import { usePermissionStore } from '@/store/modules/permission';
import { initWebSocket } from '@/utils/websocket'; import { initWebSocket } from '@/utils/websocket';
import { initSSE } from '@/utils/sse'; import { initSSE } from '@/utils/sse';
import router from '@/router';
const permissionStore = usePermissionStore(); const permissionStore = usePermissionStore();
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
@ -73,6 +75,9 @@ const settingRef = ref<InstanceType<typeof Settings>>();
onMounted(() => { onMounted(() => {
nextTick(() => { nextTick(() => {
navbarRef.value?.initTenantList(); navbarRef.value?.initTenantList();
if (permissionStore.iframeMode && permissionStore.fullscreenRoute && router.currentRoute.value.path !== permissionStore.fullscreenRoute) {
router.replace(permissionStore.fullscreenRoute);
}
}); });
}); });
@ -158,4 +163,10 @@ const setLayout = () => {
border: none; border: none;
display: block; display: block;
} }
.iframe-full-page {
width: 100%;
min-height: calc(100vh - 50px);
overflow: auto;
}
</style> </style>

25
zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts

@ -240,6 +240,31 @@ export const constantRoutes: RouteRecordRaw[] = [
meta: { title: '普法服务详情', activeMenu: '/supervision/educationServices' } meta: { title: '普法服务详情', activeMenu: '/supervision/educationServices' }
} }
] ]
},
{
path: '/enforcement-code/statistical',
component: Layout,
hidden: true,
children: [
{
path: 'home',
component: () => import('@/views/supervision/statistical/home/index.vue'),
name: 'StatisticalHome',
meta: { title: '首页统计分析', fullscreen: true }
},
{
path: 'city-direct',
component: () => import('@/views/supervision/statistical/city-direct/index.vue'),
name: 'StatisticalCityDirect',
meta: { title: '市直综合分析', fullscreen: true }
},
{
path: 'district-direct',
component: () => import('@/views/supervision/statistical/district-direct/index.vue'),
name: 'StatisticalDistrictDirect',
meta: { title: '各区综合分析', fullscreen: true }
}
]
} }
]; ];

21
zdxt-web-client/zdxt-admin-plus-ui/src/store/modules/permission.ts

@ -20,12 +20,14 @@ export interface SystemCodeOption {
icon: string; icon: string;
/** 当设置了 iframeUrl 时,切换到该选项会以全屏 iframe 展示,而非加载菜单路由 */ /** 当设置了 iframeUrl 时,切换到该选项会以全屏 iframe 展示,而非加载菜单路由 */
iframeUrl?: string; iframeUrl?: string;
/** 当设置了 fullscreenRoute 时,切换到该选项会以全屏 Vue 路由展示 */
fullscreenRoute?: string;
} }
/** 404 兜底路由名称,方便动态移除和重新添加 */ /** 404 兜底路由名称,方便动态移除和重新添加 */
export const CATCH_ALL_ROUTE_NAME = 'CatchAll404'; export const CATCH_ALL_ROUTE_NAME = 'CatchAll404';
export const systemCodeOptions: SystemCodeOption[] = [ export const systemCodeOptions: SystemCodeOption[] = [
{ label: '首页', value: 'planindex', icon: 'HomeFilled', iframeUrl: '/enforcement-code-v1/statistical/home.html' }, { label: '首页', value: 'planindex', icon: 'HomeFilled', fullscreenRoute: '/enforcement-code/statistical/home' },
{ label: '执法监督码', value: 'supervisionCode', icon: 'Document' }, { label: '执法监督码', value: 'supervisionCode', icon: 'Document' },
{ label: '后台管理', value: 'authService', icon: 'Setting' } { label: '后台管理', value: 'authService', icon: 'Setting' }
]; ];
@ -45,9 +47,11 @@ export const usePermissionStore = defineStore('permission', () => {
const savedOption = systemCodeOptions.find((o) => o.value === savedCode); const savedOption = systemCodeOptions.find((o) => o.value === savedCode);
const currentSystemCode = ref<string>(savedCode); const currentSystemCode = ref<string>(savedCode);
/** 当前是否处于 iframe 全屏模式 */ /** 当前是否处于 iframe 全屏模式 */
const iframeMode = ref<boolean>(savedOption?.iframeUrl ? true : false); const iframeMode = ref<boolean>(!!(savedOption?.iframeUrl || savedOption?.fullscreenRoute));
/** 当前 iframe 地址 */ /** 当前 iframe 地址 */
const iframeUrl = ref<string>(savedOption?.iframeUrl || ''); const iframeUrl = ref<string>(savedOption?.iframeUrl || '');
/** 当前全屏 Vue 路由地址 */
const fullscreenRoute = ref<string>(savedOption?.fullscreenRoute || '');
const getRoutes = (): RouteRecordRaw[] => { const getRoutes = (): RouteRecordRaw[] => {
return routes.value as RouteRecordRaw[]; return routes.value as RouteRecordRaw[];
@ -154,16 +158,20 @@ export const usePermissionStore = defineStore('permission', () => {
currentSystemCode.value = systemCode; currentSystemCode.value = systemCode;
sessionStorage.setItem(SYSTEM_CODE_KEY, systemCode); sessionStorage.setItem(SYSTEM_CODE_KEY, systemCode);
const option = systemCodeOptions.find((o) => o.value === systemCode); const option = systemCodeOptions.find((o) => o.value === systemCode);
// 判断是否为 iframe 模式 // 判断是否为全屏模式(iframe 或 Vue 路由)
if (option?.iframeUrl) { if (option?.iframeUrl || option?.fullscreenRoute) {
iframeMode.value = true; iframeMode.value = true;
iframeUrl.value = option.iframeUrl; iframeUrl.value = option.iframeUrl || '';
// iframe 模式下清空侧边栏路由 fullscreenRoute.value = option.fullscreenRoute || '';
setSidebarRouters([]); setSidebarRouters([]);
if (option.fullscreenRoute) {
await router.push(option.fullscreenRoute);
}
return; return;
} }
iframeMode.value = false; iframeMode.value = false;
iframeUrl.value = ''; iframeUrl.value = '';
fullscreenRoute.value = '';
// ====== 彻底清理所有动态路由,保证路由表干净 ====== // ====== 彻底清理所有动态路由,保证路由表干净 ======
// 1. 收集所有静态路由名称(包括子路由) // 1. 收集所有静态路由名称(包括子路由)
@ -230,6 +238,7 @@ export const usePermissionStore = defineStore('permission', () => {
currentSystemCode, currentSystemCode,
iframeMode, iframeMode,
iframeUrl, iframeUrl,
fullscreenRoute,
visibleSystemCodeOptions, visibleSystemCodeOptions,
getRoutes, getRoutes,

16
zdxt-web-client/zdxt-admin-plus-ui/src/utils/request.ts

@ -151,13 +151,19 @@ service.interceptors.response.use(
} }
return Promise.reject('无效的会话,或者会话已过期,请重新登录。'); return Promise.reject('无效的会话,或者会话已过期,请重新登录。');
} else if (code === HttpStatus.SERVER_ERROR) { } else if (code === HttpStatus.SERVER_ERROR) {
ElMessage({ message: msg, type: 'error' }); if (res.config.headers?.silent !== true && res.config.headers?.silent !== 'true') {
ElMessage({ message: msg, type: 'error' });
}
return Promise.reject(new Error(msg)); return Promise.reject(new Error(msg));
} else if (code === HttpStatus.WARN) { } else if (code === HttpStatus.WARN) {
ElMessage({ message: msg, type: 'warning' }); if (res.config.headers?.silent !== true && res.config.headers?.silent !== 'true') {
ElMessage({ message: msg, type: 'warning' });
}
return Promise.reject(new Error(msg)); return Promise.reject(new Error(msg));
} else if (code !== HttpStatus.SUCCESS) { } else if (code !== HttpStatus.SUCCESS) {
ElNotification.error({ title: msg }); if (res.config.headers?.silent !== true && res.config.headers?.silent !== 'true') {
ElNotification.error({ title: msg });
}
return Promise.reject('error'); return Promise.reject('error');
} else { } else {
return Promise.resolve(res.data); return Promise.resolve(res.data);
@ -172,7 +178,9 @@ service.interceptors.response.use(
} else if (message.includes('Request failed with status code')) { } else if (message.includes('Request failed with status code')) {
message = '系统接口' + message.substr(message.length - 3) + '异常'; message = '系统接口' + message.substr(message.length - 3) + '异常';
} }
ElMessage({ message: message, type: 'error', duration: 5 * 1000 }); if (error?.config?.headers?.silent !== true && error?.config?.headers?.silent !== 'true') {
ElMessage({ message: message, type: 'error', duration: 5 * 1000 });
}
return Promise.reject(error); return Promise.reject(error);
} }
); );

12
zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/index.js

@ -4,11 +4,11 @@ import { _get, _post,_form,_delete } from "../../http/index";
let enterpriseAppBaseUrl = "/app-ent"; let enterpriseAppBaseUrl = "/app-ent";
// 企业端用户登录 // 企业端用户登录
export const enterpriseLogin = (params, success, error) => _post(enterpriseAppBaseUrl + "/enterprise/login/siqLogin", params, success, error); export const enterpriseLogin = (params, success, error) => _post(enterpriseAppBaseUrl + "/enterprise/login/siqLoginMock", params, success, error);
export const enterpriseLoginByPassword = (params, success, error) => _post(enterpriseAppBaseUrl + "/login/do", params, success, error); export const enterpriseLoginByPassword = (params, success, error) => _post(enterpriseAppBaseUrl + "/login/do", params, success, error);
// 获取包裹的数据 // 获取深i企鉴权 accessKey / accessSecret
export const siqCode = (params, success, error) => _get(enterpriseAppBaseUrl+"/thirdLogin/getSiqCode",params,success,error); export const siqCode = (params, success, error) => _get(enterpriseAppBaseUrl + "/enterprise/login/getSiqCode", params, success, error);
// 获取用户关联的企业信息 // 获取用户关联的企业信息
@ -82,11 +82,11 @@ export const getDeptList = (params, success, error) => _get("/enforcementcode/vi
//投诉事项列表 //投诉事项列表
export const getComplaintItemList = (params, success, error) => _post(enterpriseAppBaseUrl +"/complaint/listNotComplaint",params,success,error) export const getComplaintItemList = (params, success, error) => _post(enterpriseAppBaseUrl +"/complaint/listNotComplaint",params,success,error)
//深i企登录-暂时没有环境调通 //深i企登录
export const getSiqLoginAuth = (params, success, error) => _post(enterpriseAppBaseUrl +"/thirdLogin/siqLogin",params,success,error); export const getSiqLoginAuth = (params, success, error) => _post(enterpriseAppBaseUrl + "/enterprise/login/siqLogin", params, success, error);
//深i企模拟登录(通过userId模拟) //深i企模拟登录(通过userId模拟)
export const getSiqLoginAuthMock = (params, success, error) => _post(enterpriseAppBaseUrl +"/thirdLogin/siqLoginMock",params,success,error); export const getSiqLoginAuthMock = (params, success, error) => _post(enterpriseAppBaseUrl + "/enterprise/login/siqLoginMock", params, success, error);
//强制生成二维码 //强制生成二维码
export const forceGenerateQrCode = (params, success, error) => _get(enterpriseAppBaseUrl+"/enterpriseInfo/forceGenerateQrCode",params,success,error) export const forceGenerateQrCode = (params, success, error) => _get(enterpriseAppBaseUrl+"/enterpriseInfo/forceGenerateQrCode",params,success,error)

56
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/home/enterpriseHome.vue

@ -109,8 +109,6 @@ const generateRandomNumber = () => {
const getEnterpriseMerchant = (enterpriseNum, phoneNumber) => { const getEnterpriseMerchant = (enterpriseNum, phoneNumber) => {
getEnterpriseMerchantAuthorization({enterpriseNumber: enterpriseNum, merchantTel: phoneNumber}, success => { getEnterpriseMerchantAuthorization({enterpriseNumber: enterpriseNum, merchantTel: phoneNumber}, success => {
//debugger;
//console.log('------------->>>: ', success.data[0].enterpriseNumber)
if (success.data != null && success.data.length > 0) { if (success.data != null && success.data.length > 0) {
useCommon.SET_USER_ENTERPRISE_NUMBER(success.data[0].enterpriseNumber); useCommon.SET_USER_ENTERPRISE_NUMBER(success.data[0].enterpriseNumber);
} }
@ -118,29 +116,31 @@ const getEnterpriseMerchant = (enterpriseNum, phoneNumber) => {
}) })
} }
// 判断用户信息是否已完整(企业端登录后已写入store) /** 登录成功后写入 store(与一期 Home.vue 一致,并补充企业名称/ID) */
const hasUserInfo = () => { const applyLoginResult = (data) => {
return useCommon.userId useCommon.SET_USER_PHONENUMBER(data.phonenumber.toString());
&& useCommon.enterpriseName useCommon.SET_USER_ID(data.userId);
&& useCommon.enterpriseNumber useCommon.SET_USER_ENTERPRISE_NUMBER(data.enterpriseNumber);
&& useCommon.enterpriseId; if (data.enterpriseName) {
}; useCommon.SET_USER_ENTERPRISE_NAME(data.enterpriseName);
}
if (data.enterpriseId) {
useCommon.SET_USER_ENTERPRISE_ID(data.enterpriseId);
}
useCommon.SET_TOKEN(data.token);
useCommon.SET_IS_FIRST_LOAD(false);
if (useCommon.firstLoad) {
isLoading.value = false;
}
getEnterpriseMerchant(data.enterpriseNumber.toString(), data.phonenumber.toString());
}
onMounted(() => { onMounted(() => {
console.log(useCommon.firstLoad); console.log(useCommon.firstLoad);
console.log(useCommon);
isLoading.value = useCommon.firstLoad; isLoading.value = useCommon.firstLoad;
// 如果store中已存在完整的用户和企业信息,则跳过w6s鉴权
if (hasUserInfo()) {
console.log("用户信息已存在,跳过w6s鉴权");
isLoading.value = false;
getEnterpriseMerchant(useCommon.enterpriseNumber.toString(), useCommon.phonenumber.toString());
useCommon.SET_IS_FIRST_LOAD(false);
return;
}
siqCode(null, success => { siqCode(null, success => {
console.log("---> 获取密钥", success);
let access_key = ""; let access_key = "";
let access_secret = ""; let access_secret = "";
if (success.success) { if (success.success) {
@ -167,7 +167,7 @@ onMounted(() => {
console.log("鉴权", res); console.log("鉴权", res);
}).catch((err) => { }).catch((err) => {
console.log("鉴权", err); console.log("鉴权", err);
//getEnterpriseMerchant(useCommon.enterpriseNumber.toString(), useCommon.phonenumber.toString()); getEnterpriseMerchant(useCommon.enterpriseNumber.toString(), useCommon.phonenumber.toString());
}); });
w6s.ready(() => { w6s.ready(() => {
@ -178,22 +178,8 @@ onMounted(() => {
console.log("认证", res); console.log("认证", res);
console.log("code: " + res.result.result.code); console.log("code: " + res.result.result.code);
getSiqLoginAuth({code: res.result.result.code}, success => { getSiqLoginAuth({code: res.result.result.code}, success => {
useCommon.SET_USER_PHONENUMBER(success.data.phonenumber.toString());
useCommon.SET_USER_ID(success.data.userId);
useCommon.SET_USER_ENTERPRISE_NUMBER(success.data.enterpriseNumber);
console.log(success.data); console.log(success.data);
useCommon.SET_TOKEN(success.data.token); applyLoginResult(success.data);
console.log(useCommon.userId);
console.log(useCommon.firstLoad);
if (useCommon.firstLoad) {
isLoading.value = false;
}
//设置已经初始化
useCommon.SET_IS_FIRST_LOAD(false)
getEnterpriseMerchant(success.data.enterpriseNumber.toString(), success.data.phonenumber.toString());
if (useCommon.firstLoad) {
isLoading.value = false;
}
}, error => { }, error => {
console.log("error : " + error) console.log("error : " + error)
}) })

Loading…
Cancel
Save