From b5de50fb67f352c95dd23a1ba1e8b6c61f526e62 Mon Sep 17 00:00:00 2001 From: yuyongle <1150359267@qq.com> Date: Tue, 9 Sep 2025 18:02:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=9D=E6=B4=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BigScreen/ScreenController.java | 49 +++++++ .../CleanOrderRecordController.java | 106 ++++++++++++++ .../cleanOrder/CleanOrderController.java | 8 + .../mobile/MCustomerActivityController.java | 36 +++++ .../mobile/MInspectionTaskController.java | 11 ++ .../mobile/MServiceWorkOrdersController.java | 12 ++ .../org/dromara/property/domain/Clean.java | 4 + .../property/domain/CleanOrderRecord.java | 73 +++++++++ .../domain/bo/CleanOrderRecordBo.java | 74 ++++++++++ .../domain/bo/cleanOrderBo/CleanBo.java | 6 +- .../domain/bo/cleanOrderBo/CleanOrderBo.java | 4 + .../domain/vo/BigScreen/TodayMeetCountVo.java | 19 +++ .../BigScreen/TypeWorkOrderHistogramVo.java | 20 +++ .../domain/vo/CleanOrderRecordVo.java | 96 ++++++++++++ .../domain/vo/cleanOrderVo/CleanOrderVo.java | 3 + .../domain/vo/cleanOrderVo/CleanVo.java | 5 +- .../mapper/CleanOrderRecordMapper.java | 15 ++ .../service/ICleanOrderRecordService.java | 69 +++++++++ .../property/service/IMeetBookingService.java | 7 + .../service/IServiceWorkOrdersService.java | 15 +- .../IServiceWorkOrdersTypeService.java | 6 + .../cleanOrderService/ICleanOrderService.java | 8 + .../impl/CleanOrderRecordServiceImpl.java | 138 ++++++++++++++++++ .../service/impl/MeetBookingServiceImpl.java | 75 ++++++---- .../impl/ServiceWorkOrdersServiceImpl.java | 87 +++++++++++ .../ServiceWorkOrdersTypeServiceImpl.java | 12 ++ .../cleanOrderImpl/CleanOrderServiceImpl.java | 72 ++++++++- .../residentImpl/ResidentUnitServiceImpl.java | 6 +- .../dromara/gen/controller/GenController.java | 26 ++-- 29 files changed, 1012 insertions(+), 50 deletions(-) create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/controller/BigScreen/ScreenController.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CleanOrderRecordController.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MCustomerActivityController.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrderRecord.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderRecordBo.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TodayMeetCountVo.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TypeWorkOrderHistogramVo.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderRecordVo.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/CleanOrderRecordMapper.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICleanOrderRecordService.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderRecordServiceImpl.java diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/BigScreen/ScreenController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/BigScreen/ScreenController.java new file mode 100644 index 00000000..92065c28 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/BigScreen/ScreenController.java @@ -0,0 +1,49 @@ +package org.dromara.property.controller.BigScreen; + + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.domain.R; +import org.dromara.common.web.core.BaseController; +import org.dromara.property.domain.MeetBooking; +import org.dromara.property.domain.vo.BigScreen.TodayMeetCountVo; +import org.dromara.property.domain.vo.BigScreen.TypeWorkOrderHistogramVo; +import org.dromara.property.service.IMeetBookingService; +import org.dromara.property.service.IServiceWorkOrdersService; +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; + +import java.util.List; + +/** + * @author yuyongle + * @version 1.0 + * @description: 大屏接口 + * @date 2025/9/9 9:57 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/screen") +public class ScreenController extends BaseController { + + private final IServiceWorkOrdersService serviceWorkOrdersService; + private final IMeetBookingService meetBookingService; + + /** + * 大屏工单柱状图 + */ + @GetMapping("/typeWorkOrderHistogram") + public R> typeWorkOrderHistogram() { + return R.ok(serviceWorkOrdersService.typeWorkOrderHistogram()); + } + /** + * 大屏会议室总数和当天预约数统计 + */ + @GetMapping("/todayMeetCount") + public R todayMeetCount() { + return R.ok(meetBookingService.todayMeetCount()); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CleanOrderRecordController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CleanOrderRecordController.java new file mode 100644 index 00000000..ecc2b0c8 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/CleanOrderRecordController.java @@ -0,0 +1,106 @@ +package org.dromara.property.controller; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.*; +import cn.dev33.satoken.annotation.SaCheckPermission; +import org.springframework.web.bind.annotation.*; +import org.springframework.validation.annotation.Validated; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.web.core.BaseController; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.core.domain.R; +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.CleanOrderRecordVo; +import org.dromara.property.domain.bo.CleanOrderRecordBo; +import org.dromara.property.service.ICleanOrderRecordService; +import org.dromara.common.mybatis.core.page.TableDataInfo; + +/** + * 保洁订单记录 + * 前端访问路由地址为:/property/orderRecord + * + * @author mocheng + * @date 2025-09-09 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/orderRecord") +public class CleanOrderRecordController extends BaseController { + + private final ICleanOrderRecordService cleanOrderRecordService; + + /** + * 查询保洁订单记录列表 + */ + @SaCheckPermission("property:orderRecord:list") + @GetMapping("/list") + public TableDataInfo list(CleanOrderRecordBo bo, PageQuery pageQuery) { + return cleanOrderRecordService.queryPageList(bo, pageQuery); + } + + /** + * 导出保洁订单记录列表 + */ + @SaCheckPermission("property:orderRecord:export") + @Log(title = "保洁订单记录", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(CleanOrderRecordBo bo, HttpServletResponse response) { + List list = cleanOrderRecordService.queryList(bo); + ExcelUtil.exportExcel(list, "保洁订单记录", CleanOrderRecordVo.class, response); + } + + /** + * 获取保洁订单记录详细信息 + * + * @param id 主键 + */ + @SaCheckPermission("property:orderRecord:query") + @GetMapping("/{id}") + public R getInfo(@NotNull(message = "主键不能为空") + @PathVariable("id") Long id) { + return R.ok(cleanOrderRecordService.queryById(id)); + } + + /** + * 新增保洁订单记录 + */ + @SaCheckPermission("property:orderRecord:add") + @Log(title = "保洁订单记录", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping() + public R add(@Validated(AddGroup.class) @RequestBody CleanOrderRecordBo bo) { + return toAjax(cleanOrderRecordService.insertByBo(bo)); + } + + /** + * 修改保洁订单记录 + */ + @SaCheckPermission("property:orderRecord:edit") + @Log(title = "保洁订单记录", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PutMapping() + public R edit(@Validated(EditGroup.class) @RequestBody CleanOrderRecordBo bo) { + return toAjax(cleanOrderRecordService.updateByBo(bo)); + } + + /** + * 删除保洁订单记录 + * + * @param ids 主键串 + */ + @SaCheckPermission("property:orderRecord:remove") + @Log(title = "保洁订单记录", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@NotEmpty(message = "主键不能为空") + @PathVariable("ids") Long[] ids) { + return toAjax(cleanOrderRecordService.deleteWithValidByIds(List.of(ids), true)); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/cleanOrder/CleanOrderController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/cleanOrder/CleanOrderController.java index 96ea5b21..f04ce659 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/cleanOrder/CleanOrderController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/cleanOrder/CleanOrderController.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.property.domain.bo.CleanOrderRecordBo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -90,6 +91,13 @@ public class CleanOrderController extends BaseController { public R edit(@Validated(EditGroup.class) @RequestBody CleanOrderBo bo) { return toAjax(cleanOrderService.updateByBo(bo)); } + /** + * 指派 + */ + @PostMapping("/assign") + public R assign(@Validated(EditGroup.class) @RequestBody CleanOrderBo bo) { + return toAjax(cleanOrderService.assign(bo)); + } /** * 删除保洁订单 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MCustomerActivityController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MCustomerActivityController.java new file mode 100644 index 00000000..4daa4c63 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MCustomerActivityController.java @@ -0,0 +1,36 @@ +package org.dromara.property.controller.mobile; + + +import cn.dev33.satoken.annotation.SaCheckPermission; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.property.domain.bo.CustomerActivityBo; +import org.dromara.property.domain.vo.CustomerActivityVo; +import org.dromara.property.service.ICustomerActivityService; +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/9 16:45 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/mobile/activity") +public class MCustomerActivityController { + private final ICustomerActivityService customerActivityService; + + /** + * 查询客户服务-活动列表 + */ + @GetMapping("/list") + public TableDataInfo list(CustomerActivityBo bo, PageQuery pageQuery) { + return customerActivityService.queryPageList(bo, pageQuery); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionTaskController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionTaskController.java index c54525cc..b0db0991 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionTaskController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MInspectionTaskController.java @@ -6,9 +6,12 @@ import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.property.domain.bo.InspectionTaskBo; +import org.dromara.property.domain.bo.ServiceWorkOrdersBo; import org.dromara.property.domain.vo.InspectionTaskVo; import org.dromara.property.domain.vo.mobile.MInspectionTaskVo; +import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import org.dromara.property.service.IInspectionTaskService; +import org.dromara.property.service.IServiceWorkOrdersService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -26,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/mobile/inspectionTask") public class MInspectionTaskController extends BaseController { private final IInspectionTaskService inspectionTaskService; + private final IServiceWorkOrdersService serviceWorkOrdersService; /** * 移动端查询巡检任务列表 @@ -34,4 +38,11 @@ public class MInspectionTaskController extends BaseController { public TableDataInfo list(InspectionTaskBo bo, PageQuery pageQuery) { return inspectionTaskService.mQueryPageList(bo, pageQuery); } + /** + * 小程序查询【工单处理】 + */ + @GetMapping("/mlist") + public TableDataInfo mlist(ServiceWorkOrdersBo bo, PageQuery pageQuery) { + return serviceWorkOrdersService.queryMobilePageList(bo, pageQuery); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MServiceWorkOrdersController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MServiceWorkOrdersController.java index 4e83e415..233763f5 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MServiceWorkOrdersController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/mobile/MServiceWorkOrdersController.java @@ -12,12 +12,16 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; import org.dromara.property.domain.bo.ServiceWorkOrdersBo; import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo; +import org.dromara.property.domain.vo.ServiceWorkOrdersTypeVo; import org.dromara.property.domain.vo.ServiceWorkOrdersVo; import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import org.dromara.property.service.IServiceWorkOrdersService; +import org.dromara.property.service.IServiceWorkOrdersTypeService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * 【业务管理-工单处理】 * @@ -31,6 +35,7 @@ import org.springframework.web.bind.annotation.*; public class MServiceWorkOrdersController extends BaseController { private final IServiceWorkOrdersService serviceWorkOrdersService; + private final IServiceWorkOrdersTypeService serviceWorkOrdersTypeService; /** * 小程序新增【工单处理】 @@ -56,4 +61,11 @@ public class MServiceWorkOrdersController extends BaseController { public R edit(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) { return toAjax(serviceWorkOrdersService.updateByBo(bo)); } + /** + * 查询【工单类型】树结构 + */ + @GetMapping("/typeTree") + public R> typeTrees() { + return R.ok(serviceWorkOrdersTypeService.typeTrees()); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/Clean.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/Clean.java index ffc324d2..48f199b1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/Clean.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/Clean.java @@ -37,6 +37,10 @@ public class Clean extends TenantEntity { * 计量单位 */ private String measure; + /** + * 保洁内容 + */ + private String cleanContent; /** * 保洁面积 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrderRecord.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrderRecord.java new file mode 100644 index 00000000..8002982c --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/CleanOrderRecord.java @@ -0,0 +1,73 @@ +package org.dromara.property.domain; + +import lombok.experimental.Accessors; +import org.dromara.common.tenant.core.TenantEntity; +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serial; + +/** + * 保洁订单记录对象 clean_order_record + * + * @author mocheng + * @date 2025-09-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Accessors(chain = true) +@TableName("clean_order_record") +public class CleanOrderRecord extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @TableId(value = "id") + private Long id; + + /** + * 保洁订单id + */ + private Long cleanOrderId; + + /** + * 状态(1创建订单,2已接单,3处理中4已完成) + */ + private String status; + + /** + * 是否签到(1未签到2签到) + */ + private String isSign; + + /** + * 签到图片 + */ + private String signImg; + + /** + * 处理人 + */ + private Long handler; + + /** + * 发起人 + */ + private Long initiatorPeople; + + /** + * 评价文本 + */ + private String serviceEvaluaText; + + /** + * 是否异常(1正常2异常) + */ + private String isAbnormal; + + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderRecordBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderRecordBo.java new file mode 100644 index 00000000..501c3e01 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/CleanOrderRecordBo.java @@ -0,0 +1,74 @@ +package org.dromara.property.domain.bo; + +import org.dromara.property.domain.CleanOrderRecord; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.core.validate.AddGroup; +import org.dromara.common.core.validate.EditGroup; +import io.github.linpeilie.annotations.AutoMapper; +import lombok.Data; +import lombok.EqualsAndHashCode; +import jakarta.validation.constraints.*; + +/** + * 保洁订单记录业务对象 clean_order_record + * + * @author mocheng + * @date 2025-09-09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = CleanOrderRecord.class, reverseConvertGenerate = false) +public class CleanOrderRecordBo extends BaseEntity { + + /** + * id + */ + + private Long id; + + /** + * 保洁订单id + */ + + private Long cleanOrderId; + + /** + * 状态(1创建订单,2已接单,3处理中4已完成) + */ + + private String status; + + /** + * 是否签到(1未签到2签到) + */ + + private String isSign; + + /** + * 签到图片 + */ + private String signImg; + + /** + * 处理人 + */ + + private Long handler; + + /** + * 发起人 + */ + private Long initiatorPeople; + + /** + * 评价文本 + */ + private String serviceEvaluaText; + + /** + * 是否异常(1正常2异常) + */ + private String isAbnormal; + + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanBo.java index ca4e407a..c50315f2 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanBo.java @@ -50,7 +50,11 @@ public class CleanBo extends BaseEntity { // * 保洁面积 // */ // private Long area; - + /** + * 保洁内容 + */ + @NotBlank(message = "保洁内容不能为空", groups = { AddGroup.class, EditGroup.class }) + private String cleanContent; /** * 计算方式 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanOrderBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanOrderBo.java index 3727d0d7..dfd8aae9 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanOrderBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/cleanOrderBo/CleanOrderBo.java @@ -13,6 +13,7 @@ import jakarta.validation.constraints.*; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.property.domain.bo.CleanOrderRecordBo; /** * 保洁订单业务对象 clean_order @@ -148,4 +149,7 @@ public class CleanOrderBo extends BaseEntity { private List cleanList; + private CleanOrderRecordBo cleanOrderRecord; + + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TodayMeetCountVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TodayMeetCountVo.java new file mode 100644 index 00000000..89f4b5a0 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TodayMeetCountVo.java @@ -0,0 +1,19 @@ +package org.dromara.property.domain.vo.BigScreen; + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Map; + +/** + * @author yuyongle + * @version 1.0 + * @description: 大屏类型会议室当天预约统计 + * @date 2025/9/9 10:17 + */ +@Data +@Accessors(chain = true) +public class TodayMeetCountVo { + private Integer meetCount; // 工单类型(如A, B, C, D) + private Integer timeQuantity; // 每个状态的数量 +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TypeWorkOrderHistogramVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TypeWorkOrderHistogramVo.java new file mode 100644 index 00000000..8568e993 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/BigScreen/TypeWorkOrderHistogramVo.java @@ -0,0 +1,20 @@ +package org.dromara.property.domain.vo.BigScreen; + + +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Map; + +/** + * @author yuyongle + * @version 1.0 + * @description: 大屏类型工单状态柱状图 + * @date 2025/9/9 10:17 + */ +@Data +@Accessors(chain = true) +public class TypeWorkOrderHistogramVo { + private String type; // 工单类型(如A, B, C, D) + private Map statusCounts; // 每个状态的数量 +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderRecordVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderRecordVo.java new file mode 100644 index 00000000..1d096104 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/CleanOrderRecordVo.java @@ -0,0 +1,96 @@ +package org.dromara.property.domain.vo; + +import org.dromara.property.domain.CleanOrderRecord; +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 java.io.Serial; +import java.io.Serializable; +import java.util.Date; + + + +/** + * 保洁订单记录视图对象 clean_order_record + * + * @author mocheng + * @date 2025-09-09 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = CleanOrderRecord.class) +public class CleanOrderRecordVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 保洁订单id + */ + @ExcelProperty(value = "保洁订单id") + private Long cleanOrderId; + /** + * 状态(1创建订单,2已接单,3处理中4已完成) + */ + @ExcelProperty(value = "状态(1创建订单,2已接单,3处理中4已完成)") + private String status; + + /** + * 是否签到(1未签到2签到) + */ + @ExcelProperty(value = "是否签到(1未签到2签到)") + private String isSign; + + /** + * 签到图片 + */ + @ExcelProperty(value = "签到图片") + private String signImg; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private Long handler; + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private String handlerText; + + /** + * 发起人 + */ + @ExcelProperty(value = "发起人") + private Long initiatorPeople; + + /** + * 发起人 + */ + @ExcelProperty(value = "发起人") + private String initiatorPeopleText; + + /** + * 评价文本 + */ + @ExcelProperty(value = "评价文本") + private String serviceEvaluaText; + + /** + * 是否异常(1正常2异常) + */ + @ExcelProperty(value = "是否异常(1正常2异常)") + private String isAbnormal; + + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanOrderVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanOrderVo.java index c9e1762b..d03d059b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanOrderVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanOrderVo.java @@ -6,7 +6,9 @@ import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.property.domain.CleanOrderRecord; import org.dromara.property.domain.CleanRelation; +import org.dromara.property.domain.vo.CleanOrderRecordVo; import java.io.Serial; import java.io.Serializable; @@ -153,6 +155,7 @@ public class CleanOrderVo implements Serializable { private List cleanList; private List relationList; + private List recordVoList; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanVo.java index ac360e89..5c327911 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/cleanOrderVo/CleanVo.java @@ -53,7 +53,10 @@ public class CleanVo implements Serializable { */ @ExcelProperty(value = "计算方式") private String method; - + /** + * 保洁内容 + */ + private String cleanContent; /** * 单价 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/CleanOrderRecordMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/CleanOrderRecordMapper.java new file mode 100644 index 00000000..04de5175 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/CleanOrderRecordMapper.java @@ -0,0 +1,15 @@ +package org.dromara.property.mapper; + +import org.dromara.property.domain.CleanOrderRecord; +import org.dromara.property.domain.vo.CleanOrderRecordVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; + +/** + * 保洁订单记录Mapper接口 + * + * @author mocheng + * @date 2025-09-09 + */ +public interface CleanOrderRecordMapper extends BaseMapperPlus { + +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICleanOrderRecordService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICleanOrderRecordService.java new file mode 100644 index 00000000..ee0f6329 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/ICleanOrderRecordService.java @@ -0,0 +1,69 @@ +package org.dromara.property.service; + +import org.dromara.property.domain.CleanOrderRecord; +import org.dromara.property.domain.vo.CleanOrderRecordVo; +import org.dromara.property.domain.bo.CleanOrderRecordBo; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; + +import java.util.Collection; +import java.util.List; + +/** + * 保洁订单记录Service接口 + * + * @author mocheng + * @date 2025-09-09 + */ +public interface ICleanOrderRecordService { + + /** + * 查询保洁订单记录 + * + * @param id 主键 + * @return 保洁订单记录 + */ + CleanOrderRecordVo queryById(Long id); + + /** + * 分页查询保洁订单记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 保洁订单记录分页列表 + */ + TableDataInfo queryPageList(CleanOrderRecordBo bo, PageQuery pageQuery); + + /** + * 查询符合条件的保洁订单记录列表 + * + * @param bo 查询条件 + * @return 保洁订单记录列表 + */ + List queryList(CleanOrderRecordBo bo); + + /** + * 新增保洁订单记录 + * + * @param bo 保洁订单记录 + * @return 是否新增成功 + */ + Boolean insertByBo(CleanOrderRecordBo bo); + + /** + * 修改保洁订单记录 + * + * @param bo 保洁订单记录 + * @return 是否修改成功 + */ + Boolean updateByBo(CleanOrderRecordBo bo); + + /** + * 校验并批量删除保洁订单记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IMeetBookingService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IMeetBookingService.java index 3b018da5..5cb439ee 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IMeetBookingService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IMeetBookingService.java @@ -1,6 +1,7 @@ package org.dromara.property.service; import org.dromara.property.domain.MeetBooking; +import org.dromara.property.domain.vo.BigScreen.TodayMeetCountVo; import org.dromara.property.domain.vo.MeetBookingAppointmentVo; import org.dromara.property.domain.vo.MeetBookingDetailVo; import org.dromara.property.domain.vo.MeetBookingVo; @@ -85,5 +86,11 @@ public interface IMeetBookingService { * @return */ List> getMeetBooking(String type); + //APP端接口 + /** + * + * @return + */ + TodayMeetCountVo todayMeetCount(); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java index ca0dcaf7..e7053b9a 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java @@ -5,6 +5,8 @@ import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.property.domain.bo.ServiceWorkOrdersBo; import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo; +import org.dromara.property.domain.vo.BigScreen.TodayMeetCountVo; +import org.dromara.property.domain.vo.BigScreen.TypeWorkOrderHistogramVo; import org.dromara.property.domain.vo.ServiceWorkOrderAnalysisVo; import org.dromara.property.domain.vo.ServiceWorkOrdersInfoVo; import org.dromara.property.domain.vo.ServiceWorkOrdersVo; @@ -74,16 +76,17 @@ public interface IServiceWorkOrdersService { /** * 工单服务看板 + * * @return */ ServiceWorkOrderAnalysisVo counts(); - //小程序端新增 /** * 新增工单 + * * @param bo * @return */ @@ -91,10 +94,12 @@ public interface IServiceWorkOrdersService { /** * 查询工单处理人枚举 + * * @param type * @return */ List> getServiceWorkOrdersHandler(String type); + /** * 分页查询【工单处理】列表 * @@ -119,4 +124,12 @@ public interface IServiceWorkOrdersService { * @return list */ List queryMyOrderByXcx(); + + //大屏接口 + + /** + * 大屏工单柱状图 + */ + List typeWorkOrderHistogram(); + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersTypeService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersTypeService.java index a578ced8..92b16f5a 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersTypeService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersTypeService.java @@ -71,4 +71,10 @@ public interface IServiceWorkOrdersTypeService { * @return 工单类型树结构 */ List typeTree(); + + /** + * 查询【工单类型】树结构 + * @return 工单类型树结构 + */ + List typeTrees(); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/cleanOrderService/ICleanOrderService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/cleanOrderService/ICleanOrderService.java index 6ca20505..20601470 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/cleanOrderService/ICleanOrderService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/cleanOrderService/ICleanOrderService.java @@ -1,5 +1,6 @@ package org.dromara.property.service.cleanOrderService; +import org.dromara.property.domain.bo.CleanOrderRecordBo; import org.dromara.property.domain.vo.cleanOrderVo.CleanOrderVo; import org.dromara.property.domain.bo.cleanOrderBo.CleanOrderBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -65,4 +66,11 @@ public interface ICleanOrderService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 指派保洁订单 + * @param bo + * @return + */ + int assign(CleanOrderBo bo); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderRecordServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderRecordServiceImpl.java new file mode 100644 index 00000000..c2e33a8d --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/CleanOrderRecordServiceImpl.java @@ -0,0 +1,138 @@ +package org.dromara.property.service.impl; + +import org.dromara.common.core.utils.MapstructUtils; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.mybatis.core.page.PageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +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.springframework.stereotype.Service; +import org.dromara.property.domain.bo.CleanOrderRecordBo; +import org.dromara.property.domain.vo.CleanOrderRecordVo; +import org.dromara.property.domain.CleanOrderRecord; +import org.dromara.property.mapper.CleanOrderRecordMapper; +import org.dromara.property.service.ICleanOrderRecordService; + +import java.util.List; +import java.util.Map; +import java.util.Collection; + +/** + * 保洁订单记录Service业务层处理 + * + * @author mocheng + * @date 2025-09-09 + */ +@Slf4j +@RequiredArgsConstructor +@Service +public class CleanOrderRecordServiceImpl implements ICleanOrderRecordService { + + private final CleanOrderRecordMapper baseMapper; + + /** + * 查询保洁订单记录 + * + * @param id 主键 + * @return 保洁订单记录 + */ + @Override + public CleanOrderRecordVo queryById(Long id){ + return baseMapper.selectVoById(id); + } + + /** + * 分页查询保洁订单记录列表 + * + * @param bo 查询条件 + * @param pageQuery 分页参数 + * @return 保洁订单记录分页列表 + */ + @Override + public TableDataInfo queryPageList(CleanOrderRecordBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + /** + * 查询符合条件的保洁订单记录列表 + * + * @param bo 查询条件 + * @return 保洁订单记录列表 + */ + @Override + public List queryList(CleanOrderRecordBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(CleanOrderRecordBo bo) { + Map params = bo.getParams(); + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.orderByAsc(CleanOrderRecord::getId); + lqw.eq(bo.getCleanOrderId() != null, CleanOrderRecord::getCleanOrderId, bo.getCleanOrderId()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CleanOrderRecord::getStatus, bo.getStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getIsSign()), CleanOrderRecord::getIsSign, bo.getIsSign()); + lqw.eq(StringUtils.isNotBlank(bo.getSignImg()), CleanOrderRecord::getSignImg, bo.getSignImg()); + lqw.eq(bo.getHandler() != null, CleanOrderRecord::getHandler, bo.getHandler()); + lqw.eq(bo.getInitiatorPeople() != null, CleanOrderRecord::getInitiatorPeople, bo.getInitiatorPeople()); + lqw.eq(StringUtils.isNotBlank(bo.getIsAbnormal()), CleanOrderRecord::getIsAbnormal, bo.getIsAbnormal()); + return lqw; + } + + /** + * 新增保洁订单记录 + * + * @param bo 保洁订单记录 + * @return 是否新增成功 + */ + @Override + public Boolean insertByBo(CleanOrderRecordBo bo) { + CleanOrderRecord add = MapstructUtils.convert(bo, CleanOrderRecord.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setId(add.getId()); + } + return flag; + } + + /** + * 修改保洁订单记录 + * + * @param bo 保洁订单记录 + * @return 是否修改成功 + */ + @Override + public Boolean updateByBo(CleanOrderRecordBo bo) { + CleanOrderRecord update = MapstructUtils.convert(bo, CleanOrderRecord.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + /** + * 保存前的数据校验 + */ + private void validEntityBeforeSave(CleanOrderRecord entity){ + //TODO 做一些数据校验,如唯一约束 + } + + /** + * 校验并批量删除保洁订单记录信息 + * + * @param ids 待删除的主键集合 + * @param isValid 是否进行有效性校验 + * @return 是否删除成功 + */ + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if(isValid){ + //TODO 做一些业务上的校验,判断是否需要校验 + } + return baseMapper.deleteByIds(ids) > 0; + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java index 40478219..d3db408c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/MeetBookingServiceImpl.java @@ -14,10 +14,12 @@ import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.property.domain.Meet; import org.dromara.property.domain.MeetAttachOrder; import org.dromara.property.domain.MeetBooking; import org.dromara.property.domain.bo.MeetBookingBo; import org.dromara.property.domain.vo.*; +import org.dromara.property.domain.vo.BigScreen.TodayMeetCountVo; import org.dromara.property.domain.vo.residentVo.ResidentPersonVo; import org.dromara.property.domain.vo.residentVo.ResidentUnitVo; import org.dromara.property.mapper.*; @@ -30,6 +32,7 @@ import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -69,7 +72,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService { //RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(meetBookingVo.getPerson())); ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(Long.valueOf(meetBookingVo.getPerson())); meetBookingDetailVo.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getUserName() : null); - meetBookingDetailVo.setPhone(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getPhone(): null); + meetBookingDetailVo.setPhone(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getPhone() : null); ResidentUnitVo residentUnitVo = residentUnitMapper.selectVoById(Long.valueOf(meetBookingVo.getUnit())); meetBookingDetailVo.setUnitName(ObjectUtil.isNotNull(residentUnitVo) ? residentUnitVo.getName() : null); return meetBookingDetailVo; @@ -87,26 +90,26 @@ public class MeetBookingServiceImpl implements IMeetBookingService { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); List meetBookingVoList = new ArrayList<>(); - if(CollUtil.isNotEmpty(result.getRecords())){ - List residentUnitVolist = residentUnitMapper.selectVoList(); - List userId = result.getRecords().stream().map(vo -> vo.getPerson()).distinct().map(Long::parseLong).collect(Collectors.toList()); - List remoteUserVos = residentPersonMapper.selectVoByIds(userId); - // List remoteUserVos = remoteUserService.selectListByIds(userId); + if (CollUtil.isNotEmpty(result.getRecords())) { + List residentUnitVolist = residentUnitMapper.selectVoList(); + List userId = result.getRecords().stream().map(vo -> vo.getPerson()).distinct().map(Long::parseLong).collect(Collectors.toList()); + List remoteUserVos = residentPersonMapper.selectVoByIds(userId); + // List remoteUserVos = remoteUserService.selectListByIds(userId); - result.getRecords().stream().forEach(s -> { - if (CollUtil.isNotEmpty(residentUnitVolist)) { - ResidentUnitVo residentUnitVo = residentUnitVolist.stream() - .filter(vo -> vo.getId() != null && String.valueOf(vo.getId()).equals(s.getUnit())).findFirst().orElse(null); - s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo) ? residentUnitVo.getName() : null); - } - if (CollUtil.isNotEmpty(remoteUserVos)) { - ResidentPersonVo residentPersonVo = remoteUserVos.stream() - .filter(vo -> vo.getUserId() != null && String.valueOf(vo.getUserId()).equals(s.getPerson())).findFirst().orElse(null); - s.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getUserName() : null); - s.setPhone(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getPhone() : null); - } - meetBookingVoList.add(s); - }); + result.getRecords().stream().forEach(s -> { + if (CollUtil.isNotEmpty(residentUnitVolist)) { + ResidentUnitVo residentUnitVo = residentUnitVolist.stream() + .filter(vo -> vo.getId() != null && String.valueOf(vo.getId()).equals(s.getUnit())).findFirst().orElse(null); + s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo) ? residentUnitVo.getName() : null); + } + if (CollUtil.isNotEmpty(remoteUserVos)) { + ResidentPersonVo residentPersonVo = remoteUserVos.stream() + .filter(vo -> vo.getUserId() != null && String.valueOf(vo.getUserId()).equals(s.getPerson())).findFirst().orElse(null); + s.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getUserName() : null); + s.setPhone(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getPhone() : null); + } + meetBookingVoList.add(s); + }); } return TableDataInfo.build(new Page().setRecords(meetBookingVoList).setTotal(result.getTotal())); } @@ -124,7 +127,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService { LocalDateTime startOfDay = date.atStartOfDay(); LocalDateTime endOfDay = date.atTime(LocalTime.MAX); meetBookingLambdaQueryWrapper - .eq(MeetBooking::getState,2) + .eq(MeetBooking::getState, 2) .le(MeetBooking::getScheduledStarttime, endOfDay) .ge(MeetBooking::getScheduledEndtime, startOfDay); List meetBookings = baseMapper.selectList(meetBookingLambdaQueryWrapper); @@ -135,14 +138,14 @@ public class MeetBookingServiceImpl implements IMeetBookingService { SimpleDateFormat df = new SimpleDateFormat("HH"); List residentUnitVolist = residentUnitMapper.selectVoList(); List userId = meetBookingAppointmentVoList.stream().map(vo -> vo.getPerson()).distinct().map(Long::parseLong).collect(Collectors.toList()); - // List remoteUserVos = remoteUserService.selectListByIds(userId); + // List remoteUserVos = remoteUserService.selectListByIds(userId); List remoteUserVos = residentPersonMapper.selectVoByIds(userId); meetBookingAppointmentVoList.stream().forEach( s -> { if (CollUtil.isNotEmpty(residentUnitVolist)) { ResidentUnitVo residentUnitVo = residentUnitVolist.stream() .filter(vo -> vo.getId() != null && String.valueOf(vo.getId()).equals(s.getUnit())).findFirst().orElse(null); - s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo) ?residentUnitVo.getName():null); + s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo) ? residentUnitVo.getName() : null); } if (CollUtil.isNotEmpty(remoteUserVos)) { ResidentPersonVo residentPersonVo = remoteUserVos.stream() @@ -184,7 +187,7 @@ public class MeetBookingServiceImpl implements IMeetBookingService { // 构建查询条件 LambdaQueryWrapper bookingLambdaQueryWrapper = new LambdaQueryWrapper<>(); bookingLambdaQueryWrapper.eq(MeetBooking::getMeetId, meetId) - .eq(MeetBooking::getState,2) + .eq(MeetBooking::getState, 2) .ge(MeetBooking::getScheduledStarttime, startOfWeek) .le(MeetBooking::getScheduledEndtime, endOfWeek); List meetBookingVoList = baseMapper.selectVoList(bookingLambdaQueryWrapper); @@ -197,13 +200,13 @@ public class MeetBookingServiceImpl implements IMeetBookingService { SimpleDateFormat df = new SimpleDateFormat("HH"); List residentUnitVolist = residentUnitMapper.selectVoList(); List userId = meetBookingWeekVoList.stream().map(vo -> vo.getPerson()).distinct().map(Long::parseLong).collect(Collectors.toList()); - // List remoteUserVos = remoteUserService.selectListByIds(userId); + // List remoteUserVos = remoteUserService.selectListByIds(userId); List remoteUserVos = residentPersonMapper.selectVoByIds(userId); meetBookingWeekVoList.stream().forEach(s -> { if (CollUtil.isNotEmpty(residentUnitVolist)) { ResidentUnitVo residentUnitVo = residentUnitVolist.stream() .filter(vo -> vo.getId() != null && String.valueOf(vo.getId()).equals(s.getUnit())).findFirst().orElse(null); - s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo)? residentUnitVo.getName():null); + s.setUnitName(ObjectUtil.isNotEmpty(residentUnitVo) ? residentUnitVo.getName() : null); } if (CollUtil.isNotEmpty(remoteUserVos)) { ResidentPersonVo residentPersonVo = remoteUserVos.stream() @@ -322,9 +325,29 @@ public class MeetBookingServiceImpl implements IMeetBookingService { }; } + public List getList() { LambdaQueryWrapper meetQueryWrapper = new LambdaQueryWrapper<>(); return baseMapper.selectList(meetQueryWrapper); } + + @Override + public TodayMeetCountVo todayMeetCount() { + Long meetCount = meetMapper.selectCount(null); + // 获取今日开始和结束时间 + LocalDate today = LocalDate.now(); + + // 查询今日预约 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper + .le(MeetBooking::getScheduledStarttime, today) + .ge(MeetBooking::getScheduledEndtime, today); + List todayBookings = baseMapper.selectList(queryWrapper); + TodayMeetCountVo todayMeetCountVo = new TodayMeetCountVo(); + todayMeetCountVo.setTimeQuantity(todayBookings.size()); + todayMeetCountVo.setMeetCount(Integer.valueOf(Math.toIntExact(meetCount))); + return todayMeetCountVo; + } + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java index e54e1b34..c1d12144 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java @@ -27,6 +27,8 @@ 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.BigScreen.TodayMeetCountVo; +import org.dromara.property.domain.vo.BigScreen.TypeWorkOrderHistogramVo; import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersRecordVo; import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import org.dromara.property.mapper.ResidentPersonMapper; @@ -762,4 +764,89 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { return baseMapper.selectVoList(qw); } + //大屏接口 + + /** + * 大屏工单柱状图 + */ + @Override + public List typeWorkOrderHistogram() { + // 查询工单类型 + List typeVoList = serviceWorkOrdersTypeService.typeTree(); + + // 递归收集工单类型ID并查询工单数量按状态区分 + List result = new ArrayList<>(); + for (ServiceWorkOrdersTypeVo typeVo : typeVoList) { + Map statusCounts = getStatusCounts(typeVo); + result.add(new TypeWorkOrderHistogramVo() + .setType(typeVo.getOrderTypeName()) + .setStatusCounts(statusCounts)); + } + return result; + } + + + private Map getStatusCounts(ServiceWorkOrdersTypeVo typeVo) { + List allTypeIds = getAllTypeIds(typeVo); + List workOrders = getWorkOrdersByTypeIds(allTypeIds); + + Map statusCounts = new HashMap<>(); + int pendingCount = 0; + int dispatchCount = 0; + int processingCount = 0; + int completedCount = 0; + + for (ServiceWorkOrders order : workOrders) { + String status = order.getStatus(); + switch (status) { + case "0": // 待派单 + pendingCount++; + break; + case "1": // 已派单 + case "2": + dispatchCount++; + break; + case "3": // 处理中 + processingCount++; + case "4": // 已关闭 + completedCount++; + break; + default: + // 处理其他状态或记录日志 + break; + } + } + + statusCounts.put(WorkOrderStatusEnum.CREATE_ORDER.getName(), pendingCount); + statusCounts.put(WorkOrderStatusEnum.DISPATCHED.getName(), dispatchCount); + statusCounts.put(WorkOrderStatusEnum.IN_HAND.getName(), processingCount); + statusCounts.put(WorkOrderStatusEnum.DONE.getName(), completedCount); + statusCounts.put("已完成", completedCount); + + return statusCounts; + } + + + private List getAllTypeIds(ServiceWorkOrdersTypeVo typeVo) { + List typeIds = new ArrayList<>(); + collectTypeIds(typeVo, typeIds); + return typeIds; + } + + private void collectTypeIds(ServiceWorkOrdersTypeVo typeVo, List typeIds) { + typeIds.add(typeVo.getId()); + if (typeVo.getChildren() != null) { + for (ServiceWorkOrdersTypeVo child : typeVo.getChildren()) { + collectTypeIds(child, typeIds); + } + } + } + + private List getWorkOrdersByTypeIds(List typeIds) { + // 假设这里有一个方法可以从数据库或其他数据源获取工单列表 + return baseMapper.selectList( + new LambdaQueryWrapper() + .in(ServiceWorkOrders::getType, typeIds) + ); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java index 0e487feb..f425144e 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersTypeServiceImpl.java @@ -203,4 +203,16 @@ public class ServiceWorkOrdersTypeServiceImpl implements IServiceWorkOrdersTypeS } return tree; } + + //APP端 + /** + * 查询【工单类型】树结构 + * + * @return 工单类型树结构 + */ + @Override + public List typeTrees() { + List list = baseMapper.selectVoList(); + return buildTree(list, null); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java index 2a03af34..c9443b09 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java @@ -1,24 +1,35 @@ package org.dromara.property.service.impl.cleanOrderImpl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; 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.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.property.domain.*; +import org.dromara.property.domain.bo.CleanOrderRecordBo; import org.dromara.property.domain.bo.cleanOrderBo.CleanOrderBo; +import org.dromara.property.domain.enums.WorkOrderStatusEnum; +import org.dromara.property.domain.vo.CleanOrderRecordVo; import org.dromara.property.domain.vo.cleanOrderVo.CleanOrderVo; +import org.dromara.property.mapper.CleanOrderRecordMapper; import org.dromara.property.mapper.TbRoomMapper; import org.dromara.property.mapper.cleanOrderMapper.CleanMapper; import org.dromara.property.mapper.cleanOrderMapper.CleanOrderMapper; import org.dromara.property.mapper.cleanOrderMapper.CleanRelationMapper; import org.dromara.property.mapper.cleanOrderMapper.CleanserverOrderMapper; import org.dromara.property.service.cleanOrderService.ICleanOrderService; +import org.dromara.system.api.RemoteUserService; +import org.dromara.system.api.domain.vo.RemoteUserVo; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +39,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.springframework.beans.BeanUtils.copyProperties; + /** * 保洁订单Service业务层处理 * @@ -40,12 +53,15 @@ import java.util.stream.Collectors; public class CleanOrderServiceImpl implements ICleanOrderService { private final CleanOrderMapper baseMapper; + private final CleanOrderRecordMapper cleanOrderRecordMapper; private final CleanserverOrderMapper cleanserverOrderMapper; private final CleanMapper cleanMapper; private final CleanRelationMapper cleanRelationMapper; private final TbRoomMapper roomMapper; + @DubboReference + private RemoteUserService remoteUserService; //NOTUNBOOKING:未退订 BOOKING:已退订 private final Integer NOTUNBOOKING = 0; @@ -79,6 +95,25 @@ public class CleanOrderServiceImpl implements ICleanOrderService { CleanOrderVo cleanOrderVo = MapstructUtils.convert(cleanOrder, CleanOrderVo.class); cleanOrderVo.setCleanList(cleanList); cleanOrderVo.setRelationList(cleanRelationList); + //查询订单记录 + List cleanOrderRecordVos = cleanOrderRecordMapper.selectVoList(Wrappers.lambdaQuery().eq(CleanOrderRecord::getCleanOrderId, id)); + if(CollUtil.isNotEmpty(cleanOrderRecordVos)){ + cleanOrderRecordVos.stream().forEach(item -> { + //查询指派人名称 + if(ObjectUtil.isNotEmpty(item.getHandler())){ + RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getHandler()); + item.setHandlerText(userInfo.getNickName()); + } + //查询发起人名称 + if(ObjectUtil.isNotEmpty(item.getInitiatorPeople())){ + RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getInitiatorPeople()); + item.setInitiatorPeopleText(userInfo.getNickName()); + } + + }); + cleanOrderVo.setRecordVoList(cleanOrderRecordVos); + } + return cleanOrderVo; } @@ -156,12 +191,15 @@ public class CleanOrderServiceImpl implements ICleanOrderService { //1.向clean_order表中插入数据 // CleanOrder add = MapstructUtils.convert(bo, CleanOrder.class); CleanOrder add = new CleanOrder(); - validEntityBeforeSave(add); - BeanUtils.copyProperties(bo, add); + copyProperties(bo, add); add.setStarTime(bo.getStarTime()); add.setEndTime(bo.getEndTime()); add.setIsUnbooking(NOTUNBOOKING); boolean flag = baseMapper.insert(add) > 0; + if (flag){ + bo.setId(add.getId()); + validEntityBeforeSave(bo); + } //取出clean_order表中的所有clean数据 List cleanList = bo.getCleanList(); @@ -206,19 +244,31 @@ public class CleanOrderServiceImpl implements ICleanOrderService { * @return 是否修改成功 */ @Override + @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(CleanOrderBo bo) { CleanOrder update = MapstructUtils.convert(bo, CleanOrder.class); - validEntityBeforeSave(update); + // validEntityBeforeSave(update); update.setStarTime(bo.getStarTime()); update.setEndTime(bo.getStarTime()); return baseMapper.updateById(update) > 0; } /** - * 保存前的数据校验 + * 保存后的数据校验 */ - private void validEntityBeforeSave(CleanOrder entity) { + private void validEntityBeforeSave(CleanOrderBo bo) { + //当前登录用户 + Long userId = LoginHelper.getUserId(); //TODO 做一些数据校验,如唯一约束 + cleanOrderRecordMapper.insert( + new CleanOrderRecord() + .setCleanOrderId(bo.getId()) + .setStatus("1") + .setIsSign("1") + .setInitiatorPeople(userId) + .setServiceEvaluaText(bo.getServiceEvaluaText()) + .setIsAbnormal("1") + ); } /** @@ -236,4 +286,16 @@ public class CleanOrderServiceImpl implements ICleanOrderService { //todo:应该删除中间表中的数据 return baseMapper.deleteByIds(ids) > 0; } + /** + * 指派保洁订单 + * @param bo + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public int assign(CleanOrderBo bo) { + CleanOrderRecord cleanOrderRecord= BeanUtil.copyProperties(bo.getCleanOrderRecord(), CleanOrderRecord.class); + cleanOrderRecord.setStatus("2"); + return cleanOrderRecordMapper.insert(cleanOrderRecord); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentUnitServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentUnitServiceImpl.java index f2a2e460..dc8453e3 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentUnitServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentUnitServiceImpl.java @@ -62,7 +62,7 @@ public class ResidentUnitServiceImpl implements IResidentUnitService { public ResidentUnitVo queryById(Long id){ ResidentUnitVo residentUnitVo = baseMapper.selectVoById(id); //获取入驻位置详情 - if(StringUtils.isNotBlank(residentUnitVo.getLocation())){ + if(ObjectUtil.isNotEmpty(residentUnitVo)){ // 修改后的代码 List idList = Arrays.stream(residentUnitVo.getLocation().split(",")) .map(String::trim) @@ -75,9 +75,9 @@ public class ResidentUnitServiceImpl implements IResidentUnitService { String locationDetail = String.join(",", roomNames); residentUnitVo.setLocationDetail(locationDetail); } + Long num = personService.queryPersonCount(residentUnitVo.getId()); + residentUnitVo.setNumber(num); } - Long num = personService.queryPersonCount(residentUnitVo.getId()); - residentUnitVo.setNumber(num); return residentUnitVo; } diff --git a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java index c7daa07d..66ac58be 100644 --- a/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java +++ b/ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/controller/GenController.java @@ -39,7 +39,7 @@ public class GenController extends BaseController { /** * 查询代码生成列表 */ - @SaCheckPermission("tool:gen:list") + //@SaCheckPermission("tool:gen:list") @GetMapping("/list") public TableDataInfo genList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageGenTableList(genTable, pageQuery); @@ -50,7 +50,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:query") + //@SaCheckPermission("tool:gen:query") @GetMapping(value = "/{tableId}") public R> getInfo(@PathVariable Long tableId) { GenTable table = genTableService.selectGenTableById(tableId); @@ -66,7 +66,7 @@ public class GenController extends BaseController { /** * 查询数据库列表 */ - @SaCheckPermission("tool:gen:list") + //@SaCheckPermission("tool:gen:list") @GetMapping("/db/list") public TableDataInfo dataList(GenTable genTable, PageQuery pageQuery) { return genTableService.selectPageDbTableList(genTable, pageQuery); @@ -77,7 +77,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:list") + //@SaCheckPermission("tool:gen:list") @GetMapping(value = "/column/{tableId}") public TableDataInfo columnList(@PathVariable("tableId") Long tableId) { TableDataInfo dataInfo = new TableDataInfo<>(); @@ -92,7 +92,7 @@ public class GenController extends BaseController { * * @param tables 表名串 */ - @SaCheckPermission("tool:gen:import") + //@SaCheckPermission("tool:gen:import") @Log(title = "代码生成", businessType = BusinessType.IMPORT) @PostMapping("/importTable") public R importTableSave(String tables, String dataName) { @@ -106,7 +106,7 @@ public class GenController extends BaseController { /** * 修改保存代码生成业务 */ - @SaCheckPermission("tool:gen:edit") + //@SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @PutMapping public R editSave(@Validated @RequestBody GenTable genTable) { @@ -120,7 +120,7 @@ public class GenController extends BaseController { * * @param tableIds 表ID串 */ - @SaCheckPermission("tool:gen:remove") + //@SaCheckPermission("tool:gen:remove") @Log(title = "代码生成", businessType = BusinessType.DELETE) @DeleteMapping("/{tableIds}") public R remove(@PathVariable Long[] tableIds) { @@ -133,7 +133,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:preview") + //@SaCheckPermission("tool:gen:preview") @GetMapping("/preview/{tableId}") public R> preview(@PathVariable("tableId") Long tableId) throws IOException { Map dataMap = genTableService.previewCode(tableId); @@ -145,7 +145,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:code") + //@SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/download/{tableId}") public void download(HttpServletResponse response, @PathVariable("tableId") Long tableId) throws IOException { @@ -158,7 +158,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:code") + //@SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/genCode/{tableId}") public R genCode(@PathVariable("tableId") Long tableId) { @@ -171,7 +171,7 @@ public class GenController extends BaseController { * * @param tableId 表ID */ - @SaCheckPermission("tool:gen:edit") + //@SaCheckPermission("tool:gen:edit") @Log(title = "代码生成", businessType = BusinessType.UPDATE) @GetMapping("/synchDb/{tableId}") public R synchDb(@PathVariable("tableId") Long tableId) { @@ -184,7 +184,7 @@ public class GenController extends BaseController { * * @param tableIdStr 表ID串 */ - @SaCheckPermission("tool:gen:code") + //@SaCheckPermission("tool:gen:code") @Log(title = "代码生成", businessType = BusinessType.GENCODE) @GetMapping("/batchGenCode") public void batchGenCode(HttpServletResponse response, String tableIdStr) throws IOException { @@ -209,7 +209,7 @@ public class GenController extends BaseController { /** * 查询数据源名称列表 */ - @SaCheckPermission("tool:gen:list") + //@SaCheckPermission("tool:gen:list") @GetMapping(value = "/getDataNames") public R getCurrentDataSourceNameList(){ return R.ok(DataBaseHelper.getDataSourceNameList()); From 1cc77bdedcf715e3d0cae41651d0467c0484d219 Mon Sep 17 00:00:00 2001 From: yuyongle <1150359267@qq.com> Date: Tue, 9 Sep 2025 18:15:40 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=9D=E6=B4=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cleanOrderImpl/CleanOrderServiceImpl.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java index c9443b09..884f6dba 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/cleanOrderImpl/CleanOrderServiceImpl.java @@ -95,24 +95,24 @@ public class CleanOrderServiceImpl implements ICleanOrderService { CleanOrderVo cleanOrderVo = MapstructUtils.convert(cleanOrder, CleanOrderVo.class); cleanOrderVo.setCleanList(cleanList); cleanOrderVo.setRelationList(cleanRelationList); - //查询订单记录 - List cleanOrderRecordVos = cleanOrderRecordMapper.selectVoList(Wrappers.lambdaQuery().eq(CleanOrderRecord::getCleanOrderId, id)); - if(CollUtil.isNotEmpty(cleanOrderRecordVos)){ - cleanOrderRecordVos.stream().forEach(item -> { - //查询指派人名称 - if(ObjectUtil.isNotEmpty(item.getHandler())){ - RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getHandler()); - item.setHandlerText(userInfo.getNickName()); - } - //查询发起人名称 - if(ObjectUtil.isNotEmpty(item.getInitiatorPeople())){ - RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getInitiatorPeople()); - item.setInitiatorPeopleText(userInfo.getNickName()); - } - - }); - cleanOrderVo.setRecordVoList(cleanOrderRecordVos); - } +// //查询订单记录 +// List cleanOrderRecordVos = cleanOrderRecordMapper.selectVoList(Wrappers.lambdaQuery().eq(CleanOrderRecord::getCleanOrderId, id)); +// if(CollUtil.isNotEmpty(cleanOrderRecordVos)){ +// cleanOrderRecordVos.stream().forEach(item -> { +// //查询指派人名称 +// if(ObjectUtil.isNotEmpty(item.getHandler())){ +// RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getHandler()); +// item.setHandlerText(userInfo.getNickName()); +// } +// //查询发起人名称 +// if(ObjectUtil.isNotEmpty(item.getInitiatorPeople())){ +// RemoteUserVo userInfo = remoteUserService.getUserInfoById(item.getInitiatorPeople()); +// item.setInitiatorPeopleText(userInfo.getNickName()); +// } +// +// }); +// cleanOrderVo.setRecordVoList(cleanOrderRecordVos); +// } return cleanOrderVo; @@ -198,7 +198,7 @@ public class CleanOrderServiceImpl implements ICleanOrderService { boolean flag = baseMapper.insert(add) > 0; if (flag){ bo.setId(add.getId()); - validEntityBeforeSave(bo); + // validEntityBeforeSave(bo); } //取出clean_order表中的所有clean数据 From f91333de3a11730f43c10d18b61887d7c2acd137 Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Tue, 9 Sep 2025 18:16:53 +0800 Subject: [PATCH 3/4] =?UTF-8?q?-=20=E4=BB=AA=E8=A1=A8=E3=80=81=E9=97=A8?= =?UTF-8?q?=E7=A6=81=E3=80=81=E6=91=84=E5=83=8F=E5=A4=B4=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=20-=20=E4=BB=AA=E8=A1=A8=E5=B1=82=E7=BA=A7?= =?UTF-8?q?=E6=A0=91=E6=98=BE=E7=A4=BA=E6=AF=8F=E5=B1=82=E4=BB=AA=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=20-=20=E4=BB=AA=E8=A1=A8=E6=A6=82=E5=86=B5=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=8E=92=E5=BA=8F=20-=20=E5=B0=8F=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E7=AB=AF=E6=8E=A5=E5=8F=A3=E6=9B=B4=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/SaPermissionImpl.java | 1 + .../TbMeterInfoController.java | 25 ++++++++ .../xcx/XServiceWorkOrdersController.java | 10 +++ .../controller/xcx/XSystemController.java | 41 ++++++++++++ .../domain/vo/ServiceWorkOrdersRecordVo.java | 4 ++ .../IServiceWorkOrdersRecordService.java | 22 +++++++ .../service/IServiceWorkOrdersService.java | 12 +++- .../impl/ServiceWorkOrdersRecordImpl.java | 39 +++++++++++ .../impl/ServiceWorkOrdersServiceImpl.java | 54 +++++++++++++++- .../TbMeterInfoServiceImpl.java | 64 +++++++++++++++++-- .../TbMeterRecordServiceImpl.java | 11 ++++ ...sitorController.java => E8Controller.java} | 27 +++++++- .../controller/SisDeviceManageController.java | 16 ++++- .../sis/domain/vo/SisDeviceManageVo.java | 5 ++ .../door/res/AuthDoorDeviceFindRes.java | 5 ++ 15 files changed, 323 insertions(+), 13 deletions(-) create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XSystemController.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersRecordService.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersRecordImpl.java rename ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/{SisVisitorController.java => E8Controller.java} (77%) diff --git a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java index 4d169a21..1e212643 100644 --- a/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java +++ b/ruoyi-common/ruoyi-common-satoken/src/main/java/org/dromara/common/satoken/core/service/SaPermissionImpl.java @@ -54,6 +54,7 @@ public class SaPermissionImpl implements StpInterface { "xcx:unit:query", // 工单管理 "xcx:workOrders:add", + "xcx:workOrders:edit", "xcx:workOrders:query", // 工单类型管理 "xcx:workOrdersType:query", diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/smartDevicesController/TbMeterInfoController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/smartDevicesController/TbMeterInfoController.java index 716e3bfa..14de09d4 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/smartDevicesController/TbMeterInfoController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/smartDevicesController/TbMeterInfoController.java @@ -1,6 +1,8 @@ package org.dromara.property.controller.smartDevicesController; +import java.util.HashMap; import java.util.List; +import java.util.Map; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; @@ -131,4 +133,27 @@ public class TbMeterInfoController extends BaseController { return R.ok(); } + /** + * 获取水/电/表状态统计 + * + * @return map + */ + @GetMapping("/statusCount") + public R> getMeterStatus() { + List voList = tbMeterInfoService.queryList(new TbMeterInfoBo()); + Map map = new HashMap<>(); + + Map powerMeter = new HashMap<>(); + powerMeter.put("on", voList.stream().filter(o -> o.getMeterType() == 1 && o.getCommunicationState() == 1).count()); + powerMeter.put("off", voList.stream().filter(o -> o.getMeterType() == 1 && o.getCommunicationState() == 0).count()); + + Map waterMeter = new HashMap<>(); + waterMeter.put("on", voList.stream().filter(o -> o.getMeterType() == 2 && o.getCommunicationState() == 1).count()); + waterMeter.put("off", voList.stream().filter(o -> o.getMeterType() == 2 && o.getCommunicationState() == 0).count()); + + map.put("water", waterMeter); + map.put("power", powerMeter); + return R.ok(map); + } + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersController.java index b6e41568..e372351d 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersController.java @@ -39,6 +39,16 @@ public class XServiceWorkOrdersController extends BaseController { return toAjax(serviceWorkOrdersService.insertOrderByXcx(bo)); } + /** + * 小程序新增【工单处理】 + */ + @PutMapping() + @SaCheckPermission("xcx:workOrders:edit") + @Log(title = "【小程序新增工单处理】", businessType = BusinessType.UPDATE) + public R edit(@Validated(AddGroup.class) @RequestBody ServiceWorkOrdersBo bo) { + return toAjax(serviceWorkOrdersService.updateOrderByXcx(bo)); + } + /** * 小程序查询【工单处理】 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XSystemController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XSystemController.java new file mode 100644 index 00000000..86c45e66 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XSystemController.java @@ -0,0 +1,41 @@ +package org.dromara.property.controller.xcx; + +import cn.hutool.core.util.ObjectUtil; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.common.core.domain.R; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author lsm + * @apiNote XSystemController + * @since 2025/9/9 + */ +@RestController +@RequestMapping("/xcx/system") +public class XSystemController { + + @DubboReference + private RemoteDictService RemoteDictDataVo; + + /** + * 根据字典类型查询字典数据信息 + * + * @param dictType 字典类型 + */ + @GetMapping(value = "/type/{dictType}") + public R> dictType(@PathVariable String dictType) { + List data = RemoteDictDataVo.selectDictDataByType(dictType); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(data); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java index 8471f476..5e6818f1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersRecordVo.java @@ -58,5 +58,9 @@ public class ServiceWorkOrdersRecordVo implements Serializable { @ExcelProperty(value = "创建时间") private Date createTime; + /** + * 处理人名称 + */ + private String handleName; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersRecordService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersRecordService.java new file mode 100644 index 00000000..08bfae25 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersRecordService.java @@ -0,0 +1,22 @@ +package org.dromara.property.service; + +import org.dromara.property.domain.vo.ServiceWorkOrdersRecordVo; + +import java.util.Collection; +import java.util.List; + +/** + * @author lsm + * @apiNote IServiceWorkOrdersRecordService + * @since 2025/9/9 + */ +public interface IServiceWorkOrdersRecordService { + + /** + * 通过工单id查询记录 + * + * @param ids 工单id + * @return list + */ + List queryListByOrderId(Collection ids); +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java index ca0dcaf7..b8f74e69 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IServiceWorkOrdersService.java @@ -74,16 +74,17 @@ public interface IServiceWorkOrdersService { /** * 工单服务看板 + * * @return */ ServiceWorkOrderAnalysisVo counts(); - //小程序端新增 /** * 新增工单 + * * @param bo * @return */ @@ -91,10 +92,12 @@ public interface IServiceWorkOrdersService { /** * 查询工单处理人枚举 + * * @param type * @return */ List> getServiceWorkOrdersHandler(String type); + /** * 分页查询【工单处理】列表 * @@ -112,6 +115,13 @@ public interface IServiceWorkOrdersService { */ Boolean insertOrderByXcx(ServiceWorkOrdersBo bo); + /** + * xcx更新工单详情 + * + * @param bo bean + * @return Boolean + */ + Boolean updateOrderByXcx(ServiceWorkOrdersBo bo); /** * xcx查询本人上报工单 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersRecordImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersRecordImpl.java new file mode 100644 index 00000000..a4558278 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersRecordImpl.java @@ -0,0 +1,39 @@ +package org.dromara.property.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.property.domain.ServiceWorkOrdersRecord; +import org.dromara.property.domain.vo.ServiceWorkOrdersRecordVo; +import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper; +import org.dromara.property.service.IServiceWorkOrdersRecordService; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * @author lsm + * @apiNote ServiceWorkOrdersRecordImpl + * @since 2025/9/9 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ServiceWorkOrdersRecordImpl implements IServiceWorkOrdersRecordService { + + private final ServiceWorkOrdersRecordMapper baseMapper; + + /** + * 通过工单id查询记录 + * + * @param ids 工单id + * @return list + */ + @Override + public List queryListByOrderId(Collection ids) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(ServiceWorkOrdersRecord::getOrderId, ids); + return baseMapper.selectVoList(lqw); + } +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java index e54e1b34..b5d81de8 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java @@ -22,6 +22,8 @@ import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.property.api.model.LoginResidentPerson; import org.dromara.property.domain.*; import org.dromara.property.domain.bo.ServiceWorkOrdersBo; +import org.dromara.property.domain.bo.ServiceWorkOrdersRecordBo; +import org.dromara.property.domain.bo.ServiceWorkOrdersTypeBo; import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo; import org.dromara.property.domain.enums.OrderReportingTypeEnum; import org.dromara.property.domain.enums.OrderTypeOperationEnum; @@ -34,6 +36,7 @@ import org.dromara.property.mapper.ServiceWorkOrdersMapper; import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper; import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper; import org.dromara.property.mapper.attendanceMapper.AttendanceUserGroupMapper; +import org.dromara.property.service.IServiceWorkOrdersRecordService; import org.dromara.property.service.IServiceWorkOrdersService; import org.dromara.property.service.IServiceWorkOrdersTypeService; import org.dromara.system.api.RemoteUserService; @@ -68,6 +71,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { /******************************xcx**************************************/ private final IServiceWorkOrdersTypeService serviceWorkOrdersTypeService; + private final IServiceWorkOrdersRecordService serviceWorkOrdersRecordService; /** @@ -719,6 +723,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { Assert.notNull(typeVo, "工单类型不存在"); assert add != null; + add.setOrderName("工单名称"); add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr()); add.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue()); add.setReportingType(OrderReportingTypeEnum.PHONE_REPORT.getValue()); @@ -745,6 +750,23 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { return flag; } + /** + * xcx更新工单详情 + * + * @param bo bean + * @return Boolean + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateOrderByXcx(ServiceWorkOrdersBo bo) { + ServiceWorkOrders update = MapstructUtils.convert(bo, ServiceWorkOrders.class); + Assert.notNull(update, "数据处理失败"); + + boolean flag = baseMapper.updateById(update) > 0; + Assert.isTrue(flag, "小程序修改工单信息失败"); + return flag; + } + /** * xcx查询本人上报工单 * @@ -759,7 +781,37 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { assert person != null; qw.like(ServiceWorkOrders::getInitiatorPeople, person.getNickname()) .orderByDesc(ServiceWorkOrders::getCreateTime); - return baseMapper.selectVoList(qw); + List ordersVos = baseMapper.selectVoList(qw); + if (CollUtil.isNotEmpty(ordersVos)) { + // 工单类型 + List typeVoLists = serviceWorkOrdersTypeService.queryList(new ServiceWorkOrdersTypeBo()); + + // 处理人 + List handlerIdList = ordersVos.stream().map(ServiceWorkOrdersVo::getHandler).distinct().toList(); + List remoteUserVos = remoteUserService.selectListByIds(handlerIdList); + + // 工单记录 + Collection orderIdList = ordersVos.stream().map(ServiceWorkOrdersVo::getId).toList(); + List recordVos = serviceWorkOrdersRecordService.queryListByOrderId(orderIdList); + + for (ServiceWorkOrdersVo item : ordersVos) { + // 工单类型 + typeVoLists.stream().filter(type -> type.getId().equals(item.getType())).findFirst().ifPresent(typeVo -> item.setTypeName(typeVo.getOrderTypeName())); + + // 处理人 + remoteUserVos.stream().filter(user -> user.getUserId().equals(item.getHandler())).findFirst().ifPresent(remoteUserVo -> item.setHandlerText(remoteUserVo.getNickName())); + + if (CollUtil.isNotEmpty(recordVos)) { + List mapRecordVos = recordVos.stream().filter(o -> item.getId() == Long.parseLong(o.getOrderId())).toList(); + List mRecordVos = BeanUtil.copyToList(mapRecordVos, MServiceWorkOrdersRecordVo.class); + mRecordVos.forEach(o -> { + o.setHandlerName(StringUtils.isNotBlank(item.getHandlerText()) ? item.getHandlerText() : null); + }); + item.setRecordVoList(mRecordVos); + } + } + } + return ordersVos; } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterInfoServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterInfoServiceImpl.java index dff02dba..78f4a58c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterInfoServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterInfoServiceImpl.java @@ -43,6 +43,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -239,10 +241,10 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService { }).toList(); treeList.addAll(l3); + TbMeterInfoBo bo = new TbMeterInfoBo(); + bo.setMeterType(meterType); + List meterInfoVos = this.queryList(bo); if (isMeter) { - TbMeterInfoBo bo = new TbMeterInfoBo(); - bo.setMeterType(meterType); - List meterInfoVos = this.queryList(bo); if (meterInfoVos != null && !meterInfoVos.isEmpty()) { List> l4 = meterInfoVos.stream().map(item -> { TreeNode node = new TreeNode<>(); @@ -254,6 +256,13 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService { }).toList(); treeList.addAll(l4); } + } else { + if (meterInfoVos != null && !meterInfoVos.isEmpty()) { + for (TreeNode node : l3) { + List vo = meterInfoVos.stream().filter(item -> item.getFloorId().equals(node.getCode())).toList(); + node.setLabel(node.getLabel() + "(" + vo.size() + ")"); + } + } } return TreeUtils.build(treeList, 0L); } @@ -299,8 +308,10 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService { return; } + List sortedMeterInfoVoList = meterSort(meterInfoVoList); + // 获取唯一的主机IP列表 - String[] hostIpArr = meterInfoVoList.stream().map(TbMeterInfoVo::getHostIp).distinct().toArray(String[]::new); + String[] hostIpArr = sortedMeterInfoVoList.stream().map(TbMeterInfoVo::getHostIp).distinct().toArray(String[]::new); // 统计每个IP对应的仪表数量 Map ipCountMap = new HashMap<>(); @@ -319,13 +330,52 @@ public class TbMeterInfoServiceImpl implements ITbMeterInfoService { log.info("仪表数据获取耗时:{}ms", timeInterval.interval()); } catch (Exception e) { // 获取数据失败,设置所有仪表通信状态为0并发送消息 - handleMeterCommunicationFailure(user, jsonObject, meterInfoVoList, tokenValue); + handleMeterCommunicationFailure(user, jsonObject, sortedMeterInfoVoList, tokenValue); return; } // 处理仪表读数和状态 - processMeterResults(user, jsonObject, meterResults, meterInfoVoList, tokenValue); - }, 30000,300000); + processMeterResults(user, jsonObject, meterResults, sortedMeterInfoVoList, tokenValue); + }, 30000, 180000); + } + + /** + * 仪表排序 + * + * @param meterInfoVoList 仪表列表 + * @return List 返回排序后的仪表列表 + */ + private List meterSort(List meterInfoVoList) { + // 创建比较器 + Comparator comparator = (m1, m2) -> { + // 提取楼层和编号数值 + int[] parts1 = extractNumbers(m1.getMeterName()); + int[] parts2 = extractNumbers(m2.getMeterName()); + + // 先比较楼层 + if (parts1[0] != parts2[0]) { + return Integer.compare(parts1[0], parts2[0]); + } + // 楼层相同则比较编号 + return Integer.compare(parts1[1], parts2[1]); + }; + + return meterInfoVoList.stream().sorted(comparator).toList(); + } + + /** + * 从字符串提取数字(返回[楼层, 编号]) + * + * @param name 仪表名称 + * @return int[] + */ + private int[] extractNumbers(String name) { + Pattern pattern = Pattern.compile("(\\d+)楼电表(\\d+)号"); + Matcher matcher = pattern.matcher(name); + if (matcher.find()) { + return new int[]{Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2))}; + } + return new int[]{0, 0}; // 匹配失败时返回默认值 } /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterRecordServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterRecordServiceImpl.java index 5e917eab..0fe94eb6 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterRecordServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/smartDevicesImpl/TbMeterRecordServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; @@ -14,6 +15,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.property.domain.bo.smartDevicesBo.TbMeterInfoBo; +import org.dromara.property.domain.entity.smartDevices.TbMeterInfo; import org.dromara.property.domain.enums.MeterRecordTypeEnum; import org.dromara.property.domain.vo.smartDevicesVo.TbMeterInfoVo; import org.dromara.property.rocketmq.domain.MeterResult; @@ -27,6 +29,7 @@ import org.dromara.property.service.smartDevicesService.ITbMeterRecordService; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -209,6 +212,14 @@ public class TbMeterRecordServiceImpl implements ITbMeterRecordService { record.setCurrentReading(BigDecimal.ZERO); } + if (record.getCurrentReading().compareTo(BigDecimal.ZERO) == 0){ + // 通信状态改为离线 + TbMeterInfoBo bo = new TbMeterInfoBo(); + bo.setId(info.getId()); + bo.setCommunicationState(0L); + tbMeterInfoService.updateByBo(bo); + } + // 设置上次读数 if (hasOldRecords) { TbMeterRecord oldRecord = oldRecordMap.get(info.getId()); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisVisitorController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/E8Controller.java similarity index 77% rename from ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisVisitorController.java rename to ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/E8Controller.java index 01d34f98..c4e21d33 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisVisitorController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/E8Controller.java @@ -4,11 +4,13 @@ import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateUtil; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.sis.sdk.e8.E8PlatformApi; import org.dromara.sis.sdk.e8.domain.QueryDto; import org.dromara.sis.sdk.e8.domain.accessControl.req.AccessRecordFindReq; import org.dromara.sis.sdk.e8.domain.accessControl.res.AccessRecordFindRes; +import org.dromara.sis.sdk.e8.domain.door.res.AuthDoorDeviceFindRes; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -16,6 +18,9 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author yuyongle @@ -25,14 +30,16 @@ import java.util.Date; @Validated @RequiredArgsConstructor @RestController -@RequestMapping("/visitor") -public class SisVisitorController { +@RequestMapping("/e8") +public class E8Controller { private final E8PlatformApi e8PlatformApi; /** * 查询人员通行记录 + * + * @return tableDataInfo */ - @GetMapping("/list") + @GetMapping("/visitor/list") public TableDataInfo list(@RequestParam(required = false) String begTime, @RequestParam(required = false) String endTime, @NotNull(message = "页码不能为空") @RequestParam Integer pageNum, @@ -67,4 +74,18 @@ public class SisVisitorController { dto.setMaxResultCount(pageSize); return e8PlatformApi.getPageAccessRecordList(dto); } + + /** + * 查询门禁设备在线情况 + * + * @return Map + */ + @GetMapping("/door/online") + public R> doorOnline() { + List list = e8PlatformApi.getPageAuthDoorDeviceList(); + Map map = new HashMap<>(); + map.put("on", list.stream().filter(o -> o.getOnlineStatus() == 1).count()); + map.put("off", list.stream().filter(o -> o.getOnlineStatus() == 0).count()); + return R.ok(map); + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisDeviceManageController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisDeviceManageController.java index f31ed593..ce98bf55 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisDeviceManageController.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/SisDeviceManageController.java @@ -23,7 +23,9 @@ import org.dromara.sis.service.ISisDeviceManageService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * 设备管理 @@ -114,5 +116,17 @@ public class SisDeviceManageController extends BaseController { return R.ok(sisDeviceManageService.tree()); } - + /** + * 统计设备在线状态 + * + * @return map + */ + @GetMapping("/online") + public R> getOnlineStatus() { + List list = sisDeviceManageService.queryList(new SisDeviceManageBo()); + Map map = new HashMap<>(); + map.put("on", list.stream().filter(o -> o.getDeviceStatus() == 1).count()); + map.put("off", list.stream().filter(o -> o.getDeviceStatus() == 0).count()); + return R.ok(map); + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java index f6190037..46c1aefe 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/domain/vo/SisDeviceManageVo.java @@ -61,6 +61,11 @@ public class SisDeviceManageVo implements Serializable { */ private Integer deviceType; + /** + * 设备在线状态 0:离线 1:在线 2:未知 + */ + private Integer deviceStatus; + /** * 设备类型 */ diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java index 0f58f525..34844bf5 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/e8/domain/door/res/AuthDoorDeviceFindRes.java @@ -29,4 +29,9 @@ public class AuthDoorDeviceFindRes { * 门禁Id */ private Long deviceId; + + /** + * 门禁状态 + */ + private Integer onlineStatus; } From 81c95f124e00bf9497eff198ff7ab939f8ad3fcc Mon Sep 17 00:00:00 2001 From: zcxlsm Date: Tue, 9 Sep 2025 20:56:04 +0800 Subject: [PATCH 4/4] 1 --- .../xcx/XServiceWorkOrdersTypeController.java | 11 ---- .../xcx/XTbVisitorManagementController.java | 27 ++------ .../ResidentPersonServiceImpl.java | 13 +++- .../sis/dubbo/RemoteVisitorServiceImpl.java | 20 +++--- .../job/snailjob/sis/SyncGrantAuthTask.java | 66 +++++++++---------- 5 files changed, 59 insertions(+), 78 deletions(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersTypeController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersTypeController.java index c4e5fdf2..ec198378 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersTypeController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XServiceWorkOrdersTypeController.java @@ -1,21 +1,10 @@ package org.dromara.property.controller.xcx; import cn.dev33.satoken.annotation.SaCheckPermission; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.excel.utils.ExcelUtil; -import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; -import org.dromara.property.domain.bo.ServiceWorkOrdersTypeBo; import org.dromara.property.domain.vo.ServiceWorkOrdersTypeVo; import org.dromara.property.service.IServiceWorkOrdersTypeService; import org.springframework.validation.annotation.Validated; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XTbVisitorManagementController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XTbVisitorManagementController.java index eb2171b2..1145aea1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XTbVisitorManagementController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/xcx/XTbVisitorManagementController.java @@ -1,39 +1,21 @@ package org.dromara.property.controller.xcx; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.dev33.satoken.stp.StpUtil; -import com.alibaba.fastjson.JSONObject; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; -import org.apache.dubbo.config.annotation.DubboReference; -import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.web.core.BaseController; -import org.dromara.common.websocket.dto.WebSocketMessageDto; -import org.dromara.common.websocket.holder.WebSocketSessionHolder; -import org.dromara.common.websocket.utils.WebSocketUtils; -import org.dromara.property.domain.bo.QrCodeInfo; import org.dromara.property.domain.bo.TbVisitorManagementBo; import org.dromara.property.domain.vo.TbVisitorManagementVo; import org.dromara.property.service.ITbVisitorManagementService; -import org.dromara.system.api.RemoteConfigService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.time.Duration; import java.util.List; -import java.util.UUID; +import java.util.Map; /** * 访客管理 @@ -104,10 +86,11 @@ public class XTbVisitorManagementController extends BaseController { */ @GetMapping("/qrCode/{id}") @SaCheckPermission("xcx:visitorManagement:getQrCode") - public R getQrCode(@NotNull(message = "主键不能为空") + public R getQrCode(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { - int code = Integer.parseInt(tbVisitorManagementService.getQrCodeByIdForXcx(id).get("code").toString()); - return code == 200 ? R.ok(tbVisitorManagementService.getQrCodeByIdForXcx(id).get("data").toString()) : R.fail(tbVisitorManagementService.getQrCodeByIdForXcx(id).get("data").toString()); + Map res = tbVisitorManagementService.getQrCodeByIdForXcx(id); + int code = Integer.parseInt(res.get("code").toString()); + return code == 200 ? R.ok(res.get("data")) : R.fail(res.get("data")); } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentPersonServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentPersonServiceImpl.java index ae94b7a7..52030952 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentPersonServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/residentImpl/ResidentPersonServiceImpl.java @@ -176,8 +176,13 @@ public class ResidentPersonServiceImpl implements IResidentPersonService { ResidentPerson update = MapstructUtils.convert(bo, ResidentPerson.class); assert update != null; - // 人脸照片存在时,才同步修改授权 - if (update.getAuthGroupId() != null && update.getAuthEndDate() != null && update.getImg() != null) { + // 定义触发条件 + boolean shouldUpdateAuth = (update.getAuthGroupId() != null && + update.getAuthEndDate() != null && + update.getImg() != null) || + update.getState() != 1; + + if (shouldUpdateAuth) { ResidentPersonVo vo = queryById(update.getId()); Long e8Id = vo.getEEightId(); @@ -267,7 +272,7 @@ public class ResidentPersonServiceImpl implements IResidentPersonService { } /** - * 查询已上传图片,未授权人员 + * 查询已上传图片,未授权人员(账号启用,且审核通过) * * @return List */ @@ -276,6 +281,8 @@ public class ResidentPersonServiceImpl implements IResidentPersonService { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.isNotNull(ResidentPerson::getImg) .ne(ResidentPerson::getImg, "") + .eq(ResidentPerson::getState, 1) + .eq(ResidentPerson::getIsAudit, 1) .isNull(ResidentPerson::getEEightId); return baseMapper.selectVoList(lqw); } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java index b4807150..7903b218 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/dubbo/RemoteVisitorServiceImpl.java @@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.common.core.utils.StringUtils; import org.dromara.resource.api.RemoteFileService; import org.dromara.sis.api.RemoteVisitorService; import org.dromara.sis.api.domain.RemoteVisitor; @@ -15,7 +16,6 @@ import org.dromara.sis.sdk.e8.domain.visitors.req.VisitorAddReq; import org.dromara.sis.sdk.e8.domain.visitors.res.VisitorAddRes; import org.dromara.sis.sdk.e8.utils.ImageUtil; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,14 +44,16 @@ public class RemoteVisitorServiceImpl implements RemoteVisitorService { @Override public Map syncE8PlatVisitor(RemoteVisitor visitor) { try { - byte[] imgByte = fileService.downloadToByteArray(Long.parseLong(visitor.getVisitorFaceImg())); - Assert.notNull(imgByte, "下载访客照片失败"); + String imgUrl = null; + if (StringUtils.isNotBlank(visitor.getVisitorFaceImg())) { + byte[] imgByte = fileService.downloadToByteArray(Long.parseLong(visitor.getVisitorFaceImg())); + Assert.notNull(imgByte, "下载访客照片失败"); - byte[] zipByte = imageUtil.compressImageToRequirements(imgByte); - - String imgUrl = e8PlatformApi.uploadFace(zipByte); - Assert.notNull(imgUrl, "e8平台上传访客照片失败"); + byte[] zipByte = imageUtil.compressImageToRequirements(imgByte); + imgUrl = e8PlatformApi.uploadFace(zipByte); + Assert.notNull(imgUrl, "e8平台上传访客照片失败"); + } VisitorAddReq req = new VisitorAddReq(); req.setVisitorName(visitor.getVisitorName()); req.setMobilePhone(visitor.getMobilePhone()); @@ -68,7 +70,7 @@ public class RemoteVisitorServiceImpl implements RemoteVisitorService { : Map.of("code", 500, "data", res.getMessage()); } catch (Exception e) { log.info(e.getMessage()); - return Map.of("code", 500, "data", "e8平台新增访客登记出错"); + return Map.of("code", 500, "data", e.getMessage()); } } @@ -90,7 +92,7 @@ public class RemoteVisitorServiceImpl implements RemoteVisitorService { } catch (Exception e) { log.info(e.getMessage()); - return Map.of("code", 500, "data", "e8平台获取访客二维码出错"); + return Map.of("code", 500, "data", e.getMessage()); } } } diff --git a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/SyncGrantAuthTask.java b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/SyncGrantAuthTask.java index 3a014bee..e6215acb 100644 --- a/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/SyncGrantAuthTask.java +++ b/ruoyi-modules/ruoyi-job/src/main/java/org/dromara/job/snailjob/sis/SyncGrantAuthTask.java @@ -48,7 +48,6 @@ public class SyncGrantAuthTask { // 需要先设置模拟上下文 SaTokenContextMockUtil.setMockContext(() -> { // 模拟登录 - StpUtil.login(1); unAuthPersonRef.set(remoteResidentPersonService.queryUnAuthPerson()); List unAuthPerson = unAuthPersonRef.get(); @@ -89,38 +88,39 @@ public class SyncGrantAuthTask { continue; } -// // 计算图片MD5 -// String nowMd5 = calculateMD5(imgByte); -// // 通过MD5查询相同图片 -// Long remoteId = remoteSisAuthService.queryHuaweiBoxIdByImgMd5(nowMd5); -// -// Long huaweiId; -// if (remoteId == null) { -// // 当前本地人像信息不存在相同照片,直接上传华为盒子 -// huaweiId = syncHuaweiBox(person, imgByte); -// } else { -// huaweiId = remoteId; -// } -// -// if (huaweiId == null) { -// log.info("华为盒子人像上传失败:{}-----{}", person.getName(), person.getId()); -// remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); -// continue; -// } -// -// Boolean update = false; -// try { -// update = remoteSisAuthService.updateImgByPersonId(person.getId(), huaweiId, nowMd5); -// } catch (Exception e) { -// remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); -// continue; -// } -// -// if (!update) { -// log.info("更新人像信息失败:{}-----{}", person.getName(), person.getId()); -// remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); -// continue; -// } + // 计算图片MD5 + String nowMd5 = calculateMD5(imgByte); + // 通过MD5查询相同图片 + Long remoteId = remoteSisAuthService.queryHuaweiBoxIdByImgMd5(nowMd5); + + Long huaweiId; + if (remoteId == null) { + // 当前本地人像信息不存在相同照片,直接上传华为盒子 + huaweiId = syncHuaweiBox(person, imgByte); + } else { + huaweiId = remoteId; + } + + if (huaweiId == null) { + log.info("华为盒子人像上传失败:{}-----{}", person.getName(), person.getId()); + remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); + continue; + } + + Boolean update; + try { + update = remoteSisAuthService.updateImgByPersonId(person.getId(), huaweiId, nowMd5); + } catch (Exception e) { + log.info("更新人像信息出错:{}-----{}", person.getName(), person.getId()); + remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); + continue; + } + + if (!update) { + log.info("更新人像信息失败:{}-----{}", person.getName(), person.getId()); + remoteSisAuthService.deletePersonAuth(List.of(person.getId()), new ArrayList<>()); + continue; + } // 黑名单不授权到E8 if (!Objects.equals(person.getRosterType(), RosterTypeEnum.BLACK_LIST.getCode())) {