SysAnnouncementModal.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <template>
  2. <a-modal
  3. :title="title"
  4. :width="900"
  5. :visible="visible"
  6. :confirmLoading="confirmLoading"
  7. @ok="handleOk"
  8. @cancel="handleCancel"
  9. :okButtonProps="{ props: {disabled: disabled} }"
  10. cancelText="关闭">
  11. <a-spin :spinning="confirmLoading">
  12. <a-form :form="form">
  13. <a-row style="width: 100%;">
  14. <a-col :span="24/2">
  15. <a-form-item
  16. :labelCol="labelCol"
  17. :wrapperCol="wrapperCol"
  18. label="标题">
  19. <a-input placeholder="请输入标题" v-decorator="['titile', validatorRules.title]" :readOnly="disableSubmit"/>
  20. </a-form-item>
  21. </a-col>
  22. <a-col :span="24/2">
  23. <a-form-item
  24. :labelCol="labelCol"
  25. :wrapperCol="wrapperCol"
  26. label="消息类型">
  27. <a-select
  28. v-decorator="[ 'msgCategory', validatorRules.msgCategory]"
  29. placeholder="请选择消息类型"
  30. :disabled="disableSubmit"
  31. :getPopupContainer="(target) => target.parentNode">
  32. <a-select-option value="1">通知公告</a-select-option>
  33. <a-select-option value="2">系统消息</a-select-option>
  34. </a-select>
  35. </a-form-item>
  36. </a-col>
  37. </a-row>
  38. <a-row style="width: 100%;">
  39. <a-col :span="24/2">
  40. <a-form-item
  41. :labelCol="labelCol"
  42. :wrapperCol="wrapperCol"
  43. label="开始时间:">
  44. <j-date
  45. style="width: 100%"
  46. :getCalendarContainer="node => node.parentNode"
  47. v-decorator="[ 'startTime', validatorRules.startTime]"
  48. placeholder="请选择开始时间"
  49. ></j-date>
  50. </a-form-item>
  51. </a-col>
  52. <a-col :span="24/2">
  53. <a-form-item
  54. :labelCol="labelCol"
  55. :wrapperCol="wrapperCol"
  56. label="结束时间"
  57. class="endTime">
  58. <j-date
  59. style="width: 100%"
  60. :getCalendarContainer="node => node.parentNode"
  61. v-decorator="[ 'endTime', validatorRules.endTime]"
  62. placeholder="请选择结束时间"
  63. ></j-date>
  64. </a-form-item>
  65. </a-col>
  66. </a-row>
  67. <a-row style="width: 100%;">
  68. <a-col :span="24/2">
  69. <a-form-item
  70. :labelCol="labelCol"
  71. :wrapperCol="wrapperCol"
  72. label="优先级">
  73. <a-select
  74. v-decorator="[ 'priority', {}]"
  75. placeholder="请选择优先级"
  76. :disabled="disableSubmit"
  77. :getPopupContainer="(target) => target.parentNode">
  78. <a-select-option value="L">低</a-select-option>
  79. <a-select-option value="M">中</a-select-option>
  80. <a-select-option value="H">高</a-select-option>
  81. </a-select>
  82. </a-form-item>
  83. </a-col>
  84. <a-col :span="24/2">
  85. <a-form-item
  86. :labelCol="labelCol"
  87. :wrapperCol="wrapperCol"
  88. label="通告类型">
  89. <a-select
  90. v-decorator="[ 'msgType', validatorRules.msgType]"
  91. placeholder="请选择通告类型"
  92. :disabled="disableSubmit"
  93. @change="chooseMsgType"
  94. :getPopupContainer="(target) => target.parentNode">
  95. <a-select-option value="USER">指定用户</a-select-option>
  96. <a-select-option value="ALL">全体用户</a-select-option>
  97. </a-select>
  98. </a-form-item>
  99. </a-col>
  100. </a-row>
  101. <a-row style="width: 100%;">
  102. <a-col :span="24/2">
  103. <a-form-item
  104. :labelCol="labelCol"
  105. :wrapperCol="wrapperCol"
  106. label="指定用户"
  107. v-if="userType">
  108. <a-select
  109. mode="multiple"
  110. placeholder="请选择用户"
  111. v-model="selectedUser"
  112. @dropdownVisibleChange="selectUserIds"
  113. >
  114. </a-select>
  115. </a-form-item>
  116. </a-col>
  117. </a-row>
  118. <a-row style="width: 100%;">
  119. <a-col :span="24">
  120. <a-form-item
  121. :labelCol="labelColX1"
  122. :wrapperCol="wrapperColX1"
  123. label="内容"
  124. class="j-field-content">
  125. <j-editor v-decorator="[ 'msgContent', {} ]" triggerChange></j-editor>
  126. </a-form-item>
  127. </a-col>
  128. </a-row>
  129. </a-form>
  130. </a-spin>
  131. <select-user-list-modal ref="UserListModal" @choseUser="choseUser"></select-user-list-modal>
  132. </a-modal>
  133. </template>
  134. <script>
  135. import { httpAction, getAction } from '@/api/manage'
  136. import pick from 'lodash.pick'
  137. import JDate from '@/components/jeecg/JDate'
  138. import JEditor from '@/components/jeecg/JEditor'
  139. import SelectUserListModal from './SelectUserListModal'
  140. import moment from 'moment'
  141. export default {
  142. components: { JEditor, JDate, SelectUserListModal },
  143. name: 'SysAnnouncementModal',
  144. data () {
  145. return {
  146. title: '操作',
  147. visible: false,
  148. disableSubmit: false,
  149. model: {},
  150. labelCol: {
  151. xs: { span: 24 },
  152. sm: { span: 6 }
  153. },
  154. wrapperCol: {
  155. xs: { span: 24 },
  156. sm: { span: 18 }
  157. },
  158. labelColX1: {
  159. xs: { span: 24 },
  160. sm: { span: 3 }
  161. },
  162. wrapperColX1: {
  163. xs: { span: 24 },
  164. sm: { span: 21 }
  165. },
  166. confirmLoading: false,
  167. form: this.$form.createForm(this),
  168. validatorRules: {
  169. title: { rules: [{ required: true, message: '请输入标题!' }] },
  170. msgCategory: { rules: [{ required: true, message: '请选择消息类型!' }] },
  171. msgType: { rules: [{ required: true, message: '请选择通告对象类型!' }] },
  172. endTime: { rules: [{ validator: this.endTimeValidate }] },
  173. startTime: { rules: [{ validator: this.startTimeValidate }] }
  174. },
  175. url: {
  176. queryByIds: '/sys/user/queryByIds',
  177. add: '/sys/annountCement/add',
  178. edit: '/sys/annountCement/edit'
  179. },
  180. userType: false,
  181. userIds: [],
  182. selectedUser: [],
  183. disabled: false,
  184. msgContent: ''
  185. }
  186. },
  187. created () {
  188. },
  189. methods: {
  190. add () {
  191. this.edit({})
  192. },
  193. edit (record) {
  194. this.form.resetFields()
  195. this.model = {}
  196. this.disable = false
  197. this.visible = true
  198. this.getUser(record)
  199. },
  200. getUser (record) {
  201. this.model = Object.assign({}, record)
  202. // 指定用户
  203. if (record && record.msgType === 'USER') {
  204. this.userType = true
  205. this.userIds = record.userIds
  206. getAction(this.url.queryByIds, { userIds: this.userIds }).then((res) => {
  207. if (res.success) {
  208. for (var i = 0; i < res.result.length; i++) {
  209. this.selectedUser.push(res.result[i].realname)
  210. }
  211. this.$refs.UserListModal.edit(res.result, this.userIds)
  212. }
  213. })
  214. }
  215. this.$nextTick(() => {
  216. this.form.setFieldsValue(pick(this.model, 'endTime', 'startTime', 'titile', 'msgContent', 'sender', 'priority', 'msgCategory', 'msgType', 'sendStatus', 'delFlag'))
  217. })
  218. },
  219. close () {
  220. this.$emit('close')
  221. this.selectedUser = []
  222. this.visible = false
  223. },
  224. handleOk () {
  225. const that = this
  226. // 触发表单验证
  227. this.form.validateFields((err, values) => {
  228. if (!err) {
  229. that.confirmLoading = true
  230. let httpurl = ''
  231. let method = ''
  232. if (!this.model.id) {
  233. httpurl += this.url.add
  234. method = 'post'
  235. } else {
  236. httpurl += this.url.edit
  237. method = 'put'
  238. }
  239. let formData = Object.assign(this.model, values)
  240. if (this.userType) {
  241. formData.userIds = this.userIds
  242. }
  243. if(formData.endTime!==''&& formData.endTime){
  244. formData.endTime = formData.endTime+' '+'00:00:00'
  245. }
  246. if(formData.startTime!==''&&formData.startTime){
  247. formData.startTime = formData.startTime+' '+'00:00:00'
  248. }
  249. httpAction(httpurl, formData, method).then((res) => {
  250. if (res.success) {
  251. that.$message.success(res.message)
  252. that.$emit('ok')
  253. } else {
  254. that.$message.warning(res.message)
  255. }
  256. }).finally(() => {
  257. that.confirmLoading = false
  258. that.close()
  259. })
  260. }
  261. })
  262. },
  263. handleCancel () {
  264. this.visible = false
  265. this.$emit('close')
  266. this.resetUser()
  267. },
  268. resetUser () {
  269. this.userType = false
  270. this.userIds = []
  271. this.selectedUser = []
  272. this.disabled = false
  273. this.$refs.UserListModal.edit(null, null)
  274. },
  275. selectUserIds () {
  276. this.$refs.UserListModal.add(this.selectedUser, this.userIds)
  277. },
  278. chooseMsgType (value) {
  279. if (value == 'USER') {
  280. this.userType = true
  281. } else {
  282. this.userType = false
  283. this.selectedUser = []
  284. this.userIds = []
  285. }
  286. },
  287. // 子modal回调
  288. choseUser: function (userList) {
  289. this.selectedUser = []
  290. this.userIds = []
  291. for (var i = 0; i < userList.length; i++) {
  292. this.selectedUser.push(userList[i].realname)
  293. this.userIds += userList[i].id + ','
  294. }
  295. },
  296. startTimeValidate (rule, value, callback) {
  297. let endTime = this.form.getFieldValue('endTime')
  298. if (!value || !endTime) {
  299. callback()
  300. } else if (moment(value).isBefore(endTime)) {
  301. callback()
  302. } else {
  303. callback('开始时间需小于结束时间')
  304. }
  305. },
  306. endTimeValidate (rule, value, callback) {
  307. let startTime = this.form.getFieldValue('startTime')
  308. if (!value || !startTime) {
  309. callback()
  310. } else if (moment(startTime).isBefore(value)) {
  311. callback()
  312. } else {
  313. callback('结束时间需大于开始时间')
  314. }
  315. }
  316. }
  317. }
  318. </script>
  319. <style scoped>
  320. </style>