m_control_point.dart 5.9 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. return out;
  93. }
  94. void updateBySimple(pb.ControlPointSimple other) {
  95. areaId = other.sn;
  96. }
  97. void updateBy(MControlPoint other) {
  98. sn = sn.isEmpty ? other.sn : sn;
  99. areaId = areaId.isEmpty ? other.areaId : areaId;
  100. extraInfo ??= other.extraInfo;
  101. }
  102. MControlPoint clone() {
  103. return MControlPoint()
  104. ..sn = sn
  105. ..areaId = ''
  106. ..intId = intId
  107. ..isSuccess = isSuccess
  108. ..isNext = isNext
  109. ..type = type
  110. ..isUnchecked = isUnchecked
  111. ..checkAfterStart = checkAfterStart
  112. ..checkAfterPrev = checkAfterPrev
  113. ..checkDistanceAfterStart = checkDistanceAfterStart
  114. ..checkDistanceAfterPrev = checkDistanceAfterPrev
  115. ..distanceStraightToPrev = distanceStraightToPrev
  116. ..onMap = onMap
  117. ..position = position
  118. ..qbId = qbId
  119. ..isAnswerCorrect = isAnswerCorrect
  120. ..userAnswerIndex = userAnswerIndex
  121. ..paceAfterPrev = paceAfterPrev
  122. ..paceAfterStart = paceAfterStart
  123. ..extraInfo = extraInfo;
  124. }
  125. }
  126. extension PbGameSaveControlPointExt on pb.GameSaveControlPoint {
  127. MControlPoint toModel() {
  128. final one = MControlPoint();
  129. one.intId = controlPointId;
  130. one.isSuccess = isCheckSuccess;
  131. one.checkAfterStart = checkAfterStart.toDuration();
  132. one.checkDistanceAfterStart = distinctAfterStart.meter;
  133. one.isAnswerCorrect = answerCorrect;
  134. if (hasUserAnswerIndex()) {
  135. one.userAnswerIndex = userAnswerIndex;
  136. }
  137. if (hasQbId()) {
  138. one.qbId = qbId;
  139. }
  140. return one;
  141. }
  142. }
  143. extension PbControlPointExt on pb.ControlPoint {
  144. MControlPoint toModel() {
  145. final one = MControlPoint();
  146. one.areaId = sn;
  147. one.intId = id;
  148. one.position = ciPosition.toModel();
  149. if (category == 1) {
  150. one.type = MControlPointType.nfc;
  151. }
  152. if (category == 2) {
  153. one.type = MControlPointType.gps;
  154. }
  155. if (hasInfo()) {
  156. if (info.hasDisplayInfo()) {
  157. final extraInfo = info.toModel();
  158. one.extraInfo = extraInfo;
  159. if(extraInfo is CPExtraInfoChoiceQuestion){
  160. one.qbId = extraInfo.qid;
  161. }
  162. }
  163. }
  164. return one;
  165. }
  166. }
  167. extension PbControlPointSimpleExt on pb.ControlPointSimple {
  168. MControlPoint toModel() {
  169. final one = MControlPoint();
  170. one.areaId = sn;
  171. one.intId = id;
  172. return one;
  173. }
  174. }
  175. /// 完赛后检查点
  176. extension PbGameControlPointExt on pb.GameControlPoint {
  177. MControlPoint toModel() {
  178. final one = MControlPoint();
  179. one.areaId = sn;
  180. one.intId = id;
  181. if (cType == pb.CType.BeginType) {
  182. one.isStart = true;
  183. }
  184. if (cType == pb.CType.MiddleType) {
  185. if (orderNo != 0) {
  186. one.sn = orderNo.toString();
  187. }
  188. }
  189. if (cType == pb.CType.EndType) {
  190. one.isFinish = true;
  191. }
  192. one.isSuccess = isCheckSuccess;
  193. one.checkAfterPrev = checkAfterLast.toDuration();
  194. one.checkAfterStart = checkAfterStart.toDuration();
  195. one.checkDistanceAfterPrev = disAfterLast.meter;
  196. one.distanceStraightToPrev = disStraightAfterLast.meter;
  197. one.paceAfterPrev = paceAfterLast.seconds;
  198. one.paceAfterStart = paceAfterStart.seconds;
  199. return one;
  200. }
  201. }
  202. extension ControlPointInfoExt on pb.ControlPointInfo {
  203. CPExtraInfo toModel() {
  204. if (displayInfo.canUnpackInto(pb.ControlPointDisplayInfoSingleChoice())) {
  205. final data =
  206. displayInfo.unpackInto(pb.ControlPointDisplayInfoSingleChoice());
  207. return data.toModel();
  208. }
  209. throw UnimplementedError('${displayInfo.typeUrl}未实现');
  210. }
  211. }