From 1e44856b58a75a02fbbfacb31bf360838dc39e41 Mon Sep 17 00:00:00 2001 From: wangyilin <1454641981@qq.com> Date: Thu, 7 Nov 2024 14:39:01 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=B0=8F=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assets/images/project.png | Bin 20212 -> 31020 bytes .../src/assets/images/回单.jpg | Bin 0 -> 37908 bytes .../src/assets/images/工单.jpg | Bin 0 -> 38441 bytes .../src/assets/images/排名.jpg | Bin 0 -> 32071 bytes .../src/assets/images/法制宣传.jpg | Bin 0 -> 32863 bytes .../src/assets/images/考核监督.jpg | Bin 0 -> 35993 bytes .../src/assets/images/警保风采.jpg | Bin 0 -> 35913 bytes collect_information/src/config/index.ts | 2 +- .../src/pages/projectManager/index/index.scss | 77 ++++++++++++------ .../src/pages/projectManager/index/index.vue | 70 +++++++++++++--- .../projectDetails/projectDetails.vue | 2 +- 11 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 collect_information/src/assets/images/回单.jpg create mode 100644 collect_information/src/assets/images/工单.jpg create mode 100644 collect_information/src/assets/images/排名.jpg create mode 100644 collect_information/src/assets/images/法制宣传.jpg create mode 100644 collect_information/src/assets/images/考核监督.jpg create mode 100644 collect_information/src/assets/images/警保风采.jpg diff --git a/collect_information/src/assets/images/project.png b/collect_information/src/assets/images/project.png index 8de6ed40163189df581773e4a1e022ed02f76e98..9aef30539667d16664f647ea91b42f89980ed54d 100644 GIT binary patch literal 31020 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 Z_Vf{r`KWzSabZ6Kk-Yj=*_qh+zW}s;(_jDq literal 20212 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�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 rW%Z9`)$vIs!uMSV2(%K}CuM5D*a%DN*UY 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 bIv%ld{?teX0X?z%P=%KN5KRTGx$l1ftxqMx literal 0 HcmV?d00001 diff --git a/collect_information/src/assets/images/警保风采.jpg b/collect_information/src/assets/images/警保风采.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8de01b47149b16605bd579485f79f71ec4336332 GIT binary patch literal 35913 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 - + 1123 + + + 单位数量 + 51 + + + 服务项目 + + 13123 + + + + 有保安证人员 + 1000 + + + 无保安证人员 + 140 + + 请选择 - - - + + + - {{ item.name }} + {{item.name}} + + diff --git a/collect_information/src/pages/police/index/index.vue.bak b/collect_information/src/pages/police/index/index.vue.bak new file mode 100644 index 0000000..9c1ef37 --- /dev/null +++ b/collect_information/src/pages/police/index/index.vue.bak @@ -0,0 +1,57 @@ + + diff --git a/collect_information/types/pages/police/index.ts b/collect_information/types/pages/police/index.ts new file mode 100644 index 0000000..802c4de --- /dev/null +++ b/collect_information/types/pages/police/index.ts @@ -0,0 +1,13 @@ +export interface DataStatisticsRes { + /*企事业单位数量 */ + enterprisesUnitCount: number; + + /*服务项目数量 */ + serviceProjectCount: number; + + /*保安人员数量 */ + securityUserCount: number; + + /*无证保安人员数量 */ + noCardSecurityUserCount: number; +} From 36506f3ffb2cfb792c0e40ed1d8c076b3ed68c1c Mon Sep 17 00:00:00 2001 From: wangyilin <1454641981@qq.com> Date: Thu, 7 Nov 2024 17:12:19 +0800 Subject: [PATCH 3/7] =?UTF-8?q?police=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- collect_information/src/config/index.ts | 2 +- collect_information/src/pages/police/index/index.scss | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/collect_information/src/config/index.ts b/collect_information/src/config/index.ts index 5648223..ba8500d 100644 --- a/collect_information/src/config/index.ts +++ b/collect_information/src/config/index.ts @@ -20,7 +20,7 @@ export const MINI_PROGRAM_USER_CONFIG: Record Date: Thu, 7 Nov 2024 17:14:01 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat(module/assessmentCriteria):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=80=83=E6=A0=B8=E6=A0=87=E5=87=86=E6=A8=A1?= =?UTF-8?q?=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加了考核标准相关的实体类、枚举类、参数类、VO类等- 实现了考核标准的CRUD接口和相关服务 - 新增了考核标准的分页查询和详情查询功能 - 优化了用户类型检查的注解 --- .../common/annotation/CheckUserType.java | 2 +- .../common/db/enums/EnterprisesUnitType.java | 25 ++ .../changhu/common/db/enums/SelectType.java | 25 ++ .../handler/ManagementSecurityUnitLogin.java | 2 +- .../AssessmentCriteriaController.java | 134 +++++++++ .../CkAssessmentRecordDetailsMapper.java | 15 + .../mapper/CkAssessmentRecordMapper.java | 15 + .../mapper/CkGroupMapper.java | 15 + .../mapper/CkItemMapper.java | 15 + .../mapper/CkProjectMapper.java | 39 +++ .../mapper/CkStandardMapper.java | 15 + .../pojo/entity/CkAssessmentRecord.java | 57 ++++ .../entity/CkAssessmentRecordDetails.java | 57 ++++ .../pojo/entity/CkGroup.java | 52 ++++ .../pojo/entity/CkItem.java | 53 ++++ .../pojo/entity/CkProject.java | 53 ++++ .../pojo/entity/CkStandard.java | 47 +++ .../pojo/params/AssessmentRecordParams.java | 54 ++++ .../params/CkGroupSaveOrUpdateParams.java | 33 ++ .../pojo/params/CkItemSaveOrUpdateParams.java | 33 ++ .../params/CkProjectSaveOrUpdateParams.java | 35 +++ .../params/CkStandardSaveOrUpdateParams.java | 31 ++ .../CkProjectPagerQueryParams.java | 15 + .../pojo/vo/AssessmentCriteriaRuleVo.java | 57 ++++ .../pojo/vo/CkProjectDetailTableVo.java | 39 +++ .../pojo/vo/CkProjectPagerVo.java | 31 ++ .../service/AssessmentCriteriaService.java | 95 ++++++ .../CkAssessmentRecordDetailsService.java | 13 + .../service/CkAssessmentRecordService.java | 13 + .../service/CkGroupService.java | 13 + .../service/CkItemService.java | 13 + .../service/CkProjectService.java | 13 + .../service/CkStandardService.java | 13 + .../impl/AssessmentCriteriaServiceImpl.java | 215 +++++++++++++ .../CkAssessmentRecordDetailsServiceImpl.java | 17 ++ .../impl/CkAssessmentRecordServiceImpl.java | 17 ++ .../service/impl/CkGroupServiceImpl.java | 17 ++ .../service/impl/CkItemServiceImpl.java | 17 ++ .../service/impl/CkProjectServiceImpl.java | 17 ++ .../service/impl/CkStandardServiceImpl.java | 17 ++ .../pojo/entity/EnterprisesUnit.java | 7 + .../EnterprisesUnitSaveOrUpdateParams.java | 5 + .../pojo/vo/EnterprisesUnitPagerVo.java | 4 + .../controller/PoliceIndexController.java | 16 + .../pojo/vo/IndexDataStatisticsVo.java | 21 ++ .../pojo/vo/IndexServiceProjectListVo.java | 8 + .../miniProgram/service/MPoliceService.java | 18 ++ .../service/impl/MPoliceServiceImpl.java | 62 ++++ .../src/main/resources/conf/log4j2.xml | 3 + .../main/resources/mapper/CkProjectMapper.xml | 37 +++ .../resources/mapper/ServiceProjectMapper.xml | 2 + superManagement/.env.development | 4 + superManagement/.env.production | 4 + superManagement/package.json | 2 + .../src/components/aMap/MapContainer.vue | 57 ++++ .../src/components/layout/MenuItem.vue | 1 - .../tree/AdministrativeDivisionTree.vue | 14 +- superManagement/src/config/dict.ts | 2 + superManagement/src/config/index.ts | 31 +- superManagement/src/main.ts | 2 + superManagement/src/router/staticRouters.ts | 46 ++- .../src/types/components/tree/index.ts | 7 + superManagement/src/types/config/index.ts | 1 + .../unitManage/police/assessmentCriteria.ts | 90 ++++++ .../unitManage/{ => police}/policeUnit.ts | 3 + superManagement/src/utils/aMapUtil.ts | 18 ++ .../src/views/data/dataOverview.vue | 13 + superManagement/src/views/test.vue | 44 ++- .../police/assessmentCriteria/index.ts | 188 ++++++++++++ .../police/assessmentCriteria/index.vue | 284 ++++++++++++++++++ .../unitManage/police/unitManage/index.tsx | 226 ++++++++++++++ .../unitManage/police/unitManage/index.vue | 136 +++++++++ .../unitManage/index.vue.bak} | 0 superManagement/src/views/unitManage/test.vue | 11 - superManagement/src/vite-env.d.ts | 4 + 75 files changed, 2756 insertions(+), 54 deletions(-) create mode 100644 policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java create mode 100644 policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml create mode 100644 superManagement/src/components/aMap/MapContainer.vue create mode 100644 superManagement/src/types/components/tree/index.ts create mode 100644 superManagement/src/types/views/unitManage/police/assessmentCriteria.ts rename superManagement/src/types/views/unitManage/{ => police}/policeUnit.ts (97%) create mode 100644 superManagement/src/utils/aMapUtil.ts create mode 100644 superManagement/src/views/data/dataOverview.vue create mode 100644 superManagement/src/views/unitManage/police/assessmentCriteria/index.ts create mode 100644 superManagement/src/views/unitManage/police/assessmentCriteria/index.vue create mode 100644 superManagement/src/views/unitManage/police/unitManage/index.tsx create mode 100644 superManagement/src/views/unitManage/police/unitManage/index.vue rename superManagement/src/views/unitManage/{policeUnit/index.vue => police/unitManage/index.vue.bak} (100%) delete mode 100644 superManagement/src/views/unitManage/test.vue diff --git a/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java index 4621a12..ccac842 100644 --- a/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java +++ b/policeSecurityServer/src/main/java/com/changhu/common/annotation/CheckUserType.java @@ -23,5 +23,5 @@ public @interface CheckUserType { /** * 需要的客户端类型 */ - UserType[] userTypes(); + UserType[] userTypes() default {}; } diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java new file mode 100644 index 0000000..a45370a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/EnterprisesUnitType.java @@ -0,0 +1,25 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author 20252 + * @createTime 2024/11/5 下午4:22 + * @desc EnterprisesUnitType... + */ +@Getter +@AllArgsConstructor +public enum EnterprisesUnitType implements BaseEnum, IEnum { + + school("school", "学校"), + hospital("hospital", "医院"), + community("community", "社区/小区"), + bank("bank", "银行"), + ; + + private final String value; + private final String label; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java new file mode 100644 index 0000000..abdc606 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/db/enums/SelectType.java @@ -0,0 +1,25 @@ +package com.changhu.common.db.enums; + +import com.baomidou.mybatisplus.annotation.IEnum; +import com.changhu.common.db.BaseEnum; +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * author: luozhun + * desc: 单选或多选 + * createTime: 2023/8/16 17:39 + */ +@Getter +@AllArgsConstructor +public enum SelectType implements BaseEnum, IEnum { + + RADIO("radio", "单选"), + MULTIPLE("multiple", "多选"), + ; + + private final String value; + private final String label; + +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java index 37790bb..7205ccb 100644 --- a/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java +++ b/policeSecurityServer/src/main/java/com/changhu/enums/handler/ManagementSecurityUnitLogin.java @@ -42,7 +42,7 @@ public class ManagementSecurityUnitLogin extends AbstractLoginHandler { .or() .eq(ManagementSecurityUnitUser::getTelephone, accountOrTelephone) .oneOpt() - .orElseThrow(() -> new MessageException(ResultCode.ERROR)); + .orElseThrow(() -> new MessageException(ResultCode.USER_NOT_FOUND)); //判断用户是否禁用 if (managementSecurityUnitUser.getIsEnable().equals(IsEnable.FALSE)) { diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java new file mode 100644 index 0000000..8024a93 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/controller/AssessmentCriteriaController.java @@ -0,0 +1,134 @@ +package com.changhu.module.assessmentCriteria.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.annotation.CheckUserType; +import com.changhu.common.annotation.JsonBody; +import com.changhu.common.annotation.UserType; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.module.assessmentCriteria.service.AssessmentCriteriaService; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:02 + * @desc AssessmentCriteriaController... + */ +@Tag(name = "考核标准") +@JsonBody +@RequestMapping("/assessmentCriteria") +@CheckUserType(userTypes = UserType.MANAGEMENT_SUPER) +public class AssessmentCriteriaController { + + @Autowired + private AssessmentCriteriaService assessmentCriteriaService; + + @Operation(summary = "根据类型获取考核项目列表") + @GetMapping("/ckProjectListByType") + @CheckUserType(value = false) + public List> ckProjectListByType(@RequestParam EnterprisesUnitType type) { + return assessmentCriteriaService.assessmentCriteriaListByType(type); + } + + @Operation(summary = "根据考核项目获取考核规则") + @GetMapping("/assessmentCriteriaRulesByCkProjectId") + @CheckUserType(value = false) + public List assessmentCriteriaRulesByCkProjectId(@RequestParam Long ckProjectId) { + return assessmentCriteriaService.assessmentCriteriaRulesByCkProjectId(ckProjectId); + } + + @Operation(summary = "提交考核记录") + @PostMapping("/submitAssessmentRecord") + @CheckUserType(value = false) + public void submitAssessmentRecord(@Validated @RequestBody AssessmentRecordParams params) { + assessmentCriteriaService.submitAssessmentRecord(params); + } + + @Operation(summary = "考核项目分页查询") + @PostMapping("/ckProjectPagerVoPager") + public Page ckProjectPagerVoPager(@RequestBody PageParams queryParams) { + return assessmentCriteriaService.ckProjectPagerVoPager(queryParams); + } + + @Operation(summary = "新增或修改考核项目") + @PostMapping("/saveOrUpdateCkProject") + public void saveOrUpdateCkProject(@Valid @RequestBody CkProjectSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkProject(params); + } + + @Operation(summary = "删除考核项目") + @DeleteMapping("/deleteCkProjectById") + public void deleteCkProjectById(@RequestParam Long ckProjectId) { + assessmentCriteriaService.deleteCkProjectById(ckProjectId); + } + + @Operation(summary = "考核项目详情") + @GetMapping("/ckProjectDetail") + public List ckProjectDetail(@RequestParam Long ckProjectId) { + return assessmentCriteriaService.ckProjectDetail(ckProjectId); + } + + @Operation(summary = "新增或修改考核分组") + @PostMapping("/saveOrUpdateCkGroup") + public void saveOrUpdateCkGroup(@Valid @RequestBody CkGroupSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkGroup(params); + } + + @Operation(summary = "新增或修改考核项") + @PostMapping("/saveOrUpdateCkItem") + public void saveOrUpdateCkItem(@Valid @RequestBody CkItemSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkItem(params); + } + + @Operation(summary = "新增或修改考核标准") + @PostMapping("/saveOrUpdateCkStandard") + public void saveOrUpdateCkStandard(@Valid @RequestBody CkStandardSaveOrUpdateParams params) { + assessmentCriteriaService.saveOrUpdateCkStandard(params); + } + + @Operation(summary = "删除考核分组") + @DeleteMapping("/deleteCkGroupById") + public void deleteCkGroupById(@RequestParam Long ckGroupId) { + boolean b = Db.removeById(ckGroupId, CkGroup.class); + if (!b) { + throw new MessageException(); + } + } + + @Operation(summary = "删除考核项") + @DeleteMapping("/deleteCkItemById") + public void deleteCkItemById(@RequestParam Long ckItemId) { + boolean b = Db.removeById(ckItemId, CkItem.class); + if (!b) { + throw new MessageException(); + } + } + + @Operation(summary = "删除考核标准") + @DeleteMapping("/deleteCkStandardById") + public void deleteCkStandardById(@RequestParam Long ckStandardId) { + boolean b = Db.removeById(ckStandardId, CkStandard.class); + if (!b) { + throw new MessageException(); + } + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java new file mode 100644 index 0000000..a3d91bc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordDetailsMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_assessment_record_details (考核记录明细) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkAssessmentRecordDetailsMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java new file mode 100644 index 0000000..36dea56 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkAssessmentRecordMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_assessment_record (考核记录) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkAssessmentRecordMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java new file mode 100644 index 0000000..eb83633 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkGroupMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_group (考核组) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkGroupMapper extends BaseMapper { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java new file mode 100644 index 0000000..027c61d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkItemMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_item (分组内的考核项) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkItemMapper extends BaseMapper{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java new file mode 100644 index 0000000..0827f55 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkProjectMapper.java @@ -0,0 +1,39 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * ck_project (考核项目) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkProjectMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页参数 + * @param params 查询参数 + * @return 分页数据 + */ + Page pager(@Param("page") Page page, + @Param("params") CkProjectPagerQueryParams params); + + /** + * 考核项目详情 + * + * @param ckProjectId 考核项目id + * @return 详情 + */ + List ckProjectDetail(@Param("ckProjectId") Long ckProjectId); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java new file mode 100644 index 0000000..fa97775 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/mapper/CkStandardMapper.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import org.apache.ibatis.annotations.Mapper; + +/** + * ck_standard (扣分标准) 固化类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Mapper +public interface CkStandardMapper extends BaseMapper{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java new file mode 100644 index 0000000..bc8ee3d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecord.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 考核记录 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkAssessmentRecord extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 企事业单位id + */ + private Long enterprisesUnitId; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核人员签字 + */ + private String assessmentUserSignature; + + /** + * 被考核单位人员签字 + */ + private String byAssessmentEnterprisesUnitUserSignature; + + /** + * 考核备注 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java new file mode 100644 index 0000000..7b99f6c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkAssessmentRecordDetails.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 考核记录明细 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkAssessmentRecordDetails extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核记录id + */ + private Long ckAssessmentRecordId; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核分组id + */ + private Long ckGroupId; + + /** + * 考核项id + */ + private Long ckItemId; + + /** + * 考核标准id + */ + private Long ckStandardId; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java new file mode 100644 index 0000000..4b2e86d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkGroup.java @@ -0,0 +1,52 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 考核组 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkGroup extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项目id + */ + private Long ckProjectId; + + /** + * 考核组名称 + */ + private String name; + + /** + * 总分 + */ + private Integer totalScore; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java new file mode 100644 index 0000000..f969bd6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkItem.java @@ -0,0 +1,53 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.common.db.enums.SelectType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 分组内的考核项 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkItem extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核组id + */ + private Long ckGroupId; + + /** + * 考核项名称 + */ + private String name; + + /** + * 单选或多选 + */ + private SelectType type; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java new file mode 100644 index 0000000..f9f1bb3 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkProject.java @@ -0,0 +1,53 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 考核项目 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkProject extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项目名字 + */ + private String name; + + /** + * 类型(对应企事业单位类型) + */ + private EnterprisesUnitType type; + + /** + * 总分 + */ + private Integer totalScore; + + /** + * 备注信息 + */ + private String remark; + + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java new file mode 100644 index 0000000..1a561a2 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/entity/CkStandard.java @@ -0,0 +1,47 @@ +package com.changhu.module.assessmentCriteria.pojo.entity; + +import java.io.Serial; +import java.io.Serializable; + +import com.changhu.common.db.enums.SelectType; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import lombok.Data; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.EqualsAndHashCode; +import com.baomidou.mybatisplus.annotation.TableName; + + +/** + * 扣分标准 实体类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@SuperBuilder +@EqualsAndHashCode(callSuper = true) +@TableName(autoResultMap = true) +public class CkStandard extends BaseEntity implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 考核项id + */ + private Long ckItemId; + + /** + * 条件 + */ + private String name; + + /** + * 扣多少分 + */ + private Double deductionPoints; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java new file mode 100644 index 0000000..af66d88 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/AssessmentRecordParams.java @@ -0,0 +1,54 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/7 上午11:15 + * @desc AssessmentRecordParams... + */ +@Data +public class AssessmentRecordParams { + @Schema(description = "企事业单位id") + @NotNull(message = "被考核单位不能为空") + private Long enterprisesUnitId; + + @Schema(description = "考核项目") + @NotNull(message = "考核项目不能为空") + private Long ckProjectId; + + @Schema(description = "考核人员签字") + @NotEmpty(message = "考核人员需签字") + private String assessmentUserSignature; + @Schema(description = "被考核单位人员签字") + @NotEmpty(message = "被考核单位需人员签字") + private String byAssessmentEnterprisesUnitUserSignature; + + @Schema(description = "考核备注") + private String remark; + + @Valid + @Schema(description = "考核记录详情") + private List assessmentRecordDetails; + + @Data + public static class RecordDetailParams { + @NotNull(message = "考核分组不能为空") + @Schema(description = "考核分组id") + private Long ckGroupId; + + @NotNull(message = "考核项不能为空") + @Schema(description = "考核项id") + private Long ckItemId; + + @NotNull(message = "考核标准不能为空") + @Schema(description = "考核标准id") + private Long ckStandardId; + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java new file mode 100644 index 0000000..d0e464c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkGroupSaveOrUpdateParams.java @@ -0,0 +1,33 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:31 + * @desc CkProjectSaveOrUpdateParams... + */ +@Data +public class CkGroupSaveOrUpdateParams { + @Schema(description = "考核分组id") + private Long snowFlakeId; + + @Schema(description = "考核项目id") + @NotNull(message = "所属考核项目不能为空") + private Long ckProjectId; + + @NotBlank(message = "考核组名不能为空") + @Schema(description = "考核组名称") + private String name; + + @NotNull(message = "考核组分数不能为空") + @Schema(description = "考核组总分") + private Integer totalScore; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java new file mode 100644 index 0000000..9f9868e --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkItemSaveOrUpdateParams.java @@ -0,0 +1,33 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午11:51 + * @desc CkItemSaveOrUpdateParams... + */ +@Data +public class CkItemSaveOrUpdateParams { + @Schema(description = "id") + private Long snowFlakeId; + + @NotNull(message = "考核组不能为空") + @Schema(description = "考核组id") + private Long ckGroupId; + + @NotBlank(message = "考核项名称不能为空") + @Schema(description = "考核项名称") + private String name; + + @NotNull(message = "组件类型不能为空") + @Schema(description = "组件类型") + private SelectType type; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java new file mode 100644 index 0000000..fb01afa --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkProjectSaveOrUpdateParams.java @@ -0,0 +1,35 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:31 + * @desc CkProjectSaveOrUpdateParams... + */ +@Data +public class CkProjectSaveOrUpdateParams { + @Schema(description = "考核项目id") + private Long snowFlakeId; + + @NotBlank(message = "考核项目名不能为空") + @Schema(description = "考核项目名称") + private String name; + + @NotNull(message = "单位类型不能为空") + @Schema(description = "对应企事业单位类型") + private EnterprisesUnitType type; + + @NotNull(message = "考核分数不能为空") + @Schema(description = "考核总分") + private Integer totalScore; + + @Schema(description = "备注") + private String remark; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java new file mode 100644 index 0000000..9923114 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/params/CkStandardSaveOrUpdateParams.java @@ -0,0 +1,31 @@ +package com.changhu.module.assessmentCriteria.pojo.params; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 下午2:50 + * @desc CkStandardSaveOrUpdateParams... + */ +@Data +public class CkStandardSaveOrUpdateParams { + @Schema(description = "考核标准id") + private Long snowFlakeId; + + @NotNull + @Schema(description = "考核项id") + private Long ckItemId; + + @NotBlank(message = "标准名不能为空") + @Schema(description = "标准名") + private String name; + + @NotNull(message = "扣分值不能为空") + @Schema(description = "扣分值") + private Double deductionPoints; + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java new file mode 100644 index 0000000..30b42d7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/queryParams/CkProjectPagerQueryParams.java @@ -0,0 +1,15 @@ +package com.changhu.module.assessmentCriteria.pojo.queryParams; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:09 + * @desc CkProjectPagerQueryParams... + */ +@Data +public class CkProjectPagerQueryParams { + private String name; + private EnterprisesUnitType type; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java new file mode 100644 index 0000000..8295151 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/AssessmentCriteriaRuleVo.java @@ -0,0 +1,57 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/7 上午10:00 + * @desc 考核标准规则 + */ +@Data +public class AssessmentCriteriaRuleVo { + @Schema(description = "考核组id") + private Long snowFlakeId; + @Schema(description = "考核组名称") + private String name; + @Schema(description = "考核组总成绩") + private Integer totalScore; + @Schema(description = "考核组备注") + private String remark; + + @Schema(description = "考核项") + private List itemList; + + @Data + public static class Item { + @Schema(description = "考核项id") + private Long snowFlakeId; + @Schema(description = "考核分组id") + private Long ckGroupId; + @Schema(description = "考核项名称") + private String name; + @Schema(description = "考核项组件类型") + private SelectType type; + @Schema(description = "考核项备注") + private String remark; + + @Schema(description = "考核标准") + private List standardList; + } + + @Data + public static class Standard { + @Schema(description = "考核标准id") + private Long snowFlakeId; + @Schema(description = "考核项id") + private Long ckItemId; + @Schema(description = "考核标准名字") + private String name; + @Schema(description = "扣分值") + private Double deductionPoints; + } + +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java new file mode 100644 index 0000000..c83b28f --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectDetailTableVo.java @@ -0,0 +1,39 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.SelectType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/6 上午11:03 + * @desc CkProjectDetailTableVo... + */ +@Data +public class CkProjectDetailTableVo { + + @Schema(description = "考核分组id") + private Long ckGroupId; + @Schema(description = "考核分组名字") + private String groupName; + @Schema(description = "考核分组总分") + private Integer groupTotalScore; + @Schema(description = "考核分组备注") + private String groupRemark; + + @Schema(description = "考核项id") + private Long ckItemId; + @Schema(description = "考核项名字") + private String itemName; + @Schema(description = "组件类型") + private SelectType type; + @Schema(description = "考核项备注") + private String itemRemark; + + @Schema(description = "考核标准id") + private Long ckStandardId; + @Schema(description = "考核标准") + private String standardName; + @Schema(description = "扣分数") + private Double deductionPoints; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java new file mode 100644 index 0000000..43589d1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/pojo/vo/CkProjectPagerVo.java @@ -0,0 +1,31 @@ +package com.changhu.module.assessmentCriteria.pojo.vo; + +import com.changhu.common.db.enums.EnterprisesUnitType; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:05 + * @desc CkProjectPagerVo... + */ +@Data +public class CkProjectPagerVo { + + @Schema(description = "考核项目id") + private Long snowFlakeId; + @Schema(description = "考核项目名称") + private String name; + @Schema(description = "对应企事业单位类型") + private EnterprisesUnitType type; + @Schema(description = "考核总分") + private Integer totalScore; + @Schema(description = "备注") + private String remark; + @Schema(description = "创建时间") + private LocalDateTime createTime; + @Schema(description = "创建人名字") + private String createUserName; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java new file mode 100644 index 0000000..d752efa --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/AssessmentCriteriaService.java @@ -0,0 +1,95 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.support.mybatisplus.pojo.params.PageParams; + +import java.util.List; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:07 + * @desc AssessmentCriteriaService... + */ +public interface AssessmentCriteriaService { + + /** + * 根据类型获取考核标准列表 + * + * @param type 类型 + * @return 结果 + */ + List> assessmentCriteriaListByType(EnterprisesUnitType type); + + /** + * 根据考核项目获取考核规则 + * + * @param ckProjectId 考核项目id + * @return 结果 + */ + List assessmentCriteriaRulesByCkProjectId(Long ckProjectId); + + /** + * 考核项目分页查询 + * + * @param queryParams 查询参数 + * @return 查询结果 + */ + Page ckProjectPagerVoPager(PageParams queryParams); + + /** + * 新增或修改考核项目 + * + * @param params 参数 + */ + void saveOrUpdateCkProject(CkProjectSaveOrUpdateParams params); + + /** + * 删除考核项目 + * + * @param ckProjectId 考核项目id + */ + void deleteCkProjectById(Long ckProjectId); + + /** + * 考核项目详情 + * + * @param ckProjectId 考核项目id + * @return 结果 + */ + List ckProjectDetail(Long ckProjectId); + + /** + * 新增或修改考核分组 + * + * @param params 参数 + */ + void saveOrUpdateCkGroup(CkGroupSaveOrUpdateParams params); + + /** + * 新增或修改考核项 + * + * @param params 参数 + */ + void saveOrUpdateCkItem(CkItemSaveOrUpdateParams params); + + /** + * 新增或修改考核标准 + * + * @param params 参数 + */ + void saveOrUpdateCkStandard(CkStandardSaveOrUpdateParams params); + + /** + * 提交考核记录 + * + * @param params 参数 + */ + void submitAssessmentRecord(AssessmentRecordParams params); +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java new file mode 100644 index 0000000..03e198c --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordDetailsService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; + +/** + * ck_assessment_record_details (考核记录明细) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkAssessmentRecordDetailsService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java new file mode 100644 index 0000000..276cf04 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkAssessmentRecordService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; + +/** + * ck_assessment_record (考核记录) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkAssessmentRecordService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java new file mode 100644 index 0000000..db87089 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkGroupService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; + +/** + * ck_group (考核组) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkGroupService extends IService{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java new file mode 100644 index 0000000..4cc3fba --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkItemService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; + +/** + * ck_item (分组内的考核项) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkItemService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java new file mode 100644 index 0000000..0357d50 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkProjectService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; + +/** + * ck_project (考核项目) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkProjectService extends IService{ + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java new file mode 100644 index 0000000..12559a6 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/CkStandardService.java @@ -0,0 +1,13 @@ +package com.changhu.module.assessmentCriteria.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; + +/** + * ck_standard (扣分标准) 服务类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +public interface CkStandardService extends IService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java new file mode 100644 index 0000000..7656390 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/AssessmentCriteriaServiceImpl.java @@ -0,0 +1,215 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.changhu.common.db.enums.SelectType; + +import com.changhu.common.utils.SnowFlakeIdUtil; +import com.changhu.module.assessmentCriteria.pojo.entity.*; +import com.changhu.module.assessmentCriteria.pojo.params.*; +import com.google.common.collect.Lists; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.db.enums.EnterprisesUnitType; +import com.changhu.common.exception.MessageException; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.assessmentCriteria.mapper.CkProjectMapper; +import com.changhu.module.assessmentCriteria.pojo.queryParams.CkProjectPagerQueryParams; +import com.changhu.module.assessmentCriteria.pojo.vo.AssessmentCriteriaRuleVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectDetailTableVo; +import com.changhu.module.assessmentCriteria.pojo.vo.CkProjectPagerVo; +import com.changhu.module.assessmentCriteria.service.AssessmentCriteriaService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; +import com.changhu.support.mybatisplus.pojo.params.PageParams; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author 20252 + * @createTime 2024/11/6 上午10:08 + * @desc AssessmentCriteriaServiceImpl... + */ +@Service +public class AssessmentCriteriaServiceImpl implements AssessmentCriteriaService { + + @Autowired + private CkProjectMapper ckProjectMapper; + + @Override + public List> assessmentCriteriaListByType(EnterprisesUnitType type) { + return Db.lambdaQuery(CkProject.class).eq(CkProject::getType, type).list() + .stream() + .map(e -> SelectNodeVo.builder() + .value(e.getSnowFlakeId()) + .label(e.getName()) + .extData(Dict.create() + .set(LambdaUtil.getFieldName(CkProject::getRemark), e.getRemark()) + .set(LambdaUtil.getFieldName(CkProject::getTotalScore), e.getTotalScore()) + .set(LambdaUtil.getFieldName(CkProject::getType), e.getType()) + .set(LambdaUtil.getFieldName(CkProject::getCreateTime), e.getCreateTime()) + ) + .build()) + .toList(); + } + + @Override + public List assessmentCriteriaRulesByCkProjectId(Long ckProjectId) { + //根据考核项目拿到考核分组 + List groupList = Db.lambdaQuery(CkGroup.class) + .eq(CkGroup::getCkProjectId, ckProjectId) + .orderByAsc(BaseEntity::getCreateTime) + .list() + .stream() + .map(e -> { + AssessmentCriteriaRuleVo assessmentCriteriaRuleVo = new AssessmentCriteriaRuleVo(); + assessmentCriteriaRuleVo.setSnowFlakeId(e.getSnowFlakeId()); + assessmentCriteriaRuleVo.setName(e.getName()); + assessmentCriteriaRuleVo.setTotalScore(e.getTotalScore()); + assessmentCriteriaRuleVo.setRemark(e.getRemark()); + return assessmentCriteriaRuleVo; + }).toList(); + if (groupList.isEmpty()) { + throw new MessageException("该考核项目内暂未制定规则"); + } + //根据考核分组拿到考核项 + List itemList = Db.lambdaQuery(CkItem.class) + .in(CkItem::getCkGroupId, groupList.stream().map(AssessmentCriteriaRuleVo::getSnowFlakeId).toList()) + .orderByAsc(BaseEntity::getCreateTime) + .list() + .stream() + .map(e -> { + AssessmentCriteriaRuleVo.Item item = new AssessmentCriteriaRuleVo.Item(); + item.setSnowFlakeId(e.getSnowFlakeId()); + item.setCkGroupId(e.getCkGroupId()); + item.setName(e.getName()); + item.setType(e.getType()); + item.setRemark(e.getRemark()); + return item; + }).toList(); + if (itemList.isEmpty()) { + throw new MessageException("该考核项目内未制定考核项"); + } + //根据考核项拿到考核标准 + List standardList = Db.lambdaQuery(CkStandard.class) + .in(CkStandard::getCkItemId, itemList.stream().map(AssessmentCriteriaRuleVo.Item::getSnowFlakeId).toList()) + .orderByAsc(BaseEntity::getCreateTime) + .list().stream() + .map(e -> { + AssessmentCriteriaRuleVo.Standard standard = new AssessmentCriteriaRuleVo.Standard(); + standard.setSnowFlakeId(e.getSnowFlakeId()); + standard.setCkItemId(e.getCkItemId()); + standard.setName(e.getName()); + standard.setDeductionPoints(e.getDeductionPoints()); + return standard; + }).toList(); + if (standardList.isEmpty()) { + throw new MessageException("该考核项目内未制定考核标准"); + } + //先将考核标准塞到考核项内 + Map> standardMap = standardList.stream().collect(Collectors.groupingBy(AssessmentCriteriaRuleVo.Standard::getCkItemId)); + itemList.forEach(e -> e.setStandardList(standardMap.get(e.getSnowFlakeId()))); + //将考核项塞到考核分组内 + Map> itemMap = itemList.stream().collect(Collectors.groupingBy(AssessmentCriteriaRuleVo.Item::getCkGroupId)); + groupList.forEach(e -> e.setItemList(itemMap.get(e.getSnowFlakeId()))); + + return groupList; + } + + @Override + public Page ckProjectPagerVoPager(PageParams queryParams) { + return ckProjectMapper.pager(queryParams.getPage(), queryParams.getParams()); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkProject(CkProjectSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkProject.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void deleteCkProjectById(Long ckProjectId) { + boolean b = Db.removeById(ckProjectId, CkProject.class); + if (!b) { + throw new MessageException(); + } + } + + @Override + public List ckProjectDetail(Long ckProjectId) { + return ckProjectMapper.ckProjectDetail(ckProjectId); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkGroup(CkGroupSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkGroup.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkItem(CkItemSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkItem.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void saveOrUpdateCkStandard(CkStandardSaveOrUpdateParams params) { + boolean b = Db.saveOrUpdate(BeanUtil.copyProperties(params, CkStandard.class)); + if (!b) { + throw new MessageException(); + } + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void submitAssessmentRecord(AssessmentRecordParams params) { + CkAssessmentRecord ckAssessmentRecord = CkAssessmentRecord.builder() + .snowFlakeId(SnowFlakeIdUtil.snowflakeId()) + .enterprisesUnitId(params.getEnterprisesUnitId()) + .ckProjectId(params.getCkProjectId()) + .assessmentUserSignature(params.getAssessmentUserSignature()) + .byAssessmentEnterprisesUnitUserSignature(params.getByAssessmentEnterprisesUnitUserSignature()) + .remark(params.getRemark()) + .build(); + //保存考核记录 + boolean save = Db.save(ckAssessmentRecord); + if (!save) { + throw new MessageException(); + } + List assessmentRecordDetails = params.getAssessmentRecordDetails(); + if (CollUtil.isEmpty(assessmentRecordDetails)) { + return; + } + //保存考核明细 + boolean b = Db.saveBatch(assessmentRecordDetails.stream() + .map(e -> CkAssessmentRecordDetails.builder() + .ckAssessmentRecordId(ckAssessmentRecord.getSnowFlakeId()) + .ckProjectId(ckAssessmentRecord.getCkProjectId()) + .ckGroupId(e.getCkGroupId()) + .ckItemId(e.getCkItemId()) + .ckStandardId(e.getCkStandardId()) + .build()) + .toList()); + if (!b) { + throw new MessageException(); + } + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java new file mode 100644 index 0000000..5b8e36a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordDetailsServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkAssessmentRecordDetailsMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecordDetails; +import com.changhu.module.assessmentCriteria.service.CkAssessmentRecordDetailsService; +import org.springframework.stereotype.Service; + +/** + * ck_assessment_record_details (考核记录明细) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkAssessmentRecordDetailsServiceImpl extends ServiceImpl implements CkAssessmentRecordDetailsService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java new file mode 100644 index 0000000..489e736 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkAssessmentRecordServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkAssessmentRecordMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkAssessmentRecord; +import com.changhu.module.assessmentCriteria.service.CkAssessmentRecordService; +import org.springframework.stereotype.Service; + +/** + * ck_assessment_record (考核记录) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkAssessmentRecordServiceImpl extends ServiceImpl implements CkAssessmentRecordService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java new file mode 100644 index 0000000..fb5e43b --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkGroupServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkGroupMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkGroup; +import com.changhu.module.assessmentCriteria.service.CkGroupService; +import org.springframework.stereotype.Service; + +/** + * ck_group (考核组) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkGroupServiceImpl extends ServiceImpl implements CkGroupService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java new file mode 100644 index 0000000..f89df12 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkItemServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkItemMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkItem; +import com.changhu.module.assessmentCriteria.service.CkItemService; +import org.springframework.stereotype.Service; + +/** + * ck_item (分组内的考核项) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkItemServiceImpl extends ServiceImpl implements CkItemService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java new file mode 100644 index 0000000..660fc01 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkProjectServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkProjectMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkProject; +import com.changhu.module.assessmentCriteria.service.CkProjectService; +import org.springframework.stereotype.Service; + +/** + * ck_project (考核项目) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkProjectServiceImpl extends ServiceImpl implements CkProjectService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java new file mode 100644 index 0000000..16d8dc1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/assessmentCriteria/service/impl/CkStandardServiceImpl.java @@ -0,0 +1,17 @@ +package com.changhu.module.assessmentCriteria.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.changhu.module.assessmentCriteria.mapper.CkStandardMapper; +import com.changhu.module.assessmentCriteria.pojo.entity.CkStandard; +import com.changhu.module.assessmentCriteria.service.CkStandardService; +import org.springframework.stereotype.Service; + +/** + * ck_standard (扣分标准) 服务实现类 + * author: luozhun + * desc 由groovy脚本自动生成 + */ +@Service +public class CkStandardServiceImpl extends ServiceImpl implements CkStandardService { + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java index 8569927..b5f5b6a 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java @@ -3,6 +3,7 @@ package com.changhu.module.management.pojo.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler; +import com.changhu.common.db.enums.EnterprisesUnitType; import com.changhu.module.management.pojo.model.ContactPersonInfo; import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; import lombok.AllArgsConstructor; @@ -41,6 +42,12 @@ public class EnterprisesUnit extends BaseEntity implements Serializable { */ private String name; + + /** + * 企事业单位类型 + */ + private EnterprisesUnitType type; + /** * 省 */ diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java index 94a6ed6..7751ec3 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java @@ -1,5 +1,6 @@ package com.changhu.module.management.pojo.params; +import com.changhu.common.db.enums.EnterprisesUnitType; import com.changhu.module.management.pojo.model.ContactPersonInfo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; @@ -28,6 +29,10 @@ public class EnterprisesUnitSaveOrUpdateParams { @NotBlank(message = "名称不能为空") private String name; + @Schema(description = "类型") + @NotNull(message = "类型不能为空") + private EnterprisesUnitType type; + @Schema(description = "行政区划编码") @NotEmpty(message = "行政区划不能为空") private List administrativeDivisionCodes; diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java index 29a3406..6fac384 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java @@ -1,5 +1,6 @@ package com.changhu.module.management.pojo.vo; +import com.changhu.common.db.enums.EnterprisesUnitType; import com.changhu.module.management.pojo.model.ContactPersonInfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -16,6 +17,9 @@ public class EnterprisesUnitPagerVo { @Schema(description = "名字") private String name; + @Schema(description = "类型") + private EnterprisesUnitType type; + @Schema(description = "公安单位id") private Long policeUnitId; diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java index 7c2c0bc..bc8af47 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/controller/PoliceIndexController.java @@ -3,6 +3,8 @@ package com.changhu.module.miniProgram.controller; import com.changhu.common.annotation.CheckUserType; import com.changhu.common.annotation.JsonBody; import com.changhu.common.annotation.UserType; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; import com.changhu.module.miniProgram.service.MPoliceService; import io.swagger.v3.oas.annotations.Operation; @@ -26,10 +28,24 @@ public class PoliceIndexController { @Autowired private MPoliceService policeIndexService; + @Operation(summary = "首页数据统计") + @GetMapping("/dataStatistics") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) + public IndexDataStatisticsVo dataStatistics() { + return policeIndexService.dataStatistics(); + } + @Operation(summary = "获取单位内的服务项目") @GetMapping("/getUnitServiceProjectList") @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) public List getUnitServiceProjectList() { return policeIndexService.getUnitServiceProjectList(); } + + @Operation(summary = "获取单位内的企事业单位列表") + @GetMapping("/getUnitEnterprisesUnitList") + @CheckUserType(userTypes = UserType.MINI_PROGRAM_POLICE) + public List> getUnitEnterprisesUnitList() { + return policeIndexService.getUnitEnterprisesUnitList(); + } } diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java new file mode 100644 index 0000000..5de0f7a --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexDataStatisticsVo.java @@ -0,0 +1,21 @@ +package com.changhu.module.miniProgram.pojo.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author 20252 + * @createTime 2024/11/7 下午2:23 + * @desc IndexDataStatisticsVo... + */ +@Data +public class IndexDataStatisticsVo { + @Schema(description = "企事业单位数量") + private Integer enterprisesUnitCount = 0; + @Schema(description = "服务项目数量") + private Integer serviceProjectCount = 0; + @Schema(description = "保安人员数量") + private Integer securityUserCount = 0; + @Schema(description = "无证保安人员数量") + private Integer noCardSecurityUserCount = 0; +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java index ec5e49d..c265925 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/pojo/vo/IndexServiceProjectListVo.java @@ -1,6 +1,7 @@ package com.changhu.module.miniProgram.pojo.vo; import cn.hutool.core.lang.Dict; +import com.changhu.common.db.enums.EnterprisesUnitType; import com.changhu.common.db.enums.IsOrNot; import com.changhu.common.db.enums.ServiceProjectType; import com.changhu.module.management.pojo.model.ContactPersonInfo; @@ -21,6 +22,8 @@ public class IndexServiceProjectListVo { private Long snowFlakeId; @Schema(description = "企事业单位名称") private String name; + @Schema(description = "单位类型") + private EnterprisesUnitType type; @Schema(description = "省编码") private String province; @@ -53,10 +56,15 @@ public class IndexServiceProjectListVo { static class ServiceProjectVo { @Schema(description = "服务项目id") private Long snowFlakeId; + @Schema(description = "保安单位id") private Long securityUnitId; + @Schema(description = "保安单位名字") + private String securityUnitName; + @Schema(description = "项目经理信息") private Dict projectManagerMiniProgramUserInfo; + @Schema(description = "服务项目名称") private String name; @Schema(description = "服务项目类型") diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java index 60954f9..43ed4ac 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/MPoliceService.java @@ -1,5 +1,7 @@ package com.changhu.module.miniProgram.service; +import com.changhu.common.pojo.vo.SelectNodeVo; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; import java.util.List; @@ -10,10 +12,26 @@ import java.util.List; * @desc MPoliceService... */ public interface MPoliceService { + + /** + * 首页数据统计 + * + * @return 首页数据统计 + */ + IndexDataStatisticsVo dataStatistics(); + /** * 获取单位内的服务项目 * * @return 服务项目 */ List getUnitServiceProjectList(); + + /** + * 获取单位内的企事业单位列表 + * + * @return 企事业单位列表 + */ + List> getUnitEnterprisesUnitList(); + } diff --git a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java index d8ec8b6..1877493 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/miniProgram/service/impl/MPoliceServiceImpl.java @@ -1,9 +1,18 @@ package com.changhu.module.miniProgram.service.impl; +import cn.hutool.core.lang.Dict; +import cn.hutool.core.lang.func.LambdaUtil; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.changhu.common.pojo.vo.SelectNodeVo; import com.changhu.common.utils.UserUtil; import com.changhu.module.management.mapper.ServiceProjectMapper; +import com.changhu.module.management.pojo.entity.EnterprisesUnit; +import com.changhu.module.management.pojo.entity.ServiceProject; +import com.changhu.module.miniProgram.pojo.entity.SecurityUser; +import com.changhu.module.miniProgram.pojo.vo.IndexDataStatisticsVo; import com.changhu.module.miniProgram.pojo.vo.IndexServiceProjectListVo; import com.changhu.module.miniProgram.service.MPoliceService; +import com.changhu.support.mybatisplus.pojo.entity.BaseEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,8 +29,61 @@ public class MPoliceServiceImpl implements MPoliceService { @Autowired private ServiceProjectMapper serviceProjectMapper; + @Override + public IndexDataStatisticsVo dataStatistics() { + Long unitId = UserUtil.getUnitId(); + IndexDataStatisticsVo indexDataStatisticsVo = new IndexDataStatisticsVo(); + List enterprisesUnitIds = Db.lambdaQuery(EnterprisesUnit.class) + .eq(EnterprisesUnit::getPoliceUnitId, unitId) + .list() + .stream().map(BaseEntity::getSnowFlakeId) + .toList(); + if (enterprisesUnitIds.isEmpty()) { + return indexDataStatisticsVo; + } + indexDataStatisticsVo.setEnterprisesUnitCount(enterprisesUnitIds.size()); + + List serviceProjectIds = Db.lambdaQuery(ServiceProject.class) + .in(ServiceProject::getEnterprisesUnitId, enterprisesUnitIds) + .list() + .stream() + .map(BaseEntity::getSnowFlakeId) + .toList(); + if (serviceProjectIds.isEmpty()) { + return indexDataStatisticsVo; + } + indexDataStatisticsVo.setServiceProjectCount(serviceProjectIds.size()); + + Long securityUserCount = Db.lambdaQuery(SecurityUser.class) + .in(SecurityUser::getServiceProjectId, serviceProjectIds) + .count(); + indexDataStatisticsVo.setSecurityUserCount(securityUserCount.intValue()); + + Long noCardSecurityUserCount = Db.lambdaQuery(SecurityUser.class) + .in(SecurityUser::getServiceProjectId, serviceProjectIds) + .isNull(SecurityUser::getSecurityNumber) + .count(); + indexDataStatisticsVo.setNoCardSecurityUserCount(noCardSecurityUserCount.intValue()); + + return indexDataStatisticsVo; + } + @Override public List getUnitServiceProjectList() { return serviceProjectMapper.getServiceProjectList(UserUtil.getUnitId(), null); } + + @Override + public List> getUnitEnterprisesUnitList() { + return Db.lambdaQuery(EnterprisesUnit.class) + .eq(EnterprisesUnit::getPoliceUnitId, UserUtil.getUnitId()) + .list() + .stream() + .map(item -> SelectNodeVo.builder() + .value(item.getSnowFlakeId()) + .label(item.getName()) + .extData(Dict.of(LambdaUtil.getFieldName(EnterprisesUnit::getType), item.getType())) + .build()) + .toList(); + } } diff --git a/policeSecurityServer/src/main/resources/conf/log4j2.xml b/policeSecurityServer/src/main/resources/conf/log4j2.xml index e08488c..4b6a1a2 100644 --- a/policeSecurityServer/src/main/resources/conf/log4j2.xml +++ b/policeSecurityServer/src/main/resources/conf/log4j2.xml @@ -131,6 +131,9 @@ + + + diff --git a/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml b/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml new file mode 100644 index 0000000..582f133 --- /dev/null +++ b/policeSecurityServer/src/main/resources/mapper/CkProjectMapper.xml @@ -0,0 +1,37 @@ + + + + + + \ No newline at end of file diff --git a/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml b/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml index dbe90f9..3a5505a 100644 --- a/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml +++ b/policeSecurityServer/src/main/resources/mapper/ServiceProjectMapper.xml @@ -49,6 +49,7 @@ JSON_ARRAYAGG(JSON_OBJECT( 'snowFlakeId', sp.snow_flake_id, 'securityUnitId',sp.security_unit_id, + 'securityUnitName',su.name, 'name', sp.name, 'type', sp.type, 'isRecruitSecurity', sp.is_recruit_security, @@ -65,6 +66,7 @@ 'remark', sp.remark)) as 'service_project_list' from enterprises_unit eu join service_project sp on eu.snow_flake_id = sp.enterprises_unit_id and sp.delete_flag = 0 + left 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 and mpu.delete_flag = 0 left join administrative_division ad1 on eu.province = ad1.code and ad1.delete_flag = 0 left join administrative_division ad2 on eu.city = ad2.code and ad2.delete_flag = 0 diff --git a/superManagement/.env.development b/superManagement/.env.development index 4d6d879..e416923 100644 --- a/superManagement/.env.development +++ b/superManagement/.env.development @@ -14,3 +14,7 @@ VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJps/EXxxSpEM1Ix4R # minio VITE_APP_MINIO_URL=http://118.253.177.137:9000 VITE_APP_MINIO_BUCKET=police-security-dev + +# 高德 +VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 +VITE_APP_GAODE_VERSION=2.0 diff --git a/superManagement/.env.production b/superManagement/.env.production index 71171e8..70b36e1 100644 --- a/superManagement/.env.production +++ b/superManagement/.env.production @@ -14,3 +14,7 @@ VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCpu1C3JHZ+Ng/eVVCZ # minio VITE_APP_MINIO_URL=https://www.hnjinglian.cn:9002 VITE_APP_MINIO_BUCKET=police-security + +# 高德 +VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 +VITE_APP_GAODE_VERSION=2.0 diff --git a/superManagement/package.json b/superManagement/package.json index 6a8d6e4..882b02e 100644 --- a/superManagement/package.json +++ b/superManagement/package.json @@ -10,6 +10,7 @@ "preview": "vite preview" }, "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", "@vueuse/core": "^11.0.3", "ant-design-vue": "^4.2.3", "axios": "^1.7.5", @@ -24,6 +25,7 @@ "vue-uuid": "^3.0.0" }, "devDependencies": { + "@amap/amap-jsapi-types": "^0.0.15", "@types/lodash-es": "^4.17.8", "@types/node": "^22.5.1", "@vitejs/plugin-vue": "^5.1.2", diff --git a/superManagement/src/components/aMap/MapContainer.vue b/superManagement/src/components/aMap/MapContainer.vue new file mode 100644 index 0000000..d637e87 --- /dev/null +++ b/superManagement/src/components/aMap/MapContainer.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/superManagement/src/components/layout/MenuItem.vue b/superManagement/src/components/layout/MenuItem.vue index feb26ca..6323222 100644 --- a/superManagement/src/components/layout/MenuItem.vue +++ b/superManagement/src/components/layout/MenuItem.vue @@ -19,7 +19,6 @@ > {{ item.title }} diff --git a/superManagement/src/components/tree/AdministrativeDivisionTree.vue b/superManagement/src/components/tree/AdministrativeDivisionTree.vue index c6a45f4..3822dfd 100644 --- a/superManagement/src/components/tree/AdministrativeDivisionTree.vue +++ b/superManagement/src/components/tree/AdministrativeDivisionTree.vue @@ -1,11 +1,9 @@ @@ -14,18 +12,14 @@ import api from "@/axios"; import {onMounted, ref} from "vue"; import {CascaderProps} from "ant-design-vue"; import {isEmpty} from "lodash-es"; +import {AdministrativeDivisionTreeProps} from "@/types/components/tree"; -withDefaults(defineProps<{ - placeholder?: string, - changeOnSelect?: boolean - allowClear?: boolean -}>(), { +const props = withDefaults(defineProps(), { placeholder: '请选择行政区划', changeOnSelect: true, - allowClear: true + allowClear: true, }) - const modelValue = defineModel('value', { default: [] }) diff --git a/superManagement/src/config/dict.ts b/superManagement/src/config/dict.ts index 7175c25..ed69da7 100644 --- a/superManagement/src/config/dict.ts +++ b/superManagement/src/config/dict.ts @@ -8,6 +8,8 @@ type DictType = | 'Sex' | 'ServiceProjectType' | 'MiniProgramUserIdentity' + | 'EnterprisesUnitType' + | 'SelectType' export const initDict = () => { api.get[]>>('/common/enums').then(resp => { diff --git a/superManagement/src/config/index.ts b/superManagement/src/config/index.ts index 3494115..93fcb7f 100644 --- a/superManagement/src/config/index.ts +++ b/superManagement/src/config/index.ts @@ -21,13 +21,23 @@ export const SYSTEM_MENUS: SystemMenu[] = [ type: 'dir', children: [ { - title: '公安单位', - name: 'policeUnit', - path: '/policeUnit', - type: 'menu', - // icon: 'icon-policeman-full', - // size: '16', - component: () => import('@/views/unitManage/policeUnit/index.vue') + title: '公安', + name: 'police', + path: '/police', + type: 'dir', + children: [{ + title: '单位管理', + name: 'policeUnitManage', + path: '/police/unitManage', + type: 'menu', + component: () => import('@/views/unitManage/police/unitManage/index.vue') + }, { + title: '考核标准', + name: 'policeAssessmentCriteria', + path: '/police/assessmentCriteria', + type: 'menu', + component: () => import('@/views/unitManage/police/assessmentCriteria/index.vue') + }] }, { title: '保安单位', name: 'securityUnit', @@ -36,5 +46,12 @@ export const SYSTEM_MENUS: SystemMenu[] = [ component: () => import('@/views/unitManage/securityUnit/index.vue') } ] + }, { + title: '数据总览', + name: 'dataOverview', + path: '/dataOverview', + type: 'menu', + isFull: true, + component: () => import('@/views/data/dataOverview.vue') } ] diff --git a/superManagement/src/main.ts b/superManagement/src/main.ts index fc498ba..27927ba 100644 --- a/superManagement/src/main.ts +++ b/superManagement/src/main.ts @@ -13,6 +13,8 @@ import router from "@/router"; // pinia stores import pinia from "@/stores"; import {initDict} from "@/config/dict.ts"; +//高德类型声明文件 +import "@amap/amap-jsapi-types"; initDict(); diff --git a/superManagement/src/router/staticRouters.ts b/superManagement/src/router/staticRouters.ts index 70c4ab1..a4e2afe 100644 --- a/superManagement/src/router/staticRouters.ts +++ b/superManagement/src/router/staticRouters.ts @@ -2,33 +2,47 @@ import {RouteRecordRaw} from "vue-router"; import {SYSTEM_MENUS} from "@/config"; import {SystemMenu} from "@/types/config"; +const routerClassify: Record<'layout' | 'full', RouteRecordRaw[]> = { + layout: [], + full: [] +} + /** * 提取菜单路由 */ -const extractMenuToRouter = (): RouteRecordRaw[] => { - const result: RouteRecordRaw[] = [] +const extractMenuToRouter = () => { const traverse = (data: SystemMenu[]) => { data.forEach(item => { if (item.type === 'dir' && item.children && item.children.length > 0) { traverse(item.children) } else { - result.push({ - path: item.path, - name: item.name, - meta: { - title: item.title - }, - component: item.component - } as RouteRecordRaw) + if (!item.isFull) { + routerClassify.layout.push({ + path: item.path, + name: item.name, + meta: { + title: item.title + }, + component: item.component + } as RouteRecordRaw) + } else { + routerClassify.full.push({ + path: item.path, + name: item.name, + meta: { + title: item.title + }, + component: item.component + } as RouteRecordRaw) + } } }) } - traverse(SYSTEM_MENUS) - - return result; } +extractMenuToRouter() + export const staticRouter: RouteRecordRaw[] = [ { path: '/login', @@ -45,8 +59,10 @@ export const staticRouter: RouteRecordRaw[] = [ name: 'layout', redirect: '/index', component: () => import("@/components/layout/Layout.vue"), - children: extractMenuToRouter() - }, { + children: routerClassify.layout + }, + ...routerClassify.full, + { path: '/test', name: 'test', component: () => import("@/views/test.vue"), diff --git a/superManagement/src/types/components/tree/index.ts b/superManagement/src/types/components/tree/index.ts new file mode 100644 index 0000000..8b14928 --- /dev/null +++ b/superManagement/src/types/components/tree/index.ts @@ -0,0 +1,7 @@ +export interface AdministrativeDivisionTreeProps { + placeholder?: string, + changeOnSelect?: boolean + allowClear?: boolean + onChange?: (value: (string | number[]), selectedOptions: TreeNodeVo[]) => void + displayRender?: (opt: { labels: string[], selectedOptions: TreeNodeVo[] }) => string +} diff --git a/superManagement/src/types/config/index.ts b/superManagement/src/types/config/index.ts index f81e2db..f9c23a8 100644 --- a/superManagement/src/types/config/index.ts +++ b/superManagement/src/types/config/index.ts @@ -4,6 +4,7 @@ export interface SystemMenu { type: 'dir' | 'menu'; title: string; path: string; + isFull?: boolean; name: string; icon?: string; diff --git a/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts b/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts new file mode 100644 index 0000000..206ea15 --- /dev/null +++ b/superManagement/src/types/views/unitManage/police/assessmentCriteria.ts @@ -0,0 +1,90 @@ +import {BaseTableRowRecord} from "@/types/components/table"; + +export interface CkProjectPagerVo extends BaseTableRowRecord { + name: string; + type: BaseEnum + totalScore: number + remark: string; +} + +export interface CkProjectPagerQueryParams { + name: string; + type: string +} + +export interface SaveOrUpdateCkProjectParams { + /*考核项目id */ + snowFlakeId?: string; + /*考核项目名称 */ + name: string; + /*对应企事业单位类型,可用值:school,hospital,community,bank */ + type: string; + /*考核总分 */ + totalScore: number; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkGroupParams { + /*考核分组id */ + snowFlakeId?: string; + /*考核项目id */ + ckProjectId?: string; + /*考核组名称 */ + name: string; + /*考核组总分 */ + totalScore: number; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkItemParams { + /*id */ + snowFlakeId?: string; + /*考核组id */ + ckGroupId: string; + /*考核项名称 */ + name: string; + /*组件类型,可用值:RADIO,MULTIPLE */ + type: string; + /*备注 */ + remark?: string; +} + +export interface SaveOrUpdateCkStandardParams { + /*考核标准id */ + snowFlakeId?: string; + /*考核项id */ + ckItemId: string; + /*标准名 */ + name: string; + /*扣分值 */ + deductionPoints: number; +} + +export interface CkProjectDetailRes { + /*考核分组id */ + ckGroupId: string; + groupRowSpan: number; + /*考核分组名字 */ + groupName: string; + /*考核分组总分 */ + groupTotalScore: number; + /*考核分组备注 */ + groupRemark: string; + /*考核项id */ + ckItemId: string; + itemRowSpan: number; + /*考核项名字 */ + itemName: string; + /*考核项备注 */ + itemRemark: string; + /*考核标准id */ + ckStandardId: string; + /*考核标准条件 */ + standardName: string; + /*扣分数 */ + deductionPoints: number; + /*选择类型,可用值:RADIO,MULTIPLE */ + type: BaseEnum; +} diff --git a/superManagement/src/types/views/unitManage/policeUnit.ts b/superManagement/src/types/views/unitManage/police/policeUnit.ts similarity index 97% rename from superManagement/src/types/views/unitManage/policeUnit.ts rename to superManagement/src/types/views/unitManage/police/policeUnit.ts index ce0e7ec..c3bdb3b 100644 --- a/superManagement/src/types/views/unitManage/policeUnit.ts +++ b/superManagement/src/types/views/unitManage/police/policeUnit.ts @@ -55,6 +55,7 @@ export interface EnterprisesUnitPagerQueryParams { export interface EnterprisesUnitPagerVo extends BaseTableRowRecord { /** 名字 **/ name?: string; + type: BaseEnum /** 公安单位id **/ policeUnitId: string; /** 省编码 **/ @@ -91,6 +92,8 @@ export interface EnterprisesUnitSaveOrUpdateParams { policeUnitId: string; /** 名称 **/ name: string; + /** 类型 **/ + type: string; /** 行政区划编码 **/ administrativeDivisionCodes: string[]; /** 详细地址 **/ diff --git a/superManagement/src/utils/aMapUtil.ts b/superManagement/src/utils/aMapUtil.ts new file mode 100644 index 0000000..574e061 --- /dev/null +++ b/superManagement/src/utils/aMapUtil.ts @@ -0,0 +1,18 @@ +import AMapLoader from "@amap/amap-jsapi-loader"; + +type Amap = typeof AMap; +export const initMap = (plugins?: string[]): Promise => new Promise((resolve, reject) => { + //@ts-ignore + window._AMapSecurityConfig = { + securityJsCode: '432125a0f8d8cad2dac38b77d6f6728f' + } + AMapLoader.load({ + key: __APP_ENV.VITE_APP_GAODE_KEY, + version: __APP_ENV.VITE_APP_GAODE_VERSION, + plugins + }).then((AMap: Amap) => { + resolve(AMap) + }).catch(err => { + reject(err) + }) +}) diff --git a/superManagement/src/views/data/dataOverview.vue b/superManagement/src/views/data/dataOverview.vue new file mode 100644 index 0000000..2383d4d --- /dev/null +++ b/superManagement/src/views/data/dataOverview.vue @@ -0,0 +1,13 @@ + + + + + diff --git a/superManagement/src/views/test.vue b/superManagement/src/views/test.vue index 0ada657..3b996ad 100644 --- a/superManagement/src/views/test.vue +++ b/superManagement/src/views/test.vue @@ -1,13 +1,41 @@ + - - diff --git a/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts b/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts new file mode 100644 index 0000000..beb5e85 --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentCriteria/index.ts @@ -0,0 +1,188 @@ +import { + CkProjectDetailRes, + SaveOrUpdateCkGroupParams, + SaveOrUpdateCkItemParams, SaveOrUpdateCkProjectParams, SaveOrUpdateCkStandardParams +} from "@/types/views/unitManage/police/assessmentCriteria.ts"; +import {deleteDataModal, submitSimpleFormModal} from "@/components/tsx/ModalPro.tsx"; +import api from "@/axios"; +import {message} from "ant-design-vue"; +import {dictSelectNodes} from "@/config/dict.ts"; + +export const saveOrUpdateCkProject = (params: SaveOrUpdateCkProjectParams = { + name: '', + totalScore: 100, + remark: '', + type: 'school' +}, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核项目', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '考核项目名称', + required: true + }, + type: { + type: 'select', + label: '考核类型', + required: true, + options: dictSelectNodes('EnterprisesUnitType') + }, + totalScore: { + type: 'inputNumber', + label: '总分', + required: true, + componentsProps: { + precision: 0 + } + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkProject', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const deleteCkProjectById = (name: string, ckProjectId: string, callback: Function) => { + deleteDataModal(name, async () => { + const resp = await api.delete('/assessmentCriteria/deleteCkProjectById', { + ckProjectId + }) + message.success(resp.message) + callback && callback(); + }) +} + +export const ckProjectDetail = async (ckProjectId: string): Promise => { + const {data} = await api.get('/assessmentCriteria/ckProjectDetail', {ckProjectId}) + + const groupRowSpan: Record = {} + const itemRowSpan: Record = {} + + data.forEach((item, index) => { + //如果第一次没有值 + if (item.ckGroupId) { + if (!groupRowSpan[item.ckGroupId]) { + groupRowSpan[item.ckGroupId] = {count: 1, firstIndex: index} + } else { + groupRowSpan[item.ckGroupId].count++; + data[index].groupRowSpan = 0 + } + } + + if (item.ckItemId) { + if (!itemRowSpan[item.ckItemId]) { + itemRowSpan[item.ckItemId] = {count: 1, firstIndex: index} + } else { + itemRowSpan[item.ckItemId].count++; + data[index].itemRowSpan = 0 + } + } + }) + + Object.values(groupRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].groupRowSpan = count; + }) + + Object.values(itemRowSpan).forEach(({count, firstIndex}) => { + data[firstIndex].itemRowSpan = count; + }) + + return data +} + +export const saveOrUpdateCkGroup = (params: SaveOrUpdateCkGroupParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核分组', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '分组名字', + required: true + }, + totalScore: { + type: 'inputNumber', + label: '分组总分', + required: true, + componentsProps: { + precision: 0 + } + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkGroup', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const saveOrUpdateCkItem = (params: SaveOrUpdateCkItemParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核项', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '考核项', + required: true + }, + type: { + type: 'radioGroup', + label: '控件类型', + required: true, + options: dictSelectNodes('SelectType') + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkItem', params) + message.success(resp.message) + callback && callback() + } + }) +} + +export const saveOrUpdateCkStandard = (params: SaveOrUpdateCkStandardParams, callback: Function) => { + submitSimpleFormModal({ + title: params.snowFlakeId ? `编辑【${params.name}】` : '添加考核标准', + formParams: params, + formOptions: { + name: { + type: 'input', + label: '标准', + required: true + }, + deductionPoints: { + type: 'inputNumber', + label: '扣分值', + required: true, + componentsProps: { + precision: 1 + } + } + }, + submit: async (params) => { + const resp = await api.post('/assessmentCriteria/saveOrUpdateCkStandard', params) + message.success(resp.message) + callback && callback() + } + }) +} + + diff --git a/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue b/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue new file mode 100644 index 0000000..12f2aef --- /dev/null +++ b/superManagement/src/views/unitManage/police/assessmentCriteria/index.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/superManagement/src/views/unitManage/police/unitManage/index.tsx b/superManagement/src/views/unitManage/police/unitManage/index.tsx new file mode 100644 index 0000000..1b615cc --- /dev/null +++ b/superManagement/src/views/unitManage/police/unitManage/index.tsx @@ -0,0 +1,226 @@ +import {TableProMaxProps, TableProMaxSlots} from "@/types/components/table"; +import { + EnterprisesUnitPagerQueryParams, + EnterprisesUnitPagerVo, EnterprisesUnitSaveOrUpdateParams, + PoliceUnitPagerVo +} from "@/types/views/unitManage/police/policeUnit.ts"; +import {ref} from "vue"; +import {FormExpose} from "ant-design-vue/es/form/Form"; +import {ComponentExposed} from "vue-component-type-helpers"; +import MapContainer from "@/components/aMap/MapContainer.vue"; +import {FormProMaxItemOptions} from "@/types/components/form"; +import {dictSelectNodes} from "@/config/dict.ts"; +import {Button, message, Modal, Space} from "ant-design-vue"; +import api from "@/axios"; +import TableProMax from "@/components/table/TableProMax.vue"; +import {deleteDataModal} from "@/components/tsx/ModalPro.tsx"; +import {PageParams} from "@/types/hooks/useTableProMax.ts"; +import FormProMax from "@/components/form/FormProMax.vue"; + +type _TableProps = TableProMaxProps; +type _FormType = EnterprisesUnitSaveOrUpdateParams & { + contactPersonInfoName?: string; + contactPersonInfoTelephone?: string +} +const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => { + const _formRef = ref(null) + const _mapRef = ref>(null) + const _formParams = ref<_FormType>({...params}) + + let city = ''; + + const _formOptions = ref>({ + name: { + type: 'input', + label: '单位名称', + required: true, + }, + type: { + type: 'select', + label: '单位类型', + required: true, + options: dictSelectNodes('EnterprisesUnitType') + }, + administrativeDivisionCodes: { + type: 'administrativeDivisionTree', + label: '行政区划', + required: true, + componentsProps: { + displayRender: ({labels}): string => { + city = labels[0] + return labels.join(' / '); + } + } + }, + address: { + type: 'inputTextArea', + label: '详细地址', + }, + map: { + type: 'custom', + label: '经纬度', + customRender: () => { + AMap.plugin(['AMap.AutoComplete'], () => { + //@ts-ignore + const auto = new AMap.AutoComplete({ + city, + input: "tipinput" + }); + //注册监听,当选中某条记录时会触发 + auto.on("select", (e) => { + //有些点位可能没有经纬度信息 + if (!e.poi.location) { + message.error('所选点位没有经纬度信息 建议选则附近的手动移动!'); + return + } + //添加maker点 设置point + const maker = new AMap.Marker({ + position: e.poi.location, + draggable: true + }) + console.log(e); + maker.on("dragend", (e) => { + console.log(e); + + }) + _mapRef.value.mapInstance.add(maker) + _mapRef.value.mapInstance.setFitView() + }); + }) + }} + > +
+ +
+
+ }, + contactPersonInfoName: { + type: 'input', + label: '联系人名称' + }, + contactPersonInfoTelephone: { + type: 'input', + label: '联系人电话' + }, + remark: { + type: 'inputTextArea', + label: '备注' + } + }) + Modal.confirm({ + title: params.snowFlakeId ? `【${params.name}】 信息编辑` : '新增企事业单位', + width: 600, + icon: ' ', + centered: true, + content: () => , + onOk: async () => { + await _formRef.value?.validate() + const resp = await api.post('/enterprisesUnit/saveOrUpdate', { + ..._formParams.value, + contactPersonInfo: { + name: _formParams.value.contactPersonInfoName, + telephone: _formParams.value.contactPersonInfoTelephone + } + }) + message.success(resp.message) + callback && callback() + } + }) +} + +export const showEnterprisesUnit = (policeUnitPagerVo: PoliceUnitPagerVo) => { + const _tableRef = ref>(null) + const _columns: _TableProps['columns'] = [ + { + dataIndex: 'name', + title: '名称' + }, { + dataIndex: 'type', + title: '类型', + customRender: ({text}) => text?.label + }, { + dataIndex: 'contactPersonInfo', + title: '联系人', + customRender: ({text}) => text?.name + "/" + text.telephone + }, { + dataIndex: 'province', + title: '行政区划', + customRender: ({record}) => [record.provinceName, record.cityName, record.districtsName, record.streetName].filter(Boolean).join("/") + }, { + dataIndex: 'address', + title: '详细地址' + }, { + dataIndex: 'remark', + title: '备注' + }, { + dataIndex: 'createTime', + title: '创建时间' + }, { + dataIndex: 'opt', + title: '操作', + customRender: ({record}) => + + + + } + ] + const _reqApi: _TableProps["requestApi"] = (params) => { + (params as PageParams).params.policeUnitId = policeUnitPagerVo.snowFlakeId + return api.post('/enterprisesUnit/pager', params) + } + Modal.info({ + title: `【${policeUnitPagerVo.name}】 管辖企事业单位`, + width: '80%', + content: () => { + return + + + + } + } as TableProMaxSlots} + /> + }) +} diff --git a/superManagement/src/views/unitManage/police/unitManage/index.vue b/superManagement/src/views/unitManage/police/unitManage/index.vue new file mode 100644 index 0000000..68b9f03 --- /dev/null +++ b/superManagement/src/views/unitManage/police/unitManage/index.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/superManagement/src/views/unitManage/policeUnit/index.vue b/superManagement/src/views/unitManage/police/unitManage/index.vue.bak similarity index 100% rename from superManagement/src/views/unitManage/policeUnit/index.vue rename to superManagement/src/views/unitManage/police/unitManage/index.vue.bak diff --git a/superManagement/src/views/unitManage/test.vue b/superManagement/src/views/unitManage/test.vue deleted file mode 100644 index 5871ec4..0000000 --- a/superManagement/src/views/unitManage/test.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - - - diff --git a/superManagement/src/vite-env.d.ts b/superManagement/src/vite-env.d.ts index c49a709..a1729cb 100644 --- a/superManagement/src/vite-env.d.ts +++ b/superManagement/src/vite-env.d.ts @@ -19,6 +19,10 @@ interface ImportMetaEnv { // RSA公钥 readonly VITE_APP_RSA_PUBLIC_KEY: string; + + // 高德 + VITE_APP_GAODE_KEY: string + VITE_APP_GAODE_VERSION: string } declare module '*.vue' { From b79bacc424d89d0da3e9a9b77080251cb7def304 Mon Sep 17 00:00:00 2001 From: luozhun <2025254074@qq.com> Date: Thu, 7 Nov 2024 17:16:35 +0800 Subject: [PATCH 5/7] 1 --- superManagement/src/views/test.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superManagement/src/views/test.vue b/superManagement/src/views/test.vue index 3b996ad..dc652ac 100644 --- a/superManagement/src/views/test.vue +++ b/superManagement/src/views/test.vue @@ -17,7 +17,7 @@ From 201f2112e89d46818e4881cba32a5d4fc496247b Mon Sep 17 00:00:00 2001 From: luozhun <2025254074@qq.com> Date: Fri, 8 Nov 2024 11:47:04 +0800 Subject: [PATCH 7/7] =?UTF-8?q?feat(geometry):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=87=A0=E4=BD=95=E5=B7=A5=E5=85=B7=E7=B1=BB=E5=92=8C=E5=9D=90?= =?UTF-8?q?=E6=A0=87=E8=BD=AC=E6=8D=A2=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 GeometryUtil 工具类,提供几何对象创建和操作方法 - 添加 GpsConvertUtil 类,实现坐标系转换功能 - 在 EnterprisesUnit 模型中增加坐标字段- 更新相关参数和 VO 类,支持坐标信息 - 新增 PointTypeHandler 以支持 MyBatis-Plus 对 Point 类型的处理 - 在 FastJson2Config 中注册地理坐标相关的序列化和反序列化器 - 添加 GeometryInnerInterceptor 以支持 MyBatis-Plus 几何操作 --- policeSecurityServer/pom.xml | 12 + .../changhu/common/utils/GeometryUtil.java | 428 ++++++++++++++++++ .../changhu/common/utils/GpsConvertUtil.java | 135 ++++++ .../pojo/entity/EnterprisesUnit.java | 6 + .../EnterprisesUnitSaveOrUpdateParams.java | 4 + .../pojo/vo/EnterprisesUnitPagerVo.java | 4 + .../support/fastjson2/FastJson2Config.java | 19 +- .../deserialze/LatitudeDeserializer.java | 31 ++ .../deserialze/LongitudeDeserializer.java | 31 ++ .../deserialze/PointDeserializer.java | 35 ++ .../serializer/LatitudeSerializer.java | 30 ++ .../serializer/LongitudeSerializer.java | 30 ++ .../fastjson2/serializer/PointSerializer.java | 45 ++ .../config/CustomMybatisPlusConfig.java | 3 + .../geo/AbstractGeometryTypeHandler.java | 13 + .../handler/global/geo/PointTypeHandler.java | 55 +++ .../interceptor/GeometryInnerInterceptor.java | 133 ++++++ superManagement/.env.development | 1 + superManagement/.env.production | 1 + .../src/components/aMap/MapContainer.vue | 4 +- .../views/unitManage/police/policeUnit.ts | 2 + superManagement/src/utils/aMapUtil.ts | 2 +- .../unitManage/police/unitManage/index.tsx | 36 +- .../unitManage/police/unitManage/index.vue | 23 + superManagement/src/vite-env.d.ts | 1 + 25 files changed, 1067 insertions(+), 17 deletions(-) create mode 100644 policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java create mode 100644 policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java diff --git a/policeSecurityServer/pom.xml b/policeSecurityServer/pom.xml index 61d3d4b..140472e 100644 --- a/policeSecurityServer/pom.xml +++ b/policeSecurityServer/pom.xml @@ -23,6 +23,7 @@ 3.3.4 8.0.32 3.5.7 + 25.2 1.2.20 8.4.3 4.8.1 @@ -190,6 +191,17 @@ mybatis-plus-spring-boot3-starter ${mybatis.plus.version} + + + org.geotools + gt-main + ${geotools.version} + + + org.geotools + gt-geojson + ${geotools.version} + io.minio diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java new file mode 100644 index 0000000..fc330d7 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/GeometryUtil.java @@ -0,0 +1,428 @@ +package com.changhu.common.utils; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; +import com.changhu.common.exception.MessageException; +import lombok.extern.slf4j.Slf4j; +import org.geotools.geojson.geom.GeometryJSON; +import org.geotools.geometry.jts.JTS; +import org.geotools.referencing.CRS; +import org.geotools.referencing.GeodeticCalculator; +import org.locationtech.jts.geom.*; +import org.locationtech.jts.io.ParseException; +import org.locationtech.jts.io.WKBReader; +import org.locationtech.jts.io.WKTReader; +import org.opengis.referencing.FactoryException; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import java.awt.geom.Point2D; +import java.io.IOException; +import java.io.StringReader; +import java.math.BigDecimal; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.util.List; +import java.util.Objects; + +/** + * author: luozhun + * desc: GeometryUtil + * createTime: 2023/8/25 18:03 + */ +@Slf4j +public class GeometryUtil { + + /** + * - WGS 84(srid=4326):用于全球地理坐标系统的标准参考坐标系。 + * - 美国地理参考系统(srid=4269):用于美国本土的地图和地理数据。 + * - 欧洲地理参考系统(srid=4258):用于欧洲地图和地理数据。 + * - 中国国家大地坐标系(srid=4490):用于中国的地图和地理数据。 + */ + public static final int SRID = 4326; + public static final String ST_GeomFromText = StrUtil.format("ST_GeomFromText({},{},{})", "?", SRID, "'axis-order=long-lat'"); + private static final GeometryFactory GEOMETRY_FACTORY = new GeometryFactory(new PrecisionModel(), SRID); + private static final GeometryFactory LOCATION_TECH_GEOMETRY_FACTORY = new GeometryFactory(new PrecisionModel(), SRID); + + /** + * 空对象,因为简历空间索引不能为空 Mysql 不支持创建 Empty 的数据 这里自定义一个类型 标识为null + */ + public static Point emptyPoint() { + return createPoint("POINT(0 0)"); + } + + public static Polygon emptyPolygon() { + return createPolygon("POLYGON((0 0, 0 0, 0 0, 0 0))"); + } + + public static LineString emptyLineString() { + return createLineString("LINESTRING(0 0, 0 0)"); + } + + public static MultiPoint emptyMultiPoint() { + return createMultiPoint("MULTIPOINT((0 0))"); + } + + public static MultiPolygon emptyMultiPolygon() { + return createMultiPolygon("MULTIPOLYGON(((0 0, 0 0, 0 0, 0 0)))"); + } + + public static MultiLineString emptyMultiLineString() { + return createMultiLineString("MULTILINESTRING(((0 0, 0 0)))"); + } + + + public static boolean equals(Geometry geometry1, Geometry geometry2) { + return StrUtil.equals(geometry1.toText(), geometry2.toText()); + } + + //** 点 **\\ + + /** + * 创建点对象 + */ + public static Point createPoint(List param) { + if (param == null) { + return null; + } + BigDecimal longitude = param.get(0); + BigDecimal latitude = param.get(1); + if (longitude == null || latitude == null) { + return null; + } + Coordinate coordinate = new Coordinate(longitude.doubleValue(), latitude.doubleValue()); + return GEOMETRY_FACTORY.createPoint(coordinate); + } + + public static Point createPoint(double longitude, double latitude) { + Coordinate coordinate = new Coordinate(longitude, latitude); + return GEOMETRY_FACTORY.createPoint(coordinate); + } + + /** + * 从WKT创建点对象 + * + * @param wkt 注WKT类似: POINT(109.013388 32.715519) + */ + public static Point createPoint(String wkt) { + return createGeometryFromWkt(wkt, Point.class); + } + + /** + * 从WKT创建点对象 + * + * @param bytes 数据库二进制数据 + */ + public static Point createPoint(byte[] bytes) { + return createGeometryFromBytes(bytes, Point.class); + } + + + //** 多边形 **\\ + + /** + * 创建多边形对象 + *

+ * 注:后面可能考虑兼容折线类型,如果是折线类型那么需要规范首尾结点要相同才能构成 polygon 否则构成 polyline + * 目前暂时没有做这方面的规划,用代码兼容了首尾不相等的情况构成polygon + */ + public static Polygon createPolygon(List> params) { + if (params == null || params.size() < 4) { + throw new MessageException("构成多边形至少需要三个有效坐标,并且保证尾部坐标和首部坐标相同"); + } + // 检测首尾是否相等,不相等则补充尾坐标 + List startPoint = params.get(0); + List entPoint = params.get(params.size() - 1); + if (!Objects.equals(startPoint.get(0), entPoint.get(0)) + || !Objects.equals(startPoint.get(1), entPoint.get(1))) { + params.add(params.get(0)); + } + Coordinate[] coordinates = convertBigDecimalList2CoordinateArray(params); + return GEOMETRY_FACTORY.createPolygon(coordinates); + } + + public static Polygon createPolygonWithDouble(List> params) { + if (params == null || params.size() < 4) { + throw new MessageException("构成多边形至少需要三个有效坐标,并且保证尾部坐标和首部坐标相同"); + } + // 检测首尾是否相等,不相等则补充尾坐标 + List startPoint = params.get(0); + List entPoint = params.get(params.size() - 1); + if (!Objects.equals(startPoint.get(0), entPoint.get(0)) + || !Objects.equals(startPoint.get(1), entPoint.get(1))) { + params.add(params.get(0)); + } + Coordinate[] coordinates = convertDoubleList2CoordinateArray(params); + return GEOMETRY_FACTORY.createPolygon(coordinates); + } + + /** + * 从WKT创建多边形对象 + * + * @param wkt 注WKT类似:POLYGON((20 10, 30 0, 40 10, 30 20, 20 10)) + */ + public static Polygon createPolygon(String wkt) { + return createGeometryFromWkt(wkt, Polygon.class); + } + + /** + * 创建多边形对象 + * + * @param bytes 数据库二进制数据 + */ + public static Polygon createPolygon(byte[] bytes) { + return createGeometryFromBytes(bytes, Polygon.class); + } + + //** 折线 **\\ + + /** + * 创建折线对象 + */ + public static LineString createLineString(List> params) { + if (params == null || params.size() < 2) { + throw new MessageException("构成折线至少需要两个有效坐标"); + } + Coordinate[] coordinates = convertBigDecimalList2CoordinateArray(params); + return GEOMETRY_FACTORY.createLineString(coordinates); + } + + /** + * 从 wkt 创建折线对象 + */ + public static LineString createLineString(String wkt) { + return createGeometryFromWkt(wkt, LineString.class); + } + + /** + * 从 bytes 创建折线对象 + */ + public static LineString createLineString(byte[] bytes) { + return createGeometryFromBytes(bytes, LineString.class); + } + + + //** 多点 **\\ + + /** + * 创建多点对象 + */ + public static MultiPoint createMultiPoint(List> multiParam) { + int size = multiParam.size(); + Point[] points = new Point[size]; + for (int i = 0; i < size; i++) { + points[i] = createPoint(multiParam.get(i)); + } + return GEOMETRY_FACTORY.createMultiPoint(points); + } + + + /** + * 从 wkt 创建多点对象 + */ + public static MultiPoint createMultiPoint(String wkt) { + return createGeometryFromWkt(wkt, MultiPoint.class); + } + + + /** + * 从 bytes 创建多点对象 + */ + public static MultiPoint createMultiPoint(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiPoint.class); + } + + + //** 多折线 **\\ + + /** + * 创建多折线对象 + */ + public static MultiLineString createMultiLineString(List>> multiParams) { + int size = multiParams.size(); + LineString[] lineStrings = new LineString[size]; + for (int i = 0; i < size; i++) { + lineStrings[i] = createLineString(multiParams.get(i)); + } + return GEOMETRY_FACTORY.createMultiLineString(lineStrings); + } + + /** + * 从 wkt 创建多折线对象 + */ + public static MultiLineString createMultiLineString(String wkt) { + return createGeometryFromWkt(wkt, MultiLineString.class); + } + + /** + * 从 wkt 创建多折线对象 + */ + public static MultiLineString createMultiLineString(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiLineString.class); + } + + //** 多多边形 **\\ + + /** + * 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(List>> multiParams) { + int size = multiParams.size(); + Polygon[] polygons = new Polygon[size]; + for (int i = 0; i < size; i++) { + polygons[i] = createPolygon(multiParams.get(i)); + } + return GEOMETRY_FACTORY.createMultiPolygon(polygons); + } + + /** + * 从 wkt 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(String wkt) { + return createGeometryFromWkt(wkt, MultiPolygon.class); + } + + /** + * 从 bytes 创建多多边形 + */ + public static MultiPolygon createMultiPolygon(byte[] bytes) { + return createGeometryFromBytes(bytes, MultiPolygon.class); + } + + //** 通用工具 **\\ + + + /** + * bytes 创建空间对象 + * + * @param bytes 数据库的二进制数据 + */ + public static T createGeometryFromBytes(byte[] bytes, Class clazz) { + if (bytes == null) { + return null; + } + try { + WKBReader wkbReader = new WKBReader(GEOMETRY_FACTORY); + byte[] geomBytes = ByteBuffer.allocate(bytes.length - 4).order(ByteOrder.LITTLE_ENDIAN) + .put(bytes, 4, bytes.length - 4).array(); + Geometry geometry = wkbReader.read(geomBytes); + return Convert.convert(clazz, geometry); + } catch (Exception e) { + throw new MessageException("从 Bytes 创建空间对象 {} 时出现错误:{}", clazz.getSimpleName(), e.getMessage()); + } + } + + /** + * 从 wkt 创建空间对象 + * + * @param wkt 类似:POLYGON((20 10, 30 0, 40 10, 30 20, 20 10)) , POINT(109.013388 32.715519) 等 + * @param clazz 继承 + */ + public static T createGeometryFromWkt(String wkt, Class clazz) { + if (wkt == null || StrUtil.isBlank(wkt)) { + return null; + } + try { + WKTReader reader = new WKTReader(GEOMETRY_FACTORY); + Geometry geometry = reader.read(wkt); + return Convert.convert(clazz, geometry); + } catch (ParseException e) { + throw new MessageException("从WKT创建空间对象 {} 时出现错误。wkt:{}", clazz.getSimpleName(), wkt); + } + } + + /** + * 从 GeoJson 创建空间对象 + */ + public static T createGeometryFromGeoJson(String geoJson, Class clazz) { + try { + GeometryJSON geometryJson = new GeometryJSON(20); + Geometry read = geometryJson.read(new StringReader(geoJson)); + return createGeometryFromWkt(read.toString(), clazz); + } catch (IOException e) { + log.error("从 GeoJson 创建空间对象出错:{}", e.getMessage()); + } + return null; + } + + /** + * 将 List 转化为 Coordinate[] + */ + private static Coordinate[] convertBigDecimalList2CoordinateArray(List> params) { + int size = params.size(); + Coordinate[] coordinates = new Coordinate[size]; + for (int i = 0; i < params.size(); i++) { + List param = params.get(i); + Coordinate coordinate = new Coordinate(param.get(0).doubleValue(), param.get(1).doubleValue()); + coordinates[i] = coordinate; + } + return coordinates; + } + + private static Coordinate[] convertDoubleList2CoordinateArray(List> params) { + int size = params.size(); + Coordinate[] coordinates = new Coordinate[size]; + for (int i = 0; i < params.size(); i++) { + List param = params.get(i); + Coordinate coordinate = new Coordinate(param.get(0), param.get(1)); + coordinates[i] = coordinate; + } + return coordinates; + } + + /** + * 计算面积 平方米 + * 28155 .195928.042862 + */ + public static BigDecimal getApproximateArea(Geometry geometry) { + try { + String wkt = geometry.toText(); + WKTReader wktReader = new WKTReader(LOCATION_TECH_GEOMETRY_FACTORY); + Geometry geom = wktReader.read(wkt); + // WGS84(一般项目中常用的是CSR:84和EPSG:4326) + CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:4326"); + // Pseudo-Mercator(墨卡托投影) + CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4490"); + MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, true); + Geometry geometryMercator = JTS.transform(geom, transform); + // 面积、周长 + return BigDecimal.valueOf(geometryMercator.getArea()); + } catch (FactoryException | TransformException | ParseException e) { + log.error("计算面积出错:{}", e.getMessage()); + } + return null; + } + + /** + * 当前数据库的数据来源都是高德数据源 坐标系为GCJ02 如果来源是其他的地图的需要根据规则转换成GCJ02 + * 同理如果需要转换到其他的数据源的坐标系也需要进行转换 + */ + public static T convertWgs84ToGcj02(T geometry) { + log.info("原始数据:{}", geometry.toText()); + Coordinate[] coordinates = geometry.getCoordinates(); + for (Coordinate coordinate : coordinates) { + double lon = coordinate.x; + double lat = coordinate.y; + double[] doubles = GpsConvertUtil.wgs84ToGcj02(lon, lat); + coordinate.x = doubles[0]; + coordinate.y = doubles[1]; + } + log.info("转后数据:{}", geometry.toText()); + return geometry; + } + + public static double distance(Point p0, Point p1) { + GeodeticCalculator calculator = new GeodeticCalculator(); + calculator.setStartingGeographicPoint(p0.getX(), p0.getY()); + calculator.setDestinationGeographicPoint(p1.getX(), p1.getY()); + return calculator.getOrthodromicDistance(); + } + + public static Point2D calculateEndingGlobalCoordinates(double longitude, double latitude, double azi, double dis) { + GeodeticCalculator calculator = new GeodeticCalculator(); + calculator.setStartingGeographicPoint(longitude, latitude); + calculator.setDirection(azi, dis); + return calculator.getDestinationGeographicPoint(); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java b/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java new file mode 100644 index 0000000..e524a80 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/common/utils/GpsConvertUtil.java @@ -0,0 +1,135 @@ +package com.changhu.common.utils; + +/** + * author: luozhun + * desc: 坐标系转换 + * createTime: 2023/8/25 18:18 + */ +public class GpsConvertUtil { + public static final double pi = 3.1415926535897932384626; + public static final double xpi = 3.14159265358979324 * 3000.0 / 180.0; + public static final double a = 6378245.0; + public static final double ee = 0.00669342162296594323; + + public static double transformLat(double x, double y) { + double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + + 0.2 * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; + ret += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; + return ret; + } + + public static double transformLon(double x, double y) { + double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 + * Math.sqrt(Math.abs(x)); + ret += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; + ret += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; + ret += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 + * pi)) * 2.0 / 3.0; + return ret; + } + + public static double[] transform(double lon, double lat) { + if (outOfChina(lon, lat)) { + return new double[]{lon, lat}; + } + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * pi; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + return new double[]{mgLon, mgLat}; + } + + public static boolean outOfChina(double lon, double lat) { + if (lon < 72.004 || lon > 137.8347) + return true; + return lat < 0.8293 || lat > 55.8271; + } + + /** + * 84 to 火星坐标系 (GCJ-02) World Geodetic System ==> Mars Geodetic System + */ + public static double[] wgs84ToGcj02(double lon, double lat) { + if (outOfChina(lon, lat)) { + return new double[]{lon, lat}; + } + double dLat = transformLat(lon - 105.0, lat - 35.0); + double dLon = transformLon(lon - 105.0, lat - 35.0); + double radLat = lat / 180.0 * pi; + double magic = Math.sin(radLat); + magic = 1 - ee * magic * magic; + double sqrtMagic = Math.sqrt(magic); + dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); + dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); + double mgLat = lat + dLat; + double mgLon = lon + dLon; + return new double[]{mgLon, mgLat}; + } + + /** + * * 火星坐标系 (GCJ-02) to 84 * * @param lon * @param lat * @return + */ + public static double[] gcj02ToWgs84(double lon, double lat) { + double[] gps = transform(lon, lat); + double longitude = lon * 2 - gps[0]; + double latitude = lat * 2 - gps[1]; + return new double[]{longitude, latitude}; + } + + /** + * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标 + */ + public static double[] gcj02ToBd09(double lon, double lat) { + double z = Math.sqrt(lon * lon + lat * lat) + 0.00002 * Math.sin(lat * xpi); + double theta = Math.atan2(lat, lon) + 0.000003 * Math.cos(lon * xpi); + double tempLon = z * Math.cos(theta) + 0.0065; + double tempLat = z * Math.sin(theta) + 0.006; + return new double[]{tempLon, tempLat}; + } + + /** + * * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 * * 将 BD-09 坐标转换成GCJ-02 坐标 * * @param + * bdlat * @param bdlon * @return + */ + public static double[] bd09ToGcj02(double lon, double lat) { + double x = lon - 0.0065, y = lat - 0.006; + double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xpi); + double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xpi); + double tempLon = z * Math.cos(theta); + double tempLat = z * Math.sin(theta); + return new double[]{tempLon, tempLat}; + } + + /** + * 将wgs84转为bd09 + */ + public static double[] wgs84ToBd09(double lon, double lat) { + double[] gcj02 = wgs84ToGcj02(lon, lat); + return gcj02ToBd09(gcj02[0], gcj02[1]); + } + + public static double[] bd09ToWgs84(double lon, double lat) { + double[] gcj02 = bd09ToGcj02(lon, lat); + double[] wgs84 = gcj02ToWgs84(gcj02[0], gcj02[1]); + // 保留小数点后六位 + wgs84[1] = retain6(wgs84[1]); + wgs84[0] = retain6(wgs84[0]); + return wgs84; + } + + /** + * 保留小数点后六位 + */ + private static double retain6(double num) { + String result = String.format("%.6f", num); + return Double.parseDouble(result); + } + +} diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java index b5f5b6a..9b3fc65 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/entity/EnterprisesUnit.java @@ -11,6 +11,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import org.locationtech.jts.geom.Point; import java.io.Serial; import java.io.Serializable; @@ -73,6 +74,11 @@ public class EnterprisesUnit extends BaseEntity implements Serializable { */ private String address; + /** + * 坐标 + */ + private Point point; + /** * 联系人 */ diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java index 7751ec3..4b7114f 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/params/EnterprisesUnitSaveOrUpdateParams.java @@ -7,6 +7,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.Data; +import org.locationtech.jts.geom.Point; import java.util.List; @@ -40,6 +41,9 @@ public class EnterprisesUnitSaveOrUpdateParams { @Schema(description = "详细地址") private String address; + @Schema(description = "坐标") + private Point point; + @Schema(description = "联系人") private ContactPersonInfo contactPersonInfo; diff --git a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java index 6fac384..594c1ef 100644 --- a/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java +++ b/policeSecurityServer/src/main/java/com/changhu/module/management/pojo/vo/EnterprisesUnitPagerVo.java @@ -4,6 +4,7 @@ import com.changhu.common.db.enums.EnterprisesUnitType; import com.changhu.module.management.pojo.model.ContactPersonInfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.locationtech.jts.geom.Point; /** * @author 20252 @@ -46,6 +47,9 @@ public class EnterprisesUnitPagerVo { @Schema(description = "地址") private String address; + @Schema(description = "坐标") + private Point point; + @Schema(description = "联系方式") private ContactPersonInfo contactPersonInfo; diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java index 13fc834..10cf050 100644 --- a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/FastJson2Config.java @@ -8,9 +8,18 @@ import com.alibaba.fastjson2.support.spring6.http.converter.FastJsonHttpMessageC import com.changhu.common.db.BaseEnum; import com.changhu.common.properties.Fastjson2Properties; import com.changhu.support.fastjson2.deserialze.DbEnumDeserializer; +import com.changhu.support.fastjson2.deserialze.LatitudeDeserializer; +import com.changhu.support.fastjson2.deserialze.LongitudeDeserializer; +import com.changhu.support.fastjson2.deserialze.PointDeserializer; import com.changhu.support.fastjson2.filter.DesensitizedFilter; import com.changhu.support.fastjson2.serializer.DbEnumSerializer; +import com.changhu.support.fastjson2.serializer.LatitudeSerializer; +import com.changhu.support.fastjson2.serializer.LongitudeSerializer; +import com.changhu.support.fastjson2.serializer.PointSerializer; import lombok.extern.slf4j.Slf4j; +import org.geotools.measure.Latitude; +import org.geotools.measure.Longitude; +import org.locationtech.jts.geom.Point; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; import org.springframework.context.annotation.Bean; @@ -47,9 +56,17 @@ public class FastJson2Config { JSON.register(clazz, DbEnumDeserializer.instance); }); - JSON.config(JSONWriter.Feature.WriteLongAsString); + JSON.register(Latitude.class, LatitudeSerializer.instance); + JSON.register(Longitude.class, LongitudeSerializer.instance); + JSON.register(Point.class, PointSerializer.instance); //反序列化配置 + JSON.register(Latitude.class, LatitudeDeserializer.instance); + JSON.register(Longitude.class, LongitudeDeserializer.instance); + JSON.register(Point.class, PointDeserializer.instance); + + JSON.config(JSONWriter.Feature.WriteLongAsString); + } @Bean diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java new file mode 100644 index 0000000..98c55b4 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LatitudeDeserializer.java @@ -0,0 +1,31 @@ +package com.changhu.support.fastjson2.deserialze; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import org.geotools.measure.Latitude; + +import java.lang.reflect.Type; +import java.math.BigDecimal; + +/** + * author: luozhun + * desc: LatitudeDeserializer + * createTime: 2023/8/26 16:10 + */ +public class LatitudeDeserializer implements ObjectReader { + + public static final LatitudeDeserializer instance = new LatitudeDeserializer(); + + private LatitudeDeserializer() { + } + + @Override + public Latitude readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + //读取为BigDecimal来确保精度和避免浮点数的舍入误差 + BigDecimal value = jsonReader.readBigDecimal(); + if (value == null) { + return null; + } + return new Latitude(value.doubleValue()); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java new file mode 100644 index 0000000..b8ba7fe --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/LongitudeDeserializer.java @@ -0,0 +1,31 @@ +package com.changhu.support.fastjson2.deserialze; + +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import org.geotools.measure.Longitude; + +import java.lang.reflect.Type; +import java.math.BigDecimal; + +/** + * author: luozhun + * desc: LongitudeDeserializer + * createTime: 2023/8/26 16:15 + */ +public class LongitudeDeserializer implements ObjectReader { + + public static final LongitudeDeserializer instance = new LongitudeDeserializer(); + + private LongitudeDeserializer() { + } + + @Override + public Longitude readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + //读取为BigDecimal来确保精度和避免浮点数的舍入误差 + BigDecimal value = jsonReader.readBigDecimal(); + if (value == null) { + return null; + } + return new Longitude(value.doubleValue()); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java new file mode 100644 index 0000000..c1c4f13 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/deserialze/PointDeserializer.java @@ -0,0 +1,35 @@ +package com.changhu.support.fastjson2.deserialze; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson2.JSONReader; +import com.alibaba.fastjson2.reader.ObjectReader; +import com.changhu.common.utils.GeometryUtil; +import org.locationtech.jts.geom.Point; + +import java.lang.reflect.Type; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; + +/** + * author: luozhun + * desc: PointDeserializer + * createTime: 2023/8/26 16:28 + */ +public class PointDeserializer implements ObjectReader { + + public static final PointDeserializer instance = new PointDeserializer(); + + private PointDeserializer() { + } + + @Override + public Point readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) { + List list = new ArrayList<>(); + jsonReader.readArray(list, BigDecimal.class); + if (CollUtil.isEmpty(list)) { + return null; + } + return GeometryUtil.createPoint(list); + } +} \ No newline at end of file diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java new file mode 100644 index 0000000..55deee1 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LatitudeSerializer.java @@ -0,0 +1,30 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import org.geotools.measure.Latitude; + +import java.lang.reflect.Type; + +/** + * author: luozhun + * desc: LatitudeSerializer + * createTime: 2023/8/26 15:44 + */ +public class LatitudeSerializer implements ObjectWriter { + + public static final LatitudeSerializer instance = new LatitudeSerializer(); + + private LatitudeSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeDouble(((Latitude) object).degrees()); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java new file mode 100644 index 0000000..42b27df --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/LongitudeSerializer.java @@ -0,0 +1,30 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import org.geotools.measure.Longitude; + +import java.lang.reflect.Type; + +/** + * author: luozhun + * desc: LongitudeSerializer + * createTime: 2023/8/26 15:46 + */ +public class LongitudeSerializer implements ObjectWriter { + + public static final LongitudeSerializer instance = new LongitudeSerializer(); + + private LongitudeSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeDouble(((Longitude) object).degrees()); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java new file mode 100644 index 0000000..3815c21 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/fastjson2/serializer/PointSerializer.java @@ -0,0 +1,45 @@ +package com.changhu.support.fastjson2.serializer; + +import com.alibaba.fastjson2.JSONWriter; +import com.alibaba.fastjson2.writer.ObjectWriter; +import com.changhu.common.utils.GeometryUtil; +import org.geotools.measure.Latitude; +import org.geotools.measure.Longitude; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Point; + +import java.lang.reflect.Type; +import java.util.Arrays; + +/** + * author: luozhun + * desc: PointSerializer + * createTime: 2023/8/26 15:59 + */ +public class PointSerializer implements ObjectWriter { + + public static final PointSerializer instance = new PointSerializer(); + + private PointSerializer() { + } + + @Override + public void write(JSONWriter jsonWriter, Object object, Object fieldName, Type fieldType, long features) { + if (object == null) { + jsonWriter.writeNull(); + return; + } + Point point = (Point) object; + if (GeometryUtil.equals(GeometryUtil.emptyPoint(), point)) { + jsonWriter.writeNull(); + return; + } + jsonWriter.writeAny( + Arrays.asList( + new Longitude(point.getCoordinate().getOrdinate(Coordinate.X)).degrees(), + new Latitude(point.getCoordinate().getOrdinate(Coordinate.Y)).degrees() + ) + ); + } +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java index cd63570..6421501 100644 --- a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/config/CustomMybatisPlusConfig.java @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionIntercepto import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.changhu.support.mybatisplus.interceptor.CustomDataPermissionHandler; +import com.changhu.support.mybatisplus.interceptor.GeometryInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,6 +31,8 @@ public class CustomMybatisPlusConfig { interceptor.addInnerInterceptor(paginationInterceptor(DbType.MYSQL)); // sql性能规范 // interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); + // 地理位置支持 配合 + interceptor.addInnerInterceptor(new GeometryInnerInterceptor()); interceptor.addInnerInterceptor(new BlockAttackInnerInterceptor()); //乐观锁插件 interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java new file mode 100644 index 0000000..cf908b8 --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/AbstractGeometryTypeHandler.java @@ -0,0 +1,13 @@ +package com.changhu.support.mybatisplus.handler.global.geo; + +import org.apache.ibatis.type.BaseTypeHandler; +import org.locationtech.jts.geom.Geometry; + +/** + * author: luozhun + * desc: GeometryTypeHandler + * createTime: 2023/8/25 17:59 + */ +public abstract class AbstractGeometryTypeHandler extends BaseTypeHandler { +} + diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java new file mode 100644 index 0000000..3c0208d --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/handler/global/geo/PointTypeHandler.java @@ -0,0 +1,55 @@ +package com.changhu.support.mybatisplus.handler.global.geo; + +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.changhu.common.utils.GeometryUtil; +import org.apache.ibatis.type.JdbcType; +import org.apache.ibatis.type.MappedJdbcTypes; +import org.apache.ibatis.type.MappedTypes; +import org.locationtech.jts.geom.Point; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * author: luozhun + * desc: PointTypeHandler + * createTime: 2023/8/26 13:17 + */ +@MappedJdbcTypes(JdbcType.VARCHAR) +@MappedTypes(Point.class) +public class PointTypeHandler extends AbstractGeometryTypeHandler { + + @Override + public void setNonNullParameter(PreparedStatement preparedStatement, int i, Point point, JdbcType jdbcType) throws SQLException { + preparedStatement.setString(i, point.toText()); + } + + @Override + public Point getNullableResult(ResultSet resultSet, String s) throws SQLException { + return createPoint(resultSet.getString(s), resultSet.getBytes(s)); + } + + @Override + public Point getNullableResult(ResultSet resultSet, int i) throws SQLException { + return createPoint(resultSet.getString(i), resultSet.getBytes(i)); + } + + @Override + public Point getNullableResult(CallableStatement callableStatement, int i) throws SQLException { + return createPoint(callableStatement.getString(i), callableStatement.getBytes(i)); + } + + public Point createPoint(String pointStr, byte[] pointBytes) { + if (JSONUtil.isTypeJSON(pointStr)) { + return GeometryUtil.createGeometryFromGeoJson(pointStr, Point.class); + } + if (StrUtil.startWithIgnoreCase(pointStr, ClassUtil.getClassName(Point.class, true))) { + return GeometryUtil.createGeometryFromWkt(pointStr, Point.class); + } + return GeometryUtil.createPoint(pointBytes); + } +} diff --git a/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java new file mode 100644 index 0000000..7d6dccc --- /dev/null +++ b/policeSecurityServer/src/main/java/com/changhu/support/mybatisplus/interceptor/GeometryInnerInterceptor.java @@ -0,0 +1,133 @@ +package com.changhu.support.mybatisplus.interceptor; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.core.toolkit.PluginUtils; +import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; +import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.executor.statement.StatementHandler; +import org.apache.ibatis.mapping.BoundSql; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlCommandType; +import org.locationtech.jts.geom.*; + +import java.lang.reflect.Field; +import java.sql.Connection; +import java.util.Arrays; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static com.changhu.common.utils.GeometryUtil.ST_GeomFromText; + + +/** + * @author 20252 + * @createTime 2024/6/6 下午4:32 + * @desc 注意!!!此拦截器只针对mp提供的基本构造方法管用 可以进行参数对象拦截 如果是xml,请自行添加ST_GeomFromText函数 + */ +@Slf4j +public class GeometryInnerInterceptor extends JsqlParserSupport implements InnerInterceptor { + + + public static final List> GEOMETRY_CLASS_LIST = CollUtil.newArrayList( + Point.class, + MultiPoint.class, + Polygon.class, + MultiPolygon.class, + LineString.class, + MultiLineString.class + ); + + public GeometryInnerInterceptor() { + } + + @Override + public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { + PluginUtils.MPStatementHandler mpSh = PluginUtils.mpStatementHandler(sh); + MappedStatement ms = mpSh.mappedStatement(); + //sql类型:INSERT UPDATE DELETE + SqlCommandType sct = ms.getSqlCommandType(); + //mp参数 + Object parameter = mpSh.parameterHandler().getParameterObject(); + //参数对象 + Object object = null; + //获取参数的属性 + switch (sct) { + case UPDATE: + try { + object = BeanUtil.beanToMap(parameter).get(Constants.ENTITY); + } catch (Exception ignored) { + } + break; + case INSERT: + object = parameter; + break; + } + //如果没有参数 就不进行sql修改 + if (object == null) { + return; + } + //获取 parameter 对象 中有关 geometry 的属性名对应 + List geoFields = this.getGeoFields(object); + //如果没有geometry字段 就不进行sql修改 + if (geoFields.isEmpty()) { + return; + } + //获取原始sql + BoundSql boundSql = ms.getBoundSql(parameter); + //UPDATE geo_test SET update_by=?,update_time=?,delete_flag=1 WHERE id=? AND delete_flag=0 + String originalSql = StrUtil.removeAllLineBreaks(boundSql.getSql()); + switch (sct) { + case UPDATE: + for (String geometryField : geoFields) { + String regex = geometryField + "\\s*=\\s*\\?"; + originalSql = ReUtil.replaceAll(originalSql, regex, StrUtil.format("{}={}", geometryField, ST_GeomFromText)); + } + break; + case INSERT: + for (String geometryField : geoFields) { + originalSql = this.replaceFindGeo(originalSql, geometryField); + } + break; + } + PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); + //修改sql + mpBs.sql(originalSql); + } + + private String replaceFindGeo(String originalSql, String geometryField) { + List split = StrUtil.split(originalSql, geometryField); + //找出geo字段在sql中的位置 + int geometryFieldIndex = StrUtil.count(split.get(0), ","); + StringBuilder stringBuffer = new StringBuilder(); + Matcher matcher = Pattern.compile("\\?").matcher(originalSql); + int count = 0; + while (matcher.find()) { + if (count == geometryFieldIndex) { + matcher.appendReplacement(stringBuffer, ST_GeomFromText); + break; + } + count++; + } + matcher.appendTail(stringBuffer); + return stringBuffer.toString(); + } + + /** + * 获取对象中的geo字段 + */ + private List getGeoFields(Object object) { + return Arrays.stream(ReflectUtil.getFields(object.getClass())) + .filter(field -> GEOMETRY_CLASS_LIST.contains(field.getType())) + .map(Field::getName) + .collect(Collectors.toList()); + } + +} diff --git a/superManagement/.env.development b/superManagement/.env.development index e416923..024b5f7 100644 --- a/superManagement/.env.development +++ b/superManagement/.env.development @@ -18,3 +18,4 @@ VITE_APP_MINIO_BUCKET=police-security-dev # 高德 VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 VITE_APP_GAODE_VERSION=2.0 +VITE_APP_SECURITY_JS_CODE=432125a0f8d8cad2dac38b77d6f6728f diff --git a/superManagement/.env.production b/superManagement/.env.production index 70b36e1..3104a00 100644 --- a/superManagement/.env.production +++ b/superManagement/.env.production @@ -18,3 +18,4 @@ VITE_APP_MINIO_BUCKET=police-security # 高德 VITE_APP_GAODE_KEY=f379a3f860a68d7438526275d6a94b05 VITE_APP_GAODE_VERSION=2.0 +VITE_APP_SECURITY_JS_CODE=432125a0f8d8cad2dac38b77d6f6728f diff --git a/superManagement/src/components/aMap/MapContainer.vue b/superManagement/src/components/aMap/MapContainer.vue index d637e87..fdd897c 100644 --- a/superManagement/src/components/aMap/MapContainer.vue +++ b/superManagement/src/components/aMap/MapContainer.vue @@ -10,7 +10,7 @@ import {initMap} from "@/utils/aMapUtil"; const props = withDefaults(defineProps<{ plugins?: string[], - initCallback?: () => void, + initCallback?: (map: AMap.Map) => void, mapOptions?: AMap.MapOptions }>(), { plugins: () => { @@ -36,8 +36,8 @@ defineExpose({ onMounted(() => { initMap(props.plugins).then(AMap => { - props.initCallback && props.initCallback() map.value = new AMap.Map(mapId, props.mapOptions) + props.initCallback && props.initCallback(map.value) }) }) diff --git a/superManagement/src/types/views/unitManage/police/policeUnit.ts b/superManagement/src/types/views/unitManage/police/policeUnit.ts index c3bdb3b..7c38d1b 100644 --- a/superManagement/src/types/views/unitManage/police/policeUnit.ts +++ b/superManagement/src/types/views/unitManage/police/policeUnit.ts @@ -76,6 +76,7 @@ export interface EnterprisesUnitPagerVo extends BaseTableRowRecord { streetName?: string; /** 地址 **/ address?: string; + point: [number, number] /** 联系方式 **/ contactPersonInfo?: { name: string; @@ -98,6 +99,7 @@ export interface EnterprisesUnitSaveOrUpdateParams { administrativeDivisionCodes: string[]; /** 详细地址 **/ address?: string; + point?: [number, number] /** 联系人 **/ contactPersonInfo?: { name: string; diff --git a/superManagement/src/utils/aMapUtil.ts b/superManagement/src/utils/aMapUtil.ts index 574e061..5d90620 100644 --- a/superManagement/src/utils/aMapUtil.ts +++ b/superManagement/src/utils/aMapUtil.ts @@ -4,7 +4,7 @@ type Amap = typeof AMap; export const initMap = (plugins?: string[]): Promise => new Promise((resolve, reject) => { //@ts-ignore window._AMapSecurityConfig = { - securityJsCode: '432125a0f8d8cad2dac38b77d6f6728f' + securityJsCode: __APP_ENV.VITE_APP_SECURITY_JS_CODE } AMapLoader.load({ key: __APP_ENV.VITE_APP_GAODE_KEY, diff --git a/superManagement/src/views/unitManage/police/unitManage/index.tsx b/superManagement/src/views/unitManage/police/unitManage/index.tsx index 1b615cc..e4ef716 100644 --- a/superManagement/src/views/unitManage/police/unitManage/index.tsx +++ b/superManagement/src/views/unitManage/police/unitManage/index.tsx @@ -29,6 +29,21 @@ const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => { let city = ''; + const initMarker = (map: AMap.Map) => { + //添加maker点 设置point + const maker = new AMap.Marker({ + position: _formParams.value.point, + draggable: true + }) + maker.on("dragend", ({lnglat}) => { + _formParams.value.point = lnglat + }) + map.clearMap() + map.add(maker) + map.setFitView() + console.log(123); + } + const _formOptions = ref>({ name: { type: 'input', @@ -62,7 +77,7 @@ const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => { customRender: () => { + initCallback={(map) => { AMap.plugin(['AMap.AutoComplete'], () => { //@ts-ignore const auto = new AMap.AutoComplete({ @@ -76,25 +91,19 @@ const saveOrUpdateEnterprisesUnit = (params: _FormType, callback: Function) => { message.error('所选点位没有经纬度信息 建议选则附近的手动移动!'); return } - //添加maker点 设置point - const maker = new AMap.Marker({ - position: e.poi.location, - draggable: true - }) - console.log(e); - maker.on("dragend", (e) => { - console.log(e); - - }) - _mapRef.value.mapInstance.add(maker) - _mapRef.value.mapInstance.setFitView() + _formParams.value.point = e.poi.location + initMarker(map) }); }) + if (_formParams.value.point) { + initMarker(map) + } }} >

@@ -176,6 +185,7 @@ export const showEnterprisesUnit = (policeUnitPagerVo: PoliceUnitPagerVo) => { type: record.type.value, administrativeDivisionCodes: [record.province, record.city, record.districts, record.street].filter(Boolean), address: record.address, + point: record.point, contactPersonInfoName: record.contactPersonInfo?.name, contactPersonInfoTelephone: record.contactPersonInfo?.telephone, remark: record.remark diff --git a/superManagement/src/views/unitManage/police/unitManage/index.vue b/superManagement/src/views/unitManage/police/unitManage/index.vue index 68b9f03..3c3975d 100644 --- a/superManagement/src/views/unitManage/police/unitManage/index.vue +++ b/superManagement/src/views/unitManage/police/unitManage/index.vue @@ -129,6 +129,29 @@ const searchFormOptions = ref({ } }) +const a = { + groupId1: { + itemId1: { + standardId: 123123, + deductionPoints: 2 + }, + itemId2: { + standardId: 345345, + deductionPoints: 4 + } + }, + groupId2: { + itemId1: { + standardId: 456456, + deductionPoints: 2 + }, + itemId2: { + standardId: 567567, + deductionPoints: 4 + } + } +} +