Merge remote-tracking branch 'origin/main'
This commit is contained in:
commit
92b120380e
|
@ -1,7 +1,7 @@
|
||||||
# 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config
|
# 配置文档参考 https://taro-docs.jd.com/docs/next/env-mode-config
|
||||||
TARO_APP_ID="wx0acd1c4fcf94bdd3"
|
TARO_APP_ID="wx0acd1c4fcf94bdd3"
|
||||||
# TARO_APP_BASE_API="http://172.10.10.93:8765"
|
TARO_APP_BASE_API="http://172.10.10.93:8765"
|
||||||
TARO_APP_BASE_API="https://www.hnjinglian.cn:5678"
|
# TARO_APP_BASE_API="https://www.hnjinglian.cn:5678"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
package com.changhu.common.annotation;
|
|
||||||
|
|
||||||
import com.changhu.common.enums.OpenApiType;
|
|
||||||
|
|
||||||
import java.lang.annotation.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 20252
|
|
||||||
* @createTime 2024/10/9 下午5:14
|
|
||||||
* @desc 检查openApi
|
|
||||||
*/
|
|
||||||
@Target({ElementType.METHOD})
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Documented
|
|
||||||
public @interface CheckOpenApi {
|
|
||||||
OpenApiType value();
|
|
||||||
}
|
|
|
@ -1,22 +0,0 @@
|
||||||
package com.changhu.common.enums;
|
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 20252
|
|
||||||
* @createTime 2024/10/9 下午5:10
|
|
||||||
* @desc OpenApiType...
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
@AllArgsConstructor
|
|
||||||
public enum OpenApiType {
|
|
||||||
Information_on_enterprises_and_institutions("获取企事业单位信息", Arrays.asList("1fe0aaf3-45a4-4be3-a989-75e914a3f36e", "1fe0aaf3-45a4-a989-75e914a3f36e")),
|
|
||||||
data_view("数据总览", List.of("8da74bbf-c686-4393-b4ec-692091e6d381"));
|
|
||||||
|
|
||||||
private final String desc;
|
|
||||||
private final List<String> openApiKeys;
|
|
||||||
}
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.changhu.common.pojo.params;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.locationtech.jts.geom.Point;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午11:18
|
||||||
|
* @desc MapVisionParams...
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class MapVisionParams {
|
||||||
|
@Schema(description = "左上角")
|
||||||
|
private Point upperLeft;
|
||||||
|
@Schema(description = "右上角")
|
||||||
|
private Point upperRight;
|
||||||
|
@Schema(description = "左下角")
|
||||||
|
private Point lowerLeft;
|
||||||
|
@Schema(description = "右下角")
|
||||||
|
private Point lowerRight;
|
||||||
|
}
|
|
@ -2,10 +2,13 @@ package com.changhu.config;
|
||||||
|
|
||||||
import cn.dev33.satoken.interceptor.SaInterceptor;
|
import cn.dev33.satoken.interceptor.SaInterceptor;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
|
import com.changhu.support.filter.BodyWrapperFilter;
|
||||||
import com.changhu.support.interceptor.JsonBodyInterceptor;
|
import com.changhu.support.interceptor.JsonBodyInterceptor;
|
||||||
import com.changhu.support.interceptor.OpenApiInterceptor;
|
import com.changhu.support.interceptor.SignInterceptor;
|
||||||
import com.changhu.support.interceptor.UserTypeInterceptor;
|
import com.changhu.support.interceptor.UserTypeInterceptor;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
import org.springframework.web.servlet.config.annotation.CorsRegistry;
|
||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
||||||
|
@ -59,10 +62,19 @@ public class WebConfig implements WebMvcConfigurer {
|
||||||
// 注册clientType 拦截器 用于校验当前用户是否匹配操作客户端
|
// 注册clientType 拦截器 用于校验当前用户是否匹配操作客户端
|
||||||
registry.addInterceptor(new UserTypeInterceptor());
|
registry.addInterceptor(new UserTypeInterceptor());
|
||||||
// 注册开放接口 拦截器 用于校验第三方是否携带指定apiKey
|
// 注册开放接口 拦截器 用于校验第三方是否携带指定apiKey
|
||||||
registry.addInterceptor(new OpenApiInterceptor())
|
registry.addInterceptor(new SignInterceptor())
|
||||||
.addPathPatterns("/open/**");
|
.addPathPatterns("/open/**");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean<BodyWrapperFilter> loggingFilter() {
|
||||||
|
FilterRegistrationBean<BodyWrapperFilter> registrationBean = new FilterRegistrationBean<>();
|
||||||
|
registrationBean.setFilter(new BodyWrapperFilter());
|
||||||
|
registrationBean.addUrlPatterns("/open/*"); // 指定过滤的URL模式
|
||||||
|
registrationBean.setOrder(1000);
|
||||||
|
return registrationBean;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addCorsMappings(CorsRegistry registry) {
|
public void addCorsMappings(CorsRegistry registry) {
|
||||||
registry.addMapping("/**")
|
registry.addMapping("/**")
|
||||||
|
|
|
@ -2,7 +2,6 @@ package com.changhu.controller;
|
||||||
|
|
||||||
import cn.hutool.core.annotation.AnnotationUtil;
|
import cn.hutool.core.annotation.AnnotationUtil;
|
||||||
import cn.hutool.core.lang.Dict;
|
import cn.hutool.core.lang.Dict;
|
||||||
import com.alibaba.fastjson2.JSON;
|
|
||||||
import com.changhu.common.annotation.CheckUserType;
|
import com.changhu.common.annotation.CheckUserType;
|
||||||
import com.changhu.common.annotation.JsonBody;
|
import com.changhu.common.annotation.JsonBody;
|
||||||
import com.changhu.common.db.enums.UserType;
|
import com.changhu.common.db.enums.UserType;
|
||||||
|
@ -67,23 +66,4 @@ public class AccessKeysController {
|
||||||
return accessKeysService.list();
|
return accessKeysService.list();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
Class<OpenController> openControllerClass = OpenController.class;
|
|
||||||
RequestMapping requestMapping = AnnotatedElementUtils.findMergedAnnotation(openControllerClass, RequestMapping.class);
|
|
||||||
String controllerPath = requestMapping.value()[0];
|
|
||||||
|
|
||||||
List<SelectNodeVo<String>> method = Arrays.stream(openControllerClass.getMethods())
|
|
||||||
.filter(m -> AnnotationUtil.hasAnnotation(m, RequestMapping.class))
|
|
||||||
.map(m -> {
|
|
||||||
Operation operation = m.getAnnotation(Operation.class);
|
|
||||||
RequestMapping mReq = AnnotatedElementUtils.findMergedAnnotation(m, RequestMapping.class);
|
|
||||||
return SelectNodeVo.<String>builder()
|
|
||||||
.value(controllerPath + mReq.value()[0])
|
|
||||||
.label(operation.summary())
|
|
||||||
.extData(Dict.of("method", mReq.method()))
|
|
||||||
.build();
|
|
||||||
})
|
|
||||||
.toList();
|
|
||||||
method.forEach(i -> System.out.println(JSON.toJSONString(i)));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
package com.changhu.controller;
|
package com.changhu.controller;
|
||||||
|
|
||||||
import com.changhu.common.annotation.CheckOpenApi;
|
|
||||||
import com.changhu.common.annotation.JsonBody;
|
import com.changhu.common.annotation.JsonBody;
|
||||||
import com.changhu.common.enums.OpenApiType;
|
|
||||||
import com.changhu.common.pojo.vo.SelectNodeVo;
|
import com.changhu.common.pojo.vo.SelectNodeVo;
|
||||||
import com.changhu.pojo.dto.DataViewDTO;
|
import com.changhu.pojo.dto.DataViewDTO;
|
||||||
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
||||||
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
||||||
import com.changhu.pojo.dto.ServiceProjectSecurityUserRosterDTO;
|
import com.changhu.pojo.dto.SecurityUserRosterDTO;
|
||||||
|
import com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType;
|
||||||
import com.changhu.service.OpenApiService;
|
import com.changhu.service.OpenApiService;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
@ -33,7 +32,6 @@ public class OpenController {
|
||||||
private OpenApiService openApiService;
|
private OpenApiService openApiService;
|
||||||
|
|
||||||
@Operation(summary = "获取企事业单位列表")
|
@Operation(summary = "获取企事业单位列表")
|
||||||
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
|
|
||||||
@GetMapping("/getEnterprisesUnit")
|
@GetMapping("/getEnterprisesUnit")
|
||||||
public List<SelectNodeVo<Long>> getEnterprisesUnit(@Schema(description = "代码") @RequestParam String code,
|
public List<SelectNodeVo<Long>> getEnterprisesUnit(@Schema(description = "代码") @RequestParam String code,
|
||||||
@Schema(description = "等级") @RequestParam Integer level) {
|
@Schema(description = "等级") @RequestParam Integer level) {
|
||||||
|
@ -41,31 +39,29 @@ public class OpenController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "企事业单位详情")
|
@Operation(summary = "企事业单位详情")
|
||||||
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
|
|
||||||
@GetMapping("/enterprisesUnitDetailById")
|
@GetMapping("/enterprisesUnitDetailById")
|
||||||
public EnterprisesUnitDetailDTO enterprisesUnitDetailById(@Schema(description = "企事业单位id") @RequestParam Long enterprisesUnitId) {
|
public EnterprisesUnitDetailDTO enterprisesUnitDetailById(@Schema(description = "企事业单位id") @RequestParam Long enterprisesUnitId) {
|
||||||
return openApiService.enterprisesUnitDetailById(enterprisesUnitId);
|
return openApiService.enterprisesUnitDetailById(enterprisesUnitId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "数据总览")
|
@Operation(summary = "数据总览")
|
||||||
@CheckOpenApi(value = OpenApiType.data_view)
|
|
||||||
@GetMapping("/dataView")
|
@GetMapping("/dataView")
|
||||||
public DataViewDTO dataView() {
|
public DataViewDTO dataView() {
|
||||||
return openApiService.dataView();
|
return openApiService.dataView();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "保安单位使用情况统计")
|
@Operation(summary = "保安单位使用情况统计")
|
||||||
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
|
|
||||||
@GetMapping("/securityUnitUseStatistics")
|
@GetMapping("/securityUnitUseStatistics")
|
||||||
public List<SecurityUnitUseStatisticsDTO> securityUnitUseStatistics(@Schema(description = "代码") @RequestParam String code,
|
public List<SecurityUnitUseStatisticsDTO> securityUnitUseStatistics(@Schema(description = "代码") @RequestParam String code,
|
||||||
@Schema(description = "等级") @RequestParam Integer level) {
|
@Schema(description = "等级") @RequestParam Integer level) {
|
||||||
return openApiService.securityUnitUseStatistics(code, level);
|
return openApiService.securityUnitUseStatistics(code, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "服务项目安保人员花名册")
|
@Operation(summary = "安保人员花名册")
|
||||||
@CheckOpenApi(value = OpenApiType.Information_on_enterprises_and_institutions)
|
@GetMapping("/securityUserRoster")
|
||||||
@GetMapping("/serviceProjectUserRoster")
|
public List<SecurityUserRosterDTO> securityUserRoster(@Schema(description = "事业单位或服务项目id") Long id,
|
||||||
public List<ServiceProjectSecurityUserRosterDTO> serviceProjectUserRoster(@Schema(description = "服务项目id") Long serviceProjectId) {
|
@Schema(description = "类型") EnterprisesUnitOrServiceProjectType type) {
|
||||||
return openApiService.serviceProjectUserRoster(serviceProjectId);
|
return openApiService.securityUserRoster(id, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,8 @@ package com.changhu.mapper;
|
||||||
|
|
||||||
import com.changhu.common.pojo.vo.SelectNodeVo;
|
import com.changhu.common.pojo.vo.SelectNodeVo;
|
||||||
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
||||||
import com.changhu.pojo.dto.ServiceProjectSecurityUserRosterDTO;
|
import com.changhu.pojo.dto.SecurityUserRosterDTO;
|
||||||
|
import com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
@ -38,9 +39,7 @@ public interface OpenApiMapper {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取服务人员花名册
|
* 获取服务人员花名册
|
||||||
*
|
|
||||||
* @param serviceProjectId 服务项目id
|
|
||||||
* @return 结果
|
|
||||||
*/
|
*/
|
||||||
List<ServiceProjectSecurityUserRosterDTO> serviceProjectUserRoster(@Param("serviceProjectId") Long serviceProjectId);
|
List<SecurityUserRosterDTO> securityUserRoster(@Param("id") Long id,
|
||||||
|
@Param("type") EnterprisesUnitOrServiceProjectType type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,6 @@ import com.changhu.common.annotation.JsonBody;
|
||||||
import com.changhu.common.db.enums.UserType;
|
import com.changhu.common.db.enums.UserType;
|
||||||
import com.changhu.common.exception.MessageException;
|
import com.changhu.common.exception.MessageException;
|
||||||
import com.changhu.common.pojo.vo.SelectNodeVo;
|
import com.changhu.common.pojo.vo.SelectNodeVo;
|
||||||
import com.changhu.module.management.pojo.entity.EnterprisesUnit;
|
|
||||||
import com.changhu.module.management.pojo.params.EnterprisesUnitSaveOrUpdateParams;
|
import com.changhu.module.management.pojo.params.EnterprisesUnitSaveOrUpdateParams;
|
||||||
import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams;
|
import com.changhu.module.management.pojo.queryParams.EnterprisesUnitPagerQueryParams;
|
||||||
import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo;
|
import com.changhu.module.management.pojo.vo.EnterprisesUnitPagerVo;
|
||||||
|
@ -64,10 +63,4 @@ public class EnterprisesUnitController {
|
||||||
return enterprisesUnitService.queryListByAdministrativeDivisionCodes(administrativeDivisionCodes);
|
return enterprisesUnitService.queryListByAdministrativeDivisionCodes(administrativeDivisionCodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(summary = "企事业单位地图点位")
|
|
||||||
@GetMapping("/mapPoint")
|
|
||||||
public List<EnterprisesUnit> mapPoint() {
|
|
||||||
return enterprisesUnitService.list();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
package com.changhu.module.superManagement.controller;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
||||||
|
import com.changhu.common.annotation.JsonBody;
|
||||||
|
import com.changhu.module.management.pojo.entity.EnterprisesUnit;
|
||||||
|
import com.changhu.module.superManagement.service.SuperIndexService;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午11:31
|
||||||
|
* @desc SuperIndexController...
|
||||||
|
*/
|
||||||
|
@JsonBody
|
||||||
|
@Tag(name = "超级后台首页")
|
||||||
|
@RequestMapping("/super/index")
|
||||||
|
public class SuperIndexController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SuperIndexService superIndexService;
|
||||||
|
|
||||||
|
@Operation(summary = "企事业单位地图点位")
|
||||||
|
@GetMapping("/mapPoint")
|
||||||
|
public List<EnterprisesUnit> mapPoint() {
|
||||||
|
return Db.lambdaQuery(EnterprisesUnit.class).list();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.changhu.module.superManagement.mapper;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午11:32
|
||||||
|
* @desc SuperIndexMapper...
|
||||||
|
*/
|
||||||
|
@Mapper
|
||||||
|
public interface SuperIndexMapper {
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.changhu.module.superManagement.service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午11:31
|
||||||
|
* @desc SuperIndexService...
|
||||||
|
*/
|
||||||
|
public interface SuperIndexService {
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.changhu.module.superManagement.service.impl;
|
||||||
|
|
||||||
|
import com.changhu.module.superManagement.service.SuperIndexService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午11:31
|
||||||
|
* @desc SuperIndexServiceImpl...
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class SuperIndexServiceImpl implements SuperIndexService {
|
||||||
|
}
|
|
@ -7,6 +7,8 @@ import com.changhu.module.management.pojo.model.LegalPersonInfo;
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author 20252
|
* @author 20252
|
||||||
* @createTime 2024/11/18 上午10:32
|
* @createTime 2024/11/18 上午10:32
|
||||||
|
@ -14,37 +16,71 @@ import lombok.Data;
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class SecurityUnitUseStatisticsDTO {
|
public class SecurityUnitUseStatisticsDTO {
|
||||||
@Schema(description = "服务项目id")
|
@Schema(description = "事业单位id")
|
||||||
private Long serviceProjectId;
|
private Long enterprisesUnitId;
|
||||||
|
@Schema(description = "事业单位名称")
|
||||||
|
private String enterprisesUnitName;
|
||||||
|
@Schema(description = "省编码")
|
||||||
|
private String province;
|
||||||
|
@Schema(description = "省")
|
||||||
|
private String provinceName;
|
||||||
|
@Schema(description = "市编码")
|
||||||
|
private String city;
|
||||||
|
@Schema(description = "市")
|
||||||
|
private String cityName;
|
||||||
|
@Schema(description = "区/县编码")
|
||||||
|
private String districts;
|
||||||
|
@Schema(description = "区/县")
|
||||||
|
private String districtsName;
|
||||||
|
@Schema(description = "街道编码")
|
||||||
|
private String street;
|
||||||
|
@Schema(description = "街道")
|
||||||
|
private String streetName;
|
||||||
|
@Schema(description = "事业单位详细地址")
|
||||||
|
private String address;
|
||||||
|
@Schema(description = "服务项目列表")
|
||||||
|
List<_ServiceProjectVo> serviceProjectList;
|
||||||
|
|
||||||
|
@Schema(description = "公安单位id")
|
||||||
|
private Long policeUnitId;
|
||||||
@Schema(description = "公安单位名称")
|
@Schema(description = "公安单位名称")
|
||||||
private String policeUnitName;
|
private String policeUnitName;
|
||||||
@Schema(description = "保安单位名称")
|
|
||||||
private String securityUnitName;
|
|
||||||
@Schema(description = "服务项目名称")
|
|
||||||
private String serviceProjectName;
|
|
||||||
@Schema(description = "保安服务类别")
|
|
||||||
private ServiceProjectType type;
|
|
||||||
@Schema(description = "二级类型")
|
|
||||||
private ServiceProjectTwoType twoType;
|
|
||||||
@Schema(description = "外包公司名称")
|
|
||||||
private String outsourceName;
|
|
||||||
|
|
||||||
@Schema(description = "保安人员总数")
|
@Data
|
||||||
private Integer securityUserTotal;
|
static class _ServiceProjectVo {
|
||||||
@Schema(description = "持证保安数量")
|
@Schema(description = "服务项目id")
|
||||||
private Integer haveCardSecurityUserCount;
|
private Long snowFlakeId;
|
||||||
|
@Schema(description = "服务项目名称")
|
||||||
|
private String name;
|
||||||
|
@Schema(description = "保安服务类别")
|
||||||
|
private ServiceProjectType type;
|
||||||
|
@Schema(description = "二级类型")
|
||||||
|
private ServiceProjectTwoType twoType;
|
||||||
|
|
||||||
@Schema(description = "是否备案")
|
@Schema(description = "外包公司名称")
|
||||||
private IsOrNot isFiling;
|
private String outsourceName;
|
||||||
@Schema(description = "证件号(保安服务许可证/备案证)")
|
@Schema(description = "是否备案")
|
||||||
private String idNumber;
|
private IsOrNot isFiling;
|
||||||
|
@Schema(description = "证件号(保安服务许可证/备案证)")
|
||||||
|
private String idNumber;
|
||||||
|
|
||||||
@Schema(description = "保安单位法人信息")
|
@Schema(description = "保安人员总数")
|
||||||
private LegalPersonInfo securityUnitLegalPersonInfo;
|
private Integer securityUserTotal;
|
||||||
|
@Schema(description = "持证保安数量")
|
||||||
|
private Integer haveCardSecurityUserCount;
|
||||||
|
|
||||||
@Schema(description = "项目经理")
|
@Schema(description = "保安单位id")
|
||||||
private String serviceProjectManager;
|
private Long securityUnitId;
|
||||||
@Schema(description = "项目经理联系方式")
|
@Schema(description = "保安单位名称")
|
||||||
private String serviceProjectManagerTelephone;
|
private String securityUnitName;
|
||||||
|
@Schema(description = "保安单位法人信息")
|
||||||
|
private LegalPersonInfo securityUnitLegalPersonInfo;
|
||||||
|
|
||||||
|
@Schema(description = "项目经理")
|
||||||
|
private String serviceProjectManager;
|
||||||
|
@Schema(description = "项目经理联系方式")
|
||||||
|
private String serviceProjectManagerTelephone;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,10 +9,10 @@ import lombok.Data;
|
||||||
/**
|
/**
|
||||||
* @author 20252
|
* @author 20252
|
||||||
* @createTime 2024/11/18 上午10:43
|
* @createTime 2024/11/18 上午10:43
|
||||||
* @desc ServiceProjectSecurityUserRosterDTO...
|
* @desc SecurityUserRosterDTO...
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ServiceProjectSecurityUserRosterDTO {
|
public class SecurityUserRosterDTO {
|
||||||
@Schema(description = "id")
|
@Schema(description = "id")
|
||||||
private Long snowFlakeId;
|
private Long snowFlakeId;
|
||||||
@Schema(description = "名称")
|
@Schema(description = "名称")
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.changhu.pojo.params;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/21 上午10:35
|
||||||
|
* @desc EnterprisesUnitOrServiceProjectType...
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
@AllArgsConstructor
|
||||||
|
public enum EnterprisesUnitOrServiceProjectType {
|
||||||
|
ENTERPRISES_UNIT,
|
||||||
|
SERVICE_PROJECT
|
||||||
|
}
|
|
@ -4,7 +4,8 @@ import com.changhu.common.pojo.vo.SelectNodeVo;
|
||||||
import com.changhu.pojo.dto.DataViewDTO;
|
import com.changhu.pojo.dto.DataViewDTO;
|
||||||
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
||||||
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
||||||
import com.changhu.pojo.dto.ServiceProjectSecurityUserRosterDTO;
|
import com.changhu.pojo.dto.SecurityUserRosterDTO;
|
||||||
|
import com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -50,8 +51,9 @@ public interface OpenApiService {
|
||||||
/**
|
/**
|
||||||
* 服务项目安保人员花名册
|
* 服务项目安保人员花名册
|
||||||
*
|
*
|
||||||
* @param serviceProjectId 服务项目id
|
* @param id 事业单位服务项目id
|
||||||
|
* @param type 类型
|
||||||
* @return 花名册
|
* @return 花名册
|
||||||
*/
|
*/
|
||||||
List<ServiceProjectSecurityUserRosterDTO> serviceProjectUserRoster(Long serviceProjectId);
|
List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,8 @@ import com.changhu.module.miniProgram.pojo.entity.SecurityUser;
|
||||||
import com.changhu.pojo.dto.DataViewDTO;
|
import com.changhu.pojo.dto.DataViewDTO;
|
||||||
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
import com.changhu.pojo.dto.EnterprisesUnitDetailDTO;
|
||||||
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
import com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO;
|
||||||
import com.changhu.pojo.dto.ServiceProjectSecurityUserRosterDTO;
|
import com.changhu.pojo.dto.SecurityUserRosterDTO;
|
||||||
|
import com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType;
|
||||||
import com.changhu.service.OpenApiService;
|
import com.changhu.service.OpenApiService;
|
||||||
import com.changhu.support.mybatisplus.pojo.entity.BaseEntity;
|
import com.changhu.support.mybatisplus.pojo.entity.BaseEntity;
|
||||||
import lombok.SneakyThrows;
|
import lombok.SneakyThrows;
|
||||||
|
@ -103,7 +104,7 @@ public class OpenApiServiceImpl implements OpenApiService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ServiceProjectSecurityUserRosterDTO> serviceProjectUserRoster(Long serviceProjectId) {
|
public List<SecurityUserRosterDTO> securityUserRoster(Long id, EnterprisesUnitOrServiceProjectType type) {
|
||||||
return openApiMapper.serviceProjectUserRoster(serviceProjectId);
|
return openApiMapper.securityUserRoster(id, type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,7 +86,8 @@ public class FastJson2Config {
|
||||||
|
|
||||||
//4.解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
|
//4.解决中文乱码问题,相当于在Controller上的@RequestMapping中加了个属性produces = "application/json"
|
||||||
fastConverter.setSupportedMediaTypes(List.of(
|
fastConverter.setSupportedMediaTypes(List.of(
|
||||||
MediaType.APPLICATION_JSON
|
MediaType.APPLICATION_JSON,
|
||||||
|
MediaType.APPLICATION_FORM_URLENCODED
|
||||||
));
|
));
|
||||||
return fastConverter;
|
return fastConverter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
package com.changhu.support.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.*;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/19 下午3:07
|
||||||
|
* @desc BodyWrapperFilter...
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class BodyWrapperFilter implements Filter {
|
||||||
|
@Override
|
||||||
|
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||||
|
log.info("进入filter:{}", servletRequest.getRemoteAddr());
|
||||||
|
ServletRequest requestWrapper = null;
|
||||||
|
if (servletRequest instanceof HttpServletRequest) {
|
||||||
|
requestWrapper = new CustomHttpServletRequestWrapper((HttpServletRequest) servletRequest);
|
||||||
|
}
|
||||||
|
filterChain.doFilter(Objects.requireNonNullElse(requestWrapper, servletRequest), servletResponse);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
package com.changhu.support.filter;
|
||||||
|
|
||||||
|
import jakarta.servlet.ReadListener;
|
||||||
|
import jakarta.servlet.ServletInputStream;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletRequestWrapper;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/19 下午3:12
|
||||||
|
* @desc CustomHttpServletRequestWrapper...
|
||||||
|
*/
|
||||||
|
public class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
|
||||||
|
private final byte[] body;
|
||||||
|
|
||||||
|
public CustomHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
|
||||||
|
super(request);
|
||||||
|
BufferedReader reader = request.getReader();
|
||||||
|
try (StringWriter writer = new StringWriter()) {
|
||||||
|
int read;
|
||||||
|
char[] buf = new char[1024 * 8];
|
||||||
|
while ((read = reader.read(buf)) != -1) {
|
||||||
|
writer.write(buf, 0, read);
|
||||||
|
}
|
||||||
|
this.body = writer.getBuffer().toString().getBytes();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBody() {
|
||||||
|
return new String(body, StandardCharsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ServletInputStream getInputStream() {
|
||||||
|
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
|
||||||
|
return new ServletInputStream() {
|
||||||
|
@Override
|
||||||
|
public boolean isFinished() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isReady() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setReadListener(ReadListener readListener) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() {
|
||||||
|
return byteArrayInputStream.read();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BufferedReader getReader() {
|
||||||
|
return new BufferedReader(new InputStreamReader(this.getInputStream()));
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,38 +0,0 @@
|
||||||
package com.changhu.support.interceptor;
|
|
||||||
|
|
||||||
import com.changhu.common.annotation.CheckOpenApi;
|
|
||||||
import com.changhu.common.exception.MessageException;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.springframework.web.method.HandlerMethod;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author 20252
|
|
||||||
* @createTime 2024/10/9 下午5:05
|
|
||||||
* @desc OpenApiInterceptor...
|
|
||||||
*/
|
|
||||||
@Slf4j
|
|
||||||
public class OpenApiInterceptor implements HandlerInterceptor {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) {
|
|
||||||
String header = request.getHeader("X-API-KEY");
|
|
||||||
log.info("apiKey:{} {} 请求:{}", header, LocalDateTime.now(), request.getRequestURI());
|
|
||||||
if (handler instanceof HandlerMethod handlerMethod) {
|
|
||||||
CheckOpenApi methodAnnotation = handlerMethod.getMethodAnnotation(CheckOpenApi.class);
|
|
||||||
if (methodAnnotation != null) {
|
|
||||||
List<String> openApiKeys = methodAnnotation.value().getOpenApiKeys();
|
|
||||||
if (!openApiKeys.contains(header)) {
|
|
||||||
throw new MessageException("openApiKey error!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,118 @@
|
||||||
|
package com.changhu.support.interceptor;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.core.util.URLUtil;
|
||||||
|
import cn.hutool.crypto.digest.MD5;
|
||||||
|
import cn.hutool.http.HttpUtil;
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.baomidou.mybatisplus.extension.toolkit.Db;
|
||||||
|
import com.changhu.common.db.enums.IsEnable;
|
||||||
|
import com.changhu.common.exception.MessageException;
|
||||||
|
import com.changhu.common.utils.IpUtil;
|
||||||
|
import com.changhu.pojo.entity.AccessKeys;
|
||||||
|
import com.changhu.support.filter.CustomHttpServletRequestWrapper;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.springframework.web.method.HandlerMethod;
|
||||||
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author 20252
|
||||||
|
* @createTime 2024/11/19 下午1:58
|
||||||
|
* @desc SignInterceptor...
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
public class SignInterceptor implements HandlerInterceptor {
|
||||||
|
|
||||||
|
private static final String ACCESS_KEY = "Access-Key";//调用者身份唯一标识
|
||||||
|
private static final String TIMESTAMP = "Time-Stamp";//时间戳
|
||||||
|
private static final String SIGN = "Sign";//签名
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean preHandle(@NotNull HttpServletRequest request,
|
||||||
|
@NotNull HttpServletResponse response,
|
||||||
|
@NotNull Object handler) throws Exception {
|
||||||
|
if (handler instanceof HandlerMethod) {
|
||||||
|
String ip = IpUtil.getIp(request);
|
||||||
|
try {
|
||||||
|
return checkSign(request);
|
||||||
|
} catch (MessageException e) {
|
||||||
|
log.error("开放接口访问失败:{} 访问时间:{} IP:{} 访问接口:{} ", e.getMessage(), LocalDateTime.now(), ip, request.getRequestURI());
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkSign(HttpServletRequest request) throws MessageException {
|
||||||
|
|
||||||
|
String accessKey = request.getHeader(ACCESS_KEY);
|
||||||
|
String timestamp = request.getHeader(TIMESTAMP);
|
||||||
|
String sign = request.getHeader(SIGN);
|
||||||
|
|
||||||
|
if (StrUtil.isBlank(accessKey) || StrUtil.isBlank(timestamp) || StrUtil.isBlank(sign)) {
|
||||||
|
throw new MessageException("请求体缺失");
|
||||||
|
}
|
||||||
|
|
||||||
|
AccessKeys accessKeyEntity = Db.lambdaQuery(AccessKeys.class)
|
||||||
|
.eq(AccessKeys::getAccessKey, accessKey)
|
||||||
|
.oneOpt()
|
||||||
|
.orElseThrow(() -> new MessageException("无效的accessKey"));
|
||||||
|
|
||||||
|
if (IsEnable.FALSE.equals(accessKeyEntity.getIsEnable())) {
|
||||||
|
throw new MessageException("accessKey已禁用");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (accessKeyEntity.getEffectiveTime() > 0 && System.currentTimeMillis() - Long.parseLong(timestamp) > accessKeyEntity.getEffectiveTime()) {
|
||||||
|
throw new MessageException("请求已过期");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<String> allowedResources = Optional.ofNullable(accessKeyEntity.getAllowedResources()).orElseThrow(() -> new MessageException("暂无允许访问的资源"));
|
||||||
|
if (!allowedResources.contains(request.getRequestURI())) {
|
||||||
|
throw new MessageException("无效的请求资源");
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, Object> hashMap = new HashMap<>();
|
||||||
|
hashMap.put(ACCESS_KEY, accessKey);
|
||||||
|
hashMap.put(TIMESTAMP, timestamp);
|
||||||
|
//添加请求url参数
|
||||||
|
Optional.ofNullable(HttpUtil.decodeParamMap(request.getQueryString(), StandardCharsets.UTF_8))
|
||||||
|
.ifPresent(hashMap::putAll);
|
||||||
|
//添加body参数
|
||||||
|
Optional.ofNullable(JSON.<Map<String, Object>>parseObject(((CustomHttpServletRequestWrapper) request).getBody(), Map.class))
|
||||||
|
.ifPresent(hashMap::putAll);
|
||||||
|
//生成签名
|
||||||
|
String nowSign = generatedSign(hashMap, accessKeyEntity.getSecretKey());
|
||||||
|
//比对签名
|
||||||
|
if (!sign.equals(nowSign)) {
|
||||||
|
throw new MessageException("签名错误");
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取签名
|
||||||
|
*
|
||||||
|
* @param map 参数结果
|
||||||
|
* @param secretKey 密钥
|
||||||
|
* @return 签名字符串
|
||||||
|
*/
|
||||||
|
private String generatedSign(Map<String, Object> map, String secretKey) {
|
||||||
|
List<Map.Entry<String, Object>> entries = new ArrayList<>(map.entrySet());
|
||||||
|
String str = entries.stream()
|
||||||
|
.filter(en -> null == en.getValue() || StrUtil.isNotBlank(en.getValue().toString()))
|
||||||
|
.sorted(Comparator.comparing(o -> o.getKey().toLowerCase()))
|
||||||
|
.map(en -> StrUtil.format("{}={}", en.getKey(), URLUtil.encodeAll(en.getValue() + "")))
|
||||||
|
.collect(Collectors.joining("&"));
|
||||||
|
str += ("&Secret-Key=" + secretKey);
|
||||||
|
return MD5.create().digestHex(str).toUpperCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -14,8 +14,8 @@
|
||||||
from ck_assessment_record car
|
from ck_assessment_record car
|
||||||
left join enterprises_unit eu on car.enterprises_unit_id = eu.snow_flake_id and eu.delete_flag = 0
|
left join enterprises_unit eu on car.enterprises_unit_id = eu.snow_flake_id and eu.delete_flag = 0
|
||||||
left join ck_project cp on car.ck_project_id = cp.snow_flake_id and cp.delete_flag = 0
|
left join ck_project cp on car.ck_project_id = cp.snow_flake_id and cp.delete_flag = 0
|
||||||
left join mini_program_user mpu on mpu.identity = 'police' and car.create_by = mpu.snow_flake_id and mpu.delete_flag = 0
|
left join mini_program_user mpu on mpu.identity = 'police' and car.create_by = mpu.snow_flake_id
|
||||||
left join police_unit pu on mpu.unit_id = pu.snow_flake_id and pu.delete_flag = 0
|
left join police_unit pu on mpu.unit_id = pu.snow_flake_id
|
||||||
left join ck_assessment_record_details card on car.snow_flake_id = card.ck_assessment_record_id and card.delete_flag = 0
|
left join ck_assessment_record_details card on car.snow_flake_id = card.ck_assessment_record_id and card.delete_flag = 0
|
||||||
left join ck_standard cs on card.ck_standard_id = cs.snow_flake_id
|
left join ck_standard cs on card.ck_standard_id = cs.snow_flake_id
|
||||||
where car.delete_flag = 0
|
where car.delete_flag = 0
|
||||||
|
|
|
@ -30,33 +30,64 @@
|
||||||
</select>
|
</select>
|
||||||
<resultMap id="SecurityUnitUseStatisticsDTOResultMap" type="com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO">
|
<resultMap id="SecurityUnitUseStatisticsDTOResultMap" type="com.changhu.pojo.dto.SecurityUnitUseStatisticsDTO">
|
||||||
<result
|
<result
|
||||||
column="securityUnitLegalPersonInfo"
|
column="serviceProjectList"
|
||||||
typeHandler="com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler"
|
typeHandler="com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler"
|
||||||
property="securityUnitLegalPersonInfo"/>
|
property="serviceProjectList"/>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<select id="securityUnitUseStatistics" resultMap="SecurityUnitUseStatisticsDTOResultMap">
|
<select id="securityUnitUseStatistics" resultMap="SecurityUnitUseStatisticsDTOResultMap">
|
||||||
|
WITH security_user_counts AS (
|
||||||
|
SELECT
|
||||||
|
service_project_id,
|
||||||
|
COUNT(1) AS securityUserTotal,
|
||||||
|
SUM(IF(security_number != '', 1, 0)) AS haveCardSecurityUserCount
|
||||||
|
FROM
|
||||||
|
security_user
|
||||||
|
WHERE delete_flag = 0
|
||||||
|
GROUP BY service_project_id )
|
||||||
select
|
select
|
||||||
sp.snow_flake_id as 'serviceProjectId',
|
eu.snow_flake_id as 'enterprisesUnitId',
|
||||||
|
eu.name as 'enterprisesUnitName',
|
||||||
|
eu.province,
|
||||||
|
eu.city,
|
||||||
|
eu.districts,
|
||||||
|
eu.street,
|
||||||
|
ad1.name as 'provinceName',
|
||||||
|
ad2.name as 'cityName',
|
||||||
|
ad3.name as 'districtsName',
|
||||||
|
ad4.name as 'streetName',
|
||||||
|
eu.address as 'address',
|
||||||
|
pu.snow_flake_id as 'policeUnitId',
|
||||||
pu.name as 'policeUnitName',
|
pu.name as 'policeUnitName',
|
||||||
su.name as 'securityUnitName',
|
json_arrayagg(
|
||||||
sp.name as 'serviceProjectName',
|
json_object(
|
||||||
sp.type as 'type',
|
'snowFlakeId', sp.snow_flake_id,
|
||||||
sp.two_type as 'twoType',
|
'name', sp.name,
|
||||||
sp.outsource_name as 'outsourceName',
|
'type', sp.type,
|
||||||
count(suu.snow_flake_id) as 'securityUserTotal',
|
'twoType', sp.two_type,
|
||||||
SUM(IF(suu.security_number != '', 1, 0)) as 'haveCardSecurityUserCount',
|
'outsourceName', sp.outsource_name,
|
||||||
sp.is_filing as 'isFiling',
|
'isFiling', sp.is_filing,
|
||||||
sp.id_number,
|
'idNumber', sp.id_number,
|
||||||
su.legal_person_info as 'securityUnitLegalPersonInfo',
|
'securityUserTotal', suc.securityUserTotal,
|
||||||
mpu.name as 'serviceProjectManagerName',
|
'haveCardSecurityUserCount', suc.haveCardSecurityUserCount,
|
||||||
mpu.telephone as 'serviceProjectManagerTelephone'
|
'securityUnitId',su.snow_flake_id,
|
||||||
from police_unit pu
|
'securityUnitName',su.name,
|
||||||
|
'securityUnitLegalPersonInfo',su.legal_person_info,
|
||||||
|
'serviceProjectManagerName',mpu.name,
|
||||||
|
'serviceProjectManagerTelephone',mpu.telephone
|
||||||
|
)) as 'serviceProjectList'
|
||||||
|
from
|
||||||
|
police_unit pu
|
||||||
join enterprises_unit eu on pu.snow_flake_id = eu.police_unit_id and eu.delete_flag = 0
|
join enterprises_unit eu on pu.snow_flake_id = eu.police_unit_id and eu.delete_flag = 0
|
||||||
join service_project sp on eu.snow_flake_id = sp.enterprises_unit_id and sp.delete_flag = 0
|
join service_project sp on eu.snow_flake_id = sp.enterprises_unit_id and sp.delete_flag = 0
|
||||||
join security_unit su on sp.security_unit_id = su.snow_flake_id and su.delete_flag = 0
|
join security_unit su on sp.security_unit_id = su.snow_flake_id and su.delete_flag = 0
|
||||||
LEFT join mini_program_user mpu on sp.project_manager_mini_program_user_id = mpu.snow_flake_id
|
LEFT join mini_program_user mpu on sp.project_manager_mini_program_user_id = mpu.snow_flake_id
|
||||||
LEFT join security_user suu on suu.service_project_id = sp.snow_flake_id and suu.delete_flag = 0
|
left join administrative_division ad1 on eu.province = ad1.code and ad1.delete_flag = 0
|
||||||
where pu.delete_flag = 0
|
left join administrative_division ad2 on eu.city = ad2.code and ad2.delete_flag = 0
|
||||||
|
left join administrative_division ad3 on eu.districts = ad3.code and ad3.delete_flag = 0
|
||||||
|
left join administrative_division ad4 on eu.street = ad4.code and ad4.delete_flag = 0
|
||||||
|
left JOIN security_user_counts suc ON sp.snow_flake_id = suc.service_project_id
|
||||||
|
where
|
||||||
|
pu.delete_flag = 0
|
||||||
<choose>
|
<choose>
|
||||||
<when test="level==1">
|
<when test="level==1">
|
||||||
and eu.province = #{code}
|
and eu.province = #{code}
|
||||||
|
@ -75,11 +106,11 @@
|
||||||
</when>
|
</when>
|
||||||
<otherwise>and eu.snow_flake_id = -1</otherwise>
|
<otherwise>and eu.snow_flake_id = -1</otherwise>
|
||||||
</choose>
|
</choose>
|
||||||
group by sp.snow_flake_id
|
group by eu.snow_flake_id
|
||||||
order by sp.create_time desc
|
order by eu.create_time desc
|
||||||
</select>
|
</select>
|
||||||
<select id="serviceProjectUserRoster"
|
<select id="securityUserRoster"
|
||||||
resultType="com.changhu.pojo.dto.ServiceProjectSecurityUserRosterDTO">
|
resultType="com.changhu.pojo.dto.SecurityUserRosterDTO">
|
||||||
select su.snow_flake_id,
|
select su.snow_flake_id,
|
||||||
su.name,
|
su.name,
|
||||||
su.sex,
|
su.sex,
|
||||||
|
@ -89,12 +120,22 @@
|
||||||
eu.name as 'enterprisesUnitName',
|
eu.name as 'enterprisesUnitName',
|
||||||
suu.name as 'securityUnitName',
|
suu.name as 'securityUnitName',
|
||||||
su.security_number
|
su.security_number
|
||||||
from enterprises_unit eu
|
from enterprises_unit eu
|
||||||
left join service_project sp on sp.enterprises_unit_id = eu.snow_flake_id and sp.delete_flag = 0
|
LEFT JOIN service_project sp ON sp.enterprises_unit_id = eu.snow_flake_id AND sp.delete_flag = 0
|
||||||
left join security_user su on su.service_project_id = sp.snow_flake_id and su.delete_flag = 0
|
JOIN security_user su ON su.service_project_id = sp.snow_flake_id AND su.delete_flag = 0
|
||||||
left join security_unit suu on su.security_unit_id = suu.snow_flake_id and suu.delete_flag = 0
|
LEFT JOIN security_unit suu ON su.security_unit_id = suu.snow_flake_id AND suu.delete_flag = 0
|
||||||
where eu.delete_flag = 0
|
where eu.delete_flag = 0
|
||||||
and sp.snow_flake_id = #{serviceProjectId}
|
<choose>
|
||||||
|
<when test="type==@com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType@ENTERPRISES_UNIT">
|
||||||
|
and eu.snow_flake_id = #{id}
|
||||||
|
</when>
|
||||||
|
<when test="type==@com.changhu.pojo.params.EnterprisesUnitOrServiceProjectType@SERVICE_PROJECT">
|
||||||
|
and sp.snow_flake_id = #{id}
|
||||||
|
</when>
|
||||||
|
<otherwise>
|
||||||
|
and eu.snow_flake_id = -1
|
||||||
|
</otherwise>
|
||||||
|
</choose>
|
||||||
order by su.create_time desc
|
order by su.create_time desc
|
||||||
</select>
|
</select>
|
||||||
</mapper>
|
</mapper>
|
|
@ -1,8 +1,7 @@
|
||||||
VITE_APP_NAME=超级后台
|
VITE_APP_NAME=保安管理
|
||||||
VITE_APP_ENV=development
|
VITE_APP_ENV=development
|
||||||
VITE_APP_PORT=1000
|
VITE_APP_PORT=1000
|
||||||
VITE_DROP_CONSOLE=false
|
VITE_DROP_CONSOLE=false
|
||||||
VITE_APP_MODULE_NAME=superManagement
|
|
||||||
|
|
||||||
# axios
|
# axios
|
||||||
VITE_APP_BASE_API=/api
|
VITE_APP_BASE_API=/api
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
VITE_APP_NAME=超级后台
|
VITE_APP_NAME=保安管理
|
||||||
VITE_APP_ENV=production
|
VITE_APP_ENV=production
|
||||||
VITE_APP_PORT=1001
|
VITE_APP_PORT=1001
|
||||||
VITE_DROP_CONSOLE=true
|
VITE_DROP_CONSOLE=true
|
||||||
VITE_APP_MODULE_NAME=superManagement
|
|
||||||
|
|
||||||
# axios
|
# axios
|
||||||
VITE_APP_BASE_API=/api
|
VITE_APP_BASE_API=/api
|
||||||
|
|
|
@ -32,13 +32,13 @@ pipeline {
|
||||||
remote.password = "${password}"
|
remote.password = "${password}"
|
||||||
}
|
}
|
||||||
sshCommand remote: remote, command: 'pwd=$(pwd) echo "ssh连接成功!当前工作目录:$(pwd)"'
|
sshCommand remote: remote, command: 'pwd=$(pwd) echo "ssh连接成功!当前工作目录:$(pwd)"'
|
||||||
sshCommand remote: remote, command: 'echo "删除:superManagement..."'
|
sshCommand remote: remote, command: 'echo "删除:super_management..."'
|
||||||
sshRemove remote: remote, path: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index/superManagement'
|
sshRemove remote: remote, path: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index/super_management'
|
||||||
sshCommand remote: remote, command: 'echo "删除:superManagement成功!"'
|
sshCommand remote: remote, command: 'echo "删除:super_management成功!"'
|
||||||
|
|
||||||
sshCommand remote: remote, command: 'echo "将构建的superManagement发送到服务器..."'
|
sshCommand remote: remote, command: 'echo "将构建的super_management发送到服务器..."'
|
||||||
sshPut remote: remote, from: '/var/jenkins_home/workspace/警保联动-超级后台/superManagement/superManagement', into: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index'
|
sshPut remote: remote, from: '/var/jenkins_home/workspace/警保联动-超级后台/superManagement/super_management', into: '/home/app/apps/1panel/apps/openresty/openresty/www/sites/policeSecurityServer/index'
|
||||||
sshCommand remote: remote, command: 'echo "superManagement发送成功!"'
|
sshCommand remote: remote, command: 'echo "super_management发送成功!"'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||||
<script type="module" src="/src/assets/iconfont/iconfont.js"></script>
|
<script type="module" src="/src/assets/iconfont/iconfont.js"></script>
|
||||||
|
|
||||||
<title>超级后台</title>
|
<title>保安管理</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "supermanagement",
|
"name": "super_management",
|
||||||
"appName": "超级后台",
|
"appName": "保安管理",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
@ -14,6 +14,7 @@
|
||||||
"@vueuse/core": "^11.0.3",
|
"@vueuse/core": "^11.0.3",
|
||||||
"ant-design-vue": "^4.2.3",
|
"ant-design-vue": "^4.2.3",
|
||||||
"axios": "^1.7.5",
|
"axios": "^1.7.5",
|
||||||
|
"js-md5": "^0.8.3",
|
||||||
"jsencrypt": "^3.3.2",
|
"jsencrypt": "^3.3.2",
|
||||||
"lodash-es": "^4.17.21",
|
"lodash-es": "^4.17.21",
|
||||||
"pinia": "^2.2.2",
|
"pinia": "^2.2.2",
|
||||||
|
|
|
@ -19,7 +19,6 @@ const props = withDefaults(defineProps<MapContainerProps>(), {
|
||||||
viewMode: "3D",
|
viewMode: "3D",
|
||||||
// 初始化地图级别
|
// 初始化地图级别
|
||||||
zoom: 11,
|
zoom: 11,
|
||||||
mapStyle: 'amap://styles/darkblue'
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
|
@ -7,10 +7,10 @@
|
||||||
collapsible
|
collapsible
|
||||||
>
|
>
|
||||||
<div v-if="!collapsed" class="title flex-center">
|
<div v-if="!collapsed" class="title flex-center">
|
||||||
<div>超级后台</div>
|
<div>{{ appInfo.appName }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="logo flex-center">
|
<div v-else class="logo flex-center">
|
||||||
<img src="@/assets/vue.svg" title="超级后台" alt="xx">
|
<img src="@/assets/vue.svg" :title="appInfo.appName" alt="xx">
|
||||||
</div>
|
</div>
|
||||||
<SystemMenus/>
|
<SystemMenus/>
|
||||||
</a-layout-sider>
|
</a-layout-sider>
|
||||||
|
@ -40,6 +40,8 @@ import {ref} from "vue";
|
||||||
import LayoutHeader from "@/components/layout/header/LayoutHeader.vue";
|
import LayoutHeader from "@/components/layout/header/LayoutHeader.vue";
|
||||||
import SystemMenus from "@/components/layout/SystemMenus.vue";
|
import SystemMenus from "@/components/layout/SystemMenus.vue";
|
||||||
|
|
||||||
|
const appInfo = __APP_INFO
|
||||||
|
|
||||||
const collapsed = ref<boolean>(false);
|
const collapsed = ref<boolean>(false);
|
||||||
|
|
||||||
const keepAliveNames = ref<string[]>([])
|
const keepAliveNames = ref<string[]>([])
|
||||||
|
|
|
@ -52,13 +52,6 @@ export const SYSTEM_MENUS: SystemMenu[] = [
|
||||||
component: () => import('@/views/unitManage/securityUnit/index.vue')
|
component: () => import('@/views/unitManage/securityUnit/index.vue')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
|
||||||
title: '数据总览',
|
|
||||||
name: 'dataOverview',
|
|
||||||
path: '/dataOverview',
|
|
||||||
type: 'menu',
|
|
||||||
isFull: true,
|
|
||||||
component: () => import('@/views/data/dataOverview.vue')
|
|
||||||
}, {
|
}, {
|
||||||
title: '开放平台',
|
title: '开放平台',
|
||||||
name: 'openPlatform',
|
name: 'openPlatform',
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
declare const __APP_ENV: ImportMetaEnv;
|
declare const __APP_ENV: ImportMetaEnv;
|
||||||
|
declare const __APP_INFO: {
|
||||||
|
moduleName: string,
|
||||||
|
appName: string,
|
||||||
|
version: string
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 全局返回
|
* 全局返回
|
||||||
|
|
|
@ -10,7 +10,7 @@ import {ROUTER_WHITE_LIST} from "@/config";
|
||||||
* createWebHashHistory: 路径带#号 这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理,影响SEO
|
* createWebHashHistory: 路径带#号 这部分 URL 从未被发送到服务器,所以它不需要在服务器层面上进行任何特殊处理,影响SEO
|
||||||
*/
|
*/
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHistory(__APP_ENV.VITE_APP_MODULE_NAME),
|
history: createWebHistory(__APP_INFO.moduleName),
|
||||||
routes: [...staticRouter],
|
routes: [...staticRouter],
|
||||||
strict: false,
|
strict: false,
|
||||||
scrollBehavior: () => ({left: 0, top: 0}),
|
scrollBehavior: () => ({left: 0, top: 0}),
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {EnterprisesUnit} from "@/types/views/data/dataOverview.ts";
|
import {EnterprisesUnit} from "@/types/views/index.ts";
|
||||||
|
|
||||||
defineProps<EnterprisesUnit>()
|
defineProps<EnterprisesUnit>()
|
||||||
|
|
|
@ -1,112 +0,0 @@
|
||||||
<template>
|
|
||||||
<div class="container">
|
|
||||||
<div class="header">
|
|
||||||
<h1>警保联动数据总览</h1>
|
|
||||||
</div>
|
|
||||||
<MapContainer class="map-container" ref="mapRef" :init-callback="initMap">
|
|
||||||
<div class="left-panel panel">
|
|
||||||
<h2>左侧统计面板</h2>
|
|
||||||
<!-- 添加你的统计数据 -->
|
|
||||||
</div>
|
|
||||||
<div class="right-panel panel">
|
|
||||||
<h2>右侧统计面板</h2>
|
|
||||||
<!-- 添加你的统计数据 -->
|
|
||||||
</div>
|
|
||||||
</MapContainer>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts">
|
|
||||||
import MapContainer from "@/components/aMap/MapContainer.vue";
|
|
||||||
import {createApp, h, ref} from "vue";
|
|
||||||
import {ComponentExposed} from "vue-component-type-helpers";
|
|
||||||
import api from "@/axios";
|
|
||||||
import EnterprisesUnitInfoWindowContent from "@/views/data/components/EnterprisesUnitInfoWindowContent.vue";
|
|
||||||
import {EnterprisesUnit} from "@/types/views/data/dataOverview.ts";
|
|
||||||
|
|
||||||
const mapRef = ref<ComponentExposed<typeof MapContainer>>(null)
|
|
||||||
|
|
||||||
let infoWindow: AMap.InfoWindow = null;
|
|
||||||
|
|
||||||
const initMap = async () => {
|
|
||||||
const {data} = await api.get<EnterprisesUnit[]>('/enterprisesUnit/mapPoint')
|
|
||||||
mapRef.value?.mapInstance?.clearMap()
|
|
||||||
const markers = data.map(item => {
|
|
||||||
if (!item.point) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
const marker = new AMap.Marker({
|
|
||||||
icon: new AMap.Icon({
|
|
||||||
image: __APP_ENV.VITE_APP_MINIO_URL + item.type.extData.icon,
|
|
||||||
size: new AMap.Size(66, 66),
|
|
||||||
imageSize: new AMap.Size(66, 66),
|
|
||||||
}),
|
|
||||||
position: item.point,
|
|
||||||
offset: new AMap.Pixel(-33, -66)
|
|
||||||
})
|
|
||||||
marker.on('click', () => {
|
|
||||||
if (!infoWindow) {
|
|
||||||
infoWindow = new AMap.InfoWindow({
|
|
||||||
isCustom: true,
|
|
||||||
offset: new AMap.Pixel(66, -66),
|
|
||||||
closeWhenClickMap: true
|
|
||||||
});
|
|
||||||
}
|
|
||||||
const element = document.createElement('div')
|
|
||||||
//h 渲染组件 跟vue一样的用法
|
|
||||||
const _InfoWindow = h(EnterprisesUnitInfoWindowContent, item)
|
|
||||||
const app = createApp(_InfoWindow)
|
|
||||||
app.mount(element)
|
|
||||||
infoWindow.setContent(element)
|
|
||||||
infoWindow.open(mapRef.value?.mapInstance, item.point)
|
|
||||||
})
|
|
||||||
return marker
|
|
||||||
}).filter(Boolean)
|
|
||||||
mapRef.value.mapInstance.add(markers)
|
|
||||||
mapRef.value.mapInstance.setFitView()
|
|
||||||
}
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped lang="scss">
|
|
||||||
.container {
|
|
||||||
position: relative;
|
|
||||||
height: 100vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header {
|
|
||||||
background-color: rgba(255, 255, 255, 0.7);
|
|
||||||
color: #333;
|
|
||||||
text-align: center;
|
|
||||||
padding: 20px;
|
|
||||||
position: absolute;
|
|
||||||
top: 20px;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
.map-container {
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.panel {
|
|
||||||
background-color: rgba(255, 255, 255, 0.7);
|
|
||||||
padding: 20px;
|
|
||||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
||||||
position: absolute;
|
|
||||||
top: 100px; /* 调整顶部距离以避免与标题重叠 */
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
.left-panel {
|
|
||||||
width: 15%;
|
|
||||||
left: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-panel {
|
|
||||||
width: 15%;
|
|
||||||
right: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,13 +1,112 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div class="container">
|
||||||
index页面
|
<div class="header">
|
||||||
|
<h1>警保联动数据总览</h1>
|
||||||
|
</div>
|
||||||
|
<MapContainer class="map-container" ref="mapRef" :init-callback="initMap">
|
||||||
|
<div class="left-panel panel">
|
||||||
|
<h2>左侧统计面板</h2>
|
||||||
|
<!-- 添加你的统计数据 -->
|
||||||
|
</div>
|
||||||
|
<div class="right-panel panel">
|
||||||
|
<h2>右侧统计面板</h2>
|
||||||
|
<!-- 添加你的统计数据 -->
|
||||||
|
</div>
|
||||||
|
</MapContainer>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import MapContainer from "@/components/aMap/MapContainer.vue";
|
||||||
|
import {createApp, h, ref} from "vue";
|
||||||
|
import {ComponentExposed} from "vue-component-type-helpers";
|
||||||
|
import api from "@/axios";
|
||||||
|
import EnterprisesUnitInfoWindowContent from "@/views/components/EnterprisesUnitInfoWindowContent.vue";
|
||||||
|
import {EnterprisesUnit} from "@/types/views/index.ts";
|
||||||
|
|
||||||
|
const mapRef = ref<ComponentExposed<typeof MapContainer>>(null)
|
||||||
|
|
||||||
|
let infoWindow: AMap.InfoWindow = null;
|
||||||
|
|
||||||
|
const initMap = async () => {
|
||||||
|
const {data} = await api.get<EnterprisesUnit[]>('/super/index/mapPoint')
|
||||||
|
mapRef.value?.mapInstance?.clearMap()
|
||||||
|
const markers = data.map(item => {
|
||||||
|
if (!item.point) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const marker = new AMap.Marker({
|
||||||
|
icon: new AMap.Icon({
|
||||||
|
image: __APP_ENV.VITE_APP_MINIO_URL + item.type.extData.icon,
|
||||||
|
size: new AMap.Size(66, 66),
|
||||||
|
imageSize: new AMap.Size(66, 66),
|
||||||
|
}),
|
||||||
|
position: item.point,
|
||||||
|
offset: new AMap.Pixel(-33, -66)
|
||||||
|
})
|
||||||
|
marker.on('click', () => {
|
||||||
|
if (!infoWindow) {
|
||||||
|
infoWindow = new AMap.InfoWindow({
|
||||||
|
isCustom: true,
|
||||||
|
offset: new AMap.Pixel(66, -66),
|
||||||
|
closeWhenClickMap: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
const element = document.createElement('div')
|
||||||
|
//h 渲染组件 跟vue一样的用法
|
||||||
|
const _InfoWindow = h(EnterprisesUnitInfoWindowContent, item)
|
||||||
|
const app = createApp(_InfoWindow)
|
||||||
|
app.mount(element)
|
||||||
|
infoWindow.setContent(element)
|
||||||
|
infoWindow.open(mapRef.value?.mapInstance, item.point)
|
||||||
|
})
|
||||||
|
return marker
|
||||||
|
}).filter(Boolean)
|
||||||
|
mapRef.value.mapInstance.add(markers)
|
||||||
|
mapRef.value.mapInstance.setFitView()
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
.container {
|
||||||
|
position: relative;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
background-color: rgba(255, 255, 255, 0.7);
|
||||||
|
color: #333;
|
||||||
|
text-align: center;
|
||||||
|
padding: 20px;
|
||||||
|
position: absolute;
|
||||||
|
top: 20px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.map-container {
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
background-color: rgba(255, 255, 255, 0.7);
|
||||||
|
padding: 20px;
|
||||||
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||||
|
position: absolute;
|
||||||
|
top: 100px; /* 调整顶部距离以避免与标题重叠 */
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
.left-panel {
|
||||||
|
width: 15%;
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.right-panel {
|
||||||
|
width: 15%;
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -29,8 +29,8 @@ import TableProMax from "@/components/table/TableProMax.vue";
|
||||||
import {TableProMaxProps} from "@/types/components/table";
|
import {TableProMaxProps} from "@/types/components/table";
|
||||||
import {AccessKeyRes, GeneratedAccessKeyParams} from "@/types/views/openPlatform/openPlatform.ts";
|
import {AccessKeyRes, GeneratedAccessKeyParams} from "@/types/views/openPlatform/openPlatform.ts";
|
||||||
import {ComponentExposed} from "vue-component-type-helpers";
|
import {ComponentExposed} from "vue-component-type-helpers";
|
||||||
|
import {md5} from "js-md5";
|
||||||
import axios from "axios";
|
import axios from "axios";
|
||||||
import {useUserStore} from "@/stores/modules/userStore.ts";
|
|
||||||
|
|
||||||
type TableProps = TableProMaxProps<AccessKeyRes>
|
type TableProps = TableProMaxProps<AccessKeyRes>
|
||||||
|
|
||||||
|
@ -123,29 +123,64 @@ const saveOrUpdateAccessKey = (params: GeneratedAccessKeyParams) => {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const userStore = useUserStore()
|
|
||||||
|
|
||||||
const a = () => {
|
const a = () => {
|
||||||
|
const accessKey = "w2wzi0wefmmo6s735z2el8tfzitya5gj"
|
||||||
|
const secretKey = "db1b5214-02ee-497f-957c-88323b4351bf"
|
||||||
|
const now = Date.now()
|
||||||
|
const params = {
|
||||||
|
id: "1855852231820054528",
|
||||||
|
type: 'ENTERPRISES_UNIT'
|
||||||
|
}
|
||||||
|
const sign = generatedSign(params, now, accessKey, secretKey)
|
||||||
|
const headers2 = {
|
||||||
|
'Access-Key': accessKey,
|
||||||
|
'Time-Stamp': now,
|
||||||
|
'Sign': sign
|
||||||
|
}
|
||||||
|
console.log(headers2);
|
||||||
axios.get('http://127.0.0.1:8765/open/dataView', {
|
axios.get('http://127.0.0.1:8765/open/dataView', {
|
||||||
|
params: params,
|
||||||
headers: {
|
headers: {
|
||||||
'X-API-KEY': '123',
|
...headers2
|
||||||
'access-key': '123',
|
|
||||||
'time-stamp': '123',
|
|
||||||
'sign': '123',
|
|
||||||
'nonce': '123'
|
|
||||||
}
|
}
|
||||||
}).then(resp => {
|
|
||||||
console.log(resp);
|
|
||||||
})
|
})
|
||||||
// api.get('/open/dataView', null, {
|
|
||||||
// headers: {
|
|
||||||
// 'X-API-KEY': '123',
|
// api.get('/open/dataView', paramsMap, {
|
||||||
// 'access-key': '123',
|
// headers
|
||||||
// 'time-stamp': '123',
|
|
||||||
// 'sign': '123',
|
|
||||||
// 'nonce': '123'
|
|
||||||
// }
|
|
||||||
// })
|
// })
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成签名
|
||||||
|
* @param params 参数
|
||||||
|
* @param timeStamp 时间戳
|
||||||
|
* @param accessKey
|
||||||
|
* @param secretKey
|
||||||
|
*/
|
||||||
|
const generatedSign = (params: Record<string, any>,
|
||||||
|
timeStamp: number,
|
||||||
|
accessKey: string,
|
||||||
|
secretKey: string): string => {
|
||||||
|
const paramsMap = new Map<string, any>();
|
||||||
|
if (params) {
|
||||||
|
for (let paramsKey in params) {
|
||||||
|
paramsMap.set(paramsKey, params[paramsKey])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paramsMap.set('Access-Key', accessKey)
|
||||||
|
paramsMap.set('Time-Stamp', timeStamp)
|
||||||
|
// 将 Map 转换为数组并排序
|
||||||
|
const entries = Array.from(paramsMap.entries());
|
||||||
|
// 拼接成 URL 编码的字符串
|
||||||
|
const encodedParams = entries
|
||||||
|
.filter(([_, value]) => value !== null && value !== undefined && value !== '')
|
||||||
|
.sort((a, b) => a[0].localeCompare(b[0], undefined, {sensitivity: 'base', caseFirst: 'upper'}))
|
||||||
|
.map(([key, value]) => `${key}=${encodeURIComponent(value).replace(/%([0-9A-Fa-f]{2})/g, (_, p1) => '%' + p1.toUpperCase())}`)
|
||||||
|
.join('&') + "&Secret-Key=" + secretKey;
|
||||||
|
return md5(encodedParams).toUpperCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
const allowedResources = ref<SelectNodeVo<string>[]>([])
|
const allowedResources = ref<SelectNodeVo<string>[]>([])
|
||||||
|
|
|
@ -6,8 +6,6 @@ interface ImportMetaEnv {
|
||||||
readonly VITE_APP_ENV: 'development' | 'production';
|
readonly VITE_APP_ENV: 'development' | 'production';
|
||||||
// 启动端口
|
// 启动端口
|
||||||
readonly VITE_APP_PORT: number;
|
readonly VITE_APP_PORT: number;
|
||||||
// 模块名称
|
|
||||||
readonly VITE_APP_MODULE_NAME: string;
|
|
||||||
|
|
||||||
// axios
|
// axios
|
||||||
readonly VITE_APP_BASE_API: string;
|
readonly VITE_APP_BASE_API: string;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import Components from 'unplugin-vue-components/vite';
|
||||||
import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers';
|
import {AntDesignVueResolver} from 'unplugin-vue-components/resolvers';
|
||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
import vueJsx from '@vitejs/plugin-vue-jsx'
|
import vueJsx from '@vitejs/plugin-vue-jsx'
|
||||||
|
import {appName, version, name as moduleName} from './package.json'
|
||||||
|
|
||||||
const pathSrc = path.resolve(__dirname, 'src');
|
const pathSrc = path.resolve(__dirname, 'src');
|
||||||
|
|
||||||
|
@ -12,9 +13,14 @@ export default defineConfig(({mode}) => {
|
||||||
const env: Record<string, string> = loadEnv(mode, process.cwd(), '')
|
const env: Record<string, string> = loadEnv(mode, process.cwd(), '')
|
||||||
return {
|
return {
|
||||||
define: {
|
define: {
|
||||||
__APP_ENV: JSON.stringify(env)
|
__APP_ENV: JSON.stringify(env),
|
||||||
|
__APP_INFO: JSON.stringify({
|
||||||
|
moduleName,
|
||||||
|
appName,
|
||||||
|
version
|
||||||
|
})
|
||||||
},
|
},
|
||||||
base: `/${env['VITE_APP_MODULE_NAME']}/`,
|
base: `/${moduleName}/`,
|
||||||
plugins: [
|
plugins: [
|
||||||
vue(),
|
vue(),
|
||||||
vueJsx(),
|
vueJsx(),
|
||||||
|
@ -43,7 +49,7 @@ export default defineConfig(({mode}) => {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
build: {
|
build: {
|
||||||
outDir: env['VITE_APP_MODULE_NAME'],
|
outDir: moduleName,
|
||||||
target: 'modules',
|
target: 'modules',
|
||||||
chunkSizeWarningLimit: 1500,
|
chunkSizeWarningLimit: 1500,
|
||||||
minify: 'terser',
|
minify: 'terser',
|
||||||
|
|
Loading…
Reference in New Issue