From 9c0b0bad03ef7851a643bc7d042b4ff13a43e332 Mon Sep 17 00:00:00 2001 From: yuyongle <1150359267@qq.com> Date: Tue, 26 Aug 2025 17:28:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B7=A5=E5=8D=95bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mobile/MServiceWorkOrdersController.java | 4 +- .../domain/bo/ServiceWorkOrdersBo.java | 4 - .../bo/mobile/MServiceWorkOrdersBo.java | 4 + .../domain/vo/ServiceWorkOrdersVo.java | 1 + .../vo/mobile/MServiceWorkOrdersRecordVo.java | 61 +++++++ .../vo/mobile/MServiceWorkOrdersVo.java | 166 ++++++++++++++++++ .../service/IServiceWorkOrdersService.java | 3 +- .../impl/ServiceWorkOrdersServiceImpl.java | 111 ++++++++---- 8 files changed, 309 insertions(+), 45 deletions(-) create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersRecordVo.java create mode 100644 ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersVo.java 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 3a8d3beb..4e83e415 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 @@ -13,6 +13,7 @@ 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.ServiceWorkOrdersVo; +import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import org.dromara.property.service.IServiceWorkOrdersService; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -35,7 +36,6 @@ public class MServiceWorkOrdersController extends BaseController { * 小程序新增【工单处理】 */ @Log(title = "【小程序新增工单处理】", businessType = BusinessType.INSERT) - @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody MServiceWorkOrdersBo bo) { return toAjax(serviceWorkOrdersService.insertMServiceWorkOrdersBo(bo)); @@ -44,7 +44,7 @@ public class MServiceWorkOrdersController extends BaseController { * 小程序查询【工单处理】 */ @GetMapping("/list") - public TableDataInfo list(ServiceWorkOrdersBo bo, PageQuery pageQuery) { + public TableDataInfo list(ServiceWorkOrdersBo bo, PageQuery pageQuery) { return serviceWorkOrdersService.queryMobilePageList(bo, pageQuery); } /** diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java index 68cafea7..416643ab 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java @@ -107,10 +107,6 @@ public class ServiceWorkOrdersBo extends BaseEntity { * 图片 */ private String imgUrl; - /** - * 工单图片 - */ - private String orderImgUrl; /** * 备注 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/mobile/MServiceWorkOrdersBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/mobile/MServiceWorkOrdersBo.java index d1e8799d..fcac6c8b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/mobile/MServiceWorkOrdersBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/mobile/MServiceWorkOrdersBo.java @@ -105,6 +105,10 @@ public class MServiceWorkOrdersBo extends BaseEntity { * 工单图片 */ private String orderImgUrl; + /** + * 问题描述 + */ + private String issueDesc; /** * 备注 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java index ec5db7b3..5ab02bee 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java @@ -146,6 +146,7 @@ public class ServiceWorkOrdersVo implements Serializable { * 图片 */ private String imgUrl; + /** * 备注 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersRecordVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersRecordVo.java new file mode 100644 index 00000000..ff858da1 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersRecordVo.java @@ -0,0 +1,61 @@ +package org.dromara.property.domain.vo.mobile; + + +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.ServiceWorkOrdersRecord; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * @author yuyongle + * @version 1.0 + * @description: TODO + * @date 2025/8/26 13:53 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ServiceWorkOrdersRecord.class) +public class MServiceWorkOrdersRecordVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 工单id + */ + @ExcelProperty(value = "工单id") + private String orderId; + + /** + * 状态(0创建工单,1已派单2已抢单3处理中,4已完成) + */ + @ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成)") + private String status; + + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private Long handler; + /** + * 处理人 + */ + @ExcelProperty(value = "处理人") + private String handlerName; + + /** + * 创建时间 + */ + @ExcelProperty(value = "创建时间") + private Date createTime; +} diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersVo.java new file mode 100644 index 00000000..cb4a5d53 --- /dev/null +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/mobile/MServiceWorkOrdersVo.java @@ -0,0 +1,166 @@ +package org.dromara.property.domain.vo.mobile; + + +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.ServiceWorkOrders; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * @author yuyongle + * @version 1.0 + * @description: TODO + * @date 2025/8/26 13:52 + */ +@Data +@ExcelIgnoreUnannotated +@AutoMapper(target = ServiceWorkOrders.class) +public class MServiceWorkOrdersVo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + /** + * id + */ + @ExcelProperty(value = "id") + private Long id; + + /** + * 工单编号 + */ + @ExcelProperty(value = "工单编号") + private String orderNo; + /** + * 权重 + */ + @ExcelProperty(value = "权重") + private String processingWeight; + + /** + * 工单名称 + */ + @ExcelProperty(value = "工单名称") + private String orderName; + + /** + * 工单类型 + */ + @ExcelProperty(value = "工单类型") + private Long type; + /** + * 上报类型 + */ + private String reportingType; + /** + * 工单类型名称 + */ + @ExcelProperty(value = "工单类型名称") + private String typeName; + + /** + * 状态 + */ + @ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成,5已评价)") + private String status; + + /** + * 派单时间 + */ + @ExcelProperty(value = "派单时间") + private Date dispatchTime; + /** + * 运作模式(0派单+抢单,1派单,2自动派单) + */ + private String operationMode; + /** + * 发起人 + */ + private String initiatorPeople; + + /** + * 处理人姓名 + */ + private long handler; + /** + * 抄送人 + */ + private long ccPeople; + /** + * 发起人手机号 + */ + @ExcelProperty(value = "发起人手机号") + private String initiatorPhone; + /** + * 处理人姓名文本 + */ + @ExcelProperty(value = "处理人姓名文本") + private String handlerText; + + /** + * 处理人姓名文本 + */ + @ExcelProperty(value = "处理人电话") + private String handlerPhone; + + /** + * 地址 + */ + @ExcelProperty(value = "地址") + private String location; + + /** + * 计划完成时间 + */ + @ExcelProperty(value = "计划完成时间") + private Date planCompleTime; + + /** + * 完成时间 + */ + @ExcelProperty(value = "完成时间") + private Date compleTime; + + /** + * 评价 + */ + @ExcelProperty(value = "评价") + private Integer serviceEvalua; + + /** + * 是否超时 + */ + @ExcelProperty(value = "是否超时") + private String isTimeOut; + + /** + * 评价文本 + */ + private String serviceEvaluaText; + /** + * 工单图片 + */ + private String orderImgUrl; + /** + * 图片 + */ + private String imgUrl; + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + private Date createTime; + /** + * 工单记录 + */ + List recordVoList; +} 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 b5129f58..a9707a0c 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 @@ -8,6 +8,7 @@ import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo; import org.dromara.property.domain.vo.ServiceWorkOrderAnalysisVo; import org.dromara.property.domain.vo.ServiceWorkOrdersInfoVo; import org.dromara.property.domain.vo.ServiceWorkOrdersVo; +import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import java.util.Collection; import java.util.List; @@ -101,5 +102,5 @@ public interface IServiceWorkOrdersService { * @param pageQuery 分页参数 * @return 【工单处理】分页列表 */ - TableDataInfo queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery); + TableDataInfo queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery); } 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 af6440aa..543061ac 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 @@ -26,6 +26,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.mobile.MServiceWorkOrdersRecordVo; +import org.dromara.property.domain.vo.mobile.MServiceWorkOrdersVo; import org.dromara.property.mapper.ResidentPersonMapper; import org.dromara.property.mapper.ServiceWorkOrdersMapper; import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper; @@ -119,23 +121,20 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { public TableDataInfo queryPageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - if (ObjectUtil.isEmpty(result.getRecords())) { - return TableDataInfo.build(result); + if (ObjectUtil.isNotEmpty(result.getRecords())) { + List typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList()); + List serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList); + if (ObjectUtil.isNotEmpty(serviceWorkOrdersTypeVoList)) { + List serviceWorkOrdersVoList = new ArrayList<>(); + result.getRecords().stream().forEach(s -> { + ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null); + s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null); + s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null); + serviceWorkOrdersVoList.add(s); + }); + } } - List typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList()); - List serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList); - if (ObjectUtil.isEmpty(serviceWorkOrdersTypeVoList)) { - return TableDataInfo.build(result); - } - List serviceWorkOrdersVoList = new ArrayList<>(); - result.getRecords().stream().forEach(s -> { - ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null); - - s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null); - s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null); - serviceWorkOrdersVoList.add(s); - }); - return TableDataInfo.build(new Page().setRecords(serviceWorkOrdersVoList).setTotal(result.getTotal())); + return TableDataInfo.build(result); } /** @@ -246,14 +245,14 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { .ge(AttendanceUserGroup::getEndDate, today) .orderByAsc(AttendanceUserGroup::getCreateTime) ); - Assert.isTrue(CollUtil.isNotEmpty(attendanceUserGroups),"暂无排班人员"); + Assert.isTrue(CollUtil.isNotEmpty(attendanceUserGroups), "暂无排班人员"); // 缓存当天排班数据(假设当天不会变) - RedisUtils.setCacheList(DateUtil.today(), attendanceUserGroups); + RedisUtils.setCacheList(DateUtil.today(), attendanceUserGroups); } // 2. 获取并更新轮询索引(原子性很重要) int currentIndex; - Integer lastScheduleId = RedisUtils.getCacheObject(DateUtil.today()+"LastScheduleId"); + Integer lastScheduleId = RedisUtils.getCacheObject(DateUtil.today() + "LastScheduleId"); if (lastScheduleId == null || lastScheduleId < 0 || lastScheduleId >= attendanceUserGroups.size()) { currentIndex = 0; // 越界或未设置,重置为0 } else { @@ -262,7 +261,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { currentIndex = 0; // 循环轮询 } } - RedisUtils.setCacheObject(DateUtil.today()+"LastScheduleId", currentIndex); + RedisUtils.setCacheObject(DateUtil.today() + "LastScheduleId", currentIndex); // 3. 分配处理人 AttendanceUserGroup assignedGroup = attendanceUserGroups.get(currentIndex); @@ -631,30 +630,66 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { * @return 【工单处理】分页列表 */ @Override - public TableDataInfo queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) { - - //当前登录用户 + public TableDataInfo queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) { + // 当前登录用户 LoginUser loginUser = LoginHelper.getLoginUser(); if (!LoginHelper.isSuperAdmin(loginUser.getUserId())) { bo.setHandler(loginUser.getUserId()); } LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); - if (ObjectUtil.isEmpty(result.getRecords())) { - return TableDataInfo.build(result); - } - List typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList()); - List serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList); - if (ObjectUtil.isEmpty(serviceWorkOrdersTypeVoList)) { - return TableDataInfo.build(result); - } - List serviceWorkOrdersVoList = new ArrayList<>(); - result.getRecords().stream().forEach(s -> { - ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null); - s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null); - serviceWorkOrdersVoList.add(s); - }); - return TableDataInfo.build(new Page().setRecords(serviceWorkOrdersVoList).setTotal(result.getTotal())); + // 转换 VO 类型 + List mServiceWorkOrdersVos = new ArrayList<>(); + if (CollUtil.isNotEmpty(result.getRecords())) { + List typeList = result.getRecords().stream() + .map(ServiceWorkOrdersVo::getType) + .distinct() + .collect(Collectors.toList()); + + List typeVoList = typesMapper.selectVoByIds(typeList); + Map typeMap = typeVoList.stream() + .collect(Collectors.toMap(ServiceWorkOrdersTypeVo::getId, ServiceWorkOrdersTypeVo::getOrderTypeName, (a, b) -> a)); + //收集处理人转化成list + List handlerIdList = result.getRecords().stream().map(ServiceWorkOrdersVo::getHandler) + .distinct() + .collect(Collectors.toList()); + List remoteUserVos = remoteUserService.selectListByIds(handlerIdList); + // 转换并设置 typeName + mServiceWorkOrdersVos = result.getRecords().stream().map(vo -> { + MServiceWorkOrdersVo mVo = BeanUtil.copyProperties(vo, MServiceWorkOrdersVo.class); + dataProcessing(mVo, typeMap, remoteUserVos); + return mVo; + }).collect(Collectors.toList()); + } + // 构建分页结果 + Page pageResult = new Page<>(); + pageResult.setRecords(mServiceWorkOrdersVos); + pageResult.setTotal(result.getTotal()); + pageResult.setCurrent(result.getCurrent()); + pageResult.setSize(result.getSize()); + return TableDataInfo.build(pageResult); + } + + /** + * 处理数据 + * + * @param mServiceWorkOrdersVo + */ + private void dataProcessing(MServiceWorkOrdersVo mServiceWorkOrdersVo, Map typeMap, List remoteUserVos) { + mServiceWorkOrdersVo.setTypeName(typeMap.getOrDefault(mServiceWorkOrdersVo.getType(), null)); + //通过处理人id查询处理人信息 + RemoteUserVo remoteUserVo = remoteUserVos.stream().filter(user -> user.getUserId().equals(mServiceWorkOrdersVo.getHandler())).findFirst().orElse(null); + mServiceWorkOrdersVo.setHandlerPhone(remoteUserVo != null ? remoteUserVo.getPhonenumber() : null); + mServiceWorkOrdersVo.setHandlerText(remoteUserVo != null ? remoteUserVo.getNickName() : null); + //查询工单处理记录 + List serviceWorkOrdersRecordVoList = workOrdersRecordMapper.selectVoList(new LambdaQueryWrapper().eq(ServiceWorkOrdersRecord::getOrderId, mServiceWorkOrdersVo.getId())); + if (CollUtil.isNotEmpty(serviceWorkOrdersRecordVoList)) { + List mServiceWorkOrdersRecordVos = BeanUtil.copyToList(serviceWorkOrdersRecordVoList, MServiceWorkOrdersRecordVo.class); + mServiceWorkOrdersRecordVos.stream().forEach(workOrdersRecordVo -> { + workOrdersRecordVo.setHandlerName(Objects.nonNull(remoteUserVo) ? remoteUserVo.getNickName() : null); + }); + mServiceWorkOrdersVo.setRecordVoList(mServiceWorkOrdersRecordVos); + } } }