Compare commits

...

47 Commits
master ... dev

Author SHA1 Message Date
wangmingyong@163.com c5180da9a3 加上权限判断 7 hours ago
wangmingyong@163.com ba878a721f 隐藏法律查询 7 hours ago
vincent bdcee61c21 Merge branch 'dev-V1.10.0' into dev 8 hours ago
vincent 10e5170781 市监同步脚本 8 hours ago
wangmingyong@163.com f22228d99a 对应搜索字段调整 15 hours ago
vincent ddaa2fe1de Merge remote-tracking branch 'origin/dev-V1.10.0' into dev 15 hours ago
wangmingyong@163.com 95efc5506c 接口调整 15 hours ago
niujiyi f3c7dcdc25 cim-接口修改 3 days ago
niujiyi 2f697a6f2d cim-报表 3 days ago
niujiyi ee8a0f1a1e 监督端-报表增加排序,参数修改 4 days ago
niujiyi f70c906215 监督端-报表增加排序,参数修改 4 days ago
niujiyi 94cb09808e 监督端-报表增加排序,参数修改 4 days ago
niujiyi d0672bb8ae cim-修改 4 days ago
vincent e8c0cf71d4 优化了市认证数据同步 4 days ago
niujiyi f5a702e839 cim-修改 4 days ago
vincent 8a55ae459c 定时任务同步 5 days ago
niujiyi a78a8f7b88 Merge remote-tracking branch 'origin/dev-V1.10.0' into dev-V1.10.0 5 days ago
niujiyi c92945c74a cim-修改,监督端-修改 5 days ago
wangmingyong@163.com 4e2e53e4bd Merge branch 'dev-V1.10.0' of http://146.56.199.25:3000/zhuibobo/EnforcementCode-2.0 into dev-V1.10.0 5 days ago
wangmingyong@163.com efce66cf28 首页调整 5 days ago
niujiyi 7d95ed99c5 cim-修改,监督端-修改 5 days ago
vincent bcecc3e86d 生产环境短信配置 5 days ago
vincent 38150d672c 修改了短信的相关配置 6 days ago
wangmingyong@163.com ca7f30910d 页面调整 6 days ago
wangmingyong@163.com f02ca3b766 监督端首页 7 days ago
vincent 6c8dfad86a 修改了站内信相关地址 1 week ago
wangmingyong@163.com 15e461db2d 生产环境的配置 1 week ago
niujiyi ed0080dd97 Merge remote-tracking branch 'origin/dev' into dev 1 week ago
niujiyi ad85e800d7 企业端-民生诉求接口 1 week ago
vincent 158218074b Merge branch 'dev-V1.10.0' into dev 1 week ago
wangmingyong@163.com 4aa8c99940 Merge branch 'dev-V1.10.0' of http://146.56.199.25:3000/zhuibobo/EnforcementCode-2.0 into dev-V1.10.0 1 week ago
wangmingyong@163.com 4f43b434a4 bug修复 1 week ago
niujiyi 91b16fa86e cim-执法人员,执法单位 1 week ago
niujiyi a4f9413055 cim-执法人员,执法单位 1 week ago
wangmingyong@163.com 62432639e1 历史执法信息加上非行政执法 1 week ago
niujiyi da0acbe30d Merge remote-tracking branch 'origin/dev-V1.10.0' into dev-V1.10.0 2 weeks ago
niujiyi f61f8ae3d2 移动监督端-接口,企业端-查询非行政修改 2 weeks ago
wangmingyong@163.com 05ebde3db1 新增非行政列表 2 weeks ago
vincent ca428086ea 修改了开发环境redis配置 2 weeks ago
wangmingyong@163.com 2e22a52663 Merge branch 'dev-V1.10.0' of http://146.56.199.25:3000/zhuibobo/EnforcementCode-2.0 into dev-V1.10.0 2 weeks ago
wangmingyong@163.com 05d9a57e45 表格接口调试 2 weeks ago
niujiyi 6844bd589c 监督端-态势趋势修改 2 weeks ago
niujiyi 109233ed1c 监督端-领域修改 2 weeks ago
niujiyi 308098dfb6 监督端-重点企业导出修改 2 weeks ago
vincent cb579a604f Merge branch 'dev' into dev-V1.10.0 2 weeks ago
wangmingyong@163.com f7b6b4af5c Merge branch 'dev-V1.10.0' of http://146.56.199.25:3000/zhuibobo/EnforcementCode-2.0 into dev-V1.10.0 2 weeks ago
wangmingyong@163.com cb12de8ca8 接口调试 2 weeks ago
  1. 23
      script/sql/vincent/shjjian.sql
  2. 5
      script/sql/zfjd-refactoring-v1/其他/njy/2026-1.10.0.sql
  3. 1
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/util/ZwSmsClient.java
  4. 1
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfNoticeInfoController.java
  5. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEntNonEnforcementRegistrationController.java
  6. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppNoticeInfoController.java
  7. 13
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewController.java
  8. 70
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewDataSumController.java
  9. 14
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewJobController.java
  10. 26
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/CommonController.java
  11. 3
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelCityController.java
  12. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelController.java
  13. 6
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/SysNoticeInfoController.java
  14. 63
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/move/MoveSupervisionController.java
  15. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/RegistrationController.java
  16. 18
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsComplaintController.java
  17. 10
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java
  18. 10
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/ScanDataSituationBo.java
  19. 11
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/CimDashboardOverviewVo.java
  20. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/handler/ApiSignInterceptor.java
  21. 22
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/CimDashboardOverviewMapper.java
  22. 30
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CimPersonUnitMonthDataSumJob.java
  23. 6
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SrzDeptOriginalDataJob.java
  24. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SrzUserOriginalDataJob.java
  25. 62
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynDeptInfoJob.java
  26. 161
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java
  27. 17
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/LawEnfOfficerSericeImpl.java
  28. 21
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/ScanDataSituationServiceImpl.java
  29. 37
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ICimDashboardOverviewDataSumService.java
  30. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ICimDashboardOverviewService.java
  31. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IComplaintStatisticsService.java
  32. 12
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IMoveSupervisionService.java
  33. 2
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ISysApiPlatformConfigService.java
  34. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseComplaintServiceImpl.java
  35. 192
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CimDashboardOverviewDataSumSserviceImpl.java
  36. 19
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CimDashboardOverviewServiceImpl.java
  37. 7
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/ComplaintStatisticsServiceImpl.java
  38. 82
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/MoveSupervisionServiceImpl.java
  39. 4
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/StatisticalPaneServiceCityImpl.java
  40. 31
      zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysApiPlatformConfigServiceImpl.java
  41. 412
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/CimDashboardOverviewMapper.xml
  42. 9
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardEnterpriseCheckMapper.xml
  43. 102
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardHighCheckEntdetailsAreaMapper.xml
  44. 4
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardSituationTrendAreaMapper.xml
  45. 4
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardSituationTrendDomainMapper.xml
  46. 10
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/LawEnfOfficerMapper.xml
  47. 55
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/ScanDataSituationMapper.xml
  48. 184
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SrzDeptMapper.xml
  49. 184
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SrzUserMapper.xml
  50. 62
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelCityMapper.xml
  51. 10
      zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelMapper.xml
  52. 7
      zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  53. 4
      zdxt-web-client/zdxt-admin-plus-ui/.env.production
  54. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/enterprises-inspected-noft.ts
  55. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration-statistics.ts
  56. 17
      zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration.ts
  57. 31
      zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-complaint.ts
  58. 16
      zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts
  59. 6
      zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/AppMain.vue
  60. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/layout/index.vue
  61. 10
      zdxt-web-client/zdxt-admin-plus-ui/src/router/index.ts
  62. 31
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/enterprises_inspected_noft/index.vue
  63. 73
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration/indexList.vue
  64. 36
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration_statistics/index.vue
  65. 126
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue
  66. 69
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue
  67. 112
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/high-frequency/components/FreqPane.vue
  68. 80
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/inspection-registration/components/StatPane.vue
  69. 110
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/key-enterprise/index.vue
  70. 194
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-district/index.vue
  71. 112
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-enforcer/index.vue
  72. 267
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-field/index.vue
  73. 76
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/situation-trend/components/SituationPane.vue
  74. 75
      zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/trend-behavior/components/TrendPane.vue
  75. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/home/index.vue
  76. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/nos/add.vue
  77. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/add.vue
  78. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/detail.vue
  79. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/draft.vue
  80. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/edit.vue
  81. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/index.vue
  82. 2
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/repost.vue
  83. 68
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/city-direct/index.vue
  84. 4
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/components/TopSixMetrics.vue
  85. 26
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/home/index.vue
  86. 5
      zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/styles/analysis-scope.css
  87. 10
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue
  88. 18
      zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/nos/nosDetail.vue
  89. 6
      zdxt-web-client/zdxt-efcode-enterprise-app/src/api/enterprise/index.js
  90. 8
      zdxt-web-client/zdxt-efcode-enterprise-app/src/components/enterprise/footerNav.vue
  91. 337
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementEvaluateDetail.vue
  92. 22
      zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementRegistrationList.vue
  93. 10
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml
  94. 6
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml
  95. 6
      zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml

23
script/sql/vincent/shjjian.sql

