Merge remote-tracking branch 'origin/master'
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
Some checks are pending
Gitea Actions Demo / Explore-Gitea-Actions (push) Waiting to run
This commit is contained in:
commit
7b74451547
18
pom.xml
18
pom.xml
@ -91,8 +91,22 @@
|
||||
<properties>
|
||||
<!-- 环境标识,需要与配置文件的名称相对应 -->
|
||||
<profiles.active>dev</profiles.active>
|
||||
<nacos.server>by.missmoc.top:8848</nacos.server>
|
||||
<logstash.address>by.missmoc.top:4560</logstash.address>
|
||||
<nacos.server>10.20.1.60:8848</nacos.server>
|
||||
<logstash.address>10.20.1.60:4560</logstash.address>
|
||||
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
|
||||
<nacos.config.group>DEFAULT_GROUP</nacos.config.group>
|
||||
<nacos.username>nacos</nacos.username>
|
||||
<nacos.password>nacos</nacos.password>
|
||||
</properties>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
<id>test</id>
|
||||
<properties>
|
||||
<!-- 环境标识,需要与配置文件的名称相对应 -->
|
||||
<profiles.active>test</profiles.active>
|
||||
<nacos.server>192.168.24.101:8848</nacos.server>
|
||||
<logstash.address>192.168.24.101:4560</logstash.address>
|
||||
<nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
|
||||
<nacos.config.group>DEFAULT_GROUP</nacos.config.group>
|
||||
<nacos.username>nacos</nacos.username>
|
||||
|
@ -120,6 +120,12 @@
|
||||
<artifactId>sis-api</artifactId>
|
||||
<version>2.4.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.dromara</groupId>
|
||||
<artifactId>ruoyi-system</artifactId>
|
||||
<version>2.4.0</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
@ -45,6 +45,9 @@ public class AttendanceArrangementController extends BaseController {
|
||||
return attendanceArrangementService.queryPageList(bo, pageQuery);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 查询某个月的日历排班信息的排班列表
|
||||
*/
|
||||
|
@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.property.domain.bo.AttendanceArrangementBo;
|
||||
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -103,4 +105,13 @@ public class AttendanceUserGroupController extends BaseController {
|
||||
@PathVariable("ids") Long[] ids) {
|
||||
return toAjax(attendanceUserGroupService.deleteWithValidByIds(List.of(ids), true));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询排班的班表视图
|
||||
*/
|
||||
@SaCheckPermission("Property:userGroup:queryScheduleView")
|
||||
@GetMapping("/queryScheduleView")
|
||||
public TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) {
|
||||
return attendanceUserGroupService.queryScheduleView(bo, pageQuery);
|
||||
}
|
||||
}
|
||||
|
@ -6,9 +6,6 @@ import lombok.RequiredArgsConstructor;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import jakarta.validation.constraints.*;
|
||||
import cn.dev33.satoken.annotation.SaCheckPermission;
|
||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
import org.dromara.property.service.IInspectionTaskDetailService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.dromara.common.idempotent.annotation.RepeatSubmit;
|
||||
@ -20,14 +17,17 @@ import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.excel.utils.ExcelUtil;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||
import org.dromara.property.service.IInspectionTaskDetailService;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
|
||||
/**
|
||||
* 巡检明细
|
||||
* 前端访问路由地址为:/system/taskDetail
|
||||
* 前端访问路由地址为:/property/taskDetail
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Validated
|
||||
@RequiredArgsConstructor
|
||||
@ -40,7 +40,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
/**
|
||||
* 查询巡检明细列表
|
||||
*/
|
||||
//@SaCheckPermission("system:taskDetail:list")
|
||||
@SaCheckPermission("property:taskDetail:list")
|
||||
@GetMapping("/list")
|
||||
public TableDataInfo<InspectionTaskDetailVo> list(InspectionTaskDetailBo bo, PageQuery pageQuery) {
|
||||
return inspectionTaskDetailService.queryPageList(bo, pageQuery);
|
||||
@ -49,7 +49,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
/**
|
||||
* 导出巡检明细列表
|
||||
*/
|
||||
@SaCheckPermission("system:taskDetail:export")
|
||||
@SaCheckPermission("property:taskDetail:export")
|
||||
@Log(title = "巡检明细", businessType = BusinessType.EXPORT)
|
||||
@PostMapping("/export")
|
||||
public void export(InspectionTaskDetailBo bo, HttpServletResponse response) {
|
||||
@ -62,7 +62,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
*
|
||||
* @param id 主键
|
||||
*/
|
||||
@SaCheckPermission("system:taskDetail:query")
|
||||
@SaCheckPermission("property:taskDetail:query")
|
||||
@GetMapping("/{id}")
|
||||
public R<InspectionTaskDetailVo> getInfo(@NotNull(message = "主键不能为空")
|
||||
@PathVariable("id") Long id) {
|
||||
@ -72,7 +72,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
/**
|
||||
* 新增巡检明细
|
||||
*/
|
||||
@SaCheckPermission("system:taskDetail:add")
|
||||
@SaCheckPermission("property:taskDetail:add")
|
||||
@Log(title = "巡检明细", businessType = BusinessType.INSERT)
|
||||
@RepeatSubmit()
|
||||
@PostMapping()
|
||||
@ -83,7 +83,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
/**
|
||||
* 修改巡检明细
|
||||
*/
|
||||
@SaCheckPermission("system:taskDetail:edit")
|
||||
@SaCheckPermission("property:taskDetail:edit")
|
||||
@Log(title = "巡检明细", businessType = BusinessType.UPDATE)
|
||||
@RepeatSubmit()
|
||||
@PutMapping()
|
||||
@ -96,7 +96,7 @@ public class InspectionTaskDetailController extends BaseController {
|
||||
*
|
||||
* @param ids 主键串
|
||||
*/
|
||||
@SaCheckPermission("system:taskDetail:remove")
|
||||
@SaCheckPermission("property:taskDetail:remove")
|
||||
@Log(title = "巡检明细", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public R<Void> remove(@NotEmpty(message = "主键不能为空")
|
||||
|
@ -4,8 +4,12 @@ import org.dromara.common.tenant.core.TenantEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.system.domain.SysUser;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.time.LocalDate;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 排班明细对象 attendance_user_group
|
||||
@ -37,20 +41,32 @@ public class AttendanceUserGroup extends TenantEntity {
|
||||
*/
|
||||
private Long employeeId;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
private String employeeName;
|
||||
// /**
|
||||
// * 员工姓名
|
||||
// */
|
||||
// private String employeeName;
|
||||
|
||||
/**
|
||||
* 部门ID
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
// /**
|
||||
// * 部门名称
|
||||
// */
|
||||
// private String deptName;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
* 开始日期
|
||||
*/
|
||||
private String deptName;
|
||||
private LocalDate startDate;
|
||||
|
||||
/**
|
||||
* 结束日期(仅date_type=3时有效)
|
||||
*/
|
||||
private LocalDate endDate;
|
||||
|
||||
// private SysUser sysUser;
|
||||
|
||||
|
||||
}
|
||||
|
@ -4,8 +4,10 @@ import org.dromara.common.tenant.core.TenantEntity;
|
||||
import com.baomidou.mybatisplus.annotation.*;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import java.util.Date;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
|
||||
import java.io.Serial;
|
||||
|
||||
@ -13,7 +15,7 @@ import java.io.Serial;
|
||||
* 巡检明细对象 inspection_task_detail
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ -55,20 +57,60 @@ public class InspectionTaskDetail extends TenantEntity {
|
||||
private String patrolType;
|
||||
|
||||
/**
|
||||
* 签到类型
|
||||
* 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)
|
||||
*/
|
||||
private String signType;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
private Date actualInspectionTime;
|
||||
|
||||
/**
|
||||
* 实际签到状态(1已签到2.未签到)
|
||||
*/
|
||||
private String actualSignState;
|
||||
|
||||
/**
|
||||
* 巡检状态(0未完成,1已完成)
|
||||
*/
|
||||
private String inspectionState;
|
||||
|
||||
/**
|
||||
* 巡检照片
|
||||
* 巡检图片
|
||||
*/
|
||||
private String inspectionImage;
|
||||
|
||||
/**
|
||||
* 计划巡检人
|
||||
*/
|
||||
private String planInspectionPerson;
|
||||
|
||||
/**
|
||||
* 实际巡检人
|
||||
*/
|
||||
private String actualInspectionPerson;
|
||||
|
||||
/**
|
||||
* 任务状态
|
||||
*/
|
||||
private String taskStatus;
|
||||
|
||||
/**
|
||||
* 巡检结果
|
||||
*/
|
||||
private String inspectionResults;
|
||||
|
||||
/**
|
||||
* 巡检描述
|
||||
*/
|
||||
private String inspectionDesc;
|
||||
|
||||
/**
|
||||
* 巡检位置
|
||||
*/
|
||||
private String inspectionLocation;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
@ -89,4 +131,10 @@ public class InspectionTaskDetail extends TenantEntity {
|
||||
*/
|
||||
private Date pointEndTime;
|
||||
|
||||
/**
|
||||
* 搜索值
|
||||
*/
|
||||
private String searchValue;
|
||||
|
||||
|
||||
}
|
||||
|
@ -105,6 +105,10 @@ public class ServiceWorkOrders extends TenantEntity {
|
||||
* 工单图片
|
||||
*/
|
||||
private String orderImgUrl;
|
||||
/**
|
||||
* 上报类型
|
||||
*/
|
||||
private String reportingType;
|
||||
/**
|
||||
* 备注
|
||||
*/
|
||||
|
@ -84,6 +84,10 @@ public class AttendanceArrangementBo extends BaseEntity {
|
||||
*/
|
||||
private Long status;
|
||||
|
||||
private List<Long> employeeId;
|
||||
|
||||
private List<Long> deptId;
|
||||
|
||||
/**
|
||||
*
|
||||
* 排班用户组
|
||||
|
@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 排班明细业务对象 attendance_user_group
|
||||
@ -36,20 +39,36 @@ public class AttendanceUserGroupBo extends BaseEntity {
|
||||
*/
|
||||
private Long employeeId;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
private String employeeName;
|
||||
// /**
|
||||
// * 员工姓名
|
||||
// */
|
||||
// private String employeeName;
|
||||
|
||||
/**
|
||||
* 部门ID
|
||||
*/
|
||||
private Long deptId;
|
||||
|
||||
// /**
|
||||
// * 部门名称
|
||||
// */
|
||||
// private String deptName;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
* 开始日期
|
||||
*/
|
||||
private String deptName;
|
||||
private LocalDate startDate;
|
||||
|
||||
/**
|
||||
* 结束日期(仅date_type=3时有效)
|
||||
*/
|
||||
private LocalDate endDate;
|
||||
|
||||
|
||||
/**
|
||||
* 前端传某天的当前日期
|
||||
*/
|
||||
private LocalDate currentDate;
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.dromara.property.domain.bo;
|
||||
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import org.dromara.common.mybatis.core.domain.BaseEntity;
|
||||
import org.dromara.common.core.validate.AddGroup;
|
||||
import org.dromara.common.core.validate.EditGroup;
|
||||
@ -7,14 +8,16 @@ import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import jakarta.validation.constraints.*;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
|
||||
/**
|
||||
* 巡检明细业务对象 inspection_task_detail
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ -55,20 +58,60 @@ public class InspectionTaskDetailBo extends BaseEntity {
|
||||
private String patrolType;
|
||||
|
||||
/**
|
||||
* 签到类型
|
||||
* 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)
|
||||
*/
|
||||
private String signType;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
private Date actualInspectionTime;
|
||||
|
||||
/**
|
||||
* 实际签到状态(1已签到2.未签到)
|
||||
*/
|
||||
private String actualSignState;
|
||||
|
||||
/**
|
||||
* 巡检状态(0未完成,1已完成)
|
||||
*/
|
||||
private String inspectionState;
|
||||
|
||||
/**
|
||||
* 巡检照片
|
||||
* 巡检图片
|
||||
*/
|
||||
private String inspectionImage;
|
||||
|
||||
/**
|
||||
* 计划巡检人
|
||||
*/
|
||||
private String planInspectionPerson;
|
||||
|
||||
/**
|
||||
* 实际巡检人
|
||||
*/
|
||||
private String actualInspectionPerson;
|
||||
|
||||
/**
|
||||
* 任务状态
|
||||
*/
|
||||
private String taskStatus;
|
||||
|
||||
/**
|
||||
* 巡检结果
|
||||
*/
|
||||
private String inspectionResults;
|
||||
|
||||
/**
|
||||
* 巡检描述
|
||||
*/
|
||||
private String inspectionDesc;
|
||||
|
||||
/**
|
||||
* 巡检位置
|
||||
*/
|
||||
private String inspectionLocation;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
|
@ -3,6 +3,7 @@ package org.dromara.property.domain.bo;
|
||||
|
||||
import cn.idev.excel.annotation.ExcelProperty;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
@ -26,7 +27,7 @@ public class ServiceWorkOrdersBo extends BaseEntity {
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
@NotNull(message = "id不能为空", groups = { EditGroup.class })
|
||||
@NotBlank(message = "id不能为空", groups = { EditGroup.class })
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
@ -37,7 +38,7 @@ public class ServiceWorkOrdersBo extends BaseEntity {
|
||||
/**
|
||||
* 工单名称
|
||||
*/
|
||||
@NotNull(message = "工单名称不能为空", groups = { EditGroup.class })
|
||||
@NotBlank(message = "工单名称不能为空", groups = { EditGroup.class })
|
||||
private String orderName;
|
||||
/**
|
||||
* 权重
|
||||
@ -49,6 +50,11 @@ public class ServiceWorkOrdersBo extends BaseEntity {
|
||||
*/
|
||||
@NotNull(message = "工单类型不能为空", groups = { EditGroup.class })
|
||||
private Long type;
|
||||
/**
|
||||
* 上报类型
|
||||
*/
|
||||
@NotBlank(message = "上报类型不能为空", groups = { EditGroup.class })
|
||||
private String reportingType;
|
||||
|
||||
/**
|
||||
* 状态
|
||||
|
@ -79,7 +79,7 @@ public class AttendanceArrangementVo implements Serializable {
|
||||
private AttendanceGroup attendanceGroup;
|
||||
|
||||
//用户组
|
||||
private List<AttendanceUserGroup> userGroupList;
|
||||
private List<AttendanceUserGroupVo> userGroupList;
|
||||
|
||||
//固定排班
|
||||
private AttendanceWeekSet weekSet;
|
||||
|
@ -1,15 +1,19 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
|
||||
import org.dromara.property.domain.AttendanceUserGroup;
|
||||
import org.dromara.property.domain.*;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import cn.idev.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.system.domain.SysUser;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.springframework.format.annotation.DateTimeFormat;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.time.LocalDate;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
@ -46,11 +50,11 @@ public class AttendanceUserGroupVo implements Serializable {
|
||||
@ExcelProperty(value = "员工ID")
|
||||
private Long employeeId;
|
||||
|
||||
/**
|
||||
* 员工姓名
|
||||
*/
|
||||
@ExcelProperty(value = "员工姓名")
|
||||
private String employeeName;
|
||||
// /**
|
||||
// * 员工姓名
|
||||
// */
|
||||
// @ExcelProperty(value = "员工姓名")
|
||||
// private String employeeName;
|
||||
|
||||
/**
|
||||
* 部门ID
|
||||
@ -58,11 +62,33 @@ public class AttendanceUserGroupVo implements Serializable {
|
||||
@ExcelProperty(value = "部门ID")
|
||||
private Long deptId;
|
||||
|
||||
// /**
|
||||
// * 部门名称
|
||||
// */
|
||||
// @ExcelProperty(value = "部门名称")
|
||||
// private String deptName;
|
||||
|
||||
/**
|
||||
* 部门名称
|
||||
* 开始日期
|
||||
*/
|
||||
@ExcelProperty(value = "部门名称")
|
||||
private String deptName;
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate startDate;
|
||||
|
||||
/**
|
||||
* 结束日期(仅date_type=3时有效)
|
||||
*/
|
||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
||||
private LocalDate endDate;
|
||||
|
||||
private AttendanceArrangement attendanceArrangement;
|
||||
|
||||
private AttendanceGroup attendanceGroup;
|
||||
|
||||
private AttendanceShift attendanceShift;
|
||||
|
||||
private AttendanceScheduleCycle scheduleCycle;
|
||||
|
||||
private SysUserVo sysUser;
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,10 +1,16 @@
|
||||
package org.dromara.property.domain.vo;
|
||||
|
||||
import org.dromara.common.translation.annotation.Translation;
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import org.dromara.common.translation.constant.TransConstant;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import cn.idev.excel.annotation.ExcelProperty;
|
||||
import org.dromara.common.excel.annotation.ExcelDictFormat;
|
||||
import org.dromara.common.excel.convert.ExcelDictConvert;
|
||||
import io.github.linpeilie.annotations.AutoMapper;
|
||||
import lombok.Data;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
@ -16,7 +22,7 @@ import java.util.Date;
|
||||
* 巡检明细视图对象 inspection_task_detail
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@ -63,11 +69,23 @@ public class InspectionTaskDetailVo implements Serializable {
|
||||
private String patrolType;
|
||||
|
||||
/**
|
||||
* 签到类型
|
||||
* 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)
|
||||
*/
|
||||
@ExcelProperty(value = "签到类型")
|
||||
@ExcelProperty(value = "签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)")
|
||||
private String signType;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
@ExcelProperty(value = "实际巡检时间")
|
||||
private Date actualInspectionTime;
|
||||
|
||||
/**
|
||||
* 实际签到状态(1已签到2.未签到)
|
||||
*/
|
||||
@ExcelProperty(value = "实际签到状态(1已签到2.未签到)")
|
||||
private String actualSignState;
|
||||
|
||||
/**
|
||||
* 巡检状态(0未完成,1已完成)
|
||||
*/
|
||||
@ -75,11 +93,52 @@ public class InspectionTaskDetailVo implements Serializable {
|
||||
private String inspectionState;
|
||||
|
||||
/**
|
||||
* 巡检照片
|
||||
* 巡检图片
|
||||
*/
|
||||
@ExcelProperty(value = "巡检照片")
|
||||
@ExcelProperty(value = "巡检图片")
|
||||
private String inspectionImage;
|
||||
|
||||
/**
|
||||
* 巡检图片Url
|
||||
*/
|
||||
@Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "inspectionImage")
|
||||
private String inspectionImageUrl;
|
||||
/**
|
||||
* 计划巡检人
|
||||
*/
|
||||
@ExcelProperty(value = "计划巡检人")
|
||||
private String planInspectionPerson;
|
||||
|
||||
/**
|
||||
* 实际巡检人
|
||||
*/
|
||||
@ExcelProperty(value = "实际巡检人")
|
||||
private String actualInspectionPerson;
|
||||
|
||||
/**
|
||||
* 任务状态
|
||||
*/
|
||||
@ExcelProperty(value = "任务状态")
|
||||
private String taskStatus;
|
||||
|
||||
/**
|
||||
* 巡检结果
|
||||
*/
|
||||
@ExcelProperty(value = "巡检结果")
|
||||
private String inspectionResults;
|
||||
|
||||
/**
|
||||
* 巡检描述
|
||||
*/
|
||||
@ExcelProperty(value = "巡检描述")
|
||||
private String inspectionDesc;
|
||||
|
||||
/**
|
||||
* 巡检位置
|
||||
*/
|
||||
@ExcelProperty(value = "巡检位置")
|
||||
private String inspectionLocation;
|
||||
|
||||
/**
|
||||
* 实际巡检时间
|
||||
*/
|
||||
|
@ -48,6 +48,10 @@ public class ServiceWorkOrdersInfoVo implements Serializable {
|
||||
*/
|
||||
@ExcelProperty(value = "工单类型")
|
||||
private Long type;
|
||||
/**
|
||||
* 上报类型
|
||||
*/
|
||||
private String reportingType;
|
||||
/**
|
||||
* 权重
|
||||
*/
|
||||
|
@ -54,6 +54,10 @@ public class ServiceWorkOrdersVo implements Serializable {
|
||||
*/
|
||||
@ExcelProperty(value = "工单类型")
|
||||
private Long type;
|
||||
/**
|
||||
* 上报类型
|
||||
*/
|
||||
private String reportingType;
|
||||
/**
|
||||
* 工单类型名称
|
||||
*/
|
||||
|
@ -1,17 +1,15 @@
|
||||
package org.dromara.property.mapper;
|
||||
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
|
||||
|
||||
/**
|
||||
* 巡检明细Mapper接口
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Mapper
|
||||
public interface InspectionTaskDetailMapper extends BaseMapperPlus<InspectionTaskDetail, InspectionTaskDetailVo> {
|
||||
|
||||
}
|
||||
|
@ -67,4 +67,5 @@ public interface IAttendanceArrangementService {
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
|
||||
// TableDataInfo<AttendanceArrangementVo> queryScheduleView(AttendanceArrangementBo bo, PageQuery pageQuery);
|
||||
}
|
||||
|
@ -1,6 +1,5 @@
|
||||
package org.dromara.property.service;
|
||||
|
||||
import org.dromara.property.domain.AttendanceUserGroup;
|
||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
@ -66,4 +65,6 @@ public interface IAttendanceUserGroupService {
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery);
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
package org.dromara.property.service;
|
||||
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@ -12,7 +13,7 @@ import java.util.List;
|
||||
* 巡检明细Service接口
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
public interface IInspectionTaskDetailService {
|
||||
|
||||
|
@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.beanutils.BeanUtils;
|
||||
import org.apache.dubbo.config.annotation.DubboReference;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
@ -16,8 +18,13 @@ import org.dromara.property.domain.*;
|
||||
import org.dromara.property.domain.bo.AttendanceArrangementBo;
|
||||
import org.dromara.property.domain.constant.StatusConstant;
|
||||
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||
import org.dromara.property.mapper.*;
|
||||
import org.dromara.property.service.IAttendanceArrangementService;
|
||||
import org.dromara.system.domain.SysUser;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.dromara.system.mapper.SysUserMapper;
|
||||
import org.dromara.system.service.ISysUserService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
@ -54,6 +61,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
|
||||
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
|
||||
|
||||
@DubboReference
|
||||
private final ISysUserService sysUserService;
|
||||
/**
|
||||
* 查询排班
|
||||
*
|
||||
@ -70,7 +79,12 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
vo.setAttendanceGroup(attendanceGroup);
|
||||
|
||||
//根据id查询排班人员信息
|
||||
List<AttendanceUserGroup> userGroupList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id));
|
||||
List<AttendanceUserGroupVo> userGroupList = userGroupMapper.selectVoList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id));
|
||||
//查询所有的用户信息
|
||||
userGroupList.forEach(userGroup -> {
|
||||
SysUserVo sysUserVo = sysUserService.selectUserById(userGroup.getEmployeeId());
|
||||
userGroup.setSysUser(sysUserVo);
|
||||
});
|
||||
//将排班人员信息添加到排班信息中
|
||||
vo.setUserGroupList(userGroupList);
|
||||
return vo;
|
||||
@ -95,6 +109,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
Page<AttendanceArrangementVo> result = baseMapper.selectVoPage(pageQuery.build(), ge);
|
||||
|
||||
Page<AttendanceArrangementVo> attendanceArrangementVoPage = result.setRecords(result.getRecords().stream().map(vo -> {
|
||||
|
||||
|
||||
//根据当前日期查询在开始时间和结束时间之间的排班信息
|
||||
//从前端查询出来的当前日期,判断是否在排班时间内
|
||||
if ((bo.getCurrentDate().isAfter(vo.getStartDate()) || bo.getCurrentDate().isEqual(vo.getStartDate())) && (bo.getCurrentDate().isBefore(vo.getEndDate()) || bo.getCurrentDate().isEqual(vo.getEndDate()))) {
|
||||
@ -102,8 +118,20 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
//根据查询出来的result取出shceduleId
|
||||
Long scheduleId = vo.getId();
|
||||
//根据排班的id查询出排班的人员详细信息
|
||||
List<AttendanceUserGroup> userGroupList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId));
|
||||
vo.setUserGroupList(userGroupList);
|
||||
// List<AttendanceUserGroup> userGroupList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId));
|
||||
List<AttendanceUserGroupVo> userGroupVoList = userGroupMapper.selectVoList(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId));
|
||||
//通过userGroupList查询出人员的详细信息
|
||||
|
||||
//将userList存到userGroupList中
|
||||
userGroupVoList.forEach(userGroup -> {
|
||||
SysUserVo sysUserVo = sysUserService.selectUserById(userGroup.getEmployeeId());
|
||||
// SysUserVo sysUserVo1 = sysUserService.selectUserById(userGroupVoList.get(0).getEmployeeId());
|
||||
userGroup.setSysUser(sysUserVo);
|
||||
// userGroup.setSysUser(sysUserVo1);
|
||||
}
|
||||
);
|
||||
|
||||
vo.setUserGroupList(userGroupVoList);
|
||||
|
||||
//2.查询考勤组信息
|
||||
//根据查询出来的信息取出考勤组的id
|
||||
@ -255,6 +283,7 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
return TableDataInfo.build(attendanceArrangementVoPage);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询某个月的日历排班信息的排班列表
|
||||
*
|
||||
@ -308,7 +337,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
// 循环排班列表,查询排班人员信息
|
||||
for (AttendanceArrangementVo vo : result) {
|
||||
// 根据排班查询出人员组的详细信息
|
||||
List<AttendanceUserGroup> userGroupList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId()));
|
||||
// List<AttendanceUserGroup> userGroupList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId()));
|
||||
List<AttendanceUserGroupVo> userGroupList = userGroupMapper.selectVoList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId()));
|
||||
// 将排班人员信息添加到排班信息中
|
||||
vo.setUserGroupList(userGroupList);
|
||||
|
||||
@ -438,14 +468,14 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
judgeDate(bo, add);
|
||||
|
||||
|
||||
|
||||
|
||||
//取出当前新增的排班的id
|
||||
Long ArrangementId = add.getId();
|
||||
//用获取到的排班id向attendanceUserGroup表中插入数据
|
||||
List<AttendanceUserGroup> userGroupList = bo.getUserGroupList();
|
||||
for (AttendanceUserGroup userGroup : userGroupList) {
|
||||
userGroup.setScheduleId(ArrangementId);
|
||||
userGroup.setStartDate(bo.getStartDate());
|
||||
userGroup.setEndDate(bo.getEndDate());
|
||||
userGroupMapper.insert(userGroup);
|
||||
}
|
||||
|
||||
@ -484,15 +514,29 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
|
||||
|
||||
// judgeDate(bo, update);
|
||||
|
||||
//根据排班id获取人员id
|
||||
//根据人员id删除人员信息
|
||||
//新增人员信息
|
||||
//根据排班id获取部门id
|
||||
//根据部门id删除部门信息
|
||||
//新增部门信息
|
||||
|
||||
//取出当前排班的id
|
||||
assert update != null;
|
||||
Long ArrangementId = update.getId();
|
||||
//根据arrangementId查询出人员组的所有employeeId
|
||||
List<Long> employeeIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
|
||||
.stream().map(AttendanceUserGroup::getEmployeeId).toList();
|
||||
.stream().map(AttendanceUserGroup::getEmployeeId).toList();
|
||||
//根据employeeId和ArrangementId删除attendanceUserGroup表中的数据
|
||||
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList)
|
||||
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
||||
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
||||
|
||||
//根据排班id获取部门id
|
||||
List<Long> deptIdList = userGroupMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId))
|
||||
.stream().map(AttendanceUserGroup::getDeptId).toList();
|
||||
//根据deptId和ArrangementId删除attendanceDeptGroup表中的数据
|
||||
userGroupMapper.delete(Wrappers.<AttendanceUserGroup>lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList)
|
||||
.eq(AttendanceUserGroup::getScheduleId, ArrangementId));
|
||||
|
||||
|
||||
//用获取到的排班id向attendanceUserGroup表中批量插入数据
|
||||
|
@ -9,16 +9,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.property.domain.*;
|
||||
import org.dromara.property.domain.bo.AttendanceArrangementBo;
|
||||
import org.dromara.property.domain.constant.StatusConstant;
|
||||
import org.dromara.property.domain.vo.AttendanceArrangementVo;
|
||||
import org.dromara.property.mapper.*;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.AttendanceUserGroupBo;
|
||||
import org.dromara.property.domain.vo.AttendanceUserGroupVo;
|
||||
import org.dromara.property.domain.AttendanceUserGroup;
|
||||
import org.dromara.property.mapper.AttendanceUserGroupMapper;
|
||||
import org.dromara.property.service.IAttendanceUserGroupService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Collection;
|
||||
import java.time.LocalDate;
|
||||
import java.time.ZoneId;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 排班明细Service业务层处理
|
||||
@ -33,6 +38,16 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
||||
|
||||
private final AttendanceUserGroupMapper baseMapper;
|
||||
|
||||
private final AttendanceArrangementMapper arrangementMapper;
|
||||
|
||||
private final AttendanceGroupMapper groupMapper;
|
||||
|
||||
private final AttendanceWeekSetMapper weekSetMapper;
|
||||
|
||||
private final AttendanceShiftMapper shiftMapper;
|
||||
|
||||
private final AttendanceScheduleCycleMapper scheduleCycleMapper;
|
||||
|
||||
/**
|
||||
* 查询排班明细
|
||||
*
|
||||
@ -40,7 +55,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
||||
* @return 排班明细
|
||||
*/
|
||||
@Override
|
||||
public AttendanceUserGroupVo queryById(Long id){
|
||||
public AttendanceUserGroupVo queryById(Long id) {
|
||||
return baseMapper.selectVoById(id);
|
||||
}
|
||||
|
||||
@ -76,9 +91,9 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
||||
lqw.orderByAsc(AttendanceUserGroup::getId);
|
||||
lqw.eq(bo.getScheduleId() != null, AttendanceUserGroup::getScheduleId, bo.getScheduleId());
|
||||
lqw.eq(bo.getEmployeeId() != null, AttendanceUserGroup::getEmployeeId, bo.getEmployeeId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), AttendanceUserGroup::getEmployeeName, bo.getEmployeeName());
|
||||
// lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), AttendanceUserGroup::getEmployeeName, bo.getEmployeeName());
|
||||
lqw.eq(bo.getDeptId() != null, AttendanceUserGroup::getDeptId, bo.getDeptId());
|
||||
lqw.like(StringUtils.isNotBlank(bo.getDeptName()), AttendanceUserGroup::getDeptName, bo.getDeptName());
|
||||
// lqw.like(StringUtils.isNotBlank(bo.getDeptName()), AttendanceUserGroup::getDeptName, bo.getDeptName());
|
||||
return lqw;
|
||||
}
|
||||
|
||||
@ -115,7 +130,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
||||
/**
|
||||
* 保存前的数据校验
|
||||
*/
|
||||
private void validEntityBeforeSave(AttendanceUserGroup entity){
|
||||
private void validEntityBeforeSave(AttendanceUserGroup entity) {
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
@ -128,9 +143,109 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi
|
||||
*/
|
||||
@Override
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteByIds(ids) > 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询排班的班表视图
|
||||
*/
|
||||
@Override
|
||||
public TableDataInfo<AttendanceUserGroupVo> queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) {
|
||||
LambdaQueryWrapper<AttendanceUserGroup> lqw = buildQueryWrapper(bo);
|
||||
//查询当前日期在哪些人员组中,当前日期大于等于人员组开始日期,小于等于人员组结束日期
|
||||
LambdaQueryWrapper<AttendanceUserGroup> ge = lqw
|
||||
.le(AttendanceUserGroup::getStartDate, bo.getCurrentDate())
|
||||
.ge(AttendanceUserGroup::getEndDate, bo.getCurrentDate());
|
||||
|
||||
Page<AttendanceUserGroupVo> result = baseMapper.selectVoPage(pageQuery.build(), ge);
|
||||
Page<AttendanceUserGroupVo> attendanceArrangementVoPage = result.setRecords(result.getRecords().stream().map(vo -> {
|
||||
// 根据当前日期查询在开始时间和结束时间之间的人员组信息
|
||||
if ((bo.getCurrentDate().isAfter(vo.getStartDate()) || bo.getCurrentDate().isEqual(vo.getStartDate())) &&
|
||||
(bo.getCurrentDate().isBefore(vo.getEndDate()) || bo.getCurrentDate().isEqual(vo.getEndDate()))) {
|
||||
|
||||
// 根据查询出来的result取出scheduleId
|
||||
Long scheduleId = vo.getScheduleId();
|
||||
// 根据排班的id查询出排班的人员详细信息
|
||||
// List<AttendanceUserGroup> userGroupList = baseMapper.selectList(Wrappers.<AttendanceUserGroup>lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId));
|
||||
|
||||
//根据scheduleId查询出排班的详细信息
|
||||
AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, scheduleId));
|
||||
// 假设每个vo只有一个scheduleId
|
||||
Long userGroupListScheduleId = attendanceArrangement.getId();
|
||||
AttendanceArrangement arrangement = arrangementMapper.selectOne(Wrappers.<AttendanceArrangement>lambdaQuery().eq(AttendanceArrangement::getId, userGroupListScheduleId));
|
||||
vo.setAttendanceArrangement(arrangement);
|
||||
|
||||
// 根据scheduleId过滤出groupId
|
||||
Long groupId = arrangement.getGroupId();
|
||||
// 根据groupId查询出考勤组的详细信息
|
||||
AttendanceGroup attendanceGroup = groupMapper.selectById(groupId);
|
||||
vo.setAttendanceGroup(attendanceGroup);
|
||||
|
||||
// 判断当前考勤组的班制是固定班制还是排班制
|
||||
if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.FIXEDSCHEDULE)) {
|
||||
// 固定班制
|
||||
// 根据考勤组id查询出班制信息的dayOfWeek
|
||||
List<AttendanceWeekSet> weekSetList = weekSetMapper.selectList(Wrappers.<AttendanceWeekSet>lambdaQuery().eq(AttendanceWeekSet::getGroupId, groupId));
|
||||
// 将当前日期转换为周几
|
||||
int weekNumber = bo.getCurrentDate().getDayOfWeek().getValue();
|
||||
// 匹配weekNumber和weekSetList中的dayOfWeek,匹配成功则将weekSet存到vo中
|
||||
AttendanceWeekSet attendanceWeekSet = weekSetList.stream().filter(weekSet -> weekSet.getDayOfWeek() == weekNumber).findFirst().orElse(null);
|
||||
if (attendanceWeekSet != null) {
|
||||
// 根据过滤出来的attendanceWeekSet的weekSetId查询出shiftId
|
||||
Long shiftId = attendanceWeekSet.getShiftId();
|
||||
// 根据shiftId查询出班次的详细信息
|
||||
AttendanceShift attendanceShift = shiftMapper.selectById(shiftId);
|
||||
// 将attendanceShift存到vo中
|
||||
vo.setAttendanceShift(attendanceShift);
|
||||
}
|
||||
} else if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.SHIFTSCHEDULE)) {
|
||||
// 排班制
|
||||
// 将startDate作为第一天,endDate作为最后一天,循环判断当前日期是第几天,取出当前天数的班次信息。
|
||||
LocalDate startDate = vo.getStartDate();
|
||||
LocalDate endDate = vo.getEndDate();
|
||||
LocalDate currentDate = bo.getCurrentDate();
|
||||
|
||||
// 取出attendanceScheduleCycle表中的天数
|
||||
List<Integer> cycleDaysList = scheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)).stream()
|
||||
.map(AttendanceScheduleCycle::getDayNumber)
|
||||
.toList();
|
||||
|
||||
// 在startDate和endDate之间循环,判断当前日期是cycleDays中的第几天
|
||||
for (LocalDate date = startDate; date.isBefore(endDate) || date.isEqual(endDate); date = date.plusDays(1)) {
|
||||
if (date.isEqual(currentDate)) {
|
||||
// 判断当前日期是cycleDays中的第几天
|
||||
int dayNumber = (int) (ChronoUnit.DAYS.between(startDate, date) + 1);
|
||||
int cycleDay = dayNumber % cycleDaysList.size();
|
||||
if (cycleDay == 0) {
|
||||
cycleDay = cycleDaysList.size();
|
||||
}
|
||||
// 根据cycleDay查询出当前日期的班次信息
|
||||
AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.<AttendanceScheduleCycle>lambdaQuery()
|
||||
.eq(AttendanceScheduleCycle::getGroupId, groupId)
|
||||
.eq(AttendanceScheduleCycle::getDayNumber, cycleDay));
|
||||
if (cycle != null) {
|
||||
// 将cycle存到vo中
|
||||
vo.setScheduleCycle(cycle);
|
||||
// 根据cycleId查询出shiftId
|
||||
Long shiftId = cycle.getShiftId();
|
||||
// 根据shiftId查询出班次的详细信息
|
||||
AttendanceShift attendanceShift = shiftMapper.selectById(shiftId);
|
||||
// 将shift存到vo中
|
||||
vo.setAttendanceShift(attendanceShift);
|
||||
}
|
||||
break; // 找到当前日期后跳出循环
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return vo;
|
||||
}).collect(Collectors.toList()));
|
||||
|
||||
return TableDataInfo.build(attendanceArrangementVoPage);
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -9,13 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||
import org.dromara.property.domain.InspectionTaskDetail;
|
||||
import org.dromara.property.mapper.InspectionTaskDetailMapper;
|
||||
import org.dromara.property.service.IInspectionTaskDetailService;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -25,7 +24,7 @@ import java.util.Collection;
|
||||
* 巡检明细Service业务层处理
|
||||
*
|
||||
* @author mocheng
|
||||
* @date 2025-07-15
|
||||
* @date 2025-08-08
|
||||
*/
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@ -81,7 +80,16 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
||||
lqw.eq(bo.getPointId() != null, InspectionTaskDetail::getPointId, bo.getPointId());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPatrolType()), InspectionTaskDetail::getPatrolType, bo.getPatrolType());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getSignType()), InspectionTaskDetail::getSignType, bo.getSignType());
|
||||
lqw.eq(bo.getActualInspectionTime() != null, InspectionTaskDetail::getActualInspectionTime, bo.getActualInspectionTime());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getActualSignState()), InspectionTaskDetail::getActualSignState, bo.getActualSignState());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInspectionState()), InspectionTaskDetail::getInspectionState, bo.getInspectionState());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInspectionImage()), InspectionTaskDetail::getInspectionImage, bo.getInspectionImage());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getPlanInspectionPerson()), InspectionTaskDetail::getPlanInspectionPerson, bo.getPlanInspectionPerson());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getActualInspectionPerson()), InspectionTaskDetail::getActualInspectionPerson, bo.getActualInspectionPerson());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getTaskStatus()), InspectionTaskDetail::getTaskStatus, bo.getTaskStatus());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInspectionResults()), InspectionTaskDetail::getInspectionResults, bo.getInspectionResults());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInspectionDesc()), InspectionTaskDetail::getInspectionDesc, bo.getInspectionDesc());
|
||||
lqw.eq(StringUtils.isNotBlank(bo.getInspectionLocation()), InspectionTaskDetail::getInspectionLocation, bo.getInspectionLocation());
|
||||
lqw.eq(bo.getInspectionTime() != null, InspectionTaskDetail::getInspectionTime, bo.getInspectionTime());
|
||||
lqw.eq(bo.getPointStartTime() != null, InspectionTaskDetail::getPointStartTime, bo.getPointStartTime());
|
||||
lqw.eq(bo.getPointEndTime() != null, InspectionTaskDetail::getPointEndTime, bo.getPointEndTime());
|
||||
@ -96,7 +104,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
||||
* @return 是否新增成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean insertByBo(InspectionTaskDetailBo bo) {
|
||||
InspectionTaskDetail add = MapstructUtils.convert(bo, InspectionTaskDetail.class);
|
||||
validEntityBeforeSave(add);
|
||||
@ -114,7 +121,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
||||
* @return 是否修改成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean updateByBo(InspectionTaskDetailBo bo) {
|
||||
InspectionTaskDetail update = MapstructUtils.convert(bo, InspectionTaskDetail.class);
|
||||
validEntityBeforeSave(update);
|
||||
@ -136,7 +142,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
||||
* @return 是否删除成功
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||||
if(isValid){
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
|
@ -247,13 +247,11 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
|
||||
ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getStatus, entity.getStatus());
|
||||
boolean exists = workOrdersRecordMapper.exists(ordersLambdaQueryWrapper);
|
||||
//TODO 做一些数据校验,如唯一约束
|
||||
if (!exists) {
|
||||
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
|
||||
serviceWorkOrdersRecord.setOrderId(entity.getId());
|
||||
serviceWorkOrdersRecord.setStatus(entity.getStatus());
|
||||
serviceWorkOrdersRecord.setHandler(entity.getHandler());
|
||||
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,189 @@
|
||||
package org.dromara.sis.controller;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.domain.AlarmRecord;
|
||||
import org.dromara.sis.domain.bo.SisAlarmEventsBo;
|
||||
import org.dromara.sis.service.AlarmRecordService;
|
||||
import org.dromara.sis.service.ISisAlarmEventsService;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 告警数据主动推送控制器
|
||||
* 接收外部系统推送的告警数据并同步到数据库
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequestMapping("/api/alarm/push")
|
||||
@RequiredArgsConstructor
|
||||
public class AlarmPushController {
|
||||
|
||||
private final AlarmRecordService alarmRecordService;
|
||||
private final ISisAlarmEventsService sisAlarmEventsService;
|
||||
|
||||
/**
|
||||
* 接收单条告警数据推送
|
||||
*/
|
||||
@PostMapping("/single")
|
||||
public ResponseEntity<Map<String, Object>> pushSingleAlarm(@RequestBody Map<String, Object> alarmData) {
|
||||
try {
|
||||
// 处理单条数据
|
||||
processAlarmData(Collections.singletonList(alarmData));
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", true);
|
||||
result.put("message", "告警数据推送成功");
|
||||
result.put("timestamp", new Date());
|
||||
return ResponseEntity.ok(result);
|
||||
} catch (Exception e) {
|
||||
log.error("处理单条告警推送失败: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 接收批量告警数据推送
|
||||
*/
|
||||
@PostMapping("/batch")
|
||||
public ResponseEntity<Map<String, Object>> pushBatchAlarms(@RequestBody List<Map<String, Object>> alarmDataList) {
|
||||
if (alarmDataList == null || alarmDataList.isEmpty()) {
|
||||
return ResponseEntity.badRequest().body(Collections.singletonMap("error", "推送数据不能为空"));
|
||||
}
|
||||
|
||||
try {
|
||||
int processedCount = processAlarmData(alarmDataList);
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
result.put("success", true);
|
||||
result.put("message", "批量告警数据推送成功");
|
||||
result.put("processedCount", processedCount);
|
||||
result.put("totalReceived", alarmDataList.size());
|
||||
result.put("timestamp", new Date());
|
||||
return ResponseEntity.ok(result);
|
||||
} catch (Exception e) {
|
||||
log.error("处理批量告警推送失败: {}", e.getMessage(), e);
|
||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
|
||||
.body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理告警数据并保存到数据库
|
||||
* @param alarmDataList 告警数据列表
|
||||
* @return 处理成功的数量
|
||||
*/
|
||||
private int processAlarmData(List<Map<String, Object>> alarmDataList) {
|
||||
log.info("开始处理推送的告警数据,共 {} 条", alarmDataList.size());
|
||||
|
||||
// 转换报警记录
|
||||
List<AlarmRecord> records = alarmDataList.stream()
|
||||
.map(alarmRecordService::convertFromMap)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 提取操作记录数据
|
||||
Map<Long, List<Map<String, Object>>> operatorMap = new HashMap<>();
|
||||
for (Map<String, Object> recordMap : alarmDataList) {
|
||||
// 确保Id存在且为有效数字
|
||||
Object idObj = recordMap.get("Id");
|
||||
if (idObj == null) {
|
||||
log.warn("跳过缺少Id的告警数据: {}", recordMap);
|
||||
continue;
|
||||
}
|
||||
|
||||
Long recordId;
|
||||
try {
|
||||
recordId = Long.valueOf(idObj.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("告警数据Id格式错误: {}", idObj, e);
|
||||
continue;
|
||||
}
|
||||
|
||||
// 处理操作记录
|
||||
List<Map<String, Object>> operators = (List<Map<String, Object>>) recordMap.get("TaskOperators");
|
||||
if (operators != null && !operators.isEmpty()) {
|
||||
operatorMap.put(recordId, operators);
|
||||
}
|
||||
|
||||
// 同步到alarmEvents表
|
||||
SisAlarmEventsBo sisAlarmEvents = convertToAlarmEvents(recordMap, recordId);
|
||||
sisAlarmEventsService.insertByBo(sisAlarmEvents);
|
||||
}
|
||||
|
||||
// 保存数据(包含操作记录)
|
||||
return alarmRecordService.saveOrUpdateRecords(records, operatorMap);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将原始告警数据转换为SisAlarmEventsBo对象
|
||||
*/
|
||||
private SisAlarmEventsBo convertToAlarmEvents(Map<String, Object> recordMap, Long recordId) {
|
||||
SisAlarmEventsBo sisAlarmEvents = new SisAlarmEventsBo();
|
||||
sisAlarmEvents.setId(recordId);
|
||||
|
||||
// 转换类型和级别
|
||||
sisAlarmEvents.setType(convertToLong(recordMap.get("Type")));
|
||||
sisAlarmEvents.setLevel(convertToLong(recordMap.get("Level")));
|
||||
|
||||
// 设备信息
|
||||
sisAlarmEvents.setDeviceIp((String) recordMap.get("DeviceSipNum"));
|
||||
sisAlarmEvents.setDeviceName(Objects.toString(recordMap.get("DeviceName"), ""));
|
||||
sisAlarmEvents.setDeviceGroupId(convertToLong(recordMap.get("GroupId")));
|
||||
sisAlarmEvents.setDeviceGroupName(Objects.toString(recordMap.get("GroupName"), ""));
|
||||
|
||||
// 时间和状态
|
||||
sisAlarmEvents.setReportTime((Date) recordMap.get("StartTime"));
|
||||
sisAlarmEvents.setState(convertToInteger(recordMap.get("State")));
|
||||
|
||||
// 工单ID(仅当状态为3时)
|
||||
if (sisAlarmEvents.getState() == 3) {
|
||||
sisAlarmEvents.setWorkOrderId(convertToLong(recordMap.get("WorkOrderId")));
|
||||
}
|
||||
|
||||
return sisAlarmEvents;
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全地将对象转换为Long类型
|
||||
*/
|
||||
private Long convertToLong(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).longValue();
|
||||
}
|
||||
try {
|
||||
return Long.valueOf(value.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("转换为Long失败: {}", value, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 安全地将对象转换为Integer类型
|
||||
*/
|
||||
private Integer convertToInteger(Object value) {
|
||||
if (value == null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Number) {
|
||||
return ((Number) value).intValue();
|
||||
}
|
||||
try {
|
||||
return Integer.valueOf(value.toString());
|
||||
} catch (NumberFormatException e) {
|
||||
log.warn("转换为Integer失败: {}", value, e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@ -3,7 +3,6 @@ package org.dromara.sis.sdk.hik;
|
||||
import com.sun.jna.*;
|
||||
import com.sun.jna.examples.win32.W32API;
|
||||
import com.sun.jna.examples.win32.W32API.HWND;
|
||||
import com.sun.jna.ptr.ByteByReference;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import com.sun.jna.ptr.ShortByReference;
|
||||
|
||||
@ -9711,6 +9710,10 @@ DVR实现巡航数据结构
|
||||
|
||||
boolean NET_DVR_StopGetFile(int lFileHandle);
|
||||
|
||||
int NET_DVR_StartDownload(int lUserID, int dwDownloadType, NET_DVR_DOWNLOAD_FILEVOLUME_PARAM lpInBuffer, int dwInBufferSize, String sFileName);
|
||||
|
||||
boolean NET_DVR_StopDownload(int lDownloadHandle);
|
||||
|
||||
int NET_DVR_GetDownloadPos(int lFileHandle);
|
||||
|
||||
int NET_DVR_GetPlayBackPos(int lPlayHandle);
|
||||
@ -10682,6 +10685,46 @@ DVR实现巡航数据结构
|
||||
public byte byWorkMode ;//云台锁定控制:0- 解锁,1- 锁定
|
||||
public byte[] byRes = new byte[123];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* sdk 下载图片回调
|
||||
*/
|
||||
interface DownloadCallBack extends Callback {
|
||||
public void invoke(int lHandle, NET_DOWNLOAD_CB_INFO pCBInfo, Pointer pUserData);
|
||||
}
|
||||
|
||||
class NET_DOWNLOAD_CB_INFO extends SDK_Structure {
|
||||
public int dwType;
|
||||
public Pointer pData;
|
||||
public int dwDataLen;
|
||||
public Pointer pFileInfo;
|
||||
public int dwFileInfoLen;
|
||||
public byte[] byRes = new byte[120];
|
||||
}
|
||||
|
||||
class NET_DVR_DOWNLOAD_FILEVOLUME_PARAM extends SDK_Structure {
|
||||
private static final int MAX_URL_LEN = 240;
|
||||
// 结构体大小
|
||||
public int dwSize;
|
||||
// 文件上传路径
|
||||
public byte[] sUrl = new byte[MAX_URL_LEN];
|
||||
// 保留,置为0
|
||||
public byte[] byRes = new byte[248];
|
||||
public DownloadCallBack fnDownloadDataCB;
|
||||
public Pointer pUserData;
|
||||
}
|
||||
|
||||
class NET_DVR_UPLOAD_FILEVOLUME_PRARAM extends SDK_Structure {
|
||||
private static final int NET_SDK_MAX_FILE_NAME = 100;
|
||||
public int dwSize;
|
||||
public byte byFileType;
|
||||
public byte byFileVolnumeID;
|
||||
public byte[] byRes1 = new byte[2];
|
||||
public int dwFileSize;
|
||||
public byte[] szFileName = new byte[NET_SDK_MAX_FILE_NAME];
|
||||
public byte[] byRes = new byte[300];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,20 +0,0 @@
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
public interface HikApi {
|
||||
|
||||
|
||||
Boolean login(String ip, short port, String user, String psw);
|
||||
|
||||
|
||||
void getAcsStatus(String deviceIp);
|
||||
|
||||
|
||||
Boolean controlGateway(String deviceIp, Integer floorNum, Integer cmd);
|
||||
|
||||
/**
|
||||
* 设备登出
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
*/
|
||||
Boolean loginOut(String deviceIp);
|
||||
}
|
@ -1,12 +1,16 @@
|
||||
package org.dromara.sis.sdk.hik;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.Base64Utils;
|
||||
import org.dromara.sis.sdk.hik.model.DeviceInfo;
|
||||
import org.dromara.sis.sdk.hik.service.CamearService;
|
||||
import org.dromara.sis.sdk.hik.service.DoorService;
|
||||
import org.dromara.sis.sdk.hik.service.LoginService;
|
||||
import org.dromara.sis.sdk.hik.service.SdkBaseServer;
|
||||
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
|
||||
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
|
||||
import org.dromara.sis.sdk.hik.service.*;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
@ -151,4 +155,116 @@ public class HikApiService {
|
||||
Integer lHandel = CACHE.get(deviceIp);
|
||||
return CamearService.getDeviceChannelInfo(lHandel);
|
||||
}
|
||||
|
||||
// 允许上传的文件类型
|
||||
private static final List<String> ALLOW_PIC_TYPES = Arrays.asList("jpg");
|
||||
|
||||
/**
|
||||
* 人像比对文件上传
|
||||
*
|
||||
* @param deviceIp 设备ip
|
||||
* @param file 上传文件
|
||||
* @return 返回上传文件名称
|
||||
*/
|
||||
public static String fdLibUpload(String deviceIp, byte[] file, int libId, FaceAppendData data) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 文件名称
|
||||
String fileNamePrefix = IdUtil.fastSimpleUUID();
|
||||
int luserId = CACHE.get(deviceIp);
|
||||
if (luserId == -1) {
|
||||
log.error("海康设备[{}]未登录,上传文件失败.", deviceIp);
|
||||
return null;
|
||||
}
|
||||
int uploadId = -1;
|
||||
// 获取文件类型
|
||||
String type = Base64Utils.getType(file);
|
||||
log.info("获取上传的文件类型,type: {}", type);
|
||||
if (type == null) {
|
||||
log.error("上传文件获取类型失败.");
|
||||
return null;
|
||||
}
|
||||
if (!ALLOW_PIC_TYPES.contains(type)) {
|
||||
log.error("不允许的上传文件类型, type: {}", type);
|
||||
return null;
|
||||
}
|
||||
// 生成文件名称
|
||||
String fileName = fileNamePrefix + "." + type;
|
||||
// 上传状态
|
||||
int statusCode = -1;
|
||||
// 已发送的数据
|
||||
int fileLen = file.length;
|
||||
log.info("开始文件上传,fileName={}, len={}", fileName, fileLen);
|
||||
try {
|
||||
// 1 发起上传
|
||||
uploadId = FdLibUploadService.uploadFile(luserId, libId);
|
||||
log.info("开始发起hik上传操作,uploadId={}", uploadId);
|
||||
if (uploadId == -1) {
|
||||
log.info("发起上传失败,errCode: {}", FdLibUploadService.getErrorCode());
|
||||
return null;
|
||||
}
|
||||
// 2 发送图片的二进制数据
|
||||
byte fileType = getFileType(type);
|
||||
FdLibUploadService.uploadSend(uploadId, file, fileType, data);
|
||||
// 3 循环查询, 上传进度 总共查询300次 每次等待20ms
|
||||
int num = 200; // 循环次数
|
||||
int sleepTime = 40; // 每次循环休眠时间
|
||||
int allowQueryErrorNum = 5; // 最多允许接口调用异常
|
||||
int errorNum = 0; // 错误次数
|
||||
for (int i = 0; i < num; i++) {
|
||||
UploadStatus uploadState = FdLibUploadService.getUploadState(uploadId);
|
||||
log.info("循环获取文件上传进度, uploadState= {}", uploadState);
|
||||
if (uploadState.getStatusCode() == -1) {
|
||||
int errorCode = FdLibUploadService.getErrorCode();
|
||||
log.info("文件进度查询失败, errorCode:{}", errorCode);
|
||||
errorNum += 1;
|
||||
if (errorNum == allowQueryErrorNum) {
|
||||
log.info("sdk 接口错误次数达到设置上限,退出文件上传");
|
||||
throw new RuntimeException("sdk接口错误次数达到设置上限,退出文件上传, maxErrorNum=" + allowQueryErrorNum);
|
||||
}
|
||||
} else {
|
||||
// 上传成功
|
||||
if (uploadState.getStatusCode() == 1) {
|
||||
statusCode = 1;
|
||||
break;
|
||||
}
|
||||
// 上传中
|
||||
else if (uploadState.getStatusCode() == 2) {
|
||||
Thread.sleep(sleepTime);
|
||||
}
|
||||
// 上传失败
|
||||
else if (uploadState.getStatusCode() == 3) {
|
||||
throw new RuntimeException("文件上传失败, 返回码:3");
|
||||
}
|
||||
// 其他异常
|
||||
else {
|
||||
throw new RuntimeException("文件上传失败, 返回码:" + uploadState);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (statusCode == -1) {
|
||||
log.info("图片上传失败,取消上传.");
|
||||
return null;
|
||||
}
|
||||
// 4 获取上传图片的路径
|
||||
String uploadResult = FdLibUploadService.getUploadResult(uploadId);
|
||||
log.info("文件上传完成, result= {}, 耗时={}ms", uploadResult, System.currentTimeMillis() - startTime);
|
||||
return uploadResult;
|
||||
} catch (Exception e) {
|
||||
if (uploadId != -1) {
|
||||
FdLibUploadService.uploadClose(uploadId);
|
||||
}
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static byte getFileType(String type) {
|
||||
return switch (type) {
|
||||
case "jpg" -> 1;
|
||||
case "png" -> 3;
|
||||
case "bmp" -> 2;
|
||||
case "gif" -> 5;
|
||||
default -> throw new RuntimeException("不允许上传的图片类型:" + type);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,72 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
|
||||
import jakarta.xml.bind.annotation.*;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 上传图片的附件信息
|
||||
*
|
||||
* @author lxj
|
||||
*/
|
||||
@Data
|
||||
@XmlRootElement(name = "FaceAppendData")
|
||||
@XmlAccessorType(XmlAccessType.FIELD)
|
||||
public class FaceAppendData {
|
||||
|
||||
@XmlAttribute
|
||||
private String version = "2.0";
|
||||
|
||||
@XmlAttribute
|
||||
private String xmlns = "http://www.isapi.org/ver20/XMLSchema";
|
||||
|
||||
/**
|
||||
* 出生日期,例如:2014-12-12T00:00:00Z
|
||||
*/
|
||||
@XmlElement
|
||||
private String bornTime;
|
||||
|
||||
@XmlElement
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* male, female
|
||||
*/
|
||||
@XmlElement
|
||||
private String sex;
|
||||
|
||||
/**
|
||||
* 省份,代码索引具体请参考"全国各省份城市列表
|
||||
*/
|
||||
@XmlElement
|
||||
private String province;
|
||||
|
||||
/**
|
||||
* ,城市,代码索引具体请参考"全国各省份城市列表
|
||||
*/
|
||||
@XmlElement
|
||||
private String city;
|
||||
|
||||
/**
|
||||
* 证件类型: ID-身份证, passportID-护照, other-其他
|
||||
*/
|
||||
@XmlElement
|
||||
private String certificateType;
|
||||
|
||||
/**
|
||||
* 证件号
|
||||
*/
|
||||
@XmlElement
|
||||
private String certificateNumber;
|
||||
|
||||
/**
|
||||
* 电话号码
|
||||
*/
|
||||
@XmlElement
|
||||
private String phoneNumber;
|
||||
|
||||
/**
|
||||
* 自定人员id
|
||||
*/
|
||||
@XmlElement
|
||||
private String customHumanID;
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
|
||||
import com.sun.jna.Memory;
|
||||
|
||||
public class SimpleMemory extends Memory {
|
||||
|
||||
|
||||
public SimpleMemory(long size) {
|
||||
super(size);
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package org.dromara.sis.sdk.hik.model.upload;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class UploadStatus {
|
||||
|
||||
/**
|
||||
* 上传状态码
|
||||
*/
|
||||
private Integer statusCode;
|
||||
|
||||
/**
|
||||
* 上传进度
|
||||
*/
|
||||
private Integer process;
|
||||
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
public class FaceService extends SdkBaseServer{
|
||||
}
|
@ -0,0 +1,155 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.sun.jna.Pointer;
|
||||
import com.sun.jna.ptr.IntByReference;
|
||||
import jakarta.xml.bind.JAXBContext;
|
||||
import jakarta.xml.bind.JAXBException;
|
||||
import jakarta.xml.bind.Marshaller;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.common.core.utils.Base64Utils;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.sdk.hik.model.upload.FaceAppendData;
|
||||
import org.dromara.sis.sdk.hik.model.upload.SimpleMemory;
|
||||
import org.dromara.sis.sdk.hik.model.upload.UploadStatus;
|
||||
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.HCNetSDK.IMPORT_DATA_TO_FACELIB;
|
||||
|
||||
/**
|
||||
* 海康上传服务
|
||||
*/
|
||||
@Slf4j
|
||||
public class FdLibUploadService extends SdkBaseServer {
|
||||
|
||||
/**
|
||||
* 上传文件到人脸库
|
||||
*
|
||||
* @param luserId 登录句柄
|
||||
* @return 返回上传句柄
|
||||
*/
|
||||
public static int uploadFile(int luserId, int libId) {
|
||||
HCNetSDK.NET_DVR_FACELIB_COND param = new HCNetSDK.NET_DVR_FACELIB_COND();
|
||||
param.dwSize = param.size();
|
||||
byte[] bytes = String.valueOf(libId).getBytes();
|
||||
System.arraycopy(bytes, 0, param.szFDID, 0, bytes.length);
|
||||
param.byConcurrent = 0; // 设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模)
|
||||
param.byCover = 1;
|
||||
param.byCustomFaceLibID = 0;
|
||||
param.byPictureSaveMode = 0;
|
||||
int dwInBufferSize = param.size();
|
||||
param.write();
|
||||
return hcNetSDK.NET_DVR_UploadFile_V40(luserId, IMPORT_DATA_TO_FACELIB, param.getPointer(), dwInBufferSize, null, null, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 上传数据发送
|
||||
*
|
||||
* @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值
|
||||
* @param data 上传文件的二进制数据
|
||||
* @param fileType 文件的类型
|
||||
* @return -1表示失败,大于等于0表示本次发送成功的字节数,未发送成功的剩余字节数可以再次调用该接口进行发送。
|
||||
*/
|
||||
public static int uploadSend(int lUploadHandle, byte[] data, byte fileType, FaceAppendData userInfo) throws JAXBException {
|
||||
HCNetSDK.NET_DVR_SEND_PARAM_IN param = new HCNetSDK.NET_DVR_SEND_PARAM_IN();
|
||||
SimpleMemory memory = new SimpleMemory(data.length);
|
||||
memory.write(0, data, 0, data.length);
|
||||
// 设置人像附加信息
|
||||
JAXBContext context = JAXBContext.newInstance(FaceAppendData.class);
|
||||
Marshaller marshaller = context.createMarshaller();
|
||||
// 转换为字符串
|
||||
StringWriter writer = new StringWriter();
|
||||
marshaller.marshal(userInfo, writer);
|
||||
String xmlString = writer.toString();
|
||||
byte[] faceBytes = xmlString.getBytes();
|
||||
SimpleMemory addendData = new SimpleMemory(faceBytes.length);
|
||||
addendData.write(0, faceBytes, 0, faceBytes.length);
|
||||
|
||||
param.pSendData = memory;
|
||||
param.dwSendDataLen = data.length;
|
||||
param.byPicType = fileType;
|
||||
param.pSendAppendData = addendData;
|
||||
param.dwSendAppendDataLen = faceBytes.length;
|
||||
return hcNetSDK.NET_DVR_UploadSend(lUploadHandle, param, null);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询上传数据进度
|
||||
*
|
||||
* @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值
|
||||
* @return -1表示函数调用失败,其他为上传的状态值见下表说明。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。
|
||||
* -1:表示调用失败
|
||||
* 1:上传成功
|
||||
* 2:正在上传
|
||||
* 3:上传失败
|
||||
* 其他状态码请参考sdk开发文档
|
||||
*/
|
||||
public static UploadStatus getUploadState(int lUploadHandle) {
|
||||
IntByReference reference = new IntByReference(0);
|
||||
int i = hcNetSDK.NET_DVR_GetUploadState(lUploadHandle, reference.getPointer());
|
||||
UploadStatus status = new UploadStatus();
|
||||
status.setStatusCode(i);
|
||||
status.setProcess(reference.getValue());
|
||||
return status;
|
||||
}
|
||||
|
||||
public static String getUploadResult(int lUploadHandle) {
|
||||
HCNetSDK.NET_DVR_UPLOAD_FILE_RET params = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET();
|
||||
params.write();
|
||||
Pointer lpOutBuffer = params.getPointer();
|
||||
int dwOutBufferSize = params.size();
|
||||
boolean b = hcNetSDK.NET_DVR_GetUploadResult(lUploadHandle, lpOutBuffer, dwOutBufferSize);
|
||||
if (b) {
|
||||
params.read();
|
||||
String url = new String(params.sUrl, StandardCharsets.UTF_8);
|
||||
if (StrUtil.isNotEmpty(url)) {
|
||||
return url.trim();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean uploadClose(int lUploadHandle) {
|
||||
// TRUE表示成功,FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。
|
||||
boolean b = hcNetSDK.NET_DVR_UploadClose(lUploadHandle);
|
||||
if (b) {
|
||||
log.info("文件上传关闭成功, lUploadHandle:{}", lUploadHandle);
|
||||
} else {
|
||||
int errorCode = hcNetSDK.NET_DVR_GetLastError();
|
||||
System.out.println("文件上传关闭失败, errorCode:" + errorCode);
|
||||
}
|
||||
return b;
|
||||
}
|
||||
|
||||
public static int download(int luserId, String url, HCNetSDK.DownloadCallBack callback) {
|
||||
HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM param = new HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM();
|
||||
byte[] fns = url.getBytes();
|
||||
System.arraycopy(fns, 0, param.sUrl, 0, fns.length);
|
||||
param.fnDownloadDataCB = callback;
|
||||
param.write();
|
||||
param.dwSize = param.size();
|
||||
int i = hcNetSDK.NET_DVR_StartDownload(luserId, 20, param, param.dwSize, null);
|
||||
if (i == -1) {
|
||||
log.info("发起图片下载失败,lDownloadHandle={}, errorCode={}", i, getErrorCode());
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭文件下载
|
||||
*
|
||||
* @param lDownloadHandle 下载句柄
|
||||
*/
|
||||
public static void stopDownload(int lDownloadHandle) {
|
||||
boolean b = hcNetSDK.NET_DVR_StopDownload(lDownloadHandle);
|
||||
if (b) {
|
||||
log.info("文件下载关闭成功, lDownloadHandle={}", lDownloadHandle);
|
||||
} else {
|
||||
System.out.println("文件下载关闭失败, errorCode:" + getErrorCode());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,11 +1,9 @@
|
||||
package org.dromara.sis.sdk.hik.service;
|
||||
|
||||
import com.sun.jna.Memory;
|
||||
import com.sun.jna.Native;
|
||||
import com.sun.jna.Pointer;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.dromara.sis.sdk.hik.HCNetSDK;
|
||||
import org.dromara.sis.sdk.hik.SDK_Structure;
|
||||
import org.springframework.util.Assert;
|
||||
|
||||
import static org.dromara.sis.sdk.hik.common.osSelect.isWindows;
|
||||
@ -120,6 +118,9 @@ public class SdkBaseServer {
|
||||
}
|
||||
}
|
||||
|
||||
public static int getErrorCode() {
|
||||
return getHcNetSDK().NET_DVR_GetLastError();
|
||||
}
|
||||
|
||||
/**
|
||||
* 登出操作
|
||||
|
@ -243,8 +243,8 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService {
|
||||
commonParams.put("src_url", url);
|
||||
commonParams.put("dst_url", targetUrl);
|
||||
commonParams.put("timeout_ms", 10000);
|
||||
commonParams.put("enable_hls", false);
|
||||
commonParams.put("enable_mp4", false);
|
||||
commonParams.put("enable_hls", true);
|
||||
commonParams.put("enable_mp4", true);
|
||||
R<AddStreamProxyResp> result = HttpClientUtil.get(getRequestUrl("addFFmpegSource"), commonParams, AddStreamProxyResp.class);
|
||||
if (result != null) {
|
||||
if (result.getCode() == 0) {
|
||||
|
@ -1,5 +1,6 @@
|
||||
package org.dromara.sis.service.impl;
|
||||
|
||||
import cn.dev33.satoken.context.mock.SaTokenContextMockUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -151,7 +152,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
|
||||
@Async
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void createAlarmRecord(String deviceIp, Integer level, Integer type,String msg, byte[] smallImg, byte[] bigImg) {
|
||||
public void createAlarmRecord(String deviceIp, Integer level, Integer type, String msg, byte[] smallImg, byte[] bigImg) {
|
||||
// 校验设备信息
|
||||
SisDeviceManage sisDeviceManage = deviceManageService.queryByDeviceIp(deviceIp);
|
||||
if (sisDeviceManage == null) {
|
||||
@ -186,10 +187,10 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService {
|
||||
}
|
||||
|
||||
public SisAlarmEventAttachments createEventAttachments(byte[] img, SisAlarmEvents alarmEvents, SisDeviceManage sisDeviceManage) {
|
||||
RemoteFile result = remoteFileService.uploadImg(img);
|
||||
RemoteFile remoteFile = SaTokenContextMockUtil.setMockContext(() -> remoteFileService.uploadImg(img));
|
||||
SisAlarmEventAttachments attachments = new SisAlarmEventAttachments();
|
||||
attachments.setEventId(alarmEvents.getId());
|
||||
attachments.setOssId(result.getOssId());
|
||||
attachments.setOssId(remoteFile.getOssId());
|
||||
attachments.setType(1L);
|
||||
attachments.setTenantId(sisDeviceManage.getTenantId());
|
||||
attachments.setCreateDept(sisDeviceManage.getCreateDept());
|
||||
|
@ -65,7 +65,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
if (result.getCode() != 200) {
|
||||
log.info("华为盒子比对失败,msg={}", result.getMessage());
|
||||
// 产生告警数据
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg);
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg);
|
||||
return;
|
||||
}
|
||||
log.info("人脸比对执行完成,耗时:{}ms", interval.intervalMs());
|
||||
@ -76,19 +76,19 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer
|
||||
if (authRecord == null) {
|
||||
log.info("人员[{}]没有授权记录,判定为陌生人", person);
|
||||
// 不是内部人员 产生紧急的告警信息
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "陌生人员入内", smallImg, bigImg);
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "陌生人员入内", smallImg, bigImg);
|
||||
return;
|
||||
} else {
|
||||
if (Objects.equals(authRecord.getRosterType(), RosterTypeEnum.BLACK_LIST.getCode())) {
|
||||
log.info("人员[{}]在黑名单中,暂不处理。", person);
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg);
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Date now = new Date();
|
||||
if (DateUtil.compare(now, authRecord.getEndDate()) > 0) {
|
||||
// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg);
|
||||
alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg);
|
||||
log.info("当前人脸已过期,暂不处理。");
|
||||
return;
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.dubbo.config.annotation.DubboService;
|
||||
import org.dromara.common.core.constant.CacheNames;
|
||||
import org.dromara.common.core.constant.SystemConstants;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
@ -44,6 +45,7 @@ import java.util.Map;
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
@Service
|
||||
@DubboService
|
||||
public class SysUserServiceImpl implements ISysUserService {
|
||||
|
||||
private final SysUserMapper baseMapper;
|
||||
|
Loading…
Reference in New Issue
Block a user