5383736709760a8d4e3d958ba42a472e2d040568.svn-base 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <template>
  2. <a-card :bordered="false">
  3. <a-spin :spinning="loading">
  4. <a-form-model ref="form" :model="model" :rules="rules">
  5. <a-tabs>
  6. <a-tab-pane tab="消息选项" key="1">
  7. <a-form-model-item label="测试APP" prop="app" :labelCol="labelCol" :wrapperCol="wrapperCol">
  8. <a-select v-model="model.app" placeholder="请选择测试APP" :options="appOptions"/>
  9. </a-form-model-item>
  10. <a-form-model-item label="发送给所有人" prop="sendAll" :labelCol="labelCol" :wrapperCol="wrapperCol">
  11. <a-switch checkedChildren="是" unCheckedChildren="否" v-model="model.sendAll" @change="onSendAllChange"/>
  12. </a-form-model-item>
  13. <a-form-model-item label="接收人" prop="receiver" :labelCol="labelCol" :wrapperCol="wrapperCol">
  14. <j-select-multi-user v-model="model.receiver" :disabled="model.sendAll" placeholder="请选择接收人"/>
  15. </a-form-model-item>
  16. <a-form-model-item label="消息内容" prop="content" :labelCol="labelCol" :wrapperCol="wrapperCol">
  17. <a-textarea :rows="5" v-model="model.content" placeholder="请输入消息内容"/>
  18. </a-form-model-item>
  19. <div style="text-align: center;">
  20. <a-button type="primary" size="large" @click="onSend" style="width: 120px;">发送</a-button>
  21. </div>
  22. </a-tab-pane>
  23. </a-tabs>
  24. <a-tabs>
  25. <a-tab-pane tab="测试结果(刷新自动清空)" key="1">
  26. <a-table
  27. rowKey="id"
  28. bordered
  29. size="middle"
  30. :columns="columns"
  31. :dataSource="dataSource"
  32. >
  33. <div slot="action" slot-scope="text, record">
  34. <template v-if="record.app==='DINGTALK'">
  35. <a-popconfirm v-if="!record.recalled" title="确定吗?" @confirm="handleRecall(record)">
  36. <a @click="">撤回</a>
  37. </a-popconfirm>
  38. <span v-else>已撤回</span>
  39. </template>
  40. <template v-else>-</template>
  41. </div>
  42. </a-table>
  43. </a-tab-pane>
  44. </a-tabs>
  45. </a-form-model>
  46. </a-spin>
  47. </a-card>
  48. </template>
  49. <script>
  50. import { loadEnabledTypes } from '@/components/jeecgbiz/thirdApp/JThirdAppButton'
  51. import { postAction } from '@/api/manage'
  52. import { randomUUID } from '@/utils/util'
  53. export default {
  54. name: 'ThirdAppMessageTest',
  55. data() {
  56. return {
  57. loading: false,
  58. labelCol: {span: 6},
  59. wrapperCol: {span: 12},
  60. model: {
  61. sendAll: false,
  62. },
  63. enabledTypes: {},
  64. columns: [
  65. {
  66. title: '#',
  67. dataIndex: '',
  68. key: 'rowIndex',
  69. width: 60,
  70. align: 'center',
  71. customRender: (t, r, index) => {
  72. return this.dataSource.length - index
  73. }
  74. },
  75. {
  76. title: '测试APP',
  77. align: 'center',
  78. dataIndex: 'app',
  79. customRender: (t, r, index) => {
  80. if (t === 'WECHAT_ENTERPRISE') {
  81. return '企业微信'
  82. }
  83. if (t === 'DINGTALK') {
  84. return '钉钉'
  85. } else {
  86. return t
  87. }
  88. }
  89. },
  90. {
  91. title: '接收人',
  92. align: 'center',
  93. dataIndex: 'receiver',
  94. customRender: (t, r, index) => {
  95. return r.sendAll ? '【全体】' : t
  96. }
  97. },
  98. {
  99. title: '消息内容',
  100. align: 'center',
  101. dataIndex: 'content'
  102. },
  103. {
  104. title: 'response',
  105. align: 'center',
  106. dataIndex: 'response'
  107. },
  108. {
  109. title: '操作',
  110. dataIndex: 'action',
  111. align: 'center',
  112. fixed: 'right',
  113. width: 80,
  114. scopedSlots: {customRender: 'action'}
  115. }
  116. ],
  117. dataSource: [],
  118. }
  119. },
  120. computed: {
  121. rules() {
  122. return {
  123. app: [{required: true, message: '请选择测试APP'}],
  124. url: [{required: this.show, message: '请输入菜单路径!'}],
  125. receiver: [{required: !this.model.sendAll, message: '请选择接收人'}],
  126. content: [{required: true, message: '消息内容不能为空'}]
  127. }
  128. },
  129. appOptions() {
  130. return [
  131. {
  132. label: `企业微信${this.enabledTypes.wechatEnterprise ? '' : '(已禁用)'}`,
  133. value: 'WECHAT_ENTERPRISE',
  134. disabled: !this.enabledTypes.wechatEnterprise
  135. },
  136. {
  137. label: `钉钉${this.enabledTypes.dingtalk ? '' : '(已禁用)'}`,
  138. value: 'DINGTALK',
  139. disabled: !this.enabledTypes.dingtalk
  140. },
  141. ]
  142. },
  143. },
  144. created() {
  145. this.loadEnabledTypes()
  146. },
  147. methods: {
  148. // 获取启用的第三方App
  149. async loadEnabledTypes() {
  150. this.enabledTypes = await loadEnabledTypes()
  151. },
  152. onSendAllChange() {
  153. this.$refs.form.clearValidate('receiver')
  154. },
  155. onSend() {
  156. this.$refs.form.validate((ok, err) => {
  157. if (ok) {
  158. this.loading = true
  159. postAction('/sys/thirdApp/sendMessageTest', this.model).then(({success, result, message}) => {
  160. if (success) {
  161. let response = ''
  162. try {
  163. response = JSON.stringify(result)
  164. } catch (e) {
  165. response = result
  166. }
  167. this.dataSource.unshift(Object.assign({id: randomUUID()}, this.model, {response}))
  168. } else {
  169. this.$message.warning(message)
  170. }
  171. }).finally(() => this.loading = false)
  172. }
  173. })
  174. },
  175. handleRecall(record) {
  176. try {
  177. let response = JSON.parse(record.response)
  178. postAction('/sys/thirdApp/recallMessageTest', {
  179. app: record.app,
  180. msg_task_id: response.result
  181. }).then(res => {
  182. if (res.success) {
  183. this.$set(record, 'recalled', true)
  184. this.$message.success(res.message)
  185. } else {
  186. this.$message.warning(res.message)
  187. }
  188. }).catch(e => this.$message.warning(e.message || e))
  189. } catch (e) {
  190. this.$message.warning(e.message || e)
  191. }
  192. },
  193. },
  194. }
  195. </script>
  196. <style scoped>
  197. </style>