From 4b2ebf5d8583bbc425a57f6221631a9df45aaacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AD=8F=E5=B0=91=E9=98=B3?= <786612630@qq.com> Date: Fri, 21 Jun 2024 09:32:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BE=A4=E5=8F=91?= =?UTF-8?q?=E7=94=B5=E5=AD=90=E9=92=A5=E5=8C=99=E8=BF=9B=E5=BA=A6=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=BE=A4=E5=8F=91=E7=94=B5?= =?UTF-8?q?=E5=AD=90=E9=92=A5=E5=8C=99bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- images/.DS_Store | Bin 8196 -> 14340 bytes images/icon_close_black.png | Bin 0 -> 720 bytes .../massSendElectronicKeyProgress_page.dart | 193 ++++++++++++++++++ .../massSendElectronicKey_logic.dart | 137 ++++++++++--- .../massSendElectronicKey_page.dart | 7 +- .../lockUserList/lockUserList_entity.dart | 18 +- .../massSendReceiver_page.dart | 30 ++- .../editLockName/editLockName_logic.dart | 3 +- .../lockSet/lockSet/lockSet_logic.dart | 3 - lib/network/api_provider.dart | 8 +- lib/network/api_provider_base.dart | 7 +- lib/network/api_repository.dart | 12 +- 12 files changed, 364 insertions(+), 54 deletions(-) create mode 100644 images/icon_close_black.png create mode 100644 lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKeyProgress_page.dart diff --git a/images/.DS_Store b/images/.DS_Store index 1121ed8b22ecb47b7d4f4f1980eeb9c7e15432e5..0e394cd1f60489b0fd9cc782f83f2c2e6b67e356 100755 GIT binary patch literal 14340 zcmeHOO>7-k6~2==$uo)L=fqA*py7dqgw&EaPE=8$Qr9&~qpC_8hma_3AMa=UJiPJD z)66`-xKU7qgeXGdM|6c$)C~(ZAhGC%9TJEx$_{o_cZgMC+YRu2_s+aI_j$(l0-*vk zPcwIZ?)m1N^WA&yJ=bHUl(RbQUQ%jFDOJPHvVH=G?<&<`DK^{TD%K;?nT1C<9V5BxuRfMYMV+Hq4>$I1hh z2PzMYJ;3tHQLd!rBU2i2+cx{|{D>Yw&#oWDxXMPFJuO@IN*8?)020)4N8$qu~b&JuQ z$0yKE39XDCwC@s@J(ks#5{&OpU`Q|J828nt`sTh^A5CCAHlYtKTE_}S0E?Q~UHHk> zD;{FSBKJDiJ1no)Ej(9ysHJ+qD3sT%{ZX(sW69IAWs>AcO3n(&0GzCWp9Fj1do?do zdQM0mj9IcG5zbo(L-jg-^xXjWU9?^o{&dxS?aKgu@t|W+q8(Y1*rx?HJ;J`gHfL-s z@sQ?5qMWo)Jg~A^)|=>`!(S1+$leqI$H+ES8#c0c_KPhczZQ;dNsiOgOz)JSfNKk7 z!Lr1}1-4hNtrP;pOJ?BU~e?=WT8D?qSpwXHtU950XzUQxwDXE zpO;oPVXFtTGzg<8CA55+(lfS9+fxAN|Z(XtxVf zTK|`y^f%rx))&;v{jgU(%OgjBM2}3R^OOmu*upIR$MxEyc#tykPJ7^cak8}ZXXnu2 zsUt^^)sEGU*Ir%U3`grpD;dVCt>_-FZiS)W&dyuy+nzgW*5{uOgQVpJZlndgu8S(K zeBBGW;b=7+2HjZ8uA2w7>DqL&e&)f0r6(ItU3&WAlZ^*YFXQ~m<)3C3EL)D~eh{&t2Vl)o-<3|9Y?*CP}z;$LoZF(R^0J;_^o1 z5_0j`zZ)+uuDqC?e8HU5)uK63YH{UF-LzC~KD(8c&aEH}-08)Y8|KC|n*0+8JTIa9 z^%2B>tlm<;P`^=sQ17e1sgImvPTl#O^MrH7dB%CxdBJ(vx#@JAO~-R018^uK8G%J^ zPK>KD$yQgpxc!!VCcD`1*Wbyy*jRQe%)3_6bE``&FHwoH?Dl#T_+fyqgtXq=XQD9? zDs$&9o_dkD-wbh9_ zd3!CZV{t#Dxt~SKU=q7L)oa6x#Zv|HF0Eke`7hZRD9(bKA(|Sq3O0~7jx0MMYyk31 z&J@G=ZCoY0DO48(g>#TIvro?KOaK0!XS3`!8NwGCs7}GrCi@*hgB_L5D4@|*%t?!z zE$v9Pxai^BWKK<3#hLaHvgSJiG(r4Abn9Xq%xf~7#KpPH-dgYsv!0SUAG=N_tAm_e zbztXXu9W8_h3{wQ$uMx1*}N}sX%r)n8Hpg*OWNSmtag#1LV3-Kl$ZHy zCf`LriD8H7MbBxz3(*+#oRfkZx%$FBSGumno?=PL{8SDRTtni3#Z0cmCNg7TeR@1F zaK$9cz}Z&<{p3a5-9f8iD>MUgp>-UHEZol@5SRRKX^p>zH)eSW2XBVmg0Ftq->f&u zzPitPBN?@1B?lX@kvU@FTQz&%66~2sV|wTYY^A>Z)@Xp8S0&Lxb18A823+mjD3jF8 zNlBTzn}L2u-9Vi3@mm9bBWO`*i{`2fDf{Az~?VwPCmn#hGjlF@=~iPr49Zlzg~ zDAFfcizv2)@Bgrbl}z#glNZgd#E~nMIS%=?z9zFrGfNX0@p1&V6!KGS4g03l;zgqtN|Hnz?N|(w5l?VRK9&o1C z*4I`6n*H@)5})7NHL!mJd$ysju8xEL6c45T6b~2t6z@w}J(hU3l9rE5sYP*Li=zAw eeFSL#$IwYJpO=|tmH%@+tjhn{RR3r5|9=56oyD90 delta 228 zcmZoEXmOBWU|?W$DortDU;r^WfEYvza8E20o2Vx_*}#NF63Aze2VzE`I0HitLn=c& zLlTfo-7LuXjcu|5!>{h3XR3)uxt) zItnI62DLg0)s{vEK(?`2Z7nB(^b diff --git a/images/icon_close_black.png b/images/icon_close_black.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8e759f1ca92195c8528bdf3abd9b2973e9c102 GIT binary patch literal 720 zcmV;>0x$iEP)9!BcD)9Lmn!SQfAaP$TGUjVyTTYcNG7IN-klPiw;H z?z%?COnP38+M8HwP z4s-ryDD_dyplb6bWUBezW3~pgrombDwl84I%95!7$4A|n3o8j`0({_4CM+bF2w;54 zp*7(y#dJ^?z<~d&-j01lYG#6}04_Y|dxDk(H37cxsU)Zf2!&4}L0mvAytM>T0aEam z62t^Z!&^xZ5ugQcAt73THoUfkC;?XRni7HqSi@^c2ojJAUPFSnfYk8P61)WD0?(8{ zX9ef33K3fX;0I5Mp%b$jUKhx*iK@)aA@Y<4d6wMWc)ZZyf(H1?vxK(BL8qi9&8qa4rfyW5+ z77)`}j`tP;IgW~DOeF&>ZRglm$$%V3#WJSJXTUGO`_^CSuM;c)0000 createState() => _MassSendElectronicKeyProgressPageState(); +} + +class _MassSendElectronicKeyProgressPageState extends State { + int failCount = 0; + + @override + Widget build(BuildContext context) { + // 遍历receiverList,统计失败的数量 + widget.receiverList.forEach((element) { + if (element is LockUserItemData) { + if (element.isSendSuccess == false || element.isSendSuccess == null) { + failCount++; + } + } + }); + + return Container( + width: 1.sw - 20*2, + height: 500.h, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(10), + ), + child: Column( + children: [ + topTitle(), + Divider(height: 1.h, color: AppColors.greyLineColor), + progressTitle(), + Expanded(child: progressList()), + Divider(height: 1.h, color: AppColors.greyLineColor), + bottomBtn(), + ], + ), + ); + } + + Widget topTitle(){ + return SizedBox( + height: 70.h, + child: Stack( + children: [ + Center( + child: Text( + '发送钥匙'.tr, + style: TextStyle(fontSize: 24.sp), + ), + ), + Positioned( + right: 0, + child: GestureDetector( + onTap: Get.back, + child: Container( + padding: EdgeInsets.all(15.w), + child: Image.asset( + 'images/icon_close_black.png', + width: 35.w, + height: 35.w, + ), + ), + ), + ), + ], + ), + ); + } + + Widget progressTitle(){ + return Container( + padding: EdgeInsets.only(left: 15.w, top: 10.h, bottom: 10.h), + child: Row( + children: [ + Text('进度'.tr + ':' + '$failCount/${widget.receiverList.length}', style: TextStyle(fontSize: 24.sp)), + SizedBox(width: 20.w), + Text('失败:$failCount', style: TextStyle(fontSize: 24.sp, color: Colors.red)) + ], + ), + ); + } + + Widget progressList(){ + return ListView.builder( + itemCount: widget.receiverList.length, + itemBuilder: (BuildContext c, int index) { + LockUserItemData data = widget.receiverList[index]; + return Container( + margin: EdgeInsets.only(left: 15.w, top: 5.h, bottom: 5.h, right: 15.w), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text(data.userid??'', style: TextStyle(fontSize: 24.sp)), + SizedBox(width: 10.w), + if (data.isSendSuccess ?? false) const Icon(Icons.check, color: Colors.green) else const Icon(Icons.close, color: Colors.red), + ], + ), + if (!(data.isSendSuccess ?? false)) Text(data.sendFailReason??'', style: TextStyle(fontSize: 20.sp, color: Colors.red)) + ], + ), + ); + }, + ); + } + + Widget progressItem(){ + return Container( + padding: EdgeInsets.only(left: 15.w, top: 15.h, bottom: 10.h), + child: Row( + children: [ + Text('发送中'.tr+'1/2', style: TextStyle(fontSize: 24.sp)), + SizedBox(width: 20.w), + Text('失败:1', style: TextStyle(fontSize: 24.sp, color: Colors.red)) + ], + ), + ); + } + + Widget bottomBtn(){ + return Container( + height: 80.h, + child: Row( + children: [ + Expanded( + child: GestureDetector( + onTap: Get.back, + child: Container( + alignment: Alignment.center, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(10)), + ), + child: Text( + '完成'.tr, + style: TextStyle( + fontSize: 24.sp, color: AppColors.mainColor), + ), + ), + ), + ), + Container(width: 1.h, color: AppColors.greyLineColor), + Expanded( + child: GestureDetector( + onTap: (){ + Get.back(); + // 剔除发送失败的数据,重新发送 + widget.receiverList.removeWhere((element) => (element as LockUserItemData).isSendSuccess == true); + Navigator.pushNamed(context, Routers.massSendReceiverPage, + arguments: { + 'lockUserList': widget.receiverList, + }).then((Object? value) { + // if (value != null) { + // value as Map; + // state.receiverList = value['lockUserList']; + // setState(() {}); + // } + }); + }, + child: Container( + alignment: Alignment.center, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + bottomRight: Radius.circular(10)), + ), + child: Text( + '重试'.tr, + style: TextStyle( + fontSize: 24.sp, color: AppColors.mainColor), + ), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart index 4c48d423..31b32a6c 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_logic.dart @@ -1,4 +1,7 @@ + +import 'package:flutter/material.dart'; import 'package:get/get.dart'; +import 'package:star_lock/app_settings/app_settings.dart'; import 'package:star_lock/main/lockDetail/lockSet/basicInformation/basicInformation/KeyDetailEntity.dart'; import 'package:star_lock/tools/baseGetXController.dart'; import 'package:star_lock/tools/pickers/time_picker/time_utils.dart'; @@ -6,6 +9,7 @@ import '../../../../../common/XSConstantMacro/XSConstantMacro.dart'; import '../../../../../network/api_repository.dart'; import '../../../../../tools/dateTool.dart'; import '../massSendLockGroupList/lockUserList/lockUserList_entity.dart'; +import 'massSendElectronicKeyProgress_page.dart'; import 'massSendElectronicKey_state.dart'; class MassSendElectronicKeyLogic extends BaseGetXController { @@ -19,9 +23,9 @@ class MassSendElectronicKeyLogic extends BaseGetXController { Future massKeyChecksRequest() async { String getFailureDateTime = '0'; if (int.parse(state.type.value) != 1) { - getFailureDateTime = - DateTool().dateToTimestamp(state.endTime.value, 1).toString(); + getFailureDateTime = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); } + if (state.lockIdList.isEmpty) { showToast('请选择锁'.tr); return; @@ -31,11 +35,67 @@ class MassSendElectronicKeyLogic extends BaseGetXController { showToast('请选择接收者'.tr); return; } + + if(state.type.value == '0'){ + final String startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); + final String endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); + + if (startDate.isEmpty) { + showToast('请选择开始时间'.tr); + return; + } + if (endDate.isEmpty) { + showToast('请选择结束时间'.tr); + return; + } + + if (int.parse(startDate) >= int.parse(endDate)) { + showToast('失效时间要大于生效时间'.tr); + return; + } + } + final KeyDetailEntity entity = await ApiRepository.to.canSendKey(getFailureDateTime, state.lockIdList); if (entity.errorCode!.codeIsSuccessful) { + + // final List futures = []; + // 遍历发送 for (int i = 0; i < state.receiverList.length; i++) { final LockUserItemData data = state.receiverList[i]; - batchSendElectronicKeyRequest(data.userid ?? '', data.nickname ?? ''); + AppLog.log('receiverUserID:${data.userid} receiverUserName:${data.nickname} data.isSendSuccess:${data.isSendSuccess} data.sendFailReason:${data.sendFailReason}'); + await batchSendElectronicKeyRequest(data.userid ?? '', data.nickname ?? ''); + // futures.add( + // batchSendElectronicKeyRequest(data.userid ?? '', data.nickname ?? '').catchError((error) { + // // 处理异常,例如打印错误信息 + // AppLog.log('Error in batchSendElectronicKeyRequest: $error'); + // }) + // ); + AppLog.log('接口调用成功 receiverUserID:${data.userid} receiverUserName:${data.nickname} data.isSendSuccess:${data.isSendSuccess} data.sendFailReason:${data.sendFailReason}'); + } + // 等待所有的Future完成 + // try { + // await Future.wait(futures); + // } catch (e) { + // AppLog.log('Error in Future.wait: $e'); + // } + + // 发送完成之后遍历数据,如果所有的数据都发送成功,改变state.isSendSuccess的值,如果有一个发送失败,不改变state.isSendSuccess的值,然后弹框显示进度 + bool isSendSuccess = true; + for (int i = 0; i < state.receiverList.length; i++) { + final LockUserItemData data = state.receiverList[i]; + AppLog.log('遍历是否弹框 receiverUserID:${data.userid} receiverUserName:${data.nickname} data.isSendSuccess:${data.isSendSuccess} data.sendFailReason:${data.sendFailReason}'); + if (!(data.isSendSuccess ?? false)) { + isSendSuccess = false; + break; + } + } + state.isSendSuccess.value = isSendSuccess; + if(!state.isSendSuccess.value){ + // 如果有发送失败的,弹框显示发送失败的原因 + showMassSendElectronicKeyProgress(); + }else{ + // 如果全部发送成功,重置数据改变状态 + resetData(); } } else { showToast(entity.errorMsg!); @@ -43,8 +103,7 @@ class MassSendElectronicKeyLogic extends BaseGetXController { } //批处理群发钥匙 - Future batchSendElectronicKeyRequest( - String receiverUserID, String receiverUserName) async { + Future batchSendElectronicKeyRequest(String receiverUserID, String receiverUserName) async { //发送钥匙请求 String startDate = '0'; String endDate = '0'; @@ -55,10 +114,8 @@ class MassSendElectronicKeyLogic extends BaseGetXController { case 0: { typeValue = XSConstantMacro.keyTypeTime; - startDate = - DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); - endDate = - DateTool().dateToTimestamp(state.endTime.value, 1).toString(); + startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); + endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); startTime = '0'; endTime = '0'; @@ -71,11 +128,6 @@ class MassSendElectronicKeyLogic extends BaseGetXController { return; } - // if(DateTime.now().millisecondsSinceEpoch > int.parse(state.beginTimeTimestamp.value)){ - // Toast.show(msg: "生效时间要大于当前时间"); - // return; - // } - if (int.parse(startDate) >= int.parse(endDate)) { showToast('失效时间要大于生效时间'.tr); return; @@ -94,15 +146,10 @@ class MassSendElectronicKeyLogic extends BaseGetXController { showToast('请选择有效期'.tr); return; } - startDate = - DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); + startDate = DateTool().dateToTimestamp(state.beginTime.value, 1).toString(); endDate = DateTool().dateToTimestamp(state.endTime.value, 1).toString(); - startTime = DateTool() - .dateToTimestamp(state.effectiveDateTime.value, 0) - .toString(); - endTime = DateTool() - .dateToTimestamp(state.failureDateTime.value, 0) - .toString(); + startTime = DateTool().dateToTimestamp(state.effectiveDateTime.value, 0).toString(); + endTime = DateTool().dateToTimestamp(state.failureDateTime.value, 0).toString(); break; default: typeValue = XSConstantMacro.keyTypeLong; @@ -123,16 +170,39 @@ class MassSendElectronicKeyLogic extends BaseGetXController { startTime: int.parse(startTime), endTime: int.parse(endTime), remoteUnlockSwitch: state.isRemoteUnlock.value ? 1 : 2, - keyRight: 0); + keyRight: 0, + isShowNetworkErrorMsg: false + ); if (entity.errorCode!.codeIsSuccessful) { - state.isSendSuccess.value = true; - resetData(); + // 发送成功之后默认是需要创建的 + state.isCreateUser.value = false; + + // 发送成功之后,查询发送类列表里面对应的数据,将发送成功的状态改为true + for (int i = 0; i < state.receiverList.length; i++) { + final LockUserItemData data = state.receiverList[i]; + if (data.userid == receiverUserID) { + data.isSendSuccess = true; + data.sendFailReason = ''; + } + AppLog.log('发送成功:receiverUserID:$receiverUserID data.userid:${data.userid} receiverUserName:${data.nickname} data.isSendSuccess:${data.isSendSuccess} data.sendFailReason:${data.sendFailReason}'); + } + // resetData(); } else { - showToast('${entity.errorMsg}'); + // showToast('${entity.errorMsg}'); if (entity.errorCode == 425) { - //用户未注册 + //用户未注册 重新发送 state.isCreateUser.value = true; batchSendElectronicKeyRequest(receiverUserID, receiverUserName); + }else{ + // 发送失败之后,查询发送类列表里面对应的数据,将发送成功的状态改为false + for (int i = 0; i < state.receiverList.length; i++) { + final LockUserItemData data = state.receiverList[i]; + if (data.userid == receiverUserID) { + data.isSendSuccess = false; + data.sendFailReason = entity.errorMsg; + } + AppLog.log('发送失败之后 receiverUserID:$receiverUserID data.userid:${data.userid} receiverUserName:${data.nickname} data.isSendSuccess:${data.isSendSuccess} data.sendFailReason:${data.sendFailReason}'); + } } } } @@ -148,4 +218,17 @@ class MassSendElectronicKeyLogic extends BaseGetXController { state.endTime.value = ''; //默认为当前时间 } } + + void showMassSendElectronicKeyProgress() { + showDialog( + context: Get.context!, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.transparent, + child: MassSendElectronicKeyProgressPage(receiverList:state.receiverList), + ); + }, + ); + } + } diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart index e962d675..769c55ba 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendElectronicKey/massSendElectronicKey_page.dart @@ -1,5 +1,7 @@ + import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:star_lock/app_settings/app_colors.dart'; @@ -18,9 +20,7 @@ import '../../../../../translations/trans_lib.dart'; import 'massSendElectronicKey_logic.dart'; class MassSendElectronicKeyPage extends StatefulWidget { - - const MassSendElectronicKeyPage({Key? key, required this.type}) - : super(key: key); + const MassSendElectronicKeyPage({required this.type, Key? key}) : super(key: key); final String type; @override @@ -382,4 +382,5 @@ class _MassSendElectronicKeyPageState extends State { }, ); } + } diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart index 68c125f7..0709adba 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/lockUserList/lockUserList_entity.dart @@ -32,21 +32,31 @@ class LockUserListEntity { } class LockUserItemData { - - LockUserItemData( - {this.uid, this.nickname, this.headUrl, this.userid, this.isCheck}); + LockUserItemData({ + this.uid, + this.nickname, + this.headUrl, + this.userid, + this.isCheck, + this.isSendSuccess, + this.sendFailReason, + }); LockUserItemData.fromJson(Map json) { uid = json['uid']; nickname = json['nickname']; headUrl = json['headUrl']; userid = json['userid']; + isSendSuccess = json['isSendSuccess']; + sendFailReason = json['sendFailReason']; } int? uid; String? nickname; String? headUrl; String? userid; bool? isCheck = false; + String? sendFailReason; + bool? isSendSuccess = false; Map toJson() { final Map data = {}; @@ -54,6 +64,8 @@ class LockUserItemData { data['nickname'] = nickname; data['headUrl'] = headUrl; data['userid'] = userid; + data['isSendSuccess'] = isSendSuccess; + data['sendFailReason'] = sendFailReason; return data; } } diff --git a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart index fb7da11d..409e0ef0 100755 --- a/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart +++ b/lib/main/lockDetail/electronicKey/massSendElectronicKey/massSendLockGroupList/massSendReceiver/massSendReceiver_page.dart @@ -65,15 +65,15 @@ class _MassSendReceiverPageState extends State { EasyLoading.showToast('接收者信息为空'.tr); return; } - for (final LockUserItemData userItem in state.lockUserList) { - final bool isEmail = RegexpTool.isEmail(userItem.userid ?? ''); - final bool isPhoneNumber = - RegexpTool.isPhoneNumber(userItem.userid ?? ''); - if (!isEmail && !isPhoneNumber) { - EasyLoading.showToast('账号格式错误'.tr); - return; - } - } + // for (final LockUserItemData userItem in state.lockUserList) { + // final bool isEmail = RegexpTool.isEmail(userItem.userid ?? ''); + // final bool isPhoneNumber = + // RegexpTool.isPhoneNumber(userItem.userid ?? ''); + // if (!isEmail && !isPhoneNumber) { + // EasyLoading.showToast('账号格式错误'.tr); + // return; + // } + // } // 遍历state.lockUserList,里面有重复的数据,留下第一个,其他去重 final List tempList = []; @@ -83,6 +83,18 @@ class _MassSendReceiverPageState extends State { } } + // 遍历state.lockUserList,如果里面LockUserItemData的userid为空提示 '请输入接收者账号' 并返回 如果nickname为空提示 '请输入接收者昵称' 并返回 + for (final LockUserItemData item in tempList) { + if (item.userid == null || item.userid!.isEmpty) { + EasyLoading.showToast('请输入接收者账号'.tr); + return; + } + if (item.nickname == null || item.nickname!.isEmpty) { + EasyLoading.showToast('请输入姓名'.tr); + return; + } + } + final Map resultMap = {}; resultMap['lockUserList'] = tempList; Navigator.pop(context, resultMap); diff --git a/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_logic.dart b/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_logic.dart index 6a9b688f..c220d43f 100755 --- a/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_logic.dart +++ b/lib/main/lockDetail/lockSet/basicInformation/editLockName/editLockName_logic.dart @@ -1,5 +1,6 @@ import 'package:get/get.dart'; +import '../../../../../login/login/entity/LoginEntity.dart'; import '../../../../../network/api_repository.dart'; import '../../../../../tools/baseGetXController.dart'; import '../../../../../tools/eventBusEventManage.dart'; @@ -11,7 +12,7 @@ class EditLockNameLogic extends BaseGetXController { //修改锁名称请求 Future modifyKeyNameRequest() async { - final KeyOperationRecordEntity entity = await ApiRepository.to.updateLockName( + final LoginEntity entity = await ApiRepository.to.updateLockName( lockId: state.lockSetInfoData.value.lockId.toString(), lockName: state.changeLockNameController.text); if (entity.errorCode!.codeIsSuccessful) { diff --git a/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart b/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart index 2d75668b..d7fa2731 100755 --- a/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart +++ b/lib/main/lockDetail/lockSet/lockSet/lockSet_logic.dart @@ -5,7 +5,6 @@ import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:get/get.dart'; import 'package:star_lock/login/login/entity/LoginEntity.dart'; import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart'; -import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart'; import 'package:star_lock/tools/showTipView.dart'; import '../../../../blue/blue_manage.dart'; @@ -17,8 +16,6 @@ import '../../../../blue/io_tool/io_tool.dart'; import '../../../../blue/io_tool/manager_event_bus.dart'; import '../../../../blue/sender_manage.dart'; -import '../../../../flavors.dart'; - import '../../../../network/api_repository.dart'; import '../../../../tools/baseGetXController.dart'; import '../../../../tools/commonDataManage.dart'; diff --git a/lib/network/api_provider.dart b/lib/network/api_provider.dart index d29b63a2..ae1bd47d 100755 --- a/lib/network/api_provider.dart +++ b/lib/network/api_provider.dart @@ -1602,7 +1602,9 @@ class ApiProvider extends BaseProvider { int startTime, int endTime, int remoteUnlockSwitch, - int keyRight) => + int keyRight, + bool isShowNetworkErrorMsg + ) => post( batchSendKeyURL.toUrl, jsonEncode({ @@ -1619,7 +1621,9 @@ class ApiProvider extends BaseProvider { 'endTime': endTime, 'remoteUnlockSwitch': remoteUnlockSwitch, 'keyRight': keyRight, - })); + }), + isShowNetworkErrorMsg: isShowNetworkErrorMsg + ); Future addAuthorizedAdmin( String createUser, diff --git a/lib/network/api_provider_base.dart b/lib/network/api_provider_base.dart index 9ecdf678..83b9ae9e 100755 --- a/lib/network/api_provider_base.dart +++ b/lib/network/api_provider_base.dart @@ -35,7 +35,8 @@ class BaseProvider extends GetConnect with Api { Progress? uploadProgress, bool? isUnShowLoading = false, // 是否显示loading bool? isUserBaseUrl = true, // 文件上传不使用baseUrl - bool? isShowErrMsg = true, // 文件上传不使用baseUrl + bool? isShowErrMsg = true, // 是否显示没有网络时的提示 + bool? isShowNetworkErrorMsg = true, // 是否显示网络其他报错 如403 500等 }) async { AppLog.log('post: url:$url body:$body'); if (isUnShowLoading == false) { @@ -77,7 +78,9 @@ class BaseProvider extends GetConnect with Api { statusText: res.statusText, ); } else {} - getDataResult(res.body); + if(isShowNetworkErrorMsg ?? true){ + getDataResult(res.body); + } return res; } diff --git a/lib/network/api_repository.dart b/lib/network/api_repository.dart index 54059412..966f74c9 100755 --- a/lib/network/api_repository.dart +++ b/lib/network/api_repository.dart @@ -370,10 +370,10 @@ class ApiRepository { } //修改锁名(新) - Future updateLockName( + Future updateLockName( {required String lockId, required String lockName}) async { final res = await apiProvider.updateLockName(lockId, lockName); - return KeyOperationRecordEntity.fromJson(res.body); + return LoginEntity.fromJson(res.body); } //编辑电子钥匙名字 @@ -999,7 +999,9 @@ class ApiRepository { required int startTime, required int endTime, required int remoteUnlockSwitch, - required int keyRight}) async { + required int keyRight, + required bool isShowNetworkErrorMsg + }) async { final res = await apiProvider.batchSendKey( lockIds, createUser, @@ -1013,7 +1015,9 @@ class ApiRepository { startTime, endTime, remoteUnlockSwitch, - keyRight); + keyRight, + isShowNetworkErrorMsg + ); return KeyDetailEntity.fromJson(res.body); } From 0dd00b4250b3bfb2572dc4dbe66389cc62f3a49a Mon Sep 17 00:00:00 2001 From: anfe <448468458@qq.com> Date: Fri, 21 Jun 2024 10:36:10 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=20=20=E5=BA=9F?= =?UTF-8?q?=E5=BC=83=20api=20=E6=A3=80=E6=B5=8B=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pre_build.sh | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 pre_build.sh diff --git a/pre_build.sh b/pre_build.sh new file mode 100644 index 00000000..8bdf7f47 --- /dev/null +++ b/pre_build.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# 废弃 api 检测脚本+项目编译脚本 +# 首次使用记得安装jq: brew install jq +# + +# 设置 +environment="xhj" +main_file="lib/main_xhj_full.dart" +version_string="1.0.51" +file_path="lib/network/api.dart" + +urls=$(curl -s -X POST -d "version=$version_string" 'https://lock.xhjcn.ltd/api/app/getDeprecatedApiList' | jq -r '.data[].url') +echo "* 成功获取废弃 api 数据" + +string_array=() +# 使用egrep搜索被单引号包裹的字符串 +while IFS= read -r line; do + string_array+=("$line") +done < <(egrep -o "'[^']*'" "$file_path") +echo "* 解析 api 文件数据,开始对比" + +# 比较urls和string_array中的元素 +for url in $urls; do + for string in "${string_array[@]}"; do + # 移除单引号以便比较 + cleaned_string=$(echo "$string" | tr -d "'") + if [[ "$cleaned_string" == "$url" ]]; then + echo "错误: 存在废弃 api: $url" + exit 1 + fi + done +done +echo "* 没有发现 废弃 api,开始编译" + +flutter clean && flutter pub get +flutter build apk --flavor $environment -t $main_file +flutter build ios --flavor $environment -t $main_file +