diff --git a/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java b/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java index 0b485d5..d27878d 100644 --- a/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java +++ b/android/app/src/main/java/io/flutter/plugins/facediscern/database/DatabaseHelper.java @@ -15,7 +15,7 @@ public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_PATH = "pj_cashier/database"; private static final String DATABASE_NAME = "cash_register.db"; - private static final int DATABASE_VERSION = 6; + private static final int DATABASE_VERSION = 7; public DatabaseHelper(Context context) { super(context, getCustomDatabasePath(context), null, DATABASE_VERSION); diff --git a/lib/common/models/api/app_api_models.g.dart b/lib/common/models/api/app_api_models.g.dart index 8ac7148..18c7197 100644 --- a/lib/common/models/api/app_api_models.g.dart +++ b/lib/common/models/api/app_api_models.g.dart @@ -15,8 +15,8 @@ ServiceAppVersion _$ServiceAppVersionFromJson(Map json) => versionName: json['versionName'] as String?, updateContent: json['updateContent'] as String?, downloadUrl: json['downloadUrl'] as String?, - isForce: JsonTool.stringToBoolean(json['isForce'] as String), - isSilent: JsonTool.stringToBoolean(json['isSilent'] as String), + isForce: JsonTool.stringToBoolean(json['isForce'] as String?), + isSilent: JsonTool.stringToBoolean(json['isSilent'] as String?), status: json['status'] as String?, ); diff --git a/lib/common/models/api/hard_api_models.g.dart b/lib/common/models/api/hard_api_models.g.dart index c221a6c..b5dbd3d 100644 --- a/lib/common/models/api/hard_api_models.g.dart +++ b/lib/common/models/api/hard_api_models.g.dart @@ -159,7 +159,7 @@ ServiceOpenCard _$ServiceOpenCardFromJson(Map json) => cardNumber: json['cardNumber'] as String?, walletId: json['walletId'] as String?, isActiveHardware: - JsonTool.stringToBoolean(json['isActiveHardware'] as String), + JsonTool.stringToBoolean(json['isActiveHardware'] as String?), ); Map _$ServiceOpenCardToJson(ServiceOpenCard instance) => @@ -269,7 +269,7 @@ ServiceBroadcastToday _$ServiceBroadcastTodayFromJson( content: json['content'] as String, broadcastCount: (json['broadcastCount'] as num?)?.toInt(), broadcastMaxCount: (json['broadcastMaxCount'] as num?)?.toInt(), - isBroadcast: JsonTool.stringToBoolean(json['isBroadcast'] as String), + isBroadcast: JsonTool.stringToBoolean(json['isBroadcast'] as String?), hourType: json['hourType'] as String?, productDesc: json['productDesc'] as String, payPrice: (json['payPrice'] as num).toInt(), diff --git a/lib/common/models/api/product_api_models.g.dart b/lib/common/models/api/product_api_models.g.dart index afc3281..c0e3d83 100644 --- a/lib/common/models/api/product_api_models.g.dart +++ b/lib/common/models/api/product_api_models.g.dart @@ -44,7 +44,7 @@ ServiceProduct _$ServiceProductFromJson(Map json) => ) ..price = (json['price'] as num?)?.toInt() ..isPriceIncreased = - JsonTool.stringToBoolean(json['isPriceIncreased'] as String); + JsonTool.stringToBoolean(json['isPriceIncreased'] as String?); Map _$ServiceProductToJson(ServiceProduct instance) => { diff --git a/lib/common/models/api/user_api_models.g.dart b/lib/common/models/api/user_api_models.g.dart index d3c4f53..32aaefb 100644 --- a/lib/common/models/api/user_api_models.g.dart +++ b/lib/common/models/api/user_api_models.g.dart @@ -16,7 +16,7 @@ ServiceUser _$ServiceUserFromJson(Map json) => ServiceUser( walletTypeId: json['walletTypeId'] as String?, walletBalance: (json['walletBalance'] as num?)?.toInt(), walletIsFreeze: - JsonTool.stringToBoolean(json['walletIsFreeze'] as String), + JsonTool.stringToBoolean(json['walletIsFreeze'] as String?), walletCardNumber: json['walletCardNumber'] as String?, canteenId: json['canteenId'] as String?, ); diff --git a/lib/common/models/api/wallet_api_models.g.dart b/lib/common/models/api/wallet_api_models.g.dart index faaa0f1..3d2c971 100644 --- a/lib/common/models/api/wallet_api_models.g.dart +++ b/lib/common/models/api/wallet_api_models.g.dart @@ -10,16 +10,16 @@ ServicePaySetting _$ServicePaySettingFromJson(Map json) => ServicePaySetting( id: json['id'] as String?, payAmountEnable: - JsonTool.stringToBoolean(json['payAmountEnable'] as String), + JsonTool.stringToBoolean(json['payAmountEnable'] as String?), payAmountMealLimit: (json['payAmountMealLimit'] as num?)?.toInt(), payAmountMealTimes: (json['payAmountMealTimes'] as num?)?.toDouble(), afterSaleRefundReasons: json['afterSaleRefundReasons'] as String?, afterSaleReturnReasons: json['afterSaleReturnReasons'] as String?, refreshQrCodeEnable: - JsonTool.stringToBoolean(json['refreshQrCodeEnable'] as String), + JsonTool.stringToBoolean(json['refreshQrCodeEnable'] as String?), refreshQrCodeFre: (json['refreshQrCodeFre'] as num?)?.toInt(), offLineOrderApplyEnable: - JsonTool.stringToBoolean(json['offLineOrderApplyEnable'] as String), + JsonTool.stringToBoolean(json['offLineOrderApplyEnable'] as String?), ); Map _$ServicePaySettingToJson(ServicePaySetting instance) => @@ -67,7 +67,7 @@ ServiceWallet _$ServiceWalletFromJson(Map json) => walletTypeId: json['walletTypeId'] as String, balance: (json['balance'] as num).toInt(), cardNumber: json['cardNumber'] as String?, - isFreeze: JsonTool.stringToBoolean(json['isFreeze'] as String), + isFreeze: JsonTool.stringToBoolean(json['isFreeze'] as String?), ); Map _$ServiceWalletToJson(ServiceWallet instance) => diff --git a/lib/common/models/mq/mq_models.g.dart b/lib/common/models/mq/mq_models.g.dart index 54af4c0..5ae0b68 100644 --- a/lib/common/models/mq/mq_models.g.dart +++ b/lib/common/models/mq/mq_models.g.dart @@ -63,7 +63,7 @@ MqttTakeFoodBroadcastMsg _$MqttTakeFoodBroadcastMsgFromJson( productDesc: json['productDesc'] as String, payPrice: (json['payPrice'] as num).toInt(), hourType: json['hourType'] as String, - isDone: JsonTool.stringToBoolean(json['isDone'] as String), + isDone: JsonTool.stringToBoolean(json['isDone'] as String?), ); Map _$MqttTakeFoodBroadcastMsgToJson( diff --git a/lib/common/services/database/database.dart b/lib/common/services/database/database.dart index 600b9dd..873f9b6 100644 --- a/lib/common/services/database/database.dart +++ b/lib/common/services/database/database.dart @@ -40,7 +40,7 @@ const typeConverters = [ BoolConverter, ]; -@Database(version: 6, entities: entities) +@Database(version: 7, entities: entities) @TypeConverters(typeConverters) abstract class AppDatabase extends FloorDatabase { BroadcastDao get getBroadcastDao; diff --git a/lib/common/services/database/database.g.dart b/lib/common/services/database/database.g.dart index f90aa06..546c2c1 100644 --- a/lib/common/services/database/database.g.dart +++ b/lib/common/services/database/database.g.dart @@ -104,7 +104,7 @@ class _$AppDatabase extends AppDatabase { Callback? callback, ]) async { final databaseOptions = sqflite.OpenDatabaseOptions( - version: 5, + version: 7, onConfigure: (database) async { await database.execute('PRAGMA foreign_keys = ON'); await callback?.onConfigure?.call(database); @@ -134,7 +134,7 @@ class _$AppDatabase extends AppDatabase { await database.execute( 'CREATE TABLE IF NOT EXISTS `supermarket_code` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `serviceUniqueCode` TEXT NOT NULL, `spuId` TEXT NOT NULL, `unitId` TEXT NOT NULL, `barCode` TEXT NOT NULL)'); await database.execute( - 'CREATE TABLE IF NOT EXISTS `shop_card` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `orderId` INTEGER NOT NULL, `productServiceUniqueCode` TEXT NOT NULL, `productName` TEXT NOT NULL, `productPic` TEXT NOT NULL, `productPrice` INTEGER NOT NULL, `nature` TEXT NOT NULL, `productNumber` INTEGER NOT NULL, `productWidget` REAL NOT NULL, `totalPrice` INTEGER NOT NULL)'); + 'CREATE TABLE IF NOT EXISTS `shop_card` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `orderId` INTEGER NOT NULL, `productServiceUniqueCode` TEXT NOT NULL, `productName` TEXT NOT NULL, `productPic` TEXT NOT NULL, `productPrice` INTEGER NOT NULL, `nature` TEXT NOT NULL, `productNumber` INTEGER NOT NULL, `productWidget` REAL NOT NULL, `totalPrice` INTEGER NOT NULL, `isPriceIncreased` INTEGER NOT NULL)'); await database.execute( 'CREATE TABLE IF NOT EXISTS `classify` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `serviceUniqueCode` TEXT NOT NULL, `sysType` TEXT NOT NULL, `name` TEXT NOT NULL, `categoryType` TEXT NOT NULL, `sort` INTEGER NOT NULL, `createTime` TEXT NOT NULL, `updateTime` TEXT NOT NULL, `delFlag` INTEGER NOT NULL)'); await database.execute( @@ -1164,7 +1164,9 @@ class _$ShopCardDao extends ShopCardDao { 'nature': _supermarketNatureConverter.encode(item.nature), 'productNumber': item.productNumber, 'productWidget': item.productWidget, - 'totalPrice': item.totalPrice + 'totalPrice': item.totalPrice, + 'isPriceIncreased': + _boolConverter.encode(item.isPriceIncreased) }), _shopCardEntityUpdateAdapter = UpdateAdapter( database, @@ -1180,7 +1182,9 @@ class _$ShopCardDao extends ShopCardDao { 'nature': _supermarketNatureConverter.encode(item.nature), 'productNumber': item.productNumber, 'productWidget': item.productWidget, - 'totalPrice': item.totalPrice + 'totalPrice': item.totalPrice, + 'isPriceIncreased': + _boolConverter.encode(item.isPriceIncreased) }), _shopCardEntityDeletionAdapter = DeletionAdapter( database, @@ -1196,7 +1200,9 @@ class _$ShopCardDao extends ShopCardDao { 'nature': _supermarketNatureConverter.encode(item.nature), 'productNumber': item.productNumber, 'productWidget': item.productWidget, - 'totalPrice': item.totalPrice + 'totalPrice': item.totalPrice, + 'isPriceIncreased': + _boolConverter.encode(item.isPriceIncreased) }); final sqflite.DatabaseExecutor database; @@ -1225,7 +1231,9 @@ class _$ShopCardDao extends ShopCardDao { nature: _supermarketNatureConverter.decode(row['nature'] as String), productNumber: row['productNumber'] as int, productWidget: row['productWidget'] as double, - totalPrice: row['totalPrice'] as int), + totalPrice: row['totalPrice'] as int, + isPriceIncreased: + _boolConverter.decode(row['isPriceIncreased'] as int)), arguments: [orderId]); } diff --git a/lib/common/services/database/database_migration.dart b/lib/common/services/database/database_migration.dart index d3b0ff5..c68bd69 100644 --- a/lib/common/services/database/database_migration.dart +++ b/lib/common/services/database/database_migration.dart @@ -167,13 +167,30 @@ abstract class DatabaseMigration { } }); + static Migration migration6To7 = Migration(6, 7, (database) async { + final columns = await database.rawQuery("PRAGMA table_info(shop_card)"); + bool hasIsPriceIncreased = false; + for (final c in columns) { + if (c['name'] == 'isPriceIncreased') { + hasIsPriceIncreased = true; + break; + } + } + if (!hasIsPriceIncreased) { + await database.execute( + "ALTER TABLE shop_card ADD COLUMN isPriceIncreased INTEGER NOT NULL DEFAULT 0", + ); + } + }); + static List getDatabaseMigrations() { return [ migration1To2, migration2To3, migration3To4, migration4To5, - migration5To6 + migration5To6, + migration6To7, ]; } } diff --git a/lib/common/services/database/entity/shop_card_entity.dart b/lib/common/services/database/entity/shop_card_entity.dart index 3b8aa36..6793bdd 100644 --- a/lib/common/services/database/entity/shop_card_entity.dart +++ b/lib/common/services/database/entity/shop_card_entity.dart @@ -38,6 +38,9 @@ class ShopCardEntity { /// 单商品总价(分) int totalPrice; + /// 是否涨价 + bool isPriceIncreased; + ShopCardEntity({ this.id, required this.orderId, @@ -49,6 +52,7 @@ class ShopCardEntity { required this.productNumber, required this.productWidget, required this.totalPrice, + required this.isPriceIncreased, }); factory ShopCardEntity.fromJson(Map json) => diff --git a/lib/common/services/database/entity/shop_card_entity.g.dart b/lib/common/services/database/entity/shop_card_entity.g.dart index 71da144..abee0f8 100644 --- a/lib/common/services/database/entity/shop_card_entity.g.dart +++ b/lib/common/services/database/entity/shop_card_entity.g.dart @@ -18,6 +18,7 @@ ShopCardEntity _$ShopCardEntityFromJson(Map json) => productNumber: (json['productNumber'] as num).toInt(), productWidget: (json['productWidget'] as num).toDouble(), totalPrice: (json['totalPrice'] as num).toInt(), + isPriceIncreased: json['isPriceIncreased'] as bool, ); Map _$ShopCardEntityToJson(ShopCardEntity instance) => @@ -32,6 +33,7 @@ Map _$ShopCardEntityToJson(ShopCardEntity instance) => 'productNumber': instance.productNumber, 'productWidget': instance.productWidget, 'totalPrice': instance.totalPrice, + 'isPriceIncreased': instance.isPriceIncreased, }; const _$ProductNatureEnumMap = { diff --git a/lib/common/services/database/entity/user_entity.dart b/lib/common/services/database/entity/user_entity.dart index 1e92695..d503972 100644 --- a/lib/common/services/database/entity/user_entity.dart +++ b/lib/common/services/database/entity/user_entity.dart @@ -3,7 +3,6 @@ import 'package:equatable/equatable.dart'; import 'package:floor/floor.dart'; import 'package:json_annotation/json_annotation.dart'; import 'package:pj_supermarket_cloud/common/index.dart'; -import 'package:pj_supermarket_cloud/common/models/index.dart'; part 'user_entity.g.dart'; @@ -30,6 +29,13 @@ class DiscountsItem { /// 基础金额(分),超过了这个基数`extraPer`就生效 int basePrice; + /// 特色菜是否额外收费 + @JsonKey( + fromJson: JsonTool.stringToBoolean, + toJson: JsonTool.booleanToString, + ) + bool specialDishEnable; + /// 打折(8折->0.8) double? extraPer; @@ -38,6 +44,7 @@ class DiscountsItem { required this.hourType, required this.type, required this.basePrice, + required this.specialDishEnable, required this.extraPer, }); diff --git a/lib/common/services/database/entity/user_entity.g.dart b/lib/common/services/database/entity/user_entity.g.dart index e8f1df2..bea6966 100644 --- a/lib/common/services/database/entity/user_entity.g.dart +++ b/lib/common/services/database/entity/user_entity.g.dart @@ -12,6 +12,8 @@ DiscountsItem _$DiscountsItemFromJson(Map json) => hourType: JsonTool.stringToProductHourType(json['hourType'] as String?), type: JsonTool.stringToDiscountsType(json['type'] as String?), basePrice: (json['basePrice'] as num).toInt(), + specialDishEnable: + JsonTool.stringToBoolean(json['specialDishEnable'] as String?), extraPer: (json['extraPer'] as num?)?.toDouble(), ); @@ -21,6 +23,7 @@ Map _$DiscountsItemToJson(DiscountsItem instance) => 'hourType': JsonTool.productHourTypeToString(instance.hourType), 'type': JsonTool.discountsTypeToString(instance.type), 'basePrice': instance.basePrice, + 'specialDishEnable': JsonTool.booleanToString(instance.specialDishEnable), 'extraPer': instance.extraPer, }; diff --git a/lib/common/utils/discounts/discounts_tool.dart b/lib/common/utils/discounts/discounts_tool.dart index 08c6d87..a7b53e0 100644 --- a/lib/common/utils/discounts/discounts_tool.dart +++ b/lib/common/utils/discounts/discounts_tool.dart @@ -30,12 +30,13 @@ class DiscountsTool { } /// 计算额外增加的金额 - /// [totalPrice] 总金额(分) - /// [discountsItem] 优惠项 + /// [userId] 用户id + /// [shopCardList] 购物车列表 + /// [hourType] 优惠类型 /// [return] 额外增加的金额(分) static Future computedExtraPrice({ required String userId, - required int totalPrice, + required List shopCardList, required String hourType, }) async { var discountsItems = await updateUserDiscountsList(userId: userId); @@ -43,10 +44,30 @@ class DiscountsTool { ?.where((element) => element.hourType?.code == hourType) .toList(); if (ObjectUtil.isEmpty(discountsItems)) return 0; + + /// 计算额外价格 var extraPrice = 0; for (final item in discountsItems!) { final extraPer = item.extraPer; + final specialDishEnable = item.specialDishEnable; if (extraPer == null || extraPer <= 1.0) continue; + // 计算总价 + int totalPrice = 0; + // 特色菜不额外收费 + if (!specialDishEnable) { + totalPrice = shopCardList + .where((item) => item.isPriceIncreased) + .map((item) => item.totalPrice) + .reduce((value, element) => value + element); + extraPrice += item.computedDiscountsExtraPrice(totalPrice); + } + // 特色菜额外收费 + if (specialDishEnable) { + totalPrice = shopCardList + .map((item) => item.totalPrice) + .reduce((value, element) => value + element); + extraPrice += item.computedDiscountsExtraPrice(totalPrice); + } extraPrice += item.computedDiscountsExtraPrice(totalPrice); } return extraPrice; diff --git a/lib/common/utils/json/json_tool.dart b/lib/common/utils/json/json_tool.dart index 274888f..eb62bf3 100644 --- a/lib/common/utils/json/json_tool.dart +++ b/lib/common/utils/json/json_tool.dart @@ -1,7 +1,8 @@ import 'package:pj_supermarket_cloud/common/index.dart'; abstract class JsonTool { - static bool stringToBoolean(String value) { + static bool stringToBoolean(String? value) { + if (value == null) return false; return value == '1'; } diff --git a/lib/pages/canteen_product/controller.dart b/lib/pages/canteen_product/controller.dart index b275f68..efbd689 100644 --- a/lib/pages/canteen_product/controller.dart +++ b/lib/pages/canteen_product/controller.dart @@ -172,6 +172,7 @@ class CanteenProductController extends GetxController with OrderMixin { productNumber: 1, productWidget: 0, totalPrice: current.price, + isPriceIncreased: current.isPriceIncreased, ); shopCardList.add(data); } else { @@ -277,7 +278,7 @@ class CanteenProductController extends GetxController with OrderMixin { ObjectUtil.isNotEmpty(hourType.value)) { extraPrice = await DiscountsTool.computedExtraPrice( userId: payUser.value?.userId ?? "", - totalPrice: totalPrice.value, + shopCardList: shopCardList, hourType: hourType.value.code, ); } @@ -316,6 +317,7 @@ class CanteenProductController extends GetxController with OrderMixin { productNumber: 1, productWidget: 0, totalPrice: v.price, + isPriceIncreased: v.isPriceIncreased, ); shopCardList.add(data); } diff --git a/lib/pages/supermarket_order/controller.dart b/lib/pages/supermarket_order/controller.dart index bd04f34..63cd80a 100644 --- a/lib/pages/supermarket_order/controller.dart +++ b/lib/pages/supermarket_order/controller.dart @@ -215,6 +215,8 @@ class SupermarketOrderController extends GetxController with OrderMixin { productNumber: current.productNature == ProductNature.WEIGHT ? 0 : 1, productWidget: 0, totalPrice: currentPrice, + // todo 超市暂时用不到这个字段 + isPriceIncreased: false, ); if (data.nature == ProductNature.WEIGHT) { data.totalPrice = 0;