From 0447185d21e8cc45f45c0eee02c319e5b891a1a1 Mon Sep 17 00:00:00 2001 From: shil <452061493@qq.com> Date: Fri, 12 Jun 2026 16:24:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?siq=20=E5=AF=B9=E6=8E=A5=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppEnterpriseLoginController.java | 37 +- .../StatisticalPanelController.java | 6 +- .../IAppEnterpriseLoginService.java | 7 + .../impl/AppEnterpriseLoginServiceImpl.java | 106 +- .../StatisticalPanelMapper.xml | 2 +- .../enforcement-code-v1/statistical/home.html | 1596 +---------------- .../zdxt-admin-plus-ui/src/layout/index.vue | 13 +- .../zdxt-admin-plus-ui/src/router/index.ts | 25 + .../src/store/modules/permission.ts | 21 +- .../zdxt-admin-plus-ui/src/utils/request.ts | 16 +- .../src/api/enterprise/index.js | 12 +- .../views/enterprise/home/enterpriseHome.vue | 56 +- 12 files changed, 215 insertions(+), 1682 deletions(-) diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEnterpriseLoginController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEnterpriseLoginController.java index ef1b97c6..c642b0c1 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEnterpriseLoginController.java +++ b/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 lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.springframework.beans.factory.annotation.Autowired; 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.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.HashMap; import java.util.Map; /** @@ -27,17 +28,43 @@ import java.util.Map; @RequestMapping("/app-ent/enterprise/login") public class AppEnterpriseLoginController { - @Autowired - private IAppEnterpriseLoginService appEnterpriseLoginService; + private final IAppEnterpriseLoginService appEnterpriseLoginService; /** - * 企业端用户登录(深i企) + * 获取深i企鉴权所需的 accessKey / accessSecret + */ + @SaIgnore + @ApiResponse(description = "获取深i企 accessKey / accessSecret") + @GetMapping("/getSiqCode") + public R> getSiqCode() { + String accessKey = "6374106c5eb449a4ad6c2430f30796e6"; + String accessSecret = "434fec85aa5846e88bbeb8fac6cf6d7f"; + Map result = new HashMap<>(); + result.put("accessKey", accessKey); + result.put("accessSecret", accessSecret); + return R.ok("获取成功", result); + } + + /** + * 企业端用户登录(深i企) */ @SaIgnore @ApiResponse(description = "企业端-用户登录(深i企)") @PostMapping("/siqLogin") - public R> siqLogin(@RequestBody AppEnterpriseLoginBo bo){ + public R> siqLogin(@RequestBody AppEnterpriseLoginBo bo) { + System.out.println("接收到登录请求"); Map result = appEnterpriseLoginService.siqLogin(bo); return R.ok("登录成功", result); } + + /** + * 深i企模拟登录(开发/联调) + */ + @SaIgnore + @ApiResponse(description = "企业端-深i企模拟登录") + @PostMapping("/siqLoginMock") + public R> siqLoginMock(@RequestBody AppEnterpriseLoginBo bo) { + Map result = appEnterpriseLoginService.siqLoginMock(bo); + return R.ok("登录成功", result); + } } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java index 3f7126f7..5898fa2a 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java @@ -285,15 +285,15 @@ public class StatisticalPanelController { Map resMap = new HashMap(); SysDeptBo deptParams = new SysDeptBo(); deptParams.setZone(2); - deptParams.setDeptName(LoginHelper.getDeptName()); - deptParams.setDeptId(LoginHelper.getDeptId()); + // deptId 入参传区名称,如「光明区」 + deptParams.setDeptName(params.getDeptId()); List depts = sysDeptService.selectDepts(deptParams); if (depts == null || depts.isEmpty()) { return R.fail("未找到相关部门信息"); } - params.setDeptId(depts.get(0).getDeptId()); + params.setDeptId(String.valueOf(depts.get(0).getDeptId())); resMap.put("area", deptParams.getDeptName()); diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java index 6fb1dd1c..cbfec316 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java +++ b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/IAppEnterpriseLoginService.java @@ -18,4 +18,11 @@ public interface IAppEnterpriseLoginService { * @return 登录结果,包含token和用户信息 */ Map siqLogin(AppEnterpriseLoginBo bo); + + /** + * 深I企模拟登录(开发/联调) + * @param bo 登录参数 + * @return 登录结果,包含token和用户信息 + */ + Map siqLoginMock(AppEnterpriseLoginBo bo); } diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseLoginServiceImpl.java b/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseLoginServiceImpl.java index d15354f1..ba31aaed 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseLoginServiceImpl.java +++ b/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.utils.DateUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.mapper.SysUserPostMapper; import org.dromara.system.mapper.SysUserRoleMapper; +import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -46,6 +46,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; +import java.util.concurrent.TimeUnit; /** @@ -107,34 +108,50 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService @Autowired RuoYiConfig ruoYiConfig; - @Value("${siq.mock.enabled:false}") - private boolean mockEnabled; - /** - * 深i企用户登录并自动注册(带分布式锁防重) + * 深i企用户登录并自动注册(带分布式锁防重,流程与一期 thirdLogin/siqLogin 一致) * * @param bo 登录参数 * @return 登录结果,包含token和用户信息 */ @Override public Map 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企登录测试"); - userInfo = getMockSiqUserInfo(bo.getCode()); - } else { - userInfo = siqLoginInfo(bo); + /** + * 深i企模拟登录(开发/联调) + */ + @Override + public Map 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"); - - String lockKey = "siq_login_lock:" + siqUserId; + /** + * 加锁后完成用户注册、企业关联并签发 token + */ + private Map doSiqLoginWithLock(JSONObject userInfo) { + String lockKey = resolveLoginLockKey(userInfo); + RLock lock = redissonClient.getLock("siq_login_lock:" + lockKey); + boolean locked = false; 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); - EnterpriseInformation enterpriseInformation = addSiqUserCompany(userInfo, newUser); if (newUser != null && enterpriseInformation != null) { @@ -142,26 +159,49 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService } String token = generateToken(newUser, enterpriseInformation); - - Map 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; - + return buildLoginResult(newUser, enterpriseInformation, token); + } catch (BaseException e) { + throw e; + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new BaseException("登录处理被中断"); } catch (Exception e) { log.error("深i企登录处理异常: lockKey={}", lockKey, e); 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 buildLoginResult(EnterpriseUser newUser, + EnterpriseInformation enterpriseInformation, + String token) { + Map 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; + } + /** * 保存或更新企业用户信息 *

@@ -250,16 +290,18 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService public JSONObject siqLoginInfo(AppEnterpriseLoginBo bo) { try { Map params = new HashMap<>(); - + log.info("调用深i企登录接口,参数: {}", bo); String accessKeySign = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, bo.getCode()); params.put("accessKeySign", accessKeySign); params.put("appCode", code); + log.info("调用深i企登录接口,参数加密后: {}", params); String data = HttpUtil.httpSendPost( siqUrl + ApiConstants.API_SIQUSERLOGIN, JSONObject.toJSONString(params), new HashMap<>() ); + log.info("调用深i企登录接口响应: {}", data); JSONObject jsonObject = JSONObject.parseObject(data); JSONObject userInfo = jsonObject.getJSONObject("data"); @@ -269,7 +311,7 @@ public class AppEnterpriseLoginServiceImpl implements IAppEnterpriseLoginService throw new BaseException("深i企接口返回数据异常"); } - log.debug("深i企登录返回用户信息: userId={}", userInfo.getString("userId")); + log.info("解析深i企登录接口响应成功,用户信息: {}", userInfo); return userInfo; } catch (BaseException e) { diff --git a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml b/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml index afb9e271..4a723cfa 100644 --- a/zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml +++ b/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.check_category is not null and r.bureau_dept_id is not null - and r.bureau_dept_id in (select dept_id from sys_dept where zone = #{params.zone}) --> + and r.bureau_dept_id in (select dept_id from sys_dept where zone = #{params.zone}) and r.bureau_dept_id in (select sd.dept_id from sys_dept sd where sd.area_node = #{deptId} or sd.dept_id = #{deptId}) diff --git a/zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html b/zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html index ac9d0046..a4fa0e63 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html +++ b/zdxt-web-client/zdxt-admin-plus-ui/public/enforcement-code-v1/statistical/home.html @@ -1,1594 +1,12 @@ - - + + - - -首页--执法监督码执法监督 - - - - - - - - - - - - + + + 跳转中... + - -

-
-
-

行政执法

-
-
- -
00.0%
-
-
- - - 0.0% - -
-
- - - 0.0% - -
-
-
-
- -
00.0%
-
-
- - - 0.0% - -
-
- - - 0.0% - -
-
-
-
- - -
0
-
-
- - - 0.0% - -
-
- - - 0.0% - -
-
-
-
- -
0
-
-
0.0%
-
-
-
-
-
-
-
-
-

非行政执法

-
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
- - 0
-
-
-
-
-
-
-
深圳市 - - - -
-
- - -
-
-
- -
-
-
0
-
(市直:-各区:0)
-
-
-
-
- -
-
-
0
-
(市直:-各区:0)
-
-
-
- -
-
-
-

涉企执法趋势

- -
- - -
- -
-
-
-
- - - - +

页面已迁移为 Vue 组件,正在跳转...

diff --git a/zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue b/zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue index df5be93b..6b11de6c 100644 --- a/zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue +++ b/zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue @@ -8,7 +8,8 @@
-