From bdb10a16c0b5e1dbe9eb3e962995f9085f68790e Mon Sep 17 00:00:00 2001 From: La123123 <617330105@qq.com> Date: Mon, 13 Apr 2026 11:25:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E5=9B=9E=E5=A4=8D=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- im-admin-ui/src/views/im/customer/index.vue | 10 +- im-admin-ui/src/views/im/quickReply/index.vue | 188 ++++++++++-------- .../dromara/im/domain/vo/ImQuickReplyVo.java | 6 + .../service/impl/ImQuickReplyServiceImpl.java | 13 +- 4 files changed, 126 insertions(+), 91 deletions(-) diff --git a/im-admin-ui/src/views/im/customer/index.vue b/im-admin-ui/src/views/im/customer/index.vue index de9abc0..bade0f3 100644 --- a/im-admin-ui/src/views/im/customer/index.vue +++ b/im-admin-ui/src/views/im/customer/index.vue @@ -25,8 +25,8 @@ 新增 - - 当前客服数量:{{ total }} + + 当前客服数量:{{ total }} @@ -99,9 +99,6 @@ - - - + + - + - - + + - + {{ scope.row.replyContent }} + + + - + - + - + - + - + - - - + + + - + - - + + + + + + + - + @@ -135,44 +139,62 @@ const dialog = reactive({ const initFormData: QuickReplyForm = { id: undefined, replyName: undefined, - replyType: undefined, + replyType: 0, replyTitle: undefined, replyContent: undefined, - remark: undefined, -} + remark: undefined +}; const data = reactive>({ - form: {...initFormData}, + form: { ...initFormData }, queryParams: { pageNum: 1, pageSize: 10, replyName: undefined, replyType: undefined, replyTitle: undefined, - replyContent: undefined, - params: { - } + params: {} }, rules: { - id: [ - { required: true, message: "主键ID不能为空", trigger: "blur" } - ], - replyName: [ - { required: true, message: "快捷回复名称不能为空", trigger: "blur" } - ], - replyType: [ - { required: true, message: "0-文本,1-图片不能为空", trigger: "change" } - ], - replyTitle: [ - { required: true, message: "快捷回复标题不能为空", trigger: "blur" } - ], + id: [{ required: true, message: '主键ID不能为空', trigger: 'blur' }], + replyName: [{ required: true, message: '快捷回复名称不能为空', trigger: 'blur' }], + replyType: [{ required: true, message: '回复类型不能为空', trigger: 'change' }], + replyTitle: [{ required: true, message: '快捷回复标题不能为空', trigger: 'blur' }], replyContent: [ - { required: true, message: "快捷回复内容不能为空", trigger: "blur" } - ], + { required: true, message: '快捷回复内容不能为空', trigger: 'blur' }, + { validator: validateReplyContent, trigger: 'blur' } + ] } }); const { queryParams, form, rules } = toRefs(data); +// 添加一个验证函数来处理不同类型的内容验证 +function validateReplyContent(rule: any, value: any, callback: any) { + if (form.value.replyType === 0) { + // 如果是文本类型,验证文本长度 + if (!value) { + callback(new Error('请填写文本内容')); + } else if (value.length > 500) { + callback(new Error('文本内容不能超过500个字符')); + } else { + callback(); + } + } else { + // 如果是图片类型,验证图片是否存在 + if (!value) { + callback(new Error('请选择要上传的图片')); + } else { + callback(); + } + } +} + +/** 处理类型改变事件 */ +const handleTypeChange = () => { + // 当类型改变时,清空内容字段 + form.value.replyContent = undefined; +}; + /** 查询快捷回复列表 */ const getList = async () => { loading.value = true; @@ -180,55 +202,55 @@ const getList = async () => { quickReplyList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 取消按钮 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 表单重置 */ const reset = () => { - form.value = {...initFormData}; + form.value = { ...initFormData }; quickReplyFormRef.value?.resetFields(); -} +}; /** 搜索按钮操作 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 重置按钮操作 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 多选框选中数据 */ const handleSelectionChange = (selection: QuickReplyVO[]) => { - ids.value = selection.map(item => item.id); + ids.value = selection.map((item) => item.id); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 新增按钮操作 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "添加快捷回复"; -} + dialog.title = '添加快捷回复'; +}; /** 修改按钮操作 */ const handleUpdate = async (row?: QuickReplyVO) => { reset(); - const _id = row?.id || ids.value[0] + const _id = row?.id || ids.value[0]; const res = await getQuickReply(_id); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "修改快捷回复"; -} + dialog.title = '修改快捷回复'; +}; /** 提交按钮 */ const submitForm = () => { @@ -236,32 +258,36 @@ const submitForm = () => { if (valid) { buttonLoading.value = true; if (form.value.id) { - await updateQuickReply(form.value).finally(() => buttonLoading.value = false); + await updateQuickReply(form.value).finally(() => (buttonLoading.value = false)); } else { - await addQuickReply(form.value).finally(() => buttonLoading.value = false); + await addQuickReply(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("操作成功"); + proxy?.$modal.msgSuccess('操作成功'); dialog.visible = false; await getList(); } }); -} +}; /** 删除按钮操作 */ const handleDelete = async (row?: QuickReplyVO) => { const _ids = row?.id || ids.value; - await proxy?.$modal.confirm('是否确认删除快捷回复编号为"' + _ids + '"的数据项?').finally(() => loading.value = false); + await proxy?.$modal.confirm('是否确认删除快捷回复编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false)); await delQuickReply(_ids); - proxy?.$modal.msgSuccess("删除成功"); + proxy?.$modal.msgSuccess('删除成功'); await getList(); -} +}; /** 导出按钮操作 */ const handleExport = () => { - proxy?.download('im/quickReply/export', { - ...queryParams.value - }, `quickReply_${new Date().getTime()}.xlsx`) -} + proxy?.download( + 'im/quickReply/export', + { + ...queryParams.value + }, + `quickReply_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { getList(); diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImQuickReplyVo.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImQuickReplyVo.java index 83577e7..6afe1f4 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImQuickReplyVo.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/domain/vo/ImQuickReplyVo.java @@ -63,5 +63,11 @@ public class ImQuickReplyVo implements Serializable { @ExcelProperty(value = "快捷回复内容") private String replyContent; + /** + * 快捷回复内容 + */ + @ExcelProperty(value = "备注") + private String remark; + } diff --git a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImQuickReplyServiceImpl.java b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImQuickReplyServiceImpl.java index 579aa09..b910707 100644 --- a/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImQuickReplyServiceImpl.java +++ b/im-admin/ruoyi-im/src/main/java/org/dromara/im/service/impl/ImQuickReplyServiceImpl.java @@ -108,11 +108,18 @@ public class ImQuickReplyServiceImpl implements IImQuickReplyService { public Boolean insertByBo(ImQuickReplyBo bo) { ImQuickReply add = MapstructUtils.convert(bo, ImQuickReply.class); + if (add == null) { + return false; + } + + add.setCreatorId(LoginHelper.getUserId()); + add.setCreatedTime(DateUtil.date()); + add.setUpdaterId(LoginHelper.getUserId()); + add.setUpdatedTime(DateUtil.date()); + // 如果不是超级管理员,则设置 uniqueToken if(!LoginHelper.isSuperAdmin()) { - if (add != null) { - add.setUniqueToken(imAgentService.getTokenByUserId()); - } + add.setUniqueToken(imAgentService.getTokenByUserId()); } validEntityBeforeSave(add);