import 'package:fis_jsonrpc/services/remedical.m.dart'; import 'package:fis_measure/interfaces/process/items/item_metas.dart'; import 'package:vid/us/vid_us_unit.dart'; class ItemMetaConverter { ItemMetaConverter(this.dto); final ItemMetaDTO dto; late String _measureType = dto.measureTypeName!; late final List<ItemOutputMeta> _outputs; late final List<ItemMeta> _childItems = []; /// 输出测量项元 ItemMeta output() { if (dto.multiMethodItems != null && dto.multiMethodItems!.isNotEmpty) { _loadMulti(); } else if (dto.methodChildItems != null && dto.methodChildItems!.isNotEmpty) { _loadCombo(); _outputs = _convetOutputsFromCalc(dto.calculator!); } else { _loadSimple(); _outputs = _convetOutputsFromCalc(dto.calculator!); } final meta = ItemMeta( dto.name!, measureType: _measureType, description: dto.description!, briefAnnotation: dto.briefAnnotation ?? '', outputs: _outputs, childItems: _childItems, /// 【TODO】 暂时屏蔽 buyStatus // buyStatus: dto.status, ); return meta; } /// 简单测量 void _loadSimple() { // } /// 组合测量 void _loadCombo() { for (var child in dto.methodChildItems!) { _childItems.add(_convertChildItem(child)); } } /// 多测量方法 void _loadMulti() { final workingItem = dto.multiMethodItems!.firstWhere((e) => e.isWorking); _measureType = workingItem.measureTypeName!; if (workingItem.childItems != null && workingItem.childItems!.isNotEmpty) { for (var child in workingItem.childItems!) { _childItems.add(_convertChildItem(child)); } } _outputs = _convetOutputsFromCalc(workingItem.calculator!); } static ItemMeta _convertChildItem(ChildItemMetaDTO c) { List<ItemMeta> _kids = []; if (c.childItems != null && c.childItems!.isNotEmpty) { for (var child in c.childItems!) { // if (child.isWorking) { _kids.add(_convertChildItem(child)); // } } } return ItemMeta( c.name!, measureType: c.measureTypeName!, description: c.description ?? c.name!, outputs: _convetOutputsFromCalc(c.calculator!), childItems: _kids, ); } static List<ItemOutputMeta> _convetOutputsFromCalc( CalculatorMetaDTO calcDto) { final outputs = calcDto.availableOutputs! .where((e) => e.isWorking == true) .map((e) => _convetOutputFromDto(e)) .toList(); if (outputs.isEmpty) { //TODO: wait remove // return [_convetOutputFromDto(calcDto.availableOutputs!.first)]; return []; } return outputs; } static ItemOutputMeta _convetOutputFromDto(OutputItemMetaDTO o) { return ItemOutputMeta( o.name!, o.description!, VidUsUnitMap.getUnit(o.unit), ); } }