|
@@ -0,0 +1,746 @@
|
|
|
+import {reactive, ref, unref, defineAsyncComponent } from "vue";
|
|
|
+import {httpGroupRequest} from "/@/components/Form/src/utils/GroupRequest";
|
|
|
+import {defHttp} from '/@/utils/http/axios';
|
|
|
+import {filterMultiDictText} from '/@/utils/dict/JDictSelectUtil.js';
|
|
|
+import {useMessage} from '/@/hooks/web/useMessage';
|
|
|
+import { OnlineColumn } from '/@/components/jeecg/OnLine/types/onlineConfig'
|
|
|
+import { h } from 'vue'
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
+import {useMethods} from '/@/hooks/system/useMethods';
|
|
|
+
|
|
|
+export function usePopBiz(props,tableRef?) {
|
|
|
+
|
|
|
+ const {createMessage} = useMessage();
|
|
|
+ //弹窗可视状态
|
|
|
+ const visible = ref(false);
|
|
|
+ //表格加载
|
|
|
+ const loading = ref(false);
|
|
|
+ //cgRpConfigId
|
|
|
+ const cgRpConfigId = ref('');
|
|
|
+ //标题
|
|
|
+ const title = ref('列表');
|
|
|
+ // 排序字段,默认无排序
|
|
|
+ const iSorter = ref<any>('');
|
|
|
+ // 查询对象
|
|
|
+ const queryInfo = ref([]);
|
|
|
+ // 查询参数
|
|
|
+ const queryParam = ref<any>({});
|
|
|
+ // 动态参数
|
|
|
+ const dynamicParam = ref<any>({});
|
|
|
+ //字典配置项
|
|
|
+ const dictOptions = ref({});
|
|
|
+ //数据集
|
|
|
+ const dataSource = ref<Array<object>>([]);
|
|
|
+ //定义表格信息
|
|
|
+ const columns = ref<Array<object>>([]);
|
|
|
+ //定义请求url信息
|
|
|
+ const configUrl = reactive({
|
|
|
+ //列表页加载column和data
|
|
|
+ getColumnsAndData: '/online/cgreport/api/getColumnsAndData/',
|
|
|
+ getColumns: '/online/cgreport/api/getRpColumns/',
|
|
|
+ getData: '/online/cgreport/api/getData/',
|
|
|
+ getQueryInfo: '/online/cgreport/api/getQueryInfo/',
|
|
|
+ export: '/online/cgreport/api/exportXls/'
|
|
|
+ });
|
|
|
+ //已选择的值
|
|
|
+ const checkedKeys = ref<Array<string | number>>([]);
|
|
|
+ //选择的行记录
|
|
|
+ const selectRows = ref<Array<any>>([]);
|
|
|
+ // 点击单元格选中行 popup需要 但是报表预览不需要
|
|
|
+ let clickThenCheckFlag = true
|
|
|
+ if(props.clickToRowSelect===false){
|
|
|
+ clickThenCheckFlag = false
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 选择列配置
|
|
|
+ */
|
|
|
+ const rowSelection = {
|
|
|
+ fixed: true,
|
|
|
+ selectedRowKeys: checkedKeys,
|
|
|
+ selectionRows: selectRows,
|
|
|
+ onChange: onSelectChange
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 序号列配置
|
|
|
+ */
|
|
|
+ const indexColumnProps = {
|
|
|
+ dataIndex: 'index',
|
|
|
+ width: '15px',
|
|
|
+ };
|
|
|
+ /**
|
|
|
+ * 分页配置
|
|
|
+ */
|
|
|
+ const pagination = reactive({
|
|
|
+ current: 1,
|
|
|
+ pageSize: 10,
|
|
|
+ pageSizeOptions: ['10', '20', '30'],
|
|
|
+ // showTotal: (total, range) => {
|
|
|
+ // return range[0] + '-' + range[1] + ' 共' + total + '条'
|
|
|
+ // },
|
|
|
+ showQuickJumper: true,
|
|
|
+ showSizeChanger: true,
|
|
|
+ total: 0,
|
|
|
+ // 合计逻辑 [待优化 3.0]
|
|
|
+ showTotal: (total) => onShowTotal(total),
|
|
|
+ realPageSize: 10,
|
|
|
+ realTotal: 0,
|
|
|
+ // 是否有合计列,默认为"",在第一次获取到数据之后会设计为ture或者false
|
|
|
+ isTotal: <string | boolean> '',
|
|
|
+ onShowSizeChange: (current, pageSize) => onSizeChange(current, pageSize)
|
|
|
+ });
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 表格选择事件
|
|
|
+ * @param selectedRowKeys
|
|
|
+ * @param selectRow
|
|
|
+ */
|
|
|
+ function onSelectChange(selectedRowKeys: (string | number)[]) {
|
|
|
+ if (!selectedRowKeys || selectedRowKeys.length == 0) {
|
|
|
+ selectRows.value = []
|
|
|
+ } else {
|
|
|
+ for (let i = 0; i < selectedRowKeys.length; i++) {
|
|
|
+ let combineKey = combineRowKey(getRowByKey(selectedRowKeys[i]));
|
|
|
+ let keys = unref(checkedKeys);
|
|
|
+ if (combineKey && keys.indexOf(combineKey) < 0) {
|
|
|
+ let row = getRowByKey(selectedRowKeys[i]);
|
|
|
+ row && selectRows.value.push(row)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ checkedKeys.value = selectedRowKeys;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 过滤没用选项
|
|
|
+ * @param selectedRowKeys
|
|
|
+ */
|
|
|
+ function filterUnuseSelect() {
|
|
|
+ selectRows.value = unref(selectRows).filter(item=>{
|
|
|
+ let combineKey = combineRowKey(item);
|
|
|
+ return unref(checkedKeys).indexOf(combineKey)>=0
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据key获取row信息
|
|
|
+ * @param key
|
|
|
+ */
|
|
|
+ function getRowByKey(key) {
|
|
|
+ let row = unref(dataSource).filter(record => combineRowKey(record) === key);
|
|
|
+ return row&&row.length>0?row[0]:'';
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载rowKey
|
|
|
+ */
|
|
|
+ function combineRowKey(record) {
|
|
|
+ let res = record?.id || '';
|
|
|
+ Object.keys(record).forEach(key => {
|
|
|
+ res = (key =='rowIndex') ? (record[key] + res) : (res + record[key]);
|
|
|
+ });
|
|
|
+ res = res.length > 50 ? res.substring(0, 50) : res;
|
|
|
+ return res
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载列信息
|
|
|
+ */
|
|
|
+ function loadColumnsInfo() {
|
|
|
+ let url = `${configUrl.getColumns}${props.code}`;
|
|
|
+ //缓存key
|
|
|
+ let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';
|
|
|
+ httpGroupRequest(() => defHttp.get({url}, {isTransformResponse: false, successMessageMode: 'none'}), groupIdKey).then(res => {
|
|
|
+ if (res.success) {
|
|
|
+ initDictOptionData(res.result.dictOptions);
|
|
|
+ cgRpConfigId.value = res.result.cgRpConfigId;
|
|
|
+ title.value = res.result.cgRpConfigName;
|
|
|
+ let currColumns = res.result.columns;
|
|
|
+ for (let a = 0; a < currColumns.length; a++) {
|
|
|
+ if (currColumns[a].customRender) {
|
|
|
+ let dictCode = currColumns[a].customRender;
|
|
|
+ currColumns[a].customRender = ({text}) => {
|
|
|
+ return filterMultiDictText(unref(dictOptions)[dictCode], text + "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 排序字段受控
|
|
|
+ if (unref(iSorter) && currColumns[a].dataIndex === unref(iSorter).column) {
|
|
|
+ currColumns[a].sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (currColumns[0].key !== 'rowIndex') {
|
|
|
+ currColumns.unshift({
|
|
|
+ title: '序号',
|
|
|
+ dataIndex: 'rowIndex',
|
|
|
+ key:'rowIndex',
|
|
|
+ width:60,
|
|
|
+ align:"center",
|
|
|
+ customRender:function ({text}) {
|
|
|
+ return parseInt(text)+1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ columns.value = [...currColumns];
|
|
|
+ initQueryInfo(null)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载列和数据[列表专用]
|
|
|
+ */
|
|
|
+ function loadColumnsAndData() {
|
|
|
+ // 第一次加载 置空isTotal 在这里调用确保 该方法只是进入页面后 加载一次 其余查询不走该方法
|
|
|
+ pagination.isTotal = ''
|
|
|
+ let url = `${configUrl.getColumnsAndData}${props.id}`;
|
|
|
+ //缓存key
|
|
|
+ let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';
|
|
|
+ httpGroupRequest(() => defHttp.get({url}, {isTransformResponse: false, successMessageMode: 'none'}), groupIdKey).then(res => {
|
|
|
+ if (res.success) {
|
|
|
+ initDictOptionData(res.result.dictOptions);
|
|
|
+ cgRpConfigId.value = props.id;
|
|
|
+ let { columns: metaColumnList, cgreportHeadName, fieldHrefSlots, isGroupTitle } = res.result;
|
|
|
+ title.value = cgreportHeadName;
|
|
|
+ // href 跳转
|
|
|
+ const fieldHrefSlotKeysMap = {}
|
|
|
+ fieldHrefSlots.forEach(item => fieldHrefSlotKeysMap[item.slotName] = item)
|
|
|
+ let currColumns = handleColumnHrefAndDict(metaColumnList, fieldHrefSlotKeysMap)
|
|
|
+
|
|
|
+ // popup需要序号, 普通列表不需要
|
|
|
+ if(clickThenCheckFlag===true){
|
|
|
+ currColumns.unshift({
|
|
|
+ title: '序号',
|
|
|
+ dataIndex: 'rowIndex',
|
|
|
+ key:'rowIndex',
|
|
|
+ width:60,
|
|
|
+ align:"center",
|
|
|
+ customRender:function ({text}) {
|
|
|
+ return parseInt(text)+1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合并表头
|
|
|
+ if(isGroupTitle === true){
|
|
|
+ currColumns = handleGroupTitle(currColumns);
|
|
|
+ }
|
|
|
+ columns.value = [...currColumns];
|
|
|
+ initQueryInfo(res.result.data)
|
|
|
+ }else{
|
|
|
+ //update-begin-author:taoyan date:20220401 for: VUEN-583【vue3】JeecgBootException: sql黑名单校验不通过,请联系管理员!,前台无提示
|
|
|
+ createMessage.warning(res.message)
|
|
|
+ //update-end-author:taoyan date:20220401 for: VUEN-583【vue3】JeecgBootException: sql黑名单校验不通过,请联系管理员!,前台无提示
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理求和的列 合计逻辑 [待优化 3.0]
|
|
|
+ */
|
|
|
+ function handleSumColumn(metaColumnList: OnlineColumn[], dataTotal: number):void {
|
|
|
+ // 获取需要合计列的dataIndex
|
|
|
+ let sumColumnList = getNeedSumColumns(metaColumnList);
|
|
|
+ // 判断是否为第一次获取数据,如果是的话,则需要重新设置pageSize
|
|
|
+ if (pagination.isTotal == '') {
|
|
|
+ if (sumColumnList.length > 0) {
|
|
|
+ pagination.isTotal = true
|
|
|
+ // 有合计字段时,每次最多查询原pageSize-1条记录,另外需要第一次时将查询的10条中删除最后一条
|
|
|
+ // 删除最后一条数据 如果第一次得到的数据长度等于pageSize的话,则删除最后一条
|
|
|
+ if (dataSource.value.length == pagination.pageSize) {
|
|
|
+ let remove_data = dataSource.value.pop()
|
|
|
+ }
|
|
|
+ pagination.realPageSize = pagination.pageSize - 1
|
|
|
+ } else {
|
|
|
+ pagination.isTotal = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 需要添加合计字段
|
|
|
+ if (pagination.isTotal) {
|
|
|
+ let totalRow = { }
|
|
|
+ sumColumnList.forEach(dataIndex => {
|
|
|
+ let count = 0
|
|
|
+ dataSource.value.forEach(row => {
|
|
|
+ // 统计去除null及空数据
|
|
|
+ if(row[dataIndex] != null && row[dataIndex] != ''){
|
|
|
+ count += parseFloat(row[dataIndex])
|
|
|
+ }
|
|
|
+ })
|
|
|
+ totalRow[dataIndex] = isNaN(count) ? '包含非数字内容' : count.toFixed(2)
|
|
|
+
|
|
|
+ // 长整形时合计不显示.00后缀
|
|
|
+ let v = metaColumnList.find(v=>v.dataIndex==dataIndex);
|
|
|
+ if(v && v.fieldType == 'Long'){
|
|
|
+ totalRow[dataIndex] = parseInt(totalRow[dataIndex]);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ dataSource.value.push(totalRow)
|
|
|
+ pagination.realTotal = dataTotal
|
|
|
+ pagination.total = Number(dataTotal) + Number(Math.floor(dataTotal/pagination.realPageSize))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取需要求和的列 dataIndex
|
|
|
+ * @param columns
|
|
|
+ */
|
|
|
+ function getNeedSumColumns(columns: OnlineColumn[]):string[]{
|
|
|
+ let arr:string[] = []
|
|
|
+ for(let column of columns){
|
|
|
+ if (column.isTotal === '1') {
|
|
|
+ arr.push(column.dataIndex!)
|
|
|
+ if(column.children && column.children.length>0){
|
|
|
+ let subArray = getNeedSumColumns(column.children)
|
|
|
+ if(subArray.length>0){
|
|
|
+ arr.push(...subArray)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return arr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理列的href和字典翻译
|
|
|
+ */
|
|
|
+ function handleColumnHrefAndDict(columns: OnlineColumn[], fieldHrefSlotKeysMap:{}):OnlineColumn[] {
|
|
|
+ for(let column of columns){
|
|
|
+ let { customRender, hrefSlotName, fieldType } = column
|
|
|
+ // online 报表中类型配置为日期(yyyy-MM-dd ),但是实际展示为日期时间格式(yyyy-MM-dd HH:mm:ss) issues/3042
|
|
|
+ if(fieldType=='Date'){
|
|
|
+ column.customRender = ({text}) => {
|
|
|
+ if(!text){
|
|
|
+ return ''
|
|
|
+ }
|
|
|
+ if(text.length>10){
|
|
|
+ return text.substring(0, 10)
|
|
|
+ }
|
|
|
+ return text;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if (!hrefSlotName && (column.scopedSlots && column.scopedSlots.customRender)) {
|
|
|
+ //【Online报表】字典和href互斥 这里通过fieldHrefSlotKeysMap 先找到是href的列
|
|
|
+ if (fieldHrefSlotKeysMap.hasOwnProperty(column.scopedSlots.customRender)) {
|
|
|
+ hrefSlotName = column.scopedSlots.customRender
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果 customRender 有值则代表使用了字典
|
|
|
+ // 如果 hrefSlotName 有值则代表使用了href跳转
|
|
|
+ // 两者可以兼容。兼容的具体思路为:先获取到字典替换的值,再添加href链接跳转
|
|
|
+ if (customRender || hrefSlotName) {
|
|
|
+ let dictCode = customRender as string
|
|
|
+ let replaceFlag = '_replace_text_'
|
|
|
+ column.customRender = ({text, record}) => {
|
|
|
+ let value = text
|
|
|
+ // 如果 dictCode 有值,就进行字典转换
|
|
|
+ if (dictCode) {
|
|
|
+ if (dictCode.startsWith(replaceFlag)) {
|
|
|
+ let textFieldName = dictCode.replace(replaceFlag, '')
|
|
|
+ value = record[textFieldName]
|
|
|
+ } else {
|
|
|
+ value = filterMultiDictText(unref(dictOptions)[dictCode], text + "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 扩展参数设置列的内容长度
|
|
|
+ if(column.showLength){
|
|
|
+ if(value && value.length>column.showLength){
|
|
|
+ value = value.substr(0, column.showLength)+'...'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 如果 hrefSlotName 有值,就生成一个 a 标签,包裹住字典替换后(或原生)的值
|
|
|
+ if (hrefSlotName) {
|
|
|
+ let field = fieldHrefSlotKeysMap[hrefSlotName]
|
|
|
+ if (field) {
|
|
|
+ return h('a', {
|
|
|
+ onClick: ()=>handleClickFieldHref(field, record)
|
|
|
+ }, value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return columns;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理合并表头
|
|
|
+ * @param columns
|
|
|
+ */
|
|
|
+ function handleGroupTitle(columns: OnlineColumn[]):OnlineColumn[]{
|
|
|
+ let newColumns:OnlineColumn[] = []
|
|
|
+ for(let column of columns){
|
|
|
+ //排序字段受控 ---- 此逻辑为新增逻辑 待
|
|
|
+ if (unref(iSorter) && column.dataIndex === unref(iSorter).column) {
|
|
|
+ column.sortOrder = unref(iSorter).order === 'asc' ? 'ascend' : 'descend'
|
|
|
+ }
|
|
|
+ //判断字段是否需要合并表头
|
|
|
+ if (column.groupTitle) {
|
|
|
+ let clIndex = newColumns.findIndex(im => im.title === column.groupTitle)
|
|
|
+ if (clIndex !== -1) {
|
|
|
+ //表头已存在直接push children
|
|
|
+ newColumns[clIndex].children!.push(column)
|
|
|
+ } else {
|
|
|
+ //表头不存在组装表头信息
|
|
|
+ let clGroup:OnlineColumn = {},child:OnlineColumn[] = []
|
|
|
+ child.push(column)
|
|
|
+ clGroup.title = column.groupTitle
|
|
|
+ clGroup.align = 'center'
|
|
|
+ clGroup.children = child
|
|
|
+ newColumns.push(clGroup)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ newColumns.push(column)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return newColumns;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取路由器对象 href跳转用到
|
|
|
+ let router = useRouter();
|
|
|
+ /**
|
|
|
+ * href 点击事件
|
|
|
+ * @param field
|
|
|
+ * @param record
|
|
|
+ */
|
|
|
+ function handleClickFieldHref(field, record) {
|
|
|
+ let href = field.href
|
|
|
+ let urlPattern = /(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?/
|
|
|
+ let compPattern = /\.vue(\?.*)?$/
|
|
|
+ let jsPattern = /{{([^}]+)}}/g // {{ xxx }}
|
|
|
+ if (typeof href === 'string') {
|
|
|
+ href = href.trim().replace(/\${([^}]+)?}/g, (s1, s2) => record[s2])
|
|
|
+ // 执行 {{...}} JS增强语句
|
|
|
+ if (jsPattern.test(href)) {
|
|
|
+ href = href.replace(jsPattern, function (text, s0) {
|
|
|
+ try {
|
|
|
+ return eval(s0)
|
|
|
+ } catch (e) {
|
|
|
+ console.error(e)
|
|
|
+ return text
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (urlPattern.test(href)) {
|
|
|
+ window.open(href, '_blank')
|
|
|
+ } else if (compPattern.test(href)) {
|
|
|
+ // 处理弹框
|
|
|
+ openHrefCompModal(href)
|
|
|
+ } else {
|
|
|
+ router.push(href)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 导出
|
|
|
+ */
|
|
|
+ function handleExport() {
|
|
|
+ const {handleExportXls} = useMethods();
|
|
|
+ let url = `${configUrl.export}${cgRpConfigId.value}`;
|
|
|
+ let params = getQueryParams();//查询条件
|
|
|
+ handleExportXls(title.value , url, params)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合计逻辑 [待优化 3.0]
|
|
|
+ * 分页 大小改变事件
|
|
|
+ * @param _current
|
|
|
+ * @param size
|
|
|
+ */
|
|
|
+ function onSizeChange(_current, size){
|
|
|
+ pagination.isTotal = '';
|
|
|
+ pagination.pageSize = size;
|
|
|
+ if(pagination.isTotal){
|
|
|
+ pagination.realPageSize = size - 1;
|
|
|
+ }else{
|
|
|
+ pagination.realPageSize = size
|
|
|
+ }
|
|
|
+ pagination.current = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 合计逻辑 [待优化 3.0]
|
|
|
+ * 显示总条数
|
|
|
+ * @param total
|
|
|
+ */
|
|
|
+ function onShowTotal(total) {
|
|
|
+ // 重新根据是否有合计计算每页显示的数据
|
|
|
+ let start = (pagination.current - 1) * pagination.realPageSize + 1
|
|
|
+ let end = start + (pagination.isTotal ? dataSource.value.length - 1 : dataSource.value.length) - 1
|
|
|
+ let realTotal = pagination.isTotal ? pagination.realTotal : total
|
|
|
+ return start + '-' + end + ' 共' + realTotal + '条'
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 弹出框显示隐藏触发事件
|
|
|
+ */
|
|
|
+ async function visibleChange($event) {
|
|
|
+ visible.value = $event;
|
|
|
+ $event && loadColumnsInfo();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化查询条件
|
|
|
+ * @param data 数据结果集
|
|
|
+ */
|
|
|
+ function initQueryInfo(data) {
|
|
|
+ let url = `${configUrl.getQueryInfo}${unref(cgRpConfigId)}`
|
|
|
+ //缓存key
|
|
|
+ let groupIdKey = props.groupId ? `${props.groupId}${url}` : '';
|
|
|
+ httpGroupRequest(() => defHttp.get({url}, {isTransformResponse: false, successMessageMode: 'none'}), groupIdKey).then((res) => {
|
|
|
+ // console.log("获取查询条件", res);
|
|
|
+ if (res.success) {
|
|
|
+ dynamicParamHandler(res.result);
|
|
|
+ queryInfo.value = res.result;
|
|
|
+ console.log("queryInfo==>",queryInfo.value)
|
|
|
+ //查询条件加载后再请求数据
|
|
|
+ if(data){
|
|
|
+ setDataSource(data)
|
|
|
+ }else{
|
|
|
+ //没有传递data时查询数据
|
|
|
+ loadData(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+ createMessage.warning(res.message)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载表格数据
|
|
|
+ * @param arg
|
|
|
+ */
|
|
|
+ function loadData(arg?) {
|
|
|
+ if (arg == 1) {
|
|
|
+ pagination.current = 1
|
|
|
+ }
|
|
|
+ let params = getQueryParams();//查询条件
|
|
|
+ loading.value = true;
|
|
|
+ let url = `${configUrl.getData}${unref(cgRpConfigId)}`
|
|
|
+ //缓存key
|
|
|
+ let groupIdKey = props.groupId ? `${props.groupId}${url}${JSON.stringify(params)}` : '';
|
|
|
+ httpGroupRequest(() => defHttp.get({url, params}, {isTransformResponse: false, successMessageMode: 'none'}), groupIdKey).then(res => {
|
|
|
+ loading.value = false;
|
|
|
+ let data = res.result;
|
|
|
+ console.log("表格信息:", data)
|
|
|
+ setDataSource(data);
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置dataSource
|
|
|
+ */
|
|
|
+ function setDataSource(data) {
|
|
|
+ if (data) {
|
|
|
+ pagination.total = Number(data.total)
|
|
|
+ let currentPage = pagination?.current??1;
|
|
|
+ for (let a = 0; a < data.records.length; a++) {
|
|
|
+ if (!data.records[a].rowIndex) {
|
|
|
+ data.records[a].rowIndex = a+(currentPage-1)*10;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dataSource.value = data.records
|
|
|
+ } else {
|
|
|
+ pagination.total = 0;
|
|
|
+ dataSource.value = [];
|
|
|
+ }
|
|
|
+ // 合计逻辑 [待优化 3.0]
|
|
|
+ handleSumColumn(columns.value, pagination.total)
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取查询参数
|
|
|
+ */
|
|
|
+ function getQueryParams() {
|
|
|
+ let paramTarget = {};
|
|
|
+ if (unref(dynamicParam)) {
|
|
|
+ //处理自定义参数
|
|
|
+ Object.keys(unref(dynamicParam)).map(key => {
|
|
|
+ paramTarget['self_' + key] = unref(dynamicParam)[key]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ let param = Object.assign(paramTarget, unref(queryParam), unref(iSorter));
|
|
|
+ param.pageNo = pagination.current;
|
|
|
+ // 合计逻辑 [待优化 3.0]
|
|
|
+ // 实际查询时不使用table组件的pageSize,而使用自定义的realPageSize,realPageSize会在第一次获取到数据后变化
|
|
|
+ param.pageSize = pagination.realPageSize;
|
|
|
+ return filterObj(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理动态参数
|
|
|
+ */
|
|
|
+ function dynamicParamHandler(arr?) {
|
|
|
+ if (arr && arr.length > 0) {
|
|
|
+ //第一次加载查询条件前 初始化queryParam为空对象
|
|
|
+ let queryTemp = {};
|
|
|
+ for (let item of arr) {
|
|
|
+ if (item.mode === 'single') {
|
|
|
+ queryTemp[item.field] = ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+ queryParam.value = {...queryTemp}
|
|
|
+ }
|
|
|
+ let dynamicTemp = {};
|
|
|
+ if (props.param) {
|
|
|
+ Object.keys(props.param).map(key => {
|
|
|
+ let str = props.param[key];
|
|
|
+ if (key in queryParam) {
|
|
|
+ if (str && str.startsWith("'") && str.endsWith("'")) {
|
|
|
+ str = str.substring(1, str.length - 1)
|
|
|
+ }
|
|
|
+ //如果查询条件包含参数 设置值
|
|
|
+ unref(queryParam)[key] = str
|
|
|
+ }
|
|
|
+ dynamicTemp[key] = props.param[key]
|
|
|
+ })
|
|
|
+ }
|
|
|
+ dynamicParam.value = {...dynamicTemp}
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页
|
|
|
+ * @param page
|
|
|
+ * @param filters
|
|
|
+ * @param sorter
|
|
|
+ */
|
|
|
+ function handleChangeInTable(page, filters, sorter) {
|
|
|
+ console.log(page, filters, sorter);
|
|
|
+ //分页、排序、筛选变化时触发
|
|
|
+ if (Object.keys(sorter).length > 0) {
|
|
|
+ iSorter.value = {
|
|
|
+ column: sorter.field,
|
|
|
+ order: 'ascend' === sorter.order ? 'asc' : 'desc'
|
|
|
+ }
|
|
|
+ // 排序字段受控
|
|
|
+ unref(columns).forEach(col => {
|
|
|
+ if (col['dataIndex'] === sorter.field) {
|
|
|
+ col['sortOrder'] = sorter.order
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ pagination.current = page.current;
|
|
|
+ pagination.pageSize = page.pageSize;
|
|
|
+ loadData()
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 行点击事件
|
|
|
+ * @param record
|
|
|
+ */
|
|
|
+ function clickThenCheck(record) {
|
|
|
+ if(clickThenCheckFlag===true){
|
|
|
+ let rowKey = combineRowKey(record);
|
|
|
+ if (!unref(checkedKeys) || unref(checkedKeys).length == 0) {
|
|
|
+ let arr1: any[] = [], arr2: any[] = [];
|
|
|
+ arr1.push(record);
|
|
|
+ arr2.push(rowKey);
|
|
|
+ checkedKeys.value = arr2;
|
|
|
+ selectRows.value = arr1
|
|
|
+ } else {
|
|
|
+ if (unref(checkedKeys).indexOf(rowKey) < 0) {
|
|
|
+ //不存在就选中
|
|
|
+ checkedKeys.value.push(rowKey);
|
|
|
+ selectRows.value.push(record)
|
|
|
+ } else {
|
|
|
+ //已选中就取消
|
|
|
+ let rowKey_index = unref(checkedKeys).indexOf(rowKey);
|
|
|
+ checkedKeys.value.splice(rowKey_index, 1);
|
|
|
+ selectRows.value.splice(rowKey_index, 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //防止字典中有垃圾数据
|
|
|
+ function initDictOptionData(arr) {
|
|
|
+ let obj = {};
|
|
|
+ Object.keys(arr).map(k => {
|
|
|
+ obj[k] = arr[k].filter(item => {
|
|
|
+ return item != null
|
|
|
+ });
|
|
|
+ });
|
|
|
+ dictOptions.value = obj
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 过滤对象中为空的属性
|
|
|
+ * @param obj
|
|
|
+ * @returns {*}
|
|
|
+ */
|
|
|
+ function filterObj(obj) {
|
|
|
+ if (!(typeof obj == 'object')) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (let key in obj) {
|
|
|
+ if (obj.hasOwnProperty(key)
|
|
|
+ && (obj[key] == null || obj[key] == undefined || obj[key] === '')) {
|
|
|
+ delete obj[key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 样式
|
|
|
+ const dialogStyle = {
|
|
|
+ top: 0,
|
|
|
+ left: 0,
|
|
|
+ height: '100%',
|
|
|
+ margin: 0,
|
|
|
+ padding: 0,
|
|
|
+ }
|
|
|
+
|
|
|
+ // 弹窗属性配置
|
|
|
+ const hrefComponent = ref({
|
|
|
+ model: {
|
|
|
+ title: '',
|
|
|
+ okText: '关闭',
|
|
|
+ width: '100%',
|
|
|
+ visible: false,
|
|
|
+ destroyOnClose: true,
|
|
|
+ style: dialogStyle,
|
|
|
+ // dialogStyle: dialogStyle,
|
|
|
+ bodyStyle: { padding: '8px', height: 'calc(100vh - 108px)', overflow: 'auto', overflowX: 'hidden' },
|
|
|
+ // 隐藏掉取消按钮
|
|
|
+ cancelButtonProps: { style: { display: 'none' } }
|
|
|
+ },
|
|
|
+ on: {
|
|
|
+ ok: () => hrefComponent.value.model.visible = false,
|
|
|
+ cancel: () => hrefComponent.value.model.visible = false,
|
|
|
+ },
|
|
|
+ is: <any> null,
|
|
|
+ params: {},
|
|
|
+ });
|
|
|
+
|
|
|
+ // 超链点击事件--> 打开一个modal窗口
|
|
|
+ function openHrefCompModal(href) {
|
|
|
+ // 解析 href 参数
|
|
|
+ let index = href.indexOf('?')
|
|
|
+ let path = href
|
|
|
+ if (index !== -1) {
|
|
|
+ path = href.substring(0, index)
|
|
|
+ let paramString = href.substring(index + 1, href.length)
|
|
|
+ let paramArray = paramString.split('&')
|
|
|
+ let params = {}
|
|
|
+ paramArray.forEach(paramObject => {
|
|
|
+ let paramItem = paramObject.split('=')
|
|
|
+ params[paramItem[0]] = paramItem[1]
|
|
|
+ })
|
|
|
+ hrefComponent.value.params = params
|
|
|
+ } else {
|
|
|
+ hrefComponent.value.params = {}
|
|
|
+ }
|
|
|
+ hrefComponent.value.model.visible = true
|
|
|
+ hrefComponent.value.model.title = '操作'
|
|
|
+ hrefComponent.value.is = defineAsyncComponent(() => import(/* @vite-ignore */'/@/views/' + (path.startsWith('/') ? path.slice(1) : path)))
|
|
|
+ }
|
|
|
+
|
|
|
+ return [{visibleChange, loadColumnsInfo,loadColumnsAndData, dynamicParamHandler, loadData, handleChangeInTable, combineRowKey, clickThenCheck,filterUnuseSelect, handleExport},
|
|
|
+ {hrefComponent, visible, rowSelection, checkedKeys, selectRows, pagination, dataSource, columns, indexColumnProps, loading, title,iSorter,queryInfo,queryParam,dictOptions}];
|
|
|
+}
|