diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/WorkcaseService.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/WorkcaseService.java index 9b3e75c7..1855263a 100644 --- a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/WorkcaseService.java +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/service/WorkcaseService.java @@ -3,6 +3,7 @@ package org.xyzh.api.workcase.service; import org.xyzh.api.workcase.dto.TbWorkcaseDTO; import org.xyzh.api.workcase.dto.TbWorkcaseDeviceDTO; import org.xyzh.api.workcase.dto.TbWorkcaseProcessDTO; +import org.xyzh.api.workcase.vo.WorkcaseProcessVO; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.page.PageRequest; @@ -110,7 +111,7 @@ public interface WorkcaseService { * @author yslg * @since 2025-12-19 */ - ResultDomain getWorkcaseProcessList(TbWorkcaseProcessDTO filter); + ResultDomain getWorkcaseProcessList(TbWorkcaseProcessDTO filter); /** * @description 获取工单处理过程分页 @@ -118,7 +119,7 @@ public interface WorkcaseService { * @author yslg * @since 2025-12-19 */ - ResultDomain getWorkcaseProcessPage(PageRequest pageRequest); + ResultDomain getWorkcaseProcessPage(PageRequest pageRequest); // ====================== 工单设备管理 ====================== /** diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java deleted file mode 100644 index c33f7c0e..00000000 --- a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketListVO.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.xyzh.api.workcase.vo; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.xyzh.common.vo.BaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import com.alibaba.fastjson2.annotation.JSONField; -import java.util.Date; - -/** - * 工单列表VO - * 用于前端列表展示(简化版) - */ -@Data -@EqualsAndHashCode(callSuper = true) -@Schema(description = "工单列表VO") -public class TicketListVO extends BaseVO { - private static final long serialVersionUID = 1L; - - @Schema(description = "工单ID") - private String ticketId; - - @Schema(description = "工单编号") - private String ticketNo; - - @Schema(description = "客户姓名") - private String customerName; - - @Schema(description = "工单标题") - private String title; - - @Schema(description = "工单类型名称") - private String ticketTypeName; - - @Schema(description = "优先级") - private String priority; - - @Schema(description = "优先级名称") - private String priorityName; - - @Schema(description = "工单状态") - private String ticketStatus; - - @Schema(description = "工单状态名称") - private String ticketStatusName; - - @Schema(description = "处理人姓名") - private String assignedToName; - - @Schema(description = "SLA截止时间", format = "date-time") - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private Date slaDeadline; - - @Schema(description = "是否逾期", defaultValue = "false") - private Boolean isOverdue; - - @Schema(description = "创建者姓名") - private String creatorName; -} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java deleted file mode 100644 index ec1e5c17..00000000 --- a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/TicketVO.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.xyzh.api.workcase.vo; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.xyzh.common.vo.BaseVO; -import io.swagger.v3.oas.annotations.media.Schema; -import com.alibaba.fastjson2.annotation.JSONField; -import com.fasterxml.jackson.databind.JsonNode; -import java.util.Date; -import java.util.List; - -/** - * 工单VO - * 用于前端展示工单信息 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@Schema(description = "工单VO") -public class TicketVO extends BaseVO { - private static final long serialVersionUID = 1L; - - @Schema(description = "工单ID") - private String ticketId; - - @Schema(description = "工单编号") - private String ticketNo; - - @Schema(description = "客户ID") - private String customerId; - - @Schema(description = "客户姓名") - private String customerName; - - @Schema(description = "客户电话") - private String customerPhone; - - @Schema(description = "关联会话ID") - private String conversationId; - - @Schema(description = "工单类型") - private String ticketType; - - @Schema(description = "工单类型名称") - private String ticketTypeName; - - @Schema(description = "工单分类") - private String ticketCategory; - - @Schema(description = "优先级") - private String priority; - - @Schema(description = "优先级名称") - private String priorityName; - - @Schema(description = "优先级颜色") - private String priorityColor; - - @Schema(description = "工单标题") - private String title; - - @Schema(description = "问题描述") - private String description; - - @Schema(description = "附件ID数组") - private List attachments; - - @Schema(description = "附件数量") - private Integer attachmentCount; - - @Schema(description = "工单来源") - private String ticketSource; - - @Schema(description = "工单来源名称") - private String ticketSourceName; - - @Schema(description = "分配给(处理人ID)") - private String assignedTo; - - @Schema(description = "处理人姓名") - private String assignedToName; - - @Schema(description = "分配部门") - private String assignedDept; - - @Schema(description = "分配部门名称") - private String assignedDeptName; - - @Schema(description = "工单状态") - private String ticketStatus; - - @Schema(description = "工单状态名称") - private String ticketStatusName; - - @Schema(description = "工单状态颜色") - private String statusColor; - - @Schema(description = "解决方案") - private String resolution; - - @Schema(description = "解决时间", format = "date-time") - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private Date resolutionTime; - - @Schema(description = "关闭时间", format = "date-time") - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private Date closeTime; - - @Schema(description = "首次响应时间", format = "date-time") - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private Date responseTime; - - @Schema(description = "SLA截止时间", format = "date-time") - @JSONField(format = "yyyy-MM-dd HH:mm:ss") - private Date slaDeadline; - - @Schema(description = "是否逾期", defaultValue = "false") - private Boolean isOverdue; - - @Schema(description = "距离SLA截止的剩余时间(分钟)") - private Integer slaRemainingMinutes; - - @Schema(description = "客户评分(1-5星)") - private Integer customerRating; - - @Schema(description = "客户反馈") - private String customerFeedback; - - @Schema(description = "CRM系统工单ID") - private String crmTicketId; - - @Schema(description = "同步状态") - private String syncStatus; - - @Schema(description = "同步状态名称") - private String syncStatusName; - - @Schema(description = "工单标签") - private List tags; - - @Schema(description = "工单元数据") - private JsonNode metadata; - - @Schema(description = "处理记录数量") - private Integer logCount; - - @Schema(description = "创建者姓名") - private String creatorName; - - @Schema(description = "更新者姓名") - private String updaterName; -} diff --git a/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/WorkcaseProcessVO.java b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/WorkcaseProcessVO.java new file mode 100644 index 00000000..f7bc3761 --- /dev/null +++ b/urbanLifelineServ/apis/api-workcase/src/main/java/org/xyzh/api/workcase/vo/WorkcaseProcessVO.java @@ -0,0 +1,44 @@ +package org.xyzh.api.workcase.vo; + +import java.util.List; + +import org.xyzh.common.vo.BaseVO; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @description 工单过程VO + * @filename WorkcaseProcessVO.java + * @author yslg + * @copyright xyzh + * @since 2025-12-31 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@Schema(description = "工单过程VO") +public class WorkcaseProcessVO extends BaseVO { + private static final long serialVersionUID = 1L; + + @Schema(description = "工单ID") + private String workcaseId; + + @Schema(description = "过程ID") + private String processId; + + @Schema(description = "动作 info:记录,assign:指派,redeploy:转派,repeal:撤销,finish:完成") + private String action; + + @Schema(description = "消息") + private String message; + + @Schema(description = "携带文件列表") + private List files; + + @Schema(description = "处理人ID(指派、转派专属)") + private String processor; + + @Schema(description = "处理人名称") + private String processorName; +} diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java index 11bd45e2..e746e1d5 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/controller/WorkcaseController.java @@ -14,6 +14,7 @@ import org.xyzh.api.workcase.dto.TbWorkcaseDTO; import org.xyzh.api.workcase.dto.TbWorkcaseDeviceDTO; import org.xyzh.api.workcase.dto.TbWorkcaseProcessDTO; import org.xyzh.api.workcase.service.WorkcaseService; +import org.xyzh.api.workcase.vo.WorkcaseProcessVO; import org.xyzh.common.auth.utils.LoginUtil; import org.xyzh.common.core.domain.LoginDomain; import org.xyzh.common.core.domain.ResultDomain; @@ -49,7 +50,8 @@ public class WorkcaseController { @PostMapping public ResultDomain createWorkcase(@RequestBody TbWorkcaseDTO workcase) { ValidationResult vr = ValidationUtils.validate(workcase, Arrays.asList( - ValidationUtils.requiredString("deviceNamePlateImg", "设备名称牌图片"), + ValidationUtils.requiredString("deviceNamePlate", "设备名称牌图片"), + ValidationUtils.requiredString("deviceCode", "设备代码"), ValidationUtils.requiredString("type", "问题类型"), ValidationUtils.requiredString("userId", "用户ID"), ValidationUtils.requiredString("username", "用户名称") @@ -176,14 +178,14 @@ public class WorkcaseController { @Operation(summary = "查询工单处理过程列表") @PreAuthorize("hasAuthority('workcase:ticket:process')") @PostMapping("/process/list") - public ResultDomain getWorkcaseProcessList(@RequestBody TbWorkcaseProcessDTO filter) { + public ResultDomain getWorkcaseProcessList(@RequestBody TbWorkcaseProcessDTO filter) { return workcaseService.getWorkcaseProcessList(filter); } @Operation(summary = "分页查询工单处理过程") @PreAuthorize("hasAuthority('workcase:ticket:process')") @PostMapping("/process/page") - public ResultDomain getWorkcaseProcessPage(@RequestBody PageRequest pageRequest) { + public ResultDomain getWorkcaseProcessPage(@RequestBody PageRequest pageRequest) { ValidationResult vr = ValidationUtils.validate(pageRequest, Arrays.asList( ValidationUtils.requiredNumber("pageParam.page", "页码", 1, null), ValidationUtils.requiredNumber("pageParam.pageSize", "每页数量", 1, 100) diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbWorkcaseProcessMapper.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbWorkcaseProcessMapper.java index 98013114..6ddaa0ad 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbWorkcaseProcessMapper.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/mapper/TbWorkcaseProcessMapper.java @@ -5,6 +5,7 @@ import java.util.List; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.xyzh.api.workcase.dto.TbWorkcaseProcessDTO; +import org.xyzh.api.workcase.vo.WorkcaseProcessVO; import org.xyzh.common.core.page.PageParam; /** @@ -40,12 +41,12 @@ public interface TbWorkcaseProcessMapper { /** * 查询工单过程列表 */ - List selectWorkcaseProcessList(@Param("filter") TbWorkcaseProcessDTO filter); + List selectWorkcaseProcessList(@Param("filter") TbWorkcaseProcessDTO filter); /** * 分页查询工单过程 */ - List selectWorkcaseProcessPage(@Param("filter") TbWorkcaseProcessDTO filter, @Param("pageParam") PageParam pageParam); + List selectWorkcaseProcessPage(@Param("filter") TbWorkcaseProcessDTO filter, @Param("pageParam") PageParam pageParam); /** * 统计工单过程数量 diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java index a1516482..686e75ca 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/WorkcaseServiceImpl.java @@ -25,6 +25,7 @@ import org.xyzh.api.workcase.dto.TbWorkcaseDTO; import org.xyzh.api.workcase.dto.TbWorkcaseDeviceDTO; import org.xyzh.api.workcase.dto.TbWorkcaseProcessDTO; import org.xyzh.api.workcase.service.WorkcaseService; +import org.xyzh.api.workcase.vo.WorkcaseProcessVO; import org.xyzh.common.auth.utils.LoginUtil; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.page.PageDomain; @@ -445,21 +446,21 @@ public class WorkcaseServiceImpl implements WorkcaseService { } @Override - public ResultDomain getWorkcaseProcessList(TbWorkcaseProcessDTO filter) { - List list = workcaseProcessMapper.selectWorkcaseProcessList(filter); + public ResultDomain getWorkcaseProcessList(TbWorkcaseProcessDTO filter) { + List list = workcaseProcessMapper.selectWorkcaseProcessList(filter); return ResultDomain.success("查询成功", list); } @Override - public ResultDomain getWorkcaseProcessPage(PageRequest pageRequest) { + public ResultDomain getWorkcaseProcessPage(PageRequest pageRequest) { TbWorkcaseProcessDTO filter = pageRequest.getFilter(); PageParam pageParam = pageRequest.getPageParam(); - List list = workcaseProcessMapper.selectWorkcaseProcessPage(filter, pageParam); + List list = workcaseProcessMapper.selectWorkcaseProcessPage(filter, pageParam); long total = workcaseProcessMapper.countWorkcaseProcesses(filter); pageParam.setTotal((int) total); - PageDomain pageDomain = new PageDomain<>(pageParam, list); + PageDomain pageDomain = new PageDomain<>(pageParam, list); return ResultDomain.success("查询成功", pageDomain); } diff --git a/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseMapper.xml b/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseMapper.xml index 01e4b87b..919f62af 100644 --- a/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseMapper.xml +++ b/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseMapper.xml @@ -34,10 +34,9 @@ INSERT INTO workcase.tb_workcase ( - optsn, workcase_id, room_id, user_id, username, phone, type, device_name_plate_img, creator + optsn, workcase_id, room_id, user_id, username, phone, type, device_code,device_name_plate, creator , device - , device_code - , device_name_plate + , device_name_plate_img , address , description , imgs @@ -45,10 +44,9 @@ , status , processor ) VALUES ( - #{optsn}, #{workcaseId}, #{roomId}, #{userId}, #{username}, #{phone}, #{type}, #{deviceNamePlateImg}, #{creator} + #{optsn}, #{workcaseId}, #{roomId}, #{userId}, #{username}, #{phone}, #{type}, #{deviceCode}, #{deviceNamePlate}, #{creator} , #{device} - , #{deviceCode} - , #{deviceNamePlate} + , #{deviceNamePlateImg} , #{address} , #{description} , #{imgs, typeHandler=org.xyzh.common.jdbc.handler.StringArrayTypeHandler} diff --git a/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseProcessMapper.xml b/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseProcessMapper.xml index 35016b3e..c06e1e8f 100644 --- a/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseProcessMapper.xml +++ b/urbanLifelineServ/workcase/src/main/resources/mapper/TbWorkcaseProcessMapper.xml @@ -15,6 +15,21 @@ + + + + + + + + + + + + + + + process_id, optsn, workcase_id, action, message, files, processor, remark, creator, create_time @@ -58,50 +73,64 @@ WHERE process_id = #{processId} - + SELECT p.process_id, p.optsn, p.workcase_id, p.action, p.message, p.files, + p.processor, p.remark, p.creator, p.create_time, + COALESCE(u1.username, g1.name) as creator_name, + COALESCE(u2.username, g2.name) as processor_name + FROM workcase.tb_workcase_process p + LEFT JOIN sys.tb_sys_user_info u1 ON p.creator = u1.user_id + LEFT JOIN sys.tb_guest g1 ON p.creator = g1.user_id + LEFT JOIN sys.tb_sys_user_info u2 ON p.processor = u2.user_id + LEFT JOIN sys.tb_guest g2 ON p.processor = g2.user_id - AND process_id = #{filter.processId} + AND p.process_id = #{filter.processId} - AND workcase_id = #{filter.workcaseId} + AND p.workcase_id = #{filter.workcaseId} - AND action = #{filter.action} + AND p.action = #{filter.action} - AND processor = #{filter.processor} + AND p.processor = #{filter.processor} - AND creator = #{filter.creator} + AND p.creator = #{filter.creator} - ORDER BY create_time ASC + ORDER BY p.create_time ASC - + SELECT p.process_id, p.optsn, p.workcase_id, p.action, p.message, p.files, + p.processor, p.remark, p.creator, p.create_time, + COALESCE(u1.username, g1.name) as creator_name, + COALESCE(u2.username, g2.name) as processor_name + FROM workcase.tb_workcase_process p + LEFT JOIN sys.tb_sys_user_info u1 ON p.creator = u1.user_id + LEFT JOIN sys.tb_guest g1 ON p.creator = g1.user_id + LEFT JOIN sys.tb_sys_user_info u2 ON p.processor = u2.user_id + LEFT JOIN sys.tb_guest g2 ON p.processor = g2.user_id - AND process_id = #{filter.processId} + AND p.process_id = #{filter.processId} - AND workcase_id = #{filter.workcaseId} + AND p.workcase_id = #{filter.workcaseId} - AND action = #{filter.action} + AND p.action = #{filter.action} - AND processor = #{filter.processor} + AND p.processor = #{filter.processor} - AND creator = #{filter.creator} + AND p.creator = #{filter.creator} - ORDER BY create_time ASC + ORDER BY p.create_time ASC LIMIT #{pageParam.pageSize} OFFSET #{pageParam.offset} diff --git a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts index 12466570..4c7d7a5b 100644 --- a/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts +++ b/urbanLifelineWeb/packages/workcase/src/api/workcase/workcase.ts @@ -1,6 +1,6 @@ import { api } from 'shared/api' import type { ResultDomain, PageRequest } from 'shared/types' -import type { TbWorkcaseDTO, TbWorkcaseProcessDTO, TbWorkcaseDeviceDTO } from '@/types/workcase' +import type { TbWorkcaseDTO, TbWorkcaseProcessDTO, TbWorkcaseDeviceDTO, WorkcaseProcessVO } from '@/types/workcase' /** * @description 工单管理接口 @@ -121,8 +121,8 @@ export const workcaseAPI = { * 查询工单处理过程列表 * @param filter 筛选条件 */ - async getWorkcaseProcessList(filter?: TbWorkcaseProcessDTO): Promise> { - const response = await api.post(`${this.baseUrl}/process/list`, filter || {}) + async getWorkcaseProcessList(filter?: TbWorkcaseProcessDTO): Promise> { + const response = await api.post(`${this.baseUrl}/process/list`, filter || {}) return response.data }, @@ -130,8 +130,8 @@ export const workcaseAPI = { * 分页查询工单处理过程 * @param pageRequest 分页请求 */ - async getWorkcaseProcessPage(pageRequest: PageRequest): Promise> { - const response = await api.post(`${this.baseUrl}/process/page`, pageRequest) + async getWorkcaseProcessPage(pageRequest: PageRequest): Promise> { + const response = await api.post(`${this.baseUrl}/process/page`, pageRequest) return response.data }, diff --git a/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts b/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts index acd17692..1a4cacee 100644 --- a/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts +++ b/urbanLifelineWeb/packages/workcase/src/types/shared.d.ts @@ -103,6 +103,8 @@ declare module 'shared/types' { export interface BaseVO extends BaseDTO { id?: string + creatorName?: string + updaterName?: string } // 重新导出 response diff --git a/urbanLifelineWeb/packages/workcase/src/types/workcase/workcase.ts b/urbanLifelineWeb/packages/workcase/src/types/workcase/workcase.ts index 23804a24..176eff2c 100644 --- a/urbanLifelineWeb/packages/workcase/src/types/workcase/workcase.ts +++ b/urbanLifelineWeb/packages/workcase/src/types/workcase/workcase.ts @@ -1,4 +1,4 @@ -import type { BaseDTO } from 'shared/types' +import type { BaseDTO, BaseVO } from 'shared/types' /** * 工单表对象 @@ -72,3 +72,23 @@ export interface TbWorkcaseDeviceDTO extends BaseDTO { /** 文件根ID */ fileRootId?: string } + +export interface WorkcaseProcessVO extends BaseVO { + /** 工单ID */ + workcaseId?: string + /** 过程ID */ + processId?: string + /** 动作 info:记录,assign:指派,redeploy:转派,repeal:撤销,finish:完成 */ + action?: 'info' | 'assign' | 'redeploy' | 'repeal' | 'finish' + /** 消息 */ + message?: string + /** 携带文件列表 */ + files?: string[] + /** 处理人(指派、转派专属) */ + processor?: string + processorName?: string + /** 创建时间 */ + createTime?: string + /** 更新时间 */ + updateTime?: string +} \ No newline at end of file diff --git a/urbanLifelineWeb/packages/workcase/src/views/admin/log/workcaseLog/WorkcaseLogView.vue b/urbanLifelineWeb/packages/workcase/src/views/admin/log/workcaseLog/WorkcaseLogView.vue index 61b6a6f2..3b0d1cdd 100644 --- a/urbanLifelineWeb/packages/workcase/src/views/admin/log/workcaseLog/WorkcaseLogView.vue +++ b/urbanLifelineWeb/packages/workcase/src/views/admin/log/workcaseLog/WorkcaseLogView.vue @@ -40,9 +40,9 @@ - + @@ -51,7 +51,11 @@ - - + + +