import ProTable from '@ant-design/pro-table' import numeral from 'numeral' import './printBox.less' import { CurrentUser } from 'umi' import session from './session' import moment from 'moment' import { synchroBehaviorRecord } from '@/services/user' export type TreeSelectModel = { value: number | string, id: number | string, title: string, pId: number | string, disabled?: boolean } export type TreeNodeDto = { node: any; children: TreeNodeDto[]; } /** * @description: [{node:{},chidlren:[]}] => [{...node,children}] * @param {any} node 需要拼接的父节点 * @param {any} chidlren 需要遍历的平级节点 合并节点中的 * @return {*} 返回[node:{...,children:[]}] */ export function wrapTreeNode(data: TreeNodeDto[]) { const wrapData: any = data.map((item: TreeNodeDto) => { const node = { ...item.node }; if (item.children && item.children.length > 0) { node.children = wrapTreeNode(item.children); } return node }); return wrapData; } export function formatTreeForProTable(data: TreeNodeDto[]) { const wrapData = wrapTreeNode(data); return { data: wrapData, current: 1, pageSize: 100, total: 100, success: true, }; } export function tableList(list: any) { return { data: list.List || [], current: list.PageIndex || 1, pageSize: list.pageSize || 10, total: list.TotalCount || 0, otherData: list?.OtherData || '', success: true, }; } /** * @description:生产的数据仅提供 treeSelect组件treeDataSimpleMode模式使用的 数据, * @param fields 需要转化的数据, * @param treeKeys fields 与 TreeSelectModel 数据键值 如 fields as EnumItem ,treeKeys: { title: 'fieldEnumName', value: 'id', id:'id', pId:'parentId' } * @returns TreeSelectModel[] */ export const getTreeSelectOption = async (treeKeys: TreeSelectModel, fields: any[]) => { const option: TreeSelectModel[] = [] const { value, title, pId, id } = treeKeys fields.forEach(async (item: any) => { option.push({ value: item[value], title: item[title], pId: item[pId], id: item[id] }) if (item.children) { const children: TreeSelectModel[] = await getTreeSelectOption(treeKeys, item.children) option.push(...children) } }) return option } // 转换数据为option格式数据 export function formateOptions(list: [], rules: { name: string; value: string; other?: string }) { // let options: { label: string; value: number | string; other?: string | number }[] = []; const { name, value, other } = rules; if (list && other) { return list.map((n) => { return { label: n[name], value: n[value], other: n[other], }; }); } if (list) { return list.map((n) => { return { label: n[name], value: n[value], }; }); } return []; } // 转换options数据value类型为 number export function formateField(list: { label: string; value: string | number }[]) { const valueNumber: { label: string; value: number }[] = []; list.map((n: any) => { if (!isNaN(Number(n.value))) { valueNumber.push({ label: n.label, value: numeral(n.value).value(), }); } }); return valueNumber.length > 0 ? valueNumber : list; } // 转换树节点的value类型为string export function formateTreeField(list: TreeNodeDto[]) { const valueNumber: any[] = list.map((item: TreeNodeDto) => { const node = { label: item.node.label, value: item.node.value.toString(), type: item.node.type, ico: item.node.ico }; if (item.children && item.children.length > 0) { node.children = formateTreeField(item.children); } return node }); return valueNumber.length > 0 ? valueNumber : list; } // 把图片格式转化为 ui框架需要的数据格式 export const transferImg = (orgIamges: any[]) => { const newImages = orgIamges.map((n: any) => { if (typeof n === 'object') { return { uid: n.ImageId, // 注意,这个uid一定不能少,否则上传失败 name: n.ImageName, status: 'done', url: n.ImageUrl, // url 是展示在页面上的绝对链接 imgUrl: n.ImagePath, } } const [name] = [...n.split("/")].reverse() return { uid: new Date().getTime(), // 注意,这个uid一定不能少,否则上传失败 name, status: 'done', url: n, // url 是展示在页面上的绝对链接 imgUrl: n, } }) return newImages } // 合计方法 export const handleGetSumRow = (data: any[], fieldList: string[], sumTitle: string, avgFiled?: string) => { // data 表格数据 fieldList 要算合计的字段 sumTitle 显示合计两个字的字段 avgFiled 要算均值的字段(这个字段也必须在算合计的字段里面) if (data && data.length > 0) { if (data.length >= 2) { const res: any = {} if (fieldList && fieldList.length > 0) { fieldList.forEach((item: any) => { res[item] = 0 }) } data.forEach((item: any) => { if (res) { for (const key in res) { if (item[key]) { res[key] += item[key] } } } }) if (avgFiled) { res[avgFiled] = Number((res[avgFiled] / data.length).toFixed(2)) } console.log('res', res); res[sumTitle] = "合计" data.unshift(res) return data } // 一个片区的时候 判断是不是一个服务区 一个服务区的话 就单单显示一个服务区就好 if (data && data.length === 1) { const obj: any = data[0] if (obj.children && obj.children.length === 1) { return obj.children } return data } return data } return [] } // 自定义打印的内容的打印方法 export const handleNewPrint = (printName: string, title: string, neckBox?: any, styles?: any, tableDom?: any, footer?: any) => { // printName 打印出来文件的名称 // title 打印内容的标题 // neckBox 标题下面可能会要求的打印的内容 数组 {label,value}格式 样式已写死 // styles 获取页面的样式 // tableDom 要打印显示的表格 直接dom元素拿进来(处理好的) // footer 打印内容底部的自定义样式 需求不一样 样式也不一样 外面写好样式和标签直接传入 const printWindow = window.open('', '_blank', 'width=1400,height=800'); if (printWindow) { printWindow.document.open(); printWindow.document.write(`