# 套打数据排序插件 — OnPrepareNotePrintData

用于套打模板渲染前对数据对象按业务规则排序（如按物料+序号分组排序）。

## 代码

```python
from System import *
from Kingdee.BOS import *
from Kingdee.BOS.DataEntity import *

def OnPrepareNotePrintData(e):
    # 套打模板ID
    if e.NotePrintTplId.Equals("e02063aa-b4b6-4095-8a9d-f569bdf3f90a"):
        if e.DataSourceId.Equals("FQUOTATIONENTRY",StringComparison.OrdinalIgnoreCase):
            seqKey = "FQUOTATIONENTRY" + "_" + "FSeq";
            materialKey = "FMaterialId_FNumber";
            if e.DataObjects == None or e.DataObjects.Length <= 0 or not e.DataObjects[0].DynamicObjectType.Properties.ContainsKey(materialKey):
                return;
            rowMaterialSeq = {};
            for index in range(len(e.DataObjects)):
                material = e.DataObjects[index][materialKey];
                if not rowMaterialSeq.has_key(material):
                    rowMaterialSeq[material] = e.DataObjects[index][seqKey];
            tempList = sorted(e.DataObjects,key =lambda x:(rowMaterialSeq[x[materialKey]], x[seqKey]));
            for index in range(len(tempList)):
                e.DataObjects[index] = tempList[index];
```

## 参数说明

| 参数 | 含义 |
|------|------|
| `e.NotePrintTplId` | 套打模板 ID（如 `e02063aa-b4b6-4095-8a9d-f569bdf3f90a`） |
| `e.DataSourceId` | 数据源标识（如 `FQUOTATIONENTRY`） |
| `e.DataObjects` | 当前数据源的数据对象数组 |
| `materialKey` | 分组字段（如 `FMaterialId_FNumber`） |
| `seqKey` | 分组内排序字段（如 `FQUOTATIONENTRY_FSeq`） |

## 场景

套打时默认按分组字段（如物料编码）升序/降序排序。部分场景需要按**物料+序号**分组排序：先按物料聚合，再按物料内的序号排序。

用此插件替换 `e.DataObjects` 的排序顺序即可。