region.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <template>
  2. <HcCard>
  3. <template #header>
  4. <div class="w-64">
  5. <el-input v-model="searchForm.name" clearable placeholder="请输入名称进行查询" size="large" />
  6. </div>
  7. <div class="ml-4">
  8. <el-button type="primary" size="large" @click="searchClick">
  9. <HcIcon name="search-2" />
  10. <span>搜索</span>
  11. </el-button>
  12. </div>
  13. </template>
  14. <template #extra>
  15. <el-button size="large" type="primary" hc-btn @click="addRowClick">
  16. <HcIcon name="add" />
  17. <span>新增</span>
  18. </el-button>
  19. <el-button size="large" type="danger" hc-btn :disabled="tableCheckedKeys.length < 1" @click="batchClick">
  20. <HcIcon name="delete-bin" />
  21. <span>删除</span>
  22. </el-button>
  23. </template>
  24. <div class="base-region-box">
  25. <div id="region-01" class="base-region-table">
  26. <HcTable ref="tableListRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" is-check @selection-change="tableSelectionChange" @row-click="rowView">
  27. <template #action="{ row, index }">
  28. <el-button size="small" type="primary" @click="editRowClick(row)">
  29. 编辑
  30. </el-button>
  31. <el-button size="small" type="danger" @click="delClickRow(row)">
  32. 删除
  33. </el-button>
  34. </template>
  35. </HcTable>
  36. </div>
  37. <div id="region-02" class="base-region-info">
  38. <el-scrollbar>
  39. <div class="base-region-card">
  40. <div class="title">
  41. 已关联用户信息
  42. </div>
  43. <div class="content">
  44. <el-tag v-for="item in allUserNameArr" :key="item.id">
  45. {{ item }}
  46. </el-tag>
  47. </div>
  48. </div>
  49. <div class="base-region-card">
  50. <div class="title">
  51. 已分配区域权限
  52. </div>
  53. <div class="content" style="padding-top: 12px">
  54. <HcTreeData v-if="isShowTree" :is-menu="false" show-checkbox :default-checked-keys="defaultCheckedKeys" @change="treecheck" />
  55. </div>
  56. </div>
  57. </el-scrollbar>
  58. </div>
  59. </div>
  60. <template #action>
  61. <HcPages :pages="searchForm" @change="pageChange" />
  62. </template>
  63. <!-- 新增/编辑 -->
  64. <HcDialog is-to-body bg-color="white" :show="rowModal" is-table widths="62rem" :title="formModel.id ? '编辑' : '新增'" :loading="submitLoading" @save="rowModalSave" @close="rowModalClose">
  65. <div class="base-region-dialog">
  66. <div class="dialog-form">
  67. <el-scrollbar>
  68. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" size="large">
  69. <el-form-item label="编号:" prop="number">
  70. <el-input v-model="formModel.number" />
  71. </el-form-item>
  72. <el-form-item label="名称:" prop="name">
  73. <el-input v-model="formModel.name" />
  74. </el-form-item>
  75. <el-form-item label="备注:" prop="remark">
  76. <el-input v-model="formModel.remark" />
  77. </el-form-item>
  78. <el-form-item label="关联用户" prop="allUser">
  79. <HcTasksUser :contract-id="ownerId" :project-id="projectId" ui="w-full" :users="allUserName" @change="tasksUserChange" />
  80. </el-form-item>
  81. </el-form>
  82. </el-scrollbar>
  83. </div>
  84. <div class="dialog-action">
  85. <div class="title">
  86. 区域权限授权
  87. </div>
  88. <div class="data-tree-box">
  89. <el-scrollbar>
  90. <HcTreeData ref="retreeRef" :is-menu="false" show-checkbox :default-checked-keys="defaultCheckedKeys" @change="treecheck" />
  91. </el-scrollbar>
  92. </div>
  93. </div>
  94. </div>
  95. </HcDialog>
  96. </HcCard>
  97. </template>
  98. <script setup>
  99. import { onMounted, onUnmounted, ref } from 'vue'
  100. import split from 'split.js'
  101. import regionApi from '~api/base/region.js'
  102. import { arrToId, arrToKey, formValidate, getArrValue, getObjValue } from 'js-fast-way'
  103. import { useAppStore } from '~src/store'
  104. import { delMessageV2 } from '~com/message/index.js'
  105. const useAppState = useAppStore()
  106. const projectId = ref(useAppState.getProjectId)
  107. //渲染完成
  108. onMounted(()=> {
  109. setSplitDom()
  110. getTableData()
  111. getOwnerIds()
  112. })
  113. // 初始化设置拖动分割线
  114. const splitvar = ref(null)
  115. const setSplitDom = () => {
  116. try {
  117. //配置参考: https://split.js.org/#/?direction=vertical&snapOffset=0
  118. splitvar.value = split([
  119. '#region-01',
  120. '#region-02',
  121. ], {
  122. sizes: [50, 50],
  123. })
  124. } catch (e) {
  125. setTimeout(() => {
  126. setSplitDom()
  127. }, 500)
  128. }
  129. }
  130. //销毁
  131. onUnmounted(() => {
  132. if (splitvar.value) {
  133. splitvar.value.destroy()
  134. }
  135. })
  136. //搜索表单
  137. const searchForm = ref({
  138. name: null, queryValue: null,
  139. current: 1, size: 20, total: 0,
  140. })
  141. //搜索
  142. const searchClick = () => {
  143. searchForm.value.current = 1
  144. getTableData()
  145. }
  146. //分页被点击
  147. const pageChange = ({ current, size }) => {
  148. searchForm.value.current = current
  149. searchForm.value.size = size
  150. getTableData()
  151. }
  152. //获取数据
  153. const tableLoading = ref(false)
  154. const tableColumn = [
  155. { key: 'number', name: '编号' },
  156. { key: 'allUser', name: '角色名称' },
  157. { key: 'remark', name: '备注' },
  158. { key: 'action', name: '操作', width: '130', align: 'center' },
  159. ]
  160. const tableData = ref([
  161. ])
  162. const getTableData = async () => {
  163. tableLoading.value = true
  164. const { error, code, data } = await regionApi.getPage({
  165. ...searchForm.value,
  166. projectId: projectId.value,
  167. })
  168. tableLoading.value = false
  169. if (!error && code === 200) {
  170. tableData.value = getArrValue(data['records'])
  171. searchForm.value.total = data['total'] || 0
  172. if (tableData.value.length > 0) {
  173. getDetail(tableData.value[0].id)
  174. } else {
  175. allUserNameArr.value = []
  176. defaultCheckedKeys.value = []
  177. isShowTree.value = false
  178. setTimeout(() => {
  179. isShowTree.value = true
  180. }, 1000)
  181. }
  182. } else {
  183. tableData.value = []
  184. searchForm.value.total = 0
  185. }
  186. }
  187. //getOwnerId查询当前项目业主方合同段id
  188. const ownerId = ref('')
  189. const getOwnerIds = async ()=>{
  190. const { error, code, data } = await regionApi.getOwnerId({
  191. projectId: projectId.value,
  192. })
  193. tableLoading.value = false
  194. if (!error && code === 200) {
  195. ownerId.value = data
  196. } else {
  197. ownerId.value = ''
  198. }
  199. }
  200. //多选事件
  201. //多选
  202. const tableListRef = ref(null)
  203. const tableCheckedKeys = ref([])
  204. const tableSelectionChange = (rows) => {
  205. tableCheckedKeys.value = rows.filter((item) => {
  206. return (item ?? '') !== ''
  207. })
  208. }
  209. const rowView = ({ row })=>{
  210. getDetail(row.id)
  211. }
  212. //弹窗
  213. const rowModal = ref(false)
  214. const formRef = ref(null)
  215. const formModel = ref({})
  216. const formRules = {
  217. name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
  218. }
  219. const allUserName = ref('')
  220. const tasksUserChange = (user) => {
  221. formModel.value.allUser = arrToKey(user, 'userId', '-')
  222. }
  223. //新增
  224. const addRowClick = () => {
  225. formModel.value = {}
  226. rowModal.value = true
  227. defaultCheckedKeys.value = []
  228. allUserName.value = ''
  229. }
  230. //编辑
  231. const editRowClick = (row) => {
  232. // formModel.value = row
  233. rowModal.value = true
  234. getDetail(row.id)
  235. }
  236. const allUserNameArr = ref([])
  237. //获取详情
  238. const getDetail = async (id)=>{
  239. const { error, code, data } = await regionApi.getDetail({
  240. id,
  241. })
  242. if (!error && code === 200) {
  243. formModel.value = getObjValue(data)
  244. defaultCheckedKeys.value = data['allAreaId'].split(',') || []
  245. allUserName.value = arrToKey(data['allUserList'], 'name', '-') || ''
  246. allUserNameArr.value = allUserName.value .split(',') || []
  247. } else {
  248. formModel.value = { }
  249. }
  250. }
  251. //保存
  252. const submitLoading = ref(false)
  253. const rowModalSave = async () => {
  254. console.log(formModel.value, 'value')
  255. const res = await formValidate(formRef.value)
  256. if (res) {
  257. submitLoading.value = true
  258. //发起请求
  259. const form = formModel.value
  260. form.projectId = projectId.value
  261. const { error, code, msg } = await regionApi.addOrUpdate(form)
  262. //判断状态
  263. submitLoading.value = false
  264. if (!error && code === 200) {
  265. window.$message?.success(msg)
  266. rowModal.value = false
  267. getTableData()
  268. }
  269. }
  270. }
  271. //关闭弹窗
  272. const rowModalClose = () => {
  273. rowModal.value = false
  274. formModel.value = {}
  275. }
  276. //授权树
  277. const defaultCheckedKeys = ref([])
  278. const retreeRef = ref(null)
  279. const isShowTree = ref(true)
  280. const treecheck = (data)=>{
  281. const checkedKeys = data.node.checkedKeys
  282. formModel.value.allAreaId = checkedKeys.join(',')
  283. }
  284. //删除
  285. const delClickRow = (row)=>{
  286. delMessageV2(async (action, instance, done) => {
  287. if (action === 'confirm') {
  288. instance.confirmButtonLoading = true
  289. removeRow([row.id])
  290. instance.confirmButtonLoading = false
  291. done()
  292. } else {
  293. done()
  294. }
  295. })
  296. }
  297. const removeRow = async (id)=>{
  298. const { error, code } = await regionApi.remove( id, false)
  299. //判断状态
  300. if (!error && code === 200) {
  301. window.$message?.success('删除成功')
  302. getTableData()
  303. } else {
  304. window.$message?.error('删除失败')
  305. }
  306. }
  307. const batchClick = ()=>{
  308. const rows = tableCheckedKeys.value
  309. const ids = arrToId(rows).split(',')
  310. delMessageV2(async (action, instance, done) => {
  311. if (action === 'confirm') {
  312. instance.confirmButtonLoading = true
  313. removeRow(ids)
  314. instance.confirmButtonLoading = false
  315. done()
  316. } else {
  317. done()
  318. }
  319. })
  320. }
  321. </script>
  322. <style lang="scss" scoped>
  323. @import "~src/styles/base/region.scss";
  324. </style>
  325. <style lang="scss">
  326. </style>