111
This commit is contained in:
1 parent
aa39211aba
commit
76f97a2e7a
23 files changed
+226
-294
No files matched your search
@@ -61,7 +61,6 @@ flutter {
|
||||
|
||||
dependencies {
|
||||
implementation fileTree(dir: 'libs', include: ['*.jar'])
|
||||
implementation files('libs/AIKit.aar')
|
||||
|
||||
// rxjava
|
||||
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
|
||||
|
||||
Binary file not shown.
@@ -22,8 +22,8 @@
|
||||
android:name="${applicationName}"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:label="智慧食堂"
|
||||
android:requestLegacyExternalStorage="true"
|
||||
android:requestRawExternalStorageAccess="true">
|
||||
android:largeHeap="true"
|
||||
android:requestLegacyExternalStorage="true">
|
||||
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
@@ -42,9 +42,9 @@
|
||||
<activity
|
||||
android:name="io.flutter.plugins.facediscern.ui.FaceDiscern"
|
||||
android:exported="false"
|
||||
android:hardwareAccelerated="true"
|
||||
android:hardwareAccelerated="false"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/Theme.AppCompat.NoActionBar" />
|
||||
android:theme="@style/Theme.AppCompat.NoActionBar" />
|
||||
|
||||
<meta-data
|
||||
android:name="flutterEmbedding"
|
||||
|
||||
+1
-1
@@ -13,7 +13,7 @@ import java.io.File;
|
||||
public class DatabaseHelper extends SQLiteOpenHelper {
|
||||
private static final String TAG = "DatabaseHelper";
|
||||
|
||||
private static final String DATABASE_PATH = "pj/database";
|
||||
private static final String DATABASE_PATH = "pj_cashier/database";
|
||||
private static final String DATABASE_NAME = "cash_register.db";
|
||||
private static final int DATABASE_VERSION = 1;
|
||||
|
||||
|
||||
+8
-1
@@ -5,6 +5,8 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.Build;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
@@ -74,10 +76,15 @@ public class FlutterFaceDiscernPlugin implements FlutterPlugin, MethodChannel.Me
|
||||
switch (method) {
|
||||
case "jumpFaceDiscern":
|
||||
try {
|
||||
// Intent intent = new Intent(context, FaceDiscern.class);
|
||||
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
// context.startActivity(intent);
|
||||
|
||||
Intent intent = new Intent(context, FaceDiscern.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
context.startActivity(intent);
|
||||
new Handler(Looper.getMainLooper()).post(() -> context.startActivity(intent));
|
||||
result.success(true);
|
||||
} catch (Exception e) {
|
||||
result.success(false);
|
||||
|
||||
@@ -4,7 +4,10 @@ import android.Manifest;
|
||||
import android.content.Intent;
|
||||
import android.graphics.Point;
|
||||
import android.hardware.Camera;
|
||||
import android.os.AsyncTask;
|
||||
import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.util.DisplayMetrics;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -15,10 +18,12 @@ import androidx.core.app.ActivityCompat;
|
||||
import androidx.databinding.DataBindingUtil;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
|
||||
import com.example.pj_supermarket_cloud.MainActivity;
|
||||
import com.example.pj_supermarket_cloud.R;
|
||||
import com.example.pj_supermarket_cloud.databinding.ActivityFaceDiscernBinding;
|
||||
|
||||
import io.flutter.Log;
|
||||
import io.flutter.embedding.android.FlutterActivity;
|
||||
import io.flutter.plugins.facediscern.flutter.FlutterFaceDiscernPlugin;
|
||||
import io.flutter.plugins.facediscern.tool.camera.DualCameraHelper;
|
||||
import io.flutter.plugins.facediscern.tool.camera.callback.CameraListener;
|
||||
@@ -40,10 +45,7 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
|
||||
|
||||
private static final String TAG = "人脸识别页面";
|
||||
|
||||
private static final String[] NEEDED_PERMISSIONS = new String[]{
|
||||
Manifest.permission.CAMERA,
|
||||
Manifest.permission.READ_PHONE_STATE
|
||||
};
|
||||
private static final String[] NEEDED_PERMISSIONS = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_PHONE_STATE};
|
||||
|
||||
private FaceRectTransformer rgbFaceRectTransformer;
|
||||
|
||||
@@ -131,13 +133,10 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
|
||||
if (Objects.nonNull(channel)) {
|
||||
channel.invokeMethod("faceDiscernPageInit", null);
|
||||
}
|
||||
if (rgbCameraHelper != null) {
|
||||
rgbCameraHelper.resumePreview();
|
||||
}
|
||||
scheduler.schedule(() -> {
|
||||
try {
|
||||
if (viewModel != null) {
|
||||
viewModel.stop();
|
||||
if (rgbCameraHelper != null) {
|
||||
rgbCameraHelper.resumePreview();
|
||||
previewLock = false;
|
||||
Log.i(TAG, "相机开始识别");
|
||||
}
|
||||
@@ -156,17 +155,26 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
|
||||
}
|
||||
}
|
||||
|
||||
// 以前的方式
|
||||
// intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
// 推荐的方式
|
||||
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
|
||||
// 手机返回按钮
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
Log.e(TAG, "相机onBackPressed");
|
||||
|
||||
MethodChannel channel = FlutterFaceDiscernPlugin.staticChannel;
|
||||
if (Objects.nonNull(channel)) {
|
||||
channel.invokeMethod("faceDiscernBack", null);
|
||||
}
|
||||
|
||||
Intent intent = new Intent();
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
intent.setClassName(this.getPackageName(), this.getPackageName() + ".MainActivity");
|
||||
this.startActivity(intent);
|
||||
MethodChannel channel = FlutterFaceDiscernPlugin.staticChannel;
|
||||
if (Objects.isNull(channel)) return;
|
||||
channel.invokeMethod("faceDiscernBack", null);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -187,25 +195,8 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
|
||||
public void onCameraOpened(Camera camera, int cameraId, int displayOrientation, boolean isMirror) {
|
||||
runOnUiThread(() -> {
|
||||
Camera.Size previewSizeRgb = camera.getParameters().getPreviewSize();
|
||||
ViewGroup.LayoutParams layoutParams = adjustPreviewViewSize(
|
||||
binding.dualCameraTexturePreviewRgb,
|
||||
binding.dualCameraTexturePreviewRgb,
|
||||
binding.dualCameraFaceRectView,
|
||||
previewSizeRgb,
|
||||
displayOrientation,
|
||||
1.0f
|
||||
);
|
||||
rgbFaceRectTransformer = new FaceRectTransformer(
|
||||
previewSizeRgb.width,
|
||||
previewSizeRgb.height,
|
||||
layoutParams.width,
|
||||
layoutParams.height,
|
||||
displayOrientation,
|
||||
cameraId,
|
||||
isMirror,
|
||||
true,
|
||||
true
|
||||
);
|
||||
ViewGroup.LayoutParams layoutParams = adjustPreviewViewSize(binding.dualCameraTexturePreviewRgb, binding.dualCameraTexturePreviewRgb, binding.dualCameraFaceRectView, previewSizeRgb, displayOrientation, 1.0f);
|
||||
rgbFaceRectTransformer = new FaceRectTransformer(previewSizeRgb.width, previewSizeRgb.height, layoutParams.width, layoutParams.height, displayOrientation, cameraId, isMirror, true, true);
|
||||
viewModel.onRgbCameraOpened(camera);
|
||||
viewModel.setRgbFaceRectTransformer(rgbFaceRectTransformer);
|
||||
Log.e(TAG, "相机打开,宽:" + previewSizeRgb.width + ",高:" + previewSizeRgb.height + ";layout宽:" + layoutParams.width + ",layout高:" + layoutParams.height + ";");
|
||||
@@ -249,16 +240,7 @@ public class FaceDiscern extends BaseActivity implements ViewTreeObserver.OnGlob
|
||||
}
|
||||
}
|
||||
Point previewSize = new Point(binding.dualCameraTexturePreviewRgb.getMeasuredWidth(), binding.dualCameraTexturePreviewRgb.getMeasuredHeight());
|
||||
rgbCameraHelper = new DualCameraHelper.Builder()
|
||||
.previewViewSize(previewSize)
|
||||
.previewSize(previewSize)
|
||||
.rotation(getWindowManager().getDefaultDisplay().getRotation())
|
||||
.additionalRotation(0)
|
||||
.specificCameraId(mCameraId)
|
||||
.isMirror(false)
|
||||
.previewOn(binding.dualCameraTexturePreviewRgb)
|
||||
.cameraListener(cameraListener)
|
||||
.build();
|
||||
rgbCameraHelper = new DualCameraHelper.Builder().previewViewSize(previewSize).previewSize(previewSize).rotation(getWindowManager().getDefaultDisplay().getRotation()).additionalRotation(0).specificCameraId(mCameraId).isMirror(false).previewOn(binding.dualCameraTexturePreviewRgb).cameraListener(cameraListener).build();
|
||||
rgbCameraHelper.init();
|
||||
rgbCameraHelper.start();
|
||||
viewModel.setRgbCameraHelper(rgbCameraHelper);
|
||||
|
||||
+8
-7
@@ -20,8 +20,10 @@ import com.arcsoft.face.LivenessInfo;
|
||||
import com.arcsoft.face.LivenessParam;
|
||||
import com.arcsoft.face.enums.DetectFaceOrientPriority;
|
||||
import com.arcsoft.face.enums.DetectMode;
|
||||
import com.example.pj_supermarket_cloud.MainActivity;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity;
|
||||
import io.flutter.plugins.facediscern.tool.camera.DualCameraHelper;
|
||||
import io.flutter.plugins.facediscern.tool.camera.config.PreviewConfig;
|
||||
import io.flutter.plugins.facediscern.tool.face.constants.FaceBrodConstant;
|
||||
@@ -36,6 +38,7 @@ import io.flutter.plugins.facediscern.tool.face.model.FaceEntity;
|
||||
import io.flutter.plugins.facediscern.tool.face.model.FacePreviewInfo;
|
||||
import io.flutter.plugins.facediscern.tool.face.model.RecognizeConfiguration;
|
||||
import io.flutter.plugins.facediscern.tool.face.widget.FaceRectView;
|
||||
import io.flutter.plugins.facediscern.ui.FaceDiscern;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
@@ -290,17 +293,15 @@ public class FaceDiscernViewModel extends ViewModel implements RecognizeCallback
|
||||
if (flutterFaceCallbackIntent == null) {
|
||||
flutterFaceCallbackIntent = new Intent(FaceBrodConstant.FACE_GLOBAL_INTENT);
|
||||
}
|
||||
Log.i(TAG, "人脸识别成功json:" + new Gson().toJson(faceDiscern));
|
||||
flutterFaceCallbackIntent.putExtra("json", new Gson().toJson(faceDiscern));
|
||||
context.sendBroadcast(flutterFaceCallbackIntent);
|
||||
faceDiscern = null;
|
||||
Log.i(TAG, "人脸识别成功json:" + new Gson().toJson(faceDiscern));
|
||||
if (context instanceof Activity) {
|
||||
Thread.sleep(500);
|
||||
String packageName = context.getPackageName();
|
||||
Intent intent = new Intent();
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
intent.setClassName(packageName, packageName + ".MainActivity");
|
||||
Intent intent = new Intent(context, MainActivity.class);
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
|
||||
context.startActivity(intent);
|
||||
context.sendBroadcast(flutterFaceCallbackIntent);
|
||||
faceDiscern = null;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, "提示文字变更的回调,错误error:" + e.getMessage(), e);
|
||||
|
||||
@@ -2,13 +2,19 @@ package com.example.pj_supermarket_cloud
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant
|
||||
import io.flutter.plugins.facediscern.flutter.FlutterFaceDiscernPlugin
|
||||
|
||||
class MainActivity : FlutterActivity() {
|
||||
|
||||
override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
|
||||
super.configureFlutterEngine(flutterEngine)
|
||||
|
||||
// 人脸识别插件
|
||||
val flutterFaceDiscernPlugin = FlutterFaceDiscernPlugin()
|
||||
flutterEngine.plugins.add(flutterFaceDiscernPlugin)
|
||||
|
||||
GeneratedPluginRegistrant.registerWith(flutterEngine)
|
||||
}
|
||||
|
||||
}
|
||||
+2
-7
@@ -50,14 +50,9 @@ class MainApp extends StatelessWidget {
|
||||
localizationsDelegates: FLocalizations.localizationsDelegates,
|
||||
supportedLocales: FLocalizations.supportedLocales,
|
||||
builder: EasyLoading.init(
|
||||
builder: (context, child) => FTheme(
|
||||
builder: (_, childSecond) => FTheme(
|
||||
data: themeData,
|
||||
child: MediaQuery(
|
||||
data: MediaQuery.of(context).copyWith(
|
||||
viewInsets: MediaQuery.of(context).viewInsets,
|
||||
),
|
||||
child: child!,
|
||||
),
|
||||
child: childSecond!,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -35,8 +35,8 @@ class RoutePages {
|
||||
page: () => const CanteenProductPage(),
|
||||
binding: BindingsBuilder(() {
|
||||
Get.lazyPut(() => SelectPayTypeDialogController());
|
||||
Get.lazyPut(() => PanelController());
|
||||
Get.lazyPut(() => CanteenProductController());
|
||||
Get.lazyPut(() => PanelController());
|
||||
}),
|
||||
),
|
||||
GetPage(
|
||||
|
||||
@@ -11,8 +11,6 @@ abstract class AppFaceTool {
|
||||
|
||||
// 跳转到人脸识别页面
|
||||
static Future<bool> jumpFacePage() async {
|
||||
final faceCount = await FaceDiscernPlugs.getFaceCount();
|
||||
if (faceCount == 0) return false;
|
||||
final isJump = await FaceDiscernPlugs.jumpFaceDiscernPage();
|
||||
if (!isJump) return false;
|
||||
Future.delayed(const Duration(seconds: 2), () {
|
||||
@@ -40,8 +38,6 @@ abstract class AppFaceTool {
|
||||
String? userId,
|
||||
bool forceRegister = false,
|
||||
}) async {
|
||||
final isActive = await AppFaceTool.isActiveSdk();
|
||||
if (!isActive) return false;
|
||||
var faceCount = await FaceDiscernPlugs.getFaceCount();
|
||||
if (faceCount == 0 || forceRegister) {
|
||||
final list = await FaceDiscernPlugs.registerFaceByDatabase(
|
||||
|
||||
@@ -8,7 +8,7 @@ import 'package:sqflite/sqflite.dart';
|
||||
|
||||
abstract class AppFileTool {
|
||||
static const _tag = "app文件工具";
|
||||
static const _baseDir = "pj";
|
||||
static const _baseDir = "pj_cashier";
|
||||
static const _baseBackupDir = "backup";
|
||||
static const _backupDatabaseDir = "database";
|
||||
static const _backupLoggerDir = "logger";
|
||||
@@ -47,13 +47,6 @@ abstract class AppFileTool {
|
||||
return dir;
|
||||
}
|
||||
|
||||
/// 保存数据库文件地址
|
||||
static Future<void> setDatabasePath(String sqlAddress) async {
|
||||
final appSetting = await AppSettingTool.getSysSetting();
|
||||
appSetting.sqlAddress = sqlAddress;
|
||||
await AppSettingTool.setSysSetting(appSetting);
|
||||
}
|
||||
|
||||
/// 创建数据库文件备份地址
|
||||
static Future<String?> getDatabaseBackupPath() async {
|
||||
String backupDir = await getExternalPath(backupExternalPath: false);
|
||||
|
||||
@@ -2,7 +2,6 @@ import 'dart:async';
|
||||
import 'package:event_bus/event_bus.dart';
|
||||
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
||||
|
||||
import 'package:pj_supermarket_cloud/common/index.dart';
|
||||
|
||||
@@ -35,7 +34,7 @@ class AppControl extends GetxController {
|
||||
serialCardManage.close();
|
||||
srialSteelyardManage.close();
|
||||
AppNetworkTool.closeListenNetwork();
|
||||
TtsManage.dispose();
|
||||
// TtsManage.dispose();
|
||||
}
|
||||
|
||||
Future<void> initAsync() async {
|
||||
@@ -44,11 +43,8 @@ class AppControl extends GetxController {
|
||||
serialCardManage = SerialCardManage();
|
||||
srialSteelyardManage = SerialSteelyardManage();
|
||||
AppNetworkTool.listenNetwork();
|
||||
await AppFileTool.setDatabasePath(
|
||||
await getDatabasesPath(),
|
||||
);
|
||||
await AppFileTool.backupSqlFile();
|
||||
await TtsManage.initialize();
|
||||
// await AppFileTool.backupSqlFile();
|
||||
// await TtsManage.initialize();
|
||||
Get.offAllNamed(RouteNames.login);
|
||||
}
|
||||
}
|
||||
@@ -3,4 +3,5 @@ library;
|
||||
export './constants.dart';
|
||||
export './crt.dart';
|
||||
export './images.dart';
|
||||
export 'keys.dart';
|
||||
export './svgs.dart';
|
||||
@@ -1,6 +1,5 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:cached_network_image/cached_network_image.dart';
|
||||
import 'package:common_utils/common_utils.dart';
|
||||
import 'package:ducafe_ui_core/ducafe_ui_core.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -16,11 +15,31 @@ Widget appNetworkImg(
|
||||
double imgHeight = 60,
|
||||
BoxFit fit = BoxFit.cover,
|
||||
}) {
|
||||
return CachedNetworkImage(
|
||||
imageUrl: AppNetworkTool.ossImage(src),
|
||||
placeholder: (context, url) =>
|
||||
CircularProgressIndicator().width(50.w).height(50.w),
|
||||
errorWidget: (context, url, error) {
|
||||
return Image.network(
|
||||
src,
|
||||
width: imgWidth,
|
||||
height: imgHeight,
|
||||
fit: fit,
|
||||
loadingBuilder:
|
||||
(BuildContext context, Widget child, ImageChunkEvent? loadingProgress) {
|
||||
if (loadingProgress == null) {
|
||||
return child;
|
||||
} else {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
width: imgHeight,
|
||||
height: imgHeight,
|
||||
child: CircularProgressIndicator(
|
||||
value: loadingProgress.expectedTotalBytes != null
|
||||
? loadingProgress.cumulativeBytesLoaded /
|
||||
(loadingProgress.expectedTotalBytes ?? 1)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
},
|
||||
errorBuilder: (BuildContext context, Object error, StackTrace? stackTrace) {
|
||||
final theme = FTheme.of(context);
|
||||
return FIcon(
|
||||
FAssets.icons.globeLock,
|
||||
@@ -29,6 +48,19 @@ Widget appNetworkImg(
|
||||
).width(imgWidth * 0.5).height(imgHeight * 0.5);
|
||||
},
|
||||
);
|
||||
// return CachedNetworkImage(
|
||||
// imageUrl: AppNetworkTool.ossImage(src),
|
||||
// placeholder: (context, url) =>
|
||||
// CircularProgressIndicator().width(50.w).height(50.w),
|
||||
// errorWidget: (context, url, error) {
|
||||
// final theme = FTheme.of(context);
|
||||
// return FIcon(
|
||||
// FAssets.icons.globeLock,
|
||||
// color: theme.colorScheme.error,
|
||||
// size: theme.typography.base.fontSize,
|
||||
// ).width(imgWidth * 0.5).height(imgHeight * 0.5);
|
||||
// },
|
||||
// );
|
||||
}
|
||||
|
||||
Widget appFileImg(
|
||||
|
||||
@@ -103,15 +103,15 @@ Widget orderSelectPanel(
|
||||
appPrice(context, price),
|
||||
SizedBox(width: 10.w),
|
||||
FIcon(
|
||||
FAssets.icons.minus,
|
||||
FAssets.icons.plus,
|
||||
color: theme.colorScheme.secondary,
|
||||
)
|
||||
.width(height.w)
|
||||
.height(double.infinity)
|
||||
.decorated(color: theme.colorScheme.primary)
|
||||
.onTap(() {
|
||||
if (total > 0) {
|
||||
onChange(total - 1, index);
|
||||
if (total < 100) {
|
||||
onChange(total + 1, index);
|
||||
}
|
||||
}),
|
||||
Text(
|
||||
@@ -122,15 +122,15 @@ Widget orderSelectPanel(
|
||||
borderRadius: theme.style.borderRadius / 2,
|
||||
),
|
||||
FIcon(
|
||||
FAssets.icons.plus,
|
||||
FAssets.icons.minus,
|
||||
color: theme.colorScheme.secondary,
|
||||
)
|
||||
.width(height.w)
|
||||
.height(double.infinity)
|
||||
.decorated(color: theme.colorScheme.error)
|
||||
.onTap(() {
|
||||
if (total < 100) {
|
||||
onChange(total + 1, index);
|
||||
if (total > 0) {
|
||||
onChange(total - 1, index);
|
||||
}
|
||||
}),
|
||||
].toRow(mainAxisAlignment: MainAxisAlignment.end).expanded(),
|
||||
|
||||
@@ -38,6 +38,8 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
|
||||
final app = Get.find<AppControl>();
|
||||
|
||||
late SysSetting appSetting;
|
||||
|
||||
final payTypeRadioC = FRadioSelectGroupController<OrderPayDisplayType>();
|
||||
|
||||
Rxn<ServiceUser?> payUser = Rxn(null);
|
||||
@@ -64,6 +66,8 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
@override
|
||||
void onInit() async {
|
||||
super.onInit();
|
||||
appSetting = await AppSettingTool.getSysSetting();
|
||||
_listenAndroidFaceBack();
|
||||
// 监听支付方式变化
|
||||
payTypeRadioC.addValueListener((v) {
|
||||
final payType = OrderPayDisplayType.values.fromCode(
|
||||
@@ -83,15 +87,8 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
payTypeRadioC.dispose();
|
||||
}
|
||||
|
||||
_closeStatus() {
|
||||
payUser.value = null;
|
||||
isRecognition.value = false;
|
||||
globalQrCode = null;
|
||||
_faceCallbackLock = false;
|
||||
}
|
||||
|
||||
Future<void> initPayType() async {
|
||||
final appSetting = await AppSettingTool.getSysSetting();
|
||||
void initPayType() {
|
||||
_closeStatus();
|
||||
if (appSetting.defaultPayDisplayType != null) {
|
||||
payTypeRadioC.value = {appSetting.defaultPayDisplayType!};
|
||||
}
|
||||
@@ -100,13 +97,20 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
_closeFacility() {
|
||||
_closeStatus() {
|
||||
payUser.value = null;
|
||||
isRecognition.value = false;
|
||||
globalQrCode = null;
|
||||
_faceCallbackLock = false;
|
||||
// 设备
|
||||
BarcodeScanManage.instance.dispose();
|
||||
app.serialCardManage.close();
|
||||
}
|
||||
|
||||
_closeFaceDiscern() {
|
||||
// 取消人脸监听
|
||||
faceDiscernListen?.cancel();
|
||||
|
||||
// 关闭加载提示
|
||||
EasyLoading.dismiss();
|
||||
}
|
||||
|
||||
// |开始识别|点击
|
||||
@@ -138,10 +142,8 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
orderPayDisplayType.value!,
|
||||
globalQrCode,
|
||||
);
|
||||
Navigator.of(Get.context!).pop();
|
||||
_closeStatus();
|
||||
_closeFacility();
|
||||
_closeFaceDiscern();
|
||||
Navigator.of(Get.context!, rootNavigator: true).pop();
|
||||
}
|
||||
|
||||
// |取消|点击
|
||||
@@ -149,17 +151,12 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
if (isRecognition.value) {
|
||||
final flag = await appMessageDialog(Get.context!, "是否取消识别");
|
||||
if (!flag) return;
|
||||
_closeStatus();
|
||||
_closeFacility();
|
||||
_closeFaceDiscern();
|
||||
Navigator.of(Get.context!).pop();
|
||||
Navigator.of(Get.context!, rootNavigator: true).pop();
|
||||
return;
|
||||
}
|
||||
_closeStatus();
|
||||
_closeFacility();
|
||||
_closeFaceDiscern();
|
||||
onCancel?.call();
|
||||
Navigator.of(Get.context!).pop();
|
||||
Navigator.of(Get.context!, rootNavigator: true).pop();
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
@@ -332,7 +329,6 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
Toast.error(msg: "跳转到人脸检测页面失败");
|
||||
throw Error();
|
||||
}
|
||||
_listenAndroidFaceBack();
|
||||
faceDiscernListen = FaceDiscernPlugs.faceStream.listen((event) {
|
||||
if (event == null) return;
|
||||
if (_faceCallbackLock) return;
|
||||
@@ -353,7 +349,6 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
// android人脸识别成功回调
|
||||
Future<void> _faceDiscernAfter(FaceStream event) async {
|
||||
try {
|
||||
EasyLoading.dismiss();
|
||||
EasyLoading.show(
|
||||
status: '获取用户信息中...',
|
||||
maskType: EasyLoadingMaskType.black,
|
||||
@@ -422,99 +417,104 @@ class SelectPayTypeDialogController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> selectPayTypeDialog(BuildContext context) async {
|
||||
Future<void> selectPayTypeDialog() async {
|
||||
final context = Get.context!;
|
||||
final payTypeC = Get.find<SelectPayTypeDialogController>();
|
||||
await payTypeC.initPayType();
|
||||
payTypeC.initPayType();
|
||||
final theme = FTheme.of(context);
|
||||
final width = context.width;
|
||||
final height = context.height;
|
||||
showDialog(
|
||||
context: context,
|
||||
return showDialog(
|
||||
context: Get.context!,
|
||||
barrierDismissible: false,
|
||||
builder: (BuildContext context) => FDialog(
|
||||
direction: Axis.vertical,
|
||||
title: Text("选择支付方式", style: theme.typography.lg),
|
||||
body: <Widget>[
|
||||
Obx(
|
||||
() => FSelectGroup(
|
||||
enabled: payTypeC.payUser.value == null,
|
||||
controller: payTypeC.payTypeRadioC,
|
||||
style: theme.selectGroupStyle.copyWith(
|
||||
labelLayoutStyle:
|
||||
theme.selectGroupStyle.labelLayoutStyle.copyWith(
|
||||
childPadding: EdgeInsets.symmetric(
|
||||
vertical: 10.h,
|
||||
),
|
||||
),
|
||||
radioStyle: theme.selectGroupStyle.radioStyle.copyWith(
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: 10.h,
|
||||
),
|
||||
),
|
||||
),
|
||||
items: payTypeC.usePayDisplayTypeList
|
||||
.map<FSelectGroupItem<OrderPayDisplayType>>(
|
||||
(v) => FSelectGroupItem.radio(
|
||||
value: v,
|
||||
label: Text(
|
||||
v.title,
|
||||
style: theme.typography.xl,
|
||||
builder: (BuildContext _) {
|
||||
return PopScope(
|
||||
child: FDialog(
|
||||
direction: Axis.vertical,
|
||||
title: Text("选择支付方式", style: theme.typography.lg),
|
||||
body: <Widget>[
|
||||
Obx(
|
||||
() => FSelectGroup(
|
||||
enabled: payTypeC.payUser.value == null,
|
||||
controller: payTypeC.payTypeRadioC,
|
||||
style: theme.selectGroupStyle.copyWith(
|
||||
labelLayoutStyle:
|
||||
theme.selectGroupStyle.labelLayoutStyle.copyWith(
|
||||
childPadding: EdgeInsets.symmetric(
|
||||
vertical: 10.h,
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 20.h),
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: payTypeC.payUser.value == null,
|
||||
replacement: selectPayTypeUser(
|
||||
context,
|
||||
payTypeC.payUser.value,
|
||||
radioStyle: theme.selectGroupStyle.radioStyle.copyWith(
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: 10.h,
|
||||
),
|
||||
),
|
||||
),
|
||||
items: payTypeC.usePayDisplayTypeList
|
||||
.map<FSelectGroupItem<OrderPayDisplayType>>(
|
||||
(v) => FSelectGroupItem.radio(
|
||||
value: v,
|
||||
label: Text(
|
||||
v.title,
|
||||
style: theme.typography.xl,
|
||||
),
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
),
|
||||
),
|
||||
child: selectPayTypeHint(
|
||||
context,
|
||||
payTypeC.orderPayDisplayType.value,
|
||||
),
|
||||
),
|
||||
).center().expanded(),
|
||||
].toColumn().width(width * 0.5).height(height * 0.6),
|
||||
actions: [
|
||||
<Widget>[
|
||||
Obx(
|
||||
() => FButton(
|
||||
label: Text(
|
||||
payTypeC.payUser.value == null ? "开始识别" : "确定支付",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
SizedBox(height: 20.h),
|
||||
Obx(
|
||||
() => Visibility(
|
||||
visible: payTypeC.payUser.value == null,
|
||||
replacement: selectPayTypeUser(
|
||||
context,
|
||||
payTypeC.payUser.value,
|
||||
),
|
||||
child: selectPayTypeHint(
|
||||
context,
|
||||
payTypeC.orderPayDisplayType.value,
|
||||
),
|
||||
),
|
||||
onPress: () {
|
||||
if (payTypeC.payUser.value == null) {
|
||||
payTypeC.doRecognition();
|
||||
} else {
|
||||
payTypeC.doSubmit();
|
||||
}
|
||||
},
|
||||
),
|
||||
).flexible(flex: 1),
|
||||
SizedBox(width: 20.w),
|
||||
FButton(
|
||||
style: FButtonStyle.destructive,
|
||||
label: Text(
|
||||
"取消",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
),
|
||||
),
|
||||
onPress: () {
|
||||
payTypeC.doCancel();
|
||||
},
|
||||
).flexible(flex: 1),
|
||||
].toRow(),
|
||||
],
|
||||
),
|
||||
).center().expanded(),
|
||||
].toColumn().width(width * 0.5).height(height * 0.6),
|
||||
actions: [
|
||||
<Widget>[
|
||||
Obx(
|
||||
() => FButton(
|
||||
label: Text(
|
||||
payTypeC.payUser.value == null ? "开始识别" : "确定支付",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
),
|
||||
),
|
||||
onPress: () {
|
||||
if (payTypeC.payUser.value == null) {
|
||||
payTypeC.doRecognition();
|
||||
} else {
|
||||
payTypeC.doSubmit();
|
||||
}
|
||||
},
|
||||
),
|
||||
).flexible(flex: 1),
|
||||
SizedBox(width: 20.w),
|
||||
FButton(
|
||||
style: FButtonStyle.destructive,
|
||||
label: Text(
|
||||
"取消",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
),
|
||||
),
|
||||
onPress: () {
|
||||
payTypeC.doCancel();
|
||||
},
|
||||
).flexible(flex: 1),
|
||||
].toRow(),
|
||||
],
|
||||
),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -103,23 +103,13 @@ class CanteenProductController extends GetxController with OrderMixin {
|
||||
hourTypeC.dispose();
|
||||
}
|
||||
|
||||
// |下单|点击识别按钮
|
||||
doRecognition() {
|
||||
final payTypeC = Get.find<SelectPayTypeDialogController>();
|
||||
payTypeC.payUser.value = payUser.value;
|
||||
payTypeC.orderPayDisplayType.value = orderPayDisplayType.value;
|
||||
}
|
||||
|
||||
// |下单|点击购买
|
||||
doPay() async {
|
||||
Future<void> doPay() async {
|
||||
final validShopCar = _validateShopCar();
|
||||
if (!validShopCar) return;
|
||||
// 创建本地订单
|
||||
await createSqlOrder();
|
||||
final payTypeC = Get.find<SelectPayTypeDialogController>();
|
||||
payTypeC.payUser.value = payUser.value;
|
||||
payTypeC.orderPayDisplayType.value = orderPayDisplayType.value;
|
||||
selectPayTypeDialog(Get.context!);
|
||||
await selectPayTypeDialog();
|
||||
}
|
||||
|
||||
// |下单|点击取消下单
|
||||
|
||||
@@ -219,6 +219,16 @@ class CanteenProductPage extends GetView<CanteenProductController> {
|
||||
<Widget>[
|
||||
SizedBox(height: 20.h),
|
||||
<Widget>[
|
||||
FButton(
|
||||
label: Text(
|
||||
"支付",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
),
|
||||
),
|
||||
onPress: () => controller.doPay(),
|
||||
).flexible(flex: 1),
|
||||
SizedBox(width: 20.w),
|
||||
FButton(
|
||||
style: FButtonStyle.destructive,
|
||||
label: Text(
|
||||
@@ -229,18 +239,6 @@ class CanteenProductPage extends GetView<CanteenProductController> {
|
||||
),
|
||||
onPress: () => controller.doCancelPay(),
|
||||
).flexible(flex: 1),
|
||||
SizedBox(width: 20.w),
|
||||
FButton(
|
||||
label: Text(
|
||||
"支付",
|
||||
style: theme.typography.xl.copyWith(
|
||||
color: theme.colorScheme.secondary,
|
||||
),
|
||||
),
|
||||
onPress: () => controller.payUser.value?.userId == null
|
||||
? controller.doPay()
|
||||
: controller.doRecognition(),
|
||||
).flexible(flex: 1),
|
||||
].toRow(mainAxisAlignment: MainAxisAlignment.spaceBetween),
|
||||
].toColumn(),
|
||||
].toColumn().padding(vertical: 10.h, horizontal: 10.w);
|
||||
|
||||
@@ -75,7 +75,7 @@ class PanelController extends GetxController {
|
||||
Get.offAndToNamed(RouteNames.login);
|
||||
break;
|
||||
case PanelType.test:
|
||||
await TtsManage.speak("购买成功,总金额100元");
|
||||
await AppFaceTool.jumpFacePage();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -16,9 +16,9 @@ Future<void> _bindServiceDialog(BuildContext context, SysSetting sys) async {
|
||||
uniqueCodeC.text = sys.serviceId ?? "";
|
||||
} else if (AppSysTool.isDev()) {
|
||||
// 超市
|
||||
// uniqueCodeC.text = "1894303392833716226";
|
||||
uniqueCodeC.text = "1894303392833716226";
|
||||
// 测试
|
||||
uniqueCodeC.text = "1896157295523049473";
|
||||
// uniqueCodeC.text = "1896157295523049473";
|
||||
}
|
||||
await showAdaptiveDialog(
|
||||
context: context,
|
||||
|
||||
@@ -142,30 +142,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "8.9.4"
|
||||
cached_network_image:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: cached_network_image
|
||||
sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.3.1"
|
||||
cached_network_image_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_platform_interface
|
||||
sha256: ff0c949e323d2a1b52be73acce5b4a7b04063e61414c8ca542dbba47281630a7
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "4.1.0"
|
||||
cached_network_image_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cached_network_image_web
|
||||
sha256: "6322dde7a5ad92202e64df659241104a43db20ed594c41ca18de1014598d7996"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -435,14 +411,6 @@ packages:
|
||||
description: flutter
|
||||
source: sdk
|
||||
version: "0.0.0"
|
||||
flutter_cache_manager:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_cache_manager
|
||||
sha256: a77f77806a790eb9ba0118a5a3a936e81c4fea2b61533033b2b0c3d50bbde5ea
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "3.4.0"
|
||||
flutter_easyloading:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -834,14 +802,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.1.6"
|
||||
octo_image:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: octo_image
|
||||
sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.1.0"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1058,14 +1018,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.2.3"
|
||||
rxdart:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: rxdart
|
||||
sha256: "5c3004a4a8dbb94bd4bf5412a4def4acdaa12e12f269737a5751369e12d1a962"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "0.28.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
@@ -1119,14 +1071,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "1.10.0"
|
||||
sprintf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: sprintf
|
||||
sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23"
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "7.0.0"
|
||||
sqflite:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
@@ -1295,14 +1239,6 @@ packages:
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "2.2.2"
|
||||
uuid:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: uuid
|
||||
sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff
|
||||
url: "https://pub.flutter-io.cn"
|
||||
source: hosted
|
||||
version: "4.5.1"
|
||||
vector_graphics:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
||||
+1
-1
@@ -27,7 +27,7 @@ dependencies:
|
||||
# 图片处理
|
||||
image: ^4.3.0
|
||||
# 图片缓存
|
||||
cached_network_image: 3.3.1
|
||||
# cached_network_image: 3.3.1
|
||||
# 表格
|
||||
data_table_2: ^2.5.18
|
||||
# 分页
|
||||
|
||||
Reference in new issue
Block a user