wbs.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <hc-card>
  3. <template #header>
  4. <div class="w-400px">
  5. <hc-search-input v-model="searchForm.wbsName" @search="searchClick" />
  6. </div>
  7. </template>
  8. <template #extra>
  9. <el-button hc-btn type="primary" @click="addRowClick">新增</el-button>
  10. <el-button hc-btn type="danger" :disabled="tableCheckKeys.length <= 0" @click="batchDelClick">删除</el-button>
  11. <el-button hc-btn type="warning" @click="elementLibrary">元素库</el-button>
  12. </template>
  13. <hc-table
  14. :column="tableColumn" :datas="tableData" :loading="tableLoading" :index-style="{ width: 60 }"
  15. is-check :check-style="{ width: 29 }" @selection-change="tableCheckChange"
  16. >
  17. <template #wbsType="{ row }">
  18. <span>{{ getWbsTypeName(row.wbsType) }}</span>
  19. </template>
  20. <template #status="{ row }">
  21. <span>{{ row.status === 1 ? '是' : '否' }}</span>
  22. </template>
  23. <template #action="{ row }">
  24. <el-link type="primary" @click="editRowLib(row)">编辑wbs库</el-link>
  25. <el-link type="warning" @click="edutRowClick(row)">修改</el-link>
  26. <el-link type="danger" @click="rowDelClick(row)">删除</el-link>
  27. </template>
  28. </hc-table>
  29. <template #action>
  30. <hc-pages :pages="searchForm" @change="pageChange" />
  31. </template>
  32. <!-- 新增/修改 -->
  33. <hc-dialog v-model="isDataInfoShow" widths="400px" is-footer-center :title="isNullES(formModel.id) ? '新增' : '修改'" @close="dialogClose">
  34. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="top" label-width="auto" size="large">
  35. <el-form-item label="WBS名称:" prop="wbsName">
  36. <el-input v-model="formModel.wbsName" clearable placeholder="请输入WBS名称" />
  37. </el-form-item>
  38. <el-form-item label="划分类型:" prop="wbsType">
  39. <el-select v-model="formModel.wbsType" placeholder="选择划分类型" filterable clearable block>
  40. <el-option v-for="item in wbsTypeData" :key="item.value" :label="item.label" :value="item.value" />
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="是否启用:" prop="status">
  44. <el-radio-group v-model="formModel.status">
  45. <el-radio :value="1">是</el-radio>
  46. <el-radio :value="0">否</el-radio>
  47. </el-radio-group>
  48. </el-form-item>
  49. </el-form>
  50. <template #footer>
  51. <el-button hc-btn @click="dialogClose">取消</el-button>
  52. <el-button hc-btn type="primary" :loading="submitLoading" @click="dialogSubmit">提交</el-button>
  53. </template>
  54. </hc-dialog>
  55. </hc-card>
  56. </template>
  57. <script setup>
  58. import { HcDelMsg } from 'hc-vue3-ui'
  59. import { onActivated, ref } from 'vue'
  60. import { arrToId, deepClone, formValidate, getArrValue, getObjValue, isNullES } from 'js-fast-way'
  61. import { getDictionaryData, reloadPage } from '~uti/tools'
  62. import mainApi from '~api/desk/wbs'
  63. //激活
  64. onActivated(() => {
  65. getWbsTypeData()
  66. getTableData()
  67. })
  68. //获取划分类型
  69. const wbsTypeData = ref([])
  70. const getWbsTypeData = async () => {
  71. wbsTypeData.value = await getDictionaryData('wbs_type')
  72. }
  73. //获取划分类型名称
  74. const getWbsTypeName = (val) => {
  75. if (isNullES(val)) return ''
  76. const data = wbsTypeData.value.find(item => {
  77. return Number(item.value) === Number(val)
  78. })
  79. const res = getObjValue(data)
  80. return res.label || ''
  81. }
  82. //搜索表单
  83. const searchForm = ref({ current: 1, size: 30, total: 0 })
  84. //搜索
  85. const searchClick = () => {
  86. searchForm.value.current = 1
  87. getTableData()
  88. }
  89. //分页
  90. const pageChange = ({ current, size }) => {
  91. searchForm.value.current = current
  92. searchForm.value.size = size
  93. getTableData()
  94. }
  95. //表格数据
  96. const tableData = ref([])
  97. const tableColumn = ref([
  98. { key: 'wbsName', name: '名称' },
  99. { key: 'wbsType', name: '划分类型', width: 120, align: 'center' },
  100. { key: 'status', name: '是否启用', width: 100, align: 'center' },
  101. { key: 'createTime', name: '创建时间', width: 180, align: 'center' },
  102. { key: 'action', name: '操作', width: 180, align: 'center' },
  103. ])
  104. //获取表格数据
  105. const tableLoading = ref(false)
  106. const getTableData = async () => {
  107. tableData.value = []
  108. tableLoading.value = true
  109. const { data } = await mainApi.page({
  110. ...searchForm.value,
  111. total: null,
  112. })
  113. tableLoading.value = false
  114. tableData.value = getArrValue(data?.records)
  115. searchForm.value.total = data?.total || 0
  116. }
  117. //表格被选择
  118. const tableCheckKeys = ref([])
  119. const tableCheckChange = (rows) => {
  120. tableCheckKeys.value = rows
  121. }
  122. //单个删除
  123. const rowDelClick = (row) => {
  124. rowRemoveApi(row.id)
  125. }
  126. //批量删除
  127. const batchDelClick = () => {
  128. const rows = tableCheckKeys.value
  129. if (rows.length <= 0) {
  130. window.$message.warning('请选择要删除的应用')
  131. return false
  132. }
  133. rowRemoveApi(arrToId(rows))
  134. }
  135. //删除接口
  136. const rowRemoveApi = (ids) => {
  137. HcDelMsg(async (resolve) => {
  138. const { isRes } = await mainApi.del(ids)
  139. resolve() //关闭弹窗的回调
  140. if (!isRes) return
  141. window.$message.success('删除成功')
  142. reloadPage()
  143. })
  144. }
  145. //新增/修改弹窗
  146. const isDataInfoShow = ref(false)
  147. const addRowClick = () => {
  148. formModel.value = { status: 1 }
  149. isDataInfoShow.value = true
  150. }
  151. //修改
  152. const edutRowClick = (row) => {
  153. formModel.value = deepClone(row)
  154. isDataInfoShow.value = true
  155. }
  156. //表单
  157. const formRef = ref(null)
  158. const formModel = ref({})
  159. const formRules = {
  160. wbsName: { required: true, trigger: 'blur', message: '请输入WBS名称' },
  161. wbsType: { required: true, trigger: 'blur', message: '请选择划分类型' },
  162. status: { required: true, trigger: 'blur', message: '请选择是否启用' },
  163. }
  164. //提交
  165. const submitLoading = ref(false)
  166. const dialogSubmit = async () => {
  167. const isForm = await formValidate(formRef.value)
  168. if (!isForm) return
  169. submitLoading.value = true
  170. const { isRes } = await mainApi.submit(formModel.value)
  171. submitLoading.value = false
  172. if (!isRes) return
  173. window.$message.success('操作成功')
  174. dialogClose()
  175. }
  176. //关闭弹窗
  177. const dialogClose = () => {
  178. isDataInfoShow.value = false
  179. submitLoading.value = false
  180. formModel.value = {}
  181. }
  182. //元素库
  183. const elementLibrary = () => {
  184. }
  185. //编辑wbs库
  186. const editRowLib = (row) => {
  187. }
  188. </script>