m_control_point.dart 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import 'package:fixnum/fixnum.dart';
  2. import 'package:get/get.dart';
  3. import 'package:trackoffical_app/model.dart';
  4. import 'package:trackoffical_app/pb.dart' as pb;
  5. import 'package:flutter/material.dart';
  6. import 'package:trackoffical_app/utils.dart';
  7. enum MControlPointType { nfc, gps }
  8. class MControlPoint {
  9. MControlPoint(
  10. {this.sn = '',
  11. this.areaId = '',
  12. this.intId = Int64.ZERO,
  13. this.isSuccess = false});
  14. /// 点位顺序号
  15. String sn = '';
  16. /// 点位场地编号,如:A51
  17. String areaId = '';
  18. /// 点位ID
  19. Int64 intId = Int64.ZERO;
  20. bool isSuccess;
  21. /// 作为规划点打点成功
  22. bool isPlan=false;
  23. bool isNext = false;
  24. var type = MControlPointType.nfc;
  25. bool isUnchecked = true;
  26. Duration checkAfterStart = 0.seconds;
  27. Duration checkAfterPrev = 0.seconds;
  28. Distance checkDistanceAfterStart = 0.meter;
  29. Distance checkDistanceAfterPrev = 0.meter;
  30. Distance distanceStraightToPrev = 0.meter;
  31. Offset onMap = Offset.zero;
  32. MPosition position = MPosition();
  33. /// 答题ID
  34. int? qbId;
  35. bool isAnswerCorrect = false; // 答题是否正确
  36. int? userAnswerIndex; //用户答案序号
  37. Duration paceAfterPrev = Duration.zero;
  38. Duration paceAfterStart = Duration.zero;
  39. CPExtraInfo? extraInfo;
  40. bool get isStart => sn == snStart;
  41. bool get isFinish => sn == snFinish;
  42. String get snString {
  43. if (sn.isEmpty) {
  44. return '';
  45. }
  46. if (isStart) {
  47. return "开始";
  48. }
  49. if (isFinish) {
  50. return "结束";
  51. }
  52. return "$sn号";
  53. }
  54. set isStart(bool v) {
  55. if (v) {
  56. sn = snStart;
  57. }
  58. }
  59. set isFinish(bool v) {
  60. if (v) {
  61. sn = snFinish;
  62. }
  63. }
  64. static const snStart = 'start';
  65. static const snFinish = 'finish';
  66. Widget getSnDisplay(double height, {TextStyle? textStyle}) {
  67. if (isStart || isFinish) {
  68. var src = 'ic_bottom_bar_next_start.png';
  69. if (isFinish) {
  70. src = 'ic_bottom_bar_next_finish.png';
  71. }
  72. return Image.asset('assets/images/$src',
  73. height: height, fit: BoxFit.fitHeight);
  74. }
  75. return Text(sn, style: textStyle);
  76. }
  77. // pb.GameSaveControlPoint toPbSave() {
  78. // final out = pb.GameSaveControlPoint()
  79. // ..controlPointId= intId
  80. // ..isCheckSuccess= isSuccess
  81. // ..checkAfterStart= checkAfterStart.toPb()
  82. // ..distinctAfterStart= checkDistanceAfterStart.m
  83. // ..answerCorrect= isAnswerCorrect
  84. // ..isAnswer= userAnswerIndex!= null
  85. // ;
  86. // if(userAnswerIndex!= null){
  87. // out.userAnswerIndex=userAnswerIndex!;
  88. // }
  89. // if(qbId!= null){
  90. // out.userAnswerIndex=qbId!;
  91. // }
  92. //
  93. // return out;
  94. // }
  95. void updateBySimple(pb.ControlPointSimple other) {
  96. areaId = other.sn;
  97. }
  98. void updateBy(MControlPoint other) {
  99. sn = sn.isEmpty ? other.sn : sn;
  100. areaId = areaId.isEmpty ? other.areaId : areaId;
  101. extraInfo ??= other.extraInfo;
  102. }
  103. MControlPoint clone() {
  104. return MControlPoint()
  105. ..sn = sn
  106. ..areaId = ''
  107. ..intId = intId
  108. ..isSuccess = isSuccess
  109. ..isNext = isNext
  110. ..type = type
  111. ..isUnchecked = isUnchecked
  112. ..checkAfterStart = checkAfterStart
  113. ..checkAfterPrev = checkAfterPrev
  114. ..checkDistanceAfterStart = checkDistanceAfterStart
  115. ..checkDistanceAfterPrev = checkDistanceAfterPrev
  116. ..distanceStraightToPrev = distanceStraightToPrev
  117. ..onMap = onMap
  118. ..position = position
  119. ..qbId = qbId
  120. ..isAnswerCorrect = isAnswerCorrect
  121. ..userAnswerIndex = userAnswerIndex
  122. ..paceAfterPrev = paceAfterPrev
  123. ..paceAfterStart = paceAfterStart
  124. ..extraInfo = extraInfo;
  125. }
  126. }
  127. // extension PbGameSaveControlPointExt on pb.GameSaveControlPoint {
  128. // MControlPoint toModel() {
  129. // final one = MControlPoint();
  130. // one.intId = controlPointId;
  131. // one.isSuccess = isCheckSuccess;
  132. // one.checkAfterStart = checkAfterStart.toDuration();
  133. // one.checkDistanceAfterStart = distinctAfterStart.meter;
  134. // one.isAnswerCorrect = answerCorrect;
  135. // if (hasUserAnswerIndex()) {
  136. // one.userAnswerIndex = userAnswerIndex;
  137. // }
  138. // if (hasQbId()) {
  139. // one.qbId = qbId;
  140. // }
  141. // return one;
  142. // }
  143. // }
  144. extension PbControlPointExt on pb.ControlPoint {
  145. MControlPoint toModel() {
  146. final one = MControlPoint();
  147. one.areaId = sn;
  148. one.intId = id;
  149. one.position = ciPosition.toModel();
  150. if (category == 1) {
  151. one.type = MControlPointType.nfc;
  152. }
  153. if (category == 2) {
  154. one.type = MControlPointType.gps;
  155. }
  156. if (hasInfo()) {
  157. if (info.hasDisplayInfo()) {
  158. final extraInfo = info.toModel();
  159. one.extraInfo = extraInfo;
  160. if(extraInfo is CPExtraInfoChoiceQuestion){
  161. one.qbId = extraInfo.qid;
  162. }
  163. }
  164. }
  165. return one;
  166. }
  167. }
  168. extension PbControlPointSimpleExt on pb.ControlPointSimple {
  169. MControlPoint toModel() {
  170. final one = MControlPoint();
  171. one.areaId = sn;
  172. one.intId = id;
  173. return one;
  174. }
  175. }
  176. /// 完赛后检查点
  177. // extension PbGameControlPointExt on pb.GameControlPoint {
  178. // MControlPoint toModel() {
  179. // final one = MControlPoint();
  180. // one.areaId = sn;
  181. // one.intId = id;
  182. // if (cType == pb.CType.BeginType) {
  183. // one.isStart = true;
  184. // }
  185. // if (cType == pb.CType.MiddleType) {
  186. // if (orderNo != 0) {
  187. // one.sn = orderNo.toString();
  188. // }
  189. // }
  190. // if (cType == pb.CType.EndType) {
  191. // one.isFinish = true;
  192. // }
  193. // one.isSuccess = isCheckSuccess;
  194. // one.checkAfterPrev = checkAfterLast.toDuration();
  195. // one.checkAfterStart = checkAfterStart.toDuration();
  196. // one.checkDistanceAfterPrev = disAfterLast.meter;
  197. // one.distanceStraightToPrev = disStraightAfterLast.meter;
  198. // one.paceAfterPrev = paceAfterLast.seconds;
  199. // one.paceAfterStart = paceAfterStart.seconds;
  200. //
  201. // return one;
  202. // }
  203. // }
  204. extension ControlPointInfoExt on pb.ControlPointInfo {
  205. CPExtraInfo toModel() {
  206. if (displayInfo.canUnpackInto(pb.ControlPointDisplayInfoSingleChoice())) {
  207. final data =
  208. displayInfo.unpackInto(pb.ControlPointDisplayInfoSingleChoice());
  209. return data.toModel();
  210. }
  211. throw UnimplementedError('${displayInfo.typeUrl}未实现');
  212. }
  213. }