parent
							
								
									0185778b1b
								
							
						
					
					
						commit
						d68bebb440
					
				| 
						 | 
				
			
			@ -0,0 +1,234 @@
 | 
			
		|||
package shkd.sys.sys.plugin.report;
 | 
			
		||||
 | 
			
		||||
import dm.jdbc.util.StringUtil;
 | 
			
		||||
import kd.bos.cache.CacheFactory;
 | 
			
		||||
import kd.bos.cache.TempFileCache;
 | 
			
		||||
import kd.bos.dataentity.entity.DynamicObject;
 | 
			
		||||
import kd.bos.dataentity.entity.DynamicObjectCollection;
 | 
			
		||||
import kd.bos.dataentity.metadata.IMetadata;
 | 
			
		||||
import kd.bos.dataentity.metadata.clr.DataEntityPropertyCollection;
 | 
			
		||||
import kd.bos.entity.MainEntityType;
 | 
			
		||||
import kd.bos.entity.NumberFormatProvider;
 | 
			
		||||
import kd.bos.entity.ValueMapItem;
 | 
			
		||||
import kd.bos.entity.datamodel.FmtField;
 | 
			
		||||
import kd.bos.entity.report.*;
 | 
			
		||||
import kd.bos.form.control.Toolbar;
 | 
			
		||||
import kd.bos.form.control.events.ItemClickEvent;
 | 
			
		||||
import kd.bos.report.ReportList;
 | 
			
		||||
import kd.bos.report.plugin.AbstractReportFormPlugin;
 | 
			
		||||
import kd.bos.report.proxy.ReportListProxy;
 | 
			
		||||
import shkd.sys.sys.plugin.report.util.CsvExportUtil;
 | 
			
		||||
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
import java.math.BigDecimal;
 | 
			
		||||
import java.nio.file.Files;
 | 
			
		||||
import java.nio.file.Path;
 | 
			
		||||
import java.sql.Timestamp;
 | 
			
		||||
import java.text.SimpleDateFormat;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.time.format.DateTimeFormatter;
 | 
			
		||||
import java.util.*;
 | 
			
		||||
import java.util.concurrent.ThreadLocalRandom;
 | 
			
		||||
import java.util.stream.Collectors;
 | 
			
		||||
 | 
			
		||||
public class AccountbankReportFormPlugin extends AbstractReportFormPlugin  {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void registerListener(EventObject e) {
 | 
			
		||||
        super.registerListener(e);
 | 
			
		||||
        // 获取工具栏,监听整个工具栏
 | 
			
		||||
        Toolbar export = this.getView().getControl("toolbarap");
 | 
			
		||||
        // 监听工具栏这个按钮的点击事件
 | 
			
		||||
        export.addItemClickListener(this);
 | 
			
		||||
        export.addClickListener(this);
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 处理列表项点击事件,当点击的项为 "shkd_exportcsv" 时,执行导出 CSV 文件的操作。
 | 
			
		||||
     *
 | 
			
