region.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357
  1. <template>
  2. <HcNewCard padding>
  3. <template #header>
  4. <div class="w-64">
  5. <el-input v-model="searchForm.name" clearable placeholder="请输入名称进行查询" />
  6. </div>
  7. <div class="ml-4">
  8. <el-button type="primary" @click="searchClick">
  9. <HcIcon name="search-2" />
  10. <span>搜索</span>
  11. </el-button>
  12. </div>
  13. </template>
  14. <template #extra>
  15. <el-button type="primary" hc-btn @click="addRowClick">
  16. <HcIcon name="add" />
  17. <span>新增</span>
  18. </el-button>
  19. <el-button 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" is-new is-current-row :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. <hc-new-dialog 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. </hc-new-dialog>
  96. </HcNewCard>
  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. allUser: [{ required: true, message: '请选择用户', trigger: 'blur' }],
  219. }
  220. const allUserName = ref('')
  221. const tasksUserChange = (user) => {
  222. formModel.value.allUser = arrToKey(user, 'userId', '-')
  223. }
  224. //新增
  225. const addRowClick = () => {
  226. formModel.value = {}
  227. rowModal.value = true
  228. defaultCheckedKeys.value = []
  229. allUserName.value = ''
  230. }
  231. //编辑
  232. const editRowClick = (row) => {
  233. // formModel.value = row
  234. rowModal.value = true
  235. getDetail(row.id)
  236. }
  237. const allUserNameArr = ref([])
  238. //获取详情
  239. const getDetail = async (id)=>{
  240. const { error, code, data } = await regionApi.getDetail({
  241. id,
  242. })
  243. if (!error && code === 200) {
  244. formModel.value = getObjValue(data)
  245. defaultCheckedKeys.value = data['allAreaId'].split(',') || []
  246. allUserName.value = arrToKey(data['allUserList'], 'name', '-') || ''
  247. allUserNameArr.value = allUserName.value .split(',') || []
  248. } else {
  249. formModel.value = { }
  250. }
  251. }
  252. //保存
  253. const submitLoading = ref(false)
  254. const rowModalSave = async () => {
  255. console.log(formModel.value, 'value')
  256. const res = await formValidate(formRef.value)
  257. if (res) {
  258. submitLoading.value = true
  259. //发起请求
  260. const form = formModel.value
  261. form.projectId = projectId.value
  262. const { error, code, msg } = await regionApi.addOrUpdate(form)
  263. //判断状态
  264. submitLoading.value = false
  265. if (!error && code === 200) {
  266. window.$message?.success(msg)
  267. rowModal.value = false
  268. getTableData()
  269. }
  270. }
  271. }
  272. //关闭弹窗
  273. const rowModalClose = () => {
  274. rowModal.value = false
  275. formModel.value = {}
  276. }
  277. //授权树
  278. const defaultCheckedKeys = ref([])
  279. const retreeRef = ref(null)
  280. const isShowTree = ref(true)
  281. const treecheck = (data)=>{
  282. const checkedKeys = data.node.checkedKeys
  283. formModel.value.allAreaId = checkedKeys.join(',')
  284. }
  285. //删除
  286. const delClickRow = (row)=>{
  287. delMessageV2(async (action, instance, done) => {
  288. if (action === 'confirm') {
  289. instance.confirmButtonLoading = true
  290. removeRow([row.id])
  291. instance.confirmButtonLoading = false
  292. done()
  293. } else {
  294. done()
  295. }
  296. })
  297. }
  298. const removeRow = async (id)=>{
  299. const { error, code } = await regionApi.remove( id, false)
  300. //判断状态
  301. if (!error && code === 200) {
  302. window.$message?.success('删除成功')
  303. getTableData()
  304. } else {
  305. window.$message?.error('删除失败')
  306. }
  307. }
  308. const batchClick = ()=>{
  309. const rows = tableCheckedKeys.value
  310. const ids = arrToId(rows).split(',')
  311. delMessageV2(async (action, instance, done) => {
  312. if (action === 'confirm') {
  313. instance.confirmButtonLoading = true
  314. removeRow(ids)
  315. instance.confirmButtonLoading = false
  316. done()
  317. } else {
  318. done()
  319. }
  320. })
  321. }
  322. </script>
  323. <style lang="scss" scoped>
  324. @import "~src/styles/base/region.scss";
  325. </style>
  326. <style lang="scss">
  327. </style>