From 3383183e3b7ee12f0bcef920288b8a819f018e3e Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Sat, 28 Jan 2023 16:06:33 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E9=80=9A=E7=9F=A5=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF,=E6=96=B0=E5=A2=9E=E5=8F=98=E9=87=8F=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/AIcon/index.tsx | 3 +- .../Detail/components/VariableDefinitions.vue | 138 ++++++++++++++++++ src/views/notice/Template/Detail/index.vue | 60 +++++++- 3 files changed, 198 insertions(+), 3 deletions(-) create mode 100644 src/views/notice/Template/Detail/components/VariableDefinitions.vue diff --git a/src/components/AIcon/index.tsx b/src/components/AIcon/index.tsx index 02e6d8a2..604aa3fe 100644 --- a/src/components/AIcon/index.tsx +++ b/src/components/AIcon/index.tsx @@ -26,7 +26,8 @@ const iconKeys = [ 'ExportOutlined', 'SyncOutlined', 'ExclamationCircleOutlined', - 'UploadOutlined' + 'UploadOutlined', + 'QuestionCircleOutlined' ] const Icon = (props: {type: string}) => { diff --git a/src/views/notice/Template/Detail/components/VariableDefinitions.vue b/src/views/notice/Template/Detail/components/VariableDefinitions.vue new file mode 100644 index 00000000..249fe830 --- /dev/null +++ b/src/views/notice/Template/Detail/components/VariableDefinitions.vue @@ -0,0 +1,138 @@ + + + + + + diff --git a/src/views/notice/Template/Detail/index.vue b/src/views/notice/Template/Detail/index.vue index 9699ee50..610ad87d 100644 --- a/src/views/notice/Template/Detail/index.vue +++ b/src/views/notice/Template/Detail/index.vue @@ -418,6 +418,34 @@ + + + + + + formData.value.template.message, + (val) => { + if (!val) return; + // 已经存在的变量 + const oldKey = formData.value.variableDefinitions?.map((m) => m.id); + // 正则提取${}里面的值 + const pattern = /(?<=\$\{).*?(?=\})/g; + const titleList = val.match(pattern)?.filter((f) => f); + const newKey = [...new Set(titleList)]; + const result = newKey?.map((m) => + oldKey.includes(m) + ? formData.value.variableDefinitions.find( + (item) => item.id === m, + ) + : { + id: m, + name: '', + type: 'string', + format: '%s', + }, + ); + formData.value.variableDefinitions = result; + }, + { deep: true }, +); + const getDetail = async () => { const res = await templateApi.detail(route.params.id as string); // console.log('res: ', res); @@ -589,9 +645,9 @@ const handleSubmit = () => { // test watch( - () => formData.value.template, + () => formData.value, (val) => { - console.log('formData.value.template: ', val); + console.log('formData.value: ', val); }, { deep: true }, ); From b45f6f087aa65794215407ea77aa68d5850ae3b5 Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Sat, 28 Jan 2023 16:25:31 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notice/Template/Detail/components/VariableDefinitions.vue | 4 +--- src/views/notice/Template/Detail/index.vue | 3 ++- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/views/notice/Template/Detail/components/VariableDefinitions.vue b/src/views/notice/Template/Detail/components/VariableDefinitions.vue index 249fe830..f167289c 100644 --- a/src/views/notice/Template/Detail/components/VariableDefinitions.vue +++ b/src/views/notice/Template/Detail/components/VariableDefinitions.vue @@ -113,14 +113,12 @@ const dataSource = computed({ watch( () => dataSource.value, (val) => { - console.log('dataSource.value : ', val); - emit('update:variableDefinitions', val) + emit('update:variableDefinitions', val); }, { deep: true }, ); const handleTypeChange = (record: IVariable) => { - console.log('record.type: ', record.type); switch (record.type) { case 'string': record.format = '%s'; diff --git a/src/views/notice/Template/Detail/index.vue b/src/views/notice/Template/Detail/index.vue index 610ad87d..74c9f554 100644 --- a/src/views/notice/Template/Detail/index.vue +++ b/src/views/notice/Template/Detail/index.vue @@ -534,7 +534,7 @@ watch( ); computed(() => { - console.log('formData.value.type: ', formData.value.type); + // console.log('formData.value.type: ', formData.value.type); Object.assign( formData.value.template, TEMPLATE_FIELD_MAP[formData.value.type][formData.value.provider], @@ -576,6 +576,7 @@ const { resetFields, validate, validateInfos, clearValidate } = useForm( watch( () => formData.value.type, () => { + formData.value.variableDefinitions = [] clearValidate(); }, { deep: true }, From 6b5bd5ee257fc92103cff27638390a15aef31149 Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Sat, 28 Jan 2023 17:12:58 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20=E9=80=9A=E7=9F=A5=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=8E=A5=E5=8F=A3=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notice/config.ts | 3 + src/components/RadioCard/index.vue | 6 +- src/views/notice/Template/Detail/index.vue | 65 +++++++++++++--------- src/views/notice/Template/types.d.ts | 22 +++++++- 4 files changed, 69 insertions(+), 27 deletions(-) diff --git a/src/api/notice/config.ts b/src/api/notice/config.ts index 9ed55cf8..ff653f67 100644 --- a/src/api/notice/config.ts +++ b/src/api/notice/config.ts @@ -1,8 +1,11 @@ import { patch, post, get } from '@/utils/request' +import { BindConfig } from '@/views/notice/Template/types' export default { // 列表 list: (data: any) => post(`/notifier/config/_query`, data), + // 不分页列表 + listNoPage: (data: any) => post(`/notifier/config/_query/no-paging?paging=false`, data), // 详情 detail: (id: string): any => get(`/notifier/config/${id}`), // 新增 diff --git a/src/components/RadioCard/index.vue b/src/components/RadioCard/index.vue index 2d27ba0b..152ae840 100644 --- a/src/components/RadioCard/index.vue +++ b/src/components/RadioCard/index.vue @@ -25,6 +25,7 @@ interface IOption { type Emits = { (e: 'update:modelValue', data: string): void; + (e: 'change') :void }; const emit = defineEmits(); @@ -41,7 +42,10 @@ const props = defineProps({ const myValue = computed({ get: () => props.modelValue, - set: (val) => emit('update:modelValue', val), + set: (val) => { + emit('update:modelValue', val) + emit('change') + }, }); diff --git a/src/views/notice/Template/Detail/index.vue b/src/views/notice/Template/Detail/index.vue index 74c9f554..507b3b54 100644 --- a/src/views/notice/Template/Detail/index.vue +++ b/src/views/notice/Template/Detail/index.vue @@ -39,6 +39,7 @@ - {{ item.label }} + {{ item.name }} @@ -246,17 +247,11 @@ - - {{ item.label }} - - + /> formData.value.type, () => { - formData.value.variableDefinitions = [] + formData.value.variableDefinitions = []; clearValidate(); }, { deep: true }, @@ -609,6 +607,9 @@ watch( { deep: true }, ); +/** + * 获取详情 + */ const getDetail = async () => { const res = await templateApi.detail(route.params.id as string); // console.log('res: ', res); @@ -617,6 +618,20 @@ const getDetail = async () => { }; // getDetail(); +/** + * 获取绑定配置 + */ +const configList = ref(); +const getConfigList = async () => { + const terms = [ + { column: 'type$IN', value: formData.value.type }, + { column: 'provider', value: formData.value.provider }, + ]; + const { result } = await configApi.listNoPage({ terms }); + configList.value = result; +}; +getConfigList(); + /** * 表单提交 */ @@ -626,17 +641,17 @@ const handleSubmit = () => { .then(async () => { console.log('formData.value: ', formData.value); btnLoading.value = true; - // let res; - // if (!formData.value.id) { - // res = await templateApi.save(formData.value); - // } else { - // res = await templateApi.update(formData.value); - // } - // // console.log('res: ', res); - // if (res?.success) { - // message.success('保存成功'); - // router.back(); - // } + let res; + if (!formData.value.id) { + res = await templateApi.save(formData.value); + } else { + res = await templateApi.update(formData.value); + } + // console.log('res: ', res); + if (res?.success) { + message.success('保存成功'); + router.back(); + } btnLoading.value = false; }) .catch((err) => { diff --git a/src/views/notice/Template/types.d.ts b/src/views/notice/Template/types.d.ts index 7eaa8850..b48cd773 100644 --- a/src/views/notice/Template/types.d.ts +++ b/src/views/notice/Template/types.d.ts @@ -71,4 +71,24 @@ export type TemplateFormData = { creatorId?: string; createTime?: number; configId?: string; -}; \ No newline at end of file +}; + +// 绑定配置类型 +export type config = { + host: string; + password: string; + port: number; + sender: string; + ssl: boolean; + username: string; +} +export type BindConfig = { + configuration: config; + createTime: number + creatorId: string; + id: string; + maxRetryTimes: number; + name: string; + provider: string; + type: string +} \ No newline at end of file From 841fa8433a65db7505b8253654fc1b7ee226c8df Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Sat, 28 Jan 2023 17:51:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=E9=80=9A=E7=9F=A5=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/notice/config.ts | 32 ++++++++++++++++++---- src/api/notice/template.ts | 19 +++++++++++-- src/views/notice/Template/Detail/index.vue | 6 ++-- src/views/notice/Template/types.d.ts | 23 +++++++++------- 4 files changed, 59 insertions(+), 21 deletions(-) diff --git a/src/api/notice/config.ts b/src/api/notice/config.ts index ff653f67..d6e29cc5 100644 --- a/src/api/notice/config.ts +++ b/src/api/notice/config.ts @@ -1,15 +1,37 @@ -import { patch, post, get } from '@/utils/request' -import { BindConfig } from '@/views/notice/Template/types' +import { patch, post, get, remove } from '@/utils/request' export default { // 列表 list: (data: any) => post(`/notifier/config/_query`, data), - // 不分页列表 - listNoPage: (data: any) => post(`/notifier/config/_query/no-paging?paging=false`, data), // 详情 detail: (id: string): any => get(`/notifier/config/${id}`), // 新增 save: (data: any) => post(`/notifier/config`, data), // 修改 - update: (data: any) => patch(`/notifier/config`, data) + update: (data: any) => patch(`/notifier/config`, data), + del: (id: string) => remove(`/notifier/config/${id}`), + getTemplate: (data: any, id: string) => post(`/notifier/template/${id}/_query`, data), + getTemplateDetail: (id: string) => get(`/notifier/template/${id}/detail`), + debug: (data: any, configId: string, templateId: string) => post(`/notifier/${configId}/${templateId}/_send`, data), + getHistory: (data: any, id: string) => post(`/notify/history/config/${id}/_query`, data), + // 获取所有平台用户 + getPlatformUsers: () => post(`/user/_query/no-paging`, { paging: false }), + // 钉钉部门 + dingTalkDept: (id: string) => get(`/notifier/dingtalk/corp/${id}/departments/tree`), + // 钉钉部门人员 + getDingTalkUsers: (configId: string, deptId: string) => get(`/notifier/dingtalk/corp/${configId}/${deptId}/users`), + // 钉钉已经绑定的人员 + getDingTalkBindUsers: (id: string) => get(`/user/third-party/dingTalk_dingTalkMessage/${id}`), + // 钉钉绑定用户 + dingTalkBindUser: (data: any, id: string) => patch(`/user/third-party/dingTalk_dingTalkMessage/${id}`, data), + // 微信部门 + weChatDept: (id: string) => get(`/notifier/wechat/corp/${id}/departments`), + // 微信部门人员 + getWeChatUsers: (configId: string, deptId: string) => get(`/notifier/wechat/corp/${configId}/${deptId}/users`), + // 微信已经绑定的人员 + getWeChatBindUsers: (id: string) => get(`/user/third-party/weixin_corpMessage/${id}`), + // 微信绑定用户 + weChatBindUser: (data: any, id: string) => patch(`/user/third-party/weixin_corpMessage/${id}`, data), + // 解绑 + unBindUser: (data: any, id: string) => post(`/user/third-party/${id}/_unbind`, data) } \ No newline at end of file diff --git a/src/api/notice/template.ts b/src/api/notice/template.ts index b49dbd8b..7281501f 100644 --- a/src/api/notice/template.ts +++ b/src/api/notice/template.ts @@ -1,4 +1,5 @@ -import { patch, post, get } from '@/utils/request' +import { patch, post, get, remove } from '@/utils/request' +import { BindConfig } from '@/views/notice/Template/types' export default { // 列表 @@ -8,5 +9,19 @@ export default { // 新增 save: (data: any) => post(`/notifier/template`, data), // 修改 - update: (data: any) => patch(`/notifier/template`, data) + update: (data: any) => patch(`/notifier/template`, data), + del: (id: any) => remove(`/notifier/template/${id}`), + getConfig: (data: any) => post(`/notifier/config/_query/no-paging?paging=false`, data), + getTemplateDetail: (id: string) => get(`/notifier/template/${id}/detail`), + debug: (data: any, configId: string, templateId: string) => post(`/notifier/${configId}/${templateId}/_send`, data), + getHistory: (data: any, id: string) => post(`/notify/history/template/${id}/_query`, data), + // 钉钉/微信, 根据配置获取部门和用户 + getDept: (type: string, id: string) => get(`/notifier/${type}/corp/${id}/departments`), + getUser: (type: string, id: string) => get(`/notifier/${type}/corp/${id}/users`), + // 微信获取标签推送 + getTags: (id: string) => get(`/notifier/wechat/corp/${id}/tags`), + // 语音/短信获取阿里云模板 + getAliTemplate: (id: string) => get(`/notifier/sms/aliyun/${id}/templates`), + // 短信获取签名 + getSigns: (id: string) => get(`/notifier/sms/aliyun/${id}/signs`) } \ No newline at end of file diff --git a/src/views/notice/Template/Detail/index.vue b/src/views/notice/Template/Detail/index.vue index 507b3b54..f32d3ed2 100644 --- a/src/views/notice/Template/Detail/index.vue +++ b/src/views/notice/Template/Detail/index.vue @@ -121,8 +121,7 @@ > @@ -483,7 +482,6 @@ import { VOICE_TYPE, } from '@/views/notice/const'; import templateApi from '@/api/notice/template'; -import configApi from '@/api/notice/config'; import Doc from './doc/index'; import MonacoEditor from '@/components/MonacoEditor/index.vue'; import Attachments from './components/Attachments.vue'; @@ -627,7 +625,7 @@ const getConfigList = async () => { { column: 'type$IN', value: formData.value.type }, { column: 'provider', value: formData.value.provider }, ]; - const { result } = await configApi.listNoPage({ terms }); + const { result } = await templateApi.getConfig({ terms }); configList.value = result; }; getConfigList(); diff --git a/src/views/notice/Template/types.d.ts b/src/views/notice/Template/types.d.ts index b48cd773..160924a2 100644 --- a/src/views/notice/Template/types.d.ts +++ b/src/views/notice/Template/types.d.ts @@ -16,6 +16,17 @@ interface IVariableDefinitions { format: string; } +interface IMarkDown { + text: string; + title: string; +} +interface ILink { + title: string; + picUrl: string; + messageUrl: string; + text: string; +} + export type TemplateFormData = { template: { // 钉钉消息 @@ -23,16 +34,8 @@ export type TemplateFormData = { message?: string; // 钉钉机器人 messageType?: string; - markdown?: { - text: string; - title: string; - }; - link?: { - title: string; - picUrl: string; - messageUrl: string; - text: string; - }; + markdown?: IMarkDown; + link?: ILink; // 微信 // agentId?: string; // message?: string; From 9f87a92f0aeed0830282bfc0be1932720a71fd7d Mon Sep 17 00:00:00 2001 From: JiangQiming <291854119@qq.com> Date: Sat, 28 Jan 2023 18:04:49 +0800 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/notice/Template/Detail/index.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/views/notice/Template/Detail/index.vue b/src/views/notice/Template/Detail/index.vue index f32d3ed2..4db6e5ec 100644 --- a/src/views/notice/Template/Detail/index.vue +++ b/src/views/notice/Template/Detail/index.vue @@ -637,7 +637,7 @@ const btnLoading = ref(false); const handleSubmit = () => { validate() .then(async () => { - console.log('formData.value: ', formData.value); + // console.log('formData.value: ', formData.value); btnLoading.value = true; let res; if (!formData.value.id) { @@ -650,10 +650,10 @@ const handleSubmit = () => { message.success('保存成功'); router.back(); } - btnLoading.value = false; }) .catch((err) => { console.log('err: ', err); + btnLoading.value = false; }); };