1 <template>
2 <div class="app-container company form-style">
3 <div style="overflow:hidden">
4 <div style="float:left;width:28%" class="left-area">
5 <el-input v-model="filterText" placeholder="输入关键字进行过滤" />
6 <el-tree
7 ref="tree"
8 v-loading="loading"
9 accordion
10 render-after-expand
11 node-key="value"
12 style="height:350px;overflow:auto;margin-top:10px"
13 :props="props"
14 :data="deptTreeList"
15 :filter-node-method="filterNode"
16 :default-expanded-keys="defaultShowNodes"
17 @node-click="handleNodeClick"
18 >
19 <span slot-scope="{ node }" class="span-ellipsis">
20 <span :title="node.label">{{ node.label }}</span>
21 </span>
22 </el-tree>
23 </div>
24 <!-- 右侧搜索+table -->
25 <div style="float:right;width:70%" class="right-area">
26 <ct-form ref="form" :inline="true" :model="form">
27 <el-form-item label="利润中心编码">
28 <ct-input v-model="queryItem.profitcenter_code" />
29 </el-form-item>
30 <el-form-item label="利润中心名称">
31 <ct-input v-model="queryItem.profitcenter_name" />
32 </el-form-item>
33 <ct-select
34 label="状态"
35 select-prop="status"
36 placeholder="请选择"
37 :select-value="queryItem.status"
38 :select-data-list="form.statusOptions"
39 @selectChange="statusChange"
40 />
41 <ct-button style="margin-left:5px" @click="getTable">查询</ct-button>
42 <ct-button @click="handleDownload(table.list)">导出当前</ct-button>
43 <ct-button @click="exportAll">导出全部</ct-button>
44 <ct-button v-if="false" @click="add">新增</ct-button>
45 </ct-form>
46 <div class="table-style">
47 <ct-tables
48 v-loading="loading"
49 element-loading-text="数据加载中"
50 :list="table.list"
51 :options="table.options"
52 class="table"
53 >
54 <el-table-column
55 label="利润中心编码"
56 width="120"
57 prop="profitcenter_code"
58 align="center"
59 />
60 <el-table-column
61 label="利润中心名称"
62 :show-overflow-tooltip="isShowText"
63 prop="profitcenter_name"
64 align="center"
65 />
66 <el-table-column
67 label="利润中心组编码"
68 width="130"
69 prop="profitcenter_group_code"
70 align="center"
71 />
72 <el-table-column
73 label="利润中心组名称"
74 width="130"
75 :show-overflow-tooltip="isShowText"
76 prop="profitcenter_group_name"
77 align="center"
78 />
79 <el-table-column label="账套编码" width="90" prop="account_code" align="center" />
80 <el-table-column label="账套名称" width="90" prop="account_name" align="center" />
81 <el-table-column label="启用状态" width="90" prop="status_name" align="center" />
82 <el-table-column
83 v-if="false"
84 label="操作"
85 prop="profitcenter_code"
86 align="center"
87 >
88 <template slot-scope="scope">
89 <ct-button type="save" @click="edit(scope.row)">修改</ct-button>
90 </template>
91 </el-table-column>
92 </ct-tables>
93 <ct-pagination :child-msg="table.page" @callFather="getPagination" />
94 </div>
95 </div>
96 </div>
97 </div>
98 </template>
99 <script>
100 import { getCompany, getSelect } from '@/api/base/company'
101 export default {
102 data() {
103 return {
104 defaultShowNodes: [], // 默认展开的节点
105 organs: this.$store.state.user.organs,
106 isShowText: true,
107 form: {
108 statusOptions: [
109 {
110 label: '全部',
111 value: ''
112 },
113 {
114 label: '启用',
115 value: '10'
116 },
117 {
118 label: '停用',
119 value: '20'
120 }
121 ],
122 accountOptions: []
123 },
124 queryItem: {
125 account_code: '',
126 profitcenter_code: '',
127 profitcenter_name: '',
128 status: '',
129 profitcenter_group_code: ''
130 },
131 // td模拟数据 业务中以下字段前台与后台须商定好
132 table: {
133 list: [],
134 options: {
135 stripe: true, // 是否为斑马纹 table
136 highlightCurrentRow: true, // 是否支持当前行高亮显示
137 mutiSelect: true // 是否支持列表项选中功能
138 },
139 page: {
140 size: 10,
141 pages: 0,
142 current: 1,
143 total: 0
144 }
145 },
146 loading: true,
147 filterText: '',
148 deptTreeList: [],
149 list: [],
150 props: {
151 label: 'label',
152 children: 'children',
153 isLeaf: 'isLeaf'
154 }
155 }
156 },
157 watch: {
158 filterText(val) {
159 this.$refs.tree.filter(val)
160 },
161 deptTreeList: {
162 handler() {
163 // 默认展开2级
164 this.deptTreeList.forEach(item => {
165 // item.children.forEach(items => {
166 // this.defaultShowNodes.push(items.value)
167 // })
168 // 改为默认展开1级
169 this.defaultShowNodes.push(item.value)
170 })
171 },
172 deep: true
173 }
174 },
175 mounted() {
176 // 初始化部门树
177 this.getAccountCompanySelect()
178 this.$nextTick(() => {
179 this.TreeChangeStyle()
180 })
181 this.loading = false
182 },
183 methods: {
184 // 新增start
185 filterNode(value, data) {
186 if (!value) return true
187 return data.label.indexOf(value) !== -1
188 },
189 handleNodeClick(data, node) {
190 if (data.children !== null && data.children !== undefined) {
191 this.queryItem.profitcenter_code = ''
192 this.queryItem.profitcenter_group_code = data.value
193 } else {
194 this.queryItem.profitcenter_group_code = ''
195 this.queryItem.profitcenter_code = data.value
196 }
197 this.getTable()
198 this.$nextTick(() => {
199 this.TreeChangeStyle()
200 })
201 },
202 // 获取公司树
203 getAccountCompanySelect() {
204 getSelect().then(res => {
205 res.data.forEach(item => {
206 this.deleteNullChildren(item)
207 })
208 this.deptTreeList = res.data
209 this.queryItem.profitcenter_group_code = this.deptTreeList[0].value
210 const query = { profitcenter_group_code: this.queryItem.profitcenter_group_code, size: 10, current: 1 }
211 getCompany(query).then(res => {
212 this.table.list = res.data.records
213 this.table.page.size = res.data.size
214 this.table.page.current = res.data.current
215 this.table.page.pages = res.data.pages
216 this.table.page.total = res.data.total
217 })
218 })
219 },
220 deleteNullChildren(obj) {
221 if (obj.children instanceof Array && obj.children.length > 0) {
222 obj.children.forEach(item => {
223 this.deleteNullChildren(item)
224 })
225 } else {
226 delete obj.children
227 }
228 },
229 // 新增end
230 edit(row) {
231 const profitcenter_code = row.profitcenter_code
232 this.$router.push({
233 path: '/base/company/edit',
234 query: { profitcenter_code: profitcenter_code }
235 })
236 },
237 getTable() {
238 this.table.page.current = 1
239 const query = { ...this.queryItem, ...this.table.page }
240 this.loading = true
241 getCompany(query).then(res => {
242 this.table.list = res.data.records
243 this.table.page.size = res.data.size
244 this.table.page.current = res.data.current
245 this.table.page.pages = res.data.pages
246 this.table.page.total = res.data.total
247 this.loading = false
248 })
249 },
250 getPagination(page) {
251 const query = { ...this.queryItem, ...page }
252 getCompany(query).then(res => {
253 this.table.list = res.data.records
254 this.table.page.size = res.data.size
255 this.table.page.current = res.data.current
256 this.table.page.pages = res.data.pages
257 this.table.page.total = res.data.total
258 this.loading = false
259 })
260 },
261 exportAll() {
262 const page = JSON.parse(JSON.stringify(this.table.page))
263 page.size = page.total
264 getCompany(page).then(res => {
265 const list = res.data.records
266 this.handleDownload(list)
267 })
268 },
269 handleDownload(list) {
270 import('@/vendor/Export2Excel').then(excel => {
271 const tHeader = [
272 '利润中心编码',
273 '利润中心名称',
274 '利润中心组编码',
275 '利润中心组名称',
276 '账套编码',
277 '账套名称',
278 '启用状态'
279 ]
280 const filterVal = [
281 'profitcenter_code',
282 'profitcenter_name',
283 'profitcenter_group_code',
284 'profitcenter_group_name',
285 'account_code',
286 'account_name',
287 'status_name'
288 ] // 过滤表格输出的数据
289 const data = this.formatJson(filterVal, list)
290 excel.export_json_to_excel({
291 header: tHeader,
292 data,
293 filename: '公司信息',
294 autoWidth: true
295 })
296 })
297 },
298 formatJson(filterVal, jsonData) {
299 return jsonData.map(v => filterVal.map(j => v[j]))
300 },
301 add() {
302 this.$router.push({
303 path: '/base/company/add'
304 })
305 },
306 statusChange(val) {
307 this.queryItem.status = val
308 },
309 TreeChangeStyle() {
310 // eslint-disable-next-line no-empty-character-class
311 if (navigator.appName === 'Microsoft Internet Explorer' && parseInt(navigator.appVersion.split(';')[1].replace(/[]/g, '').replace('MSIE', '')) < 10) {
312 // console.log("您的浏览器版本过低,请使用IE10及以上版本")
313 var change = document.getElementsByClassName('el-tree-node__expand-icon')
314 change.forEach((item) => {
315 item.style.display = 'none'
316 })
317 }
318 }
319 }
320 }
321 </script>
322 <style lang="scss" scoped>
323 .company{
324 .left-area{
325 .el-input {
326 width: 100%;
327 }
328 }
329 .right-area{
330 .el-form--inline .el-form-item {
331 margin-right: 0px;
332 vertical-align: inherit;
333 }
334 }
335 }
336 </style>