/**
 * 新增修改完成调用 modalFormOk方法 编辑弹框组件ref定义为modalForm
 * 高级查询按钮调用 superQuery方法  高级查询组件ref定义为superQueryModal
 * data中url定义 list为查询列表  delete为删除单条记录  deleteBatch为批量删除
 */
import { filterObj } from '@/utils/util'
import { deleteAction, downFile, postAction } from '@/api/manage'
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'

export const HrhxListMixin = {
	data() {
		return {
			//token header
			tokenHeader: { 'X-Access-Token': Vue.ls.get(ACCESS_TOKEN) },
			/* 查询条件-请不要在queryParam中声明非字符串值的属性 */
			queryParam: {},
			searchText: '',
			settingColumns: [],
			columns: [],
			defColumns: [],
			/* a-modal是否显示状态 */
			visible: false,
			/* 数据源 */
			dataSource: [],
			/* 分页参数 */
			ipagination: {
				current: 1,
				pageSize: 10,
				pageSizeOptions: ['10', '20', '30'],
				showTotal: (total, range) => {
					return range[0] + '-' + range[1] + ' 共' + total + '条'
				},
				showQuickJumper: true,
				showSizeChanger: true,
				total: 0
			},
			/* 排序参数 */
			isorter: {
				column: 'createTime',
				order: 'desc'
			},
			/* 筛选参数 */
			filters: {},
			/* table加载状态 */
			loading: false,
			/* table选中keys*/
			selectedRowKeys: [],
			/* table选中records不支持跨页*/
			selectionRows: [],
			/*table选择的records支持跨页*/
			selectRowList: [],
			/* 查询折叠 */
			toggleSearchStatus: false,
			/* 高级查询条件生效状态 */
			superQueryFlag: false,
			/* 高级查询条件 */
			superQueryParams: ''
		}
	},
	created() {
		if (!this.disableMixinCreated) {
			this.loadData()
			//初始化字典配置 在自己页面定义
			this.initDictConfig()
		}
		if (this.defColumns.length > 0) {
			this.initColumns()
		}

	},
	methods: {
		loadData(arg) {
			if (!this.url.list) {
				// this.$message.error('请设置url.list属性!')
				return
			}
			//加载数据 若传入参数1则加载第一页的内容
			if (arg === 1) {
				this.ipagination.current = 1
			}
			let conditionParams = this.getQueryParams()//查询条件
			this.loading = true
			postAction(this.url.list, conditionParams).then((res) => {
				this.loading = false
				if (res.code === '200') {
					// console.info(this.url.list, '-----', res.code, typeof res.code)
					if (res.value != null && '' != res.value) {
                        this.dataSource = res.value.records
                        this.ipagination.total = res.value.total
                        for (let i in this.dataSource) {
                            this.dataSource[i].serialNumber = (Number(this.ipagination.current) - 1) * this.ipagination.pageSize + Number(i) + 1
                        }
                    }
				}
				if (res.code === 510) {
					this.$message.warning(res.message)
				}
			})
			// .finally(() => {
			// 	this.loading = false
			// })
		},
		initDictConfig() {
		},
		handleSuperQuery(arg) {
			//高级查询方法
			if (!arg) {
				this.superQueryParams = ''
				this.superQueryFlag = false
			} else {
				this.superQueryFlag = true
				this.superQueryParams = JSON.stringify(arg)
			}
			this.loadData()
		},
		getQueryParams() {
            //获取查询条件
            let sqp = {}
            if (this.superQueryParams) {
                sqp['superQueryParams'] = encodeURI(this.superQueryParams)
            }
            let param = Object.assign(sqp, this.isorter, this.filters)
            param.value = filterObj(this.queryParam)
            param.field = this.getQueryField()
            param.pageNo = this.ipagination.current
            param.pageSize = this.ipagination.pageSize
            return filterObj(param)
        },
		getQueryField() {
			//TODO 字段权限控制
			var str = 'id,'
			this.columns.forEach(function(value) {
				str += ',' + value.dataIndex
			})
			return str
		},
		onSelect(record, selected, selectedRows, nativeEvent) {
			console.log(selectedRows)
			if (selected) {
				// 添加
				this.selectRowList.push(record)
			} else {
				// 移除
				for (let i = 0; i < this.selectRowList.length; i++) {
					if (this.selectRowList[i].id === record.id) {
						this.selectRowList.splice(i, 1)
					}
				}
			}
		},
		onSelectChange(selectedRowKeys, selectionRows) {
			if (this.onSelectMax) {
				if (selectedRowKeys.length >= this.onSelectMax) {
					this.$message.warning('不能超过' + this.onSelectMax + '条数据')
					return
				}
			}
			this.selectedRowKeys = selectedRowKeys
			this.selectionRows = selectionRows
            this.selectRowList = selectionRows
		},
		getCheckboxProps(record) {
			return ({
				props: {
					disabled: false
				}
			})
		},
		onClearSelected() {
			this.selectedRowKeys = []
			this.selectionRows = []
		},
		searchQuery() {
			this.loadData(1)
		},
		superQuery() {
			this.$refs.superQueryModal.show()
		},
		searchReset() {
			this.queryParam = {}
			this.loadData(1)
		},
		batchDel: function() {
			if (!this.url.deleteBatch) {
				this.$message.error('请设置url.deleteBatch属性!')
				return
			}
			if (this.selectedRowKeys.length <= 0) {
				this.$message.warning('请选择一条记录！')
				return
			} else {
				var ids = ''
				for (var a = 0; a < this.selectedRowKeys.length; a++) {
					ids += this.selectedRowKeys[a] + ','
				}
				var that = this
				this.$confirm({
					title: '确认删除',
					content: '是否删除选中数据?',
					onOk: function() {
						that.loading = true
						deleteAction(that.url.deleteBatch, { ids: ids }).then((res) => {
							if (res.code == '200') {
								that.$message.success(res.message)
								that.loadData()
								that.onClearSelected()
							} else {
								that.$message.warning(res.message)
							}
						}).finally(() => {
							that.loading = false
						})
					}
				})
			}
		},
		handleDelete: function(id) {
			if (!this.url.delete) {
				this.$message.error('请设置url.delete属性!')
				return
			}
			var that = this
			deleteAction(that.url.delete, { id: id }).then((res) => {
				if (res.code === '200') {
                    // that.$message.success(res.message)
					that.$message.success('删除成功!')
                    that.loadData(1)
                } else {
					that.$message.warning(res.message)
				}
			})
		},
		handleEdit: function(record) {
			this.$refs.modalForm.edit(record)
			this.$refs.modalForm.title = '编辑'
			this.$refs.modalForm.disableSubmit = false
		},
		handleAdd: function() {
			this.$refs.modalForm.add()
			this.$refs.modalForm.title = '新增'
			this.$refs.modalForm.disableSubmit = false
		},
		handleView: function(record) {
			this.$refs.detailForm.view(record)
			this.$refs.detailForm.title = '详情'
			this.$refs.detailForm.disableSubmit = true
		},
		handleTableChange(pagination, filters, sorter) {
			//分页、排序、筛选变化时触发
			//TODO 筛选
			if (Object.keys(sorter).length > 0) {
				this.isorter.column = sorter.field
				this.isorter.order = 'ascend' == sorter.order ? 'asc' : 'desc'
			}
			this.ipagination = pagination
			this.loadData()
		},
		handleToggleSearch() {
			this.toggleSearchStatus = !this.toggleSearchStatus
		},
		modalFormOk() {
            // 新增/修改 成功时，重载列表
            this.loadData(1)
        },
		handleDetail: function(record) {
			this.$refs.modalForm.edit(record)
			this.$refs.modalForm.title = '详情'
			this.$refs.modalForm.disableSubmit = true
		},
		/* 导出 */
		handleExportXls2() {
			let paramsStr = encodeURI(JSON.stringify(this.getQueryParams()))
			let url = `${window._CONFIG['domianURL']}/${this.url.exportXlsUrl}?paramsStr=${paramsStr}`
			window.location.href = url
		},
		handleExportXls(fileName) {
			if (!fileName || typeof fileName != 'string') {
				fileName = '导出文件'
			}
			let param = { ...this.queryParam }
			if (this.selectedRowKeys && this.selectedRowKeys.length > 0) {
				param['selections'] = this.selectedRowKeys.join(',')
			}
			downFile(this.url.exportXlsUrl, param).then((data) => {
				if (!data) {
					this.$message.warning('文件下载失败')
					return
				}
				if (typeof window.navigator.msSaveBlob !== 'undefined') {
					window.navigator.msSaveBlob(new Blob([data]), fileName + '.xls')
				} else {
					let url = window.URL.createObjectURL(new Blob([data]))
					let link = document.createElement('a')
					link.style.display = 'none'
					link.href = url
					link.setAttribute('download', fileName + '.xls')
					document.body.appendChild(link)
					link.click()
					document.body.removeChild(link) //下载完成移除元素
					window.URL.revokeObjectURL(url) //释放掉blob对象
				}
			})
		},
		/* 导入 */
		handleImportExcel(info) {
			if (info.file.status !== 'uploading') {
			}
			if (info.file.status === 'done') {
				if (info.file.response.success) {
					// this.$message.success(`${info.file.name} 文件上传成功`);
					if (info.file.response.code === 201) {
						let { message, result: { msg, fileUrl, fileName } } = info.file.response
						let href = window._CONFIG['domianURL'] + fileUrl
						this.$warning({
							title: message,
							content: (
								<div>
									<span>{msg}</span><br/>
									<span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
								</div>
							)
						})
					} else {
						this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
					}
					this.loadData()
				} else {
					this.$message.error(`${info.file.name} ${info.file.response.message}.`)
				}
			} else if (info.file.status === 'error') {
				this.$message.error(`文件上传失败: ${info.file.msg} `)
			}
		},
		/* 图片预览 */
		getImgView(text) {
			if (text && text.indexOf(',') > 0) {
				text = text.substring(0, text.indexOf(','))
			}
			return window._CONFIG["resourcesUrl"] + text
		},
		/* 文件下载 */
		uploadFile(text) {
			if (!text) {
				this.$message.warning('未知的文件')
				return
			}
			if (text.indexOf(',') > 0) {
				text = text.substring(0, text.indexOf(','))
			}
			window.open(window._CONFIG['domianURL'] + '/sys/common/download/' + text)
		},
		//列设置更改事件
		onColSettingsChange(checkedValues) {
			let key = this.$route.name + ':colsettings'
			Vue.ls.set(key, checkedValues, 7 * 24 * 60 * 60 * 1000)
			this.settingColumns = checkedValues
			const cols = this.defColumns.filter(item => {
				if (item.key == 'rowIndex' || item.dataIndex == 'action') {
					return true
				}
				if (this.settingColumns.includes(item.dataIndex)) {
					return true
				}
				return false
			})
			this.columns = cols
		},
		//动态列
		initColumns() {
			let key = this.$route.name + ':colsettings'
			let colSettings = this.initColumnNames
			if (colSettings == null || colSettings == undefined) {
				let allSettingColumns = []
				this.defColumns.forEach(function(item, i, array) {
					allSettingColumns.push(item.dataIndex)
				})
				this.settingColumns = allSettingColumns
				this.columns = this.defColumns
			} else {
				this.settingColumns = colSettings
				const cols = this.defColumns.filter(item => {
					if (item.key == 'rowIndex' || item.dataIndex == 'action') {
						return true
					}
					if (colSettings.includes(item.dataIndex)) {
						return true
					}
					return false
				})
				this.columns = cols
			}
		},
		advancedSearch(selectedKeys, confirm, dataIndex) {
			this.queryParam[dataIndex] = selectedKeys[0]
			this.loadData()
		},
		advancedClear(clearFilters) {
            clearFilters()
            this.searchText = undefined
            this.queryParam = {}
            this.loadData()
        },
		handleCloseCancel() {
			this.visible = false
		}
	}

}
