修改工单bug

This commit is contained in:
2025-08-26 17:28:16 +08:00
parent a16c333759
commit 9c0b0bad03
8 changed files with 309 additions and 45 deletions

View File

@@ -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<Void> 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<ServiceWorkOrdersVo> list(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
public TableDataInfo<MServiceWorkOrdersVo> list(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
return serviceWorkOrdersService.queryMobilePageList(bo, pageQuery);
}
/**

View File

@@ -107,10 +107,6 @@ public class ServiceWorkOrdersBo extends BaseEntity {
* 图片
*/
private String imgUrl;
/**
* 工单图片
*/
private String orderImgUrl;
/**
* 备注
*/

View File

@@ -105,6 +105,10 @@ public class MServiceWorkOrdersBo extends BaseEntity {
* 工单图片
*/
private String orderImgUrl;
/**
* 问题描述
*/
private String issueDesc;
/**
* 备注
*/

View File

@@ -146,6 +146,7 @@ public class ServiceWorkOrdersVo implements Serializable {
* 图片
*/
private String imgUrl;
/**
* 备注
*/

View File

@@ -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;
}

View File

@@ -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<MServiceWorkOrdersRecordVo> recordVoList;
}

View File

@@ -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<ServiceWorkOrdersVo> queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery);
TableDataInfo<MServiceWorkOrdersVo> queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery);
}

View File

@@ -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<ServiceWorkOrdersVo> queryPageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ServiceWorkOrders> lqw = buildQueryWrapper(bo);
Page<ServiceWorkOrdersVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (ObjectUtil.isEmpty(result.getRecords())) {
return TableDataInfo.build(result);
if (ObjectUtil.isNotEmpty(result.getRecords())) {
List<Long> typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList());
List<ServiceWorkOrdersTypeVo> serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList);
if (ObjectUtil.isNotEmpty(serviceWorkOrdersTypeVoList)) {
List<ServiceWorkOrdersVo> 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<Long> typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList());
List<ServiceWorkOrdersTypeVo> serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList);
if (ObjectUtil.isEmpty(serviceWorkOrdersTypeVoList)) {
return TableDataInfo.build(result);
}
List<ServiceWorkOrdersVo> 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<ServiceWorkOrdersVo>().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<ServiceWorkOrdersVo> queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
//当前登录用户
public TableDataInfo<MServiceWorkOrdersVo> queryMobilePageList(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
// 当前登录用户
LoginUser loginUser = LoginHelper.getLoginUser();
if (!LoginHelper.isSuperAdmin(loginUser.getUserId())) {
bo.setHandler(loginUser.getUserId());
}
LambdaQueryWrapper<ServiceWorkOrders> lqw = buildQueryWrapper(bo);
Page<ServiceWorkOrdersVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (ObjectUtil.isEmpty(result.getRecords())) {
return TableDataInfo.build(result);
}
List<Long> typeList = result.getRecords().stream().map(vo -> vo.getType()).distinct().collect(Collectors.toList());
List<ServiceWorkOrdersTypeVo> serviceWorkOrdersTypeVoList = typesMapper.selectVoByIds(typeList);
if (ObjectUtil.isEmpty(serviceWorkOrdersTypeVoList)) {
return TableDataInfo.build(result);
}
List<ServiceWorkOrdersVo> 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<ServiceWorkOrdersVo>().setRecords(serviceWorkOrdersVoList).setTotal(result.getTotal()));
// 转换 VO 类型
List<MServiceWorkOrdersVo> mServiceWorkOrdersVos = new ArrayList<>();
if (CollUtil.isNotEmpty(result.getRecords())) {
List<Long> typeList = result.getRecords().stream()
.map(ServiceWorkOrdersVo::getType)
.distinct()
.collect(Collectors.toList());
List<ServiceWorkOrdersTypeVo> typeVoList = typesMapper.selectVoByIds(typeList);
Map<Long, String> typeMap = typeVoList.stream()
.collect(Collectors.toMap(ServiceWorkOrdersTypeVo::getId, ServiceWorkOrdersTypeVo::getOrderTypeName, (a, b) -> a));
//收集处理人转化成list
List<Long> handlerIdList = result.getRecords().stream().map(ServiceWorkOrdersVo::getHandler)
.distinct()
.collect(Collectors.toList());
List<RemoteUserVo> 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<MServiceWorkOrdersVo> 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<Long, String> typeMap, List<RemoteUserVo> 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<ServiceWorkOrdersRecordVo> serviceWorkOrdersRecordVoList = workOrdersRecordMapper.selectVoList(new LambdaQueryWrapper<ServiceWorkOrdersRecord>().eq(ServiceWorkOrdersRecord::getOrderId, mServiceWorkOrdersVo.getId()));
if (CollUtil.isNotEmpty(serviceWorkOrdersRecordVoList)) {
List<MServiceWorkOrdersRecordVo> mServiceWorkOrdersRecordVos = BeanUtil.copyToList(serviceWorkOrdersRecordVoList, MServiceWorkOrdersRecordVo.class);
mServiceWorkOrdersRecordVos.stream().forEach(workOrdersRecordVo -> {
workOrdersRecordVo.setHandlerName(Objects.nonNull(remoteUserVo) ? remoteUserVo.getNickName() : null);
});
mServiceWorkOrdersVo.setRecordVoList(mServiceWorkOrdersRecordVos);
}
}
}