8
0

post.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <template>
  2. <hc-new-card>
  3. <template #header>
  4. <div class="w-32">
  5. <el-select v-model="searchForm.category" placeholder="选择岗位类型" filterable clearable block>
  6. <el-option v-for="item in categoryType" :key="item.value" :label="item.label" :value="item.value" />
  7. </el-select>
  8. </div>
  9. <div class="ml-2 w-32">
  10. <el-select v-model="searchType" placeholder="选择搜索类型" filterable block>
  11. <el-option label="岗位编号" value="postCode" />
  12. <el-option label="岗位名称" value="postName" />
  13. </el-select>
  14. </div>
  15. <div class="ml-2 w-60">
  16. <hc-search-input v-model="searchName" placeholder="请输入关键词" @search="searchClick" />
  17. </div>
  18. </template>
  19. <template #extra>
  20. <el-button hc-btn type="primary" @click="addClick">新增</el-button>
  21. <el-button hc-btn type="danger" @click="delClick">删除</el-button>
  22. </template>
  23. <hc-table
  24. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
  25. is-new is-check :check-style="{ width: 29 }" :index-style="{ width: 60 }"
  26. @selection-change="tableCheckChange"
  27. >
  28. <template #tenantId="{ row }">
  29. {{ getTenantNmae(row.tenantId) }}
  30. </template>
  31. <template #category="{ row }">
  32. {{ getCategoryType(row.category) }}
  33. </template>
  34. <template #action="{ row }">
  35. <el-link type="warning" @click="editRowClick(row)">修改</el-link>
  36. <el-link type="danger" @click="delRowClick(row)">删除</el-link>
  37. </template>
  38. </hc-table>
  39. <template #action>
  40. <hc-pages :pages="searchForm" @change="pageChange" />
  41. </template>
  42. <!-- 新增/修改 -->
  43. <hc-new-dialog v-model="isDialogShow" widths="600px" is-footer-center :title="dialogTitle" @close="dialogClose">
  44. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto">
  45. <el-row :gutter="20">
  46. <el-col :span="12">
  47. <el-form-item label="岗位类型:" prop="category">
  48. <el-select v-model="formModel.category" placeholder="选择岗位类型" filterable clearable block>
  49. <el-option v-for="item in categoryType" :key="item.value" :label="item.label" :value="item.value" />
  50. </el-select>
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="12">
  54. <el-form-item label="岗位编号:" prop="postCode">
  55. <el-input v-model="formModel.postCode" clearable placeholder="请输入岗位编号" />
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="12">
  59. <el-form-item label="岗位名称:" prop="postName">
  60. <el-input v-model="formModel.postName" clearable placeholder="请输入岗位名称" />
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="12">
  64. <el-form-item label="岗位排序:" prop="sort">
  65. <el-input-number v-model="formModel.sort" :min="1" block controls-position="right" />
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="24">
  69. <el-form-item label="岗位描述:">
  70. <el-input v-model="formModel.remark" :autosize="{ minRows: 4, maxRows: 8 }" type="textarea" placeholder="请输入岗位描述" />
  71. </el-form-item>
  72. </el-col>
  73. </el-row>
  74. </el-form>
  75. <template #footer>
  76. <el-button hc-btn @click="dialogClose">取消</el-button>
  77. <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
  78. </template>
  79. </hc-new-dialog>
  80. </hc-new-card>
  81. </template>
  82. <script setup>
  83. import { nextTick, onActivated, ref } from 'vue'
  84. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  85. import { delMessage, getDictionaryData } from '~uti/tools'
  86. import tenantApi from '~api/system/tenant'
  87. import mainApi from '~api/system/post'
  88. //激活
  89. onActivated(() => {
  90. searchForm.value.current = 1
  91. getDataApi()
  92. })
  93. const getDataApi = async () => {
  94. await getPostCategory()
  95. await getTenantList()
  96. getTableData().then()
  97. }
  98. //搜索表单
  99. const searchType = ref('postCode')
  100. const searchName = ref('')
  101. const searchForm = ref({ current: 1, size: 30, total: 0 })
  102. //获取岗位类型
  103. const categoryType = ref([])
  104. const getPostCategory = async () => {
  105. categoryType.value = await getDictionaryData('post_category')
  106. }
  107. const getCategoryType = (id) => {
  108. const item = categoryType.value.find((item) => item.value === id)
  109. return item ? item.label : id
  110. }
  111. //获取租户列表
  112. const tenantList = ref([])
  113. const getTenantList = async () => {
  114. const { data } = await tenantApi.getSelect()
  115. tenantList.value = getArrValue(data)
  116. }
  117. const getTenantNmae = (id) => {
  118. const item = tenantList.value.find((item) => item.tenantId === id)
  119. return item ? item.tenantName : id
  120. }
  121. //搜索
  122. const searchClick = () => {
  123. searchForm.value.current = 1
  124. getTableData()
  125. }
  126. //分页
  127. const pageChange = ({ current, size }) => {
  128. searchForm.value.current = current
  129. searchForm.value.size = size
  130. getTableData()
  131. }
  132. //表格数据
  133. const tableRef = ref(null)
  134. const tableColumn = ref([
  135. { key: 'tenantId', name: '所属租户' },
  136. { key: 'category', name: '岗位类型' },
  137. { key: 'postCode', name: '岗位编号' },
  138. { key: 'postName', name: '岗位名称' },
  139. { key: 'sort', name: '岗位排序' },
  140. { key: 'action', name: '操作', width: 100, align: 'center' },
  141. ])
  142. //获取表格数据
  143. const tableLoading = ref(true)
  144. const tableData = ref([{}])
  145. const getTableData = async () => {
  146. tableData.value = []
  147. tableLoading.value = true
  148. const form = {
  149. ...searchForm.value,
  150. total: null,
  151. }
  152. if (searchName.value) {
  153. form[searchType.value] = searchName.value
  154. }
  155. const { error, code, data } = await mainApi.page(form)
  156. tableLoading.value = false
  157. if (!error && code === 200) {
  158. tableData.value = getArrValue(data['records'])
  159. searchForm.value.total = data['total']
  160. } else {
  161. tableData.value = []
  162. searchForm.value.total = 0
  163. }
  164. }
  165. //表格被选择
  166. const tableCheckKeys = ref([])
  167. const tableCheckChange = (rows) => {
  168. tableCheckKeys.value = rows
  169. }
  170. //新增/修改 弹窗
  171. const isDialogShow = ref(false)
  172. const dialogTitle = ref('')
  173. //菜单表单
  174. const formRef = ref(null)
  175. const formModel = ref({})
  176. const formRules = {
  177. category: {
  178. required: true,
  179. trigger: 'blur',
  180. message: '请选择岗位类型',
  181. },
  182. postCode: {
  183. required: true,
  184. trigger: 'blur',
  185. message: '请输入岗位编号',
  186. },
  187. postName: {
  188. required: true,
  189. trigger: 'blur',
  190. message: '请输入岗位名称',
  191. },
  192. sort: {
  193. required: true,
  194. trigger: 'blur',
  195. message: '请输入字典排序',
  196. },
  197. }
  198. //新增
  199. const addClick = () => {
  200. dialogTitle.value = '新增岗位'
  201. formModel.value = { sort: 1 }
  202. //显示表单弹窗
  203. nextTick(() => {
  204. isDialogShow.value = true
  205. })
  206. }
  207. //修改菜单
  208. const editRowClick = (row) => {
  209. formModel.value = {}
  210. dialogTitle.value = '修改岗位'
  211. formModel.value = { ...row }
  212. //显示表单弹窗
  213. nextTick(() => {
  214. isDialogShow.value = true
  215. })
  216. }
  217. //删除菜单
  218. const delRowClick = (row) => {
  219. delMessage(async () => {
  220. const { code, msg } = await mainApi.del(row.id)
  221. if (code === 200) {
  222. window.$message.success('删除成功')
  223. getTableData().then()
  224. } else {
  225. window.$message.error(msg ?? '删除失败')
  226. }
  227. })
  228. }
  229. //批量删除菜单
  230. const delClick = () => {
  231. const rows = tableCheckKeys.value
  232. if (rows.length <= 0) {
  233. window.$message.warning('请选择要删除的菜单')
  234. return false
  235. }
  236. //确认删除菜单
  237. delMessage(async () => {
  238. const ids = arrToId(rows)
  239. const { code, msg } = await mainApi.del(ids)
  240. if (code === 200) {
  241. window.$message.success('删除成功')
  242. getTableData().then()
  243. } else {
  244. window.$message.error(msg ?? '删除失败')
  245. }
  246. })
  247. }
  248. //提交表单
  249. const submitLoading = ref(false)
  250. const dialogSubmit = async () => {
  251. const formRes = await formValidate(formRef.value)
  252. if (!formRes) return false
  253. submitLoading.value = true
  254. //发起请求
  255. const { error, code, msg } = await mainApi.submit(formModel.value)
  256. submitLoading.value = false
  257. if (!error && code === 200) {
  258. dialogClose()
  259. window?.$message?.success('操作成功')
  260. getTableData().then()
  261. } else {
  262. window?.$message?.error(msg ?? '操作失败')
  263. }
  264. }
  265. //关闭弹窗
  266. const dialogClose = () => {
  267. isDialogShow.value = false
  268. submitLoading.value = false
  269. formModel.value = {}
  270. }
  271. </script>