聊天室创建工单

This commit is contained in:
2025-12-24 19:50:38 +08:00
parent a613eb4fa1
commit 41bc41cfcd
18 changed files with 519 additions and 108 deletions

View File

@@ -47,8 +47,10 @@ public class WorkcaseController {
@PostMapping
public ResultDomain<TbWorkcaseDTO> createWorkcase(@RequestBody TbWorkcaseDTO workcase) {
ValidationResult vr = ValidationUtils.validate(workcase, Arrays.asList(
ValidationUtils.requiredString("deviceNamePlateImg", "设备名称牌图片"),
ValidationUtils.requiredString("type", "问题类型"),
ValidationUtils.requiredString("userId", "用户ID"),
ValidationUtils.requiredString("type", "问题类型")
ValidationUtils.requiredString("username", "用户名称")
));
if (!vr.isValid()) {
return ResultDomain.failure(vr.getAllErrors());

View File

@@ -10,6 +10,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.common.auth.utils.LoginUtil;
import org.xyzh.common.core.domain.ResultDomain;
import org.xyzh.common.core.page.PageDomain;
import org.xyzh.common.core.page.PageParam;
@@ -19,6 +20,8 @@ import org.xyzh.workcase.enums.WorkcaseProcessAction;
import org.xyzh.workcase.mapper.TbWorkcaseDeviceMapper;
import org.xyzh.workcase.mapper.TbWorkcaseMapper;
import org.xyzh.workcase.mapper.TbWorkcaseProcessMapper;
import org.xyzh.api.workcase.dto.TbChatRoomDTO;
import org.xyzh.api.workcase.service.ChatRoomService;
import com.alibaba.fastjson2.JSONObject;
@@ -35,11 +38,36 @@ public class WorkcaseServiceImpl implements WorkcaseService {
@Autowired
private TbWorkcaseDeviceMapper workcaseDeviceMapper;
@Autowired
private ChatRoomService chatRoomService;
// ====================== 工单管理 ======================
@Override
public ResultDomain<TbWorkcaseDTO> createWorkcase(TbWorkcaseDTO workcase) {
logger.info("创建工单: userId={}, type={}", workcase.getUserId(), workcase.getType());
logger.info("创建工单: userId={}, type={}, roomId={}", workcase.getUserId(), workcase.getType(), workcase.getRoomId());
// 如果没有 roomId先创建聊天室
boolean needCreateRoom = (workcase.getRoomId() == null || workcase.getRoomId().isEmpty());
if (needCreateRoom) {
logger.info("未提供 roomId先创建聊天室");
TbChatRoomDTO chatRoom = new TbChatRoomDTO();
chatRoom.setGuestId(workcase.getUserId());
chatRoom.setGuestName(workcase.getUsername());
chatRoom.setRoomType("workcase");
chatRoom.setRoomName("工单客服-" + workcase.getUsername());
chatRoom.setStatus("active");
chatRoom.setCreator(workcase.getCreator());
ResultDomain<TbChatRoomDTO> roomResult = chatRoomService.createChatRoom(chatRoom);
if (!roomResult.getSuccess() || roomResult.getData() == null) {
logger.error("创建聊天室失败: {}", roomResult.getMessage());
return ResultDomain.failure("创建聊天室失败: " + roomResult.getMessage());
}
workcase.setRoomId(roomResult.getData().getRoomId());
logger.info("聊天室创建成功: roomId={}", workcase.getRoomId());
}
if (workcase.getWorkcaseId() == null || workcase.getWorkcaseId().isEmpty()) {
workcase.setWorkcaseId(IdUtil.generateUUID());
@@ -53,9 +81,11 @@ public class WorkcaseServiceImpl implements WorkcaseService {
if (workcase.getEmergency() == null || workcase.getEmergency().isEmpty()) {
workcase.setEmergency("normal");
}
workcase.setCreator(LoginUtil.getCurrentUserId());
int rows = workcaseMapper.insertWorkcase(workcase);
if (rows > 0) {
// 创建工单处理记录
TbWorkcaseProcessDTO process = new TbWorkcaseProcessDTO();
process.setProcessId(IdUtil.generateUUID());
process.setOptsn(IdUtil.getOptsn());
@@ -65,9 +95,16 @@ public class WorkcaseServiceImpl implements WorkcaseService {
process.setCreator(workcase.getCreator());
workcaseProcessMapper.insertWorkcaseProcess(process);
syncWorkcaseToCrm(workcase);
sendWechatKefuWelcome(workcase);
// 如果是新创建的聊天室,更新聊天室的 workcaseId
logger.info("更新聊天室的工单ID: roomId={}, workcaseId={}", workcase.getRoomId(), workcase.getWorkcaseId());
TbChatRoomDTO updateRoom = new TbChatRoomDTO();
updateRoom.setRoomId(workcase.getRoomId());
updateRoom.setWorkcaseId(workcase.getWorkcaseId());
chatRoomService.updateChatRoom(updateRoom);
syncWorkcaseToCrm(workcase);
return ResultDomain.success("创建成功", workcase);
}
return ResultDomain.failure("创建失败");

View File

@@ -76,6 +76,7 @@
<update id="updateChatRoom" parameterType="org.xyzh.api.workcase.dto.TbChatRoomDTO">
UPDATE workcase.tb_chat_room
<set>
<if test="workcaseId != null">workcase_id = #{workcaseId},</if>
<if test="roomName != null and roomName != ''">room_name = #{roomName},</if>
<if test="roomType != null and roomType != ''">room_type = #{roomType},</if>
<if test="status != null and status != ''">status = #{status},</if>

View File

@@ -4,6 +4,7 @@
<resultMap id="BaseResultMap" type="org.xyzh.api.workcase.dto.TbWorkcaseDTO">
<id column="workcase_id" property="workcaseId" jdbcType="VARCHAR"/>
<result column="room_id" property="roomId" jdbcType="VARCHAR"/>
<result column="optsn" property="optsn" jdbcType="VARCHAR"/>
<result column="user_id" property="userId" jdbcType="VARCHAR"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
@@ -27,13 +28,13 @@
</resultMap>
<sql id="Base_Column_List">
workcase_id, optsn, user_id, username, phone, type, device, device_code, device_name_plate, device_name_plate_img,
workcase_id, room_id, optsn, user_id, username, phone, type, device, device_code, device_name_plate, device_name_plate_img,
address, description, imgs, emergency, status, processor, creator, create_time, update_time, delete_time, deleted
</sql>
<insert id="insertWorkcase" parameterType="org.xyzh.api.workcase.dto.TbWorkcaseDTO">
INSERT INTO workcase.tb_workcase (
optsn, workcase_id, user_id, username, phone, type, device_name_plate_img, creator
optsn, workcase_id, room_id, user_id, username, phone, type, device_name_plate_img, creator
<if test="device != null">, device</if>
<if test="deviceCode != null">, device_code</if>
<if test="deviceNamePlate != null">, device_name_plate</if>
@@ -44,7 +45,7 @@
<if test="status != null">, status</if>
<if test="processor != null">, processor</if>
) VALUES (
#{optsn}, #{workcaseId}, #{userId}, #{username}, #{phone}, #{type}, #{deviceNamePlateImg}, #{creator}
#{optsn}, #{workcaseId}, #{roomId}, #{userId}, #{username}, #{phone}, #{type}, #{deviceNamePlateImg}, #{creator}
<if test="device != null">, #{device}</if>
<if test="deviceCode != null">, #{deviceCode}</if>
<if test="deviceNamePlate != null">, #{deviceNamePlate}</if>