修改了巡检明细bug
This commit is contained in:
@@ -40,7 +40,7 @@ public class CustomerFeedbacksController extends BaseController {
|
|||||||
/**
|
/**
|
||||||
* 查询客户服务-意见反馈列表
|
* 查询客户服务-意见反馈列表
|
||||||
*/
|
*/
|
||||||
// @SaCheckPermission("system:feedbacks:list")
|
@SaCheckPermission("system:feedbacks:list")
|
||||||
@GetMapping("/list")
|
@GetMapping("/list")
|
||||||
public TableDataInfo<CustomerFeedbacksVo> list(CustomerFeedbacksBo bo, PageQuery pageQuery) {
|
public TableDataInfo<CustomerFeedbacksVo> list(CustomerFeedbacksBo bo, PageQuery pageQuery) {
|
||||||
return customerFeedbacksService.queryPageList(bo, pageQuery);
|
return customerFeedbacksService.queryPageList(bo, pageQuery);
|
||||||
|
@@ -0,0 +1,32 @@
|
|||||||
|
package org.dromara.property.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.dromara.common.core.domain.R;
|
||||||
|
import org.dromara.property.domain.vo.IndexCountVo;
|
||||||
|
import org.dromara.property.service.IndexService;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuyongle
|
||||||
|
* @version 1.0
|
||||||
|
* @description: 首页展示数据
|
||||||
|
* @date 2025/9/5 14:35
|
||||||
|
*/
|
||||||
|
@Validated
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/index")
|
||||||
|
public class IndexController {
|
||||||
|
private final IndexService indexService;
|
||||||
|
/**
|
||||||
|
* 首页统计数量
|
||||||
|
*/
|
||||||
|
@GetMapping("/indexCount")
|
||||||
|
public R<IndexCountVo> indexCount() {
|
||||||
|
return R.ok(indexService.indexCount());
|
||||||
|
}
|
||||||
|
}
|
@@ -8,6 +8,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
|
|||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.common.web.core.BaseController;
|
import org.dromara.common.web.core.BaseController;
|
||||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||||
|
import org.dromara.property.domain.bo.mobile.InspectionTaskDetailToOrderBo;
|
||||||
import org.dromara.property.domain.vo.mobile.MInspectionTaskDetailVo;
|
import org.dromara.property.domain.vo.mobile.MInspectionTaskDetailVo;
|
||||||
import org.dromara.property.service.IInspectionTaskDetailService;
|
import org.dromara.property.service.IInspectionTaskDetailService;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
@@ -35,7 +36,7 @@ public class MInspectionTaskDetailController extends BaseController {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改巡检明细
|
* 扫码签到
|
||||||
*/
|
*/
|
||||||
@PostMapping("/signIn")
|
@PostMapping("/signIn")
|
||||||
public R<Void> signIn(@Validated(EditGroup.class) @RequestBody InspectionTaskDetailBo bo) {
|
public R<Void> signIn(@Validated(EditGroup.class) @RequestBody InspectionTaskDetailBo bo) {
|
||||||
@@ -48,4 +49,11 @@ public class MInspectionTaskDetailController extends BaseController {
|
|||||||
public R<Void> submit(@Validated(EditGroup.class) @RequestBody InspectionTaskDetailBo bo) {
|
public R<Void> submit(@Validated(EditGroup.class) @RequestBody InspectionTaskDetailBo bo) {
|
||||||
return toAjax(inspectionTaskDetailService.submit(bo));
|
return toAjax(inspectionTaskDetailService.submit(bo));
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 巡检提报工单
|
||||||
|
*/
|
||||||
|
@PostMapping("/reportedOrder")
|
||||||
|
public R<Void> reportedOrder(@Validated(EditGroup.class) @RequestBody InspectionTaskDetailToOrderBo bo) {
|
||||||
|
return toAjax(inspectionTaskDetailService.reportedOrder(bo));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -72,7 +72,7 @@ public class CustomerFeedbacks extends TenantEntity {
|
|||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客服电话
|
* 反馈单位
|
||||||
*/
|
*/
|
||||||
private String serviceName;
|
private Long feedbackUnit;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package org.dromara.property.domain;
|
package org.dromara.property.domain;
|
||||||
|
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.tenant.core.TenantEntity;
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -115,7 +116,10 @@ public class InspectionTaskDetail extends TenantEntity {
|
|||||||
* 点结束时间
|
* 点结束时间
|
||||||
*/
|
*/
|
||||||
private Date pointEndTime;
|
private Date pointEndTime;
|
||||||
|
/**
|
||||||
|
* 工单id
|
||||||
|
*/
|
||||||
|
private Long orderId;
|
||||||
/**
|
/**
|
||||||
* 搜索值
|
* 搜索值
|
||||||
*/
|
*/
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package org.dromara.property.domain;
|
package org.dromara.property.domain;
|
||||||
|
|
||||||
|
import cn.idev.excel.annotation.ExcelProperty;
|
||||||
import org.dromara.common.tenant.core.TenantEntity;
|
import org.dromara.common.tenant.core.TenantEntity;
|
||||||
import com.baomidou.mybatisplus.annotation.*;
|
import com.baomidou.mybatisplus.annotation.*;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -41,6 +42,9 @@ public class Meet extends TenantEntity {
|
|||||||
* 5圆形会议室
|
* 5圆形会议室
|
||||||
* 6贵宾会议室)
|
* 6贵宾会议室)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
private String secrecyGrade;
|
||||||
|
|
||||||
private String meetingRoomType;
|
private String meetingRoomType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -76,11 +76,8 @@ public class CustomerFeedbacksBo extends BaseEntity {
|
|||||||
* 客服电话
|
* 客服电话
|
||||||
*/
|
*/
|
||||||
private String serviceName;
|
private String serviceName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 搜索值
|
* 反馈单位
|
||||||
*/
|
*/
|
||||||
private String searchValue;
|
private Long feedbackUnit;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,9 @@ public class MeetBo extends BaseEntity {
|
|||||||
* 5圆形会议室
|
* 5圆形会议室
|
||||||
* 6贵宾会议室)
|
* 6贵宾会议室)
|
||||||
*/
|
*/
|
||||||
|
@ExcelProperty(value = "保密等级")
|
||||||
|
private String secrecyGrade;
|
||||||
|
|
||||||
@NotBlank(message = "会议室类型不能为空")
|
@NotBlank(message = "会议室类型不能为空")
|
||||||
private String meetingRoomType;
|
private String meetingRoomType;
|
||||||
/**
|
/**
|
||||||
|
@@ -79,4 +79,13 @@ public class TbRoomBo extends BaseEntity {
|
|||||||
* 是否重要(1非常重要、2重要、3一般)
|
* 是否重要(1非常重要、2重要、3一般)
|
||||||
*/
|
*/
|
||||||
private String imgUrl;
|
private String imgUrl;
|
||||||
|
/**
|
||||||
|
* 园区id
|
||||||
|
*/
|
||||||
|
private Long communityId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 建筑id
|
||||||
|
*/
|
||||||
|
private Long buildingId;
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,121 @@
|
|||||||
|
package org.dromara.property.domain.bo.mobile;
|
||||||
|
|
||||||
|
|
||||||
|
import jakarta.validation.constraints.NotNull;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.dromara.common.core.validate.AddGroup;
|
||||||
|
import org.dromara.common.core.validate.EditGroup;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuyongle
|
||||||
|
* @version 1.0
|
||||||
|
* @description: TODO
|
||||||
|
* @date 2025/9/5 11:40
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class InspectionTaskDetailToOrderBo {
|
||||||
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "主键id不能为空", groups = { EditGroup.class })
|
||||||
|
private Long id;
|
||||||
|
/**
|
||||||
|
* 工单类型id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "工单类型id不能为空", groups = { EditGroup.class })
|
||||||
|
private Long orderTypeId;
|
||||||
|
/**
|
||||||
|
* 任务id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "任务id不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long taskId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 路线id
|
||||||
|
*/
|
||||||
|
private Long routeId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 巡检计划id
|
||||||
|
*/
|
||||||
|
@NotNull(message = "巡检计划id不能为空", groups = { AddGroup.class, EditGroup.class })
|
||||||
|
private Long planId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 巡检点id
|
||||||
|
*/
|
||||||
|
private Long pointId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 签到类型(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 inspectionResults;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 巡检描述
|
||||||
|
*/
|
||||||
|
private String inspectionDesc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 巡检位置
|
||||||
|
*/
|
||||||
|
private String inspectionLocation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实际巡检时间
|
||||||
|
*/
|
||||||
|
private Date inspectionTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 备注
|
||||||
|
*/
|
||||||
|
private String remark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点开始时间
|
||||||
|
*/
|
||||||
|
private Date pointStartTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 点结束时间
|
||||||
|
*/
|
||||||
|
private Date pointEndTime;
|
||||||
|
}
|
@@ -94,10 +94,13 @@ public class CustomerFeedbacksVo implements Serializable {
|
|||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 客服电话
|
* 反馈单位
|
||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "客服电话")
|
private Long feedbackUnit;
|
||||||
private String serviceName;
|
/**
|
||||||
|
* 反馈单位文本
|
||||||
|
*/
|
||||||
|
private String feedbackUnitText;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 搜索值
|
* 搜索值
|
||||||
|
@@ -0,0 +1,134 @@
|
|||||||
|
package org.dromara.property.domain.vo;
|
||||||
|
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@NoArgsConstructor // 无参构造用于反序列化
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE) // 私有全参构造,供 Builder 使用
|
||||||
|
public class IndexCountVo {
|
||||||
|
|
||||||
|
private Integer workOrdersTotal; // 总工单数
|
||||||
|
private Integer workOrdersToday; // 今日工单数
|
||||||
|
private List<PieChartVo> satisfactionChartList; // 工单类型分布饼图
|
||||||
|
private List<StatusChartVo> statusChartVoChartList; // 设备状态分布图表
|
||||||
|
private Integer visitorsToday; // 今日访客数
|
||||||
|
private Integer visitorsTotal; // 总访客数
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public static class PieChartVo {
|
||||||
|
private String type; // 类型名称(如:维修、咨询)
|
||||||
|
private Integer quantity; // 数量
|
||||||
|
|
||||||
|
public static PieChartVoBuilder builder() {
|
||||||
|
return new PieChartVoBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PieChartVoBuilder {
|
||||||
|
private String type;
|
||||||
|
private Integer quantity;
|
||||||
|
|
||||||
|
public PieChartVoBuilder type(String type) {
|
||||||
|
this.type = type;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PieChartVoBuilder quantity(Integer quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PieChartVo build() {
|
||||||
|
return new PieChartVo(type, quantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor(access = AccessLevel.PRIVATE)
|
||||||
|
public static class StatusChartVo {
|
||||||
|
private String type; // 类型名称(如:维修、咨询)
|
||||||
|
private Integer quantity; // 数量
|
||||||
|
|
||||||
|
public static StatusChartVoBuilder builder() {
|
||||||
|
return new StatusChartVoBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class StatusChartVoBuilder {
|
||||||
|
private String type;
|
||||||
|
private Integer quantity;
|
||||||
|
|
||||||
|
public StatusChartVoBuilder type(String type) {
|
||||||
|
this.type = type;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatusChartVoBuilder quantity(Integer quantity) {
|
||||||
|
this.quantity = quantity;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StatusChartVo build() {
|
||||||
|
return new StatusChartVo(type, quantity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IndexCountVoBuilder builder() {
|
||||||
|
return new IndexCountVoBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class IndexCountVoBuilder {
|
||||||
|
private Integer workOrdersTotal;
|
||||||
|
private Integer workOrdersToday;
|
||||||
|
private List<PieChartVo> satisfactionChartList;
|
||||||
|
private List<StatusChartVo> statusChartVoChartList;
|
||||||
|
private Integer visitorsToday;
|
||||||
|
private Integer visitorsTotal;
|
||||||
|
|
||||||
|
public IndexCountVoBuilder workOrdersTotal(Integer workOrdersTotal) {
|
||||||
|
this.workOrdersTotal = workOrdersTotal;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVoBuilder workOrdersToday(Integer workOrdersToday) {
|
||||||
|
this.workOrdersToday = workOrdersToday;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVoBuilder visitorsToday(Integer visitorsToday) {
|
||||||
|
this.visitorsToday = visitorsToday;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVoBuilder visitorsTotal(Integer visitorsTotal) {
|
||||||
|
this.visitorsTotal = visitorsTotal;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVoBuilder satisfactionChartList(List<PieChartVo> satisfactionChartList) {
|
||||||
|
this.satisfactionChartList = satisfactionChartList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVoBuilder statusChartVoChartList(List<StatusChartVo> statusChartVoChartList) {
|
||||||
|
this.statusChartVoChartList = statusChartVoChartList;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IndexCountVo build() {
|
||||||
|
return new IndexCountVo(workOrdersTotal, workOrdersToday, satisfactionChartList, statusChartVoChartList, visitorsToday, visitorsTotal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -58,7 +58,10 @@ public class InspectionTaskDetailVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "路线text")
|
@ExcelProperty(value = "路线text")
|
||||||
private String routeText;
|
private String routeText;
|
||||||
|
/**
|
||||||
|
* 工单id
|
||||||
|
*/
|
||||||
|
private Long orderId;
|
||||||
/**
|
/**
|
||||||
* 巡检计划id
|
* 巡检计划id
|
||||||
*/
|
*/
|
||||||
|
@@ -48,6 +48,9 @@ public class MeetVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "会议室类型")
|
@ExcelProperty(value = "会议室类型")
|
||||||
private String meetingRoomType;
|
private String meetingRoomType;
|
||||||
|
|
||||||
|
@ExcelProperty(value = "保密等级")
|
||||||
|
private String secrecyGrade;
|
||||||
/**
|
/**
|
||||||
* 会议室位置
|
* 会议室位置
|
||||||
*/
|
*/
|
||||||
|
@@ -5,11 +5,12 @@ import cn.idev.excel.annotation.ExcelProperty;
|
|||||||
import io.github.linpeilie.annotations.AutoMapper;
|
import io.github.linpeilie.annotations.AutoMapper;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.dromara.property.domain.ServiceWorkOrders;
|
import org.dromara.property.domain.ServiceWorkOrders;
|
||||||
|
import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersRecordVo;
|
||||||
|
|
||||||
import java.io.Serial;
|
import java.io.Serial;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,4 +157,8 @@ public class ServiceWorkOrdersVo implements Serializable {
|
|||||||
* 创建时间
|
* 创建时间
|
||||||
*/
|
*/
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
/**
|
||||||
|
* 工单记录
|
||||||
|
*/
|
||||||
|
List<MServiceWorkOrdersRecordVo> recordVoList;
|
||||||
}
|
}
|
||||||
|
@@ -56,6 +56,11 @@ public class TbRoomVo implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "所属楼层ID")
|
@ExcelProperty(value = "所属楼层ID")
|
||||||
private Long floorId;
|
private Long floorId;
|
||||||
|
/**
|
||||||
|
* 所属楼层text
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "所属楼层Text")
|
||||||
|
private String floorText;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 房间号(如101,202)
|
* 房间号(如101,202)
|
||||||
@@ -120,4 +125,17 @@ public class TbRoomVo implements Serializable {
|
|||||||
* 图片
|
* 图片
|
||||||
*/
|
*/
|
||||||
private String imgUrl;
|
private String imgUrl;
|
||||||
|
/**
|
||||||
|
* 园区文本
|
||||||
|
*/
|
||||||
|
private String communityText;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 建筑文本
|
||||||
|
*/
|
||||||
|
private String buildingText;
|
||||||
|
/**
|
||||||
|
* 入驻单位文本
|
||||||
|
*/
|
||||||
|
private String residentUnitText;
|
||||||
}
|
}
|
||||||
|
@@ -84,6 +84,11 @@ public class MInspectionTaskDetailVo {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "巡检计划id")
|
@ExcelProperty(value = "巡检计划id")
|
||||||
private Long planId;
|
private Long planId;
|
||||||
|
/**
|
||||||
|
* 工单id
|
||||||
|
*/
|
||||||
|
@ExcelProperty(value = "工单id")
|
||||||
|
private Long orderId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)
|
* 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)
|
||||||
@@ -158,4 +163,8 @@ public class MInspectionTaskDetailVo {
|
|||||||
*/
|
*/
|
||||||
@ExcelProperty(value = "备注")
|
@ExcelProperty(value = "备注")
|
||||||
private String remark;
|
private String remark;
|
||||||
|
/**
|
||||||
|
* 工单
|
||||||
|
*/
|
||||||
|
private MServiceWorkOrdersVo mServiceWorkOrdersVo;
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
package org.dromara.property.service;
|
package org.dromara.property.service;
|
||||||
|
|
||||||
|
import org.dromara.property.domain.bo.mobile.InspectionTaskDetailToOrderBo;
|
||||||
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
import org.dromara.property.domain.vo.InspectionTaskDetailVo;
|
||||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@@ -87,4 +88,11 @@ public interface IInspectionTaskDetailService {
|
|||||||
* 提交巡检明细
|
* 提交巡检明细
|
||||||
*/
|
*/
|
||||||
Boolean submit(InspectionTaskDetailBo bo);
|
Boolean submit(InspectionTaskDetailBo bo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 巡检提报工单
|
||||||
|
* @param bo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
Boolean reportedOrder(InspectionTaskDetailToOrderBo bo);
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
package org.dromara.property.service;
|
||||||
|
|
||||||
|
import org.dromara.property.domain.vo.IndexCountVo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首页展示数据
|
||||||
|
* @author yuyongle
|
||||||
|
* @date 2025-06-21
|
||||||
|
*/
|
||||||
|
public interface IndexService {
|
||||||
|
/**
|
||||||
|
* 首页统计数量
|
||||||
|
*/
|
||||||
|
IndexCountVo indexCount();
|
||||||
|
}
|
@@ -3,26 +3,26 @@ package org.dromara.property.service.impl;
|
|||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
|
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.DubboReference;
|
import org.apache.dubbo.config.annotation.DubboReference;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
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.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.property.domain.*;
|
import org.dromara.property.domain.CustomerFeedbacks;
|
||||||
|
import org.dromara.property.domain.ServiceWorkOrders;
|
||||||
|
import org.dromara.property.domain.ServiceWorkOrdersRecord;
|
||||||
|
import org.dromara.property.domain.ServiceWorkOrdersType;
|
||||||
import org.dromara.property.domain.bo.CustomerFeedbacksBo;
|
import org.dromara.property.domain.bo.CustomerFeedbacksBo;
|
||||||
import org.dromara.property.domain.bo.ServiceWorkOrdersBo;
|
|
||||||
import org.dromara.property.domain.vo.CustomerFeedbacksVo;
|
import org.dromara.property.domain.vo.CustomerFeedbacksVo;
|
||||||
import org.dromara.property.domain.vo.CustomerNoticesVo;
|
|
||||||
import org.dromara.property.mapper.CustomerFeedbacksMapper;
|
import org.dromara.property.domain.vo.residentVo.ResidentUnitVo;
|
||||||
import org.dromara.property.mapper.ServiceWorkOrdersMapper;
|
import org.dromara.property.mapper.*;
|
||||||
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
|
|
||||||
import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper;
|
|
||||||
import org.dromara.property.service.ICustomerFeedbacksService;
|
import org.dromara.property.service.ICustomerFeedbacksService;
|
||||||
import org.dromara.system.api.RemoteUserService;
|
import org.dromara.system.api.RemoteUserService;
|
||||||
import org.dromara.system.api.domain.vo.RemoteUserVo;
|
import org.dromara.system.api.domain.vo.RemoteUserVo;
|
||||||
@@ -30,10 +30,9 @@ import org.dromara.system.api.model.LoginUser;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,6 +50,7 @@ public class CustomerFeedbacksServiceImpl implements ICustomerFeedbacksService {
|
|||||||
private final ServiceWorkOrdersMapper serviceWorkOrdersMapper;
|
private final ServiceWorkOrdersMapper serviceWorkOrdersMapper;
|
||||||
private final ServiceWorkOrdersTypeMapper serviceWorkOrdersTypeMapper;
|
private final ServiceWorkOrdersTypeMapper serviceWorkOrdersTypeMapper;
|
||||||
private final ServiceWorkOrdersRecordMapper serviceWorkOrdersRecordMapper;
|
private final ServiceWorkOrdersRecordMapper serviceWorkOrdersRecordMapper;
|
||||||
|
private final ResidentUnitMapper residentUnitMapper;
|
||||||
@DubboReference
|
@DubboReference
|
||||||
private RemoteUserService remoteUserService;
|
private RemoteUserService remoteUserService;
|
||||||
|
|
||||||
@@ -96,8 +96,12 @@ public class CustomerFeedbacksServiceImpl implements ICustomerFeedbacksService {
|
|||||||
.distinct()
|
.distinct()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
List<RemoteUserVo> remoteUserVos = remoteUserService.selectListByIds(uerIds);
|
List<RemoteUserVo> remoteUserVos = remoteUserService.selectListByIds(uerIds);
|
||||||
|
//收集反馈单位id
|
||||||
|
List<Long> feedbackUnitIds = result.getRecords().stream().map(CustomerFeedbacksVo::getFeedbackUnit).distinct().toList();
|
||||||
|
//收集反馈单位weimap
|
||||||
|
Map<Long, String> unitNameMap = residentUnitMapper.selectVoByIds(feedbackUnitIds).stream().collect(Collectors.toMap(ResidentUnitVo::getId, ResidentUnitVo::getName));
|
||||||
result.getRecords().stream().forEach(s -> {
|
result.getRecords().stream().forEach(s -> {
|
||||||
assembly(s, serviceWorkOrdersTypes, remoteUserVos);
|
assembly(s, serviceWorkOrdersTypes, remoteUserVos,unitNameMap);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return TableDataInfo.build(result);
|
return TableDataInfo.build(result);
|
||||||
@@ -108,7 +112,7 @@ public class CustomerFeedbacksServiceImpl implements ICustomerFeedbacksService {
|
|||||||
* @param customerFeedbacksVo 意见反馈返回信息
|
* @param customerFeedbacksVo 意见反馈返回信息
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private void assembly(CustomerFeedbacksVo customerFeedbacksVo, List<ServiceWorkOrdersType> serviceWorkOrdersTypes, List<RemoteUserVo> remoteUserVos) {
|
private void assembly(CustomerFeedbacksVo customerFeedbacksVo, List<ServiceWorkOrdersType> serviceWorkOrdersTypes, List<RemoteUserVo> remoteUserVos,Map<Long, String> unitNameMap) {
|
||||||
if (CollUtil.isNotEmpty(remoteUserVos)) {
|
if (CollUtil.isNotEmpty(remoteUserVos)) {
|
||||||
RemoteUserVo remoteUserVo = remoteUserVos.stream()
|
RemoteUserVo remoteUserVo = remoteUserVos.stream()
|
||||||
.filter(vo -> vo.getUserId() != null && vo.getUserId().equals(customerFeedbacksVo.getFeedbackPersion())).findFirst().orElse(null);
|
.filter(vo -> vo.getUserId() != null && vo.getUserId().equals(customerFeedbacksVo.getFeedbackPersion())).findFirst().orElse(null);
|
||||||
@@ -118,6 +122,7 @@ public class CustomerFeedbacksServiceImpl implements ICustomerFeedbacksService {
|
|||||||
ServiceWorkOrdersType serviceWorkOrdersType = serviceWorkOrdersTypes.stream().filter(vo -> vo.getId() != null && vo.getId().equals(customerFeedbacksVo.getFeedbackType())).findFirst().orElse(null);
|
ServiceWorkOrdersType serviceWorkOrdersType = serviceWorkOrdersTypes.stream().filter(vo -> vo.getId() != null && vo.getId().equals(customerFeedbacksVo.getFeedbackType())).findFirst().orElse(null);
|
||||||
customerFeedbacksVo.setFeedbackTypeName(ObjectUtil.isNotEmpty(serviceWorkOrdersType) ? serviceWorkOrdersType.getOrderTypeName() : null);
|
customerFeedbacksVo.setFeedbackTypeName(ObjectUtil.isNotEmpty(serviceWorkOrdersType) ? serviceWorkOrdersType.getOrderTypeName() : null);
|
||||||
}
|
}
|
||||||
|
customerFeedbacksVo.setFeedbackUnitText(unitNameMap.get(customerFeedbacksVo.getFeedbackUnit()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +150,6 @@ public class CustomerFeedbacksServiceImpl implements ICustomerFeedbacksService {
|
|||||||
lqw.eq(StringUtils.isNotBlank(bo.getFeedbackImg()), CustomerFeedbacks::getFeedbackImg, bo.getFeedbackImg());
|
lqw.eq(StringUtils.isNotBlank(bo.getFeedbackImg()), CustomerFeedbacks::getFeedbackImg, bo.getFeedbackImg());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getIsWorkOrder()), CustomerFeedbacks::getIsWorkOrder, bo.getIsWorkOrder());
|
lqw.eq(StringUtils.isNotBlank(bo.getIsWorkOrder()), CustomerFeedbacks::getIsWorkOrder, bo.getIsWorkOrder());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerFeedbacks::getStatus, bo.getStatus());
|
lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerFeedbacks::getStatus, bo.getStatus());
|
||||||
lqw.like(StringUtils.isNotBlank(bo.getServiceName()), CustomerFeedbacks::getServiceName, bo.getServiceName());
|
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), CustomerFeedbacks::getSearchValue, bo.getSearchValue());
|
lqw.eq(StringUtils.isNotBlank(bo.getSearchValue()), CustomerFeedbacks::getSearchValue, bo.getSearchValue());
|
||||||
return lqw;
|
return lqw;
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,128 @@
|
|||||||
|
package org.dromara.property.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.property.domain.Machine;
|
||||||
|
import org.dromara.property.domain.MachineType;
|
||||||
|
import org.dromara.property.domain.ServiceWorkOrders;
|
||||||
|
import org.dromara.property.domain.ServiceWorkOrdersType;
|
||||||
|
import org.dromara.property.domain.entity.resident.ResidentPerson;
|
||||||
|
import org.dromara.property.domain.vo.IndexCountVo;
|
||||||
|
import org.dromara.property.domain.vo.ServiceWorkOrderAnalysisVo;
|
||||||
|
import org.dromara.property.mapper.*;
|
||||||
|
import org.dromara.property.service.IndexService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author yuyongle
|
||||||
|
* @version 1.0
|
||||||
|
* @description: 首页展示数据
|
||||||
|
* @date 2025/9/5 15:01
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@Service
|
||||||
|
public class IndexServiceImpl implements IndexService {
|
||||||
|
private final ServiceWorkOrdersMapper serviceWorkOrdersMapper;
|
||||||
|
private final ServiceWorkOrdersTypeMapper typesMapper;
|
||||||
|
private final ResidentPersonMapper residentPersonMapper;
|
||||||
|
private final MachineTypeMapper machineTypeMapper;
|
||||||
|
private final MachineMapper machineMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 首页统计数量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public IndexCountVo indexCount() {
|
||||||
|
IndexCountVo indexCountVo = new IndexCountVo();
|
||||||
|
List<ServiceWorkOrders> serviceWorkOrderList = serviceWorkOrdersMapper.selectList();
|
||||||
|
indexCountVo.setWorkOrdersTotal(serviceWorkOrderList.size());
|
||||||
|
if (CollUtil.isNotEmpty(serviceWorkOrderList)) {
|
||||||
|
//筛选今日创建的工单
|
||||||
|
List<ServiceWorkOrders> serviceWorkOrdersToday = serviceWorkOrderList.stream()
|
||||||
|
.filter(s -> DateUtil.isSameDay(s.getCreateTime(), new Date()))
|
||||||
|
.toList();
|
||||||
|
indexCountVo.setWorkOrdersToday(serviceWorkOrdersToday.size());
|
||||||
|
List<IndexCountVo.PieChartVo> pieChartVos = calculateWorkOrderTypeDistribution(serviceWorkOrderList);
|
||||||
|
indexCountVo.setSatisfactionChartList(pieChartVos);
|
||||||
|
}else {
|
||||||
|
indexCountVo.setWorkOrdersToday(0);
|
||||||
|
indexCountVo.setSatisfactionChartList(new ArrayList<>());
|
||||||
|
}
|
||||||
|
//查询访客数量
|
||||||
|
List<ResidentPerson> residentPersionList = residentPersonMapper.selectList();
|
||||||
|
indexCountVo.setVisitorsTotal(residentPersionList.size());
|
||||||
|
if (CollUtil.isNotEmpty(residentPersionList)) {
|
||||||
|
//筛选今日创建的工单
|
||||||
|
List<ResidentPerson> todayResidentPersonlist = residentPersionList.stream()
|
||||||
|
.filter(s -> DateUtil.isSameDay(s.getCreateTime(), new Date()))
|
||||||
|
.toList();
|
||||||
|
indexCountVo.setVisitorsToday(todayResidentPersonlist.size());
|
||||||
|
}else {
|
||||||
|
indexCountVo.setVisitorsToday(0);
|
||||||
|
}
|
||||||
|
//查询设备各状态数量
|
||||||
|
List<IndexCountVo.StatusChartVo> statusChartVos = new ArrayList<>();
|
||||||
|
|
||||||
|
return indexCountVo;
|
||||||
|
}
|
||||||
|
// 计算工单类型分布
|
||||||
|
private List<IndexCountVo.PieChartVo> calculateWorkOrderTypeDistribution(List<ServiceWorkOrders> serviceWorkOrdersList) {
|
||||||
|
// 按 typeId 分组统计数量
|
||||||
|
Map<Long, Long> workOrderTypeCounts = serviceWorkOrdersList.stream()
|
||||||
|
.collect(Collectors.groupingBy(ServiceWorkOrders::getType, Collectors.counting()));
|
||||||
|
|
||||||
|
List<IndexCountVo.PieChartVo> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<Long, Long> entry : workOrderTypeCounts.entrySet()) {
|
||||||
|
Long typeId = entry.getKey();
|
||||||
|
Integer count = entry.getValue().intValue();
|
||||||
|
|
||||||
|
// 查询类型名称
|
||||||
|
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(typeId);
|
||||||
|
String type = serviceWorkOrdersType != null ? serviceWorkOrdersType.getOrderTypeName() : "未知类型";
|
||||||
|
|
||||||
|
// 添加到结果中
|
||||||
|
result.add( IndexCountVo.PieChartVo.builder()
|
||||||
|
.type(type)
|
||||||
|
.quantity(count)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算设备类型分布
|
||||||
|
private List<IndexCountVo.StatusChartVo> calculateMachineTypeDistribution(List<Machine> machinesList) {
|
||||||
|
// 按 typeId 分组统计数量
|
||||||
|
Map<Long, Long> machineTypeCounts = machinesList.stream()
|
||||||
|
.collect(Collectors.groupingBy(Machine::getMachineTypeId, Collectors.counting()));
|
||||||
|
List<IndexCountVo.StatusChartVo> result = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<Long, Long> entry : machineTypeCounts.entrySet()) {
|
||||||
|
Long typeId = entry.getKey();
|
||||||
|
Integer count = entry.getValue().intValue();
|
||||||
|
|
||||||
|
// 查询类型名称
|
||||||
|
MachineType machineType = machineTypeMapper.selectById(typeId);
|
||||||
|
String type = machineType != null ? machineType.getMachineTypeName() : "未知类型";
|
||||||
|
// 添加到结果中
|
||||||
|
result.add(IndexCountVo.StatusChartVo.builder()
|
||||||
|
.type(type)
|
||||||
|
.quantity(count)
|
||||||
|
.build());
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@@ -2,8 +2,11 @@ package org.dromara.property.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.bean.BeanUtil;
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import org.apache.commons.beanutils.BeanMap;
|
||||||
import org.dromara.common.core.utils.MapstructUtils;
|
import org.dromara.common.core.utils.MapstructUtils;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
@@ -13,18 +16,27 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
import org.dromara.common.satoken.utils.LoginHelper;
|
import org.dromara.common.satoken.utils.LoginHelper;
|
||||||
import org.dromara.property.domain.InspectionPlan;
|
import org.dromara.property.domain.*;
|
||||||
|
import org.dromara.property.domain.bo.ServiceWorkOrdersTypeBo;
|
||||||
|
import org.dromara.property.domain.bo.mobile.InspectionTaskDetailToOrderBo;
|
||||||
|
import org.dromara.property.domain.enums.OrderReportingTypeEnum;
|
||||||
|
import org.dromara.property.domain.enums.OrderTypeOperationEnum;
|
||||||
|
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
|
||||||
import org.dromara.property.domain.vo.*;
|
import org.dromara.property.domain.vo.*;
|
||||||
import org.dromara.property.domain.vo.mobile.MInspectionTaskDetailVo;
|
import org.dromara.property.domain.vo.mobile.MInspectionTaskDetailVo;
|
||||||
|
import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersRecordVo;
|
||||||
|
import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo;
|
||||||
import org.dromara.property.mapper.*;
|
import org.dromara.property.mapper.*;
|
||||||
|
import org.dromara.property.mapper.attendanceMapper.AttendanceUserGroupMapper;
|
||||||
import org.dromara.system.api.model.LoginUser;
|
import org.dromara.system.api.model.LoginUser;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
import org.dromara.property.domain.bo.InspectionTaskDetailBo;
|
||||||
import org.dromara.property.domain.InspectionTaskDetail;
|
|
||||||
import org.dromara.property.service.IInspectionTaskDetailService;
|
import org.dromara.property.service.IInspectionTaskDetailService;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@@ -44,6 +56,10 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
|||||||
private final InspectionPlanMapper inspectionPlanMapper;
|
private final InspectionPlanMapper inspectionPlanMapper;
|
||||||
private final InspectionRouteMapper inspectionRouteMapper;
|
private final InspectionRouteMapper inspectionRouteMapper;
|
||||||
private final InspectionTaskMapper inspectionTaskMapper;
|
private final InspectionTaskMapper inspectionTaskMapper;
|
||||||
|
private final ServiceWorkOrdersTypeMapper typesMapper;
|
||||||
|
private final ServiceWorkOrdersMapper serviceWorkOrdersMapper;
|
||||||
|
private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
|
||||||
|
private final AttendanceUserGroupMapper attendanceUserGroupMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询巡检明细
|
* 查询巡检明细
|
||||||
@@ -68,25 +84,25 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
|||||||
LambdaQueryWrapper<InspectionTaskDetail> lqw = buildQueryWrapper(bo);
|
LambdaQueryWrapper<InspectionTaskDetail> lqw = buildQueryWrapper(bo);
|
||||||
Page<InspectionTaskDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
Page<InspectionTaskDetailVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||||||
if (CollUtil.isNotEmpty(result.getRecords())) {
|
if (CollUtil.isNotEmpty(result.getRecords())) {
|
||||||
//收集任务id为list
|
// //收集任务id为list
|
||||||
List<Long> taskIds = result.getRecords().stream().map(InspectionTaskDetailVo::getTaskId).toList();
|
// List<Long> taskIds = result.getRecords().stream().map(InspectionTaskDetailVo::getTaskId).toList();
|
||||||
//收集任务为map id和名称
|
// //收集任务为map id和名称
|
||||||
Map<Long, String> taskNameMap = inspectionTaskMapper.selectVoByIds(taskIds).stream()
|
// Map<Long, String> taskNameMap = inspectionTaskMapper.selectVoByIds(taskIds).stream()
|
||||||
.collect(Collectors.toMap(InspectionTaskVo::getId, InspectionTaskVo::getPlanName));
|
// .collect(Collectors.toMap(InspectionTaskVo::getId, InspectionTaskVo::getPlanName));
|
||||||
//收集路线id为list
|
// //收集路线id为list
|
||||||
List<Long> routeIds = result.getRecords().stream().map(InspectionTaskDetailVo::getRouteId).toList();
|
// List<Long> routeIds = result.getRecords().stream().map(InspectionTaskDetailVo::getRouteId).toList();
|
||||||
//收集任务为map id和名称
|
// //收集任务为map id和名称
|
||||||
Map<Long, String> routeNameMap = inspectionRouteMapper.selectVoByIds(routeIds).stream()
|
// Map<Long, String> routeNameMap = inspectionRouteMapper.selectVoByIds(routeIds).stream()
|
||||||
.collect(Collectors.toMap(InspectionRouteVo::getId, InspectionRouteVo::getRouteName));
|
// .collect(Collectors.toMap(InspectionRouteVo::getId, InspectionRouteVo::getRouteName));
|
||||||
//收集路线列表
|
// //收集路线列表
|
||||||
List<InspectionRouteVo> inspectionRoutes = inspectionRouteMapper.selectVoByIds(routeIds);
|
// List<InspectionRouteVo> inspectionRoutes = inspectionRouteMapper.selectVoByIds(routeIds);
|
||||||
//收集计划id为list
|
// //收集计划id为list
|
||||||
List<Long> planIds = result.getRecords().stream().map(InspectionTaskDetailVo::getPlanId).toList();
|
// List<Long> planIds = result.getRecords().stream().map(InspectionTaskDetailVo::getPlanId).toList();
|
||||||
//收集计划列表
|
// //收集计划列表
|
||||||
Map<Long, String> planNameMap = inspectionPlanMapper.selectVoByIds(routeIds).stream()
|
// Map<Long, String> planNameMap = inspectionPlanMapper.selectVoByIds(routeIds).stream()
|
||||||
.collect(Collectors.toMap(InspectionPlanVo::getId, InspectionPlanVo::getPlanName));
|
// .collect(Collectors.toMap(InspectionPlanVo::getId, InspectionPlanVo::getPlanName));
|
||||||
//巡检点id为list
|
// //巡检点id为list
|
||||||
List<Long> pointIds = result.getRecords().stream().map(InspectionTaskDetailVo::getPointId).toList();
|
// List<Long> pointIds = result.getRecords().stream().map(InspectionTaskDetailVo::getPointId).toList();
|
||||||
result.getRecords().stream().forEach(vo -> {
|
result.getRecords().stream().forEach(vo -> {
|
||||||
disposeData(vo);
|
disposeData(vo);
|
||||||
});
|
});
|
||||||
@@ -233,6 +249,19 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
|||||||
*/
|
*/
|
||||||
private void dataProcessing(MInspectionTaskDetailVo mInspectionTaskDetailVo, Map<Long, String> pointNameMap) {
|
private void dataProcessing(MInspectionTaskDetailVo mInspectionTaskDetailVo, Map<Long, String> pointNameMap) {
|
||||||
mInspectionTaskDetailVo.setPointName(ObjectUtil.defaultIfNull(pointNameMap.get(mInspectionTaskDetailVo.getPointId()), "未知点位"));
|
mInspectionTaskDetailVo.setPointName(ObjectUtil.defaultIfNull(pointNameMap.get(mInspectionTaskDetailVo.getPointId()), "未知点位"));
|
||||||
|
//查询工单
|
||||||
|
if(ObjectUtil.isNotEmpty(mInspectionTaskDetailVo.getOrderId())){
|
||||||
|
ServiceWorkOrdersVo serviceWorkOrdersVo = serviceWorkOrdersMapper.selectVoById(mInspectionTaskDetailVo.getOrderId());
|
||||||
|
if(ObjectUtil.isNotEmpty(serviceWorkOrdersVo)){
|
||||||
|
List<ServiceWorkOrdersRecordVo> serviceWorkOrdersRecordVos = workOrdersRecordMapper.selectVoList(
|
||||||
|
new LambdaQueryWrapper<>(ServiceWorkOrdersRecord.class).eq(ServiceWorkOrdersRecord::getOrderId, serviceWorkOrdersVo.getId())
|
||||||
|
);
|
||||||
|
List<MServiceWorkOrdersRecordVo> mServiceWorkOrdersRecordVos = BeanUtil.copyToList(serviceWorkOrdersRecordVos, MServiceWorkOrdersRecordVo.class);
|
||||||
|
serviceWorkOrdersVo.setRecordVoList(mServiceWorkOrdersRecordVos);
|
||||||
|
mInspectionTaskDetailVo.setMServiceWorkOrdersVo(ObjectUtil.isNotEmpty( serviceWorkOrdersVo)? BeanUtil.copyProperties(serviceWorkOrdersVo, MServiceWorkOrdersVo.class):null);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -284,4 +313,94 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer
|
|||||||
InspectionTaskDetail update = MapstructUtils.convert(bo, InspectionTaskDetail.class);
|
InspectionTaskDetail update = MapstructUtils.convert(bo, InspectionTaskDetail.class);
|
||||||
return baseMapper.updateById(update) > 0;
|
return baseMapper.updateById(update) > 0;
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 巡检提报工单
|
||||||
|
* @param bo
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public Boolean reportedOrder(InspectionTaskDetailToOrderBo bo) {
|
||||||
|
//查询工单类型
|
||||||
|
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(bo.getOrderTypeId());
|
||||||
|
ServiceWorkOrders serviceWorkOrders = new ServiceWorkOrders();
|
||||||
|
serviceWorkOrders.setReportingType(OrderReportingTypeEnum.PHONE_REPORT.getValue());
|
||||||
|
LoginUser user = LoginHelper.getLoginUser();
|
||||||
|
serviceWorkOrders.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr());
|
||||||
|
serviceWorkOrders.setOrderName("巡检"+bo.getPointId());
|
||||||
|
serviceWorkOrders.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue());
|
||||||
|
serviceWorkOrders.setInitiatorPeople(user.getNickname());
|
||||||
|
serviceWorkOrders.setProcessingWeight(serviceWorkOrdersType.getProcessingWeight());
|
||||||
|
serviceWorkOrders.setType(serviceWorkOrdersType.getId());
|
||||||
|
serviceWorkOrders.setLocation(bo.getInspectionLocation());
|
||||||
|
boolean flag = serviceWorkOrdersMapper.insert(serviceWorkOrders) > 0;
|
||||||
|
if (flag) {
|
||||||
|
bo.setId(serviceWorkOrders.getId());
|
||||||
|
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
|
||||||
|
serviceWorkOrdersRecord.setOrderId(serviceWorkOrders.getId());
|
||||||
|
serviceWorkOrdersRecord.setStatus(serviceWorkOrders.getStatus());
|
||||||
|
//serviceWorkOrdersRecord.setHandler(add.getHandler());
|
||||||
|
boolean flags = workOrdersRecordMapper.insert(serviceWorkOrdersRecord) > 0;
|
||||||
|
if (flags) {
|
||||||
|
if (serviceWorkOrdersType.getOperationMode().equals(OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())) {
|
||||||
|
handleServiceWorkOrder(serviceWorkOrders,serviceWorkOrdersType,bo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return flag;
|
||||||
|
}
|
||||||
|
//自动派单
|
||||||
|
private void handleServiceWorkOrder(ServiceWorkOrders serviceWorkOrders,ServiceWorkOrdersType serviceWorkOrdersType,InspectionTaskDetailToOrderBo bo) {
|
||||||
|
LocalDate today = LocalDate.now();
|
||||||
|
// 1. 获取今日排班人员(优先查缓存,未命中则查询数据库并缓存)
|
||||||
|
List<AttendanceUserGroup> attendanceUserGroups = RedisUtils.getCacheList(DateUtil.today());
|
||||||
|
List<AttendanceUserGroup> attendanceUserGroupList = attendanceUserGroupMapper.selectList(
|
||||||
|
new LambdaQueryWrapper<AttendanceUserGroup>()
|
||||||
|
.le(AttendanceUserGroup::getStartDate, today)
|
||||||
|
.ge(AttendanceUserGroup::getEndDate, today)
|
||||||
|
.eq(AttendanceUserGroup::getDeptId, serviceWorkOrdersType.getDeptId())
|
||||||
|
.orderByAsc(AttendanceUserGroup::getStartDate)
|
||||||
|
);
|
||||||
|
if (CollUtil.isEmpty(attendanceUserGroups)|| attendanceUserGroups.size() != attendanceUserGroupList.size()) {
|
||||||
|
attendanceUserGroups=attendanceUserGroupList;
|
||||||
|
Assert.isTrue(CollUtil.isNotEmpty(attendanceUserGroups), "暂无排班人员");
|
||||||
|
// 缓存当天排班数据(假设当天不会变)
|
||||||
|
RedisUtils.setCacheList(DateUtil.today(), attendanceUserGroups);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 获取并更新轮询索引(原子性很重要)
|
||||||
|
int currentIndex;
|
||||||
|
Integer lastScheduleId = RedisUtils.getCacheObject(DateUtil.today() + "LastScheduleId");
|
||||||
|
if (lastScheduleId == null || lastScheduleId < 0 || lastScheduleId >= attendanceUserGroups.size()) {
|
||||||
|
currentIndex = 0; // 越界或未设置,重置为0
|
||||||
|
} else {
|
||||||
|
currentIndex = lastScheduleId + 1;
|
||||||
|
if (currentIndex >= attendanceUserGroups.size()) {
|
||||||
|
currentIndex = 0; // 循环轮询
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RedisUtils.setCacheObject(DateUtil.today() + "LastScheduleId", currentIndex);
|
||||||
|
// 3. 分配处理人
|
||||||
|
AttendanceUserGroup assignedGroup = attendanceUserGroups.get(currentIndex);
|
||||||
|
Long employeeId = assignedGroup.getEmployeeId();
|
||||||
|
|
||||||
|
serviceWorkOrders.setHandler(employeeId);
|
||||||
|
serviceWorkOrders.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
|
||||||
|
|
||||||
|
// 4. 插入记录
|
||||||
|
ServiceWorkOrdersRecord record = new ServiceWorkOrdersRecord();
|
||||||
|
record.setOrderId(serviceWorkOrders.getId());
|
||||||
|
record.setHandler(employeeId);
|
||||||
|
record.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
|
||||||
|
workOrdersRecordMapper.insert(record);
|
||||||
|
|
||||||
|
// 5. 更新工单
|
||||||
|
serviceWorkOrders.setDispatchTime(new Date());
|
||||||
|
serviceWorkOrdersMapper.updateById(serviceWorkOrders);
|
||||||
|
//修改巡检明细接口
|
||||||
|
InspectionTaskDetail inspectionTaskDetail = baseMapper.selectById(bo.getId());
|
||||||
|
inspectionTaskDetail.setOrderId(serviceWorkOrders.getId());
|
||||||
|
baseMapper.updateById(inspectionTaskDetail);
|
||||||
|
log.info("成功派单,工单号:{}", serviceWorkOrders.getOrderNo());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
package org.dromara.property.service.impl;
|
package org.dromara.property.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
import cn.hutool.core.lang.Assert;
|
import cn.hutool.core.lang.Assert;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
@@ -11,10 +13,15 @@ import org.dromara.common.core.utils.StringUtils;
|
|||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
import org.dromara.common.mybatis.core.page.TableDataInfo;
|
||||||
import org.dromara.property.domain.TbRoom;
|
import org.dromara.property.domain.TbRoom;
|
||||||
import org.dromara.property.domain.TbRoomBooking;
|
|
||||||
import org.dromara.property.domain.bo.TbRoomBo;
|
import org.dromara.property.domain.bo.TbRoomBo;
|
||||||
|
import org.dromara.property.domain.entity.resident.ResidentUnit;
|
||||||
|
import org.dromara.property.domain.vo.TbBuildingVo;
|
||||||
|
import org.dromara.property.domain.vo.TbCommunityVo;
|
||||||
import org.dromara.property.domain.vo.TbFloorVo;
|
import org.dromara.property.domain.vo.TbFloorVo;
|
||||||
import org.dromara.property.domain.vo.TbRoomVo;
|
import org.dromara.property.domain.vo.TbRoomVo;
|
||||||
|
import org.dromara.property.mapper.ResidentUnitMapper;
|
||||||
|
import org.dromara.property.mapper.TbBuildingMapper;
|
||||||
|
import org.dromara.property.mapper.TbCommunityMapper;
|
||||||
import org.dromara.property.mapper.TbRoomMapper;
|
import org.dromara.property.mapper.TbRoomMapper;
|
||||||
import org.dromara.property.service.ITbFloorService;
|
import org.dromara.property.service.ITbFloorService;
|
||||||
import org.dromara.property.service.ITbRoomService;
|
import org.dromara.property.service.ITbRoomService;
|
||||||
@@ -37,6 +44,9 @@ public class TbRoomServiceImpl implements ITbRoomService {
|
|||||||
|
|
||||||
private final TbRoomMapper baseMapper;
|
private final TbRoomMapper baseMapper;
|
||||||
private final ITbFloorService tbFloorService;
|
private final ITbFloorService tbFloorService;
|
||||||
|
private final TbBuildingMapper tbBuildingMapper;
|
||||||
|
private final TbCommunityMapper tbCommunityMapper;
|
||||||
|
private final ResidentUnitMapper residentUnitMapper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询房间信息
|
* 查询房间信息
|
||||||
@@ -46,7 +56,24 @@ public class TbRoomServiceImpl implements ITbRoomService {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public TbRoomVo queryById(Long id) {
|
public TbRoomVo queryById(Long id) {
|
||||||
return baseMapper.selectVoById(id);
|
TbRoomVo tbRoomVo = baseMapper.selectVoById(id);
|
||||||
|
//查询园区id
|
||||||
|
TbCommunityVo tbCommunityVo = tbCommunityMapper.selectVoById(tbRoomVo.getCommunityId());
|
||||||
|
tbRoomVo.setCommunityText(ObjectUtil.isNotEmpty(tbCommunityVo) ? tbCommunityVo.getCommunityName() : null);
|
||||||
|
//查询楼栋id
|
||||||
|
TbBuildingVo tbBuildingVo = tbBuildingMapper.selectVoById(tbRoomVo.getBuildingId());
|
||||||
|
tbRoomVo.setBuildingText(ObjectUtil.isNotEmpty(tbBuildingVo) ? tbBuildingVo.getBuildingName() : null);
|
||||||
|
//查询楼栋信息
|
||||||
|
TbFloorVo tbFloorVo = tbFloorService.queryById(tbRoomVo.getFloorId());
|
||||||
|
tbRoomVo.setFloorText(ObjectUtil.isNotEmpty(tbFloorVo) ? tbFloorVo.getFloorName() : null);
|
||||||
|
List<ResidentUnit> residentUnits = residentUnitMapper.selectList(
|
||||||
|
new LambdaQueryWrapper<ResidentUnit>()
|
||||||
|
.eq(ResidentUnit::getLocation, tbRoomVo.getId())
|
||||||
|
);
|
||||||
|
if (CollUtil.isNotEmpty(residentUnits)) {
|
||||||
|
tbRoomVo.setResidentUnitText(residentUnits.get(0).getName());
|
||||||
|
}
|
||||||
|
return tbRoomVo;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,6 +110,8 @@ public class TbRoomServiceImpl implements ITbRoomService {
|
|||||||
lqw.eq(StringUtils.isNotBlank(bo.getRoomNumber()), TbRoom::getRoomNumber, bo.getRoomNumber());
|
lqw.eq(StringUtils.isNotBlank(bo.getRoomNumber()), TbRoom::getRoomNumber, bo.getRoomNumber());
|
||||||
lqw.eq(bo.getRoomType() != null, TbRoom::getRoomType, bo.getRoomType());
|
lqw.eq(bo.getRoomType() != null, TbRoom::getRoomType, bo.getRoomType());
|
||||||
lqw.eq(bo.getFloorId() != null, TbRoom::getFloorId, bo.getFloorId());
|
lqw.eq(bo.getFloorId() != null, TbRoom::getFloorId, bo.getFloorId());
|
||||||
|
lqw.eq(bo.getCommunityId() != null, TbRoom::getCommunityId, bo.getCommunityId());
|
||||||
|
lqw.eq(bo.getBuildingId() != null, TbRoom::getBuildingId, bo.getBuildingId());
|
||||||
lqw.eq(bo.getArea() != null, TbRoom::getArea, bo.getArea());
|
lqw.eq(bo.getArea() != null, TbRoom::getArea, bo.getArea());
|
||||||
lqw.eq(StringUtils.isNotBlank(bo.getLayout()), TbRoom::getLayout, bo.getLayout());
|
lqw.eq(StringUtils.isNotBlank(bo.getLayout()), TbRoom::getLayout, bo.getLayout());
|
||||||
lqw.eq(bo.getOrientation() != null, TbRoom::getOrientation, bo.getOrientation());
|
lqw.eq(bo.getOrientation() != null, TbRoom::getOrientation, bo.getOrientation());
|
||||||
@@ -154,14 +183,18 @@ public class TbRoomServiceImpl implements ITbRoomService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取房间名称
|
* 获取房间名称
|
||||||
|
*
|
||||||
* @param roomId 房间id
|
* @param roomId 房间id
|
||||||
* @return 房间名称
|
* @return 房间名称
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String queryRoomName(Long roomId) {
|
public String queryRoomName(Long roomId) {
|
||||||
return baseMapper.queryRoomName(roomId);
|
return baseMapper.queryRoomName(roomId);
|
||||||
} /**
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
* 获取房间名称
|
* 获取房间名称
|
||||||
|
*
|
||||||
* @param
|
* @param
|
||||||
* @return 房间名称
|
* @return 房间名称
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user