From 0c2b54d07be6bb94591f1cd06ac76ec63985bf0c Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 16 Jun 2025 09:13:57 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E4=B8=AD=E6=B0=B4=E5=8C=97=E6=96=B9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/quality/entity/QualityRegion.java | 9 +++ .../entity/QualityRegionToUfaceDev.java | 58 +++++++++++++++++++ .../mapper/QualityRegionToUfaceDevMapper.java | 15 +++++ .../mapper/xml/QualityRegionMapper.xml | 21 ++++++- .../xml/QualityRegionToUfaceDevMapper.xml | 4 ++ .../IQualityRegionToUfaceDevService.java | 14 +++++ .../impl/QualityRegionServiceImpl.java | 36 ++++++++++-- .../QualityRegionToUfaceDevServiceImpl.java | 18 ++++++ .../WorkerAttendanceController.java | 21 +++++-- .../controller/WorkerInfoController.java | 3 +- .../modules/worker/mapper/UfaceDevMapper.java | 2 + .../WorkerAttendancePresenceMapper.java | 12 ++++ .../worker/mapper/xml/UfaceDevMapper.xml | 7 +++ .../mapper/xml/WorkerAttendanceMapper.xml | 6 ++ .../xml/WorkerAttendancePresenceMapper.xml | 46 ++++++++++++++- .../worker/service/IUfaceDevService.java | 8 +++ .../IWorkerAttendancePresenceService.java | 6 ++ .../service/IWorkerAttendanceService.java | 1 + .../service/impl/UfaceDevServiceImpl.java | 4 ++ .../WorkerAttendancePresenceServiceImpl.java | 10 ++++ .../impl/WorkerAttendanceServiceImpl.java | 8 +++ .../service/impl/WorkerInfoServiceImpl.java | 8 +++ src/main/resources/application-dev.properties | 2 +- .../application-gsx-other-env-show.properties | 2 +- 24 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionToUfaceDevMapper.xml create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/service/IQualityRegionToUfaceDevService.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionToUfaceDevServiceImpl.java diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java index 685a9e051..b6abea6b7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; +import com.zhgd.xmgl.modules.worker.entity.UfaceDev; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -124,4 +125,12 @@ public class QualityRegion implements Serializable { @ApiModelProperty(value = "区域设备") private List regionDevList; + @TableField(exist = false) + @ApiModelProperty(value = "人脸设备") + private List ufaceDevList; + + @TableField(exist = false) + @ApiModelProperty(value = "人脸设备(逗号分割)") + private java.lang.String ufaceDevName; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java new file mode 100644 index 000000000..3b3c82222 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java @@ -0,0 +1,58 @@ +package com.zhgd.xmgl.modules.quality.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 区域和人脸设备中间表 + * @author: pds + * @date: 2025-06-12 + * @version: V1.0 + */ +@Data +@TableName("quality_region_to_uface_dev") +@ApiModel(value = "QualityRegionToUfaceDev实体类", description = "QualityRegionToUfaceDev") +public class QualityRegionToUfaceDev implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private Long id; + /** + * 区域id + */ + @ApiModelProperty(value = "区域id") + private Long qualityRegionId; + /** + * 人脸设备id + */ + @ApiModelProperty(value = "人脸设备id") + private Long ufaceDevId; + /** + * 创建时间 yyyy-MM-dd HH:mm:ss + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间 yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** + * 更新时间 yyyy-MM-dd HH:mm:ss + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间 yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java new file mode 100644 index 000000000..25d3c0fe7 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java @@ -0,0 +1,15 @@ +package com.zhgd.xmgl.modules.quality.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhgd.xmgl.modules.quality.entity.QualityRegionToUfaceDev; +import org.apache.ibatis.annotations.Mapper; + +/** + * @Description: 区域和人脸设备中间表 + * @author: pds + * @date: 2025-06-12 + * @version: V1.0 + */ +@Mapper +public interface QualityRegionToUfaceDevMapper extends BaseMapper { +} diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml index 98741be75..5c915f95c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml @@ -35,11 +35,26 @@ + + + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml index 5ce91bf6d..9494abc62 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml @@ -91,6 +91,12 @@ #{item} + + and a.dev_sn in + + #{item} + + and FIND_IN_SET(b.enterprise_id, #{param.userEnterpriseId}) diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml index 9d43de622..65e1a4775 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml @@ -23,13 +23,55 @@ delete from worker_attendance_presence where - - delete from worker_attendance_presence where project_sn=#{projectSn} + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java index 0da81af4a..e40cb0e34 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java @@ -108,4 +108,12 @@ public interface IUfaceDevService extends IService { * @return */ List getAllDevsByProjectSn(String projectSn); + + /** + * 查询设备列表通过门禁设备分组id + * + * @param groupId + * @return + */ + List getDevSnListByGroupId(String groupId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java index 962c9e1ae..25cd5eb08 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java @@ -5,6 +5,8 @@ import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendancePresence; import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @Description: 考勤当前在场的人 @@ -33,4 +35,8 @@ public interface IWorkerAttendancePresenceService extends IService paramMap); + + List> getPresentByRegion(Map paramMap); + + List getPresentWorkerIdListByRegion(Long regionId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java index 961a3160b..289fb3bea 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java @@ -279,4 +279,5 @@ public interface IWorkerAttendanceService extends IService { void edit(WorkerAttendance attendance); Map buildAttendanceMap(WorkerAttendance workerAttendance); + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java index 4dfe391d4..61476adbb 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java @@ -275,4 +275,8 @@ public class UfaceDevServiceImpl extends ServiceImpl i return ufaceDevMapper.selectList(qw); } + @Override + public List getDevSnListByGroupId(String groupId) { + return ufaceDevMapper.getDevSnListByGroupId(groupId); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java index 19fb70d7f..cf630b8ae 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java @@ -17,6 +17,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @Description: 考勤当前在场的人 @@ -71,5 +72,14 @@ public class WorkerAttendancePresenceServiceImpl extends ServiceImpl> getPresentByRegion(Map paramMap) { + return workerAttendancePresenceMapper.getPresentByRegion(paramMap); + } + + @Override + public List getPresentWorkerIdListByRegion(Long regionId) { + return workerAttendancePresenceMapper.getPresentWorkerIdListByRegion(regionId); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java index 6124b5450..7c2e30347 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java @@ -249,6 +249,14 @@ public class WorkerAttendanceServiceImpl extends ServiceImpl selectWorkerAttendancePage(Map map) { + String groupId = MapUtils.getString(map, "groupId"); + if (StrUtil.isNotBlank(groupId)) { + List devSnList = ufaceDevService.getDevSnListByGroupId(groupId).stream().map(UfaceDev::getDevSn).collect(Collectors.toList()); + if (devSnList.size() == 0) { + devSnList.add("-114514"); + } + map.put("devSnList", devSnList); + } int pageNo = Integer.parseInt(map.getOrDefault("pageNo", 1).toString()); int pageSize = Integer.parseInt(map.getOrDefault("pageSize", 10).toString()); Page page = new Page<>(pageNo, pageSize); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index 8bcc9b2c0..66ca4e4ac 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -290,6 +290,14 @@ public class WorkerInfoServiceImpl extends ServiceImpl selectWorkerInfoList(Map map) { + String regionIdForUface = MapUtils.getString(map, "regionIdForUface"); + if (StrUtil.isNotBlank(regionIdForUface)) { + List workerIds = workerAttendancePresenceService.getPresentWorkerIdListByRegion(Long.valueOf(regionIdForUface)); + if (workerIds.size() == 0) { + workerIds.add(-100L); + } + map.put("workerInfos", StrUtil.join(",", workerIds)); + } // 区域人员 String qualityRegionId = MapUtils.getString(map, "qualityRegionId"); if (StringUtils.isNotEmpty(qualityRegionId)) { diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index dd520ff27..e8312b04f 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,5 +1,5 @@ http.port=23913 -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wisdomsite_hl_new_init?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wisdomsite_prod?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false spring.datasource.username=ENC(XR4C/hvTYCUqudS49Wh/jA==) spring.datasource.password=ENC(LsKaVL2ycDu+uUNoPndYLA==) server.port=23912 diff --git a/src/main/resources/application-gsx-other-env-show.properties b/src/main/resources/application-gsx-other-env-show.properties index 65008523b..2fd30db95 100644 --- a/src/main/resources/application-gsx-other-env-show.properties +++ b/src/main/resources/application-gsx-other-env-show.properties @@ -1,6 +1,6 @@ #http.port=30250 http.port=23912 -spring.datasource.db1.jdbc-url=jdbc:mysql://192.168.34.221:3306/wisdomsite_other_env_show?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false +spring.datasource.db1.jdbc-url=jdbc:mysql://192.168.34.221:3306/wisdomsite_prod?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver spring.datasource.db1.username=ENC(XR4C/hvTYCUqudS49Wh/jA==) spring.datasource.db1.password=ENC(LsKaVL2ycDu+uUNoPndYLA==) From d80d6f209e92b4b876dfb475af1dfe59d1f1999b Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 16 Jun 2025 09:13:57 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=B8=AD=E6=B0=B4=E5=8C=97=E6=96=B9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中水北方功能调整 --- .../modules/quality/entity/QualityRegion.java | 9 +++ .../entity/QualityRegionToUfaceDev.java | 58 +++++++++++++++++++ .../mapper/QualityRegionToUfaceDevMapper.java | 15 +++++ .../mapper/xml/QualityRegionMapper.xml | 21 ++++++- .../xml/QualityRegionToUfaceDevMapper.xml | 4 ++ .../IQualityRegionToUfaceDevService.java | 14 +++++ .../impl/QualityRegionServiceImpl.java | 36 ++++++++++-- .../QualityRegionToUfaceDevServiceImpl.java | 18 ++++++ .../WorkerAttendanceController.java | 21 +++++-- .../controller/WorkerInfoController.java | 3 +- .../modules/worker/mapper/UfaceDevMapper.java | 2 + .../WorkerAttendancePresenceMapper.java | 12 ++++ .../worker/mapper/xml/UfaceDevMapper.xml | 7 +++ .../mapper/xml/WorkerAttendanceMapper.xml | 6 ++ .../xml/WorkerAttendancePresenceMapper.xml | 46 ++++++++++++++- .../worker/service/IUfaceDevService.java | 8 +++ .../IWorkerAttendancePresenceService.java | 6 ++ .../service/IWorkerAttendanceService.java | 1 + .../service/impl/UfaceDevServiceImpl.java | 4 ++ .../WorkerAttendancePresenceServiceImpl.java | 10 ++++ .../impl/WorkerAttendanceServiceImpl.java | 8 +++ .../service/impl/WorkerInfoServiceImpl.java | 8 +++ src/main/resources/application-dev.properties | 2 +- .../application-gsx-other-env-show.properties | 2 +- 24 files changed, 304 insertions(+), 17 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionToUfaceDevMapper.xml create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/service/IQualityRegionToUfaceDevService.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/quality/service/impl/QualityRegionToUfaceDevServiceImpl.java diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java index 685a9e051..b6abea6b7 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegion.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord; import com.zhgd.xmgl.modules.worker.entity.EnterpriseInfo; +import com.zhgd.xmgl.modules.worker.entity.UfaceDev; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -124,4 +125,12 @@ public class QualityRegion implements Serializable { @ApiModelProperty(value = "区域设备") private List regionDevList; + @TableField(exist = false) + @ApiModelProperty(value = "人脸设备") + private List ufaceDevList; + + @TableField(exist = false) + @ApiModelProperty(value = "人脸设备(逗号分割)") + private java.lang.String ufaceDevName; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java new file mode 100644 index 000000000..3b3c82222 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/quality/entity/QualityRegionToUfaceDev.java @@ -0,0 +1,58 @@ +package com.zhgd.xmgl.modules.quality.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; +import org.jeecgframework.poi.excel.annotation.Excel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * @Description: 区域和人脸设备中间表 + * @author: pds + * @date: 2025-06-12 + * @version: V1.0 + */ +@Data +@TableName("quality_region_to_uface_dev") +@ApiModel(value = "QualityRegionToUfaceDev实体类", description = "QualityRegionToUfaceDev") +public class QualityRegionToUfaceDev implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(type = IdType.ASSIGN_ID) + @ApiModelProperty(value = "id") + private Long id; + /** + * 区域id + */ + @ApiModelProperty(value = "区域id") + private Long qualityRegionId; + /** + * 人脸设备id + */ + @ApiModelProperty(value = "人脸设备id") + private Long ufaceDevId; + /** + * 创建时间 yyyy-MM-dd HH:mm:ss + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "创建时间 yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** + * 更新时间 yyyy-MM-dd HH:mm:ss + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @ApiModelProperty(value = "更新时间 yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java new file mode 100644 index 000000000..25d3c0fe7 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionToUfaceDevMapper.java @@ -0,0 +1,15 @@ +package com.zhgd.xmgl.modules.quality.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zhgd.xmgl.modules.quality.entity.QualityRegionToUfaceDev; +import org.apache.ibatis.annotations.Mapper; + +/** + * @Description: 区域和人脸设备中间表 + * @author: pds + * @date: 2025-06-12 + * @version: V1.0 + */ +@Mapper +public interface QualityRegionToUfaceDevMapper extends BaseMapper { +} diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml index 98741be75..5c915f95c 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/xml/QualityRegionMapper.xml @@ -35,11 +35,26 @@ + + + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml index 5ce91bf6d..9494abc62 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendanceMapper.xml @@ -91,6 +91,12 @@ #{item} + + and a.dev_sn in + + #{item} + + and FIND_IN_SET(b.enterprise_id, #{param.userEnterpriseId}) diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml index 9d43de622..cd00519ac 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/worker/mapper/xml/WorkerAttendancePresenceMapper.xml @@ -23,13 +23,55 @@ delete from worker_attendance_presence where - - delete from worker_attendance_presence where project_sn=#{projectSn} + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java index 0da81af4a..e40cb0e34 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IUfaceDevService.java @@ -108,4 +108,12 @@ public interface IUfaceDevService extends IService { * @return */ List getAllDevsByProjectSn(String projectSn); + + /** + * 查询设备列表通过门禁设备分组id + * + * @param groupId + * @return + */ + List getDevSnListByGroupId(String groupId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java index 962c9e1ae..25cd5eb08 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendancePresenceService.java @@ -5,6 +5,8 @@ import com.zhgd.xmgl.modules.worker.entity.WorkerAttendance; import com.zhgd.xmgl.modules.worker.entity.WorkerAttendancePresence; import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @Description: 考勤当前在场的人 @@ -33,4 +35,8 @@ public interface IWorkerAttendancePresenceService extends IService paramMap); + + List> getPresentByRegion(Map paramMap); + + List getPresentWorkerIdListByRegion(Long regionId); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java index 961a3160b..289fb3bea 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/IWorkerAttendanceService.java @@ -279,4 +279,5 @@ public interface IWorkerAttendanceService extends IService { void edit(WorkerAttendance attendance); Map buildAttendanceMap(WorkerAttendance workerAttendance); + } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java index 4dfe391d4..61476adbb 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/UfaceDevServiceImpl.java @@ -275,4 +275,8 @@ public class UfaceDevServiceImpl extends ServiceImpl i return ufaceDevMapper.selectList(qw); } + @Override + public List getDevSnListByGroupId(String groupId) { + return ufaceDevMapper.getDevSnListByGroupId(groupId); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java index 19fb70d7f..cf630b8ae 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendancePresenceServiceImpl.java @@ -17,6 +17,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @Description: 考勤当前在场的人 @@ -71,5 +72,14 @@ public class WorkerAttendancePresenceServiceImpl extends ServiceImpl> getPresentByRegion(Map paramMap) { + return workerAttendancePresenceMapper.getPresentByRegion(paramMap); + } + + @Override + public List getPresentWorkerIdListByRegion(Long regionId) { + return workerAttendancePresenceMapper.getPresentWorkerIdListByRegion(regionId); + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java index 6124b5450..7c2e30347 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerAttendanceServiceImpl.java @@ -249,6 +249,14 @@ public class WorkerAttendanceServiceImpl extends ServiceImpl selectWorkerAttendancePage(Map map) { + String groupId = MapUtils.getString(map, "groupId"); + if (StrUtil.isNotBlank(groupId)) { + List devSnList = ufaceDevService.getDevSnListByGroupId(groupId).stream().map(UfaceDev::getDevSn).collect(Collectors.toList()); + if (devSnList.size() == 0) { + devSnList.add("-114514"); + } + map.put("devSnList", devSnList); + } int pageNo = Integer.parseInt(map.getOrDefault("pageNo", 1).toString()); int pageSize = Integer.parseInt(map.getOrDefault("pageSize", 10).toString()); Page page = new Page<>(pageNo, pageSize); diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java index 8bcc9b2c0..66ca4e4ac 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/service/impl/WorkerInfoServiceImpl.java @@ -290,6 +290,14 @@ public class WorkerInfoServiceImpl extends ServiceImpl selectWorkerInfoList(Map map) { + String regionIdForUface = MapUtils.getString(map, "regionIdForUface"); + if (StrUtil.isNotBlank(regionIdForUface)) { + List workerIds = workerAttendancePresenceService.getPresentWorkerIdListByRegion(Long.valueOf(regionIdForUface)); + if (workerIds.size() == 0) { + workerIds.add(-100L); + } + map.put("workerInfos", StrUtil.join(",", workerIds)); + } // 区域人员 String qualityRegionId = MapUtils.getString(map, "qualityRegionId"); if (StringUtils.isNotEmpty(qualityRegionId)) { diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index dd520ff27..e8312b04f 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,5 +1,5 @@ http.port=23913 -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wisdomsite_hl_new_init?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false +spring.datasource.url=jdbc:mysql://127.0.0.1:3306/wisdomsite_prod?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false spring.datasource.username=ENC(XR4C/hvTYCUqudS49Wh/jA==) spring.datasource.password=ENC(LsKaVL2ycDu+uUNoPndYLA==) server.port=23912 diff --git a/src/main/resources/application-gsx-other-env-show.properties b/src/main/resources/application-gsx-other-env-show.properties index 65008523b..2fd30db95 100644 --- a/src/main/resources/application-gsx-other-env-show.properties +++ b/src/main/resources/application-gsx-other-env-show.properties @@ -1,6 +1,6 @@ #http.port=30250 http.port=23912 -spring.datasource.db1.jdbc-url=jdbc:mysql://192.168.34.221:3306/wisdomsite_other_env_show?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false +spring.datasource.db1.jdbc-url=jdbc:mysql://192.168.34.221:3306/wisdomsite_prod?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&autoReconnect=true&useSSL=false spring.datasource.db1.driver-class-name=com.mysql.jdbc.Driver spring.datasource.db1.username=ENC(XR4C/hvTYCUqudS49Wh/jA==) spring.datasource.db1.password=ENC(LsKaVL2ycDu+uUNoPndYLA==) From 20fa9355bff5806c5dbc6b2216dfb0c4711d29c0 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Mon, 16 Jun 2025 17:51:19 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E9=A3=8E=E9=99=A9=E7=82=B9=E3=80=81?= =?UTF-8?q?=E5=8D=B1=E9=99=A9=E6=BA=90=E3=80=81=E6=9C=88=E5=BA=A6=E3=80=81?= =?UTF-8?q?=E9=9A=90=E6=82=A3=E6=8E=92=E6=9F=A5=E3=80=81=E6=8E=92=E6=9F=A5?= =?UTF-8?q?=E6=89=A7=E8=A1=8Cbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RiskListPointController.java | 8 +- .../controller/RiskListSourceController.java | 25 ++++-- .../RiskListSourceDataCenterController.java | 85 ++++++++++++++++++ .../risk/entity/vo/CountRisksByLevelVo.java | 46 ++++++++++ .../risk/entity/vo/RiskListSourceVo.java | 1 + .../risk/mapper/RiskListSourceMapper.java | 6 ++ .../risk/mapper/xml/RiskListPointMapper.xml | 16 ++-- .../risk/mapper/xml/RiskListSourceMapper.xml | 45 +++++++++- .../risk/service/IRiskListSourceService.java | 10 ++- .../impl/RiskListPointServiceImpl.java | 21 +++++ .../impl/RiskListSourceServiceImpl.java | 56 +++++++++++- .../resources/excel/辨识清单导出模板.xlsx | Bin 11315 -> 11292 bytes 12 files changed, 295 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java create mode 100644 src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/CountRisksByLevelVo.java diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java index a3a344a52..34d457c36 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java @@ -5,10 +5,10 @@ import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; -import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gexin.fastjson.serializer.SerializerFeature; import com.zhgd.annotation.OperLog; import com.zhgd.file.FileUtil; import com.zhgd.jeecg.common.api.vo.Result; @@ -93,8 +93,8 @@ public class RiskListPointController { @ApiImplicitParam(name = "pageNo", value = "第几页", paramType = "query", required = true, dataType = "Integer"), @ApiImplicitParam(name = "pageSize", value = "每页显示条数", paramType = "query", required = true, dataType = "Integer"), @ApiImplicitParam(name = "projectType", value = "工程类别(字典值)", paramType = "query", required = false, dataType = "Integer"), - @ApiImplicitParam(name = "containLibraryId", value = "查询下级的风险清单库id", paramType = "query", required = false, dataType = "Integer"), - @ApiImplicitParam(name = "regionId", value = "区域id", paramType = "query", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "containLibraryIds", value = "查询下级的风险清单库id(多个,分割)", paramType = "query", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "regionIds", value = "区域ids(多个,分割)", paramType = "query", required = false, dataType = "Integer"), }) @GetMapping(value = "/page") public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { @@ -203,7 +203,7 @@ public class RiskListPointController { }) @PostMapping(value = "/batchSetField") public Result batchSetField(@RequestBody Map param) { - List> updates = com.gexin.fastjson.JSON.parseObject(JSON.toJSONString(param.get("updates")), new com.gexin.fastjson.TypeReference>>() { + List> updates = com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(param.get("updates"), SerializerFeature.WriteMapNullValue), new com.gexin.fastjson.TypeReference>>() { }); List fieldNames = new ArrayList<>(); Field[] fields = RiskListPoint.class.getDeclaredFields(); // getFields() 只返回公共字段(包括继承的) diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java index 0bdf150ca..bb5a46bce 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceController.java @@ -12,22 +12,20 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; -import com.alibaba.fastjson2.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gexin.fastjson.serializer.SerializerFeature; import com.zhgd.annotation.OperLog; import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.xmgl.modules.risk.entity.RiskListDetail; +import com.zhgd.xmgl.modules.risk.entity.RiskListPoint; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; import com.zhgd.xmgl.modules.risk.entity.vo.RegionV2Vo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo; -import com.zhgd.xmgl.modules.risk.service.IRegionV2Service; -import com.zhgd.xmgl.modules.risk.service.IRiskListDetailService; -import com.zhgd.xmgl.modules.risk.service.IRiskListPotentialAccidentTypeService; -import com.zhgd.xmgl.modules.risk.service.IRiskListSourceService; +import com.zhgd.xmgl.modules.risk.service.*; import com.zhgd.xmgl.util.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -80,6 +78,9 @@ public class RiskListSourceController { @Lazy @Autowired private IRiskListPotentialAccidentTypeService riskListPotentialAccidentTypeService; + @Lazy + @Autowired + private IRiskListPointService riskListPointService; /** * 分页列表查询 @@ -97,6 +98,7 @@ public class RiskListSourceController { @ApiImplicitParam(name = "monthlyId", value = "月度清单id", paramType = "query", required = false, dataType = "Integer"), @ApiImplicitParam(name = "duringTheTask", value = "1是开启任务期间", paramType = "query", required = false, dataType = "Integer"), @ApiImplicitParam(name = "workable", value = "1已落实0未落实", paramType = "query", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "isInConstruction", value = "1在施", paramType = "query", required = false, dataType = "Integer"), }) @GetMapping(value = "/page") public Result> queryPageList(@ApiIgnore @RequestParam HashMap param) { @@ -205,7 +207,7 @@ public class RiskListSourceController { }) @PostMapping(value = "/batchSetField") public Result batchSetField(@RequestBody Map param) { - List> updates = com.gexin.fastjson.JSON.parseObject(JSON.toJSONString(param.get("updates")), new com.gexin.fastjson.TypeReference>>() { + List> updates = com.gexin.fastjson.JSON.parseObject(com.gexin.fastjson.JSON.toJSONString(param.get("updates"), SerializerFeature.WriteMapNullValue), new com.gexin.fastjson.TypeReference>>() { }); List fieldNames = new ArrayList<>(); Field[] fields = RiskListSource.class.getDeclaredFields(); // getFields() 只返回公共字段(包括继承的) @@ -367,17 +369,23 @@ public class RiskListSourceController { List addList = new ArrayList<>(); List details = riskListDetailService.list(new LambdaQueryWrapper() .in(RiskListDetail::getId, StrUtil.split(MapUtils.getString(param, "detailIds"), ","))); + Long pointId = MapUtils.getLong(param, "pointId"); + RiskListPoint point = riskListPointService.getById(pointId); + if (point == null) { + throw new OpenAlertException("管控清单风险点不存在"); + } for (RiskListDetail detail : details) { RiskListSource source = new RiskListSource(); BeanUtils.copyProperties(detail, source); source.setId(null); source.setDetailId(detail.getId()); - source.setPointId(MapUtils.getLong(param, "pointId")); + source.setPointId(pointId); source.setCreateTime(new Date()); source.setUpdateTime(new Date()); source.setEffectiveTimeBegin(source.getEffectiveTimeBegin()); source.setEffectiveTimeEnd(source.getEffectiveTimeEnd()); source.setIdentificationTime(new Date()); + source.setProjectSn(point.getProjectSn()); addList.add(source); } if (CollUtil.isNotEmpty(addList)) { @@ -441,12 +449,13 @@ public class RiskListSourceController { objectMap.put("no", i + 1); objectMap.put("subProjectWorkTask", sourceVo.getSubProjectWorkTask()); objectMap.put("accidentTypeName", sourceVo.getAccidentTypeName()); + objectMap.put("activityFrequency", sourceVo.getActivityFrequency()); objectMap.put("areaLocation", sourceVo.getAreaLocation()); if (StrUtil.isNotBlank(sourceVo.getSpecificResponsibilityAreaNames())) { List areas = new ArrayList<>(); List split = StrUtil.split(sourceVo.getSpecificResponsibilityAreaNames(), ","); for (int j = 0; j < split.size(); j++) { - areas.add("区域:" + (j + 1) + split.get(j)); + areas.add("区域" + (j + 1) + ":" + split.get(j)); } objectMap.put("specificResponsibilityAreaNames", StrUtil.join("\n", areas)); } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java new file mode 100644 index 000000000..76a10a039 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java @@ -0,0 +1,85 @@ +package com.zhgd.xmgl.modules.risk.controller; + +import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.xmgl.base.entity.vo.SectorVo; +import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo; +import com.zhgd.xmgl.modules.risk.service.IRegionV2Service; +import com.zhgd.xmgl.modules.risk.service.IRiskListDetailService; +import com.zhgd.xmgl.modules.risk.service.IRiskListPotentialAccidentTypeService; +import com.zhgd.xmgl.modules.risk.service.IRiskListSourceService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import springfox.documentation.annotations.ApiIgnore; + +import java.util.HashMap; +import java.util.List; + + +/** + * @Title: Controller + * @Description: 管控清单危险源数据中心 + * @author: pds + * @date: 2025-06-09 + * @version: V1.0 + */ +@RestController +@RequestMapping("/xmgl/riskListSourceDataCenter") +@Slf4j +@Api(tags = "管控清单危险源数据中心相关Api") +public class RiskListSourceDataCenterController { + @Lazy + @Autowired + private IRiskListSourceService riskListSourceService; + @Lazy + @Autowired + private IRegionV2Service regionV2Service; + @Lazy + @Autowired + private IRiskListDetailService riskListDetailService; + @Lazy + @Autowired + private IRiskListPotentialAccidentTypeService riskListPotentialAccidentTypeService; + + @ApiOperation(value = "统计风险等级数量", notes = "统计风险等级数量", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "isInConstruction", value = "1在施", paramType = "query", required = false, dataType = "Integer"), + @ApiImplicitParam(name = "projectType", value = "工程类别(字典值)", paramType = "query", required = false, dataType = "Integer"), + }) + @GetMapping(value = "/countRisksByLevel") + public Result countRisksByLevel(@ApiIgnore @RequestParam HashMap param) { + return Result.success(riskListSourceService.countRisksByLevel(param)); + } + + @ApiOperation(value = "风险走势图(按月统计)", notes = "风险走势图(按月统计)", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "startTime", value = "开始时间(yyyy-MM)", paramType = "body", required = true, dataType = "String"), + @ApiImplicitParam(name = "endTime", value = "结束时间(yyyy-MM)", paramType = "body", required = true, dataType = "String"), + }) + @GetMapping(value = "/getRiskTrendChart") + public Result> getRiskTrendChart(@ApiIgnore @RequestParam HashMap param) { + return Result.success(riskListSourceService.getRiskTrendChart(param)); + } + + @ApiOperation(value = "(在施)风险类型占比", notes = "(在施)风险类型占比", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "query", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "isInConstruction", value = "1在施", paramType = "query", required = false, dataType = "Integer"), + }) + @GetMapping(value = "/countRisksByLibrary") + public Result countRisksByLibrary(@RequestParam @ApiIgnore HashMap map) { + return Result.success(riskListSourceService.countRisksByLibrary(map)); + } + +} + diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/CountRisksByLevelVo.java b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/CountRisksByLevelVo.java new file mode 100644 index 000000000..aab2ec2d1 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/CountRisksByLevelVo.java @@ -0,0 +1,46 @@ +package com.zhgd.xmgl.modules.risk.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class CountRisksByLevelVo { + /** + * 重大风险数量 + */ + @ApiModelProperty(value = "重大风险数量") + private java.lang.Integer zdNum; + /** + * 较大风险数量 + */ + @ApiModelProperty(value = "较大风险数量") + private java.lang.Integer jdNum; + /** + * 一般风险数量 + */ + @ApiModelProperty(value = "一般风险数量") + private java.lang.Integer ybNum; + /** + * 低风险数量 + */ + @ApiModelProperty(value = "低风险数量") + private java.lang.Integer dNum; + /** + * 危险源总数 + */ + @ApiModelProperty(value = "危险源总数") + private java.lang.Integer total; + /** + * 年-月 + */ + @ApiModelProperty(value = "年-月") + private java.lang.String yearMonth; + /** + * 月度环比% + */ + @ApiModelProperty(value = "月度环比%") + private BigDecimal moMChange; + +} diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListSourceVo.java b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListSourceVo.java index 692a3856d..585e0ffc8 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListSourceVo.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/entity/vo/RiskListSourceVo.java @@ -1,5 +1,6 @@ package com.zhgd.xmgl.modules.risk.entity.vo; +import com.baomidou.mybatisplus.annotation.TableField; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; import io.swagger.annotations.ApiModelProperty; import lombok.Data; diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/RiskListSourceMapper.java b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/RiskListSourceMapper.java index 161954796..558a11bb6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/RiskListSourceMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/RiskListSourceMapper.java @@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.xmgl.base.entity.vo.SectorOneVo; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; +import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -49,4 +51,8 @@ public interface RiskListSourceMapper extends BaseMapper { * @return */ RiskListSourceVo queryById(String id); + + CountRisksByLevelVo countRisksByLevel(HashMap param); + + List countRisksByLibrary(HashMap map); } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListPointMapper.xml b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListPointMapper.xml index 62f3ef28f..00bc7a98f 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListPointMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListPointMapper.xml @@ -10,12 +10,18 @@ and rll.project_type = #{param.projectType} - - and rll.id in (select id from risk_list_library where find_in_set(#{param.containLibraryId},ancestors) or - id=#{param.containLibraryId}) + + and rll.id in (select id from risk_list_library where + + FIND_IN_SET(#{libraryId}, ancestors) OR id = #{libraryId} + + ) - - and find_in_set(#{param.regionId},t.specific_responsibility_area_ids) + + and + + find_in_set(#{regionId},t.specific_responsibility_area_ids) + )t ${ew.customSqlSegment} diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListSourceMapper.xml b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListSourceMapper.xml index bd4229316..1495cf5d4 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListSourceMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/risk/mapper/xml/RiskListSourceMapper.xml @@ -7,6 +7,7 @@ ,rlp.risk_point_name ,rlpat.type as accident_type_name ,rll.node_name as list_library_name + ,#{param.workable} as workable from risk_list_source t join risk_list_point rlp on rlp.id=t.point_id left join risk_list_library rll on rll.id=rlp.risk_list_library_id @@ -45,11 +46,15 @@ and - find_in_set(#{regionId},rlp.specific_responsibility_area_ids) + find_in_set(#{regionId},t.specific_responsibility_area_ids) - and t.allow_generate_task=1 and t.effective_time_begin <= now() and t.effective_time_end >= now() + and t.allow_generate_task=1 and t.effective_time_begin <= current_date and t.effective_time_end >= + current_date + + + and t.effective_time_begin <= current_date and t.effective_time_end >= current_date )t ${ew.customSqlSegment} @@ -61,4 +66,40 @@ )t where t.id = #{id} + + + + diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/service/IRiskListSourceService.java b/src/main/java/com/zhgd/xmgl/modules/risk/service/IRiskListSourceService.java index 2743979b1..b985433af 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/service/IRiskListSourceService.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/service/IRiskListSourceService.java @@ -2,8 +2,10 @@ package com.zhgd.xmgl.modules.risk.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; +import com.zhgd.xmgl.base.entity.vo.SectorOneVo; +import com.zhgd.xmgl.base.entity.vo.SectorVo; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; -import com.zhgd.xmgl.modules.risk.entity.vo.RegionV2Vo; +import com.zhgd.xmgl.modules.risk.entity.vo.CountRisksByLevelVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo; @@ -68,4 +70,10 @@ public interface IRiskListSourceService extends IService { List getUndoneList(HashMap param); void addUsersNotice(List sourceVos); + + CountRisksByLevelVo countRisksByLevel(HashMap param); + + List getRiskTrendChart(HashMap param); + + SectorVo countRisksByLibrary(HashMap map); } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListPointServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListPointServiceImpl.java index e14dc1339..fcfe0a4e2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListPointServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListPointServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -20,6 +21,7 @@ import com.zhgd.xmgl.modules.risk.service.IRiskListSourceService; import com.zhgd.xmgl.util.MapBuilder; import com.zhgd.xmgl.util.PageUtil; import com.zhgd.xmgl.util.RefUtil; +import org.apache.commons.collections.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -48,6 +50,14 @@ public class RiskListPointServiceImpl extends ServiceImpl queryPageList(HashMap param) { + String containLibraryIds = MapUtils.getString(param, "containLibraryIds"); + if (StrUtil.isNotBlank(containLibraryIds)) { + param.put("containLibraryIdList", StrUtil.split(containLibraryIds, ",")); + } + String regionIds = MapUtils.getString(param, "regionIds"); + if (StrUtil.isNotBlank(regionIds)) { + param.put("regionIdList", StrUtil.split(regionIds, ",")); + } QueryWrapper queryWrapper = this.getQueryWrapper(param); Page page = PageUtil.getPage(param); IPage pageList = baseMapper.queryList(page, queryWrapper, param); @@ -99,6 +109,12 @@ public class RiskListPointServiceImpl extends ServiceImpl() + .set(RiskListPoint::getActivityFrequency, point.getActivityFrequency()) + .set(RiskListPoint::getEffectiveTimeBegin, point.getEffectiveTimeBegin()) + .set(RiskListPoint::getEffectiveTimeEnd, point.getEffectiveTimeEnd()) + .eq(RiskListPoint::getId, point.getId()) + ); } @Override @@ -107,6 +123,11 @@ public class RiskListPointServiceImpl extends ServiceImpl() + .eq(RiskListSource::getPointId, id)); + if (count > 0) { + throw new OpenAlertException("请先删除辨识的危险源"); + } baseMapper.deleteById(id); } diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java index 3a3f47d8f..39c31229e 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/service/impl/RiskListSourceServiceImpl.java @@ -2,15 +2,20 @@ package com.zhgd.xmgl.modules.risk.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.DateField; +import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.system.query.QueryGenerator; +import com.zhgd.xmgl.base.entity.vo.SectorOneVo; +import com.zhgd.xmgl.base.entity.vo.SectorVo; import com.zhgd.xmgl.modules.basicdata.entity.SystemUser; import com.zhgd.xmgl.modules.basicdata.service.INoticeService; import com.zhgd.xmgl.modules.basicdata.service.ISystemUserService; @@ -18,10 +23,7 @@ import com.zhgd.xmgl.modules.risk.entity.RiskListPoint; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; import com.zhgd.xmgl.modules.risk.entity.RiskListSourceUnbuilt; import com.zhgd.xmgl.modules.risk.entity.RiskListWorkable; -import com.zhgd.xmgl.modules.risk.entity.vo.RegionV2Vo; -import com.zhgd.xmgl.modules.risk.entity.vo.RiskListLibraryVo; -import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; -import com.zhgd.xmgl.modules.risk.entity.vo.RiskUndoneVo; +import com.zhgd.xmgl.modules.risk.entity.vo.*; import com.zhgd.xmgl.modules.risk.mapper.RiskListSourceMapper; import com.zhgd.xmgl.modules.risk.service.*; import com.zhgd.xmgl.modules.xz.security.entity.XzSecurityQualityInspectionRecord; @@ -34,6 +36,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import java.math.BigDecimal; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -179,6 +182,12 @@ public class RiskListSourceServiceImpl extends ServiceImpl() + .set(RiskListSource::getActivityFrequency, source.getActivityFrequency()) + .set(RiskListSource::getEffectiveTimeBegin, source.getEffectiveTimeBegin()) + .set(RiskListSource::getEffectiveTimeEnd, source.getEffectiveTimeEnd()) + .eq(RiskListSource::getId, source.getId()) + ); } @Override @@ -270,4 +279,43 @@ public class RiskListSourceServiceImpl extends ServiceImpl param) { + return baseMapper.countRisksByLevel(param); + } + + @Override + public List getRiskTrendChart(HashMap param) { + List sources = this.list(new LambdaQueryWrapper() + .select(RiskListSource::getId, RiskListSource::getEffectiveTimeBegin, RiskListSource::getEffectiveTimeEnd) + .eq(RiskListSource::getProjectSn, MapUtils.getString(param, "projectSn")) + .le(RiskListSource::getEffectiveTimeBegin, MapUtils.getString(param, "endTime") + "-31 23:59:59") + .ge(RiskListSource::getEffectiveTimeEnd, MapUtils.getString(param, "startTime") + "-01 00:00:00") + ).stream().sorted(Comparator.comparing(RiskListSource::getEffectiveTimeBegin)).collect(Collectors.toList()); + List months = DateUtil.rangeToList(DateUtil.parse(MapUtils.getString(param, "startTime")), DateUtil.parse(MapUtils.getString(param, "endTime")), DateField.MONTH); + ArrayList vos = new ArrayList<>(); + Integer lastTotal = null; + for (DateTime month : months) { + CountRisksByLevelVo vo = new CountRisksByLevelVo(); + vo.setZdNum((int) sources.stream().filter(s -> Objects.equals(s.getRiskLevel(), 1) && DateUtil.compare(s.getEffectiveTimeBegin(), month) <= 0 && DateUtil.compare(s.getEffectiveTimeEnd(), month) >= 0).count()); + vo.setJdNum((int) sources.stream().filter(s -> Objects.equals(s.getRiskLevel(), 2) && DateUtil.compare(s.getEffectiveTimeBegin(), month) <= 0 && DateUtil.compare(s.getEffectiveTimeEnd(), month) >= 0).count()); + vo.setYbNum((int) sources.stream().filter(s -> Objects.equals(s.getRiskLevel(), 3) && DateUtil.compare(s.getEffectiveTimeBegin(), month) <= 0 && DateUtil.compare(s.getEffectiveTimeEnd(), month) >= 0).count()); + vo.setDNum((int) sources.stream().filter(s -> Objects.equals(s.getRiskLevel(), 4) && DateUtil.compare(s.getEffectiveTimeBegin(), month) <= 0 && DateUtil.compare(s.getEffectiveTimeEnd(), month) >= 0).count()); + vo.setTotal((int) sources.stream().filter(s -> DateUtil.compare(s.getEffectiveTimeBegin(), month) <= 0 && DateUtil.compare(s.getEffectiveTimeEnd(), month) >= 0).count()); + vo.setYearMonth(DateUtil.format(month, "yyyy-MM")); + if (lastTotal != null) { + vo.setMoMChange(lastTotal != 0 ? new BigDecimal((vo.getTotal() * 1.0 / lastTotal - 1) * 100).setScale(2, BigDecimal.ROUND_HALF_UP) : null); + } + lastTotal = vo.getTotal(); + vos.add(vo); + } + return vos; + } + + @Override + public SectorVo countRisksByLibrary(HashMap map) { + List list = baseMapper.countRisksByLibrary(map); + return SectorVo.getSectorVo(list); + } } diff --git a/src/main/resources/excel/辨识清单导出模板.xlsx b/src/main/resources/excel/辨识清单导出模板.xlsx index 2d6156960a3a9ae07f205c57a367c5daca23291e..484ca5dd4b267997077b2f9dc655ce8890202ac1 100644 GIT binary patch delta 3225 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