external-client-edit.vue 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <!-- 外部客户端新建/编辑弹窗 -->
  2. <template>
  3. <ele-modal
  4. width="760px"
  5. :visible="visible"
  6. :append-to-body="true"
  7. :close-on-click-modal="false"
  8. custom-class="ele-dialog-form"
  9. :title="isUpdate ? '修改外部客户端' : '新建外部客户端'"
  10. @update:visible="updateVisible"
  11. >
  12. <el-form ref="form" :model="form" :rules="rules" label-width="110px">
  13. <el-row :gutter="20">
  14. <el-col v-if="isUpdate" :span="12">
  15. <el-form-item label="客户端 ID:">
  16. <el-input v-model="form.clientId" disabled />
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="12">
  20. <el-form-item label="系统名称:" prop="systemName">
  21. <el-input
  22. v-model="form.systemName"
  23. clearable
  24. :maxlength="100"
  25. placeholder="请输入外部系统名称"
  26. />
  27. </el-form-item>
  28. </el-col>
  29. <el-col :span="12">
  30. <el-form-item label="系统编码:" prop="systemCode">
  31. <el-input
  32. v-model="form.systemCode"
  33. clearable
  34. :maxlength="100"
  35. placeholder="请输入外部系统编码"
  36. />
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="12">
  40. <el-form-item label="工厂:" prop="factoriesId">
  41. <factory-select
  42. v-model="form.factoriesId"
  43. clearable
  44. placeholder="请选择工厂"
  45. />
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="12">
  49. <el-form-item label="来源 IP 白名单:">
  50. <el-input
  51. v-model="form.ipWhitelist"
  52. clearable
  53. placeholder="多个 IP 使用英文逗号分隔,留空表示不限制"
  54. />
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="12">
  58. <el-form-item label="生效时间:">
  59. <el-date-picker
  60. v-model="form.effectiveTime"
  61. type="datetime"
  62. value-format="yyyy-MM-dd HH:mm:ss"
  63. format="yyyy-MM-dd HH:mm:ss"
  64. clearable
  65. placeholder="请选择生效时间"
  66. class="ele-block"
  67. />
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="12">
  71. <el-form-item label="失效时间:">
  72. <el-date-picker
  73. v-model="form.expireTime"
  74. type="datetime"
  75. value-format="yyyy-MM-dd HH:mm:ss"
  76. format="yyyy-MM-dd HH:mm:ss"
  77. clearable
  78. placeholder="请选择失效时间"
  79. class="ele-block"
  80. />
  81. </el-form-item>
  82. </el-col>
  83. </el-row>
  84. <el-alert
  85. title="来源 IP 白名单请使用英文半角逗号分隔。"
  86. type="info"
  87. :closable="false"
  88. show-icon
  89. />
  90. </el-form>
  91. <template v-slot:footer>
  92. <el-button @click="updateVisible(false)">取消</el-button>
  93. <el-button type="primary" :loading="loading" @click="save">
  94. 保存
  95. </el-button>
  96. </template>
  97. </ele-modal>
  98. </template>
  99. <script>
  100. import {
  101. addExternalClient,
  102. getExternalClient,
  103. updateExternalClient
  104. } from '@/api/system/externalClient';
  105. import factorySelect from '@/components/CommomSelect/factory-select.vue';
  106. const defaultForm = {
  107. id: null,
  108. clientId: '',
  109. systemCode: '',
  110. systemName: '',
  111. factoriesId: '',
  112. effectiveTime: '',
  113. expireTime: '',
  114. ipWhitelist: ''
  115. };
  116. export default {
  117. components: {
  118. factorySelect
  119. },
  120. props: {
  121. visible: Boolean,
  122. data: {
  123. type: Object,
  124. default: null
  125. }
  126. },
  127. data() {
  128. return {
  129. form: { ...defaultForm },
  130. rules: {
  131. systemName: [
  132. { required: true, message: '请输入外部系统名称', trigger: 'blur' }
  133. ],
  134. systemCode: [
  135. { required: true, message: '请输入外部系统编码', trigger: 'blur' }
  136. ],
  137. expireTime: [
  138. {
  139. validator: (rule, value, callback) => {
  140. if (!value || !this.form.effectiveTime) {
  141. callback();
  142. return;
  143. }
  144. callback(
  145. new Date(value).getTime() >
  146. new Date(this.form.effectiveTime).getTime()
  147. ? undefined
  148. : new Error('失效时间必须晚于生效时间')
  149. );
  150. },
  151. trigger: 'change'
  152. }
  153. ]
  154. },
  155. isUpdate: false,
  156. loading: false,
  157. detailLoading: false
  158. };
  159. },
  160. watch: {
  161. visible(value) {
  162. if (value) {
  163. this.initForm();
  164. } else {
  165. this.resetForm();
  166. }
  167. }
  168. },
  169. methods: {
  170. async initForm() {
  171. this.isUpdate = Boolean(this.data && this.data.id);
  172. this.form = {
  173. ...defaultForm,
  174. ...(this.data || {})
  175. };
  176. if (!this.isUpdate) {
  177. return;
  178. }
  179. this.detailLoading = true;
  180. try {
  181. const detail = await getExternalClient(this.data.id);
  182. this.form = {
  183. ...defaultForm,
  184. ...detail
  185. };
  186. } catch (error) {
  187. this.$message.error(error.message || '获取客户端详情失败');
  188. this.updateVisible(false);
  189. } finally {
  190. this.detailLoading = false;
  191. }
  192. },
  193. resetForm() {
  194. this.form = { ...defaultForm };
  195. this.isUpdate = false;
  196. this.loading = false;
  197. this.detailLoading = false;
  198. if (this.$refs.form) {
  199. this.$refs.form.clearValidate();
  200. }
  201. },
  202. save() {
  203. if (this.loading || this.detailLoading) {
  204. return;
  205. }
  206. this.$refs.form.validate((valid) => {
  207. if (!valid) {
  208. return;
  209. }
  210. this.loading = true;
  211. const payload = {
  212. ...(this.isUpdate ? { id: this.form.id } : {}),
  213. systemName: this.form.systemName,
  214. systemCode: this.form.systemCode,
  215. factoriesId: this.form.factoriesId
  216. ? Number(this.form.factoriesId)
  217. : undefined,
  218. effectiveTime: this.form.effectiveTime || undefined,
  219. expireTime: this.form.expireTime || undefined,
  220. ipWhitelist: this.form.ipWhitelist || undefined
  221. };
  222. const request = this.isUpdate
  223. ? updateExternalClient(payload)
  224. : addExternalClient(payload);
  225. request
  226. .then((result) => {
  227. this.$message.success(this.isUpdate ? '修改成功' : '创建成功');
  228. this.updateVisible(false);
  229. this.$emit('done', result);
  230. })
  231. .catch((error) => {
  232. this.$message.error(error.message || '保存失败');
  233. })
  234. .finally(() => {
  235. this.loading = false;
  236. });
  237. });
  238. },
  239. updateVisible(value) {
  240. this.$emit('update:visible', value);
  241. }
  242. }
  243. };
  244. </script>