DeptForm.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <template>
  2. <Dialog v-model="dialogVisible" max-height="620px" :title="dialogTitle" scroll>
  3. <el-form
  4. ref="formRef"
  5. v-loading="formLoading"
  6. :model="formData"
  7. :rules="formRules"
  8. label-width="100px"
  9. >
  10. <el-form-item label="上级机构" prop="parentId">
  11. <el-tree-select
  12. v-model="formData.parentId"
  13. :data="deptTree"
  14. :props="defaultProps"
  15. check-strictly
  16. default-expand-all
  17. placeholder="请选择上级机构"
  18. value-key="deptId"
  19. />
  20. </el-form-item>
  21. <el-form-item label="机构名称" prop="name">
  22. <el-input v-model="formData.name" placeholder="请输入机构名称" maxlength="60" />
  23. </el-form-item>
  24. <el-form-item label="原机构名称" prop="originalName" >
  25. <el-input v-model="formData.originalName" placeholder="请输入原机构名称" maxlength="60" />
  26. </el-form-item>
  27. <el-form-item label="机构编码" v-if="formData.id != undefined" prop="code" >
  28. <el-input v-model="formData.code" placeholder="请输入编码" maxlength="30" disabled/>
  29. </el-form-item>
  30. <el-form-item label="原机构编码" prop="originalCode" >
  31. <el-input v-model="formData.originalCode" placeholder="请输入原机构编码" maxlength="30" />
  32. </el-form-item>
  33. <el-form-item label="所在地" prop="areaId">
  34. <el-tree-select
  35. v-model="formData.areaId"
  36. :data="areaList"
  37. :props="customerProps"
  38. :render-after-expand="true"
  39. />
  40. </el-form-item>
  41. <el-form-item label="详细地址" prop="address" >
  42. <el-input v-model="formData.address" placeholder="请输入详细地址" maxlength="100" />
  43. </el-form-item>
  44. <el-form-item label="机构别名" prop="aliasName" >
  45. <el-input v-model="formData.aliasName" placeholder="请输入机构别名" maxlength="30" />
  46. </el-form-item>
  47. <el-form-item label="机构其他别名" prop="aliasName" >
  48. <el-input v-model="formData.aliasNameOther" placeholder="请输入机构别名" maxlength="30" />
  49. </el-form-item>
  50. <!-- <el-form-item label="原机构编码" prop="originalCode" >-->
  51. <!-- <el-input v-model="formData.originalCode" placeholder="请输入原机构编码" maxlength="30" />-->
  52. <!-- </el-form-item>-->
  53. <el-form-item label="品牌名称" prop="brand">
  54. <el-select v-model="formData.brand" multiple clearable placeholder="请选择品牌名称">
  55. <el-option
  56. v-for="dict in brandOptions"
  57. :key="dict.value"
  58. :label="dict.label"
  59. :value="dict.value"
  60. />
  61. </el-select>
  62. </el-form-item>
  63. <el-form-item label="机构性质" prop="propertypes">
  64. <el-select v-model="formData.propertypes" multiple clearable placeholder="请选择机构性质">
  65. <el-option
  66. v-for="dict in propertypesOptions"
  67. :key="dict.value"
  68. :label="dict.label"
  69. :value="dict.value"
  70. />
  71. </el-select>
  72. </el-form-item>
  73. <el-form-item label="已上系统" prop="applySystems">
  74. <el-select v-model="formData.applySystems" multiple clearable placeholder="请选择已上系统">
  75. <el-option
  76. v-for="dict in applySystemOptions"
  77. :key="dict.value"
  78. :label="dict.label"
  79. :value="dict.value"
  80. />
  81. </el-select>
  82. </el-form-item>
  83. <el-form-item label="经营方式" prop="businessPattern">
  84. <el-select v-model="formData.businessPattern" clearable placeholder="请选择状态">
  85. <el-option
  86. v-for="dict in businessPatternOptions"
  87. :key="dict.value"
  88. :label="dict.label"
  89. :value="dict.value"
  90. />
  91. </el-select>
  92. </el-form-item>
  93. <el-form-item label="营业状态" prop="businessStatus">
  94. <el-select v-model="formData.businessStatus" clearable placeholder="请选择状态">
  95. <el-option
  96. v-for="dict in businessStatusOptions"
  97. :key="dict.value"
  98. :label="dict.label"
  99. :value="dict.value"
  100. />
  101. </el-select>
  102. </el-form-item>
  103. <el-form-item label="支持BI" prop="supportBi">
  104. <el-select v-model="formData.supportBi" clearable placeholder="请选择状态">
  105. <el-option
  106. v-for="dict in supportBiOptions"
  107. :key="dict.value"
  108. :label="dict.label"
  109. :value="dict.value"
  110. />
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item label="状态" prop="status">
  114. <el-select v-model="formData.status" clearable placeholder="请选择状态">
  115. <el-option
  116. v-for="dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
  117. :key="dict.value"
  118. :label="dict.label"
  119. :value="dict.value"
  120. />
  121. </el-select>
  122. </el-form-item>
  123. <!-- <el-form-item label="显示排序" prop="sort">-->
  124. <!-- <el-input-number v-model="formData.sort" :min="0" controls-position="right" />-->
  125. <!-- </el-form-item>-->
  126. <!-- <el-form-item label="负责人" prop="leaderUserId">-->
  127. <!-- <el-select v-model="formData.leaderUserId" clearable placeholder="请输入负责人">-->
  128. <!-- <el-option-->
  129. <!-- v-for="item in userList"-->
  130. <!-- :key="item.id"-->
  131. <!-- :label="item.nickname"-->
  132. <!-- :value="item.id"-->
  133. <!-- />-->
  134. <!-- </el-select>-->
  135. <!-- </el-form-item>-->
  136. <el-form-item label="负责人" prop="leaderUserName">
  137. <el-input v-model="formData.leaderUserName" maxlength="30" placeholder="请输入负责人" />
  138. </el-form-item>
  139. <el-form-item label="联系电话" prop="phone">
  140. <el-input v-model="formData.phone" maxlength="11" placeholder="请输入联系电话" />
  141. </el-form-item>
  142. <el-form-item label="邮箱" prop="email">
  143. <el-input v-model="formData.email" maxlength="50" placeholder="请输入邮箱" />
  144. </el-form-item>
  145. </el-form>
  146. <template #footer>
  147. <el-button type="primary" @click="submitForm">确 定</el-button>
  148. <el-button @click="dialogVisible = false">取 消</el-button>
  149. </template>
  150. </Dialog>
  151. </template>
  152. <script lang="ts" setup>
  153. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  154. import { defaultProps, handleTree } from '@/utils/tree'
  155. import * as DeptApi from '@/api/system/dept'
  156. import * as UserApi from '@/api/system/user'
  157. import * as AreaApi from '@/api/system/area'
  158. import { CommonStatusEnum } from '@/utils/constants'
  159. import { FormRules } from 'element-plus'
  160. defineOptions({ name: 'SystemDeptForm' })
  161. const { t } = useI18n() // 国际化
  162. const message = useMessage() // 消息弹窗
  163. const areaList = ref([]) // 地区列表
  164. const dialogVisible = ref(false) // 弹窗的是否展示
  165. const dialogTitle = ref('') // 弹窗的标题
  166. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  167. const formType = ref('') // 表单的类型:create - 新增;update - 修改
  168. const formData = ref({
  169. id: undefined,
  170. title: '',
  171. parentId: undefined,
  172. name: undefined,
  173. code: undefined,
  174. sort: undefined,
  175. leaderUserId: undefined,
  176. leaderUserName: undefined,
  177. phone: undefined,
  178. email: undefined,
  179. supportBi: 1,
  180. businessStatus: 1,
  181. businessPattern: 1,
  182. applySystems: [],
  183. propertypes: [],
  184. brand: [],
  185. aliasNameOther: undefined,
  186. aliasName: undefined,
  187. originalName: undefined,
  188. originalCode: undefined,
  189. status: CommonStatusEnum.ENABLE
  190. })
  191. const formRules = reactive<FormRules>({
  192. parentId: [{ required: true, message: '上级机构不能为空', trigger: 'blur' }],
  193. name: [{ required: true, message: '机构名称不能为空', trigger: 'blur' }],
  194. code: [{ required: true, message: '机构编码不能为空', trigger: 'blur' }],
  195. sort: [{ required: true, message: '显示排序不能为空', trigger: 'blur' }],
  196. areaId: [{ required: true, message: '所在地不能为空', trigger: 'blur' }],
  197. supportBi: [{ required: true, message: 'BI支持不能为空', trigger: 'blur' }],
  198. businessStatus: [{ required: true, message: '营业状态不能为空', trigger: 'blur' }],
  199. businessPattern: [{ required: true, message: '经营方式不能为空', trigger: 'blur' }],
  200. email: [{ type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }],
  201. phone: [
  202. { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
  203. ],
  204. status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
  205. })
  206. const formRef = ref() // 表单 Ref
  207. const deptTree = ref() // 树形结构
  208. const userList = ref<UserApi.UserVO[]>([]) // 用户列表
  209. /** 打开弹窗 */
  210. const open = async (type: string, id?: number) => {
  211. dialogVisible.value = true
  212. dialogTitle.value = t('action.' + type)
  213. formType.value = type
  214. resetForm()
  215. // 修改时,设置数据
  216. if (id) {
  217. formLoading.value = true
  218. try {
  219. formData.value = await DeptApi.getDept(id)
  220. } finally {
  221. formLoading.value = false
  222. }
  223. }
  224. // 获得用户列表
  225. userList.value = await UserApi.getSimpleUserList()
  226. // 获得地区列表
  227. areaList.value = await AreaApi.getAreaTree()
  228. // 获得部门树
  229. await getTree()
  230. }
  231. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  232. /** 提交表单 */
  233. const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
  234. const submitForm = async () => {
  235. // 校验表单
  236. if (!formRef) return
  237. const valid = await formRef.value.validate()
  238. if (!valid) return
  239. // 提交请求
  240. formLoading.value = true
  241. try {
  242. const data = formData.value as unknown as DeptApi.DeptVO
  243. if (formType.value === 'create') {
  244. await DeptApi.createDept(data)
  245. message.success(t('common.createSuccess'))
  246. } else {
  247. await DeptApi.updateDept(data)
  248. message.success(t('common.updateSuccess'))
  249. }
  250. dialogVisible.value = false
  251. // 发送操作成功的事件
  252. emit('success')
  253. } finally {
  254. formLoading.value = false
  255. }
  256. }
  257. /** 重置表单 */
  258. const resetForm = () => {
  259. formData.value = {
  260. id: undefined,
  261. title: '',
  262. parentId: undefined,
  263. name: undefined,
  264. code: undefined,
  265. sort: undefined,
  266. leaderUserId: undefined,
  267. leaderUserName: undefined,
  268. phone: undefined,
  269. email: undefined,
  270. supportBi: 1,
  271. businessStatus: 1,
  272. businessPattern: 1,
  273. applySystems: [],
  274. propertypes: [],
  275. brand: [],
  276. aliasNameOther: undefined,
  277. aliasName: undefined,
  278. originalName: undefined,
  279. originalCode: undefined,
  280. status: CommonStatusEnum.ENABLE
  281. }
  282. formRef.value?.resetFields()
  283. }
  284. /** 获得部门树 */
  285. const getTree = async () => {
  286. deptTree.value = []
  287. const data = await DeptApi.getSimpleDeptList()
  288. let dept: Tree = { id: 0, name: '顶级机构', children: [] }
  289. dept.children = handleTree(data)
  290. deptTree.value.push(dept)
  291. }
  292. const customerProps = {
  293. children: 'children',
  294. label: 'name',
  295. value: 'id',
  296. isLeaf: 'leaf',
  297. emitPath: false // 用于 cascader 组件:在选中节点改变时,是否返回由该节点所在的各级菜单的值所组成的数组,若设置 false,则只返回该节点的值
  298. }
  299. const brandOptions = [
  300. {
  301. value: 1,
  302. label: '恒颐汇',
  303. },
  304. {
  305. value: 2,
  306. label: '楠山有约',
  307. },
  308. {
  309. value: 3,
  310. label: '萱悦庭',
  311. },
  312. {
  313. value: 4,
  314. label: '社区站点',
  315. },
  316. ]
  317. const propertypesOptions = [
  318. {
  319. value: 1,
  320. label: '机构',
  321. },
  322. {
  323. value: 2,
  324. label: '旅居',
  325. },
  326. {
  327. value: 3,
  328. label: '站点',
  329. }
  330. ]
  331. const applySystemOptions = [
  332. {
  333. value: 1,
  334. label: '机构系统',
  335. },
  336. {
  337. value: 2,
  338. label: '旅居系统',
  339. },
  340. {
  341. value: 3,
  342. label: '旅居系统-小程序核销端',
  343. }
  344. ]
  345. const businessPatternOptions = [
  346. {
  347. value: 1,
  348. label: '自建自营',
  349. },
  350. {
  351. value: 2,
  352. label: '合作项目',
  353. },
  354. {
  355. value: 3,
  356. label: '委托运营',
  357. }
  358. ]
  359. const businessStatusOptions = [
  360. {
  361. value: 0,
  362. label: '在营',
  363. },
  364. {
  365. value: 1,
  366. label: '未开业',
  367. }
  368. ]
  369. const supportBiOptions = [
  370. {
  371. value: 0,
  372. label: '是',
  373. },
  374. {
  375. value: 1,
  376. label: '否',
  377. }
  378. ]
  379. </script>