| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | package bootableimport (	"io"	"golib/v3/features/mo"	"golib/v3/infra/ii"	"golib/v3/infra/ii/svc")func ResolveFilter(reader io.Reader) (Filter, error) {	b, err := io.ReadAll(reader)	if err != nil {		return Filter{}, err	}	return ResolveFilterFrom(b)}func ResolveFilterFrom(b []byte) (Filter, error) {	var filter Filter	return filter, mo.UnmarshalExtJSON(b, true, &filter)}// Handler 数据处理type Handler func(info *ii.ItemInfo, row mo.M)func FindHandle(user ii.User, itemName ii.Name, filter Filter, handler Handler) (*Response, error) {	itemInfo, ok := svc.HasItem(itemName)	if !ok {		return nil, svc.ErrItemNotfound	}	filter.user = user	bootFilter, err := filter.Build(itemInfo, svc.GetItems())	if err != nil {		return nil, err	}	service := svc.With(user)	resp := new(Response)	resp.Rows = make([]mo.M, 0)	if err = service.Aggregate(itemName, bootFilter, &resp.Rows); err != nil {		return nil, err	}	handleRows(itemInfo, resp, handler)	if len(filter.Filter) == 0 {		// 当界面传入 Custom 请求参数时, 根据条件合计出文档数量, 用于翻页		if _, value, o := mo.HasOperator(bootFilter, mo.PsMatch); o {			resp.Total, err = service.CountDocuments(itemName, &mo.Matcher{Filter: value.(mo.D)})		} else {			resp.Total, err = service.EstimatedDocumentCount(itemName)		}	} else {		// 当 filter control 含有查询条件时, 根据条件合计出文档数量, 用于翻页		if _, value, o := mo.HasOperator(bootFilter, mo.PsMatch); o {			resp.Total, err = service.CountDocuments(itemName, &mo.Matcher{Filter: value.(mo.D)})		} else {			resp.Total = int64(len(resp.Rows))		}	}	return resp, err}func Find(user ii.User, itemName ii.Name, filter Filter) (*Response, error) {	return FindHandle(user, itemName, filter, nil)}
 |