test-tree.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. <template>
  2. <div :class="$style.wrapHeight">
  3. <div :class="$style.rowHeight">
  4. <audit-tree
  5. ref="auditTree"
  6. :checkable="true"
  7. :draggable="true"
  8. :is-search="true"
  9. :show-line="false"
  10. :top-node-text="'测试顶节点'"
  11. :treeparams="{
  12. configId: '11',
  13. }"
  14. :default-expanded-keys="['0']"
  15. :is-select-dep="true"
  16. :dep-options="[
  17. {
  18. value: '1',
  19. lable: 'label1',
  20. key: '1',
  21. title: '临时组织',
  22. children: [
  23. {
  24. value: '11',
  25. lable: 'label2',
  26. key: '1-1',
  27. title: '临时组织1',
  28. children: [
  29. {
  30. value: '111',
  31. lable: 'label3',
  32. key: '1-1-1',
  33. title: '临时组织2',
  34. children: [],
  35. },
  36. ],
  37. },
  38. ],
  39. },
  40. ]"
  41. @treeSelect="treeSelect"
  42. @depChanged="depChanged"
  43. ></audit-tree>
  44. <div :class="$style.rightcard">
  45. <a-card>
  46. <sd-data-table-ex
  47. ref="dataTable"
  48. form-id="oaBaseBusinessTypeCat"
  49. page-id="base/businesstype/oaBaseBusinessTypeCat"
  50. :columns="columns1"
  51. :show-selection="(item) => item.editAndDeleteAuth !== 0"
  52. :actions="actions"
  53. :search-fields="['categoryName']"
  54. :filter-expressions="expressions"
  55. @recordSaved="onRecordSaved"
  56. @recordsDeleted="onRecordsDeleted"
  57. >
  58. <template slot="categoryName" slot-scope="text, record">
  59. <a
  60. v-if="record.editAndDeleteAuth !== 0"
  61. @click="
  62. () => {
  63. $refs.dataTable.showDetailModal(
  64. record.id,
  65. 'base/businesstype/oaBaseBusinessTypeCat'
  66. )
  67. }
  68. "
  69. >{{ text }}</a
  70. >
  71. <span v-else>{{ text }}</span>
  72. </template>
  73. <!-- 详情表单 -->
  74. <template v-slot:form="{ model }" @saved="onSaved">
  75. <!-- 一般字段直接写name即可 -->
  76. <sd-form-item name="categoryName" />
  77. <sd-form-item
  78. :hidden="true"
  79. name="parentId"
  80. :input-props="{ defaultValue: parentId, disabled: true }"
  81. />
  82. <sd-form-item
  83. :hidden="true"
  84. name="parentName"
  85. :input-props="{ defaultValue: parentName, disabled: true }"
  86. >
  87. </sd-form-item>
  88. <a-form-model-item
  89. label="上级分类"
  90. :rules="[
  91. {
  92. required: true,
  93. trigger: ['change', 'blur'],
  94. },
  95. ]"
  96. prop="parentId"
  97. >
  98. <sd-tree-picker
  99. v-model="parentObj"
  100. single
  101. :load-tree-data="loadTreeData"
  102. @change="fnTreePicker"
  103. >
  104. </sd-tree-picker>
  105. </a-form-model-item>
  106. <a-form-model-item
  107. :label="'编\u2003\u2003码'"
  108. :rules="[
  109. {
  110. required: true,
  111. trigger: ['change', 'blur'],
  112. },
  113. {
  114. validator: validator,
  115. trigger: ['change', 'blur'],
  116. },
  117. ]"
  118. prop="categoryCode"
  119. >
  120. <a-input v-model="model.categoryCode">
  121. <a-tooltip slot="suffix" title="编码推荐格式:PRODUCT_模块_业务,如PRODUCT_GW_FW">
  122. <a-icon type="info-circle" /> </a-tooltip
  123. ></a-input>
  124. </a-form-model-item>
  125. <sd-form-item name="sortNumber" />
  126. <sd-form-item name="isDoc"> </sd-form-item>
  127. <sd-form-item name="redheadEnable"> </sd-form-item>
  128. </template>
  129. </sd-data-table-ex>
  130. </a-card>
  131. </div>
  132. </div>
  133. </div>
  134. </template>
  135. <script>
  136. import TableColumnTypes from '@/common/services/table-column-types'
  137. import TableActionTypes from '@/common/services/table-action-types'
  138. import debounce from 'lodash.debounce'
  139. import axios from '@/common/services/axios-instance'
  140. import auditTree from '../../components/audit-tree.vue'
  141. import BusinesstypeService from '../../../../src/business-type/businesstype-service'
  142. import components from './_import-components/test-tree-import'
  143. export default {
  144. name: 'TestTree',
  145. metaInfo: {
  146. title: '地址树模板',
  147. },
  148. components: {
  149. ...components,
  150. auditTree,
  151. },
  152. data() {
  153. return {
  154. key: 0,
  155. treeData: [],
  156. columns1: [
  157. {
  158. title: '排序号',
  159. dataIndex: 'sortNumber',
  160. defaultSortOrder: 'ascend',
  161. width: '100px',
  162. },
  163. {
  164. title: '分类名称',
  165. dataIndex: 'categoryName',
  166. scopedSlots: { customRender: 'categoryName' },
  167. },
  168. {
  169. title: '编码',
  170. dataIndex: 'categoryCode',
  171. },
  172. {
  173. title: '创建时间',
  174. dataIndex: 'creationTime',
  175. sorter: true,
  176. sdRender: TableColumnTypes.dateTime,
  177. },
  178. {
  179. title: '是否可编辑',
  180. dataIndex: 'editAndDeleteAuth',
  181. sdHidden: true,
  182. },
  183. ],
  184. actions: [
  185. {
  186. label: '新建',
  187. id: 'new',
  188. type: TableActionTypes.ex.create,
  189. },
  190. {
  191. label: '删除',
  192. id: 'delete',
  193. type: TableActionTypes.ex.delete, // 删除按钮,不需要回调,会自动处理(对sd-data-table无效)
  194. },
  195. ],
  196. expressions: [
  197. {
  198. dataType: 'str',
  199. name: 'parentId',
  200. op: 'eq',
  201. stringValue: 0,
  202. },
  203. ],
  204. selectedKeys: ['0'],
  205. parentId: 0,
  206. parentName: '业务类型',
  207. parentObj: [{ id: '0', name: '业务类型' }],
  208. isDocType: '', // 是否公文类
  209. }
  210. },
  211. methods: {
  212. // 获取菜单树数据
  213. addTreeKey(data) {
  214. let result
  215. if (!data) {
  216. return
  217. }
  218. for (var i = 0; i < data.length; i++) {
  219. const item = data[i]
  220. item.key = item.id
  221. if (item.children && item.children.length > 0) {
  222. result = this.addTreeKey(item.children)
  223. } else {
  224. result = this.addTreeKey(item.children)
  225. }
  226. }
  227. return result
  228. },
  229. // 处理用户要选择的数据
  230. mapCategoryItems(items) {
  231. return (items || []).map((item) => {
  232. // 不能选择当前节点的下级节点
  233. let isLeaf = item.leaf
  234. if (item.id === String(this.$refs.dataTable.getDetailModal().getFieldValue('parentId'))) {
  235. isLeaf = true
  236. }
  237. const result = {
  238. id: item.id,
  239. name: item.text,
  240. checkable: true,
  241. isLeaf,
  242. }
  243. return result
  244. })
  245. },
  246. // 获取用于选择的业务类型分类树
  247. loadTreeData(id) {
  248. if (id) {
  249. return BusinesstypeService.getCategoryTree({ parentId: id }).then((res) => {
  250. return this.mapCategoryItems(res.data)
  251. })
  252. } else {
  253. return BusinesstypeService.getCategoryTree().then((res) => {
  254. const treeNode = [
  255. {
  256. id: '0',
  257. name: '业务类型',
  258. leaf: false,
  259. children: this.mapCategoryItems(res.data),
  260. },
  261. ]
  262. return treeNode
  263. })
  264. }
  265. },
  266. // 选择上级分类后给对应的域赋值
  267. fnTreePicker(value) {
  268. if (value.length > 0) {
  269. this.$refs.dataTable.getDetailModal().setFieldValue('parentId', value[0].id)
  270. this.$refs.dataTable.getDetailModal().setFieldValue('parentName', value[0].name)
  271. } else {
  272. this.$refs.dataTable.getDetailModal().setFieldValue('parentId', '')
  273. this.$refs.dataTable.getDetailModal().setFieldValue('parentName', '')
  274. }
  275. },
  276. treeSelect(selectedKeys, info) {
  277. this.parentId = info.node.dataRef.id // 父级id
  278. this.parentName = info.node.dataRef.text // 父级名称
  279. this.parentObj = [{ id: info.node.dataRef.id, name: info.node.dataRef.text }]
  280. // 是否公文类
  281. this.isDocType = info.node.dataRef.props.isDoc
  282. this.selectedKeys = selectedKeys
  283. this.expressions.forEach((item) => {
  284. if (item.name === 'parentId') {
  285. item.stringValue = Number(info.node.dataRef.id)
  286. }
  287. })
  288. this.expressions = [...this.expressions]
  289. this.selectedKeys = selectedKeys
  290. this.parentId = Number(info.node.dataRef.id)
  291. },
  292. // 部门下拉框选择事件
  293. depChanged(value, info) {
  294. console.log(value) // 选中的值
  295. console.log(info.data.props) // 选中的下拉json
  296. },
  297. // 新建保存回调刷新树
  298. onRecordSaved() {
  299. this.$refs.auditTree.refreshTree()
  300. this.key = this.key + 1
  301. },
  302. // 删除回调
  303. onRecordsDeleted() {
  304. this.key = this.key + 1
  305. },
  306. validator(rule, value, callback) {
  307. debounce(() => {
  308. axios
  309. .get(
  310. `api/xcoa-mobile/v1/businesstype-manage/categories/check-code?categoryCode=${value}&id=${this.$refs.dataTable
  311. .getDetailModal()
  312. .getFieldValue('id') || ''}`
  313. )
  314. .then((res) => {
  315. if (res?.data?.status === 'success') {
  316. callback()
  317. } else {
  318. callback('已存在分类编码,不可以重复')
  319. }
  320. })
  321. }, 500)()
  322. },
  323. },
  324. }
  325. </script>
  326. <style module lang="scss">
  327. @use '@/common/design' as *;
  328. .wrap-height {
  329. height: 100%;
  330. .row-height {
  331. display: flex;
  332. flex: auto;
  333. height: 100%;
  334. .rightcard {
  335. flex: 1;
  336. width: calc(100% - 20%);
  337. height: 100%;
  338. }
  339. }
  340. }
  341. </style>