@ -0,0 +1,23 @@
-- MySQL 建表语句
CREATE TABLE `sj_indiv_credit_rating_info` (
`sccode` VARCHAR(1020) DEFAULT NULL COMMENT '统一社会信用代码',
`entname` VARCHAR(1020) DEFAULT NULL COMMENT '个体工商户名称',
`creditlevel` VARCHAR(1020) DEFAULT NULL COMMENT '信用评价等级',
`id` INT NOT NULL COMMENT '非业务主键',
`add_time` DATETIME DEFAULT NULL COMMENT '新增时间,业务表数据首次创建时间',
`cd_operation` VARCHAR(40) DEFAULT NULL COMMENT '增量标识,业务表数据新增时值为I,修改时值为U,删除时值为D',
`cd_time` DATETIME DEFAULT NULL COMMENT '最后变更时间,表示业务表数据发生修改的时间,第一次新增则与新增时间一致',
`cd_batch` VARCHAR(200) DEFAULT NULL COMMENT '批次号,批次号按照数据日期+数据序号方式制定,数据日期是指更新数据的日期,如20180715,数据序号为5位数字,每天从00001开始,当天数据序号递增',
`ins` DECIMAL(22,0) DEFAULT NULL COMMENT '系统内部INS',
`seq` DECIMAL(22,0) DEFAULT NULL COMMENT '系统内部SEQ',
`updatestatus` DECIMAL(22,0) DEFAULT NULL COMMENT '系统内部UPDATESTATUS',
`updatetime` VARCHAR(200) DEFAULT NULL COMMENT '系统内部UPDATETIME',
`byzd01` VARCHAR(800) DEFAULT NULL COMMENT '备用字段01',
`byzd02` VARCHAR(800) DEFAULT NULL COMMENT '备用字段02',
`create_dept` VARCHAR(64) DEFAULT NULL COMMENT '创建人部门',
`create_by` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_by` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

5
script/sql/zfjd-refactoring-v1/其他/njy/2026-1.10.0.sql

@ -112,3 +112,8 @@ ALTER TABLE dashboard_trend_stat_domain ADD thirdTime varchar(100) NULL COMMENT
ALTER TABLE dashboard_trend_stat_domain CHANGE thirdTime thirdTime varchar(100) NULL COMMENT '三季度时间' AFTER thirdQuarter;
ALTER TABLE dashboard_trend_stat_domain ADD fourthTime varchar(100) NULL COMMENT '四季度时间';
ALTER TABLE dashboard_trend_stat_domain CHANGE fourthTime fourthTime varchar(100) NULL COMMENT '四季度时间' AFTER fourthQuarter;
ALTER TABLE dashboard_area_info ADD area_code varchar(100) NULL COMMENT '行政区编码';
ALTER TABLE dashboard_area_info CHANGE area_code area_code varchar(100) NULL COMMENT '行政区编码' AFTER name;

1
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/common/util/ZwSmsClient.java

@ -126,6 +126,7 @@ public class ZwSmsClient {
for (int i = 0; i < paramNames.length; i++) {
call.addParameter(paramNames[i], org.apache.axis.encoding.XMLType.XSD_STRING, ParameterMode.IN);
}
log.info("短信平台调用开始,operation={},参数:{}", operation.getLocalPart(), StringUtils.join(args, ", "));
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
String result = (String) call.invoke(args);
log.info("短信平台调用完成,operation={},返回:{}", operation.getLocalPart(), result);

1
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enforcement/AppEnfNoticeInfoController.java

@ -55,6 +55,7 @@ public class AppEnfNoticeInfoController extends BaseController {
// @SaCheckPermission("enforcementcode:noticeInfo:list")
@GetMapping("/list")
public TableDataInfo<SysNoticeInfoVo> list(SysNoticeInfoBo bo, PageQuery pageQuery) {
bo.setStatus(2);
return sysNoticeInfoService.queryPageList(bo, pageQuery);
}

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppEntNonEnforcementRegistrationController.java

@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.R;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@ -34,6 +35,7 @@ public class AppEntNonEnforcementRegistrationController {
*/
@GetMapping("/list")
public TableDataInfo<NonEnforcementRegistrationVo> list(NonEnforcementRegistrationBo bo, PageQuery pageQuery) {
bo.setEnterpriseNumber(LoginHelper.getDeptId());
return enforcementRegistrationService.queryPageList(bo, pageQuery);
}

7
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/app/enterprise/AppNoticeInfoController.java

@ -55,6 +55,7 @@ public class AppNoticeInfoController extends BaseController {
*/
@GetMapping("/list")
public TableDataInfo<SysNoticeInfoVo> list(SysNoticeInfoBo bo, PageQuery pageQuery) {
bo.setStatus(Integer.valueOf(2));
return sysNoticeInfoService.queryPageList(bo, pageQuery);
}
@ -74,7 +75,7 @@ public class AppNoticeInfoController extends BaseController {
/**
* 新增系统公告信息主
*/
@Log(title = "系统公告信息主", businessType = BusinessType.INSERT)
// @Log(title = "系统公告信息主", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SysNoticeInfoBo bo) {
@ -84,7 +85,7 @@ public class AppNoticeInfoController extends BaseController {
/**
* 修改系统公告信息主
*/
@Log(title = "系统公告信息主", businessType = BusinessType.UPDATE)
// @Log(title = "系统公告信息主", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysNoticeInfoBo bo) {
@ -96,7 +97,7 @@ public class AppNoticeInfoController extends BaseController {
*
* @param ids 主键串
*/
@Log(title = "系统公告信息主", businessType = BusinessType.DELETE)
// @Log(title = "系统公告信息主", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] ids) {

13
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewController.java

@ -15,6 +15,7 @@ import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
@ -58,6 +59,15 @@ public class CimDashboardOverviewController {
return R.ok(vo);
}
/**
* Cim大屏-大屏总览 查询各区执法人员数据,企业数量,执法单位数量
*/
@GetMapping("/getAreaCount")
public R<Map<String,Object>> getAreaCount(CimDashboardOverviewQueryBo bo){
return R.ok(cimDashboardOverviewService.getAreaCount(bo));
}
/**
* Cim大屏-大屏总览 查询 单独部门执法-联合执法-被执法企业-入企压减率-执法人员数-执法单位数
* (实)
@ -87,8 +97,7 @@ public class CimDashboardOverviewController {
if (xzzfCount == null || xzzfCount == 0) {
vo.setRqyjl(BigDecimal.ZERO);
} else {
vo.setRqyjl(BigDecimal.valueOf(xzzfCount - (lhzfsCount + ddbmzfCount))
.divide(BigDecimal.valueOf(xzzfCount), 4, RoundingMode.HALF_UP));
vo.setRqyjl(BigDecimal.valueOf(xzzfCount - (lhzfsCount + ddbmzfCount)));
}
return R.ok(vo);
}

70
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewDataSumController.java

@ -43,12 +43,44 @@ public class CimDashboardOverviewDataSumController {
* @return
*/
@GetMapping("/getDashboardOverviewMonthDataSum")
public R<List<CimDashboardOverviewVo>> getDashboardOverviewMonthDataSum() {
public R<Map<String,Object>> getDashboardOverviewMonthDataSum(CimDashboardOverviewQueryBo bo) {
//查询大屏总览数据(月度)
List<CimDashboardOverviewVo> vo= cimDashboardOverviewDataSumService.getDashboardOverviewMonthDataSum();
return R.ok(vo);
Map<String,Object> map= cimDashboardOverviewDataSumService.getDashboardOverviewMonthDataSum(bo);
return R.ok(map);
}
/**
* 企业数量
* @return
*/
@GetMapping("/getDashboardOverviewMonthDataEntSum")
public R<Map<String,Object>> getDashboardOverviewMonthDataEntSum(CimDashboardOverviewQueryBo bo) {
//查询大屏总览数据(月度)
Map<String,Object> map= cimDashboardOverviewDataSumService.getDashboardOverviewMonthDataSum(bo);
return R.ok(map);
}
/**
* 执法人员-执法单位
* @return
*/
@GetMapping("/getDashboardOverviewMonthDataPenUnitSum")
public R<Map<String,Object>> getDashboardOverviewMonthDataPenUnitSum(CimDashboardOverviewQueryBo bo) {
//查询大屏总览数据(月度)
Map<String,Object> map= cimDashboardOverviewDataSumService.getDashboardOverviewMonthDataSum(bo);
return R.ok(map);
}
/**
* Cim-大屏总览 按区域查询 计划总数-预告总数-涉企执法总数-检查评价总数-检查投诉总数-平均检查频次
* @param bo
* @return
*/
@GetMapping("/getDashboardOverviewAreaMonthDataSum")
public R<CimDashboardOverviewVo> getDashboardOverviewAreaMonthDataSum(CimDashboardOverviewQueryBo bo){
CimDashboardOverviewVo vo= cimDashboardOverviewDataSumService.getDashboardOverviewAreaMonthDataSum(bo);
return R.ok(vo);
}
/**
* Cim-大屏总览-区域月数据汇总-企业数量-执法单位数-执法人员数
@ -66,9 +98,9 @@ public class CimDashboardOverviewDataSumController {
* @return
*/
@GetMapping("/getHighCheckAreaMonthDataSumMap")
public R<Map<String,Object>> getHighCheckAreaMonthDataSumMap() {
public R<Map<String,Object>> getHighCheckAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
// 查询数据
return R.ok(cimDashboardOverviewDataSumService.getHighCheckAreaMonthDataSumMap());
return R.ok(cimDashboardOverviewDataSumService.getHighCheckAreaMonthDataSumMap(bo));
}
@ -132,8 +164,18 @@ public class CimDashboardOverviewDataSumController {
* */
@GetMapping("/getTrendAreaMonthDataSumMap")
public R<Map<String,Object>> getTrendAreaMonthDataSumMap() {
return R.ok(cimDashboardOverviewDataSumService.getTrendAreaMonthDataSumMap());
public R<Map<String,Object>> getTrendAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
return R.ok(cimDashboardOverviewDataSumService.getTrendAreaMonthDataSumMap(bo));
}
/**
* 下转联动某个区域查询对应区域街道的数据
* @param bo
* @return
*/
@GetMapping("/getAreaQuarterlyRegionList")
public R<List<CimDashboardOverviewVo>> getAreaQuarterlyRegionList(CimDashboardOverviewQueryBo bo) {
return R.ok(cimDashboardOverviewDataSumService.getAreaQuarterlyRegionList(bo));
}
/**
@ -143,8 +185,18 @@ public class CimDashboardOverviewDataSumController {
* */
@GetMapping("/getTrendFieldMonthDataSumMap")
public R<Map<String,Object>> getTrendFieldMonthDataSumMap() {
return R.ok(cimDashboardOverviewDataSumService.getTrendFieldMonthDataSumMap());
public R<Map<String,Object>> getTrendFieldMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
return R.ok(cimDashboardOverviewDataSumService.getTrendFieldMonthDataSumMap(bo));
}
/**
* 下转联动某个区域查询对应区域领域的数据(季度)
* @param bo
* @return
*/
@GetMapping("/getAreaDomainQuarterList")
public R<List<CimDashboardOverviewVo>> getAreaDomainQuarterList(CimDashboardOverviewQueryBo bo) {
return R.ok(cimDashboardOverviewDataSumService.getAreaDomainQuarterList(bo));
}
}

14
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/cim/CimDashboardOverviewJobController.java

@ -40,6 +40,20 @@ public class CimDashboardOverviewJobController {
cimDashboardOverviewDataSumService.getMonthDataSum();
return R.ok();
}
/**
* Cim-大屏总览
* 执法监管
*月度数据
* 按区域统计执法人员数-执法单位数-企业总数
* @param
* @return
*/
@GetMapping("/getAreaMonthDataSum")
public R<Void> getAreaMonthDataSum(){
//模拟测试定时任务插入新数据(月度)
cimDashboardOverviewDataSumService.getAreaMonthDataSum();
return R.ok();
}

26
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/CommonController.java

@ -36,19 +36,19 @@ public class CommonController extends BaseController {
*
*
*/
@GetMapping("/sendSms")
public R<String> sendSmsTest() {
String content = "【测试短信】尊敬的用户,您有一条执法预约提醒信息,请查收。";
String phone = "13751146725";
try {
String result = zwSmsClient.sendMessage(phone, content);
log.info("测试短信发送完成,phone={},平台返回:{}", phone, result);
return R.ok("发送成功", result);
} catch (Exception e) {
log.error("测试短信发送失败,phone={}", phone, e);
return R.fail("短信发送失败:" + e.getMessage());
}
}
// @GetMapping("/sendSms")
// public R<String> sendSmsTest() {
// String content = "【测试短信】尊敬的用户,您有一条执法预约提醒信息,请查收。";
// String phone = "13751146725";
// try {
// String result = zwSmsClient.sendMessage(phone, content);
// log.info("测试短信发送完成,phone={},平台返回:{}", phone, result);
// return R.ok("发送成功", result);
// } catch (Exception e) {
// log.error("测试短信发送失败,phone={}", phone, e);
// return R.fail("短信发送失败:" + e.getMessage());
// }
// }
/**
* 直接发送站内信(内容写死,用于联调测试)

3
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/StatisticalPanelCityController.java

@ -65,9 +65,10 @@ public class StatisticalPanelCityController {
/** 监督端-市数据 */
@SaIgnore
@PostMapping("/collectStatistics")
@ResponseBody
public R<Map<String, Object>> analysisLawUnion(@RequestBody SixAnalysisParamsBo params){
public R<Map<String, Object>> analysisLawUnion( SixAnalysisParamsBo params){
// 全市行政检查数量
Map<String, Object> resMap = statisticalPaneCityService.collectStatistics(params);
return R.ok("联合检查", resMap);

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

@ -42,6 +42,7 @@ public class StatisticalPanelController {
*
* @param params
* */
@SaIgnore
@PostMapping("/analysisEnterprisesCoordination")
@ResponseBody
public R<Map<String,Object>> analysisEnterprisesCoordination(@RequestBody(required = false) SixAnalysisParamsBo params){
@ -210,6 +211,7 @@ public class StatisticalPanelController {
}
/** 监督端-行政时间维度 */
@SaIgnore
@PostMapping("/analysisTime")
@ResponseBody
public R <Map<String,Object>> analysisEnterprisesInsTime(@RequestBody SixAnalysisParamsBo params){

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

@ -50,7 +50,7 @@ public class SysNoticeInfoController extends BaseController {
* 导出系统公告信息主列表
*/
@SaCheckPermission("enforcementcode:noticeInfo:export")
@Log(title = "系统公告信息主", businessType = BusinessType.EXPORT)
// @Log(title = "系统公告信息主", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SysNoticeInfoBo bo, HttpServletResponse response) {
List<SysNoticeInfoVo> list = sysNoticeInfoService.queryList(bo);
@ -71,7 +71,7 @@ public class SysNoticeInfoController extends BaseController {
/**
* 新增系统公告信息主
*/
@Log(title = "系统公告信息主", businessType = BusinessType.INSERT)
// @Log(title = "系统公告信息主", businessType = BusinessType.INSERT)
@PostMapping("/add")
public R<Void> add(@RequestBody SysNoticeInfoBo bo) {
return toAjax(sysNoticeInfoService.insertByBo(bo));
@ -80,7 +80,7 @@ public class SysNoticeInfoController extends BaseController {
/**
* 修改系统公告信息主
*/
@Log(title = "系统公告信息主", businessType = BusinessType.UPDATE)
// @Log(title = "系统公告信息主", businessType = BusinessType.UPDATE)
@PostMapping("/edit")
public R<Void> edit(@RequestBody SysNoticeInfoBo bo) {
return toAjax(sysNoticeInfoService.updateByBo(bo));

63
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/move/MoveSupervisionController.java

@ -0,0 +1,63 @@
package com.zdxt.enforcementcode.controller.web.supervision.move;
import cn.dev33.satoken.annotation.SaIgnore;
import com.zdxt.enforcementcode.domain.bo.DashboardTrendStatQueryBo;
import com.zdxt.enforcementcode.domain.vo.DashboardSituationAreaVo;
import com.zdxt.enforcementcode.domain.vo.DashboardSituationDomainVo;
import com.zdxt.enforcementcode.service.IDashboardSituationTrendAreaService;
import com.zdxt.enforcementcode.service.IDashboardSituationTrendDomainService;
import com.zdxt.enforcementcode.service.IMoveSupervisionService;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.domain.R;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
/**
* 移动监督端
*/
@SaIgnore
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/move/supervision")
public class MoveSupervisionController {
private final IMoveSupervisionService moveSupervisionService;
private final IDashboardSituationTrendAreaService dashboardSituationTrendAreaService;
private final IDashboardSituationTrendDomainService situationTrendDomainService;
/**
* 移动监督端指标
* @return
*/
@GetMapping("/OverviewLawEnforcementMap")
public R<Map<String,Object>> OverviewLawEnforcementMap(){
return R.ok(moveSupervisionService.OverviewLawEnforcementMap());
}
/**
* 区域-各区风险态势分布
*/
@GetMapping("/querySituationTrendAreaList")
public R<List<DashboardSituationAreaVo>> querySituationTrendAreaList(@Validated DashboardTrendStatQueryBo bo) {
List<DashboardSituationAreaVo> list = dashboardSituationTrendAreaService.querySituationTrendAreaList(bo);
return R.ok(list);
}
/**
* 查询态势趋势分析-领域统计列表
*/
@GetMapping("/querySituationTrendDomainList")
public R<List<DashboardSituationDomainVo>> querySituationTrendDomainList(@Validated DashboardTrendStatQueryBo bo) {
List<DashboardSituationDomainVo> list = situationTrendDomainService.querySituationTrendDomainList(bo);
return R.ok(list);
}
}

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/RegistrationController.java

@ -2,6 +2,7 @@ package com.zdxt.enforcementcode.controller.web.supervision.report;
import cn.dev33.satoken.annotation.SaIgnore;
import com.zdxt.enforcementcode.domain.bo.EnforcementRegistrationBo;
import com.zdxt.enforcementcode.domain.vo.ComplaintStatisticsVo;
import com.zdxt.enforcementcode.domain.vo.EnforcementRegistrationVo;
import com.zdxt.enforcementcode.domain.vo.report.ChartDataVo;
import com.zdxt.enforcementcode.domain.vo.report.RegistrationAnalysisVo;
@ -9,6 +10,7 @@ import com.zdxt.enforcementcode.domain.vo.report.RegistrationExportVo;
import com.zdxt.enforcementcode.domain.vo.report.RegistrationExportV2Vo;
import com.zdxt.enforcementcode.domain.vo.report.RegistrationStatisticsVo;
import com.zdxt.enforcementcode.report.IEnforcementRegistrationReportReport;
import com.zdxt.enforcementcode.service.IComplaintStatisticsService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -34,11 +36,11 @@ import java.util.List;
public class RegistrationController {
private final IEnforcementRegistrationReportReport registrationReport;
private final IComplaintStatisticsService complaintStatisticsService;
/**
* 接口1:涉企执法统计指标
*/
@SaIgnore
@GetMapping("/statistics")
public R<RegistrationStatisticsVo> statistics(EnforcementRegistrationBo bo) {
return R.ok(registrationReport.statistics(bo));
@ -55,7 +57,6 @@ public class RegistrationController {
/**
* 接口2-V2:涉企执法统计列表(SQL JOIN字典表排序 + 服务端分页,当前使用)
*/
@SaIgnore
@GetMapping("/list")
public TableDataInfo<EnforcementRegistrationVo> list(EnforcementRegistrationBo bo, PageQuery pageQuery) {
return registrationReport.listForV2(bo, pageQuery);
@ -156,11 +157,21 @@ public class RegistrationController {
* @param bo
* @return
*/
@SaIgnore
@GetMapping("/unionList")
public R<List<EnforcementRegistrationVo>> unionList(EnforcementRegistrationBo bo)
{
List<EnforcementRegistrationVo> returnList = registrationReport.selectEnforcementRegistrationAndAddressList(bo);
return R.ok(returnList);
}
/**
* 监督端-查询是否投诉明细
* @param rid
* @return
*/
@GetMapping("/complaintByRid")
public R<ComplaintStatisticsVo> complaintByRid(String rid){
ComplaintStatisticsVo vo=complaintStatisticsService.selectById(rid);
return R.ok(vo);
}
}

18
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/controller/web/supervision/report/StatisticsComplaintController.java

@ -1,5 +1,6 @@
package com.zdxt.enforcementcode.controller.web.supervision.report;
import com.zdxt.enforcementcode.domain.ComplaintStatistics;
import com.zdxt.enforcementcode.domain.bo.ComplaintStatisticsBo;
import com.zdxt.enforcementcode.domain.vo.report.*;
import com.zdxt.enforcementcode.report.IStatisticsComplaintReport;
@ -10,6 +11,7 @@ import org.dromara.common.core.domain.R;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.ui.Model;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -47,6 +49,22 @@ public class StatisticsComplaintController {
return reportService.detailList(bo, pageQuery);
}
/**
* 监督端-投诉明细
* @param id
* @param model
* @return
*/
/*@GetMapping("/details/{id}")
public String complaintsReportDetails(@PathVariable("id") String id, Model model) {
ComplaintStatistics complaintStatistics = complaintsReportService.complaintById(id);
model.addAttribute("complaintStatistics", complaintStatistics);
List<MssqOrderFlow> mssqOrderFlowList = iEnterpriseComplaintService.selectEnterpriseComplaintProcess(complaintStatistics.getCid());
model.addAttribute("mssqOrderFlowList", mssqOrderFlowList);
return prefix + "/details.html";
}*/
/** Tab2-投诉类型统计 */
@GetMapping("/typeStatList")
public R<List<ComplaintReportTypeStatVo>> typeStatList(ComplaintStatisticsBo bo) {

10
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/EnforcementRegistrationBo.java

@ -392,4 +392,14 @@ public class EnforcementRegistrationBo extends BaseEntity {
* 街道名称
*/
private String streetName;
/**
* 排序方向 asc/desc
*/
private String isAsc;
/**
* 排序字段列
*/
private String orderByColumn;
}

10
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/bo/ScanDataSituationBo.java

@ -52,4 +52,14 @@ public class ScanDataSituationBo {
* 结束时间
*/
private Date endTime;
/**
* 排序字段
*/
private String isAsc;
/**
* 排序字段列
*/
private String orderByColumn;
}

11
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/domain/vo/CimDashboardOverviewVo.java

@ -93,6 +93,13 @@ public class CimDashboardOverviewVo {
*/
private Long lhzfs;
private Long lhzfcs;
/**
* 检查次数
*/
private Long jccs;
/**
* 联合执法数同比(增长率,百分比,如 15.5 表示 +15.5%)
*/
@ -118,6 +125,10 @@ public class CimDashboardOverviewVo {
*/
private String code;
/**
* 行政区编码
*/
private String areaCode;
/**
* 名称
*/

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/handler/ApiSignInterceptor.java

@ -51,7 +51,7 @@ public class ApiSignInterceptor implements HandlerInterceptor {
return false;
}
SysApiPlatformConfigEntity consumer = sysApiPlatformConfigService.findByAppKeyFromDb(appKey).orElse(null);
SysApiPlatformConfigEntity consumer = sysApiPlatformConfigService.findByAppKey(appKey).orElse(null);
if (consumer == null) {
writeError(response, "无效的 appKey");

22
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/mapper/CimDashboardOverviewMapper.java

@ -37,6 +37,15 @@ public interface CimDashboardOverviewMapper extends BaseMapperPlus<DashboardOver
*/
Long getNonEnfRegistrationCount(CimDashboardOverviewQueryBo bo);
/**
* 获取执法人员数
*/
List<CimDashboardOverviewVo> getLawPersonnelCount(CimDashboardOverviewQueryBo bo);
/**
* 获取执法单位数
*/
List<CimDashboardOverviewVo> getLawUnitCount(CimDashboardOverviewQueryBo bo);
/**
* 获取计划总数(月)
* @param bo
@ -101,6 +110,13 @@ public interface CimDashboardOverviewMapper extends BaseMapperPlus<DashboardOver
*/
List<CimDashboardOverviewVo> getQuarterlyRegionList(CimDashboardOverviewQueryBo bo);
/**
* 下转联动某个区域查询对应区域街道的数据
* @param bo
* @return
*/
List<CimDashboardOverviewVo> getAreaQuarterlyRegionList(CimDashboardOverviewQueryBo bo);
/**
* 获取领域检查趋势分析(季度)
* @param bo
@ -108,6 +124,12 @@ public interface CimDashboardOverviewMapper extends BaseMapperPlus<DashboardOver
*/
List<CimDashboardOverviewVo> getDomainQuarterList(CimDashboardOverviewQueryBo bo);
/**
* 下转联动某个区域查询对应区域领域的数据(季度)
* @param bo
* @return
*/
List<CimDashboardOverviewVo> getAreaDomainQuarterList(CimDashboardOverviewQueryBo bo);
/**
* 获取涉企登记执法类别(实)

30
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/CimPersonUnitMonthDataSumJob.java

@ -0,0 +1,30 @@
package com.zdxt.enforcementcode.quartz.job;
import com.zdxt.enforcementcode.service.ICimDashboardOverviewDataSumService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
*Cim执法人员-执法单位-企业数量
*
* @author zrb
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class CimPersonUnitMonthDataSumJob {
private final ICimDashboardOverviewDataSumService cimDashboardOverviewDataSumService;
/**
* 任务执行入口(public,供 JobInvokeUtil 通过反射调用)
*/
public void execute() {
Boolean result =cimDashboardOverviewDataSumService.getAreaMonthDataSum();
}
}

6
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SrzDeptOriginalDataJob.java

@ -28,7 +28,6 @@ import java.util.stream.Collectors;
/**
* 同步市认证部门组织信息表原始数据
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class SrzDeptOriginalDataJob {
@ -60,6 +59,7 @@ public class SrzDeptOriginalDataJob {
/** 同步部门数据 */
public void getData(){
log.info(" SrzDeptOriginalDataJob 同步市认证部门组织信息表原始数据开始");
List<SysDictDataVo> srz_item = sysDictDataService.selectDictDataByType("srz_item");
Map<String,String> map = srz_item.stream().collect(Collectors.toMap(SysDictDataVo::getDictLabel,SysDictDataVo::getDictValue));
@ -119,6 +119,8 @@ public class SrzDeptOriginalDataJob {
} catch (Exception e) {
e.printStackTrace();
}
log.info(" SrzDeptOriginalDataJob 同步市认证部门组织信息表原始数据结束");
}
private String connect(String apiPath) {
@ -146,7 +148,7 @@ public class SrzDeptOriginalDataJob {
httpPost.setEntity(entity);
log.info("请求参数: {}", params);
CloseableHttpResponse response = client.execute(httpPost);
return EntityUtils.toString(response.getEntity());

4
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SrzUserOriginalDataJob.java

@ -28,7 +28,7 @@ import java.util.stream.Collectors;
/**
* 同步市认证用户组织信息原始数据
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class SrzUserOriginalDataJob {
@ -62,6 +62,7 @@ public class SrzUserOriginalDataJob {
* 获取市认证用户原始数据
*/
public void getData(){
log.info(" SrzUserOriginalDataJob 获取市认证用户原始数据开始");
List<SysDictDataVo> srz_item = sysDictDataService.selectDictDataByType("srz_item");
Map<String,String> map = srz_item.stream().collect(Collectors.toMap(SysDictDataVo::getDictLabel,SysDictDataVo::getDictValue));
@ -119,6 +120,7 @@ public class SrzUserOriginalDataJob {
} catch (Exception e) {
e.printStackTrace();
}
log.info(" SrzUserOriginalDataJob 获取市认证用户原始数据结束");
}
private String connect(String apiPath) {

62
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynDeptInfoJob.java

@ -22,7 +22,7 @@ import java.util.Map;
/**
* 同步部门信息
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class SynDeptInfoJob {
@ -60,35 +60,41 @@ public class SynDeptInfoJob {
// 开始同步更新数据到用户表
for(SrzDeptVo srzDept : srzDeptList){
log.info("====> 获取数据: {}", srzDept.getName());
SysDeptBo sysDeptBo = new SysDeptBo();
// 机构ID organizationId
sysDeptBo.setDeptId(srzDept.getOrganizationid());
// 机构父节点 parentId
sysDeptBo.setParentId(srzDept.getParentid());
sysDeptBo.setOrganizationParentId(srzDept.getParentid());
// 机构名称 name
sysDeptBo.setDeptName(srzDept.getName());
// 行级容错: 单条失败不中断整批同步, 防止毒丸数据反复卡死循环
try {
SysDeptBo sysDeptBo = new SysDeptBo();
// 机构ID organizationId
sysDeptBo.setDeptId(srzDept.getOrganizationid());
// 机构父节点 parentId
sysDeptBo.setParentId(srzDept.getParentid());
sysDeptBo.setOrganizationParentId(srzDept.getParentid());
// 机构名称 name
sysDeptBo.setDeptName(srzDept.getName());
//限制唯一部门id
String organizationId = srzDept.getOrganizationid();
if(StringUtils.isNotEmpty(organizationId)){
SysDeptVo uniqueDept = sysDeptService.selectDeptById(organizationId);
if (null != uniqueDept && uniqueDept.getDeptId() != null) {
// 更新数据库
sysDeptBo.setDeptId(uniqueDept.getDeptId());
log.info("====> 更新数据: {}: {}", uniqueDept.getDeptId(), uniqueDept.getDeptName());
int rowNum = sysDeptService.updateDept(sysDeptBo);
updateNum += rowNum;
} else {
// 插入数据库
log.info("====> 新增数据: {}: {}", sysDeptBo.getDeptId(), sysDeptBo.getDeptName());
int rowNum = sysDeptService.insertDept(sysDeptBo);
insertNum += rowNum;
//限制唯一部门id
String organizationId = srzDept.getOrganizationid();
if(StringUtils.isNotEmpty(organizationId)){
SysDeptVo uniqueDept = sysDeptService.selectDeptById(organizationId);
if (null != uniqueDept && uniqueDept.getDeptId() != null) {
// 更新数据库
sysDeptBo.setDeptId(uniqueDept.getDeptId());
log.info("====> 更新数据: {}: {}", uniqueDept.getDeptId(), uniqueDept.getDeptName());
int rowNum = sysDeptService.updateDept(sysDeptBo);
updateNum += rowNum;
} else {
// 插入数据库
log.info("====> 新增数据: {}: {}", sysDeptBo.getDeptId(), sysDeptBo.getDeptName());
int rowNum = sysDeptService.insertDept(sysDeptBo);
insertNum += rowNum;
}
srzDept.setNeedUpdate(1L);
int srz_num = iSrzDeptService.update(srzDept);
rowNom_srz += srz_num;
}
srzDept.setNeedUpdate(1L);
int srz_num = iSrzDeptService.update(srzDept);
rowNom_srz += srz_num;
} catch (Exception rowEx) {
// Quartz 线程无 Sa-Token 上下文(checkDeptDataScope) / 父部门未同步(insertDept NPE) 等单行异常
log.error("====> 部门同步单条失败, organizationId: {}, name: {}",
srzDept.getOrganizationid(), srzDept.getName(), rowEx);
}
}
}

161
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/quartz/job/SynUserInfoJob.java

@ -8,6 +8,7 @@ import com.zdxt.enforcementcode.service.ISrzUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.helper.DataPermissionHelper;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysDictDataService;
@ -26,7 +27,7 @@ import java.util.Map;
/**
* 同步用户信息定时任务
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class SynUserInfoJob {
@ -57,6 +58,7 @@ public class SynUserInfoJob {
int insertNum = 0;
int updateNum = 0;
int rowNom_srz = 0;
int failNum = 0;
try {
// 做个死循环, 一直到查寻不到数据了再break
while (true) {
@ -68,86 +70,99 @@ public class SynUserInfoJob {
// 开始同步更新数据到用户表
for(SrzUserVo srzUser : srzUserList){
log.info("====> 获取数据: {}", srzUser.getUsername());
SysUserBo sysUserBo = new SysUserBo();
sysUserBo.setSex(srzUser.getGendercode());
sysUserBo.setDeptId(srzUser.getOrganizationid());
sysUserBo.setOrganizationId(srzUser.getOrganizationid());
sysUserBo.setStrUserId(srzUser.getUserid());
sysUserBo.setSrzUserid(srzUser.getSrzuserid());
sysUserBo.setFullname(srzUser.getFullname());
sysUserBo.setUserName(srzUser.getFullname());
sysUserBo.setTaskId(srzUser.getTaskid());
sysUserBo.setSystemId(srzUser.getSystemid());
sysUserBo.setLoginName(srzUser.getUsername());
sysUserBo.setEffectOn(srzUser.getEffecton());
sysUserBo.setIsDisabled(srzUser.getIsdisabled());
sysUserBo.setIsDeleted(srzUser.getIsdeleted());
sysUserBo.setCreateAt(srzUser.getCreateat());
sysUserBo.setUpdateAt(srzUser.getUpdateat());
sysUserBo.setGuid(srzUser.getGuid());
//用户类型 0 系统用户
sysUserBo.setUserSource(0);
//手机号加密
String mobileNumber = "";
try {
mobileNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getMobilenumber());
} catch (Exception e) {
System.out.println(e.getMessage());
mobileNumber = "";
}
sysUserBo.setMobileNumber(mobileNumber);
sysUserBo.setPhonenumber(mobileNumber);
sysUserBo.setEmail(srzUser.getEmail());
sysUserBo.setCertificateTypeId(srzUser.getCertificatetypeid());
sysUserBo.setCertificateTypeIdCode(srzUser.getCertificatetypeidcode());
//证件号加密
String certificateNumber = "";
// 行级容错: 单条失败不中断整批, 防止毒丸数据反复卡死同步
try {
certificateNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getCertificatenumber());
} catch (Exception e) {
certificateNumber = "";
}
log.info("====> 获取数据: {}", srzUser.getUsername());
SysUserBo sysUserBo = new SysUserBo();
sysUserBo.setSex(srzUser.getGendercode());
sysUserBo.setDeptId(srzUser.getOrganizationid());
sysUserBo.setOrganizationId(srzUser.getOrganizationid());
sysUserBo.setStrUserId(srzUser.getUserid());
sysUserBo.setSrzUserid(srzUser.getSrzuserid());
sysUserBo.setFullname(srzUser.getFullname());
sysUserBo.setUserName(srzUser.getFullname());
// sys_user.nick_name 为 NOT NULL 无默认值, 新增用户必须提供, 取全名兜底登录名
sysUserBo.setNickName(StringUtils.isNotEmpty(srzUser.getFullname())
? srzUser.getFullname() : srzUser.getUsername());
sysUserBo.setTaskId(srzUser.getTaskid());
sysUserBo.setSystemId(srzUser.getSystemid());
sysUserBo.setLoginName(srzUser.getUsername());
sysUserBo.setEffectOn(srzUser.getEffecton());
sysUserBo.setIsDisabled(srzUser.getIsdisabled());
sysUserBo.setIsDeleted(srzUser.getIsdeleted());
sysUserBo.setCreateAt(srzUser.getCreateat());
sysUserBo.setUpdateAt(srzUser.getUpdateat());
sysUserBo.setGuid(srzUser.getGuid());
//用户类型 0 系统用户
sysUserBo.setUserSource(0);
//手机号加密
String mobileNumber = "";
try {
mobileNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getMobilenumber());
} catch (Exception e) {
log.warn("====> 手机号加密失败, username: {}, 原因: {}", srzUser.getUsername(), e.getMessage());
mobileNumber = "";
}
sysUserBo.setMobileNumber(mobileNumber);
sysUserBo.setPhonenumber(mobileNumber);
sysUserBo.setEmail(srzUser.getEmail());
sysUserBo.setCertificateTypeId(srzUser.getCertificatetypeid());
sysUserBo.setCertificateTypeIdCode(srzUser.getCertificatetypeidcode());
//证件号加密
String certificateNumber = "";
try {
certificateNumber = IdCardCryptoUtil.symmetricEncryptIdCard(secretKey, srzUser.getCertificatenumber());
} catch (Exception e) {
log.warn("====> 证件号加密失败, username: {}, 原因: {}", srzUser.getUsername(), e.getMessage());
certificateNumber = "";
}
sysUserBo.setCertificateNumber(certificateNumber);
sysUserBo.setIsMappingPerson(srzUser.getIsmappingperson());
sysUserBo.randomSalt();
//新增用户默认不删除标记
sysUserBo.setDelFlag("0");
//限制只通过用户信息的username来判断,避免登录出现问题
String userName = srzUser.getUsername();
if(StringUtils.isNotEmpty(userName)){
UserSearchDto userSearchDto = new UserSearchDto();
userSearchDto.setUserSource(0);
SysUserVo uniqueUser = sysUserService.selectUserByLoginName(userName);
if (null != uniqueUser && uniqueUser.getUserId() != null) {
// 更新数据库
sysUserBo.setUserId(uniqueUser.getUserId());
if (StringUtils.isEmpty(sysUserBo.getLawCertificateNum())) {
sysUserBo.setLawCertificateNum(uniqueUser.getLawCertificateNum());
sysUserBo.setCertificateNumber(certificateNumber);
sysUserBo.setIsMappingPerson(srzUser.getIsmappingperson());
sysUserBo.randomSalt();
//新增用户默认不删除标记
sysUserBo.setDelFlag("0");
//限制只通过用户信息的username来判断,避免登录出现问题
String userName = srzUser.getUsername();
if(StringUtils.isNotEmpty(userName)){
UserSearchDto userSearchDto = new UserSearchDto();
userSearchDto.setUserSource(0);
SysUserVo uniqueUser = sysUserService.selectUserByLoginName(userName);
if (null != uniqueUser && uniqueUser.getUserId() != null) {
// 更新数据库
sysUserBo.setUserId(uniqueUser.getUserId());
if (StringUtils.isEmpty(sysUserBo.getLawCertificateNum())) {
sysUserBo.setLawCertificateNum(uniqueUser.getLawCertificateNum());
}
log.info("====> 更新数据: {}", srzUser.getUsername());
// Quartz 工作线程无 Sa-Token 上下文, 需绕过数据权限拦截器
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.updateUser(sysUserBo));
updateNum += rowNum;
} else {
// 插入数据库
log.info("====> 新增数据: {}", srzUser.getUsername());
int rowNum = DataPermissionHelper.ignore(() -> sysUserService.insertUser(sysUserBo));
insertNum += rowNum;
}
log.info("====> 更新数据: {}", srzUser.getUsername());
int rowNum = sysUserService.updateUser(sysUserBo);
updateNum += rowNum;
} else {
// 插入数据库
log.info("====> 新增数据: {}", srzUser.getUsername());
int rowNum = sysUserService.insertUser(sysUserBo);
insertNum += rowNum;
srzUser.setNeedUpdate(1L);
int srz_num = DataPermissionHelper.ignore(() -> iSrzUserService.update(srzUser));
rowNom_srz += srz_num;
}
srzUser.setNeedUpdate(1L);
int srz_num = iSrzUserService.update(srzUser);
rowNom_srz += srz_num;
} catch (Exception rowEx) {
failNum++;
// 单条失败(如 nick_name 等必填字段缺失): 记录后跳过, 不中断整批
log.error("====> 用户同步单条失败, username: {}, userId: {}",
srzUser.getUsername(), srzUser.getUserid(), rowEx);
}
}
}
log.info("新增用户数量 : {} / 更新用户数量 : {} / 更新原始表数 : {}", insertNum, updateNum, rowNom_srz);
log.info("新增用户数量 : {} / 更新用户数量 : {} / 更新原始表数 : {} / 失败数量 : {}",
insertNum, updateNum, rowNom_srz, failNum);
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
log.error("用户同步任务整体异常", e);
}
}

17
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/LawEnfOfficerSericeImpl.java

@ -11,15 +11,28 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@RequiredArgsConstructor
public class LawEnfOfficerSericeImpl implements ILawEnfOfficerService {
private final LawEnfOfficerMapper lawEnfOfficerMapper;
/**
* 构建分页对象:排序统一由 XML 中的 orderByColumn 白名单控制。
* 清空 MyBatis-Plus 的 OrderItem,避免 PageQuery 把驼峰列名转成下划线列名后,
* 在 SQL 里再追加一个排序字段(如 order by xzzf_count asc, xzzfCount asc)。
*/
private <T> Page<T> buildPage(PageQuery pageQuery) {
Page<T> page = pageQuery.build();
// 排序只由 XML 中的 orderByColumn 白名单决定,清空 MP 的 OrderItem
page.setOrders(new ArrayList<>());
return page;
}
@Override
public TableDataInfo<EnforcementRegistrationVo> selectLawEnfOfficerPageList(PageQuery pageQuery, EnforcementRegistrationBo bo) {
Page<EnforcementRegistrationVo> list=lawEnfOfficerMapper.selectLawEnfOfficerPageList(pageQuery.build(),bo);
Page<EnforcementRegistrationVo> list=lawEnfOfficerMapper.selectLawEnfOfficerPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(list);
}
@ -30,7 +43,7 @@ public class LawEnfOfficerSericeImpl implements ILawEnfOfficerService {
@Override
public TableDataInfo<EnforcementRegistrationVo> selectLawEnfOfficerDetailsPageList(PageQuery pageQuery, EnforcementRegistrationBo bo) {
Page<EnforcementRegistrationVo> list=lawEnfOfficerMapper.selectLawEnfOfficerDetailsPageList(pageQuery.build(),bo);
Page<EnforcementRegistrationVo> list=lawEnfOfficerMapper.selectLawEnfOfficerDetailsPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(list);
}
}

21
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/report/impl/ScanDataSituationServiceImpl.java

@ -10,6 +10,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Service
@ -18,9 +19,21 @@ public class ScanDataSituationServiceImpl implements IScanDataSituationService {
private final ScanDataSituationMapper scanDataSituationMapper;
/**
* 构建分页对象:排序统一由 XML 中的 orderByColumn 白名单控制。
* 清空 MyBatis-Plus 的 OrderItem,避免 PageQuery 把驼峰列名转成下划线列名后,
* 在 SQL 里再追加一个排序字段(如 order by xzzf_count asc, xzzfCount asc)。
*/
private <T> Page<T> buildPage(PageQuery pageQuery) {
Page<T> page = pageQuery.build();
// 排序只由 XML 中的 orderByColumn 白名单决定,清空 MP 的 OrderItem
page.setOrders(new ArrayList<>());
return page;
}
@Override
public TableDataInfo<ScanDataSituationVo> selectScanDataSituationAreaPageList(PageQuery pageQuery, ScanDataSituationBo bo) {
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationAreaPageList(pageQuery.build(),bo);
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationAreaPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(page);
}
@ -31,14 +44,14 @@ public class ScanDataSituationServiceImpl implements IScanDataSituationService {
@Override
public TableDataInfo<ScanDataSituationVo> selectScanDataSituationAreaDetailsPageList(PageQuery pageQuery, ScanDataSituationBo bo) {
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationAreaDetailsPageList(pageQuery.build(),bo);
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationAreaDetailsPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(page);
}
@Override
public TableDataInfo<ScanDataSituationVo> selectScanDataSituationDomainPageList(PageQuery pageQuery, ScanDataSituationBo bo) {
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationDomainPageList(pageQuery.build(),bo);
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationDomainPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(page);
}
@ -49,7 +62,7 @@ public class ScanDataSituationServiceImpl implements IScanDataSituationService {
@Override
public TableDataInfo<ScanDataSituationVo> selectScanDataSituationDomainDetailsPageList(PageQuery pageQuery, ScanDataSituationBo bo) {
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationDomainDetailsPageList(pageQuery.build(),bo);
Page<ScanDataSituationVo> page=scanDataSituationMapper.selectScanDataSituationDomainDetailsPageList(buildPage(pageQuery),bo);
return TableDataInfo.build(page);
}
}

37
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ICimDashboardOverviewDataSumService.java

@ -21,12 +21,24 @@ public interface ICimDashboardOverviewDataSumService {
*/
Boolean getMonthDataSum();
/**
* Cim大屏-按区域统计-企业数量-执法人员数-执法单位数
* 定时任务调用方法
* @param
* @return
*/
Boolean getAreaMonthDataSum();
/**
* Cim大屏-查询大屏总览汇总月度数据
* @return
*/
List<CimDashboardOverviewVo> getDashboardOverviewMonthDataSum();
Map<String,Object> getDashboardOverviewMonthDataSum(CimDashboardOverviewQueryBo bo);
/**
* Cim大屏-按区域条件查询月度数据
*/
CimDashboardOverviewVo getDashboardOverviewAreaMonthDataSum(CimDashboardOverviewQueryBo bo);
/**
@ -54,7 +66,7 @@ public interface ICimDashboardOverviewDataSumService {
* Cim大屏-查询高频检查预警-区域月度数据
* @return
*/
Map<String,Object> getHighCheckAreaMonthDataSumMap();
Map<String,Object> getHighCheckAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo);
/**
* Cim大屏-查询高频检查预警-领域月度数据
@ -130,7 +142,15 @@ public interface ICimDashboardOverviewDataSumService {
* Cim大屏-查询态势感知-趋势行为分析-区域月度数据
* @return
*/
Map<String,Object> getTrendAreaMonthDataSumMap();
Map<String,Object> getTrendAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo);
/**
* 下转联动某个区域查询对应区域街道的数据
* @param bo
* @return
*/
List<CimDashboardOverviewVo> getAreaQuarterlyRegionList(CimDashboardOverviewQueryBo bo);
/**
* Cim大屏-查询态势感知-趋势行为分析-领域月度数据
@ -139,10 +159,17 @@ public interface ICimDashboardOverviewDataSumService {
*/
Boolean getTrendFieldMonthDataSum();
/**
* Cim大屏-查询态势感知-趋势行为分析-领域月度数据
* @return
*/
Map<String,Object> getTrendFieldMonthDataSumMap();
Map<String,Object> getTrendFieldMonthDataSumMap(CimDashboardOverviewQueryBo bo);
/**
* 下转联动某个区域查询对应区域领域的数据(季度)
* @param bo
* @return
*/
List<CimDashboardOverviewVo> getAreaDomainQuarterList(CimDashboardOverviewQueryBo bo);
}

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

@ -3,8 +3,10 @@ package com.zdxt.enforcementcode.service;
import com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo;
import com.zdxt.enforcementcode.domain.bo.SixAnalysisParamsBo;
import com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo;
import io.netty.util.internal.MacAddressUtil;
import java.util.List;
import java.util.Map;
/**
* cim大屏-大屏总览
@ -32,6 +34,11 @@ public interface ICimDashboardOverviewService {
*/
Long getNonEnfRegistrationCount(CimDashboardOverviewQueryBo bo);
/**
* 获取执法人员数,企业数量,执法单位数量
*/
Map<String,Object> getAreaCount(CimDashboardOverviewQueryBo bo);
/**
* 获取计划总数(月)
* @param bo

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IComplaintStatisticsService.java

@ -24,6 +24,8 @@ public interface IComplaintStatisticsService {
*/
ComplaintStatisticsVo queryById(Long id);
ComplaintStatisticsVo selectById(String rid);
/**
* 分页查询【请填写功能名称】列表
*

12
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/IMoveSupervisionService.java

@ -0,0 +1,12 @@
package com.zdxt.enforcementcode.service;
import java.util.Map;
public interface IMoveSupervisionService {
Map<String,Object> OverviewLawEnforcementMap();
}

2
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/ISysApiPlatformConfigService.java

@ -6,9 +6,7 @@ import java.util.Optional;
public interface ISysApiPlatformConfigService {
void refreshCache();
Optional<SysApiPlatformConfigEntity> findByAppKey(String appKey);
Optional<SysApiPlatformConfigEntity> findByAppKeyFromDb(String appKey);
}

4
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/enterprise/impl/AppEnterpriseComplaintServiceImpl.java

@ -171,7 +171,7 @@ public class AppEnterpriseComplaintServiceImpl implements IAppEnterpriseComplain
}
//原逻辑这边会调用创建民生诉求工单,接口会做后续安排
/* List<String> proCodeList = new ArrayList<>();
List<String> proCodeList = new ArrayList<>();
// 创建民生诉求工单
if(StringUtils.isNotEmpty(bo.getComplaintItemCodes())){
List<String> codes = Arrays.asList(Convert.toStrArray(bo.getComplaintItemCodes()));
@ -181,7 +181,7 @@ public class AppEnterpriseComplaintServiceImpl implements IAppEnterpriseComplain
});
}
//投诉工单返回参数
bo.setProWoCode(String.join(",",proCodeList));*/
bo.setProWoCode(String.join(",",proCodeList));
EnterpriseComplaint updateEntity = MapstructUtils.convert(bo, EnterpriseComplaint.class);
baseMapper.updateById(updateEntity);

192
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CimDashboardOverviewDataSumSserviceImpl.java

@ -12,6 +12,7 @@ import com.zdxt.enforcementcode.mapper.*;
import com.zdxt.enforcementcode.service.ICimDashboardOverviewDataSumService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.utils.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -102,17 +103,96 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
/*vo.setQyzs(0L);
vo.setQyzshb(0L);
vo.setQyzstb(0L);*/
/**
* 暂存需要确认数据来源
* 暂时未取数-执法人员数,执法单位数(月)
*
* 暂时未取数-区域-企业数量-执法单位数-执法人员数(月)
*/
//执法人员数:未传区域编码时查询结果是各区明细,需要汇总求和
long zfrysSum = 0L;
List<CimDashboardOverviewVo> lawPersonnelList = cimDashboardOverviewMapper.getLawPersonnelCount(bo);
if (lawPersonnelList != null) {
for (CimDashboardOverviewVo item : lawPersonnelList) {
if (item.getZfrys() != null) {
zfrysSum += item.getZfrys();
}
}
}
vo.setZfrys(zfrysSum);
//执法单位数:未传区域编码时查询结果是各区明细,需要汇总求和
long zfdwsSum = 0L;
List<CimDashboardOverviewVo> lawUnitList = cimDashboardOverviewMapper.getLawUnitCount(bo);
if (lawUnitList != null) {
for (CimDashboardOverviewVo item : lawUnitList) {
if (item.getZfdws() != null) {
zfdwsSum += item.getZfdws();
}
}
}
vo.setZfdws(zfdwsSum);
//添加月度数据
Boolean flag = insertNewData(vo);
return flag;
}
/**
* Cim大屏-按区域统计-企业数量-执法人员数-执法单位数
* 定时任务调用方法
* @return
*/
@Override
public Boolean getAreaMonthDataSum(){
CimDashboardOverviewQueryBo bo= getDateTime();
bo.setMonthTime(getDateTime().getMonthTime());
List<CimDashboardOverviewVo> list=cimDashboardOverviewMapper.getLawPersonnelCount(bo);
List<CimDashboardOverviewVo> list1=cimDashboardOverviewMapper.getLawUnitCount(bo);
// 1. 高频检查区域:VO(code/name/number) → 实体(areaCode/areaName/gpjcqy)
List<DashboardOverviewPersonnel> areaPersonnelList = new ArrayList<>();
if (list != null) {
for (CimDashboardOverviewVo vo : list) {
DashboardOverviewPersonnel entity = new DashboardOverviewPersonnel();
entity.setCityCode("440300");
entity.setCityName("深圳市");
entity.setDistrictCode(vo.getCode());
entity.setDistrictName(vo.getName());
entity.setZfrys(vo.getZfrys());
entity.setLevel(2L);
entity.setYear(getDateTime().getYear());
entity.setMonth(getDateTime().getMonth());
entity.setIsDelete("0");
areaPersonnelList.add(entity);
}
}
// 2. 高频检查区域执法单位联合执法数:VO(bueauDeptId/bureauDeptName/number) → 实体(bureauDeptId/bureauDeptName/lhzfcs)
List<DashboardOverviewUnit> areaUnionList = new ArrayList<>();
if (list1 != null) {
for (CimDashboardOverviewVo vo : list1) {
DashboardOverviewUnit entity = new DashboardOverviewUnit();
entity.setCityCode("440300");
entity.setCityName("深圳市");
entity.setDistrictCode(vo.getCode());
entity.setDistrictName(vo.getName());
entity.setZfdws(vo.getZfdws());
entity.setLevel(2L);
entity.setYear(getDateTime().getYear());
entity.setMonth(getDateTime().getMonth());
entity.setIsDelete("0");
areaUnionList.add(entity);
}
}
//新增数据到数据汇总表
if (!areaPersonnelList.isEmpty()) {
dashboardOverviewPersonnelMapper.insertBatch(areaPersonnelList);
}
if (!areaUnionList.isEmpty()) {
dashboardOverviewUnitMapper.insertBatch(areaUnionList);
}
return true;
}
/**
* Cim-大屏总览
* 获取月度数据
@ -120,15 +200,48 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
* @return
*/
@Override
public List<CimDashboardOverviewVo> getDashboardOverviewMonthDataSum() {
public Map<String ,Object> getDashboardOverviewMonthDataSum(CimDashboardOverviewQueryBo bo) {
Map<String ,Object> map=new HashMap<>();
LambdaQueryWrapper<DashboardOverview> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DashboardOverview::getIsDelete, "0");
queryWrapper.eq(DashboardOverview::getYear, getDateTime().getYear());
queryWrapper.eq(DashboardOverview::getMonth, getDateTime().getMonth());
return cimDashboardOverviewMapper.selectVoList(queryWrapper);
map.put("monthData",cimDashboardOverviewMapper.selectVoList(queryWrapper));
map.put("areaMonthData",getDashboardOverviewAreaMonthDataSum(bo));
return map;
}
/**
* Cim大屏-按区域条件查询月度数据
*/
@Override
public CimDashboardOverviewVo getDashboardOverviewAreaMonthDataSum(CimDashboardOverviewQueryBo bo) {
CimDashboardOverviewVo vo=new CimDashboardOverviewVo();
// 区域计划总数
bo.setMonthTime(getDateTime().getMonthTime());
Long jhzs=cimDashboardOverviewMapper.getPlanCount(bo);
vo.setJhzs(jhzs);
//区域预告总数
Long ygzs=cimDashboardOverviewMapper.getNoticeCount(bo);
vo.setYgzs(ygzs);
//涉企执法总数
Long sqzfzs=cimDashboardOverviewMapper.getEnfLawCount(bo);
vo.setSqzfzs(sqzfzs);
//稽查反馈总数
Long jcfkzs=cimDashboardOverviewMapper.getLawEvaluateCount(bo);
vo.setJcpjzs(jcfkzs);
//检查投诉总数
Long jctszs=cimDashboardOverviewMapper.getComplaintCount(bo);
vo.setJctszs(jctszs);
//平均检查频次
Long bzfqy=cimDashboardOverviewMapper.getSubLawEntCount(bo);
Long xzzf=cimDashboardOverviewMapper.getEnfRegistrationCount(bo);
if(bzfqy!=0) {
vo.setPjjcpc(xzzf / bzfqy);
}
return vo;
}
/**
* Cim大屏-大屏总览企业数量-执法单位数-执法人员数
@ -201,8 +314,10 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
add.setJctszs(vo.getJctszs());
add.setPjjcpc(vo.getPjjcpc());
add.setQyzs(vo.getQyzs());
add.setQyzshb(vo.getQyzshb());
add.setQyzstb(vo.getQyzstb());
/*add.setQyzshb(vo.getQyzshb());
add.setQyzstb(vo.getQyzstb());*/
add.setZfrys(vo.getZfrys());
add.setZfdws(vo.getZfdws());
// 年份、月份
add.setYear(cal.get(Calendar.YEAR));
add.setMonth(cal.get(Calendar.MONTH) + 1);
@ -258,7 +373,7 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
entity.setCityName("深圳市");
entity.setBureauDeptId(vo.getBueauDeptId());
entity.setBureauDeptName(vo.getBureauDeptName());
entity.setLhzfcs(vo.getNumber());
entity.setLhzfcs(vo.getLhzfcs());
entity.setLevel(2L);
entity.setYear(getDateTime().getYear());
entity.setMonth(getDateTime().getMonth());
@ -276,7 +391,7 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
entity.setCityName("深圳市");
entity.setBureauDeptId(vo.getBueauDeptId());
entity.setBureauDeptName(vo.getBureauDeptName());
entity.setJccs(vo.getNumber());
entity.setJccs(vo.getJccs());
entity.setLevel(2L);
entity.setYear(getDateTime().getYear());
entity.setMonth(getDateTime().getMonth());
@ -323,34 +438,39 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
* @return
*/
@Override
public Map<String, Object> getHighCheckAreaMonthDataSumMap() {
public Map<String, Object> getHighCheckAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
LambdaQueryWrapper<DashboardHighCheckArea> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DashboardHighCheckArea::getLevel, 2);
queryWrapper.eq(DashboardHighCheckArea::getIsDelete, "0");
queryWrapper.eq(DashboardHighCheckArea::getYear, getDateTime().getYear());
queryWrapper.eq(DashboardHighCheckArea::getMonth, getDateTime().getMonth());
queryWrapper.eq(StringUtils.isNotBlank(bo.getCode()),DashboardHighCheckArea::getAreaCode,bo.getCode());
List<DashboardHighCheckArea> areaList = dashboardHighCheckAreaMapper.selectList(queryWrapper);
LambdaQueryWrapper<DashboardHighCheckUnionArea> queryWrapper1 = new LambdaQueryWrapper<>();
/*LambdaQueryWrapper<DashboardHighCheckUnionArea> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.eq(DashboardHighCheckUnionArea::getLevel, 2);
queryWrapper1.eq(DashboardHighCheckUnionArea::getIsDelete, "0");
queryWrapper1.eq(DashboardHighCheckUnionArea::getYear, getDateTime().getYear());
queryWrapper1.eq(DashboardHighCheckUnionArea::getMonth, getDateTime().getMonth());
List<DashboardHighCheckUnionArea> unionList = dashboardhighcheckunionMapper.selectList(queryWrapper1);
List<DashboardHighCheckUnionArea> unionList = dashboardhighcheckunionMapper.selectList(queryWrapper1);*/
bo.setMonthTime(getDateTime().getMonthTime());
List<CimDashboardOverviewVo> unionList= cimDashboardOverviewMapper.getHighCheckAreaUnionNoRanking(bo);
LambdaQueryWrapper<DashboardHighCheckFrequencyArea> queryWrapper2 = new LambdaQueryWrapper<>();
/*LambdaQueryWrapper<DashboardHighCheckFrequencyArea> queryWrapper2 = new LambdaQueryWrapper<>();
queryWrapper2.eq(DashboardHighCheckFrequencyArea::getLevel, 2);
queryWrapper2.eq(DashboardHighCheckFrequencyArea::getIsDelete, "0");
queryWrapper2.eq(DashboardHighCheckFrequencyArea::getYear, getDateTime().getYear());
queryWrapper2.eq(DashboardHighCheckFrequencyArea::getMonth, getDateTime().getMonth());
List<DashboardHighCheckFrequencyArea> freqList = dashboardHighCheckFrequencyAreaMapper.selectList(queryWrapper2);
List<DashboardHighCheckFrequencyArea> freqList = dashboardHighCheckFrequencyAreaMapper.selectList(queryWrapper2);*/
List<CimDashboardOverviewVo> freqList=cimDashboardOverviewMapper.getHighCheckAreaenfRegistraionRanking(bo);
LambdaQueryWrapper<DashboardHighCheckEnterprise> queryWrapper3 = new LambdaQueryWrapper<>();
queryWrapper3.eq(DashboardHighCheckEnterprise::getLevel, 2);
queryWrapper3.eq(DashboardHighCheckEnterprise::getIsDelete, "0");
queryWrapper3.eq(DashboardHighCheckEnterprise::getYear, getDateTime().getYear());
queryWrapper3.eq(DashboardHighCheckEnterprise::getMonth, getDateTime().getMonth());
queryWrapper.eq(StringUtils.isNotBlank(bo.getCode()),DashboardHighCheckArea::getAreaCode,bo.getCode());
List<DashboardHighCheckEnterprise> enterpriseList = dashboardHighCheckEnterpriseMapper.selectList(queryWrapper3);
Map<String, Object> map = new HashMap<>();
map.put("areaList", areaList);
@ -1070,7 +1190,7 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
* @return
*/
@Override
public Map<String, Object> getTrendAreaMonthDataSumMap() {
public Map<String, Object> getTrendAreaMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
LambdaQueryWrapper<DashboardTrendStatArea> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DashboardTrendStatArea::getIsDelete, "0");
@ -1123,9 +1243,26 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
map.put("highAreas", highAreas);
// 低频区域:每季度最低各1条,共4条
map.put("lowAreas", lowAreas);
// 查询街道
List<CimDashboardOverviewVo> streetList= cimDashboardOverviewMapper.getAreaQuarterlyRegionList(bo);
map.put("streetList", streetList);
return map;
}
/**
* 下转联动某个区域查询对应区域街道的数据
* @param bo
* @return
*/
@Override
public List<CimDashboardOverviewVo> getAreaQuarterlyRegionList(CimDashboardOverviewQueryBo bo) {
List<CimDashboardOverviewVo> list= cimDashboardOverviewMapper.getAreaQuarterlyRegionList(bo);
return list;
}
/**
* 构建区域趋势统计数据副本(用于高频/低频区域结果)
* 单独构建新对象,避免同一区域在多个季度上榜时 jccs 值被覆盖
@ -1206,7 +1343,7 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
* @return
*/
@Override
public Map<String, Object> getTrendFieldMonthDataSumMap() {
public Map<String, Object> getTrendFieldMonthDataSumMap(CimDashboardOverviewQueryBo bo) {
LambdaQueryWrapper<DashboardTrendStatDomain> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DashboardTrendStatDomain::getIsDelete, "0");
@ -1258,10 +1395,25 @@ public class CimDashboardOverviewDataSumSserviceImpl implements ICimDashboardOve
map.put("highDomains", highDomains);
// 低频领域:每季度最低各1条,共4条
map.put("lowDomains", lowDomains);
List<CimDashboardOverviewVo> areaDomainList=cimDashboardOverviewMapper.getAreaDomainQuarterList(bo);
map.put("areaDomainList",areaDomainList);
return map;
}
/**
* 下转联动某个区域查询对应区域领域的数据(季度)
* @param bo
* @return
*/
@Override
public List<CimDashboardOverviewVo> getAreaDomainQuarterList(CimDashboardOverviewQueryBo bo) {
List<CimDashboardOverviewVo> list=cimDashboardOverviewMapper.getAreaDomainQuarterList(bo);
return list;
}
/**
* 构建领域结果
*

19
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/CimDashboardOverviewServiceImpl.java

@ -11,7 +11,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* cim大屏总览实现
@ -57,6 +59,23 @@ public class CimDashboardOverviewServiceImpl implements ICimDashboardOverviewSer
return cimDashboardOverviewMapper.getNonEnfRegistrationCount(bo);
}
/**
* 获取执法人员数,企业数量,执法单位数量
*/
@Override
public Map<String,Object> getAreaCount(CimDashboardOverviewQueryBo bo){
Map<String,Object> map=new HashMap<>();
//执法人员数量
List<CimDashboardOverviewVo> list1=cimDashboardOverviewMapper.getLawPersonnelCount(bo);
map.put("areaPersonnel",list1);
//执法单位数量
List<CimDashboardOverviewVo> list2=cimDashboardOverviewMapper.getLawUnitCount(bo);
map.put("areaUnit",list2);
//企业数量
return map;
};
/**
* 查询计划总数(月)
* @param bo

7
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/ComplaintStatisticsServiceImpl.java

@ -44,6 +44,13 @@ public class ComplaintStatisticsServiceImpl implements IComplaintStatisticsServi
return baseMapper.selectVoById(id);
}
@Override
public ComplaintStatisticsVo selectById(String rid){
LambdaQueryWrapper<ComplaintStatistics> lqw =new LambdaQueryWrapper<>();
lqw.eq(ComplaintStatistics::getRid,rid);
return baseMapper.selectVoOne(lqw);
}
/**
* 分页查询【请填写功能名称】列表
*

82
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/MoveSupervisionServiceImpl.java

@ -0,0 +1,82 @@
package com.zdxt.enforcementcode.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zdxt.enforcementcode.domain.bean.DashboardOverview;
import com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo;
import com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo;
import com.zdxt.enforcementcode.domain.vo.DashboardOverviewVo;
import com.zdxt.enforcementcode.mapper.CimDashboardOverviewMapper;
import com.zdxt.enforcementcode.service.IMoveSupervisionService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
@Service
@RequiredArgsConstructor
public class MoveSupervisionServiceImpl implements IMoveSupervisionService {
private final CimDashboardOverviewMapper cimDashboardOverviewMapper;
/**
* 获取月时间方法
* @return
*/
public CimDashboardOverviewQueryBo getDateTime(){
CimDashboardOverviewQueryBo bo=new CimDashboardOverviewQueryBo();
// 获取当前时间的上一个月
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
long year = cal.get(Calendar.YEAR);
long month = cal.get(Calendar.MONTH) + 1;
Date time = cal.getTime();
bo.setMonthTime(time);
bo.setYearTime(time);
bo.setMonth( month);
bo.setYear( year);
return bo;
}
@Override
public Map<String, Object> OverviewLawEnforcementMap() {
Map<String,Object> map=new HashMap<>();
//企业总数
LambdaQueryWrapper<DashboardOverview> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DashboardOverview::getIsDelete, "0");
queryWrapper.eq(DashboardOverview::getYear, getDateTime().getYear());
queryWrapper.eq(DashboardOverview::getMonth, getDateTime().getMonth());
CimDashboardOverviewVo vo=cimDashboardOverviewMapper.selectVoOne(queryWrapper);
//单独部门执法
Long ddbmzfCount=cimDashboardOverviewMapper.getSepDeptLawCount(null);
//联合执法
Long lhzfsCount= cimDashboardOverviewMapper.getUnionLawCount(null);
//被执法企业
Long bzfqyCount= cimDashboardOverviewMapper.getSubLawEntCount(null);
map.put("data",vo);
map.put("ddzf",ddbmzfCount);
map.put("lhzf",lhzfsCount);
map.put("bzfqy",bzfqyCount);
//入企压减率
Long xzzfCount = cimDashboardOverviewMapper.getEnfRegistrationCount(null);
if (xzzfCount == null || xzzfCount == 0) {
map.put("rqyjl",BigDecimal.ZERO);
} else {
map.put("rqyjl",BigDecimal.valueOf(xzzfCount - (lhzfsCount + ddbmzfCount))
.divide(BigDecimal.valueOf(xzzfCount), 4, RoundingMode.HALF_UP));
}
// 执法力度
List<CimDashboardOverviewVo> list=cimDashboardOverviewMapper.getEnfRegistrationType(null);
map.put("zfld",list);
return map;
}
}

4
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/StatisticalPaneServiceCityImpl.java

@ -2,9 +2,6 @@ package com.zdxt.enforcementcode.service.impl;
import com.zdxt.enforcementcode.common.annotation.DataScope;
import com.zdxt.enforcementcode.domain.EnforcementRegistration;
import com.zdxt.enforcementcode.domain.EnterpriseComplaint;
import com.zdxt.enforcementcode.domain.EnterpriseEvaluate;
import com.zdxt.enforcementcode.domain.bo.SixAnalysisParamsBo;
import com.zdxt.enforcementcode.domain.vo.EnforcementRegistrationVo;
import com.zdxt.enforcementcode.domain.vo.EnterpriseComplaintVo;
@ -12,7 +9,6 @@ import com.zdxt.enforcementcode.domain.vo.EnterpriseEvaluateVo;
import com.zdxt.enforcementcode.mapper.StatisticalPanelCityMapper;
import com.zdxt.enforcementcode.service.IStatisticalPaneCityService;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.system.domain.SysDictData;
import org.dromara.system.domain.bo.SysDictDataBo;
import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISysDeptService;

31
zdxt-modules/zdxt-enforcement-code/src/main/java/com/zdxt/enforcementcode/service/impl/SysApiPlatformConfigServiceImpl.java

@ -8,11 +8,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import jakarta.annotation.PostConstruct;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
@ -21,33 +17,9 @@ public class SysApiPlatformConfigServiceImpl implements ISysApiPlatformConfigSer
private final SysApiPlatformConfigMapper sysApiPlatformConfigMapper;
private final Map<String, SysApiPlatformConfigEntity> consumerCache = new ConcurrentHashMap<>();
@PostConstruct
public void init() {
refreshCache();
}
public void refreshCache() {
List<SysApiPlatformConfigEntity> list = sysApiPlatformConfigMapper.selectList(
new LambdaQueryWrapper<SysApiPlatformConfigEntity>()
.eq(SysApiPlatformConfigEntity::getStatus, "0")
);
Map<String, SysApiPlatformConfigEntity> newMap = new ConcurrentHashMap<>();
for (SysApiPlatformConfigEntity entity : list) {
newMap.put(entity.getAppKey(), entity);
}
consumerCache.clear();
consumerCache.putAll(newMap);
log.info("API接入配置缓存刷新, 共加载{}个渠道", newMap.size());
}
public Optional<SysApiPlatformConfigEntity> findByAppKey(String appKey) {
return Optional.ofNullable(consumerCache.get(appKey));
}
@Override
public Optional<SysApiPlatformConfigEntity> findByAppKeyFromDb(String appKey) {
public Optional<SysApiPlatformConfigEntity> findByAppKey(String appKey) {
SysApiPlatformConfigEntity entity = sysApiPlatformConfigMapper.selectOne(
new LambdaQueryWrapper<SysApiPlatformConfigEntity>()
.eq(SysApiPlatformConfigEntity::getAppKey, appKey)
@ -55,4 +27,5 @@ public class SysApiPlatformConfigServiceImpl implements ISysApiPlatformConfigSer
);
return Optional.ofNullable(entity);
}
}

412
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/CimDashboardOverviewMapper.xml

@ -15,7 +15,6 @@
left join dashboard_area_info t3 on
t2.area_node = t3.code
<where>
t1.is_delete = 0
and t1.bureau_dept_name is not null
and t1.is_submit = 1
@ -31,7 +30,7 @@
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{dayTime},'%Y-%m-%d')
</if>
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') &gt;= DATE_FORMAT(#{monthTime},'%Y-%m')
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
@ -116,7 +115,7 @@
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{dayTime},'%Y-%m-%d')
</if>
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{monthTime},'%Y-%m-%d')
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="enterpriseNumber !=null and enterpriseNumber !=''">
and t1.enterprise_number = #{enterpriseNumber}
@ -127,6 +126,47 @@
</where>
</select>
<!-- 获取执法人员数 -->
<select id="getLawPersonnelCount" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
select
t1.code,
t1.area_code as areaCode,
t1.name,
t1.zfrys
from view_area_legal_officer t1
<where>
<if test="monthTime !=null">
and DATE_FORMAT(t1.CD_TIME,'%Y-%m')= DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code!=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t1.code=#{code}
</if>
</where>
</select>
<!-- 获取执法单位数据 -->
<select id="getLawUnitCount" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
select
t1.code ,
t1.name ,
count(t2.dept_id) as zfdws
from
dashboard_area_info t1
inner join sys_dept t2
on t1.code = t2.area_node and t1.`level` = '3' and t2.`zone` in(1,3,4,5,6,15,16)
<where>
<if test="code!=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t1.code=#{code}
</if>
<if test="monthTime !=null">
and DATE_FORMAT(t2.create_time,'%Y-%m')= DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
</where>
group by
t1.code,
t1.name
</select>
<!-- 获取计划总数 (月)-->
<select id="getPlanCount" resultType="java.lang.Long" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
select
@ -142,7 +182,7 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.plan_date,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!=''">
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
@ -164,7 +204,7 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.publish_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!=''">
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
@ -188,7 +228,7 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!=''">
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
@ -213,7 +253,7 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!=''">
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
@ -239,7 +279,7 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!=''">
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
@ -281,69 +321,6 @@
<!-- 获取单独部门执法 (实)-->
<select id="getSepDeptLawCount" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo" resultType="java.lang.Long">
<!--select
(
select
count(1)
from
enforcement_registration t1
left join sys_dept t2 on
t1.bureau_dept_id = t2.dept_id
left join dashboard_area_info t3 on
t2.area_node = t3.code
<where>
t1.is_submit = 1
and t1.is_delete = 0
and t1.enterprise_name is not null
and t1.enterprise_number is not null
and t1.bureau_dept_name is not null
and t1.dept_id is not null
and t1.law_enforcer_id is not null
and t1.law_enforcer_id_other is not null
and t1.law_enforcement_type is not null
and t1.bureau_dept_id is not null
<if test="dayTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{dayTime},'%Y-%m-%d')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
)+(
select
count(1) as _count
from
(
select
1
from
enforcement_registration t1
left join sys_dept t2 on
t1.bureau_dept_id = t2.dept_id
left join dashboard_area_info t3 on
t2.area_node = t3.code
<where>
t1.is_submit = 1
and t1.is_delete = 0
and t1.enterprise_name is not null
and t1.enterprise_number is not null
and t1.bureau_dept_name is not null
and t1.dept_id is not null
and t1.law_enforcer_id is not null
and t1.law_enforcer_id_other is not null
and t1.law_enforcement_type is not null
and t1.bureau_dept_id is not null
and t1.union_no is not null
and t1.union_no != ''
<if test="dayTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{dayTime},'%Y-%m-%d')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
GROUP BY t1.union_no HAVING COUNT(1) &lt; 2) as t
)-->
select
count(1)
from
@ -376,45 +353,6 @@
<!-- 联合检查数量统计 (实)-->
<select id="getUnionLawCount" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo" resultType="java.lang.Long">
<!--SELECT
COUNT(1) AS lhjcs
FROM (
SELECT
1
FROM enforcement_registration t1
left join sys_dept t2 on
t1.bureau_dept_id = t2.dept_id
left join dashboard_area_info t3 on
t2.area_node = t3.code
<where>
t1.is_submit = 1
and t1.is_delete = 0
and t1.enterprise_name is not null
and t1.enterprise_number is not null
and t1.bureau_dept_name is not null
and t1.dept_id is not null
and t1.law_enforcer_id is not null
and t1.law_enforcer_id_other is not null
and t1.law_enforcement_type is not null
and t1.bureau_dept_id is not null
and t1.union_no IS NOT NULL
and t1.union_no != ''
<if test="dayTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m-%d') = DATE_FORMAT(#{dayTime},'%Y-%m-%d')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="enterpriseNumber !=null and enterpriseNumber !=''">
and t1.enterprise_number = #{enterpriseNumber}
</if>
</where>
GROUP BY t1.union_no
HAVING COUNT(1) &gt; 1
) AS t-->
select
COUNT(distinct union_no) as lhjcs
from
@ -452,72 +390,6 @@
<!-- 获取区域检查趋势分析(季度) -->
<select id="getQuarterlyRegionList" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
<!--select
t3.code,
t3.name,
sum(case when QUARTER(t1.enforcement_time)= 1 then 1 else 0 end) as firstQuarter,
sum(case when QUARTER(t1.enforcement_time)= 2 then 1 else 0 end) as secondQuarter,
sum(case when QUARTER(t1.enforcement_time)= 3 then 1 else 0 end) as thirdQuarter,
sum(case when QUARTER(t1.enforcement_time)= 4 then 1 else 0 end) as fourthQuarter
from
enforcement_registration t1
left join sys_dept t2
on t1.bureau_dept_id = t2.dept_id
left join dashboard_area_info t3
on t2.area_node = t3.code and t3.`level` = 3
<where>
t3.code is not null
and t1.is_delete = 0
and t1.is_submit = 1
<if test="yearTime !=null ">
and DATE_FORMAT(t1.enforcement_time,'%Y')= DATE_FORMAT(#{yearTime},'%Y')
</if>
<if test="code !=null and code!=''">
and t3.code = #{code}
</if>
</where>
group by
t3.code,
t3.name
<if test="Sorting =='GP'">
<if test="quarter=='Q1'">
order by
firstQuarter desc
</if>
<if test="quarter=='Q2'">
order by
secondQuarter desc
</if>
<if test="quarter=='Q3'">
order by
thirdQuarter desc
</if>
<if test="quarter=='Q4'">
order by
fourthQuarter desc
</if>
</if>
<if test="Sorting =='DP'">
<if test="quarter=='Q1'">
order by
firstQuarter
</if>
<if test="quarter=='Q2'">
order by
fourthQuarter
</if>
<if test="quarter=='Q3'">
order by
thirdQuarter
</if>
<if test="quarter=='Q4'">
order by
fourthQuarter
</if>
</if>
<if test="scope =='topFive'">
limit 5
</if>-->
SELECT
t3.code,
t3.name,
@ -540,73 +412,55 @@
GROUP BY t3.code, t3.name
</select>
<!-- 下转联动某个区域查询对应区域街道的数据 -->
<select id="getAreaQuarterlyRegionList" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
SELECT
t3.code,
t3.name,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW()) - 5) / 4), 'Q', (year(NOW())* 4 + QUARTER(NOW()) - 5) % 4 + 1) as firstTime,
coalesce(q.first_quarter, 0) as firstQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW()) - 4) / 4), 'Q', (year(NOW())* 4 + QUARTER(NOW()) - 4) % 4 + 1) as secondTime,
coalesce(q.second_quarter, 0) as secondQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW()) - 3) / 4), 'Q', (year(NOW())* 4 + QUARTER(NOW()) - 3) % 4 + 1) as thirdTime,
coalesce(q.third_quarter, 0) as thirdQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW()) - 2) / 4), 'Q', (year(NOW())* 4 + QUARTER(NOW()) - 2) % 4 + 1) as fourthTime,
coalesce(q.fourth_quarter, 0) as fourthQuarter,
coalesce(q.total_cnt, 0) as total_cnt
FROM dashboard_area_info t3
LEFT JOIN (
SELECT
a.code,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW()) - 4 then 1 else 0 end) as first_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW()) - 3 then 1 else 0 end) as second_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW()) - 2 then 1 else 0 end) as third_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW()) - 1 then 1 else 0 end) as fourth_quarter,
COUNT(1) as total_cnt
FROM enforcement_registration t1
INNER JOIN dashboard_area_info a
ON t1.enterprise_address LIKE CONCAT('%', a.name, '%')
WHERE a.level = 4
AND a.is_delete = '0'
<if test="code!=null and code !='' and code!='20220210190102183-D7DD-E31F5E9C1'">
AND a.parent_code = #{code}
</if>
AND t1.is_delete = 0
AND t1.is_submit = 1
AND t1.enterprise_name IS NOT NULL
AND t1.enterprise_number IS NOT NULL
and year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) between year(NOW())* 4 + QUARTER(NOW()) - 4 and year(NOW())* 4 + QUARTER(NOW()) - 1
GROUP BY a.code
) q ON t3.code = q.code
WHERE t3.level = 4
AND t3.is_delete = '0'
<if test="code!=null and code !='' and code!='20220210190102183-D7DD-E31F5E9C1'">
AND t3.parent_code = #{code}
</if>
ORDER BY t3.code
</select>
<!-- 获取领域检查趋势分析(季度) -->
<select id="getDomainQuarterList" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
<!--select
t3.domain_id as code,
t3.domain_name as name,
sum(case when QUARTER(t1.enforcement_time)= 1 then 1 else 0 end) as firstQuarter,
sum(case when QUARTER(t1.enforcement_time)= 2 then 1 else 0 end) as secondQuarter,
sum(case when QUARTER(t1.enforcement_time)= 3 then 1 else 0 end) as thirdQuarter,
sum(case when QUARTER(t1.enforcement_time)= 4 then 1 else 0 end) as fourthQuarter
from enforcement_registration t1
left join sys_dept t2 on
t1.bureau_dept_id = t2.dept_id
left join dashboard_domain_dept t3 on
t2.dept_id = t3.dept_id
<where>
t3.domain_id is not null
and t1.is_delete = 0
and t1.is_submit = 1
<if test="yearTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y')= DATE_FORMAT(#{yearTime},'%Y')
</if>
<if test="code !=null and code!=''">
and t3.domain_id = #{code}
</if>
</where>
group by
t3.domain_id ,
t3.domain_name
<if test="Sorting =='GP'">
<if test="quarter=='Q1'">
order by
firstQuarter desc
</if>
<if test="quarter=='Q2'">
order by
secondQuarter desc
</if>
<if test="quarter=='Q3'">
order by
thirdQuarter desc
</if>
<if test="quarter=='Q4'">
order by
fourthQuarter desc
</if>
</if>
<if test="Sorting =='DP'">
<if test="quarter=='Q1'">
order by
firstQuarter
</if>
<if test="quarter=='Q2'">
order by
secondQuarter
</if>
<if test="quarter=='Q3'">
order by
thirdQuarter
</if>
<if test="quarter=='Q4'">
order by
fourthQuarter
</if>
</if>
<if test="scope =='topFive'">
limit 5
</if>-->
SELECT
t3.domain_id as code,
t3.domain_name as name,
@ -633,6 +487,59 @@
t3.domain_name
</select>
<!-- 下转联动某个区域查询对应区域领域的数据(季度) -->
<select id="getAreaDomainQuarterList" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
SELECT
t3.domain_id as code,
t3.domain_name as name,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW())-4-1)/ 4), 'Q', (year(NOW())* 4 + QUARTER(NOW())-4-1)%4 + 1) as firstTime,
coalesce(q.first_quarter, 0) as firstQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW())-3-1)/ 4), 'Q', (year(NOW())* 4 + QUARTER(NOW())-3-1)%4 + 1) as secondTime,
coalesce(q.second_quarter, 0) as secondQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW())-2-1)/ 4), 'Q', (year(NOW())* 4 + QUARTER(NOW())-2-1)%4 + 1) as thirdTime,
coalesce(q.third_quarter, 0) as thirdQuarter,
CONCAT(FLOOR((year(NOW())* 4 + QUARTER(NOW())-1-1)/ 4), 'Q', (year(NOW())* 4 + QUARTER(NOW())-1-1)%4 + 1) as fourthTime,
coalesce(q.fourth_quarter, 0) as fourthQuarter,
coalesce(q.total_cnt, 0) as total_cnt
FROM (
<!-- 该区下有部门的领域(去重)-->
SELECT DISTINCT
d.domain_id,
d.domain_name
FROM dashboard_domain_dept d
INNER JOIN sys_dept sd ON d.dept_id = sd.dept_id
<where>
<if test="code!=null and code !='' and code!='20220210190102183-D7DD-E31F5E9C1'">
AND sd.area_node = #{code}
</if>
</where>
) t3
LEFT JOIN (
SELECT
d.domain_id,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW())-4 then 1 else 0 end) as first_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW())-3 then 1 else 0 end) as second_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW())-2 then 1 else 0 end) as third_quarter,
SUM(case when year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) = year(NOW())* 4 + QUARTER(NOW())-1 then 1 else 0 end) as fourth_quarter,
COUNT(1) as total_cnt
FROM enforcement_registration t1
INNER JOIN sys_dept t2 ON t1.bureau_dept_id = t2.dept_id
INNER JOIN dashboard_domain_dept d ON t2.dept_id = d.dept_id
<where>
<if test="code!=null and code !='' and code!='20220210190102183-D7DD-E31F5E9C1'">
t2.area_node = #{code}
</if>
AND d.domain_id IS NOT NULL
AND t1.is_delete = 0
AND t1.is_submit = 1
and year(t1.enforcement_time)* 4 + QUARTER(t1.enforcement_time) between year(NOW())* 4 + QUARTER(NOW())-4 and year(NOW())* 4 + QUARTER(NOW())-1
</where>
GROUP BY d.domain_id
) q ON t3.domain_id = q.domain_id
ORDER BY t3.domain_id;
</select>
<!-- 获取涉企登记执法类别 (实)-->
<select id="getEnfRegistrationType" resultType="com.zdxt.enforcementcode.domain.vo.CimDashboardOverviewVo" parameterType="com.zdxt.enforcementcode.domain.bo.CimDashboardOverviewQueryBo">
select
@ -776,6 +683,9 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
and t3.level !=1
</where>
group by
@ -787,14 +697,14 @@
select
t1.bureau_dept_id as bueauDeptId,
t1.bureau_dept_name as bureauDeptName,
count(t4.sl) as number
count(t4.sl) as lhzfcs
from
enforcement_registration t1
left join sys_dept t2 on
inner join sys_dept t2 on
t1.bureau_dept_id = t2.dept_id
left join dashboard_area_info t3 on
inner join dashboard_area_info t3 on
t2.area_node = t3.code
left join (
inner join (
select
t1.enterprise_number ,
t1.enterprise_name ,
@ -831,11 +741,14 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
group by
t1.bureau_dept_id,
t1.bureau_dept_name
order by number desc
order by lhzfcs desc
</select>
<!-- 高频检查区域执法单位检查数据排行 (月)-->
@ -843,7 +756,7 @@
select
t1.bureau_dept_id as bueauDeptId,
t1.bureau_dept_name as bureauDeptName,
count(t4.sl) as number
count(t4.sl) as jccs
from
enforcement_registration t1
left join sys_dept t2 on
@ -883,11 +796,14 @@
<if test="monthTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{monthTime},'%Y-%m')
</if>
<if test="code !=null and code!='' and code!='20220210190102183-D7DD-E31F5E9C1'">
and t3.code = #{code}
</if>
</where>
group by
t1.bureau_dept_id,
t1.bureau_dept_name
order by number desc
order by jccs desc
</select>
<!-- 获取各领域高频检查次数排行 (月)-->

9
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardEnterpriseCheckMapper.xml

@ -55,8 +55,11 @@
t1.xzzfzs
FROM dashboard_enterprise_check t1
WHERE IFNULL(t1.is_delete, '0') = '0'
<if test="bo.enterpriseNumber !=null and bo.enterpriseNumber!=''">
and t1.enterprise_number=#{bo.enterpriseNumber}
<if test="bo.enterpriseNumber != null and bo.enterpriseNumber != ''">
AND t1.enterprise_number IN
<foreach collection="bo.enterpriseNumber.split(',')" item="num" open="(" separator="," close=")">
#{num}
</foreach>
</if>
<if test="bo.enterpriseName != null and bo.enterpriseName != ''">
AND t1.enterprise_name LIKE CONCAT('%', #{bo.enterpriseName}, '%')
@ -110,6 +113,6 @@
</if>
</where>
order by
t1.enforcement_time
t1.enforcement_time desc
</select>
</mapper>

102
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardHighCheckEntdetailsAreaMapper.xml

@ -4,66 +4,70 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zdxt.enforcementcode.mapper.DashboardHighCheckEntdetailsAreaMapper">
<sql id="selectHighCheckAreaSql">
select
t1.enterprise_number as enterpriseNumber,
t1.enterprise_name as enterpriseName,
count(t1.enterprise_number) as xzzfcs,
CASE
WHEN t2.enterprise_address REGEXP '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)')
WHEN t2.enterprise_address REGEXP '^深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REPLACE(REGEXP_SUBSTR(t2.enterprise_address,'深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'),'深圳市', '')
WHEN t2.enterprise_address REGEXP '市.+?(区|县)'
THEN REGEXP_REPLACE(t2.enterprise_address, '^.*?市(.+?(区|县)).*$', '$1')
ELSE NULL
END AS district,
<!--========== street 街道/镇 ==========-->
CASE
<!--深圳地址-->
WHEN t2.enterprise_address REGEXP '^(深圳市)?(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(SUBSTRING(t2.enterprise_address, LOCATE(
select t1.enterprisenumber ,t1.enterprisename ,t1.xzzfcs ,t1.district ,t1.street from(
select
t1.enterprise_number as enterpriseNumber,
t1.enterprise_name as enterpriseName,
count(t1.enterprise_number) as xzzfcs,
CASE
WHEN t2.enterprise_address REGEXP '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)')
ELSE REPLACE(REGEXP_SUBSTR(t2.enterprise_address, '深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'), '深圳市', '')
END, t2.enterprise_address) + CHAR_LENGTH(
WHEN t2.enterprise_address REGEXP '^深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REPLACE(REGEXP_SUBSTR(t2.enterprise_address,'深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'),'深圳市', '')
WHEN t2.enterprise_address REGEXP '市[^市区县]+(区|县)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '[^市区县]+(区|县)')
ELSE NULL
END AS district,
<!--========== street 街道/镇 ==========-->
CASE
WHEN t2.enterprise_address REGEXP '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)')
ELSE REPLACE(REGEXP_SUBSTR(t2.enterprise_address,'深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'), '深圳市', '')
END)),'[0-9一-龥]+街道')
<!-- 外地地址-->
WHEN t2.enterprise_address REGEXP '市.+?(区|县)'
THEN REGEXP_SUBSTR(SUBSTRING(t2.enterprise_address,LOCATE(REGEXP_REPLACE(t2.enterprise_address, '^.*?市(.+?(区|县)).*$', '$1'),t2.enterprise_address
) + CHAR_LENGTH(REGEXP_REPLACE(t2.enterprise_address, '^.*?市(.+?(区|县)).*$', '$1'))),'[0-9一-龥]+(街道|镇)')
ELSE NULL
END AS street
from
enforcement_registration t1
left join enterprise_information t2
on t1.enterprise_number=t2.enterprise_number
<!--深圳地址-->
WHEN t2.enterprise_address REGEXP '^(深圳市){0,1}(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(SUBSTRING(t2.enterprise_address, LOCATE(
CASE
WHEN t2.enterprise_address REGEXP '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)')
ELSE REPLACE(REGEXP_SUBSTR(t2.enterprise_address, '深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'), '深圳市', '')
END, t2.enterprise_address) + CHAR_LENGTH(
CASE
WHEN t2.enterprise_address REGEXP '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'
THEN REGEXP_SUBSTR(t2.enterprise_address, '^(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)')
ELSE REPLACE(REGEXP_SUBSTR(t2.enterprise_address,'深圳市(福田区|罗湖区|南山区|宝安区|龙岗区|盐田区|龙华区|坪山区|光明区|大鹏新区|坪山新区|光明新区|龙华新区)'), '深圳市', '')
END)),'[0-9一-龥]+街道')
<!-- 外地地址-->
WHEN t2.enterprise_address REGEXP '市[^市区县]+(区|县)'
THEN REGEXP_SUBSTR(SUBSTRING(t2.enterprise_address, LOCATE(REGEXP_SUBSTR(t2.enterprise_address,'[^市区县]+(区|县)'),t2.enterprise_address
) + CHAR_LENGTH(REGEXP_SUBSTR(t2.enterprise_address,'[^市区县]+(区|县)'))),'[0-9一-龥]+(街道|镇)')
ELSE NULL
END AS street
from
enforcement_registration t1
left join enterprise_information t2
on t1.enterprise_number=t2.enterprise_number
<where>
t1.is_delete =0
and t1.is_submit =1
and t1.enterprise_name is not null
and t1.enterprise_number is not null
<if test="bo.enforcementTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{bo.enforcementTime},'%Y-%m')
</if>
</where>
group by
t1.enterprise_number,
t1.enterprise_name
having
xzzfcs >= 3
order by xzzfcs desc,t1.enterprise_number desc) t1
<where>
t1.is_delete =0
and t1.is_submit =1
and t1.enterprise_name is not null
and t1.enterprise_number is not null
<if test="bo.enforcementTime !=null">
and DATE_FORMAT(t1.enforcement_time,'%Y-%m') = DATE_FORMAT(#{bo.enforcementTime},'%Y-%m')
<if test="bo.district!=null and bo.district!=''">
and t1.district=#{bo.district}
</if>
<if test="bo.enterpriseName !=null and bo.enterpriseName!=''">
and t1.enterprise_name like CONCAT('%', #{bo.enterpriseName}, '%')
</if>
<if test="bo.district!=null and bo.district!=''">
and t1.district=#{bo.district}
</if>
</where>
group by
t1.enterprise_number,
t1.enterprise_name
having
xzzfcs >= 3
order by xzzfcs desc,t1.enterprise_number desc
</sql>
<select id="selectHighCheckAreaPageList" resultType="com.zdxt.enforcementcode.domain.vo.DashboardHighCheckEntdetailsAreaVo">

4
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardSituationTrendAreaMapper.xml

@ -29,9 +29,9 @@
<if test="bo.startYear != null and bo.startQuarter != null and bo.endYear != null and bo.endQuarter != null">
AND (
(a.year = #{bo.startYear} AND a.quarter &gt;= #{bo.startQuarter})
(a.year = #{bo.startYear} AND a.quarter = #{bo.startQuarter})
OR (a.year &gt; #{bo.startYear} AND a.year &lt; #{bo.endYear})
OR (a.year = #{bo.endYear} AND a.quarter &lt;= #{bo.endQuarter})
OR (a.year = #{bo.endYear} AND a.quarter = #{bo.endQuarter})
)
</if>

4
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/DashboardSituationTrendDomainMapper.xml

@ -31,9 +31,9 @@
<if test="bo.startYear != null and bo.startQuarter != null and bo.endYear != null and bo.endQuarter != null">
AND (
(a.year = #{bo.startYear} AND a.quarter &gt;= #{bo.startQuarter})
(a.year = #{bo.startYear} AND a.quarter = #{bo.startQuarter})
OR (a.year &gt; #{bo.startYear} AND a.year &lt; #{bo.endYear})
OR (a.year = #{bo.endYear} AND a.quarter &lt;= #{bo.endQuarter})
OR (a.year = #{bo.endYear} AND a.quarter = #{bo.endQuarter})
)
</if>

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

@ -49,9 +49,17 @@
<if test="bo.districtName!=null and bo.districtName !=''">
and t4.name like CONCAT('%', #{bo.districtName}, '%')
</if>
<if test="bo.bureauDeptName!=null and bo.bureauDeptName !=''">
and t1.bureauDeptName like CONCAT('%', #{bo.bureauDeptName}, '%')
</if>
</where>
and t4.level = 3
order by t1.zfcs desc
order by
<choose>
<when test="bo.orderByColumn == 'zfcs'">zfcs</when>
<otherwise>zfcs</otherwise>
</choose>
<if test="bo.isAsc == 'desc'">desc</if>
</sql>
<select id="selectLawEnfOfficerPageList" resultType="com.zdxt.enforcementcode.domain.vo.EnforcementRegistrationVo">

55
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/ScanDataSituationMapper.xml

@ -122,8 +122,19 @@
</if>
) base
<!--#where base.district_name ='宝安区'-->
<!-- 排序:orderByColumn 走白名单映射,避免 ${} 拼接造成 SQL 注入;未指定时默认按 xzzfslpm 升序 -->
order by
xzzfslpm
<choose>
<when test="bo.orderByColumn == 'enterpriseCount'">enterpriseCount</when>
<when test="bo.orderByColumn == 'xzzfCount'">xzzfCount</when>
<when test="bo.orderByColumn == 'xzzfslpm'">xzzfslpm</when>
<when test="bo.orderByColumn == 'xzzfslzb'">xzzfslzb</when>
<when test="bo.orderByColumn == 'fxzzfsl'">fxzzfsl</when>
<when test="bo.orderByColumn == 'fxzzfslpm'">fxzzfslpm</when>
<when test="bo.orderByColumn == 'fxzzfslzb'">fxzzfslzb</when>
<otherwise>xzzfslpm</otherwise>
</choose>
<if test="bo.isAsc == 'desc'">desc</if>
</sql>
<select id="selectScanDataSituationAreaPageList" resultType="com.zdxt.enforcementcode.domain.vo.ScanDataSituationVo">
@ -256,8 +267,19 @@
and t3.parent_code =#{bo.districtCode}
</if>
) base
<!-- 排序:与区域列表一致,走白名单,避免 MyBatis-Plus 再追加排序字段 -->
order by
xzzfslpm
<choose>
<when test="bo.orderByColumn == 'enterpriseCount'">enterpriseCount</when>
<when test="bo.orderByColumn == 'xzzfCount'">xzzfCount</when>
<when test="bo.orderByColumn == 'xzzfslpm'">xzzfslpm</when>
<when test="bo.orderByColumn == 'xzzfslzb'">xzzfslzb</when>
<when test="bo.orderByColumn == 'fxzzfsl'">fxzzfsl</when>
<when test="bo.orderByColumn == 'fxzzfslpm'">fxzzfslpm</when>
<when test="bo.orderByColumn == 'fxzzfslzb'">fxzzfslzb</when>
<otherwise>xzzfslpm</otherwise>
</choose>
<if test="bo.isAsc == 'desc'">desc</if>
</select>
@ -371,7 +393,16 @@
</where>
) base
order by
xzzfslpm
<choose>
<when test="bo.orderByColumn == 'xzzfCount'">xzzfCount</when>
<when test="bo.orderByColumn == 'xzzfslpm'">xzzfslpm</when>
<when test="bo.orderByColumn == 'xzzfslzb'">xzzfslzb</when>
<when test="bo.orderByColumn == 'fxzzfsl'">fxzzfsl</when>
<when test="bo.orderByColumn == 'fxzzfslpm'">fxzzfslpm</when>
<when test="bo.orderByColumn == 'fxzzfslzb'">fxzzfslzb</when>
<otherwise>xzzfslpm</otherwise>
</choose>
<if test="bo.isAsc == 'desc'">desc</if>
</sql>
<select id="selectScanDataSituationDomainPageList" resultType="com.zdxt.enforcementcode.domain.vo.ScanDataSituationVo">
@ -496,8 +527,22 @@
t1.code = fxz.code
where
t1.level = 3
and t1.is_delete = '0' ) base
and t1.is_delete = '0'
<if test="bo.districtCode != null and bo.districtCode !=null">
and t1.code = #{bo.districtCode}
</if>
) base
<!-- 排序:与领域列表一致,走白名单,避免 MyBatis-Plus 再追加排序字段 -->
order by
xzzfslpm
<choose>
<when test="bo.orderByColumn == 'xzzfCount'">xzzfCount</when>
<when test="bo.orderByColumn == 'xzzfslpm'">xzzfslpm</when>
<when test="bo.orderByColumn == 'xzzfslzb'">xzzfslzb</when>
<when test="bo.orderByColumn == 'fxzzfsl'">fxzzfsl</when>
<when test="bo.orderByColumn == 'fxzzfslpm'">fxzzfslpm</when>
<when test="bo.orderByColumn == 'fxzzfslzb'">fxzzfslzb</when>
<otherwise>xzzfslpm</otherwise>
</choose>
<if test="bo.isAsc == 'desc'">desc</if>
</select>
</mapper>

184
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SrzDeptMapper.xml

@ -8,86 +8,88 @@
<insert id="insertSrzDept" parameterType="com.zdxt.enforcementcode.domain.SrzDept">
insert into srz_dept
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="organizationId != null and organizationId != ''">organizationId,</if>
<if test="organizationid != null and organizationid != ''">organizationId,</if>
<if test="name != null and name != ''">name,</if>
<if test="code != null and code != ''">code,</if>
<if test="effectOn != null and effectOn != ''">effectOn,</if>
<if test="taskId != null and taskId != ''">taskId,</if>
<if test="zzDisplayPath != null and zzDisplayPath != ''">zzDisplayPath,</if>
<if test="zzIsLeaf != null and zzIsLeaf != ''">zzIsLeaf,</if>
<if test="isDeleted != null and isDeleted != ''">isDeleted,</if>
<if test="isDisabled != null and isDisabled != ''">isDisabled,</if>
<if test="systemId != null and systemId != ''">systemId,</if>
<if test="zzLevel != null and zzLevel != ''">zzLevel,</if>
<if test="parentId != null and parentId != ''">parentId,</if>
<if test="effecton != null and effecton != ''">effectOn,</if>
<if test="taskid != null and taskid != ''">taskId,</if>
<if test="zzdisplaypath != null and zzdisplaypath != ''">zzDisplayPath,</if>
<if test="zzisleaf != null and zzisleaf != ''">zzIsLeaf,</if>
<if test="isdeleted != null and isdeleted != ''">isDeleted,</if>
<if test="isdisabled != null and isdisabled != ''">isDisabled,</if>
<if test="systemid != null and systemid != ''">systemId,</if>
<if test="zzlevel != null and zzlevel != ''">zzLevel,</if>
<if test="parentid != null and parentid != ''">parentId,</if>
<if test="sequence != null and sequence != ''">sequence,</if>
<if test="createAt != null and createAt != ''">createAt,</if>
<if test="updateAt != null and updateAt != ''">updateAt,</if>
<if test="createat != null and createat != ''">createAt,</if>
<if test="updateat != null and updateat != ''">updateAt,</if>
<if test="guid != null and guid != ''">guid,</if>
<if test="isMappingUnit != null and isMappingUnit != ''">isMappingUnit,</if>
<if test="mappingUnitParentId != null and mappingUnitParentId != ''">mappingUnitParentId,</if>
<if test="srzUnitId != null and srzUnitId != ''">srzUnitId,</if>
<if test="simpleName != null and simpleName != ''">simpleName,</if>
<if test="isStatutoryOrg != null and isStatutoryOrg != ''">isStatutoryOrg,</if>
<if test="isActive != null and isActive != ''">isActive,</if>
<if test="unitStatusCode != null and unitStatusCode != ''">unitStatusCode,</if>
<if test="unitStatus != null and unitStatus != ''">unitStatus,</if>
<if test="unitType != null and unitType != ''">unitType,</if>
<if test="xzqhCode != null and xzqhCode != ''">xzqhCode,</if>
<if test="ismappingunit != null and ismappingunit != ''">isMappingUnit,</if>
<if test="mappingunitparentid != null and mappingunitparentid != ''">mappingUnitParentId,</if>
<if test="srzunitid != null and srzunitid != ''">srzUnitId,</if>
<if test="simplename != null and simplename != ''">simpleName,</if>
<if test="isstatutoryorg != null and isstatutoryorg != ''">isStatutoryOrg,</if>
<if test="isactive != null and isactive != ''">isActive,</if>
<if test="unitstatuscode != null and unitstatuscode != ''">unitStatusCode,</if>
<if test="unitstatus != null and unitstatus != ''">unitStatus,</if>
<if test="unittype != null and unittype != ''">unitType,</if>
<if test="xzqhcode != null and xzqhcode != ''">xzqhCode,</if>
<if test="xzqh != null and xzqh != ''">xzqh,</if>
<if test="isCGManager != null and isCGManager != ''">isCGManager,</if>
<if test="isBureauOffice != null and isBureauOffice != ''">isBureauOffice,</if>
<if test="unitTypeCode != null and unitTypeCode != ''">unitTypeCode,</if>
<if test="dwxzCode != null and dwxzCode != ''">dwxzCode,</if>
<if test="iscgmanager != null and iscgmanager != ''">isCGManager,</if>
<if test="isbureauoffice != null and isbureauoffice != ''">isBureauOffice,</if>
<if test="unittypecode != null and unittypecode != ''">unitTypeCode,</if>
<if test="dwxzcode != null and dwxzcode != ''">dwxzCode,</if>
<if test="dwxz != null and dwxz != ''">dwxz,</if>
<if test="unitSysTypeCode != null and unitSysTypeCode != ''">unitSysTypeCode,</if>
<if test="unitSysType != null and unitSysType != ''">unitSysType,</if>
<if test="unitsystypecode != null and unitsystypecode != ''">unitSysTypeCode,</if>
<if test="unitsystype != null and unitsystype != ''">unitSysType,</if>
<if test="dwxtlbms != null and dwxtlbms != ''">dwxtlbms,</if>
<if test="unitLevelCode != null and unitLevelCode != ''">unitLevelCode,</if>
<if test="unitLevel != null and unitLevel != ''">unitLevel,</if>
<if test="unitlevelcode != null and unitlevelcode != ''">unitLevelCode,</if>
<if test="unitlevel != null and unitlevel != ''">unitLevel,</if>
<if test="creditcode != null and creditcode != ''">creditcode,</if>
<if test="description != null and description != ''">description,</if>
<if test="needUpdate != null">need_update,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="organizationId != null and organizationId != ''">#{organizationId},</if>
<if test="organizationid != null and organizationid != ''">#{organizationid},</if>
<if test="name != null and name != ''">#{name},</if>
<if test="code != null and code != ''">#{code},</if>
<if test="effectOn != null and effectOn != ''">#{effectOn},</if>
<if test="taskId != null and taskId != ''">#{taskId},</if>
<if test="zzDisplayPath != null and zzDisplayPath != ''">#{zzDisplayPath},</if>
<if test="zzIsLeaf != null and zzIsLeaf != ''">#{zzIsLeaf},</if>
<if test="isDeleted != null and isDeleted != ''">#{isDeleted},</if>
<if test="isDisabled != null and isDisabled != ''">#{isDisabled},</if>
<if test="systemId != null and systemId != ''">#{systemId},</if>
<if test="zzLevel != null and zzLevel != ''">#{zzLevel},</if>
<if test="parentId != null and parentId != ''">#{parentId},</if>
<if test="effecton != null and effecton != ''">#{effecton},</if>
<if test="taskid != null and taskid != ''">#{taskid},</if>
<if test="zzdisplaypath != null and zzdisplaypath != ''">#{zzdisplaypath},</if>
<if test="zzisleaf != null and zzisleaf != ''">#{zzisleaf},</if>
<if test="isdeleted != null and isdeleted != ''">#{isdeleted},</if>
<if test="isdisabled != null and isdisabled != ''">#{isdisabled},</if>
<if test="systemid != null and systemid != ''">#{systemid},</if>
<if test="zzlevel != null and zzlevel != ''">#{zzlevel},</if>
<if test="parentid != null and parentid != ''">#{parentid},</if>
<if test="sequence != null and sequence != ''">#{sequence},</if>
<if test="createAt != null and createAt != ''">#{createAt},</if>
<if test="updateAt != null and updateAt != ''">#{updateAt},</if>
<if test="createat != null and createat != ''">#{createat},</if>
<if test="updateat != null and updateat != ''">#{updateat},</if>
<if test="guid != null and guid != ''">#{guid},</if>
<if test="isMappingUnit != null and isMappingUnit != ''">#{isMappingUnit},</if>
<if test="mappingUnitParentId != null and mappingUnitParentId != ''">#{mappingUnitParentId},</if>
<if test="srzUnitId != null and srzUnitId != ''">#{srzUnitId},</if>
<if test="simpleName != null and simpleName != ''">#{simpleName},</if>
<if test="isStatutoryOrg != null and isStatutoryOrg != ''">#{isStatutoryOrg},</if>
<if test="isActive != null and isActive != ''">#{isActive},</if>
<if test="unitStatusCode != null and unitStatusCode != ''">#{unitStatusCode},</if>
<if test="unitStatus != null and unitStatus != ''">#{unitStatus},</if>
<if test="unitType != null and unitType != ''">#{unitType},</if>
<if test="xzqhCode != null and xzqhCode != ''">#{xzqhCode},</if>
<if test="ismappingunit != null and ismappingunit != ''">#{ismappingunit},</if>
<if test="mappingunitparentid != null and mappingunitparentid != ''">#{mappingunitparentid},</if>
<if test="srzunitid != null and srzunitid != ''">#{srzunitid},</if>
<if test="simplename != null and simplename != ''">#{simplename},</if>
<if test="isstatutoryorg != null and isstatutoryorg != ''">#{isstatutoryorg},</if>
<if test="isactive != null and isactive != ''">#{isactive},</if>
<if test="unitstatuscode != null and unitstatuscode != ''">#{unitstatuscode},</if>
<if test="unitstatus != null and unitstatus != ''">#{unitstatus},</if>
<if test="unittype != null and unittype != ''">#{unittype},</if>
<if test="xzqhcode != null and xzqhcode != ''">#{xzqhcode},</if>
<if test="xzqh != null and xzqh != ''">#{xzqh},</if>
<if test="isCGManager != null and isCGManager != ''">#{isCGManager},</if>
<if test="isBureauOffice != null and isBureauOffice != ''">#{isBureauOffice},</if>
<if test="unitTypeCode != null and unitTypeCode != ''">#{unitTypeCode},</if>
<if test="dwxzCode != null and dwxzCode != ''">#{dwxzCode},</if>
<if test="iscgmanager != null and iscgmanager != ''">#{iscgmanager},</if>
<if test="isbureauoffice != null and isbureauoffice != ''">#{isbureauoffice},</if>
<if test="unittypecode != null and unittypecode != ''">#{unittypecode},</if>
<if test="dwxzcode != null and dwxzcode != ''">#{dwxzcode},</if>
<if test="dwxz != null and dwxz != ''">#{dwxz},</if>
<if test="unitSysTypeCode != null and unitSysTypeCode != ''">#{unitSysTypeCode},</if>
<if test="unitSysType != null and unitSysType != ''">#{unitSysType},</if>
<if test="unitsystypecode != null and unitsystypecode != ''">#{unitsystypecode},</if>
<if test="unitsystype != null and unitsystype != ''">#{unitsystype},</if>
<if test="dwxtlbms != null and dwxtlbms != ''">#{dwxtlbms},</if>
<if test="unitLevelCode != null and unitLevelCode != ''">#{unitLevelCode},</if>
<if test="unitLevel != null and unitLevel != ''">#{unitLevel},</if>
<if test="unitlevelcode != null and unitlevelcode != ''">#{unitlevelcode},</if>
<if test="unitlevel != null and unitlevel != ''">#{unitlevel},</if>
<if test="creditcode != null and creditcode != ''">#{creditcode},</if>
<if test="description != null and description != ''">#{description},</if>
<if test="needUpdate != null">#{needUpdate},</if>
</trim>
</insert>
@ -96,44 +98,44 @@
<trim prefix="SET" suffixOverrides=",">
<if test="name != null and name != ''">name = #{name},</if>
<if test="code != null and code != ''">code = #{code},</if>
<if test="effectOn != null and effectOn != ''">effectOn = #{effectOn},</if>
<if test="taskId != null and taskId != ''">taskId = #{taskId},</if>
<if test="zzDisplayPath != null and zzDisplayPath != ''">zzDisplayPath = #{zzDisplayPath},</if>
<if test="zzIsLeaf != null and zzIsLeaf != ''">zzIsLeaf = #{zzIsLeaf},</if>
<if test="isDeleted != null and isDeleted != ''">isDeleted = #{isDeleted},</if>
<if test="isDisabled != null and isDisabled != ''">isDisabled = #{isDisabled},</if>
<if test="systemId != null and systemId != ''">systemId = #{systemId},</if>
<if test="zzLevel != null and zzLevel != ''">zzLevel = #{zzLevel},</if>
<if test="parentId != null and parentId != ''">parentId = #{parentId},</if>
<if test="effecton != null and effecton != ''">effectOn = #{effecton},</if>
<if test="taskid != null and taskid != ''">taskId = #{taskid},</if>
<if test="zzdisplaypath != null and zzdisplaypath != ''">zzDisplayPath = #{zzdisplaypath},</if>
<if test="zzisleaf != null and zzisleaf != ''">zzIsLeaf = #{zzisleaf},</if>
<if test="isdeleted != null and isdeleted != ''">isDeleted = #{isdeleted},</if>
<if test="isdisabled != null and isdisabled != ''">isDisabled = #{isdisabled},</if>
<if test="systemid != null and systemid != ''">systemId = #{systemid},</if>
<if test="zzlevel != null and zzlevel != ''">zzLevel = #{zzlevel},</if>
<if test="parentid != null and parentid != ''">parentId = #{parentid},</if>
<if test="sequence != null and sequence != ''">sequence = #{sequence},</if>
<if test="createAt != null and createAt != ''">createAt = #{createAt},</if>
<if test="updateAt != null and updateAt != ''">updateAt = #{updateAt},</if>
<if test="createat != null and createat != ''">createAt = #{createat},</if>
<if test="updateat != null and updateat != ''">updateAt = #{updateat},</if>
<if test="guid != null and guid != ''">guid = #{guid},</if>
<if test="isMappingUnit != null and isMappingUnit != ''">isMappingUnit = #{isMappingUnit},</if>
<if test="mappingUnitParentId != null and mappingUnitParentId != ''">mappingUnitParentId = #{mappingUnitParentId},</if>
<if test="srzUnitId != null and srzUnitId != ''">srzUnitId = #{srzUnitId},</if>
<if test="simpleName != null and simpleName != ''">simpleName = #{simpleName},</if>
<if test="isStatutoryOrg != null and isStatutoryOrg != ''">isStatutoryOrg = #{isStatutoryOrg},</if>
<if test="isActive != null and isActive != ''">isActive = #{isActive},</if>
<if test="unitStatusCode != null and unitStatusCode != ''">unitStatusCode = #{unitStatusCode},</if>
<if test="unitStatus != null and unitStatus != ''">unitStatus = #{unitStatus},</if>
<if test="unitType != null and unitType != ''">unitType = #{unitType},</if>
<if test="xzqhCode != null and xzqhCode != ''">xzqhCode = #{xzqhCode},</if>
<if test="ismappingunit != null and ismappingunit != ''">isMappingUnit = #{ismappingunit},</if>
<if test="mappingunitparentid != null and mappingunitparentid != ''">mappingUnitParentId = #{mappingunitparentid},</if>
<if test="srzunitid != null and srzunitid != ''">srzUnitId = #{srzunitid},</if>
<if test="simplename != null and simplename != ''">simpleName = #{simplename},</if>
<if test="isstatutoryorg != null and isstatutoryorg != ''">isStatutoryOrg = #{isstatutoryorg},</if>
<if test="isactive != null and isactive != ''">isActive = #{isactive},</if>
<if test="unitstatuscode != null and unitstatuscode != ''">unitStatusCode = #{unitstatuscode},</if>
<if test="unitstatus != null and unitstatus != ''">unitStatus = #{unitstatus},</if>
<if test="unittype != null and unittype != ''">unitType = #{unittype},</if>
<if test="xzqhcode != null and xzqhcode != ''">xzqhCode = #{xzqhcode},</if>
<if test="xzqh != null and xzqh != ''">xzqh = #{xzqh},</if>
<if test="isCGManager != null and isCGManager != ''">isCGManager = #{isCGManager},</if>
<if test="isBureauOffice != null and isBureauOffice != ''">isBureauOffice = #{isBureauOffice},</if>
<if test="unitTypeCode != null and unitTypeCode != ''">unitTypeCode = #{unitTypeCode},</if>
<if test="dwxzCode != null and dwxzCode != ''">dwxzCode = #{dwxzCode},</if>
<if test="iscgmanager != null and iscgmanager != ''">isCGManager = #{iscgmanager},</if>
<if test="isbureauoffice != null and isbureauoffice != ''">isBureauOffice = #{isbureauoffice},</if>
<if test="unittypecode != null and unittypecode != ''">unitTypeCode = #{unittypecode},</if>
<if test="dwxzcode != null and dwxzcode != ''">dwxzCode = #{dwxzcode},</if>
<if test="dwxz != null and dwxz != ''">dwxz = #{dwxz},</if>
<if test="unitSysTypeCode != null and unitSysTypeCode != ''">unitSysTypeCode = #{unitSysTypeCode},</if>
<if test="unitSysType != null and unitSysType != ''">unitSysType = #{unitSysType},</if>
<if test="unitsystypecode != null and unitsystypecode != ''">unitSysTypeCode = #{unitsystypecode},</if>
<if test="unitsystype != null and unitsystype != ''">unitSysType = #{unitsystype},</if>
<if test="dwxtlbms != null and dwxtlbms != ''">dwxtlbms = #{dwxtlbms},</if>
<if test="unitLevelCode != null and unitLevelCode != ''">unitLevelCode = #{unitLevelCode},</if>
<if test="unitLevel != null and unitLevel != ''">unitLevel = #{unitLevel},</if>
<if test="unitlevelcode != null and unitlevelcode != ''">unitLevelCode = #{unitlevelcode},</if>
<if test="unitlevel != null and unitlevel != ''">unitLevel = #{unitlevel},</if>
<if test="creditcode != null and creditcode != ''">creditcode = #{creditcode},</if>
<if test="description != null and description != ''">description=#{description},</if>
<if test="needUpdate != null and needUpdate != ''">need_update=#{needUpdate},</if>
<if test="needUpdate != null">need_update=#{needUpdate},</if>
</trim>
where organizationId = #{organizationId}
where organizationId = #{organizationid}
</update>
</mapper>

184
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/SrzUserMapper.xml

@ -8,65 +8,65 @@
<update id="updateUser" parameterType="com.zdxt.enforcementcode.domain.SrzUser">
UPDATE srz_user
<trim prefix="SET" suffixOverrides=",">
<if test="ryztCode != null and ryztCode != ''">ryztCode = #{ryztCode},</if>
<if test="mobileNumber != null and mobileNumber != ''">mobileNumber = #{mobileNumber},</if>
<if test="ryztcode != null and ryztcode != ''">ryztCode = #{ryztcode},</if>
<if test="mobilenumber != null and mobilenumber != ''">mobileNumber = #{mobilenumber},</if>
<if test="zcgzld != null and zcgzld != ''">zcgzld = #{zcgzld},</if>
<if test="gldw != null and gldw != ''">gldw = #{gldw},</if>
<if test="updateAt != null and updateAt != ''">updateAt = #{updateAt},</if>
<if test="zwjcCode != null and zwjcCode != ''">zwjcCode = #{zwjcCode},</if>
<if test="effectOn != null and effectOn != ''">effectOn = #{effectOn},</if>
<if test="updateat != null and updateat != ''">updateAt = #{updateat},</if>
<if test="zwjccode != null and zwjccode != ''">zwjcCode = #{zwjccode},</if>
<if test="effecton != null and effecton != ''">effectOn = #{effecton},</if>
<if test="zwjc != null and zwjc != ''">zwjc = #{zwjc},</if>
<if test="organizationId != null and organizationId != ''">organizationId = #{organizationId},</if>
<if test="organizationid != null and organizationid != ''">organizationId = #{organizationid},</if>
<if test="province != null and province != ''">province = #{province},</if>
<if test="isDisabled != null and isDisabled != ''">isDisabled = #{isDisabled},</if>
<if test="certificateTypeIdCode != null and certificateTypeIdCode != ''">certificateTypeIdCode = #{certificateTypeIdCode},</if>
<if test="isdisabled != null and isdisabled != ''">isDisabled = #{isdisabled},</if>
<if test="certificatetypeidcode != null and certificatetypeidcode != ''">certificateTypeIdCode = #{certificatetypeidcode},</if>
<if test="jrfs != null and jrfs != ''">jrfs = #{jrfs},</if>
<if test="spareNumber != null and spareNumber != ''">spareNumber = #{spareNumber},</if>
<if test="sparenumber != null and sparenumber != ''">spareNumber = #{sparenumber},</if>
<if test="positionname != null and positionname != ''">positionname = #{positionname},</if>
<if test="pylxcode != null and pylxcode != ''">pylxcode = #{pylxcode},</if>
<if test="jbcc != null and jbcc != ''">jbcc = #{jbcc},</if>
<if test="contractEndTime != null and contractEndTime != ''">contractEndTime = #{contractEndTime},</if>
<if test="contractendtime != null and contractendtime != ''">contractEndTime = #{contractendtime},</if>
<if test="sequence != null and sequence != ''">sequence = #{sequence},</if>
<if test="genderCode != null and genderCode != ''">genderCode = #{genderCode},</if>
<if test="zwwxMobile != null and zwwxMobile != ''">zwwxMobile = #{zwwxMobile},</if>
<if test="gendercode != null and gendercode != ''">genderCode = #{gendercode},</if>
<if test="zwwxmobile != null and zwwxmobile != ''">zwwxMobile = #{zwwxmobile},</if>
<if test="district != null and district != ''">district = #{district},</if>
<if test="certificateTypeId != null and certificateTypeId != ''">certificateTypeId = #{certificateTypeId},</if>
<if test="contractStartTime != null and contractStartTime != ''">contractStartTime = #{contractStartTime},</if>
<if test="certificatetypeid != null and certificatetypeid != ''">certificateTypeId = #{certificatetypeid},</if>
<if test="contractstarttime != null and contractstarttime != ''">contractStartTime = #{contractstarttime},</if>
<if test="rylydw != null and rylydw != ''">rylydw = #{rylydw},</if>
<if test="telephoneNumber != null and telephoneNumber != ''">telephoneNumber = #{telephoneNumber},</if>
<if test="telephonenumber != null and telephonenumber != ''">telephoneNumber = #{telephonenumber},</if>
<if test="gender != null and gender != ''">gender = #{gender},</if>
<if test="city != null and city != ''">city = #{city},</if>
<if test="jbccCode != null and jbccCode != ''">jbccCode = #{jbccCode},</if>
<if test="jbcccode != null and jbcccode != ''">jbccCode = #{jbcccode},</if>
<if test="rylb != null and rylb != ''">rylb = #{rylb},</if>
<if test="hometownCode != null and hometownCode != ''">hometownCode = #{hometownCode},</if>
<if test="hometowncode != null and hometowncode != ''">hometownCode = #{hometowncode},</if>
<if test="units != null and units != ''">units = #{units},</if>
<if test="srzUserid != null and srzUserid != ''">srzUserid = #{srzUserid},</if>
<if test="createAt != null and createAt != ''">createAt = #{createAt},</if>
<if test="engName != null and engName != ''">engName = #{engName},</if>
<if test="isDeleted != null and isDeleted != ''">isDeleted = #{isDeleted},</if>
<if test="srzuserid != null and srzuserid != ''">srzUserid = #{srzuserid},</if>
<if test="createat != null and createat != ''">createAt = #{createat},</if>
<if test="engname != null and engname != ''">engName = #{engname},</if>
<if test="isdeleted != null and isdeleted != ''">isDeleted = #{isdeleted},</if>
<if test="jrfscode != null and jrfscode != ''">jrfscode = #{jrfscode},</if>
<if test="email != null and email != ''">email = #{email},</if>
<if test="zwbsCode != null and zwbsCode != ''">zwbsCode = #{zwbsCode},</if>
<if test="zwbscode != null and zwbscode != ''">zwbsCode = #{zwbscode},</if>
<if test="dwzyld != null and dwzyld != ''">dwzyld = #{dwzyld},</if>
<if test="pylx != null and pylx != ''">pylx = #{pylx},</if>
<if test="systemId != null and systemId != ''">systemId = #{systemId},</if>
<if test="rylbCode != null and rylbCode != ''">rylbCode = #{rylbCode},</if>
<if test="systemid != null and systemid != ''">systemId = #{systemid},</if>
<if test="rylbcode != null and rylbcode != ''">rylbCode = #{rylbcode},</if>
<if test="hometown != null and hometown != ''">hometown = #{hometown},</if>
<if test="photo != null and photo != ''">photo = #{photo},</if>
<if test="glzrr != null and glzrr != ''">glzrr = #{glzrr},</if>
<if test="userId != null and userId != ''">userId = #{userId},</if>
<if test="zwwxId != null and zwwxId != ''">zwwxId = #{zwwxId},</if>
<if test="userid != null and userid != ''">userId = #{userid},</if>
<if test="zwwxid != null and zwwxid != ''">zwwxId = #{zwwxid},</if>
<if test="ryzt != null and ryzt != ''">ryzt = #{ryzt},</if>
<if test="certificateNumber != null and certificateNumber != ''">certificateNumber = #{certificateNumber},</if>
<if test="certificatenumber != null and certificatenumber != ''">certificateNumber = #{certificatenumber},</if>
<if test="zwbs != null and zwbs != ''">zwbs = #{zwbs},</if>
<if test="faxNumber != null and faxNumber != ''">faxNumber = #{faxNumber},</if>
<if test="faxnumber != null and faxnumber != ''">faxNumber = #{faxnumber},</if>
<if test="fullname != null and fullname != ''">fullname = #{fullname},</if>
<if test="isMappingPerson != null and isMappingPerson != ''">isMappingPerson = #{isMappingPerson},</if>
<if test="taskId != null and taskId != ''">taskId = #{taskId},</if>
<if test="ismappingperson != null and ismappingperson != ''">isMappingPerson = #{ismappingperson},</if>
<if test="taskid != null and taskid != ''">taskId = #{taskid},</if>
<if test="username != null and username != ''">username = #{username},</if>
<if test="needUpdate != null">need_update = #{needUpdate},</if>
</trim>
WHERE userId = #{userId}
WHERE userId = #{userid}
</update>
<!-- 安全动态插入:只更新非空字段 -->
@ -74,121 +74,123 @@
INSERT INTO srz_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="guid != null and guid != ''">guid,</if>
<if test="ryztCode != null and ryztCode != ''">ryztCode,</if>
<if test="mobileNumber != null and mobileNumber != ''">mobileNumber,</if>
<if test="ryztcode != null and ryztcode != ''">ryztCode,</if>
<if test="mobilenumber != null and mobilenumber != ''">mobileNumber,</if>
<if test="zcgzld != null and zcgzld != ''">zcgzld,</if>
<if test="gldw != null and gldw != ''">gldw,</if>
<if test="updateAt != null and updateAt != ''">updateAt,</if>
<if test="zwjcCode != null and zwjcCode != ''">zwjcCode,</if>
<if test="effectOn != null and effectOn != ''">effectOn,</if>
<if test="updateat != null and updateat != ''">updateAt,</if>
<if test="zwjccode != null and zwjccode != ''">zwjcCode,</if>
<if test="effecton != null and effecton != ''">effectOn,</if>
<if test="zwjc != null and zwjc != ''">zwjc,</if>
<if test="organizationId != null and organizationId != ''">organizationId,</if>
<if test="organizationid != null and organizationid != ''">organizationId,</if>
<if test="province != null and province != ''">province,</if>
<if test="isDisabled != null and isDisabled != ''">isDisabled,</if>
<if test="certificateTypeIdCode != null and certificateTypeIdCode != ''">certificateTypeIdCode,</if>
<if test="isdisabled != null and isdisabled != ''">isDisabled,</if>
<if test="certificatetypeidcode != null and certificatetypeidcode != ''">certificateTypeIdCode,</if>
<if test="jrfs != null and jrfs != ''">jrfs,</if>
<if test="spareNumber != null and spareNumber != ''">spareNumber,</if>
<if test="sparenumber != null and sparenumber != ''">spareNumber,</if>
<if test="positionname != null and positionname != ''">positionname,</if>
<if test="pylxcode != null and pylxcode != ''">pylxcode,</if>
<if test="jbcc != null and jbcc != ''">jbcc,</if>
<if test="contractEndTime != null and contractEndTime != ''">contractEndTime,</if>
<if test="contractendtime != null and contractendtime != ''">contractEndTime,</if>
<if test="sequence != null and sequence != ''">sequence,</if>
<if test="genderCode != null and genderCode != ''">genderCode,</if>
<if test="zwwxMobile != null and zwwxMobile != ''">zwwxMobile,</if>
<if test="gendercode != null and gendercode != ''">genderCode,</if>
<if test="zwwxmobile != null and zwwxmobile != ''">zwwxMobile,</if>
<if test="district != null and district != ''">district,</if>
<if test="certificateTypeId != null and certificateTypeId != ''">certificateTypeId,</if>
<if test="contractStartTime != null and contractStartTime != ''">contractStartTime,</if>
<if test="certificatetypeid != null and certificatetypeid != ''">certificateTypeId,</if>
<if test="contractstarttime != null and contractstarttime != ''">contractStartTime,</if>
<if test="rylydw != null and rylydw != ''">rylydw,</if>
<if test="telephoneNumber != null and telephoneNumber != ''">telephoneNumber,</if>
<if test="telephonenumber != null and telephonenumber != ''">telephoneNumber,</if>
<if test="gender != null and gender != ''">gender,</if>
<if test="city != null and city != ''">city,</if>
<if test="jbccCode != null and jbccCode != ''">jbccCode,</if>
<if test="jbcccode != null and jbcccode != ''">jbccCode,</if>
<if test="rylb != null and rylb != ''">rylb,</if>
<if test="hometownCode != null and hometownCode != ''">hometownCode,</if>
<if test="hometowncode != null and hometowncode != ''">hometownCode,</if>
<if test="units != null and units != ''">units,</if>
<if test="srzUserid != null and srzUserid != ''">srzUserid,</if>
<if test="createAt != null and createAt != ''">createAt,</if>
<if test="engName != null and engName != ''">engName,</if>
<if test="isDeleted != null and isDeleted != ''">isDeleted,</if>
<if test="srzuserid != null and srzuserid != ''">srzUserid,</if>
<if test="createat != null and createat != ''">createAt,</if>
<if test="engname != null and engname != ''">engName,</if>
<if test="isdeleted != null and isdeleted != ''">isDeleted,</if>
<if test="jrfscode != null and jrfscode != ''">jrfscode,</if>
<if test="email != null and email != ''">email,</if>
<if test="zwbsCode != null and zwbsCode != ''">zwbsCode,</if>
<if test="zwbscode != null and zwbscode != ''">zwbsCode,</if>
<if test="dwzyld != null and dwzyld != ''">dwzyld,</if>
<if test="pylx != null and pylx != ''">pylx,</if>
<if test="systemId != null and systemId != ''">systemId,</if>
<if test="rylbCode != null and rylbCode != ''">rylbCode,</if>
<if test="systemid != null and systemid != ''">systemId,</if>
<if test="rylbcode != null and rylbcode != ''">rylbCode,</if>
<if test="hometown != null and hometown != ''">hometown,</if>
<if test="photo != null and photo != ''">photo,</if>
<if test="glzrr != null and glzrr != ''">glzrr,</if>
<if test="userId != null and userId != ''">userId,</if>
<if test="zwwxId != null and zwwxId != ''">zwwxId,</if>
<if test="userid != null and userid != ''">userId,</if>
<if test="zwwxid != null and zwwxid != ''">zwwxId,</if>
<if test="ryzt != null and ryzt != ''">ryzt,</if>
<if test="certificateNumber != null and certificateNumber != ''">certificateNumber,</if>
<if test="certificatenumber != null and certificatenumber != ''">certificateNumber,</if>
<if test="zwbs != null and zwbs != ''">zwbs,</if>
<if test="faxNumber != null and faxNumber != ''">faxNumber,</if>
<if test="faxnumber != null and faxnumber != ''">faxNumber,</if>
<if test="fullname != null and fullname != ''">fullname,</if>
<if test="isMappingPerson != null and isMappingPerson != ''">isMappingPerson,</if>
<if test="taskId != null and taskId != ''">taskId,</if>
<if test="ismappingperson != null and ismappingperson != ''">isMappingPerson,</if>
<if test="taskid != null and taskid != ''">taskId,</if>
<if test="username != null and username != ''">username,</if>
<if test="needUpdate != null">need_update,</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="guid != null and guid != ''">#{guid},</if>
<if test="ryztCode != null and ryztCode != ''">#{ryztCode},</if>
<if test="mobileNumber != null and mobileNumber != ''">#{mobileNumber},</if>
<if test="ryztcode != null and ryztcode != ''">#{ryztcode},</if>
<if test="mobilenumber != null and mobilenumber != ''">#{mobilenumber},</if>
<if test="zcgzld != null and zcgzld != ''">#{zcgzld},</if>
<if test="gldw != null and gldw != ''">#{gldw},</if>
<if test="updateAt != null and updateAt != ''">#{updateAt},</if>
<if test="zwjcCode != null and zwjcCode != ''">#{zwjcCode},</if>
<if test="effectOn != null and effectOn != ''">#{effectOn},</if>
<if test="updateat != null and updateat != ''">#{updateat},</if>
<if test="zwjccode != null and zwjccode != ''">#{zwjccode},</if>
<if test="effecton != null and effecton != ''">#{effecton},</if>
<if test="zwjc != null and zwjc != ''">#{zwjc},</if>
<if test="organizationId != null and organizationId != ''">#{organizationId},</if>
<if test="organizationid != null and organizationid != ''">#{organizationid},</if>
<if test="province != null and province != ''">#{province},</if>
<if test="isDisabled != null and isDisabled != ''">#{isDisabled},</if>
<if test="certificateTypeIdCode != null and certificateTypeIdCode != ''">#{certificateTypeIdCode},</if>
<if test="isdisabled != null and isdisabled != ''">#{isdisabled},</if>
<if test="certificatetypeidcode != null and certificatetypeidcode != ''">#{certificatetypeidcode},</if>
<if test="jrfs != null and jrfs != ''">#{jrfs},</if>
<if test="spareNumber != null and spareNumber != ''">#{spareNumber},</if>
<if test="sparenumber != null and sparenumber != ''">#{sparenumber},</if>
<if test="positionname != null and positionname != ''">#{positionname},</if>
<if test="pylxcode != null and pylxcode != ''">#{pylxcode},</if>
<if test="jbcc != null and jbcc != ''">#{jbcc},</if>
<if test="contractEndTime != null and contractEndTime != ''">#{contractEndTime},</if>
<if test="contractendtime != null and contractendtime != ''">#{contractendtime},</if>
<if test="sequence != null and sequence != ''">#{sequence},</if>
<if test="genderCode != null and genderCode != ''">#{genderCode},</if>
<if test="zwwxMobile != null and zwwxMobile != ''">#{zwwxMobile},</if>
<if test="gendercode != null and gendercode != ''">#{gendercode},</if>
<if test="zwwxmobile != null and zwwxmobile != ''">#{zwwxmobile},</if>
<if test="district != null and district != ''">#{district},</if>
<if test="certificateTypeId != null and certificateTypeId != ''">#{certificateTypeId},</if>
<if test="contractStartTime != null and contractStartTime != ''">#{contractStartTime},</if>
<if test="certificatetypeid != null and certificatetypeid != ''">#{certificatetypeid},</if>
<if test="contractstarttime != null and contractstarttime != ''">#{contractstarttime},</if>
<if test="rylydw != null and rylydw != ''">#{rylydw},</if>
<if test="telephoneNumber != null and telephoneNumber != ''">#{telephoneNumber},</if>
<if test="telephonenumber != null and telephonenumber != ''">#{telephonenumber},</if>
<if test="gender != null and gender != ''">#{gender},</if>
<if test="city != null and city != ''">#{city},</if>
<if test="jbccCode != null and jbccCode != ''">#{jbccCode},</if>
<if test="jbcccode != null and jbcccode != ''">#{jbcccode},</if>
<if test="rylb != null and rylb != ''">#{rylb},</if>
<if test="hometownCode != null and hometownCode != ''">#{hometownCode},</if>
<if test="hometowncode != null and hometowncode != ''">#{hometowncode},</if>
<if test="units != null and units != ''">#{units},</if>
<if test="srzUserid != null and srzUserid != ''">#{srzUserid},</if>
<if test="createAt != null and createAt != ''">#{createAt},</if>
<if test="engName != null and engName != ''">#{engName},</if>
<if test="isDeleted != null and isDeleted != ''">#{isDeleted},</if>
<if test="srzuserid != null and srzuserid != ''">#{srzuserid},</if>
<if test="createat != null and createat != ''">#{createat},</if>
<if test="engname != null and engname != ''">#{engname},</if>
<if test="isdeleted != null and isdeleted != ''">#{isdeleted},</if>
<if test="jrfscode != null and jrfscode != ''">#{jrfscode},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="zwbsCode != null and zwbsCode != ''">#{zwbsCode},</if>
<if test="zwbscode != null and zwbscode != ''">#{zwbscode},</if>
<if test="dwzyld != null and dwzyld != ''">#{dwzyld},</if>
<if test="pylx != null and pylx != ''">#{pylx},</if>
<if test="systemId != null and systemId != ''">#{systemId},</if>
<if test="rylbCode != null and rylbCode != ''">#{rylbCode},</if>
<if test="systemid != null and systemid != ''">#{systemid},</if>
<if test="rylbcode != null and rylbcode != ''">#{rylbcode},</if>
<if test="hometown != null and hometown != ''">#{hometown},</if>
<if test="photo != null and photo != ''">#{photo},</if>
<if test="glzrr != null and glzrr != ''">#{glzrr},</if>
<if test="userId != null and userId != ''">#{userId},</if>
<if test="zwwxId != null and zwwxId != ''">#{zwwxId},</if>
<if test="userid != null and userid != ''">#{userid},</if>
<if test="zwwxid != null and zwwxid != ''">#{zwwxid},</if>
<if test="ryzt != null and ryzt != ''">#{ryzt},</if>
<if test="certificateNumber != null and certificateNumber != ''">#{certificateNumber},</if>
<if test="certificatenumber != null and certificatenumber != ''">#{certificatenumber},</if>
<if test="zwbs != null and zwbs != ''">#{zwbs},</if>
<if test="faxNumber != null and faxNumber != ''">#{faxNumber},</if>
<if test="faxnumber != null and faxnumber != ''">#{faxnumber},</if>
<if test="fullname != null and fullname != ''">#{fullname},</if>
<if test="isMappingPerson != null and isMappingPerson != ''">#{isMappingPerson},</if>
<if test="taskId != null and taskId != ''">#{taskId},</if>
<if test="ismappingperson != null and ismappingperson != ''">#{ismappingperson},</if>
<if test="taskid != null and taskid != ''">#{taskid},</if>
<if test="username != null and username != ''">#{username},</if>
<if test="needUpdate != null">#{needUpdate},</if>
</trim>
</insert>
</mapper>

62
zdxt-modules/zdxt-enforcement-code/src/main/resources/mapper/enforcementcode/StatisticalPanelCityMapper.xml

@ -162,15 +162,71 @@
<!-- 所有重点领域类 -->
<select id="query_law_field_count" parameterType="com.zdxt.enforcementcode.domain.bo.SixAnalysisParamsBo" resultType="map">
SELECT r.law_field, CAST(COUNT(1) AS CHAR) AS cnt FROM enforcement_registration r WHERE enforcement_time IS NOT null and r.bureau_dept_name is not null and r.is_submit = 1 and r.law_enforcement_id is not null and r.enterprise_name is not null and r.enterprise_number is not null and r.law_enforcer is not null and r.law_enforcer_two is not null and r.is_complaint is not null and r.check_category is not null and r.bureau_dept_id is not null and law_field is not null
<!--SELECT r.law_field, CAST(COUNT(1) AS CHAR) AS cnt FROM enforcement_registration r
WHERE enforcement_time IS NOT null
and r.bureau_dept_name is not null
and r.is_submit = 1
and r.law_enforcement_id is not null
and r.enterprise_name is not null
and r.enterprise_number is not null
and r.law_enforcer is not null
and r.law_enforcer_two is not null
and r.is_complaint is not null
and r.check_category is not null
and r.bureau_dept_id is not null
and law_field is not null-->
select
r.bureau_dept_id,
case r.bureau_dept_id
when '20210922213242905-1183-F9897C287' then '01'
when '20210922213242781-25B8-DF4A0AB32' then '02'
when '20210922213015633-2458-5A5E07C0C' then '03'
when '20210922213015704-F9CB-3AFDBC097' then '04'
when '20210922213015633-2459-6D7CB4903' then '05'
when '20210922212956790-EDA0-123260206' then '06'
when '20210922213220191-2F55-3493B378E' then '07'
when '20221024170151446-F82B-F4F56D018' then '08'
when '20210922213219489-1142-3C752622D' then '09'
else ''
end as law_field,
CAST(count(1) AS CHAR) AS cnt
from
enforcement_registration r
<where>
and r.is_submit = 1
and r.is_delete =0
and enforcement_time IS NOT null
and r.bureau_dept_name is not null
and r.law_enforcement_id is not null
and r.enterprise_name is not null
and r.enterprise_number is not null
and r.law_enforcer is not null
and r.law_enforcer_two is not null
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 (
'20210922213242905-1183-F9897C287',
'20210922213242781-25B8-DF4A0AB32',
'20210922213015633-2458-5A5E07C0C',
'20210922213015704-F9CB-3AFDBC097',
'20210922213015633-2459-6D7CB4903',
'20210922212956790-EDA0-123260206',
'20210922213220191-2F55-3493B378E',
'20221024170151446-F82B-F4F56D018',
'20210922213219489-1142-3C752622D'
)
<if test="beginTime != null and beginTime != ''"> and r.enforcement_time &gt;= #{beginTime} </if>
<if test="endTime != null and endTime != ''"> and r.enforcement_time &lt; #{endTime} </if>
<if test="endTime != null and endTime != ''"> and r.enforcement_time &lt;= #{endTime} </if>
<if test="zone == 1">and r.zone = 1</if>
<if test="filterDepts != null and filterDepts.size() > 0">
and r.bureau_dept_id in <foreach collection="filterDepts" item="bureau_dept_id" open="(" separator="," close=")"> #{bureau_dept_id} </foreach>
</if>
<if test="params.dataScope != null and params.dataScope != ''"> ${params.dataScope} </if>
GROUP BY r.law_field ORDER BY cnt DESC;
</where>
group by r.bureau_dept_id,law_field
ORDER BY cnt DESC
</select>
<!-- 行政执法投诉类别 -->

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

@ -1639,6 +1639,7 @@
and r.is_complaint is not null
and r.check_category is not null
and r.bureau_dept_id is not null
and enforcement_time &lt; DATE_FORMAT(NOW(), '%Y-%m-01')
<!-- <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 != ''">
and r.bureau_dept_id in (select sd.dept_id from sys_dept sd where sd.area_node = #{deptId} or sd.dept_id = #{deptId})
@ -1646,8 +1647,8 @@
<if test="uniteCheck == '1'.toString()"> and (r.union_no is not null and r.union_no != '')</if>
<if test="uniteCheck == '0'.toString()"> and (r.union_no is null or r.union_no = '')</if>
<!-- <if test="userId != null and userId != '' ">and( r.law_enforcer_id=#{userId} or r.law_enforcer_id_two like concat('%',#{userId}, '%'))</if>-->
<if test="beginTime != null and beginTime != ''"> and DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') >= DATE_FORMAT(#{beginTime},'%Y-%m-%d') </if>
<if test="endTime != null and endTime != ''"> and DATE_FORMAT(#{endTime},'%Y-%m-%d') >= DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') </if>
<if test="beginTime != null and beginTime != ''"> and DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{beginTime},'%Y-%m-%d') </if>
<if test="endTime != null and endTime != ''"> and DATE_FORMAT(#{endTime},'%Y-%m-%d') &lt;= DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') </if>
<if test="params.dataScope != null and params.dataScope != ''">
<!-- 数据范围过滤 -->
${params.dataScope}
@ -1697,6 +1698,7 @@
and r.is_complaint is not null
and r.check_category is not null
and r.bureau_dept_id is not null
and enforcement_time &lt; DATE_FORMAT(NOW(), '%Y-%m-01')
<!-- <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 != ''">
and r.bureau_dept_id in (select sd.dept_id from sys_dept sd where sd.area_node = #{deptId} or sd.dept_id = #{deptId})
@ -1704,8 +1706,8 @@
<if test="uniteCheck == '1'.toString()"> and (r.union_no is not null and r.union_no != '')</if>
<if test="uniteCheck == '0'.toString()"> and (r.union_no is null or r.union_no = '')</if>
<!-- <if test="userId != null and userId != '' ">and( r.law_enforcer_id=#{userId} or r.law_enforcer_id_two like concat('%',#{userId}, '%')) </if>-->
<if test="beginTime != null and beginTime != ''"> and DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') >= DATE_FORMAT(#{beginTime},'%Y-%m-%d') </if>
<if test="endTime != null and endTime != ''"> and DATE_FORMAT(#{endTime},'%Y-%m-%d') >= DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') </if>
<if test="beginTime != null and beginTime != ''"> and DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') &gt;= DATE_FORMAT(#{beginTime},'%Y-%m-%d') </if>
<if test="endTime != null and endTime != ''"> and DATE_FORMAT(#{endTime},'%Y-%m-%d') &lt;= DATE_FORMAT(r.enforcement_time,'%Y-%m-%d') </if>
<if test="params.dataScope != null and params.dataScope != ''">
<!-- 数据范围过滤 -->
${params.dataScope}

7
zdxt-modules/zdxt-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@ -165,7 +165,12 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
*/
@Override
public SysUserVo selectUserByLoginName(String loginName) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getLoginName, loginName));
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getLoginName, loginName)
// 历史数据可能存在重复 login_name: 取更新时间最新的一条, 避免 TooManyResultsException
.orderByDesc(SysUser::getUpdateTime)
.orderByDesc(SysUser::getUserId)
.last("limit 1"));
}
/**

4
zdxt-web-client/zdxt-admin-plus-ui/.env.production

@ -16,8 +16,8 @@ VITE_APP_MONITOR_ADMIN = '/admin/applications'
VITE_APP_SNAILJOB_ADMIN = '/snail-job'
# 生产环境
VITE_APP_BASE_API = '/efcode20-sup-web/prod-api'
# VITE_APP_BASE_API = '/zfjdm/prod-api'
# VITE_APP_BASE_API = '/efcode20-sup-web/prod-api' #本地环境
VITE_APP_BASE_API = '/zfjdm/prod-api' #生产环境
# 是否在打包时开启压缩,支持 gzip 和 brotli
VITE_BUILD_COMPRESS = gzip

5
zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/enterprises-inspected-noft.ts

@ -8,7 +8,10 @@ export interface EINOFTQuery {
pageNum?: number;
pageSize?: number;
enterpriseName?: string;
num?: string;
/** 执法次数下限 */
numMin?: string;
/** 执法次数上限 */
numMax?: string;
beginTime?: string;
endTime?: string;
enterpriseNumber?: string;

2
zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration-statistics.ts

@ -21,6 +21,8 @@ export interface AnalysisQuery {
numRight?: string;
num?: string;
enterpriseNumber?: string;
orderByColumn?: string;
isAsc?: string;
}
/** 执法分析行VO */

17
zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/registration.ts

@ -170,3 +170,20 @@ export const exportAnalysis = (params: RegistrationReportQuery): AxiosPromise<Bl
responseType: 'blob'
});
};
/** 联合执法明细行 */
export interface UnionRow {
bureauDeptName?: string;
enterpriseName?: string;
enforcementTime?: string;
[key: string]: any;
}
/** 联合执法详情:/code/registration/unionList?unionNo=xxx */
export const listUnionList = (unionNo: string | number): AxiosPromise<UnionRow[]> => {
return request({
url: '/code/registration/unionList',
method: 'get',
params: { unionNo }
});
};

31
zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-complaint.ts

@ -52,6 +52,28 @@ export interface ComplaintDetailVo {
enforceType: number;
enforceTypeText: string;
complaintTime: string;
/** 投诉内容 */
complaintContent?: string;
/** 涉事地址 */
enterpriseAddress?: string;
/** 附件 */
attachment?: string;
/** 授权状态:1-同意 0-不同意 */
authStatus?: number | string;
/** 联系人 */
contactPerson?: string;
/** 联系电话 */
contactPhone?: string;
}
/** 处置进度VO */
export interface ComplaintHandleVo {
/** 处理部门 */
handleDepartment: string;
/** 处理意见 */
handleOpinion: string;
/** 处理时间 */
handleTime: string;
}
/** Tab2 类型统计VO */
@ -88,6 +110,15 @@ export const getDetailList = (params: ComplaintQuery): AxiosPromise => {
});
};
/** 投诉举报详情(含处置进度) */
export const getComplaintDetail = (id: number | string): AxiosPromise => {
return request({
url: `${BASE_URL}/detail`,
method: 'get',
params: { id }
});
};
/** Tab2-投诉类型统计 */
export const getTypeStatList = (params: ComplaintQuery): AxiosPromise => {
return request({

16
zdxt-web-client/zdxt-admin-plus-ui/src/api/efcode/report/statistics-inspection-plan.ts

@ -52,6 +52,12 @@ export interface InspectionPlanDetailVo {
bureauDeptName: string;
enforcementArea: string;
enforcementTime: string;
/** 附件名称 */
attachment?: string;
/** 附件ID/路径,用于下载 */
attachmentId?: string | number;
/** 附件完整URL(直链预览用) */
attachmentUrl?: string;
}
/** 排行VO */
@ -139,3 +145,13 @@ export const exportGroupList = (data: InspectionPlanQuery): AxiosPromise<Blob> =
responseType: 'blob'
});
};
/** 下载执法计划附件 */
export const downloadAttachment = (id: string): AxiosPromise<Blob> => {
return request({
url: `${BASE_URL}/downloadAttachment`,
method: 'get',
params: { id },
responseType: 'blob'
});
};

6
zdxt-web-client/zdxt-admin-plus-ui/src/layout/components/AppMain.vue

@ -56,7 +56,9 @@ function addIframe() {
height: calc(100vh - 50px);
width: 100%;
position: relative;
overflow: hidden;
/* 滚动容器收敛在这里:唯一纵向滚动发生在这一层 */
overflow-y: auto;
overflow-x: hidden;
}
.fixed-header + .app-main {
@ -65,7 +67,7 @@ function addIframe() {
.hasTagsView {
.app-main {
height: calc(100vh - 84px);
height: calc(100vh - 118px);
}
.fixed-header + .app-main {

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

@ -191,7 +191,7 @@ const setLayout = () => {
}
.iframe-main-full {
height: calc(100vh - 50px);
height: calc(100vh - 80px);
overflow: hidden;
}

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

@ -191,7 +191,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: () => import('@/views/supervision/educationServices/add.vue'),
name: 'EducationServicesAdd',
meta: { title: '新增涉企服务', icon: 'plus' }
meta: { title: '新增普法服务', icon: 'plus' }
}
]
},
@ -204,7 +204,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: () => import('@/views/supervision/educationServices/repost.vue'),
name: 'EducationServicesRepost',
meta: { title: '转载涉企服务', icon: 'plus' }
meta: { title: '转载普法服务', icon: 'plus' }
}
]
},
@ -217,7 +217,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: () => import('@/views/supervision/educationServices/draft.vue'),
name: 'EducationServicesDraft',
meta: { title: '涉企服务草稿箱', activeMenu: '/supervision/educationServices' }
meta: { title: '普法服务草稿箱', activeMenu: '/supervision/educationServices' }
}
]
},
@ -230,7 +230,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: () => import('@/views/supervision/educationServices/edit.vue'),
name: 'EducationServicesEdit',
meta: { title: '编辑涉企服务', activeMenu: '/supervision/educationServices' }
meta: { title: '编辑普法服务', activeMenu: '/supervision/educationServices' }
}
]
},
@ -243,7 +243,7 @@ export const constantRoutes: RouteRecordRaw[] = [
path: '',
component: () => import('@/views/supervision/educationServices/detail.vue'),
name: 'EducationServicesDetail',
meta: { title: '涉企服务详情', activeMenu: '/supervision/educationServices' }
meta: { title: '普法服务详情', activeMenu: '/supervision/educationServices' }
}
]
},

31
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/enterprises_inspected_noft/index.vue

@ -11,7 +11,8 @@ const queryParams = reactive<EINOFTQuery>({
pageNum: 1,
pageSize: 20,
enterpriseName: undefined,
num: undefined,
numMin: undefined,
numMax: undefined,
beginTime: `${yearNow}-01-01`,
endTime: undefined
});
@ -77,7 +78,8 @@ const resetQuery = () => {
pageNum: 1,
pageSize: 20,
enterpriseName: undefined,
num: undefined,
numMin: undefined,
numMax: undefined,
beginTime: undefined,
endTime: undefined
});
@ -131,12 +133,23 @@ const loadStatistics = async () => {
/** 排序变更 */
const handleSortChange = (sortObj: { prop: string; order: 'ascending' | 'descending' | null }) => {
if (sortObj.prop === 'enforcementTime') {
queryParams.orderByColumn = 'enforcement_time';
queryParams.isAsc = sortObj.order === 'ascending' ? 'asc' : 'desc';
if (!sortObj.prop || !sortObj.order) {
queryParams.orderByColumn = undefined;
queryParams.isAsc = undefined;
queryParams.pageNum = 1;
getList();
return;
}
if (sortObj.prop === 'enforcementTime') {
queryParams.orderByColumn = 'enforcement_time';
} else if (sortObj.prop === 'num') {
queryParams.orderByColumn = 'num';
} else {
return;
}
queryParams.isAsc = sortObj.order === 'ascending' ? 'asc' : 'desc';
queryParams.pageNum = 1;
getList();
};
/** 点击详情 */
@ -171,8 +184,10 @@ const handleShowDetail = async (row: EnterprisesInspectedVo) => {
<el-form-item label="企业名称" prop="enterpriseName">
<el-input v-model="queryParams.enterpriseName" placeholder="请输入企业名称" clearable @keyup.enter="handleQuery" style="width: 200px" />
</el-form-item>
<el-form-item label="执法次数" prop="num">
<el-input v-model="queryParams.num" placeholder="请输入所需大于等于次数" clearable @keyup.enter="handleQuery" style="width: 180px" />
<el-form-item label="执法次数">
<el-input v-model="queryParams.numMin" placeholder="最小次数" clearable @keyup.enter="handleQuery" style="width: 100px" />
<span style="margin: 0 4px">-</span>
<el-input v-model="queryParams.numMax" placeholder="最大次数" clearable @keyup.enter="handleQuery" style="width: 100px" />
</el-form-item>
<el-form-item label="执法时间">
<el-date-picker v-model="queryParams.beginTime" type="date" placeholder="开始日期" value-format="YYYY-MM-DD" style="width: 140px" />
@ -202,7 +217,7 @@ const handleShowDetail = async (row: EnterprisesInspectedVo) => {
<el-card shadow="hover">
<el-table ref="tableRef" v-loading="loading" :data="tableData" :height="tableHeight" border stripe @sort-change="handleSortChange">
<el-table-column label="企业名称" prop="enterpriseName" :show-overflow-tooltip="true" align="center" />
<el-table-column label="执法次数" prop="num" align="center" />
<el-table-column label="执法次数" prop="num" align="center" sortable="custom" />
<el-table-column label="最后一次执法时间" prop="enforcementTime" align="center" sortable="custom" />
<el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="{ row }">

73
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration/indexList.vue

@ -2,9 +2,9 @@
import { ref, reactive, onMounted, onUnmounted, computed, nextTick } from 'vue';
import { ElMessage } from 'element-plus';
import {
getStatistics, getRegistrationList, exportRegistrationList
getStatistics, getRegistrationList, exportRegistrationList, listUnionList
} from '@/api/efcode/report/registration';
import type { RegistrationReportQuery, RegistrationStatisticsVo } from '@/api/efcode/report/registration';
import type { RegistrationReportQuery, RegistrationStatisticsVo, UnionRow } from '@/api/efcode/report/registration';
import { getDicts } from '@/api/system/dict/data';
// 查询参数
@ -334,6 +334,27 @@ const closeDetailDialog = () => {
detailDialogVisible.value = false;
detailRow.value = null;
};
// ======================== 联合执法详情弹窗 ========================
const unionDialogVisible = ref(false);
const unionLoading = ref(false);
const unionRows = ref<UnionRow[]>([]);
const unionCurrentNo = ref<string | number | undefined>(undefined);
const handleUnionClick = async (row: any) => {
if (!row.unionNo) return;
unionCurrentNo.value = row.unionNo;
unionDialogVisible.value = true;
unionLoading.value = true;
try {
const res = await listUnionList(row.unionNo);
unionRows.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
} catch (e) {
unionRows.value = [];
} finally {
unionLoading.value = false;
}
};
</script>
<template>
@ -472,7 +493,13 @@ const closeDetailDialog = () => {
</el-table-column>
<el-table-column label="联合执法" width="90" align="center">
<template #default="{ row }">
<el-tag v-if="row.hasUnion === 1 && row.unionNo" type="success" size="small">是</el-tag>
<el-tag
v-if="row.hasUnion === 1 && row.unionNo"
type="success"
size="small"
class="clickable"
@click.stop="handleUnionClick(row)"
>是</el-tag>
<span v-else>否</span>
</template>
</el-table-column>
@ -553,6 +580,31 @@ const closeDetailDialog = () => {
<el-descriptions-item width="150" label="创建时间">{{ (detailRow.createTime) }}</el-descriptions-item>
</el-descriptions>
</el-dialog>
<!-- 联合执法详情弹窗 -->
<el-dialog
v-model="unionDialogVisible"
title="联合执法详情"
width="900px"
append-to-body
destroy-on-close
>
<el-table
v-loading="unionLoading"
:data="unionRows"
border
stripe
style="width: 100%"
>
<el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="执法单位" prop="bureauDeptName" min-width="260" align="center" show-overflow-tooltip />
<el-table-column label="被执法企业名称" prop="enterpriseName" min-width="200" align="center" show-overflow-tooltip />
<el-table-column label="执法时间" width="210" align="center">
<template #default="{ row }">{{ formatDate(row) }}</template>
</el-table-column>
</el-table>
<div v-if="unionRows.length" class="union-total">共 {{ unionRows.length }} 条记录</div>
</el-dialog>
</div>
</template>
@ -591,4 +643,19 @@ const closeDetailDialog = () => {
.mt-4 {
margin-top: 16px;
}
.clickable {
cursor: pointer;
&:hover {
opacity: 0.85;
}
}
.union-total {
margin-top: 12px;
font-size: 13px;
color: #909399;
text-align: right;
}
</style>

36
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/registration_statistics/index.vue

@ -17,10 +17,14 @@ const queryParams = reactive<AnalysisQuery>({
lawEnforcementItemText: undefined,
district: undefined,
street: undefined,
numLeft: undefined,
numRight: undefined,
dateType: undefined,
dateSearch: undefined,
beginTime: undefined,
endTime: undefined
endTime: undefined,
orderByColumn: undefined,
isAsc: undefined
});
const loading = ref(false);
@ -183,6 +187,8 @@ const resetQuery = () => {
lawEnforcementItemText: undefined,
district: undefined,
street: undefined,
numLeft: undefined,
numRight: undefined,
dateType: undefined,
dateSearch: undefined,
beginTime: undefined,
@ -209,6 +215,25 @@ const getList = async () => {
}
};
/** 排序变更 */
const handleSortChange = (sortObj: { prop: string; order: 'ascending' | 'descending' | null }) => {
if (!sortObj.prop || !sortObj.order) {
queryParams.orderByColumn = undefined;
queryParams.isAsc = undefined;
queryParams.pageNum = 1;
getList();
return;
}
if (sortObj.prop === 'totalCount') {
queryParams.orderByColumn = 'total_count';
} else {
return;
}
queryParams.isAsc = sortObj.order === 'ascending' ? 'asc' : 'desc';
queryParams.pageNum = 1;
getList();
};
/** 格式化日期为 x年x月x日 */
const formatDateCN = (dateStr: string | undefined) => {
if (!dateStr) return '';
@ -296,6 +321,11 @@ const getLevelCellStyle = (level: string) => {
<el-option v-for="item in streetOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictLabel" />
</el-select>
</el-form-item>
<el-form-item label="执法次数">
<el-input v-model="queryParams.numLeft" placeholder="最小" clearable @keyup.enter="handleQuery" style="width: 70px" />
<span style="margin: 0 4px">-</span>
<el-input v-model="queryParams.numRight" placeholder="最大" clearable @keyup.enter="handleQuery" style="width: 70px" />
</el-form-item>
<div style="width: 100%; height: 0;"></div>
<el-form-item label="时段">
<el-select v-model="timeMode" style="width: 90px" @change="handleTimeModeChange">
@ -328,7 +358,7 @@ const getLevelCellStyle = (level: string) => {
<!-- 表格区域 -->
<el-card shadow="hover">
<el-table ref="tableRef" v-loading="loading" :data="tableData" :height="tableHeight" border stripe>
<el-table ref="tableRef" v-loading="loading" :data="tableData" :height="tableHeight" border stripe @sort-change="handleSortChange">
<el-table-column label="区域" prop="district" width="100" align="center" />
<el-table-column label="街道" prop="street" width="120" align="center" />
<el-table-column label="企业名称" prop="enterpriseName" min-width="200" :show-overflow-tooltip="true" />
@ -336,7 +366,7 @@ const getLevelCellStyle = (level: string) => {
<el-table-column label="执法人员" prop="lawEnforcer" min-width="120" :show-overflow-tooltip="true" />
<el-table-column label="执法事项" prop="lawEnforcementItemText" min-width="150" :show-overflow-tooltip="true" />
<el-table-column label="执法时间" prop="enforcementTime" width="110" align="center" />
<el-table-column label="执法次数" width="100" align="center">
<el-table-column label="执法次数" width="120" align="center" sortable="custom">
<template #default="{ row }">
<el-link type="success" :underline="false" @click="handleShowDetail(row)">
{{ row.totalCount }}

126
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_enforcement_complaint/index.vue

@ -4,11 +4,11 @@ import { ElMessage } from 'element-plus';
import * as echarts from 'echarts';
import { getDicts } from '@/api/system/dict/data';
import {
getOverview, getGroupList, getDetailList,
getOverview, getGroupList, getDetailList, getComplaintDetail,
getTypeStatList, getAreaStatList, getStreetStatList,
exportGroupList, exportTypeStat, exportAreaStat, exportStreetStat
} from '@/api/efcode/report/statistics-complaint';
import type { ComplaintQuery, ComplaintGroupVo, ComplaintDetailVo, ComplaintTypeStatVo } from '@/api/efcode/report/statistics-complaint';
import type { ComplaintQuery, ComplaintGroupVo, ComplaintDetailVo, ComplaintTypeStatVo, ComplaintHandleVo } from '@/api/efcode/report/statistics-complaint';
// 当前Tab
const activeTab = ref('tab1');
@ -76,6 +76,13 @@ const detailPageNum = ref(1);
const detailPageSize = ref(10);
const currentDeptId = ref('');
// 投诉举报详情弹窗
const complaintDetailVisible = ref(false);
const complaintDetailLoading = ref(false);
const complaintDetailTab = ref('progress'); // progress / info
const complaintDetailData = ref<ComplaintDetailVo | null>(null);
const complaintHandleList = ref<ComplaintHandleVo[]>([]);
// 字典
const caseTypeOptions = ref<any[]>([]);
const addressTypeOptions = ref<any[]>([]);
@ -216,6 +223,32 @@ const handleDetailPageChange = () => {
loadDetailData();
};
/** 点击详情按钮 → 弹出投诉举报详情 */
const handleShowComplaintDetail = async (row: ComplaintDetailVo) => {
complaintDetailTab.value = 'progress';
complaintDetailVisible.value = true;
complaintDetailLoading.value = true;
try {
const res = await getComplaintDetail(row.id);
complaintDetailData.value = (res.data?.detail || res.data) as ComplaintDetailVo;
complaintHandleList.value = (res.data?.handleList || res.data?.progress || []) as ComplaintHandleVo[];
} catch (e) {
// 接口未连通,降级使用当前行数据 + mock 兜底
complaintDetailData.value = { ...row };
complaintHandleList.value = mockHandleList(row);
} finally {
complaintDetailLoading.value = false;
}
};
/** mock 处置进度兜底数据(接口未连通时使用) */
const mockHandleList = (row: ComplaintDetailVo): ComplaintHandleVo[] => [
{ handleDepartment: '系统自动评价', handleOpinion: '系统自动评价', handleTime: row.complaintTime },
{ handleDepartment: '市统一受理分拨平台', handleOpinion: '复核通过,办结工单。', handleTime: row.complaintTime },
{ handleDepartment: row.complaintDepartment, handleOpinion: '已受理,正在核实处理中。', handleTime: row.complaintTime },
{ handleDepartment: '市统一受理分拨平台', handleOpinion: '工单已派发至相关部门,请及时跟进处理。', handleTime: row.complaintTime }
];
/** Tab1导出 */
const handleExportTab1 = async () => {
try {
@ -409,11 +442,79 @@ const downloadBlob = (res: any, filename: string) => {
<el-table-column label="被投诉对象" prop="complaintDepartment" min-width="160" :show-overflow-tooltip="true" />
<el-table-column label="投诉类型" prop="enforceTypeText" width="140" align="center" />
<el-table-column label="投诉时间" prop="complaintTime" width="170" align="center" />
<el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link :underline="false" @click="handleShowComplaintDetail(row)">详情</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="detailTotal > 0"
v-model:page="detailPageNum" v-model:limit="detailPageSize"
:total="detailTotal" @pagination="handleDetailPageChange" />
</el-dialog>
<!-- 投诉举报详情弹窗 -->
<el-dialog v-model="complaintDetailVisible" title="投诉举报详情" width="680px" destroy-on-close append-to-body>
<div v-loading="complaintDetailLoading">
<el-tabs v-model="complaintDetailTab">
<!-- 处置进度 -->
<el-tab-pane label="处置进度" name="progress">
<el-timeline v-if="complaintHandleList.length > 0" class="complaint-timeline">
<el-timeline-item
v-for="(item, index) in complaintHandleList"
:key="index"
:type="index === 0 ? 'primary' : 'success'"
:hollow="index === 0"
>
<div class="timeline-title">{{ item.handleDepartment }}</div>
<div class="timeline-row"><span class="timeline-label">处理部门:</span>{{ item.handleDepartment }}</div>
<div class="timeline-row"><span class="timeline-label">处理意见:</span>{{ item.handleOpinion }}</div>
<div class="timeline-row"><span class="timeline-label">处理时间:</span>{{ item.handleTime }}</div>
</el-timeline-item>
</el-timeline>
<el-empty v-else description="暂无处置进度" />
</el-tab-pane>
<!-- 投诉详情 -->
<el-tab-pane label="投诉详情" name="info">
<el-descriptions
v-if="complaintDetailData"
:column="1"
border
:label-style="{ width: '120px', textAlign: 'right', backgroundColor: '#f5f7fa' }"
>
<el-descriptions-item label="投诉部门">{{ complaintDetailData.complaintDepartment || '-' }}</el-descriptions-item>
<el-descriptions-item label="投诉时间">{{ complaintDetailData.complaintTime || '-' }}</el-descriptions-item>
<el-descriptions-item label="投诉类型">{{ complaintDetailData.enforceTypeText || '-' }}</el-descriptions-item>
<el-descriptions-item label="投诉内容">{{ complaintDetailData.complaintContent || '-' }}</el-descriptions-item>
<el-descriptions-item label="涉事地址">{{ complaintDetailData.enterpriseAddress || '-' }}</el-descriptions-item>
<el-descriptions-item label="附件">
<span v-if="complaintDetailData.attachment">
<el-link type="primary" :underline="false">{{ complaintDetailData.attachment }}</el-link>
</span>
<span v-else>-</span>
</el-descriptions-item>
<el-descriptions-item label="授权状态">
<el-checkbox
:model-value="complaintDetailData.authStatus == 1"
disabled
>同意</el-checkbox>
<el-checkbox
:model-value="complaintDetailData.authStatus != 1"
disabled
>不同意</el-checkbox>
</el-descriptions-item>
<el-descriptions-item label="联系人">{{ complaintDetailData.contactPerson || '-' }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ complaintDetailData.contactPhone || '-' }}</el-descriptions-item>
</el-descriptions>
<el-empty v-else description="暂无详情数据" />
</el-tab-pane>
</el-tabs>
</div>
<template #footer>
<el-button @click="complaintDetailVisible = false">关闭</el-button>
</template>
</el-dialog>
</el-tab-pane>
<!-- ==================== Tab2: 投诉类型统计 ==================== -->
@ -494,4 +595,25 @@ const downloadBlob = (res: any, filename: string) => {
</template>
<style scoped lang="scss">
.complaint-timeline {
padding: 16px 12px;
.timeline-title {
font-weight: 600;
font-size: 15px;
margin-bottom: 8px;
color: #303133;
}
.timeline-row {
font-size: 13px;
color: #606266;
line-height: 1.8;
word-break: break-all;
}
.timeline-label {
color: #909399;
}
}
</style>

69
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/report/statistics_inspection_plan/index.vue

@ -5,7 +5,7 @@ import * as echarts from 'echarts';
import {
getOverview, getGroupList, getDetailList,
getRankByYear, getRankByQuarter, getRankByMonth,
exportGroupList
exportGroupList, downloadAttachment
} from '@/api/efcode/report/statistics-inspection-plan';
import type {
InspectionPlanQuery, InspectionPlanOverviewVo, InspectionPlanGroupVo,
@ -194,6 +194,54 @@ const handleDetailPageChange = () => {
loadDetailData();
};
/** 根据附件名判断是否为浏览器可直接预览的类型 */
const canPreview = (filename?: string) => {
if (!filename) return false;
const ext = filename.split('.').pop()?.toLowerCase();
return ['pdf', 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'txt', 'mp4', 'webm', 'ogg'].includes(ext || '');
};
/** 预览附件:图片/PDF等浏览器原生支持的直接打开,其他类型降级为下载 */
const handlePreview = async (row: InspectionPlanDetailVo) => {
if (!row.attachment) {
ElMessage.warning('暂无附件');
return;
}
// 优先使用后端返回的直链 URL
if (row.attachmentUrl) {
window.open(row.attachmentUrl, '_blank');
return;
}
// 通过下载接口获取 blob 后用 blob URL 打开(支持跨域)
try {
const res = await downloadAttachment(row.id);
const url = window.URL.createObjectURL(res as Blob);
const win = window.open(url, '_blank');
if (!win) {
ElMessage.warning('浏览器阻止了新窗口打开,请允许弹窗后重试');
}
// 窗口关闭后释放
win?.addEventListener('beforeunload', () => window.URL.revokeObjectURL(url));
} catch (e) {
ElMessage.error('预览失败');
}
};
/** 下载附件 */
const handleDownload = async (row: InspectionPlanDetailVo) => {
if (!row.attachment) {
ElMessage.warning('暂无附件');
return;
}
try {
const res = await downloadAttachment(row.id);
// blob 响应拦截器已返回 res.data(Blob 对象),直接下载
downloadBlob(res, row.attachment);
} catch (e) {
ElMessage.error('下载失败');
}
};
/** Tab1导出 */
const handleExportTab1 = async () => {
try {
@ -410,12 +458,21 @@ const downloadBlob = (res: any, filename: string) => {
</el-card>
<!-- 明细弹窗 -->
<el-dialog v-model="detailDialogVisible" :title="detailTitle" width="750px" destroy-on-close>
<el-dialog v-model="detailDialogVisible" :title="detailTitle" width="820px" destroy-on-close>
<el-table :data="detailTableData" border stripe max-height="400">
<el-table-column label="计划名称" prop="planName" min-width="280" :show-overflow-tooltip="true" />
<el-table-column label="执法单位" prop="bureauDeptName" width="160" :show-overflow-tooltip="true" />
<el-table-column label="执法区域" prop="enforcementArea" width="120" align="center" />
<el-table-column label="发布时间" prop="enforcementTime" width="170" align="center" />
<el-table-column label="计划名称" prop="planName" min-width="240" :show-overflow-tooltip="true" />
<el-table-column label="执法单位" prop="bureauDeptName" width="140" :show-overflow-tooltip="true" />
<el-table-column label="执法区域" prop="enforcementArea" width="110" align="center" />
<el-table-column label="发布时间" prop="enforcementTime" width="165" align="center" />
<el-table-column label="附件" width="100" align="center" fixed="right">
<template #default="{ row }">
<template v-if="row.attachment">
<el-button type="primary" link :underline="false" @click="handlePreview(row)">预览</el-button>
<el-button type="primary" link :underline="false" @click="handleDownload(row)">下载</el-button>
</template>
<span v-else class="text-gray-400">-</span>
</template>
</el-table-column>
</el-table>
<pagination v-show="detailTotal > 0"
v-model:page="detailPageNum" v-model:limit="detailPageSize"

112
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/high-frequency/components/FreqPane.vue

@ -1,7 +1,16 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listHighCheckArea, listHighCheckDomain, type HighFrequencyRow } from '@/api/efcode/report/high-frequency';
import {
listHighCheckArea,
listHighCheckDomain,
exportHighCheckArea,
exportHighCheckDomain,
type HighFrequencyRow
} from '@/api/efcode/report/high-frequency';
import { listKeyEnterpriseDetails } from '@/api/efcode/report/key-enterprises';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
/** 维度:area=各区域 field=各领域 */
const props = defineProps<{
@ -16,7 +25,7 @@ const queryParams = reactive({
district: undefined as string | undefined, // 区域 tab 用
domainName: undefined as string | undefined, // 领域 tab 用
year: String(now.getFullYear()),
month: `${String(now.getFullYear())}-${String(now.getMonth() + 1).padStart(2, '0')}`
month: String(now.getMonth() + 1).padStart(2, '0')
});
/** 年份选项(近 5 年) */
@ -27,14 +36,7 @@ const yearOptions = (() => {
// ======================== 字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = [
{ label: '食品安全', value: 'food' },
{ label: '药品安全', value: 'drug' },
{ label: '特种设备', value: 'special_equipment' },
{ label: '产品质量', value: 'product' },
{ label: '计量', value: 'metrology' },
{ label: '认证认可', value: 'certification' }
];
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -45,6 +47,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<HighFrequencyRow[]>([]);
@ -63,23 +74,26 @@ const calcTableHeight = () => {
tableHeight.value = window.innerHeight - rect.top - 84;
};
/** 区域接口/导出使用的执法时间(由年份 + 月份拼接为 YYYY-MM-01) */
const buildEnforcementTime = () => `${queryParams.year}-${queryParams.month}-01`;
const getList = async () => {
loading.value = true;
try {
let rows: HighFrequencyRow[] = [];
let totalNum = 0;
if (props.dimension === 'area') {
// 区域接口:district + enforcementTime(直接用 month 的 YYYY-MM 值)
// 区域接口:district + enforcementTime(由独立年月拼接)
const res = await listHighCheckArea({
pageNum: queryParams.pageNum,
pageSize: queryParams.pageSize,
district: queryParams.district,
enforcementTime: queryParams.month
enforcementTime: buildEnforcementTime()
});
rows = (res as any)?.rows || [];
totalNum = (res as any)?.total || 0;
} else {
// 领域接口:domainName + year + month(month 传值和 area 一样,但后端参数名不同)
// 领域接口:domainName + year + month(独立年月字段)
const res = await listHighCheckDomain({
pageNum: queryParams.pageNum,
pageSize: queryParams.pageSize,
@ -109,15 +123,34 @@ const handleReset = () => {
queryParams.district = undefined;
queryParams.domainName = undefined;
queryParams.year = String(new Date().getFullYear());
queryParams.month = `${String(new Date().getFullYear())}-${String(new Date().getMonth() + 1).padStart(2, '0')}`;
queryParams.month = String(new Date().getMonth() + 1).padStart(2, '0');
queryParams.pageNum = 1;
queryParams.pageSize = 20;
getList();
};
/** 导出 */
const handleExport = () => {
// TODO: 接入导出接口后实现文件下载
/** 导出(各区域走 exporthighCheckArea,各领域走 exportHighCheckDomain) */
const handleExport = async () => {
try {
const res =
props.dimension === 'area'
? await exportHighCheckArea({
district: queryParams.district,
enforcementTime: buildEnforcementTime()
})
: await exportHighCheckDomain({ domainName: queryParams.domainName });
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = props.dimension === 'area' ? '高频检查区域.xlsx' : '高频检查领域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
/** 多选 */
@ -132,6 +165,7 @@ interface EnforcementDetailRow {
bureauDeptName: string;
categoryText: string;
lawEnforcer: string;
lawEnforcerTwo?: string;
itemText: string;
}
@ -147,7 +181,15 @@ const getDetailList = async () => {
detailLoading.value = true;
try {
if (!detailEnterprise.value) return;
// TODO: 接入真实详情接口 listHighFrequencyDetail
// 详情接口:enterpriseNumber(企业统一信用代码)+ enforcementTime(YYYY-MM-01)
const res = await listKeyEnterpriseDetails({
pageNum: detailPage.value,
pageSize: detailPageSize.value,
enterpriseNumber: detailEnterprise.value.enterpriseNumber,
enforcementTime: buildEnforcementTime()
});
detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
detailTotal.value = (res as any)?.total ?? detailTableData.value.length;
} finally {
detailLoading.value = false;
}
@ -174,7 +216,11 @@ const handleDetailPageChange = (page: number) => {
};
onMounted(() => {
loadAreaDict();
if (props.dimension === 'area') {
loadAreaDict();
} else {
loadFieldDict();
}
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
@ -209,7 +255,7 @@ defineExpose({ calcTableHeight });
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainName" />
</el-select>
</el-form-item>
<el-form-item label="年份">
@ -221,7 +267,7 @@ defineExpose({ calcTableHeight });
<el-date-picker
v-model="queryParams.month"
type="month"
value-format="YYYY-MM"
value-format="MM"
class="period-date"
placeholder="选择月份"
/>
@ -252,11 +298,12 @@ defineExpose({ calcTableHeight });
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column prop="enterpriseName" label="企业名称" min-width="300" align="center" />
<el-table-column prop="areaName" label="所属区" width="160" align="center" />
<el-table-column prop="streetName" label="所属街道" width="160" align="center" />
<el-table-column prop="district" label="所属区" width="160" align="center" v-if="dimension === 'area'" />
<el-table-column prop="street" label="所属街道" width="160" align="center" v-if="dimension === 'area'" />
<el-table-column prop="domainName" label="所属领域" width="260" align="center" v-if="dimension !== 'area'" />
<el-table-column label="行政执法次数" width="180" align="center">
<template #default="{ row }">
<span v-if="row.enforcementCount !== null && row.enforcementCount !== undefined">{{ row.enforcementCount }}次</span>
<span>{{ dimension === 'area'? row.xzzfcs:row.jccs }}次</span>
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center" fixed="right">
@ -301,8 +348,8 @@ defineExpose({ calcTableHeight });
v-if="detailEnterprise"
:closable="false"
show-icon
type="warning"
:title="`预警企业 | 所属区:${detailEnterprise.areaName || '-'} | 所属街道:${detailEnterprise.streetName || '-'} | 行政执法次数:${detailEnterprise.enforcementCount ?? 0}次 | 时段:${queryParams.year}年${queryParams.month}`"
:title="`所属区:${detailEnterprise.district || '-'} | 所属街道:${detailEnterprise.street || '-'} | 行政执法次数:${detailEnterprise.xzzfcs ?detailEnterprise.xzzfcs : detailEnterprise.jccs}次 | 时段:${queryParams.year}年${queryParams.month}`"
type="info"
class="mb-4"
/>
@ -317,9 +364,13 @@ defineExpose({ calcTableHeight });
<el-table-column label="序号" type="index" width="80" align="center" />
<el-table-column label="执法时间" prop="enforcementTime" min-width="180" align="center" />
<el-table-column label="执法单位" prop="bureauDeptName" min-width="260" align="center" />
<el-table-column label="执法类别" prop="categoryText" width="140" align="center" />
<el-table-column label="执法人员" prop="lawEnforcer" width="140" align="center" />
<el-table-column label="执法事项" prop="itemText" min-width="220" align="center" />
<el-table-column label="执法类别" prop="dictLabel" width="140" align="center" />
<el-table-column label="执法人员" width="140" align="center">
<template #default="{ row }">
{{ [row.lawEnforcer, row.lawEnforcerTwo].filter(Boolean).join('、') }}
</template>
</el-table-column>
<el-table-column label="执法事项" prop="lawEnforcementItemText" min-width="220" align="center" />
</el-table>
<el-pagination
@ -389,4 +440,7 @@ defineExpose({ calcTableHeight });
margin-top: 16px;
justify-content: flex-end;
}
.mb-4 {
margin-bottom: 16px;
}
</style>

80
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/inspection-registration/components/StatPane.vue

@ -1,7 +1,15 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listAreaRegistration, listFieldRegistration, type CheckRegistrationRow } from '@/api/efcode/report/check-registration';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
import {
listAreaRegistration,
listFieldRegistration,
exportAreaRegistration,
exportDomainRegistration,
type CheckRegistrationRow
} from '@/api/efcode/report/check-registration';
/** 维度:area=各区域 field=各领域 */
const props = defineProps<{
@ -16,7 +24,7 @@ const queryParams = reactive({
areaName: undefined as string | undefined,
fieldName: undefined as string | undefined,
year: String(now.getFullYear()),
month: `${String(now.getFullYear())}-${String(now.getMonth() + 1).padStart(2, '0')}`
month: String(now.getMonth() + 1).padStart(2, '0')
});
/** 年份选项(近 5 年) */
@ -27,14 +35,7 @@ const yearOptions = (() => {
// ======================== 所属区 / 领域字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = [
{ label: '食品安全', value: 'food' },
{ label: '药品安全', value: 'drug' },
{ label: '特种设备', value: 'special_equipment' },
{ label: '产品质量', value: 'product' },
{ label: '计量', value: 'metrology' },
{ label: '认证认可', value: 'certification' }
];
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -45,6 +46,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<CheckRegistrationRow[]>([]);
@ -78,7 +88,7 @@ const getList = async () => {
tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0;
} else {
params.fieldName = queryParams.fieldName;
params.lymc = queryParams.fieldName;
const res = await listFieldRegistration(params);
tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0;
@ -99,15 +109,35 @@ const handleReset = () => {
queryParams.areaName = undefined;
queryParams.fieldName = undefined;
queryParams.year = String(new Date().getFullYear());
queryParams.month = `${String(new Date().getFullYear())}-${String(new Date().getMonth() + 1).padStart(2, '0')}`;
queryParams.month = String(new Date().getMonth() + 1).padStart(2, '0');
queryParams.pageNum = 1;
queryParams.pageSize = 20;
getList();
};
/** 导出 */
const handleExport = () => {
// TODO: 接入导出接口后实现文件下载
/** 导出(各区域走 exportArea,各领域走 exportDomain) */
const handleExport = async () => {
try {
const params =
props.dimension === 'area'
? { areaName: queryParams.areaName, year: queryParams.year, month: queryParams.month }
: { lymc: queryParams.fieldName, year: queryParams.year, month: queryParams.month };
const res =
props.dimension === 'area'
? await exportAreaRegistration(params)
: await exportDomainRegistration(params);
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = props.dimension === 'area' ? '检查登记区域.xlsx' : '检查登记领域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
/** 多选 */
@ -118,6 +148,8 @@ const handleSelectionChange = (selection: CheckRegistrationRow[]) => {
onMounted(() => {
if (props.dimension === 'area') {
loadAreaDict();
} else {
loadFieldDict();
}
getList();
nextTick(() => calcTableHeight());
@ -153,7 +185,7 @@ defineExpose({ calcTableHeight });
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainName" />
</el-select>
</el-form-item>
<el-form-item label="年份">
@ -165,7 +197,7 @@ defineExpose({ calcTableHeight });
<el-date-picker
v-model="queryParams.month"
type="month"
value-format="YYYY-MM"
value-format="MM"
class="period-date"
placeholder="选择月份"
/>
@ -192,11 +224,15 @@ defineExpose({ calcTableHeight });
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column prop="dimensionName" :label="dimension === 'area' ? '所属区' : '所属领域'" min-width="200" align="center" />
<el-table-column label="行政执法数" min-width="160" align="center" prop="enforcementCount" />
<el-table-column label="行政检查案件数" min-width="180" align="center" prop="inspectionCaseCount" />
<el-table-column label="行政处罚案件数" min-width="180" align="center" prop="penaltyCaseCount" />
<el-table-column label="行政处罚强制数" min-width="180" align="center" prop="coerciveCount" />
<el-table-column prop="dimensionName" :label="dimension === 'area' ? '所属区' : '所属领域'" min-width="200" align="center">
<template #default="scope">
{{ dimension === 'area' ? scope.row.areaName : scope.row.lymc }}
</template>
</el-table-column>
<el-table-column label="行政执法数" min-width="160" align="center" prop="xzzfs" />
<el-table-column label="行政检查案件数" min-width="180" align="center" prop="xzjcajs" />
<el-table-column label="行政处罚案件数" min-width="180" align="center" prop="xzcfajs" />
<el-table-column label="行政强制案件数" min-width="180" align="center" prop="xzqzajs" />
</el-table>
</div>

110
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/key-enterprise/index.vue

@ -1,16 +1,18 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { computed, onMounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listKeyEnterprises, listKeyEnterpriseDetails } from '@/api/efcode/report/key-enterprises';
import { listKeyEnterprises, listKeyEnterpriseDetails, exportKeyEnterprises } from '@/api/efcode/report/key-enterprises';
/** 企业行数据 */
interface EnterpriseRow {
id: number | string;
enterpriseNumber: string;
enterpriseName: string;
enterpriseNumber?: string; // 统一社会信用代码/注册号 — 详情接口入参
areaName: string;
districtName: string;
streetName: string;
enforcementCount: number | null;
xzzfzs: number | null;
enterpriseId: number | string;
}
// ======================== 查询条件 ========================
@ -44,13 +46,15 @@ const loadAreaDict = async () => {
}
};
/** 切换所属区时联动加载所属街道 */
/** 切换所属区时联动加载所属街道(选中值是 dictLabel,需取对应 dictValue 拉子级字典) */
const handleAreaChange = async (val: string) => {
queryParams.streetName = undefined;
streetOptions.value = [];
if (!val) return;
const dictValue = areaOptions.value.find((item) => item.dictLabel === val)?.dictValue;
if (!dictValue) return;
try {
const res = await getDicts(val);
const res = await getDicts(dictValue);
streetOptions.value = res.data || [];
} catch (e) {
console.error('加载所属街道字典失败', e);
@ -63,21 +67,23 @@ const tableData = ref<EnterpriseRow[]>([]);
const total = ref(0);
const selectedRows = ref<EnterpriseRow[]>([]);
// 表格高度(与 efcode/report/registration/indexList.vue 实现一致)
const tableHeight = ref<number | undefined>(undefined);
const tableRef = ref<HTMLElement>();
/** 表格固定高度 */
const tableHeight = 600;
/** 计算表格高度:视口高度 - 表格顶部偏移 - 分页区高度(~52px) - 底部边距(16px) */
const calcTableHeight = () => {
if (!tableRef.value) return;
const rect = tableRef.value.getBoundingClientRect();
tableHeight.value = window.innerHeight - rect.top - 84;
/** 月份选择器(YYYY-MM)→ 月号,如 "2026-10" → "10" */
const statMonthValue = () => {
const part = queryParams.statMonth ? queryParams.statMonth.split('-')[1] : undefined;
return part ? String(Number(part)) : undefined;
};
const getList = async () => {
loading.value = true;
try {
const res = await listKeyEnterprises(queryParams);
// 年份取「年份」下拉,月份取「月份」选择器并只传月号(不带年份)
const res = await listKeyEnterprises({
...queryParams,
statMonth: statMonthValue()
});
tableData.value = (res.rows || []) as EnterpriseRow[];
total.value = res.total || 0;
} finally {
@ -104,9 +110,33 @@ const handleReset = () => {
getList();
};
/** 导出 */
const handleExport = () => {
// TODO: 接入导出接口后实现文件下载
/** 导出 — 勾选企业时按其 enterpriseNumber 导出(多选用逗号分隔),未勾选则导出全部;默认带当前年月 */
const handleExport = async () => {
try {
const numbers = selectedRows.value
.map((r) => r.enterpriseNumber)
.filter(Boolean)
.join(',');
const res = await exportKeyEnterprises({
enterpriseNumber: numbers || undefined,
enterpriseName: queryParams.enterpriseName || undefined,
districtName: queryParams.districtName,
streetName: queryParams.streetName,
statYear: queryParams.statYear,
statMonth: statMonthValue()
});
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '重点企业执法明细.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
// ======================== 详情弹窗 ========================
@ -116,6 +146,7 @@ interface EnforcementDetailRow {
bureauDeptName: string;
categoryText: string;
lawEnforcer: string;
lawEnforcerTwo?: string;
itemText: string;
}
@ -131,10 +162,12 @@ const getDetailList = async () => {
detailLoading.value = true;
try {
if (!detailEnterprise.value) return;
// 真实接口:enterpriseNumber(企业注册号)+ enforcementTime(按年-月筛选)
// 详情接口:enterpriseNumber(企业id)+ enforcementTime(YYYY-MM),带分页
const res = await listKeyEnterpriseDetails({
pageNum: detailPage.value,
pageSize: detailPageSize.value,
enterpriseNumber: detailEnterprise.value.enterpriseNumber,
enforcementTime: queryParams.statMonth
enforcementTime: queryParams.statMonth + '-01'
});
detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
detailTotal.value = (res as any)?.total ?? detailTableData.value.length;
@ -171,12 +204,6 @@ const handleSelectionChange = (selection: EnterpriseRow[]) => {
onMounted(() => {
loadAreaDict();
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
});
onUnmounted(() => {
window.removeEventListener('resize', calcTableHeight);
});
</script>
@ -204,7 +231,7 @@ onUnmounted(() => {
clearable
@change="handleAreaChange"
>
<el-option v-for="item in areaOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
<el-option v-for="item in areaOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictLabel" />
</el-select>
</el-form-item>
<el-form-item label="所属街道">
@ -214,7 +241,7 @@ onUnmounted(() => {
class="search-select"
clearable
>
<el-option v-for="item in streetOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
<el-option v-for="item in streetOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictLabel" />
</el-select>
</el-form-item>
<el-form-item label="年份">
@ -241,7 +268,7 @@ onUnmounted(() => {
<!-- ==================== 表格区域 ==================== -->
<div class="table-panel">
<div ref="tableRef">
<div>
<el-table
v-loading="loading"
:data="tableData"
@ -258,17 +285,17 @@ onUnmounted(() => {
</template>
</el-table-column>
<el-table-column prop="enterpriseName" label="企业名称" min-width="300" align="center" />
<el-table-column prop="areaName" label="所属区" width="160" align="center" />
<el-table-column prop="districtName" label="所属区" width="160" align="center" />
<el-table-column prop="streetName" label="所属街道" width="160" align="center" />
<el-table-column label="行政执法次数" width="180" align="center">
<template #default="{ row }">
<span v-if="row.enforcementCount !== null">{{ row.enforcementCount }}次</span>
<span v-if="row.xzzfzs !== null">{{ row.xzzfzs }}次</span>
</template>
</el-table-column>
<el-table-column label="操作" width="80" align="center">
<template #default="{ row }">
<el-button
v-if="row.enterpriseName"
v-if="row.xzzfzs"
type="primary"
link
size="small"
@ -298,7 +325,7 @@ onUnmounted(() => {
<el-dialog
v-model="detailDialogVisible"
width="1100px"
:title="`${detailEnterprise?.enterpriseName || ''} — ${queryParams.statYear}年${queryParams.statMonth} 执法明细`"
:title="`${detailEnterprise?.enterpriseName || ''} — ${queryParams.statMonth} 执法明细`"
append-to-body
top="5vh"
destroy-on-close
@ -307,7 +334,7 @@ onUnmounted(() => {
v-if="detailEnterprise"
:closable="false"
show-icon
:title="`所属区:${detailEnterprise.areaName} | 所属街道:${detailEnterprise.streetName} | 行政执法次数:${detailEnterprise.enforcementCount ?? 0}次 | 时段:${queryParams.statYear}年${queryParams.statMonth}`"
:title="`所属区:${detailEnterprise.districtName || '-'} | 所属街道:${detailEnterprise.streetName || '-'} | 行政执法次数:${detailEnterprise.xzzfzs ?? 0}次 | 时段:${queryParams.statMonth}`"
type="info"
class="mb-4"
/>
@ -323,9 +350,13 @@ onUnmounted(() => {
<el-table-column label="序号" type="index" width="80" align="center" />
<el-table-column label="执法时间" prop="enforcementTime" min-width="180" align="center" />
<el-table-column label="执法单位" prop="bureauDeptName" min-width="260" align="center" />
<el-table-column label="执法类别" prop="categoryText" width="140" align="center" />
<el-table-column label="执法人员" prop="lawEnforcer" width="140" align="center" />
<el-table-column label="执法事项" prop="itemText" min-width="220" align="center" />
<el-table-column label="执法类别" prop="dictLabel" width="140" align="center" />
<el-table-column label="执法人员" width="140" align="center">
<template #default="{ row }">
{{ [row.lawEnforcer, row.lawEnforcerTwo].filter(Boolean).join('、') }}
</template>
</el-table-column>
<el-table-column label="执法事项" prop="lawEnforcementItemText" min-width="220" align="center" />
</el-table>
<el-pagination
@ -346,16 +377,13 @@ onUnmounted(() => {
<style scoped lang="scss">
/* 外层容器:与 border-card tabs 壳提供的白底带边框容器一致 */
.app-container {
padding: 16px;
box-sizing: border-box;
}
.page-card {
background: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
box-sizing: border-box;
padding: 16px;
min-height: calc(100vh - 116px);
}

194
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-district/index.vue

@ -1,11 +1,15 @@
<script setup lang="ts">
import { computed, nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listScanArea, listScanAreaDetails, exportScanArea, type ScanTimeParams } from '@/api/efcode/report/scan-data-situation';
/** 表格行数据 */
interface DistrictRow {
id: number;
areaName: string;
districtCode?: string;
districtName?: string;
enterpriseCount: number;
adminEnforceCount: number;
adminRank: number;
@ -109,18 +113,6 @@ const handleMonthChange = (val: string) => {
queryParams.dateSearch = val;
};
/** 时段文本 */
const timePeriodText = computed(() => {
if (timeMode.value === 'year') {
return `${selectedYear.value}年`;
} else if (timeMode.value === 'quarter') {
return `${selectedYear.value}年第${selectedQuarter.value}季度`;
} else if (timeMode.value === 'month') {
return selectedMonth.value || '全部时段';
}
return '全部时段';
});
// ======================== 所属区字典 ========================
const areaOptions = ref<any[]>([]);
@ -150,10 +142,41 @@ const calcTableHeight = () => {
tableHeight.value = window.innerHeight - rect.top - 84;
};
/** 按当前时段模式拼装接口时间参数 */
const buildTimeParams = (): ScanTimeParams => {
if (timeMode.value === 'year') {
return { year: selectedYear.value };
}
if (timeMode.value === 'quarter') {
return { year: selectedYear.value, quarter: String(selectedQuarter.value) };
}
if (timeMode.value === 'month') {
if (!selectedMonth.value) return {};
const [y, m] = selectedMonth.value.split('-');
return { year: y, month: m };
}
return { startTime: queryParams.beginTime, endTime: queryParams.endTime };
};
/** 当前选中的所属区(dictLabel→districtName,不再传 districtCode) */
const currentDistrict = () => {
const item = areaOptions.value.find((i: any) => i.dictValue === queryParams.area);
return { districtName: item?.dictLabel };
};
const getList = async () => {
loading.value = true;
try {
// TODO: 接入真实接口 listDistrictScanData
const res = await listScanArea({
...buildTimeParams(),
pageNum: currentPage.value,
pageSize: pageSize.value,
...currentDistrict()
});
tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0;
} catch (e) {
console.warn('[scan-district] 列表接口调用失败', e);
} finally {
loading.value = false;
}
@ -180,8 +203,24 @@ const handleReset = () => {
getList();
};
const handleExport = () => {
// TODO: 接入导出接口
const handleExport = async () => {
try {
const res = await exportScanArea({
...buildTimeParams(),
...currentDistrict()
});
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '扫码情况区域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
const handleSelectionChange = (selection: DistrictRow[]) => {
@ -199,30 +238,36 @@ const handlePageChange = (page: number) => {
getList();
};
// ======================== 详情弹窗 ========================
interface ScanDetailRow {
id: number;
enterpriseName: string;
scanTime: string;
scanType: string;
bureauDeptName: string;
lawEnforcer: string;
enforcementItem: string;
// ======================== 详情弹窗(区 → 街道) ========================
interface StreetRow {
id?: number | string;
streetName?: string;
districtName?: string;
enterpriseCount?: number | null;
xzzfCount?: number | null;
xzzfslpm?: number | string | null;
xzzfslzb?: number | string | null;
fxzzfsl?: number | null;
fxzzfslpm?: number | string | null;
fxzzfslzb?: number | string | null;
}
const detailDialogVisible = ref(false);
const detailArea = ref<DistrictRow | null>(null);
const detailLoading = ref(false);
const detailTableData = ref<ScanDetailRow[]>([]);
const detailTotal = ref(0);
const detailPage = ref(1);
const detailPageSize = ref(20);
const detailTableData = ref<StreetRow[]>([]);
const getDetailList = async () => {
detailLoading.value = true;
try {
if (!detailArea.value) return;
// TODO: 接入真实接口 listDistrictScanDetail
const res = await listScanAreaDetails({
...buildTimeParams(),
districtName: detailArea.value.districtName || detailArea.value.areaName || currentDistrict().districtName
});
detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
} catch (e) {
console.warn('[scan-district] 详情接口调用失败', e);
} finally {
detailLoading.value = false;
}
@ -230,22 +275,10 @@ const getDetailList = async () => {
const handleDetail = (row: DistrictRow) => {
detailArea.value = row;
detailPage.value = 1;
detailDialogVisible.value = true;
getDetailList();
};
const handleDetailSizeChange = (size: number) => {
detailPageSize.value = size;
detailPage.value = 1;
getDetailList();
};
const handleDetailPageChange = (page: number) => {
detailPage.value = page;
getDetailList();
};
onMounted(() => {
loadAreaDict();
applyYearFilter();
@ -326,14 +359,14 @@ onUnmounted(() => {
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="80" align="center" type="index" />
<el-table-column prop="areaName" label="所属区" width="120" align="center" />
<el-table-column prop="districtName" label="所属区" width="120" align="center" />
<el-table-column prop="enterpriseCount" label="商事主体数量(户)" min-width="150" align="center" />
<el-table-column prop="adminEnforceCount" label="行政执法数量(条)" min-width="150" align="center" />
<el-table-column prop="adminRank" label="行政执法数量排名" min-width="150" align="center" />
<el-table-column prop="adminPercent" label="行政执法数量占比(%)" min-width="170" align="center" />
<el-table-column prop="nonAdminEnforceCount" label="非行政执法数量" min-width="140" align="center" />
<el-table-column prop="nonAdminRank" label="非行政执法数量排名" min-width="160" align="center" />
<el-table-column prop="nonAdminPercent" label="非行政执法数量占比(%)" min-width="180" align="center" />
<el-table-column prop="xzzfCount" label="行政执法数量(条)" min-width="150" align="center" />
<el-table-column prop="xzzfslpm" label="行政执法数量排名" min-width="150" align="center" />
<el-table-column prop="xzzfslzb" label="行政执法数量占比(%)" min-width="170" align="center" />
<el-table-column prop="fxzzfsl" label="非行政执法数量" min-width="140" align="center" />
<el-table-column prop="fxzzfslpm" label="非行政执法数量排名" min-width="160" align="center" />
<el-table-column prop="fxzzfslzb" label="非行政执法数量占比(%)" min-width="180" align="center" />
<el-table-column label="操作" width="80" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleDetail(row)">详情</el-button>
@ -355,24 +388,15 @@ onUnmounted(() => {
</div>
</div>
<!-- ==================== 扫码详情弹窗 ==================== -->
<!-- ==================== 区 → 街道详情弹窗 ==================== -->
<el-dialog
v-model="detailDialogVisible"
width="1100px"
:title="`${detailArea?.areaName || ''} — ${timePeriodText} 扫码明细`"
width="1400px"
:title="detailArea?.districtName || detailArea?.areaName || ''"
append-to-body
top="5vh"
destroy-on-close
>
<el-alert
v-if="detailArea"
:closable="false"
show-icon
:title="`商事主体:${detailArea.enterpriseCount}户 | 行政执法:${detailArea.adminEnforceCount}条 | 非行政执法:${detailArea.nonAdminEnforceCount}条 | 时段:${timePeriodText}`"
type="info"
class="mb-4"
/>
<el-table
v-loading="detailLoading"
:data="detailTableData"
@ -381,25 +405,32 @@ onUnmounted(() => {
style="width: 100%"
max-height="55vh"
>
<el-table-column label="序号" type="index" width="80" align="center" />
<el-table-column label="企业名称" prop="enterpriseName" min-width="220" align="center" />
<el-table-column label="扫码时间" prop="scanTime" min-width="180" align="center" />
<el-table-column label="扫码类型" prop="scanType" width="120" align="center" />
<el-table-column label="执法单位" prop="bureauDeptName" min-width="220" align="center" />
<el-table-column label="执法人员" prop="lawEnforcer" width="120" align="center" />
<el-table-column label="执法事项" prop="enforcementItem" min-width="200" align="center" />
<el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="所属街道" min-width="160" align="center">
<template #default="{ row }">{{ row.streetName || row.districtName || '-' }}</template>
</el-table-column>
<el-table-column label="商事主体数量(户)" min-width="160" align="center">
<template #default="{ row }">{{ row.enterpriseCount ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量(条)" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfCount ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量排名" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量占比(%)" min-width="160" align="center">
<template #default="{ row }">{{ row.xzzfslzb ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量(条)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfsl ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量排名" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量占比(%)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslzb ?? '-' }}</template>
</el-table-column>
</el-table>
<el-pagination
v-model:current-page="detailPage"
v-model:page-size="detailPageSize"
:page-sizes="[10, 20, 50, 100]"
:total="detailTotal"
layout="total, sizes, prev, pager, next, jumper"
class="mt-4"
@size-change="handleDetailSizeChange"
@current-change="handleDetailPageChange"
/>
</el-dialog>
</div>
</template>
@ -412,10 +443,8 @@ onUnmounted(() => {
.page-card {
background: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
box-sizing: border-box;
padding: 16px;
min-height: calc(100vh - 116px);
}
@ -448,7 +477,4 @@ onUnmounted(() => {
margin-top: 16px;
justify-content: flex-end;
}
.mb-4 {
margin-bottom: 16px;
}
</style>

112
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-enforcer/index.vue

@ -1,7 +1,15 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listLawEnforcer, listLawEnforcerDetails, type EnforcerRow, type LawEnforcerDetailRow } from '@/api/efcode/report/law-enforcer';
import {
listLawEnforcer,
listLawEnforcerDetails,
exportLawEnforcer,
type EnforcerRow,
type LawEnforcerDetailRow
} from '@/api/efcode/report/law-enforcer';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
// ======================== 查询条件 ========================
const queryParams = reactive({
@ -10,16 +18,18 @@ const queryParams = reactive({
lawEnforcer: '' as string, // 执法人员关键字(接口参数名)
area: undefined as string | undefined,
field: undefined as string | undefined,
enforcementTime: String(new Date().getFullYear()),
enforcementTime: `${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}-01`,
orderByColumn: '' as string,
isAsc: '' as string
});
// 时段模式:year | quarter | month
const timeMode = ref('year');
const timeMode = ref('month');
const selectedYear = ref<string>(String(new Date().getFullYear()));
const selectedQuarter = ref<number>(Math.ceil((new Date().getMonth() + 1) / 3));
const selectedMonth = ref<string>('');
const selectedMonth = ref<string>(
`${new Date().getFullYear()}-${String(new Date().getMonth() + 1).padStart(2, '0')}`
);
// 季度选项
const quarterOptions = [
@ -42,7 +52,8 @@ const syncEnforcementTime = () => {
} else if (timeMode.value === 'quarter') {
queryParams.enforcementTime = `${selectedYear.value}-Q${selectedQuarter.value}`;
} else if (timeMode.value === 'month') {
queryParams.enforcementTime = selectedMonth.value;
// 月度模式固定拼 01 日:YYYY-MM-01
queryParams.enforcementTime = selectedMonth.value ? `${selectedMonth.value}-01` : '';
}
};
@ -61,15 +72,7 @@ const handleMonthChange = () => syncEnforcementTime();
// ======================== 字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = [
{ label: '生态环境领域', value: 'ecology' },
{ label: '卫生健康领域', value: 'health' },
{ label: '应急管理领域', value: 'emergency' },
{ label: '交通运输领域', value: 'transport' },
{ label: '市场监管领域', value: 'market' },
{ label: '消防救援领域', value: 'fire' },
{ label: '规划和自然资源领域', value: 'planning' }
];
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -80,6 +83,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<EnforcerRow[]>([]);
@ -98,7 +110,14 @@ const calcTableHeight = () => {
const getList = async () => {
loading.value = true;
try {
const res = await listLawEnforcer(queryParams);
// 接口字段:区 → districtName(下拉绑定的是 dictLabel),领域 → bureauDeptName(传 domainName)
const { area, field, ...rest } = queryParams;
const domain = fieldOptions.value.find((i) => i.domainId === field);
const res = await listLawEnforcer({
...rest,
districtName: area,
bureauDeptName: domain?.domainName
});
tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0;
} catch (e) {
@ -122,16 +141,32 @@ const handleReset = () => {
queryParams.isAsc = '';
queryParams.pageNum = 1;
queryParams.pageSize = 20;
timeMode.value = 'year';
timeMode.value = 'month';
selectedYear.value = String(n.getFullYear());
selectedQuarter.value = Math.ceil((n.getMonth() + 1) / 3);
selectedMonth.value = '';
selectedMonth.value = `${n.getFullYear()}-${String(n.getMonth() + 1).padStart(2, '0')}`;
syncEnforcementTime();
getList();
};
const handleExport = () => {
// TODO: 接入导出接口
const handleExport = async () => {
try {
const res = await exportLawEnforcer({
lawEnforcer: queryParams.lawEnforcer,
enforcementTime: queryParams.enforcementTime
});
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '执法人员列表.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
const handleSelectionChange = (selection: EnforcerRow[]) => {
@ -164,15 +199,14 @@ const getDetailList = async () => {
detailLoading.value = true;
try {
if (!detailEnforcer.value?.lawEnforcerId) return;
const res = await listLawEnforcerDetails(detailEnforcer.value.lawEnforcerId);
// 后端可能返回 { rows, total } 或直接数组
if ((res as any)?.rows) {
detailTableData.value = (res as any).rows;
detailTotal.value = (res as any).total ?? detailTableData.value.length;
} else if (Array.isArray(res)) {
detailTableData.value = res as LawEnforcerDetailRow[];
detailTotal.value = detailTableData.value.length;
}
const res = await listLawEnforcerDetails({
lawEnforcerId: detailEnforcer.value.lawEnforcerId,
enforcementTime: queryParams.enforcementTime,
pageNum: detailPage.value,
pageSize: detailPageSize.value
});
detailTableData.value = (res as any)?.rows || [];
detailTotal.value = (res as any)?.total || 0;
} catch (e) {
console.warn('[scan-enforcer] 详情接口调用失败', e);
} finally {
@ -200,6 +234,8 @@ const handleDetailPageChange = (page: number) => {
onMounted(() => {
loadAreaDict();
loadFieldDict();
syncEnforcementTime();
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
@ -242,13 +278,13 @@ onUnmounted(() => {
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainId" />
</el-select>
</el-form-item>
<el-form-item label="时段">
<el-select v-model="timeMode" style="width: 100px" @change="handleTimeModeChange">
<el-option label="年度" value="year" />
<el-option label="季度" value="quarter" />
<!-- <el-option label="年度" value="year" />
<el-option label="季度" value="quarter" /> -->
<el-option label="月度" value="month" />
</el-select>
</el-form-item>
@ -298,10 +334,10 @@ onUnmounted(() => {
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column prop="enforcerName" label="执法人员" min-width="160" align="center" />
<el-table-column prop="enforceCount" label="执法次数" width="140" align="center" sortable="custom" />
<el-table-column prop="areaName" label="所属区(市)" min-width="140" align="center" />
<el-table-column prop="bureauName" label="所属单位" min-width="260" align="center" show-overflow-tooltip />
<el-table-column prop="lawEnforcer" label="执法人员" min-width="160" align="center" />
<el-table-column prop="zfcs" label="执法次数" width="140" align="center" sortable="custom" />
<el-table-column prop="districtName" label="所属区(市)" min-width="140" align="center" />
<el-table-column prop="bureauDeptName" label="所属单位" min-width="260" align="center" show-overflow-tooltip />
<el-table-column label="操作" width="90" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleDetail(row)">详情</el-button>
@ -343,9 +379,9 @@ onUnmounted(() => {
<el-table-column label="序号" type="index" width="80" align="center" />
<el-table-column label="执法单位" prop="bureauDeptName" min-width="220" align="center" show-overflow-tooltip />
<el-table-column label="执法人员" prop="lawEnforcer" min-width="160" align="center" />
<el-table-column label="执法时间" prop="scanTime" min-width="180" align="center" />
<el-table-column label="执法时间" prop="enforcementTime" min-width="180" align="center" />
<el-table-column label="被执法企业名称" prop="enterpriseName" min-width="260" align="center" show-overflow-tooltip />
<el-table-column label="执法事项" prop="enforcementItem" width="120" align="center" />
<el-table-column label="执法事项" prop="lawEnforcementItemText" width="120" align="center" />
</el-table>
<el-pagination
@ -370,10 +406,8 @@ onUnmounted(() => {
.page-card {
background: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
box-sizing: border-box;
padding: 16px;
min-height: calc(100vh - 116px);
}

267
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/scan-field/index.vue

@ -1,11 +1,21 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import {
listScanDomain,
listScanDomainDetails,
exportScanDomain,
type ScanTimeParams
} from '@/api/efcode/report/scan-data-situation';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
/** 表格行数据 */
interface FieldRow {
id: number;
fieldName: string;
domainId?: string | number;
domainName?: string;
adminEnforceCount: number;
adminPercent: string;
nonAdminEnforceCount: number;
@ -17,7 +27,10 @@ const queryParams = reactive({
area: undefined as string | undefined,
field: undefined as string | undefined,
periodType: 'month' as string,
year: String(new Date().getFullYear())
year: String(new Date().getFullYear()),
quarter: Math.ceil((new Date().getMonth() + 1) / 3) as number,
month: String(new Date().getMonth() + 1).padStart(2, '0') as string,
week: '' as string
});
const periodOptions = [
@ -27,6 +40,14 @@ const periodOptions = [
{ label: '年度', value: 'year' }
];
// 季度选项
const quarterOptions = [
{ label: '第一季度', value: 1 },
{ label: '第二季度', value: 2 },
{ label: '第三季度', value: 3 },
{ label: '第四季度', value: 4 }
];
/** 年份选项(近 5 年) */
const yearOptions = (() => {
const curr = new Date().getFullYear();
@ -35,15 +56,7 @@ const yearOptions = (() => {
// ======================== 字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = ref([
{ label: '生态环境领域', value: 'ecology' },
{ label: '卫生健康领域', value: 'health' },
{ label: '应急管理领域', value: 'emergency' },
{ label: '交通运输领域', value: 'transport' },
{ label: '市场监管领域', value: 'market' },
{ label: '消防救援领域', value: 'fire' },
{ label: '规划和自然资源领域', value: 'planning' }
]);
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -54,6 +67,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<FieldRow[]>([]);
@ -71,10 +93,56 @@ const calcTableHeight = () => {
tableHeight.value = window.innerHeight - rect.top - 84;
};
/** 按当前时段类型拼装接口时间参数 */
const buildTimeParams = (): ScanTimeParams => {
const year = queryParams.year;
if (queryParams.periodType === 'quarter') {
return { year, quarter: String(queryParams.quarter) };
}
if (queryParams.periodType === 'month') {
return queryParams.month ? { year, month: queryParams.month } : { year };
}
if (queryParams.periodType === 'week') {
// 周度:以选择周(取周一)为起点,拼本周一 ~ 本周日
const base = queryParams.week ? new Date(queryParams.week) : new Date();
const day = base.getDay() || 7;
const monday = new Date(base);
monday.setDate(base.getDate() - (day - 1));
const sunday = new Date(monday);
sunday.setDate(monday.getDate() + 6);
const fmt = (d: Date) =>
`${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
return { startTime: fmt(monday), endTime: fmt(sunday) };
}
return { year };
};
/** 当前选中的所属领域(domainId→domainId,domainName→domainName) */
const currentField = () => {
const item = fieldOptions.value.find((i) => i.domainId === queryParams.field);
return { domainId: queryParams.field, domainName: item?.domainName };
};
/** 当前选中的所属区(dictLabel→districtName,不再传 districtCode) */
const currentArea = () => {
const item = areaOptions.value.find((i: any) => i.dictValue === queryParams.area);
return { districtName: item?.dictLabel };
};
const getList = async () => {
loading.value = true;
try {
// TODO: 接入真实接口 listFieldScanData
const res = await listScanDomain({
...buildTimeParams(),
pageNum: currentPage.value,
pageSize: pageSize.value,
...currentField(),
...currentArea()
});
tableData.value = (res as any)?.rows || [];
total.value = (res as any)?.total || 0;
} catch (e) {
console.warn('[scan-field] 列表接口调用失败', e);
} finally {
loading.value = false;
}
@ -86,17 +154,37 @@ const handleSearch = () => {
};
const handleReset = () => {
const n = new Date();
queryParams.area = undefined;
queryParams.field = undefined;
queryParams.periodType = 'month';
queryParams.year = String(new Date().getFullYear());
queryParams.year = String(n.getFullYear());
queryParams.quarter = Math.ceil((n.getMonth() + 1) / 3);
queryParams.month = String(n.getMonth() + 1).padStart(2, '0');
queryParams.week = '';
currentPage.value = 1;
pageSize.value = 20;
getList();
};
const handleExport = () => {
// TODO: 接入导出接口
const handleExport = async () => {
try {
const res = await exportScanDomain({
...buildTimeParams(),
...currentField()
});
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '扫码情况领域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
const handleSelectionChange = (selection: FieldRow[]) => {
@ -114,8 +202,51 @@ const handlePageChange = (page: number) => {
getList();
};
// ======================== 详情弹窗(领域 → 街道) ========================
interface StreetRow {
id?: number | string;
streetName?: string;
districtName?: string;
xzzfCount?: number | null;
xzzfslpm?: number | string | null;
xzzfslzb?: number | string | null;
fxzzfsl?: number | null;
fxzzfslpm?: number | string | null;
fxzzfslzb?: number | string | null;
}
const detailDialogVisible = ref(false);
const detailField = ref<FieldRow | null>(null);
const detailLoading = ref(false);
const detailTableData = ref<StreetRow[]>([]);
const getDetailList = async () => {
detailLoading.value = true;
try {
if (!detailField.value) return;
const res = await listScanDomainDetails({
...buildTimeParams(),
domainId: detailField.value.domainId || queryParams.field,
domainName: detailField.value.domainName || detailField.value.fieldName || currentField().domainName,
...currentArea()
});
detailTableData.value = (res as any)?.rows || (Array.isArray(res) ? res : []);
} catch (e) {
console.warn('[scan-field] 详情接口调用失败', e);
} finally {
detailLoading.value = false;
}
};
const handleDetail = (row: FieldRow) => {
detailField.value = row;
detailDialogVisible.value = true;
getDetailList();
};
onMounted(() => {
loadAreaDict();
loadFieldDict();
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
@ -149,7 +280,7 @@ onUnmounted(() => {
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.value" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainId" />
</el-select>
</el-form-item>
<el-form-item label="时段">
@ -157,10 +288,37 @@ onUnmounted(() => {
<el-option v-for="item in periodOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="queryParams.year" class="year-select">
<el-form-item v-if="queryParams.periodType !== 'week'">
<el-select v-model="queryParams.year" v-if="queryParams.periodType === 'year'" class="year-select">
<el-option v-for="y in yearOptions" :key="y" :label="`${y}年`" :value="y" />
</el-select>
<!-- 季度:年份 + 季度 -->
<el-select
v-if="queryParams.periodType === 'quarter'"
v-model="queryParams.quarter"
class="quarter-select"
>
<el-option v-for="q in quarterOptions" :key="q.value" :label="q.label" :value="q.value" />
</el-select>
<!-- 月度:年份 + 月份 -->
<el-date-picker
v-if="queryParams.periodType === 'month'"
v-model="queryParams.month"
type="month"
value-format="MM"
placeholder="选择月份"
class="month-picker"
/>
</el-form-item>
<!-- 周度:选择具体周 -->
<el-form-item v-if="queryParams.periodType === 'week'">
<el-date-picker
v-model="queryParams.week"
type="week"
value-format="YYYY-MM-DD"
placeholder="选择周"
class="week-picker"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
@ -184,11 +342,18 @@ onUnmounted(() => {
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column prop="fieldName" label="所属领域" min-width="200" align="center" />
<el-table-column prop="adminEnforceCount" label="行政执法数量(条)" min-width="160" align="center" />
<el-table-column prop="adminPercent" label="行政执法数量占比(%)" min-width="190" align="center" />
<el-table-column prop="nonAdminEnforceCount" label="非行政执法数量(条)" min-width="170" align="center" />
<el-table-column prop="nonAdminPercent" label="非行政执法数量占比(%)" min-width="200" align="center" />
<el-table-column prop="domainName" label="所属领域" min-width="200" align="center" />
<el-table-column prop="xzzfCount" label="行政执法数量(条)" min-width="160" align="center" />
<el-table-column prop="xzzfslzb" label="行政执法数量占比(%)" min-width="190" align="center" />
<el-table-column prop="xzzfslpm" label="行政执法数量排名" min-width="190" align="center" />
<el-table-column prop="fxzzfsl" label="非行政执法数量(条)" min-width="170" align="center" />
<el-table-column prop="fxzzfslpm" label="非行政执法数量排名" min-width="200" align="center" />
<el-table-column prop="fxzzfslzb" label="非行政执法数量占比(%)" min-width="200" align="center" />
<el-table-column label="操作" width="90" align="center" fixed="right">
<template #default="{ row }">
<el-button type="primary" link size="small" @click="handleDetail(row)">详情</el-button>
</template>
</el-table-column>
</el-table>
</div>
@ -204,6 +369,48 @@ onUnmounted(() => {
/>
</div>
</div>
<!-- ==================== 领域 → 街道详情弹窗 ==================== -->
<el-dialog
v-model="detailDialogVisible"
width="1400px"
:title="detailField?.domainName || detailField?.fieldName || ''"
append-to-body
top="5vh"
destroy-on-close
>
<el-table
v-loading="detailLoading"
:data="detailTableData"
border
stripe
style="width: 100%"
max-height="55vh"
>
<el-table-column label="序号" type="index" width="70" align="center" />
<el-table-column label="所属街道" min-width="160" align="center">
<template #default="{ row }">{{ row.streetName || row.districtName || '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量(条)" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfCount ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量排名" min-width="170" align="center">
<template #default="{ row }">{{ row.xzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="行政执法数量占比(%)" min-width="160" align="center">
<template #default="{ row }">{{ row.xzzfslzb ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量(条)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfsl ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量排名" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslpm ?? '-' }}</template>
</el-table-column>
<el-table-column label="非行政执法数量占比(%)" min-width="180" align="center">
<template #default="{ row }">{{ row.fxzzfslzb ?? '-' }}</template>
</el-table-column>
</el-table>
</el-dialog>
</div>
</template>
@ -215,10 +422,8 @@ onUnmounted(() => {
.page-card {
background: #fff;
border: 1px solid #dcdfe6;
border-radius: 4px;
box-sizing: border-box;
padding: 16px;
min-height: calc(100vh - 116px);
}
@ -245,6 +450,20 @@ onUnmounted(() => {
.year-select {
width: 110px;
}
.quarter-select {
width: 110px;
margin-left: 4px;
}
.month-picker {
width: 120px;
margin-left: 4px;
}
.week-picker {
width: 220px;
}
}
.table-panel {

76
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/situation-trend/components/SituationPane.vue

@ -1,7 +1,15 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listSituationTrendArea, listSituationTrendDomain, type SituationRow } from '@/api/efcode/report/situation-trend';
import {
listSituationTrendArea,
listSituationTrendDomain,
exportSituationTrendArea,
exportSituationTrendDomain,
type SituationRow
} from '@/api/efcode/report/situation-trend';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
/** 维度:area=各区域 field=各领域 */
const props = defineProps<{
@ -38,14 +46,7 @@ const quarterOptions = [
// ======================== 字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = [
{ label: '食品安全', value: 'food' },
{ label: '药品安全', value: 'drug' },
{ label: '特种设备', value: 'special_equipment' },
{ label: '产品质量', value: 'product' },
{ label: '计量', value: 'metrology' },
{ label: '认证认可', value: 'certification' }
];
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -56,6 +57,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<SituationRow[]>([]);
@ -128,9 +138,31 @@ const handleReset = () => {
getList();
};
/** 导出 */
const handleExport = () => {
// TODO: 接入导出接口后实现文件下载
/** 导出(各区域走 exportSituationTrendArea,各领域走 exportSituationTrendDomain) */
const handleExport = async () => {
try {
const baseParams = {
startYear: queryParams.year,
endYear: queryParams.year,
startQuarter: queryParams.quarter,
endQuarter: queryParams.quarter
};
const res =
props.dimension === 'area'
? await exportSituationTrendArea({ ...baseParams, districtName: queryParams.districtName })
: await exportSituationTrendDomain({ ...baseParams, districtName: queryParams.lymc });
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = props.dimension === 'area' ? '态势趋势区域.xlsx' : '态势趋势领域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
/** 多选 */
@ -139,7 +171,11 @@ const handleSelectionChange = (selection: SituationRow[]) => {
};
onMounted(() => {
loadAreaDict();
if (props.dimension === 'area') {
loadAreaDict();
} else {
loadFieldDict();
}
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
@ -174,7 +210,7 @@ defineExpose({ calcTableHeight });
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainName" />
</el-select>
</el-form-item>
<el-form-item label="年份">
@ -204,25 +240,27 @@ defineExpose({ calcTableHeight });
border
stripe
style="width: 100%"
:height="tableHeight"
height="600"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column
prop="dimensionName"
prop="districtName"
:label="dimension === 'area' ? '所属区' : '所属领域'"
min-width="220"
align="center"
/>
><template #default="{ row }">
{{ row.districtName || row.lymc || '' }}
</template> </el-table-column>
<el-table-column label="年+季度" width="160" align="center">
<template #default="{ row }">
{{ row.yearQuarter || '' }}
{{ row.year + 'Q' + row.quarter || '' }}
</template>
</el-table-column>
<el-table-column label="行政执法综合评分" min-width="180" align="center">
<template #default="{ row }">
<span v-if="row.score !== null && row.score !== undefined">{{ row.score }}</span>
<span>{{ row.zhpjDescription }}</span>
</template>
</el-table-column>
</el-table>

75
zdxt-web-client/zdxt-admin-plus-ui/src/views/efcode/trend/trend-behavior/components/TrendPane.vue

@ -1,7 +1,15 @@
<script setup lang="ts">
import { nextTick, onMounted, onUnmounted, reactive, ref } from 'vue';
import { ElMessage } from 'element-plus';
import { getDicts } from '@/api/system/dict/data';
import { listTrendBehaviorArea, listTrendBehaviorDomain, type TrendBehaviorRow } from '@/api/efcode/report/trend-behavior';
import { getDomainInfo, type DashboardDomainVo } from '@/api/efcode/dashboard/area-info';
import {
listTrendBehaviorArea,
listTrendBehaviorDomain,
exportTrendBehaviorArea,
exportTrendBehaviorDomain,
type TrendBehaviorRow
} from '@/api/efcode/report/trend-behavior';
/** 维度:area=各区域 field=各领域 */
const props = defineProps<{
@ -35,19 +43,12 @@ const quarterOptions = [
{ label: '第四季度', value: '4' }
];
/** 拼接 quarterTime 传给后端(格式:2026-Q3) */
const buildQuarterTime = () => `${queryParams.year}-Q${queryParams.quarter}`;
/** 拼接 quarterTime 传给后端(格式:2026Q3) */
const buildQuarterTime = () => `${queryParams.year}Q${queryParams.quarter}`;
// ======================== 字典 ========================
const areaOptions = ref<any[]>([]);
const fieldOptions = [
{ label: '食品安全', value: 'food' },
{ label: '药品安全', value: 'drug' },
{ label: '特种设备', value: 'special_equipment' },
{ label: '产品质量', value: 'product' },
{ label: '计量', value: 'metrology' },
{ label: '认证认可', value: 'certification' }
];
const fieldOptions = ref<DashboardDomainVo[]>([]);
const loadAreaDict = async () => {
try {
@ -58,6 +59,15 @@ const loadAreaDict = async () => {
}
};
const loadFieldDict = async () => {
try {
const res = await getDomainInfo();
fieldOptions.value = res.data || [];
} catch (e) {
console.error('加载所属领域字典失败', e);
}
};
// ======================== 表格数据 ========================
const loading = ref(false);
const tableData = ref<TrendBehaviorRow[]>([]);
@ -124,9 +134,26 @@ const handleReset = () => {
getList();
};
/** 导出 */
const handleExport = () => {
// TODO: 接入导出接口后实现文件下载
/** 导出(各区域走 exportTrendBehaviorArea,各领域走 exportTrendBehavioDomain) */
const handleExport = async () => {
try {
const qt = buildQuarterTime();
const res =
props.dimension === 'area'
? await exportTrendBehaviorArea({ districtName: queryParams.districtName, quarterTime: qt })
: await exportTrendBehaviorDomain({ domainName: queryParams.domainName, quarterTime: qt });
const blob = new Blob([res as any], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = props.dimension === 'area' ? '趋势行为区域.xlsx' : '趋势行为领域.xlsx';
link.click();
window.URL.revokeObjectURL(url);
} catch (e) {
ElMessage.error('导出失败');
}
};
/** 多选 */
@ -136,6 +163,7 @@ const handleSelectionChange = (selection: TrendBehaviorRow[]) => {
onMounted(() => {
loadAreaDict();
loadFieldDict();
getList();
nextTick(() => calcTableHeight());
window.addEventListener('resize', calcTableHeight);
@ -170,7 +198,7 @@ defineExpose({ calcTableHeight });
class="search-select"
clearable
>
<el-option v-for="item in fieldOptions" :key="item.value" :label="item.label" :value="item.label" />
<el-option v-for="item in fieldOptions" :key="item.domainId" :label="item.domainName" :value="item.domainName" />
</el-select>
</el-form-item>
<el-form-item label="年份">
@ -206,19 +234,22 @@ defineExpose({ calcTableHeight });
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="序号" width="90" align="center" type="index" />
<el-table-column
prop="dimensionName"
prop="districtName"
:label="dimension === 'area' ? '所属区' : '所属领域'"
min-width="220"
align="center"
/>
<el-table-column label="年+季度" width="160" align="center">
>
<template #default="{ row }">
{{ row.districtName || row.domainName || '' }}
</template>
</el-table-column>
<el-table-column label="年+季度" align="center">
<template #default="{ row }">
{{ row.yearQuarter || '' }}
{{ row.quarterTime || '' }}
</template>
</el-table-column>
<el-table-column label="行政执法次数" width="180" align="center">
<el-table-column label="行政执法次数" align="center">
<template #default="{ row }">
<span v-if="row.enforcementCount !== null && row.enforcementCount !== undefined">{{ row.enforcementCount }}次</span>
<span>{{ row.jccs }}次</span>
</template>
</el-table-column>
</el-table>

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/home/index.vue

@ -740,7 +740,7 @@ onUnmounted(() => {
.wrap_all {
position: relative;
width: 100%;
height: calc(100vh - 50px);
height: calc(100vh - 80px);
background: var(--bg-homebody) no-repeat;
background-size: cover;
background-position: center center;

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/nos/add.vue

@ -1,7 +1,7 @@
<template>
<div class="add-carousel-container">
<div class="page-header">
<h1>新增涉企服务</h1>
<h1>新增普法服务</h1>
</div>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="form-container">

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/add.vue

@ -1,7 +1,7 @@
<template>
<div class="add-carousel-container">
<div class="page-header">
<h1>新增涉企服务</h1>
<h1>新增普法服务</h1>
</div>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="form-container">

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/detail.vue

@ -1,7 +1,7 @@
<template>
<div v-loading="pageLoading" class="detail-container">
<div class="page-header">
<h1>涉企服务详情</h1>
<h1>普法服务详情</h1>
</div>
<div class="detail-card">

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/draft.vue

@ -330,7 +330,7 @@ onActivated(() => {
.law-service-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 100px);
min-height: calc(100vh - 118px);
}
.search-panel {

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/edit.vue

@ -1,7 +1,7 @@
<template>
<div v-loading="pageLoading" class="add-carousel-container">
<div class="page-header">
<h1>编辑涉企服务</h1>
<h1>编辑普法服务</h1>
</div>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="form-container">

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/index.vue

@ -345,7 +345,7 @@ const loadDictOptions = async () => {
.law-service-container {
padding: 20px;
background: #f5f7fa;
min-height: calc(100vh - 100px);
min-height: calc(100vh - 118px);
}
.search-panel {

2
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/educationServices/repost.vue

@ -1,7 +1,7 @@
<template>
<div class="add-carousel-container">
<div class="page-header">
<h1>转载涉企服务</h1>
<h1>转载普法服务</h1>
</div>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px" class="form-container">

68
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/city-direct/index.vue

@ -1,5 +1,5 @@
<template>
<div class="statistical-analysis" :style="cssVars">
<div class="statistical-analysis statistical-analysis--adaptive" :style="cssVars">
<div class="wrap_all">
<div class="select_set">
<div class="select_item">
@ -51,8 +51,8 @@
<div class="count_div">
<img :src="item.icon" :alt="item.label" />
<div class="count_cont">
<span class="number_count">{{ item.count }}</span>
<span class="number_percent">{{ item.rate }}<i>%</i></span>
<span class="number_count">{{ item.count ? item.count : '-' }}</span>
<span class="number_percent">{{ item.rate ? item.rate : '-' }}<i>%</i></span>
</div>
</div>
</div>
@ -66,8 +66,8 @@
<div class="count_div">
<img :src="item.icon" :alt="item.label" />
<div class="count_cont">
<span class="number_count">{{ item.count }}</span>
<span class="number_percent">{{ item.rate }}<i>%</i></span>
<span class="number_count">{{ item.count ? item.count : '-' }}</span>
<span class="number_percent">{{ item.rate ? item.rate : '-' }}<i>%</i></span>
</div>
</div>
</div>
@ -81,8 +81,8 @@
<div v-for="item in lawFieldItems" :key="item.label" class="count_item">
<div class="count_lab">{{ item.label }}</div>
<div class="count_cont">
<span class="number_count">{{ item.count }}</span>
<span class="number_percent">{{ item.rate }}<i>%</i></span>
<span class="number_count">{{ item.count ? item.count : '-' }}</span>
<span class="number_percent">{{ item.rate ? item.rate : '-' }}<i>%</i></span>
</div>
</div>
</div>
@ -105,12 +105,12 @@
</div>
</div>
<div class="count_com count_rev">
<h4>评价</h4>
<h4>反馈</h4>
<div class="count_list">
<div class="count_row"><span>满意</span><span>{{ stats.eva?.high ?? '-' }}</span><span>{{ evaRates.high }}%</span></div>
<div class="count_row"><span>较满意</span><span>{{ stats.eva?.mid ?? '-' }}</span><span>{{ evaRates.mid }}%</span></div>
<div class="count_row"><span>不满意</span><span>{{ stats.eva?.low ?? '-' }}</span><span>{{ evaRates.low }}%</span></div>
<div class="count_row"><span>未评价</span><span>{{ stats.eva?.un ?? '-' }}</span><span>{{ evaRates.un }}%</span></div>
<div class="count_row"><span>未反馈</span><span>{{ stats.eva?.un ?? '-' }}</span><span>{{ evaRates.un }}%</span></div>
</div>
</div>
</div>
@ -264,8 +264,10 @@ const cssVars = computed(() => {
function buildCategoryItems(data: Record<string, number>[] | undefined, total: number | undefined, iconMap: Record<string, string>) {
if (!data) return [];
return data.map((obj) => {
const [label, count] = Object.entries(obj)[0];
const rate = total ? parseFloat(((Number(count) / total) * 100).toFixed(2)) : 0;
const [label, rawCount] = Object.entries(obj)[0];
// 接口可能返回字符串 "0",统一转成数字,0 才会被模板判定为空显示 '-'
const count = Number(rawCount) || 0;
const rate = total ? parseFloat(((count / total) * 100).toFixed(2)) : 0;
return { label, count, rate, icon: `${BASE}statistical-new/images/${iconMap[label] || 'icon_801.png'}` };
});
}
@ -275,8 +277,9 @@ const caseTypeItems = computed(() => buildCategoryItems(stats.value.caseType, st
const lawFieldItems = computed(() => {
if (!stats.value.lawField) return [];
return stats.value.lawField.map((obj) => {
const [label, count] = Object.entries(obj)[0];
const rate = stats.value.lawFieldTotal ? parseFloat(((Number(count) / stats.value.lawFieldTotal!) * 100).toFixed(2)) : 0;
const [label, rawCount] = Object.entries(obj)[0];
const count = Number(rawCount) || 0;
const rate = stats.value.lawFieldTotal ? parseFloat(((count / stats.value.lawFieldTotal!) * 100).toFixed(2)) : 0;
return { label, count, rate };
});
});
@ -423,4 +426,43 @@ onUnmounted(() => {
@import '../styles/analysis-scope.css';
@import '/statistical-new/font-awesome/css/font-awesome.min.css';
@import '../styles/analysis-layout.css';
/* 卡片高度随内容自适应,避免条目增多时溢出裁切;同行卡片等高 */
.statistical-analysis--adaptive .twobox {
display: flex;
flex-wrap: wrap;
align-items: stretch;
}
.statistical-analysis--adaptive .twobox .threebox {
float: none;
height: auto;
/* min-height: 25rem; */
/* 等高时多出的高度留在底部,内容保持顶部对齐,不被分配到行间 */
align-content: flex-start;
}
/* 标题不再被第一行卡片压住(原 -2% / -0.5% 负外边距会让卡片上移盖住标题) */
.statistical-analysis--adaptive .twobox .chart_tit {
position: relative;
z-index: 1;
}
.statistical-analysis--adaptive .twobox .count_wrap {
margin-top: 0;
}
.statistical-analysis--adaptive .twobox .count_item {
margin-top: 0;
}
/* 投诉类别条目之间留出间隙 */
.statistical-analysis--adaptive .twobox .com_cate {
gap: 0.75rem;
}
.statistical-analysis--adaptive .twobox .com_cate .count_item {
margin: 0;
width: calc(50% - 0.375rem);
}
</style>

4
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/components/TopSixMetrics.vue

@ -1,7 +1,7 @@
<template>
<div class="data_cont">
<div class="data_item">
<div class="cont-title">单独执法数量</div>
<div class="cont-title">单部门执法数量</div>
<div class="cont-total">
<b><span>{{ m.singleLaw?.count ?? '-' }}</span></b>
<div class="nece-data">
@ -67,7 +67,7 @@
</div>
</div>
<div class="data_item">
<div class="cont-title">入企压减率</div>
<div class="cont-title">入企压减数</div>
<div class="cont-total">
<b><span>{{ m.entEeduction?.count ?? '-' }}</span></b>
<div class="nece-data">

26
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/home/index.vue

@ -7,7 +7,7 @@
<h1 class="block_tit">行政执法</h1>
<div class="count_admin_wrap">
<div class="count_admin">
<label><img :src="imgPath('icon_jc2.png')" alt="单独执法" />单独执法</label>
<label><img :src="imgPath('icon_jc2.png')" alt="单部门执法" />单部门执法</label>
<div class="count_admin_num">
<b>{{ coordination.singleNum.toLocaleString() }}</b>
<span class="number_percent">{{ coordination.singlePer }}<i>%</i></span>
@ -75,7 +75,7 @@
</div> -->
</div>
<div class="count_admin">
<label><img :src="imgPath('icon_yj.png')" alt="入企压减率" />入企压减率</label>
<label><img :src="imgPath('icon_yj.png')" alt="入企压减数" />入企压减数</label>
<div class="count_admin_num">
<b>{{ coordination.cutNum.toLocaleString() }}</b>
</div>
@ -257,7 +257,6 @@ import * as echarts from 'echarts';
import {
analysisEnterprises,
analysisEnterprisesCoordination,
analysisEnterprisesNonAll,
analysisNonRegistrationType,
analysisRegistrationType,
analysisTime,
@ -271,7 +270,6 @@ import {
normalizeDictStatList,
normalizeEnterpriseStat,
normalizeTimeSeries,
toNum,
unwrapData
} from '@/api/supervision/statistical/adapters';
import { buildAdminPieOption, buildNonAdminPieOption, buildTrendLineOption } from '@/views/supervision/statistical/utils/chartOptions';
@ -314,7 +312,7 @@ const coordination = reactive({
const enterprise = reactive({ num: 0, yoy: 0, rr: 0 });
const nonTypeList = ref<DictStatItem[]>([]);
const njcAll = ref(0);
const njcAll = computed(() => coordination.nonNum);
const qJcNum = ref(0);
const qNjcNum = ref(0);
@ -417,7 +415,9 @@ async function loadCoordination() {
const res = await safeLoad(() => analysisEnterprisesCoordination(getTimeParams()));
if (res) {
const data = normalizeCoordination(unwrapData(res));
console.log(data);
Object.assign(coordination, data);
console.log(coordination);
coordination.singleYoy = parseFloat(data.singleYoy);
coordination.singleRr = parseFloat(data.singleRr);
coordination.unionYoy = parseFloat(data.unionYoy);
@ -435,15 +435,6 @@ async function loadEnterprise() {
}
}
async function loadNjcAll() {
const res = await safeLoad(() => analysisEnterprisesNonAll(getTimeParams()));
if (res) {
njcAll.value = toNum(unwrapData(res));
}
}
// Mock data for when API is unavailable (已删除)
async function loadAdminType() {
const res = await safeLoad(() => analysisRegistrationType(getTimeParams()));
const list = res ? normalizeDictStatList(unwrapData(res)) : [];
@ -560,7 +551,6 @@ async function refreshAll() {
await Promise.allSettled([
loadCoordination(),
loadEnterprise(),
loadNjcAll(),
loadAdminType(),
loadNonType(),
loadAdminTrend(),
@ -660,7 +650,7 @@ onUnmounted(() => {
.home-wrap {
width: 100%;
height: calc(100vh - 50px);
height: calc(100vh - 70px);
font-size: 14px;
overflow: hidden;
}
@ -668,7 +658,7 @@ onUnmounted(() => {
.wrap_all {
position: relative;
width: 100%;
height: calc(100vh - 50px);
height: calc(100vh - 70px);
background: var(--bg-homebody) no-repeat;
background-size: cover;
background-position: center center;
@ -1410,7 +1400,7 @@ onUnmounted(() => {
.tab_tit {
position: absolute;
top: 8%;
top: 3%;
left: 10rem;
font-size: 1rem;
white-space: nowrap;

5
zdxt-web-client/zdxt-admin-plus-ui/src/views/supervision/statistical/styles/analysis-scope.css

@ -317,6 +317,7 @@
height: 1.5rem;
font-size: 1.0rem;
line-height: 1.5;
margin-bottom: 10px;
}
.statistical-analysis .chart_box {
@ -330,7 +331,7 @@
flex-wrap: wrap;
float: left;
margin: 0.5% 1.23% 0.85% 0;
padding: 0.75% 1% 0.25%;
padding: 0.75% 1% 0.75%;
width: 32.51%;
height: 18rem;
background: #fff none;
@ -382,7 +383,7 @@
.statistical-analysis .count_item {
float: left;
position: relative;
margin: -0.5% 0.5% 0.5% 0.5%;
margin: -0.5% 0.5% 0.9% 0.5%;
width: 19%;
height: 9.25rem;
background: var(--bg-analy-card) no-repeat;

10
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/enforce/enforcementList.vue

@ -4,10 +4,10 @@
@clear="onClear" @date-change="onDateChange" />
<!-- Tab 切换:行政执法 / 非行政执法 -->
<!-- <van-tabs v-model:active="activeTab" @change="onTabChange" sticky line-width="0.5rem" class="list-tabs">
<van-tabs v-model:active="activeTab" @change="onTabChange" sticky line-width="0.5rem" class="list-tabs">
<van-tab title="行政执法" name="enforcement"></van-tab>
<van-tab title="非行政执法" name="non-enforcement"></van-tab>
</van-tabs> -->
</van-tabs>
<!-- 可滚动列表区域 -->
<div class="list-container">
@ -242,9 +242,9 @@ const toEdit = (id) => {
onMounted(() => {
// 根据 URL 参数预选 tab
// if (route.query.tab === 'non-enforcement') {
// activeTab.value = 'non-enforcement';
// }
if (route.query.tab === 'non-enforcement') {
activeTab.value = 'non-enforcement';
}
fetchList();
});
</script>

18
zdxt-web-client/zdxt-efcode-enforcement-app/src/views/enforcement/nos/nosDetail.vue

@ -39,12 +39,12 @@
</van-tab>
</van-tabs>
<div v-if="activeTab === 'materials' && (Number(taskDetail.taskStatus) === 3 || (Number(taskDetail.taskStatus) === 6 && showVerifyBtn))" class="detail-footer">
<div v-if="activeTab === 'materials' && (Number(taskDetail.taskStatus) === 3 || (Number(taskDetail.taskStatus) === 6 && showVerifyBtn && showTransferBtn))" class="detail-footer">
<template v-if="Number(taskDetail.taskStatus) === 3">
<van-button class="btn-cancel" @click="onCloudRecord">云笔录</van-button>
<van-button class="btn-cancel" @click="onCancel">取消</van-button>
<van-button class="btn-submit" type="primary" native-type="submit">提交</van-button>
<van-button class="btn-cancel">转办案</van-button>
<van-button v-if="showTransferBtn" class="btn-cancel">转办案</van-button>
</template>
<van-button v-else class="btn-submit" type="primary">核实</van-button>
</div>
@ -57,6 +57,7 @@ import { showConfirmDialog, showSuccessToast, showToast } from 'vant'
import NosDetailTaskTab from './components/NosDetailTaskTab.vue'
import NosDetailMaterialsTab from './components/NosDetailMaterialsTab.vue'
import { nosInfoApi, nosApproveApi, cloudRecordStartApi, nosVerifyCaseApi } from '@/api/nos/index'
import { getSystemConfig } from '@/api/enforcement/index'
import { toFullFileUrl } from '@/util/fileUrl'
const router = useRouter()
@ -78,6 +79,8 @@ const taskDetail = ref({})
const taskItemList = ref([])
const evaluateData = ref(null)
const showVerifyBtn = ref(false)
// 是否显示「转办案」按钮(系统配置控制)
const showTransferBtn = ref(false)
const inspectResult = ref({
checkResult: '',
@ -169,6 +172,17 @@ const fetchTaskDetail = async () => {
}
onMounted(() => {
// 获取系统配置:是否显示「转办案」按钮
getSystemConfig('sys.show.function', (res) => {
if (res && res.code === 200) {
const configValue = res.data || res.configValue || res.value
showTransferBtn.value = String(configValue) === '1'
}
}, () => {
// 配置获取失败则默认不显示
showTransferBtn.value = false
})
if (route.query.id) {
fetchTaskDetail()
}

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

@ -25,6 +25,9 @@ export const getEnterpriseEnforcementRegistrationList = (params, success, error)
//执法登记列表
export const queryEnforcementRegistrationPageList = (params, success, error) => _get(enterpriseAppBaseUrl+"/enforcement_registration/queryEnforcementRegistrationPageList",params,success,error)
//非行政执法登记列表(独立接口,与行政接口解耦)
export const queryNonEnforcementRegistrationList = (params, success, error) => _get(enterpriseAppBaseUrl+"/nonEnfRegistraionInfo/list",params,success,error)
//执法信息详情
export const getLawDetail = (params, success, error) => _get(enterpriseAppBaseUrl+"/lawEnforcementCase/lawDetail",params,success,error)
@ -40,6 +43,9 @@ export const submitEvaluate = (params, success, error) => _post(enterpriseAppBas
//企业消息 / 执法消息详情
export const getEnforcementRegistrationDetailById = (params, success, error) => _get(enterpriseAppBaseUrl + "/enforcement_registration/queryDetailById", params, success, error)
//非行政执法登记详情(独立接口)
export const queryNonEnforcementRegistrationDetailById = (params, success, error) => _get(enterpriseAppBaseUrl + "/nonEnfRegistraionInfo/queryById", params, success, error)
//普法服务列表
export const getEducationServicesList = (params, success, error) => _get(enterpriseAppBaseUrl +"/enforcementcode/educationServices/list",params,success,error)

8
zdxt-web-client/zdxt-efcode-enterprise-app/src/components/enterprise/footerNav.vue

@ -4,12 +4,12 @@
<van-tabbar-item name="Home" replace icon="wap-home" to="/enterprise/enterpriseHome">{{
$t("common.lang_home")
}}</van-tabbar-item>
<!-- <van-tabbar-item name="Classify" replace icon="bell" to="/enterprise/lawQuery">
法律查询
</van-tabbar-item> -->
<van-tabbar-item name="Classify" replace icon="notes-o" to="/enterprise/lawQuery">
<van-tabbar-item name="Classify" replace icon="bell">
法律查询
</van-tabbar-item>
<!-- <van-tabbar-item name="Classify" replace icon="notes-o" to="/enterprise/lawQuery">
法律查询
</van-tabbar-item> -->
<van-tabbar-item name="Classify" push to="/enterprise/nos">
<template #icon>
<img src="@/assets/images/nos/off_site_bottom_icon.png" class="nos-icon" alt="" />

337
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementEvaluateDetail.vue

@ -1,194 +1,175 @@
<template>
<div class="evaluate-detail-page">
<!-- 顶部导航栏 -->
<!-- <van-nav-bar :title="detail.title || '执法反馈'" left-text="关闭" left-arrow @click-left="onClickLeft" /> -->
<!-- 内容区域 -->
<div class="content-area">
<!-- 企业信息卡片 -->
<div class="info-card">
<div class="card-title">企业信息</div>
<div class="info-row">
<span class="info-label">企业名称</span>
<span class="info-value">{{ detail.enterpriseName }}</span>
</div>
<div class="info-row">
<span class="info-label">统一社会信用代码</span>
<span class="info-value">{{ detail.enterpriseNumber }}</span>
<!-- 非行政执法详情 -->
<template v-if="!isAdmin">
<div class="content-area">
<!-- 企业信息卡片 -->
<div class="info-card">
<div class="card-title">企业信息</div>
<div class="info-row">
<span class="info-label">企业名称</span>
<span class="info-value">{{ detail.enterpriseName || '-' }}</span>
</div>
<div class="info-row">
<span class="info-label">统一社会信用代码</span>
<span class="info-value">{{ detail.enterpriseNumber || '-' }}</span>
</div>
</div>
</div>
<!-- 执法信息卡片 -->
<div class="info-card">
<div class="card-title">执法信息 <span class="union-tag" v-if="detail.isRealUnion === 1">联</span></div>
<div class="info-row">
<span class="info-label">执法单位</span>
<span class="info-value">{{ detail.bureauDeptName }}</span>
</div>
<div class="info-row">
<span class="info-label">执法人员</span>
<div class="info-value enforcer-value">
<div class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(detail.lawEnforcer).name }}</span>
<span v-if="parseEnforcer(detail.lawEnforcer).phone" class="enforcer-id">{{ parseEnforcer(detail.lawEnforcer).phone }}</span>
</div>
<div v-for="(enforcer, index) in detail.lawEnforcer2Show ? detail.lawEnforcer2Show.split(','): detail.lawEnforcer2List" :key="index" class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(enforcer).name }}</span>
<span v-if="parseEnforcer(enforcer).phone" class="enforcer-id">{{ parseEnforcer(enforcer).phone }}</span>
<!-- 入企信息卡片 -->
<div class="info-card">
<div class="card-title">入企信息</div>
<div class="info-row">
<span class="info-label">入企单位</span>
<span class="info-value">{{ detail.bureauDeptName || '-' }}</span>
</div>
<div class="info-row">
<span class="info-label">入企人员</span>
<div class="info-value enforcer-value">
<div class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(detail.lawEnforcer).name }}</span>
<span v-if="parseEnforcer(detail.lawEnforcer).phone" class="enforcer-id">{{ parseEnforcer(detail.lawEnforcer).phone }}</span>
</div>
<div class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(detail.lawEnforcerOther).name }}</span>
<span v-if="parseEnforcer(detail.lawEnforcerOther).phone" class="enforcer-id">{{ parseEnforcer(detail.lawEnforcerOther).phone }}</span>
</div>
</div>
</div>
</div>
<div class="info-row">
<span class="info-label">执法类别</span>
<span class="info-value">{{ getDictText('law_enforce_category', detail.lawEnforceCategory) }}</span>
</div>
<div class="info-row">
<span class="info-label">任务来源</span>
<span class="info-value">{{ getDictText('check_category', detail.checkCategory) }}</span>
</div>
<div class="info-row">
<span class="info-label">执法事项</span>
<span class="info-value">{{ detail.lawEnforcementItemText }}</span>
</div>
<div class="info-row">
<span class="info-label">执法时间</span>
<span class="info-value">{{ detail.enforcementTime }}</span>
</div>
<!-- <div class="info-row">
<span class="info-label">受委托执法</span>
<span class="info-value">
<van-radio-group v-model="detail.hasAuto" direction="horizontal" disabled>
<van-radio :name="1" shape="square">是</van-radio>
<van-radio :name="0" shape="square">否</van-radio>
</van-radio-group>
</span>
</div> -->
<!-- <div class="info-row">
<span class="info-label">委托行政机关</span>
<span class="info-value">{{ detail.entrustDeptName }}</span>
</div> -->
<!-- <div class="info-row result-row">
<span class="info-label">结果</span>
<span class="info-value">
<span class="result-tag" :class="detail.reslut === 0 ? 'pass' : 'fail'">{{ detail.reslut === 0 ?
'合格' : '不合格'
}}</span>
<span class="view-detail-link" @click="onViewCaseDetail">查看案件详情 ></span>
</span>
</div> -->
</div>
<div class="info-card">
<div class="info-has-auto">
<span class="info-label has-auto-label">受委托执法</span>
<span class="info-value">
<van-radio-group v-model="detail.hasAuto" direction="horizontal" disabled>
<van-radio :name="1" shape="square">是</van-radio>
<van-radio :name="0" shape="square">否</van-radio>
</van-radio-group>
</span>
</div>
<div class="info-row" v-if="detail.hasAuto">
<span class="info-label has-auto-label">委托行政机关</span>
<span class="info-value">{{ detail.entrustDeptName }}</span>
<div class="info-row">
<span class="info-label">入企事由</span>
<span class="info-value">{{ detail.lawEnforcementItemText}}</span>
</div>
<div class="info-row">
<span class="info-label">入企事项</span>
<span class="info-value">{{ detail.lawEnforcementTypeText }}</span>
</div>
<div class="info-row">
<span class="info-label">入企时间</span>
<span class="info-value">{{ detail.enforcementTime }}</span>
</div>
</div>
</div>
<!-- 附件卡片 -->
<div class="info-card" v-if="detail.attachments && detail.attachments.length > 0">
<div class="card-title">附件</div>
<div class="attachment-list">
<div class="attachment-item" v-for="(file, idx) in detail.attachments" :key="idx">
<van-icon name="description" size="20" color="#999" />
<span class="attachment-name">{{ file.name }}</span>
</template>
<!-- 行政执法详情(原内容) -->
<template v-else>
<!-- 顶部导航栏 -->
<!-- <van-nav-bar :title="detail.title || '执法反馈'" left-text="关闭" left-arrow @click-left="onClickLeft" /> -->
<!-- 内容区域 -->
<div class="content-area">
<!-- 企业信息卡片 -->
<div class="info-card">
<div class="card-title">企业信息</div>
<div class="info-row">
<span class="info-label">企业名称</span>
<span class="info-value">{{ detail.enterpriseName }}</span>
</div>
<div class="info-row">
<span class="info-label">统一社会信用代码</span>
<span class="info-value">{{ detail.enterpriseNumber }}</span>
</div>
</div>
</div>
<!-- 反馈卡片(已反馈:仅当后端返回 enterpriseEvaluateInfoVo 有数据时显示;待反馈:始终显示) -->
<div class="evaluate-card" v-if="showEvaluateCard">
<!-- <div class="card-title">反馈</div> -->
<!-- 表情选择 -->
<!-- <div class="emoji-section">
<div class="emoji-item" :class="{ active: evaluateForm.satisfactionLevel === 3, disabled: readonly }"
@click="!readonly && (evaluateForm.satisfactionLevel = 3)">
<img class="emoji-img" :src="evaluateForm.satisfactionLevel === 3 ? veryGoodImg : veryGoodDisImg"
alt="满意" />
<span class="emoji-label">满意</span>
<!-- 执法信息卡片 -->
<div class="info-card">
<div class="card-title">执法信息 <span class="union-tag" v-if="detail.isRealUnion === 1">联</span></div>
<div class="info-row">
<span class="info-label">执法单位</span>
<span class="info-value">{{ detail.bureauDeptName }}</span>
</div>
<div class="emoji-item" :class="{ active: evaluateForm.satisfactionLevel === 2, disabled: readonly }"
@click="!readonly && (evaluateForm.satisfactionLevel = 2)">
<img class="emoji-img" :src="evaluateForm.satisfactionLevel === 2 ? goodImg : goodDisImg"
alt="较满意" />
<span class="emoji-label">较满意</span>
<div class="info-row">
<span class="info-label">执法人员</span>
<div class="info-value enforcer-value">
<div class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(detail.lawEnforcer).name }}</span>
<span v-if="parseEnforcer(detail.lawEnforcer).phone" class="enforcer-id">{{ parseEnforcer(detail.lawEnforcer).phone }}</span>
</div>
<div v-for="(enforcer, index) in detail.lawEnforcer2Show ? detail.lawEnforcer2Show.split(','): detail.lawEnforcer2List" :key="index" class="enforcer-line">
<span class="enforcer-name">{{ parseEnforcer(enforcer).name }}</span>
<span v-if="parseEnforcer(enforcer).phone" class="enforcer-id">{{ parseEnforcer(enforcer).phone }}</span>
</div>
</div>
</div>
<div class="info-row">
<span class="info-label">执法类别</span>
<span class="info-value">{{ getDictText('law_enforce_category', detail.lawEnforceCategory) }}</span>
</div>
<div class="emoji-item" :class="{ active: evaluateForm.satisfactionLevel === 1, disabled: readonly }"
@click="!readonly && (evaluateForm.satisfactionLevel = 1)">
<img class="emoji-img" :src="evaluateForm.satisfactionLevel === 1 ? badImg : badDisImg"
alt="不满意" />
<span class="emoji-label">不满意</span>
<div class="info-row">
<span class="info-label">任务来源</span>
<span class="info-value">{{ getDictText('check_category', detail.checkCategory) }}</span>
</div>
</div> -->
<!-- 星级评分 -->
<!-- <div class="rating-section">
<div class="rating-row">
<span class="rating-label">执法文明</span>
<van-rate v-model="evaluateForm.civility" :size="20" color="#ffd21e" void-icon="star"
void-color="#eee" :readonly="readonly" />
<span class="rating-text">{{ getRatingText(evaluateForm.civility) }}</span>
<div class="info-row">
<span class="info-label">执法事项</span>
<span class="info-value">{{ detail.lawEnforcementItemText }}</span>
</div>
<div class="rating-row">
<span class="rating-label">执法效率</span>
<van-rate v-model="evaluateForm.efficiency" :size="20" color="#ffd21e" void-icon="star"
void-color="#eee" :readonly="readonly" />
<span class="rating-text">{{ getRatingText(evaluateForm.efficiency) }}</span>
<div class="info-row">
<span class="info-label">执法时间</span>
<span class="info-value">{{ detail.enforcementTime }}</span>
</div>
<div class="rating-row">
<span class="rating-label">执法态度</span>
<van-rate v-model="evaluateForm.attitude" :size="20" color="#ffd21e" void-icon="star"
void-color="#eee" :readonly="readonly" />
<span class="rating-text">{{ getRatingText(evaluateForm.attitude) }}</span>
</div>
<div class="info-card">
<div class="info-has-auto">
<span class="info-label has-auto-label">受委托执法</span>
<span class="info-value">
<van-radio-group v-model="detail.hasAuto" direction="horizontal" disabled>
<van-radio :name="1" shape="square">是</van-radio>
<van-radio :name="0" shape="square">否</van-radio>
</van-radio-group>
</span>
</div>
<div class="rating-row">
<span class="rating-label">合 法 性</span>
<van-rate v-model="evaluateForm.legality" :size="20" color="#ffd21e" void-icon="star"
void-color="#eee" :readonly="readonly" />
<span class="rating-text">{{ getRatingText(evaluateForm.legality) }}</span>
<div class="info-row" v-if="detail.hasAuto">
<span class="info-label has-auto-label">委托行政机关</span>
<span class="info-value">{{ detail.entrustDeptName }}</span>
</div>
</div>
<!-- 附件卡片 -->
<div class="info-card" v-if="detail.attachments && detail.attachments.length > 0">
<div class="card-title">附件</div>
<div class="attachment-list">
<div class="attachment-item" v-for="(file, idx) in detail.attachments" :key="idx">
<van-icon name="description" size="20" color="#999" />
<span class="attachment-name">{{ file.name }}</span>
</div>
</div>
</div> -->
<!-- 其他问题开关 -->
<div class="switch-section">
<span class="switch-label">反馈</span>
<van-switch v-model="evaluateForm.hasOtherIssues" size="20" active-color="#2b7de9"
:disabled="readonly" />
</div>
<!-- 问题列表 -->
<div class="question-list" v-if="evaluateForm.hasOtherIssues">
<div class="question-item" v-for="(q, idx) in questionList" :key="idx" v-show="!q.isOther">
<div class="question-text">{{ idx + 1 }}、{{ q.text }}</div>
<div class="question-options">
<div class="option-btn" :class="{ active: q.answer === '是', disabled: readonly }"
@click="!readonly && setAnswer(q, '是')">
<img :src="q.answer === '是' ? badUnselectImg : badSelectImg" alt="是" />
<span>是</span>
</div>
<div class="option-btn" :class="{ active: q.answer === '否', disabled: readonly }"
@click="!readonly && setAnswer(q, '否')">
<img :src="q.answer === '否' ? goodUnselectImg : goodSelectImg" alt="否" />
<span>否</span>
<!-- 反馈卡片(已反馈:仅当后端返回 enterpriseEvaluateInfoVo 有数据时显示;待反馈:始终显示) -->
<div class="evaluate-card" v-if="showEvaluateCard">
<!-- 其他问题开关 -->
<div class="switch-section">
<span class="switch-label">反馈</span>
<van-switch v-model="evaluateForm.hasOtherIssues" size="20" active-color="#2b7de9"
:disabled="readonly" />
</div>
<!-- 问题列表 -->
<div class="question-list" v-if="evaluateForm.hasOtherIssues">
<div class="question-item" v-for="(q, idx) in questionList" :key="idx" v-show="!q.isOther">
<div class="question-text">{{ idx + 1 }}、{{ q.text }}</div>
<div class="question-options">
<div class="option-btn" :class="{ active: q.answer === '是', disabled: readonly }"
@click="!readonly && setAnswer(q, '是')">
<img :src="q.answer === '是' ? badUnselectImg : badSelectImg" alt="是" />
<span>是</span>
</div>
<div class="option-btn" :class="{ active: q.answer === '否', disabled: readonly }"
@click="!readonly && setAnswer(q, '否')">
<img :src="q.answer === '否' ? goodUnselectImg : goodSelectImg" alt="否" />
<span>否</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 底部提交按钮(仅待反馈状态显示) -->
<div class="footer-bar" v-if="!readonly">
<van-button type="primary" block round @click="onSubmit">提交反馈</van-button>
</div>
<!-- 底部提交按钮(仅待反馈状态显示) -->
<div class="footer-bar" v-if="!readonly">
<van-button type="primary" block round @click="onSubmit">提交反馈</van-button>
</div>
</template>
</div>
</template>
@ -209,6 +190,7 @@ import badUnselectImg from '@/assets/images/onbad.png';
import {
getEvaluateDetail,
getEnforcementRegistrationDetailById,
queryNonEnforcementRegistrationDetailById,
submitEvaluate,
} from '@/api/enterprise';
import { loadDict, getDictText } from '@/util/dictUtil';
@ -218,6 +200,8 @@ const router = useRouter();
const route = useRoute();
const id = route.query.id;
// 行政/非行政分流标识:列表页跳过来时 lawType='1' 表示行政
const isAdmin = computed(() => String(route.query.lawType || '1') === '1');
// 只读标识:hasEvaluate=1 已反馈只能查看,0/空 为待反馈可提交
const readonly = computed(() => String(route.query.hasEvaluate) === '1');
// 已反馈返回的反馈信息对象(后端 enterpriseEvaluateInfoVo)
@ -253,7 +237,6 @@ const detail = ref({
result: '',
attachments: [],
});
// ========== 反馈表单(默认值:满意=3 / 5 星 / 其他问题打开)==========
// 满意度数值:1=不满意,2=较满意,3=满意
const evaluateForm = ref({
@ -308,12 +291,24 @@ const getEnforcers = (data) => {
// 获取执法详情
const fetchRegistrationDetail = () => {
if (!id) return;
getEnforcementRegistrationDetailById({ id }, (res) => {
const lawType = String(route.query.lawType || '');
const isAdmin = lawType === '1';
const api = isAdmin
? getEnforcementRegistrationDetailById
: queryNonEnforcementRegistrationDetailById;
api({ id }, (res) => {
// 兼容多种返回包裹:行政接口是 { data: { enforcementRegistrationVo, enterpriseEvaluateInfoVo } }
// 非行政接口可能是 { data: 详情对象 } 或 直接就是详情对象,这里做统一兜底
const data = (res && (res.data || res.rows?.[0] || res)) || {};
detail.value = data.enforcementRegistrationVo
|| {};
// 保存企业反馈信息(可能为 null),用于已反馈识别反馈卡片是否显示
evaluateInfo.value = data.enterpriseEvaluateInfoVo || null;
// 详情对象:优先取行政接口的 enforcementRegistrationVo,否则 data 本身就是详情
const detailData = data.enforcementRegistrationVo
|| data.nonEnforcementRegistrationVo
|| data.vo
|| data;
detail.value = detailData;
// 反馈信息
evaluateInfo.value = data.enterpriseEvaluateInfoVo || data.evaluateInfo || null;
// 已反馈:将后端反馈数据回填到表单供只读展示
if (evaluateInfo.value) fillEvaluateFormFromInfo(evaluateInfo.value);
}, () => {

22
zdxt-web-client/zdxt-efcode-enterprise-app/src/views/enterprise/enforcement/enforcementRegistrationList.vue

@ -67,7 +67,7 @@
</template>
<script setup name="enforcementRegistrationList">
import { queryEnforcementRegistrationPageList } from '@/api/enterprise';
import { queryEnforcementRegistrationPageList, queryNonEnforcementRegistrationList } from '@/api/enterprise';
import { showToast } from 'vant';
import 'vant/es/toast/style';
import SearchFilterBar from '@/components/common/SearchFilterBar.vue';
@ -128,12 +128,15 @@ const getEnforcers = (item) => {
// ========== 加载数据 ==========
const fetchList = () => {
const isAdmin = activeTab.value === '1';
const params = {
pageNum: pageNum.value,
pageSize: pageSize.value,
lawType: activeTab.value,
// enterpriseNumber: useCommon.enterpriseNumber,
};
// 仅行政接口需传 lawType 区分,非行政接口本身已独立
if (isAdmin) {
params.lawType = activeTab.value;
}
if (searchText.value) {
params.searchValue = searchText.value;
}
@ -144,7 +147,11 @@ const fetchList = () => {
params.dateSearch = dateSearch.value;
}
queryEnforcementRegistrationPageList(params, (res) => {
const api = isAdmin
? queryEnforcementRegistrationPageList
: queryNonEnforcementRegistrationList;
api(params, (res) => {
// 兼容数组 / 包裹格式
let rows = [];
let total = 0;
@ -156,6 +163,10 @@ const fetchList = () => {
rows = res.rows;
total = res.total || rows.length;
ok = res.code ? res.code === 200 : true;
} else if (res && res.data && Array.isArray(res.data.rows)) {
rows = res.data.rows;
total = res.data.total || rows.length;
ok = res.code ? res.code === 200 : true;
} else if (res && Array.isArray(res.data)) {
rows = res.data;
total = res.total || rows.length;
@ -231,7 +242,7 @@ const onSearchFilter = ({ searchText: st, dateType: dt, dateSearch: ds }) => {
const toDetailView = (item) => {
router.push({
path: '/enterprise/enforcementEvaluateDetail',
query: { id: item.id, hasEvaluate: 1 }
query: { id: item.id, hasEvaluate: 1, lawType: activeTab.value }
});
};
@ -242,6 +253,7 @@ const toEvaluate = (id, checkItem) => {
query: {
id,
hasEvaluate: 0,
lawType: activeTab.value,
// lawEnforcementItemText: checkItem,
}
});

10
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-dev.yml

@ -49,7 +49,7 @@ spring:
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
p6spy: false
# 设置默认的数据源或者数据源组,默认值即为 master
primary: master
# 严格模式 匹配不到数据源则报错
@ -95,9 +95,9 @@ spring:
# password: root
hikari:
# 最大连接池数量
maxPoolSize: 20
maxPoolSize: 500
# 最小空闲线程数量
minIdle: 10
minIdle: 20
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
@ -112,12 +112,12 @@ spring:
--- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉)
spring.data:
redis:
# 地址
host: 172.16.20.72
# 端口,默认为6379
port: 6379
# 数据库索引
database: 0
# 连接超时时间
timeout: 10s
# 是否开启ssl
@ -292,11 +292,11 @@ siq:
# secretKey: SXRpWEhVN3RHM3ZFbzRQcQ==
#测试
siqUrl: https://egbpub.siqhz.com/egb/api/thirdauth
siqBaseUrl: https://egbpub.siqhz.com
code: TEST
appId: CE07DEE723E241DFB34D80090A569B12
secretKey: ENC(6+WSjXj7UebpPJGq69e7aVZ1ZIrL9wnPcD+rU5XDFCNYGQM8fVvtcQ==)
msgAppId: CE07DEE723E241DFB34D80090A569B12
siqBaseUrl: https://egbpub.siqhz.com
msgSecretKey: 0C4E08DCC7DD490E86EF2B79E81691D1
msgTemplateId: 2076972618633498625
# 模拟数据开关(true=使用模拟数据,false=调用真实接口)

6
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application-prod.yml

@ -290,6 +290,7 @@ xss:
siq:
#正式
siqUrl: ENC(Y8AuVzQ311FOgJ4h07zjkLH8ArJBED3Xxz3Ug0ncPzuLXIVCuB25DA==)
siqBaseUrl: http://10.76.108.3/siqBase
code: ENC(Ogi+/4PPtXiuILnVlNg4Lw==)
secretKey: ENC(zTr/tj2VgFxQyunI4eIL7NyRWDPSMPSB0VlwTYeHTdsEWyu1H96xWw==)
msgAppId: C3AFBBDCC0BF4D5FB0F52731A900BE8F
@ -310,7 +311,8 @@ szypt:
#市认证网关
srnwg:
#正式
url: ENC(pHNm/o0+6S+HjrM5nuMiPRfkrHS1tXYD5i25OBtM4dWSi6MvH6iXfw==)
# url: ENC(pHNm/o0+6S+HjrM5nuMiPRfkrHS1tXYD5i25OBtM4dWSi6MvH6iXfw==)
url: http://10.76.108.1/srz
systemCode: ENC(cHDdxMKpJ/rbuj4PVCxylN+zPd9I2KT0)
integrationKey: ENC(txSndcPbZK5mYjW7Doa/n9Ips2PLa9NV)
paasId: szsfj_zhifajianduma_001
@ -333,7 +335,7 @@ sms:
account: 122
pwd: szsfj1800
batch: 2409
url: https://szsms.sz.gov.cn:8000/services/Sms
url: http://10.76.108.1/sms/services/Sms
#市监代理页面

6
zdxt-web-server/zdxt-admin-web-server/src/main/resources/application.yml

@ -33,11 +33,11 @@ captcha:
# 日志配置
logging:
level:
org.dromara: "${logging.level:debug}"
org.dromara: "${logging.level:info}"
org.springframework: warn
org.mybatis.spring.mapper: debug
org.mybatis.spring.mapper: warn
org.apache.fury: warn
com.zdxt.enforcementcode: debug
com.zdxt.enforcementcode: info
config: classpath:logback-plus.xml
# 用户配置

Loading…
Cancel
Save