		||||
     * @param evt 列表项点击事件对象,包含被点击项的相关信息
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void itemClick(ItemClickEvent evt) {
 | 
			
		||||
        super.itemClick(evt);
 | 
			
		||||
        String itemKey = evt.getItemKey();
 | 
			
		||||
        if (StringUtil.equals("shkd_exportcsv", itemKey)) {
 | 
			
		||||
            // 获取数据实体类型及其属性集合
 | 
			
		||||
            MainEntityType dataEntityType = this.getModel().getDataEntityType();
 | 
			
		||||
            DataEntityPropertyCollection properties = dataEntityType.getProperties();
 | 
			
		||||
            String reportName = dataEntityType.getDisplayName().getLocaleValue();
 | 
			
		||||
 | 
			
		||||
            // 获取报表列表控件及模型,并取得行数和列信息
 | 
			
		||||
            ReportList reportList = this.getControl("reportlistap");
 | 
			
		||||
            IReportListModel reportListModel = reportList.getReportModel();
 | 
			
		||||
            int rowCount = reportListModel.getRowCount();
 | 
			
		||||
            ReportListProxy reportListProxy = new ReportListProxy(reportList);
 | 
			
		||||
            List<AbstractReportColumn> columns = reportListProxy.getColumnList(reportListModel);
 | 
			
		||||
            List<ReportColumn> cols = reportListProxy.getReportColumnList(columns, true);
 | 
			
		||||
 | 
			
		||||
            // 获取所有行数据并初始化数字格式化提供器
 | 
			
		||||
            DynamicObjectCollection rowData = reportListModel.getRowData(0, rowCount, false);
 | 
			
		||||
            NumberFormatProvider numberFormatProvider = ReportColumn.initNumberFormatProvider(rowData, cols);
 | 
			
		||||
 | 
			
		||||
            Map<String, Map<String, Object>> type = getType(reportListModel);
 | 
			
		||||
 | 
			
		||||
            // 提取需要导出的字段名(排除 fseq 字段)
 | 
			
		||||
            List<String> headerKeys = numberFormatProvider.getFmtFields().stream()
 | 
			
		||||
                    .filter(o -> !Objects.equals(o.getFieldName(), "fseq"))
 | 
			
		||||
                    .map(FmtField::getFieldName)
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
            // 构建属性名到显示名称的映射表,便于快速查找
 | 
			
		||||
            Map<String, String> nameToDisplay =
 | 
			
		||||
                    properties.stream()
 | 
			
		||||
                            .filter(Objects::nonNull)
 | 
			
		||||
                            .filter(p -> p.getDisplayName() != null)
 | 
			
		||||
                            .collect(Collectors.toMap(
 | 
			
		||||
                                    IMetadata::getName,
 | 
			
		||||
                                    p -> p.getDisplayName().getLocaleValue(),
 | 
			
		||||
                                    (v1, v2) -> v1));
 | 
			
		||||
 | 
			
		||||
            // 按照字段顺序获取对应的显示名称,缺失则使用空字符串
 | 
			
		||||
            List<String> headers = headerKeys.stream()
 | 
			
		||||
                    .map(k -> nameToDisplay.getOrDefault(k, ""))
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
            // 构造每一行的数据列表,处理复杂对象的name属性及本地化
 | 
			
		||||
            List<List<?>> rows2 = rowData.stream()
 | 
			
		||||
                    .map(obj -> headerKeys.stream()
 | 
			
		||||
                            .map(key -> this.processFieldValue(obj.get(key),type,key))
 | 
			
		||||
                            .collect(Collectors.toList()))
 | 
			
		||||
                    .collect(Collectors.toList());
 | 
			
		||||
 | 
			
		||||
            // 生成时间戳和随机数作为文件名的一部分
 | 
			
		||||
            String timestamp = LocalDateTime.now()
 | 
			
		||||
                    .format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"));
 | 
			
		||||
            int random = ThreadLocalRandom.current().nextInt(100, 1000); // 3 位随机数
 | 
			
		||||
            String reportNameExt = timestamp + random;
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                Path tempFile = Files.createTempFile(reportName + reportNameExt, ".csv");
 | 
			
		||||
                CsvExportUtil.writeCsvToFile(tempFile, headers, rows2);
 | 
			
		||||
                // 上传到临时文件服务器 获取压缩包下载地址
 | 
			
		||||
                TempFileCache tempFileCache = CacheFactory.getCommonCacheFactory().getTempFileCache();
 | 
			
		||||
                String url = tempFileCache.saveAsUrl(tempFile.getFileName().toString(), Files.newInputStream(tempFile), 3 * 60);
 | 
			
		||||
                // 下载压缩包
 | 
			
		||||
                this.getView().download(url);
 | 
			
		||||
                Files.delete(tempFile);
 | 
			
		||||
            } catch (IOException e) {
 | 
			
		||||
                throw new RuntimeException(e);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 处理字段值,支持简单值和复杂对象(如含name属性的对象)
 | 
			
		||||
     *
 | 
			
		||||
     * @param value 原始字段值
 | 
			
		||||
     * @return 处理后的字符串值
 | 
			
		||||
     */
 | 
			
		||||
    public Object processFieldValue(Object value,Map<String, Map<String, Object>> type,String key) {
 | 
			
		||||
        if (value == null) {
 | 
			
		||||
            return "";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        String disString="";//展示的文本
 | 
			
		||||
        //获取配置
 | 
			
		||||
        Map<String, Object> stringObjectMap = type.get(key);
 | 
			
		||||
        System.out.println(stringObjectMap);
 | 
			
		||||
        String Stringtype = (String) stringObjectMap.get("type");
 | 
			
		||||
        switch (Stringtype) {
 | 
			
		||||
            case "DecimalReportColumn"://数值
 | 
			
		||||
                int Scale= (int) stringObjectMap.get("value");
 | 
			
		||||
                // 设置小数点后保留两位
 | 
			
		||||
                BigDecimal roundedValue = ((BigDecimal)value).setScale(Scale, BigDecimal.ROUND_HALF_UP);
 | 
			
		||||
                // 转换为字符串
 | 
			
		||||
                disString= roundedValue.toString();
 | 
			
		||||
                break;
 | 
			
		||||
            case "ComboReportColumn"://下拉框
 | 
			
		||||
                Map<String,String> Combomap= (Map<String, String>) stringObjectMap.get("value");
 | 
			
		||||
                disString=Combomap.get(value);
 | 
			
		||||
                break;
 | 
			
		||||
            case "DateTimeReportColumn"://时间
 | 
			
		||||
                // 获取当前日期
 | 
			
		||||
                String Mask= (String) stringObjectMap.get("value");
 | 
			
		||||
                if (Mask==null){
 | 
			
		||||
                    Mask="yyyy-MM-dd";
 | 
			
		||||
                }
 | 
			
		||||
                // 指定日期格式
 | 
			
		||||
                SimpleDateFormat sdf = new SimpleDateFormat(Mask);
 | 
			
		||||
                // 格式化日期
 | 
			
		||||
                Timestamp timestamp = ((Timestamp) value);
 | 
			
		||||
                // 使用getTime()方法将Timestamp转换为Date
 | 
			
		||||
                disString = sdf.format(new Date(timestamp.getTime()));
 | 
			
		||||
                break;
 | 
			
		||||
            case "TextColumn"://文本
 | 
			
		||||
                disString=value.toString();
 | 
			
		||||
                break;
 | 
			
		||||
            case "DynamicObjectColumn"://基础资料
 | 
			
		||||
                String getDisplayProp= (String) stringObjectMap.get("value");
 | 
			
		||||
                disString=((DynamicObject)value).getString(getDisplayProp);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                disString="";
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return disString;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private Map<String, Map<String, Object>> getType(IReportListModel reportListModel){
 | 
			
		||||
        Map<String, Map<String, Object>> map = new HashMap<>();
 | 
			
		||||
        List<AbstractReportColumn> columnstype = reportListModel.getColumns();
 | 
			
		||||
        for (AbstractReportColumn abstractReportColumn : columnstype) {
 | 
			
		||||
            if (abstractReportColumn instanceof DecimalReportColumn) {
 | 
			
		||||
                DecimalReportColumn reportColumn=(DecimalReportColumn)abstractReportColumn;
 | 
			
		||||
                String fieldKey = reportColumn.getFieldKey();
 | 
			
		||||
                Map<String,Object> map1 = new HashMap<>();
 | 
			
		||||
                map1.put("type","DecimalReportColumn");
 | 
			
		||||
                map1.put("value",reportColumn.getScale());
 | 
			
		||||
                map.put(fieldKey,map1);
 | 
			
		||||
            } else if (abstractReportColumn instanceof ComboReportColumn) {
 | 
			
		||||
                ComboReportColumn reportColumn=(ComboReportColumn)abstractReportColumn;
 | 
			
		||||
                String fieldKey = reportColumn.getFieldKey();
 | 
			
		||||
                Map<String,String> column = new HashMap<>();
 | 
			
		||||
                List<ValueMapItem> comboItems = reportColumn.getComboItems();
 | 
			
		||||
                for (ValueMapItem comboItem : comboItems) {
 | 
			
		||||
                    column.put(comboItem.getValue(),comboItem.getName().getLocaleValue_zh_CN());
 | 
			
		||||
                }
 | 
			
		||||
                Map<String,Object> map1 = new HashMap<>();
 | 
			
		||||
                map1.put("type","ComboReportColumn");
 | 
			
		||||
                map1.put("value",column);
 | 
			
		||||
                map.put(fieldKey,map1);
 | 
			
		||||
            }else if (abstractReportColumn instanceof DateTimeReportColumn) {
 | 
			
		||||
                DateTimeReportColumn reportColumn=(DateTimeReportColumn)abstractReportColumn;
 | 
			
		||||
                String fieldKey = reportColumn.getFieldKey();
 | 
			
		||||
                Map<String,Object> map1 = new HashMap<>();
 | 
			
		||||
                map1.put("type","DateTimeReportColumn");
 | 
			
		||||
                map1.put("value",reportColumn.getMask());
 | 
			
		||||
                map.put(fieldKey,map1);
 | 
			
		||||
            }else {
 | 
			
		||||
                ReportColumn reportColumn=(ReportColumn)abstractReportColumn;
 | 
			
		||||
                if ("text".equals(reportColumn.getFieldType())||"integer".equals(reportColumn.getFieldType())){
 | 
			
		||||
                    //文本
 | 
			
		||||
                    String fieldKey = reportColumn.getFieldKey();
 | 
			
		||||
                    Map<String,Object> map1 = new HashMap<>();
 | 
			
		||||
                    map1.put("type","TextColumn");
 | 
			
		||||
                    map1.put("value","TextColumn");
 | 
			
		||||
                    map.put(fieldKey,map1);
 | 
			
		||||
                }else {
 | 
			
		||||
                    //基础资料
 | 
			
		||||
                    String fieldKey = reportColumn.getFieldKey();
 | 
			
		||||
                    Map<String,Object> map1 = new HashMap<>();
 | 
			
		||||
                    map1.put("type","DynamicObjectColumn");
 | 
			
		||||
                    map1.put("value",reportColumn.getDisplayProp());
 | 
			
		||||
                    map.put(fieldKey,map1);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return map;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue