添加“./StallHelper_Bck20260515_150311_246/stallhelper/”源码

This commit is contained in:
2026-05-18 02:15:02 +08:00
parent ae5d9b6854
commit 893cf504c2
43 changed files with 2768 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
# StallHelper
# 排档辅助管理工具
## LargeStall Stand Auxiliary Management Tool.
+1
View File
@@ -0,0 +1 @@
+80
View File
@@ -0,0 +1,80 @@
apply plugin: 'com.android.application'
apply from: '../.winboll/winboll_app_build.gradle'
apply from: '../.winboll/winboll_lint_build.gradle'
def genVersionName(def versionName){
// 检查编译标志位配置
assert (winbollBuildProps['stageCount'] != null)
assert (winbollBuildProps['baseVersion'] != null)
// 保存基础版本号
winbollBuildProps.setProperty("baseVersion", "${versionName}");
//保存编译标志配置
FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile)
winbollBuildProps.store(fos, "${winbollBuildPropsDesc}");
fos.close();
// 返回编译版本号
return "${versionName}." + winbollBuildProps['stageCount']
}
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
defaultConfig {
applicationId "cc.winboll.studio.stallhelper"
minSdkVersion 26
targetSdkVersion 30
versionCode 1
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.20"
if(true) {
versionName = genVersionName("${versionName}")
}
}
}
dependencies {
// 下拉控件
api 'com.baoyz.pullrefreshlayout:library:1.2.0'
// 拼音搜索
// https://mvnrepository.com/artifact/com.github.open-android/pinyin4j
api 'com.github.open-android:pinyin4j:2.5.0'
// SSH
api 'com.jcraft:jsch:0.1.55'
// Html 解析
api 'org.jsoup:jsoup:1.13.1'
// 二维码类库
api 'com.google.zxing:core:3.4.1'
api 'com.journeyapps:zxing-android-embedded:3.6.0'
// 应用介绍页类库
api 'io.github.medyo:android-about-page:2.0.0'
// 网络连接类库
api 'com.squareup.okhttp3:okhttp:4.4.1'
// AndroidX 类库
api 'androidx.appcompat:appcompat:1.1.0'
api 'androidx.cardview:cardview:1.0.0'
//api 'com.google.android.material:material:1.4.0'
//api 'androidx.viewpager:viewpager:1.0.0'
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0'
//注意:以下5个库必须要引入
//implementation 'androidx.appcompat:appcompat:1.4.1'
api 'androidx.recyclerview:recyclerview:1.0.0'
api 'com.google.code.gson:gson:2.8.5'
api 'com.github.bumptech.glide:glide:4.9.0'
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
// WinBoLL库 nexus.winboll.cc 地址
api 'cc.winboll.studio:libaes:15.20.3'
api 'cc.winboll.studio:libappbase:15.20.9'
api fileTree(dir: 'libs', include: ['*.jar'])
}
+8
View File
@@ -0,0 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Wed May 13 02:22:06 HKT 2026
stageCount=2
libraryProject=
baseVersion=15.20
publishVersion=15.20.1
buildCount=0
baseBetaVersion=15.20.2
+143
View File
@@ -0,0 +1,143 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# ============================== 基础通用规则 ==============================
# 保留系统组件
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
# 保留 WinBoLL 核心包及子类(合并简化规则)
-keep class cc.winboll.studio.** { *; }
-keepclassmembers class cc.winboll.studio.** { *; }
# 保留所有类中的 public static final String TAG 字段(便于日志定位)
-keepclassmembers class * {
public static final java.lang.String TAG;
}
# 保留序列化类(避免Parcelable/Gson解析异常
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留 R 文件(避免资源ID混淆)
-keepclassmembers class **.R$* {
public static <fields>;
}
# 保留 native 方法(避免JNI调用失败)
-keepclasseswithmembernames class * {
native <methods>;
}
# 保留注解和泛型(避免反射/序列化异常)
-keepattributes *Annotation*
-keepattributes Signature
# 屏蔽 Java 8+ 警告(适配 Java 7 语法)
-dontwarn java.lang.invoke.*
-dontwarn android.support.v8.renderscript.*
-dontwarn java.util.function.**
# ============================== 第三方框架专项规则 ==============================
# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容)
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
-keep class okhttp3.internal.** { *; }
-keep class okio.** { *; }
-dontwarn okhttp3.internal.platform.**
-dontwarn okio.**
# ============================== 必要补充规则 ==============================
# OkHttp 4.4.1 补充规则(Java 7 兼容)
-keep class okhttp3.internal.concurrent.** { *; }
-keep class okhttp3.internal.connection.** { *; }
-dontwarn okhttp3.internal.concurrent.TaskRunner
-dontwarn okhttp3.internal.connection.RealCall
# Glide 4.9.0(米盟广告图片加载依赖)
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType {
**[] $VALUES;
public *;
}
-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule {
<init>();
}
-dontwarn com.bumptech.glide.**
# Gson 2.8.5(米盟广告数据序列化依赖)
-keep class com.google.gson.** { *; }
-keep interface com.google.gson.** { *; }
-keepclassmembers class * {
@com.google.gson.annotations.SerializedName <fields>;
}
# 米盟 SDK(核心广告组件,完整保留避免加载失败)
-keep class com.miui.zeus.** { *; }
-keep interface com.miui.zeus.** { *; }
# 保留米盟日志字段(便于广告加载失败排查)
-keepclassmembers class com.miui.zeus.mimo.sdk.** {
public static final java.lang.String TAG;
}
# RecyclerView 1.0.0(米盟广告布局渲染依赖)
-keep class androidx.recyclerview.** { *; }
-keep interface androidx.recyclerview.** { *; }
-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter {
public *;
}
# 其他第三方框架(按引入依赖保留,无则可删除)
# XXPermissions 18.63
-keep class com.hjq.permissions.** { *; }
-keep interface com.hjq.permissions.** { *; }
# ZXing 二维码(核心解析组件)
-keep class com.google.zxing.** { *; }
-keep class com.journeyapps.zxing.** { *; }
# Jsoup HTML解析
-keep class org.jsoup.** { *; }
# Pinyin4j 拼音搜索
-keep class net.sourceforge.pinyin4j.** { *; }
# JSch SSH组件
-keep class com.jcraft.jsch.** { *; }
# AndroidX 基础组件
-keep class androidx.appcompat.** { *; }
-keep interface androidx.appcompat.** { *; }
# ============================== 优化与调试配置 ==============================
# 优化级别(平衡混淆效果与性能)
-optimizationpasses 5
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# 调试辅助(保留行号便于崩溃定位)
-verbose
-dontpreverify
-dontusemixedcaseclassnames
-keepattributes SourceFile,LineNumberTable
+15
View File
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<application
tools:replace="android:icon"
android:icon="@drawable/ic_stall_beta">
<!-- Put flavor specific code here -->
</application>
</manifest>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">排档辅助管理工具+</string>
</resources>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">StallHelper+</string>
</resources>
+49
View File
@@ -0,0 +1,49 @@
<?xml version='1.0' encoding='utf-8'?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="cc.winboll.studio.stallhelper">
<!-- 拥有完全的网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name=".App"
android:allowBackup="true"
android:icon="@drawable/ic_stall"
android:label="@string/app_name"
android:theme="@style/MyStallHelperTheme"
android:supportsRtl="true">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:launchMode="standard"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".activities.AboutActivity"
android:label="AboutActivity"/>
<activity
android:name="cc.winboll.studio.stallhelper.activities.PreNullDiningTableActivity"
android:windowSoftInputMode="adjustResize"/>
<activity
android:name="cc.winboll.studio.stallhelper.activities.CompleteDiningTableActivity"
android:windowSoftInputMode="adjustResize"/>
<activity android:name="cc.winboll.studio.stallhelper.activities.NoteRecordHelperActivity"/>
</application>
</manifest>
@@ -0,0 +1,34 @@
package cc.winboll.studio.stallhelper;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2025/01/22 00:11:41
* @Describe 全局应用类
*/
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.ToastUtils;
public class App extends GlobalApplication {
public static final String TAG = "App";
@Override
public void onCreate() {
super.onCreate();
super.onCreate();
setIsDebugging(BuildConfig.DEBUG);
//setIsDebugging(false);
WinBoLLActivityManager.init(this);
// 初始化 Toast 框架
ToastUtils.init(this);
}
@Override
public void onTerminate() {
super.onTerminate();
ToastUtils.release();
}
}
@@ -0,0 +1,129 @@
package cc.winboll.studio.stallhelper;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.stallhelper.R;
import cc.winboll.studio.stallhelper.activities.AboutActivity;
import cc.winboll.studio.stallhelper.activities.CompleteDiningTableActivity;
import cc.winboll.studio.stallhelper.activities.NoteRecordHelperActivity;
import cc.winboll.studio.stallhelper.activities.PreNullDiningTableActivity;
import cc.winboll.studio.stallhelper.activities.WinBoLLActivity;
final public class MainActivity extends WinBoLLActivity {
public static final String TAG = "MainActivity";
public static final int REQUEST_HOME_ACTIVITY = 0;
public static final int REQUEST_ABOUT_ACTIVITY = 1;
Context mContext;
private Toolbar mToolbar;
// @Override
// protected boolean isEnableDisplayHomeAsUp() {
// return false;
// }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = getApplicationContext();
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
}
@Override
public String getTag() {
return TAG;
}
// @Override
// protected boolean isAddWinBoLLToolBar() {
// return true;
// }
//
// @Override
// protected Toolbar initToolBar() {
// return findViewById(R.id.activitymainToolbar1);
// }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_about) {
startActivity(new Intent(this, AboutActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
void openAboutActivity() {
Intent intent = new Intent(getApplicationContext(), AboutActivity.class);
startActivity(intent);
//App.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), AboutActivity.class);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
case REQUEST_HOME_ACTIVITY : {
LogUtils.d(TAG, "REQUEST_HOME_ACTIVITY");
break;
}
case REQUEST_ABOUT_ACTIVITY : {
LogUtils.d(TAG, "REQUEST_ABOUT_ACTIVITY");
break;
}
default : {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
public void onPreNullDiningTable(View view) {
//ToastUtils.show("onDiningTable");
Intent intent = new Intent(getApplicationContext(), PreNullDiningTableActivity.class);
startActivity(intent);
//App.getWinBoLLActivityManager().startWinBoLLActivity(mContext, PreNullDiningTableActivity.class);
// try {
// WinBoLLActivity clazzActivity = PreNullDiningTableActivity.class.newInstance();
// String tag = clazzActivity.getTag();
// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag);
// Intent intent = new Intent(getApplicationContext(), PreNullDiningTableActivity.class);
// startWinBoLLActivity(intent, tag);
// } catch (IllegalAccessException e) {} catch (InstantiationException e) {}
}
public void onCompleteDiningTable(View view) {
//ToastUtils.show("onDiningTable");
Intent intent = new Intent(getApplicationContext(), CompleteDiningTableActivity.class);
startActivity(intent);
//App.getWinBoLLActivityManager().startWinBoLLActivity(mContext, CompleteDiningTableActivity.class);
// try {
// WinBoLLActivity clazzActivity = CompleteDiningTableActivity.class.newInstance();
// String tag = clazzActivity.getTag();
// LogUtils.d(TAG, "String tag = clazzActivity.getTag(); tag " + tag);
// Intent intent = new Intent(getApplicationContext(), CompleteDiningTableActivity.class);
// startWinBoLLActivity(intent, tag);
// } catch (IllegalAccessException e) {} catch (InstantiationException e) {}
}
public void onNoteRecordHelper(View view) {
Intent intent = new Intent(getApplicationContext(), NoteRecordHelperActivity.class);
startActivity(intent);
}
}
@@ -0,0 +1,50 @@
package cc.winboll.studio.stallhelper.activities;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.widget.Toolbar;
import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.stallhelper.R;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.models.APPInfo;
import cc.winboll.studio.libappbase.views.AboutView;
/**
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @Date 2026/01/11 12:55
* @Describe AboutActivity
*/
public class AboutActivity extends AppCompatActivity {
public static final String TAG = "AboutActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
AboutView aboutView = findViewById(R.id.aboutview);
aboutView.setAPPInfo(genDefaultAppInfo());
}
private APPInfo genDefaultAppInfo() {
LogUtils.d(TAG, "genDefaultAppInfo() 调用");
String branchName = "stallhelper";
APPInfo appInfo = new APPInfo();
appInfo.setAppName("StallHelper");
appInfo.setAppIcon(R.drawable.ic_winboll);
appInfo.setAppDescription(getString(R.string.app_description));
appInfo.setAppGitName("StallHelper");
appInfo.setAppGitOwner("ZhanGSKen");
appInfo.setAppGitAPPBranch(branchName);
appInfo.setAppGitAPPSubProjectFolder(branchName);
appInfo.setAppHomePage("http://10.8.0.4:9876/apks/index-manager.php?project=StallHelper");
appInfo.setAppAPKName("StallHelper");
appInfo.setAppAPKFolderName("StallHelper");
LogUtils.d(TAG, "genDefaultAppInfo: 应用信息已生成");
return appInfo;
}
}
@@ -0,0 +1,371 @@
package cc.winboll.studio.stallhelper.activities;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/10/29 09:22:24
* @Describe 餐桌表补全窗口
*/
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.stallhelper.App;
import cc.winboll.studio.stallhelper.R;
import cc.winboll.studio.stallhelper.beans.DiningTableBean;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
public class CompleteDiningTableActivity extends WinBoLLActivity {
public static final String TAG = "CompleteDiningTableActivity";
// 某一号晚上的餐桌预定补全列表
ArrayList<DiningTableBean> mCompleteTableInfoList;
// 原始预定信息内容输入框
EditText metOriginBookText;
EditText metPreBookList;
EditText metCompleteDate;
ScrollView mScrollView;
ArrayList<String> mszOriginBookList;
@Override
public String getTag() {
return TAG;
}
// @Override
// protected boolean isEnableDisplayHomeAsUp() {
// return true;
// }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_completediningtable);
setTitle("餐桌表补全");
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
StringBuilder sbDateNow = new StringBuilder("当前日期:");
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeString = sdf.format(now);
sbDateNow.append(timeString);
TextView tvDateNow = findViewById(R.id.activitycompletediningtableTextView2);
tvDateNow.setText(sbDateNow.toString());
metOriginBookText = findViewById(R.id.activitycompletediningtableEditText1);
metPreBookList = findViewById(R.id.activitycompletediningtableEditText2);
metCompleteDate = findViewById(R.id.activitycompletediningtableEditText3);
mScrollView = findViewById(R.id.activitycompletediningtableScrollView1);
}
// @Override
// protected Toolbar initToolBar() {
// return findViewById(R.id.activitycompletediningtableToolbar1);
// }
//
// @Override
// protected boolean isAddWinBoLLToolBar() {
// return false;
// }
boolean isInCompleteRule(DiningTableBean item) {
String szCompleteDate = metCompleteDate.getText().toString() + "";
if (item.getDate().equals(szCompleteDate) && item.getDinnerType() == DiningTableBean.DinnerType.Evening) {
return true;
}
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
WinBoLLActivityManager.getInstance().finish(this);
}
return super.onOptionsItemSelected(item);
}
void createNullCompleteTableInfoList() {
mCompleteTableInfoList = new ArrayList<DiningTableBean>();
String szCompleteDate = metCompleteDate.getText().toString() + "";
mCompleteTableInfoList.add(new DiningTableBean("201", 18, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("202", 8, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("203", 8, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("205", 10, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("206", 0, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("207", 0, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("208", 8, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("209", 10, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("210", 8, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("211", 12, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("212", 8, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("213", 9, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("666", 14, true, szCompleteDate));
mCompleteTableInfoList.add(new DiningTableBean("888", 20, true, szCompleteDate));
for (int i = 1; i < 23; i++) {
DiningTableBean tempBean = new DiningTableBean(Integer.toString(i), 0, true, szCompleteDate);
tempBean.setDinnerType(DiningTableBean.DinnerType.Evening);
tempBean.setTableType(DiningTableBean.TableType.Table);
tempBean.setIsSelected(false);
mCompleteTableInfoList.add(tempBean);
}
//DiningTableBean.saveBeanListToFile(getApplicationContext().getExternalFilesDir("temp") + "/1.json", mCompleteTableInfoList);
//ToastUtils.show("Test");
}
ArrayList<DiningTableBean> getOriginBookList() {
//ToastUtils.show(metOriginBookText.getText().toString());
ArrayList<DiningTableBean> listReturn = new ArrayList<DiningTableBean>();
String[] szOriginBookText = metOriginBookText.getText().toString().split("\\r?\\n");
for (String szTemp : szOriginBookText) {
String szTemp2 = szTemp.replace(" ", "");
DiningTableBean bean = format2DiningTableBean(szTemp2);
if (bean != null) {
listReturn.add(bean);
// 更新补全列表
updateCompleteTableInfoList(bean);
}
}
//ToastUtils.show("szOriginBookText : " + Integer.toString(szOriginBookText.length));
//ToastUtils.show("listReturn : " + Integer.toString(listReturn.size()));
return listReturn;
}
//
// 如果补全列表某一项时间和房号与指定项一致,
// 就把指定项信息更新至补全列表中。
//
void updateCompleteTableInfoList(DiningTableBean beanNew) {
for (DiningTableBean completeTableInfo : mCompleteTableInfoList) {
if (completeTableInfo.getDate().equals(beanNew.getDate())
&& completeTableInfo.getDinnerType() == beanNew.getDinnerType()
&& completeTableInfo.getTableNumber().equals(beanNew.getTableNumber())) {
completeTableInfo.setBookDesc(beanNew.getBookDesc());
completeTableInfo.setIsSelected(true);
}
}
}
//
// 检验每一个数据行的日期格式,
// 如果出现(x号/x月x号)以外的日期标注,
// 则提示有数据行日期标识不清晰的情况。
//
boolean checkLinesDateValidAndShow() {
boolean checkResult = true;
String[] szLines = metOriginBookText.getText().toString().split("\\r?\\n");
if (szLines.length < 1) {
ToastUtils.show("没有数据行。");
checkResult = false;
} else {
StringBuilder sb = new StringBuilder("日期标识不清晰,在");
for (int i = 0; i < szLines.length; i++) {
Pattern pattern = Pattern.compile("(\\d*[月]{0,1}\\d+号)\\s*([晚|午]{0,1}).*");
Matcher matcher = pattern.matcher(szLines[i]);
if (!matcher.find()) {
sb.append("(");
sb.append(Integer.toString(i + 1));
sb.append(")");
checkResult = false;
}
}
sb.append("行。");
if (checkResult == false) {
ToastUtils.show(sb.toString());
}
}
return checkResult;
}
//
// 获取指定日期的第一条数据的位置
// 返回 -1 表示所有数据都没有该日期
//
int getFirstIndexOfDate(ArrayList<DiningTableBean> originBookList, String szDate) {
int nResult = -1;
//ToastUtils.show("szDate " + szDate);
for (int i = originBookList.size() - 1 ; i > 0; i--) {
//LogUtils.d(TAG, "originBookList.get(i).getDate() " + originBookList.get(i).getDate());
if (originBookList.get(i).isDiningTableBean()) {
if (originBookList.get(i).getDate().equals(szDate)) {
nResult = i;
continue;
} else {
return nResult;
}
} else {
nResult = i;
continue;
}
}
return nResult;
}
DiningTableBean format2DiningTableBean(String szBookInfo) {
if (!szBookInfo.trim().equals("")) {
//String sz = "29号晚 201房 123456";
// 定义正则表达式模式
Pattern pattern = Pattern.compile("(\\d*[月]{0,1}\\d+号)\\s*([晚|午]{0,1})\\s*(\\d+)([房|桌])[-\\s]*(.*)");
Matcher matcher = pattern.matcher(szBookInfo);
if (matcher.find()) {
String date = matcher.group(1);
String szDinnerType = matcher.group(2);
String tableNumber = matcher.group(3);
String szTableType = matcher.group(4);
String bookDesc = matcher.group(5);
DiningTableBean.DinnerType dinnerType = DiningTableBean.DinnerType.Evening;
if (szDinnerType.equals("")) {
dinnerType = DiningTableBean.DinnerType.Noon;
}
DiningTableBean.TableType tableType = DiningTableBean.TableType.Room;
if (szTableType.equals("")) {
tableType = DiningTableBean.TableType.Table;
}
return new DiningTableBean(tableNumber, 0, true, dinnerType, bookDesc, date, tableType);
} else {
return new DiningTableBean(true, false, szBookInfo);
}
}
return null;
}
void checkAndAddCompleteTableInfoList(ArrayList<DiningTableBean> originBookList) {
boolean isAddCompleteTableInfoList = false;
for (int i = 0; i < originBookList.size(); i++) {
DiningTableBean item = originBookList.get(i);
// 循环读取原始 Bean 列表,
// 如果遇到第一个匹配指定日期号,
// 就不显示 item 项,并且添加预制好的补全表(一次性添加,后续再遇到同类 item 项则不添加补全表。)。
if (isInCompleteRule(item)) {
// 设置不显示 item 项
item.setIsSelected(false);
// 添加补全列表(一次性添加,后续再遇到同类 item 项则不添加补全表。)
if (isAddCompleteTableInfoList == false) {
originBookList.addAll(i, mCompleteTableInfoList);
// 设置后续遇到同类项时,不再添加补全列表
isAddCompleteTableInfoList = true;
i = i + mCompleteTableInfoList.size();
}
}
}
// 如果遍历完原始 Bean 表后还未添加补全表,
// 就添加一次补全表
if (isAddCompleteTableInfoList == false) {
int nInsertPost = getFirstIndexOfDate(originBookList, metCompleteDate.getText().toString() + "");
//ToastUtils.show("nInsertPost " + Integer.toString(nInsertPost));
if (nInsertPost == -1) {
originBookList.addAll(mCompleteTableInfoList);
} else {
originBookList.addAll(nInsertPost, mCompleteTableInfoList);
}
// 设置后续遇到同类项时,不再添加补全列表
isAddCompleteTableInfoList = true;
}
}
public void onCopyResultText(View view) {
// Gets a handle to the clipboard service.
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
// Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText("simple text", metPreBookList.getText());
// Set the clipboard's primary clip.
clipboard.setPrimaryClip(clip);
Toast.makeText(getApplicationContext(), "Copy to clipboard.", Toast.LENGTH_SHORT).show();
}
public void onCleanResultText(View view) {
metPreBookList.setText("");
}
public void onCreatePreBookList(View view) {
if(metCompleteDate.getText().toString().trim().equals("")) {
ToastUtils.show("没有填写补全日期");
return;
}
//checkLinesDateValidAndShow();
createNullCompleteTableInfoList();
ArrayList<DiningTableBean> originBookList = getOriginBookList();
checkAndAddCompleteTableInfoList(originBookList);
StringBuilder sbPreBookList = new StringBuilder();
for (int i = 0; i < originBookList.size(); i++) {
DiningTableBean item = originBookList.get(i);
if (item.isDiningTableBean()) {
if (item.getIsSelected()) {
String szDinnerTyp = "";
if (item.getDinnerType() == DiningTableBean.DinnerType.Evening) {
szDinnerTyp = "";
}
if (item.getDinnerType() == DiningTableBean.DinnerType.Noon) {
szDinnerTyp = "";
}
String szTableType = "";
if (item.getTableType() == DiningTableBean.TableType.Room) {
szTableType = "";
}
if (item.getTableType() == DiningTableBean.TableType.Table) {
szTableType = "";
}
sbPreBookList.append(item.getDate());
//sbPreBookList.append("号");
sbPreBookList.append(szDinnerTyp);
//sbPreBookList.append(" ");
sbPreBookList.append(item.getTableNumber());
sbPreBookList.append(szTableType);
sbPreBookList.append("-");
sbPreBookList.append(item.getBookDesc());
sbPreBookList.append("\n");
}
} else {
sbPreBookList.append(item.getOriginDesc());
sbPreBookList.append("\n");
}
// 不同日期间隔行排版
if (i + 1 != originBookList.size()) {
if (!originBookList.get(i + 1).getDate().equals(originBookList.get(i).getDate())) {
sbPreBookList.append("\n");
}
}
}
//metPreBookList.append("\n");
metPreBookList.append(sbPreBookList.toString());
mScrollView.post(new Runnable() {
@Override
public void run() {
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}
}
@@ -0,0 +1,226 @@
package cc.winboll.studio.stallhelper.activities;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.BackgroundColorSpan;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.stallhelper.R;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @CreateTime 2026-03-31 00:20:00
* @ModifyTime 2026-03-31 14:47:00
* @Describe 订单笔录辅助窗口,支持房号、桌号、多房间号(含"号"字)、手机号尾4位及'-'后文本高亮,原文完整输出
*/
public class NoteRecordHelperActivity extends AppCompatActivity {
public static final String TAG = "NoteRecordHelperActivity";
// 高亮颜色数组
private final int[] highlightColors = {
Color.parseColor("#4CAF50"),
Color.parseColor("#FF9800"),
Color.parseColor("#E91E63"),
Color.parseColor("#F44336"),
Color.parseColor("#FFC107"),
Color.parseColor("#2196F3")
};
// 正则匹配
// 匹配多房间号(包含后面的"号"字):11-16-17号
private final Pattern PATTERN_MULTI_ROOM = Pattern.compile("(\\d+(?:-\\d+)+\\s*号)");
// 匹配手机号(连续11位或带分隔符)
private final Pattern PATTERN_PHONE = Pattern.compile("(?:\\d{11}|(?:\\d{3,4}[\\s-]?){3,4})");
// 控件
private EditText etContent;
private Button btnHighlight;
private TextView tvHighlightResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_noterecordhelper);
LogUtils.i(TAG, "onCreate: 页面初始化");
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setTitle("订单笔录辅助");
initViews();
}
/**
* 初始化控件
*/
private void initViews() {
etContent = findViewById(R.id.et_content);
btnHighlight = findViewById(R.id.btn_highlight);
tvHighlightResult = findViewById(R.id.tv_highlight_result);
btnHighlight.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LogUtils.i(TAG, "onClick: 点击高亮按钮");
highlightContent();
}
});
}
/**
* 解析并高亮内容
*/
private void highlightContent() {
LogUtils.i(TAG, "highlightContent: 开始处理高亮");
String raw = etContent.getText().toString();
if (raw.isEmpty()) {
LogUtils.i(TAG, "highlightContent: 输入内容为空,直接返回");
return;
}
String[] lines = raw.split("\\n");
SpannableStringBuilder ssb = new SpannableStringBuilder();
for (int i = 0; i < lines.length; i++) {
String line = lines[i];
// 空行也完整保留
if (line.isEmpty()) {
ssb.append("\n");
continue;
}
int colorIndex = i % highlightColors.length;
int color = highlightColors[colorIndex];
LogUtils.d(TAG, "highlightContent: 处理第" + (i + 1) + "行,颜色索引=" + colorIndex);
processLine(line, ssb, color);
if (i != lines.length - 1) {
ssb.append("\n");
}
}
tvHighlightResult.setText(ssb);
LogUtils.i(TAG, "highlightContent: 高亮处理完成");
}
/**
* 处理单行高亮(原文完整保留)
* @param line 单行文本
* @param ssb 富文本构建器
* @param color 高亮颜色
*/
private void processLine(String line, SpannableStringBuilder ssb, int color) {
LogUtils.d(TAG, "processLine: line=" + line + ", color=" + Integer.toHexString(color));
// 1. 先把原文完整追加到 ssb,不会丢失任何字符
int start = ssb.length();
ssb.append(line);
// 2. 高亮多房间号(包含"号"字):11-16-17号
Matcher mMulti = PATTERN_MULTI_ROOM.matcher(line);
if (mMulti.find()) {
int s = start + mMulti.start(1);
int e = start + mMulti.end(1);
ssb.setSpan(new BackgroundColorSpan(color), s, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 3. 高亮房号 / 桌号
int roomIdx = line.indexOf("");
int tableIdx = line.indexOf("号桌");
if (roomIdx != -1) {
int s = findNumberStart(line, roomIdx);
int e = roomIdx + 1;
ssb.setSpan(new BackgroundColorSpan(color), start + s, start + e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else if (tableIdx != -1) {
int s = findNumberStart(line, tableIdx);
int e = tableIdx + 2;
ssb.setSpan(new BackgroundColorSpan(color), start + s, start + e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 4. 处理'-'后的内容:优先高亮手机号尾4位,否则高亮全部文本
int dashIndex = line.indexOf("-");
if (dashIndex != -1) {
String afterDash = line.substring(dashIndex + 1);
Matcher phoneMatcher = PATTERN_PHONE.matcher(afterDash);
boolean foundPhone = false;
// 尝试匹配手机号并高亮尾4位
while (phoneMatcher.find()) {
String phone = phoneMatcher.group();
if (phone != null) {
foundPhone = true;
// 提取纯数字
String pureNumber = phone.replaceAll("[^0-9]", "");
if (pureNumber.length() >= 4) {
String last4 = pureNumber.substring(pureNumber.length() - 4);
// 在原行中定位尾4位(从 dashIndex+1 开始查找,避免匹配前面的数字)
int tailStart = line.indexOf(last4, dashIndex + 1);
if (tailStart != -1) {
int s = start + tailStart;
int e = s + 4;
ssb.setSpan(new BackgroundColorSpan(color), s, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
// 没有手机号,则高亮'-'后的全部文本
if (!foundPhone) {
int s = start + dashIndex + 1;
int e = start + line.length();
ssb.setSpan(new BackgroundColorSpan(color), s, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
} else {
// 无'-'的行,尝试匹配并高亮手机号尾4位
Matcher phoneMatcher = PATTERN_PHONE.matcher(line);
while (phoneMatcher.find()) {
String phone = phoneMatcher.group();
if (phone != null) {
String pureNumber = phone.replaceAll("[^0-9]", "");
if (pureNumber.length() >= 4) {
String last4 = pureNumber.substring(pureNumber.length() - 4);
int tailStart = line.indexOf(last4);
if (tailStart != -1) {
int s = start + tailStart;
int e = s + 4;
ssb.setSpan(new BackgroundColorSpan(color), s, e, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
}
}
}
/**
* 查找数字起始位置
* @param line 文本行
* @param endIdx 结束位置
* @return 数字起始下标
*/
private int findNumberStart(String line, int endIdx) {
LogUtils.d(TAG, "findNumberStart: endIdx=" + endIdx);
for (int i = endIdx - 1; i >= 0; i--) {
char c = line.charAt(i);
if (!Character.isDigit(c) && c != ' ') {
return i + 1;
}
}
return 0;
}
}
@@ -0,0 +1,264 @@
package cc.winboll.studio.stallhelper.activities;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/10/16 05:13:42
* @Describe 餐桌空白预定表生成窗口
*/
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.widget.Toolbar;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.stallhelper.R;
import cc.winboll.studio.stallhelper.beans.DiningTableBean;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
public class PreNullDiningTableActivity extends WinBoLLActivity {
public static final String TAG = "DiningTableActivity";
ArrayList<DiningTableBean> mListTableInfo;
DiningTableBeanListAdapter mDiningTableBeanListAdapter;
EditText metPreBookList;
ScrollView mScrollView;
RadioButton mrbDinnerTypeNoon;
RadioButton mrbDinnerTypeEvening;
@Override
public String getTag() {
return TAG;
}
// @Override
// protected boolean isEnableDisplayHomeAsUp() {
// return true;
// }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prenulldiningtable);
setTitle("餐桌空白预定表制作");
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
StringBuilder sbDateNow = new StringBuilder("当前日期:");
Date now = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeString = sdf.format(now);
sbDateNow.append(timeString);
TextView tvDateNow = findViewById(R.id.activityprenulldiningtableTextView2);
tvDateNow.setText(sbDateNow.toString());
LocalDate currentDate = LocalDate.now();
int dayOfMonth = currentDate.getDayOfMonth();
EditText etDateNow = findViewById(R.id.activityprenulldiningtableEditText1);
etDateNow.setText(Integer.toString(dayOfMonth));
mListTableInfo = new ArrayList<DiningTableBean>();
addTable();
RecyclerView recyclerView = findViewById(R.id.activityprenulldiningtableRecyclerView1);
recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false));
mDiningTableBeanListAdapter = new DiningTableBeanListAdapter(mListTableInfo);
// 设置 RecyclerView 的适配器
recyclerView.setAdapter(mDiningTableBeanListAdapter);
metPreBookList = findViewById(R.id.activityprenulldiningtableEditText2);
mScrollView = findViewById(R.id.activityprenulldiningtableScrollView1);
mrbDinnerTypeNoon = findViewById(R.id.activityprenulldiningtableRadioButton1);
mrbDinnerTypeEvening = findViewById(R.id.activityprenulldiningtableRadioButton2);
mrbDinnerTypeEvening.setChecked(true);
}
//
// @Override
// protected Toolbar initToolBar() {
// return findViewById(R.id.activityprenulldiningtableToolbar1);
// }
//
// @Override
// protected boolean isAddWinBoLLToolBar() {
// return false;
// }
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
WinBoLLActivityManager.getInstance().finish(this);
}
return super.onOptionsItemSelected(item);
}
void addTable() {
mListTableInfo.add(new DiningTableBean("201", 18, false));
mListTableInfo.add(new DiningTableBean("202", 8, false));
mListTableInfo.add(new DiningTableBean("203", 8, false));
mListTableInfo.add(new DiningTableBean("205", 10, false));
mListTableInfo.add(new DiningTableBean("206", 0, false));
mListTableInfo.add(new DiningTableBean("207", 0, false));
mListTableInfo.add(new DiningTableBean("208", 8, false));
mListTableInfo.add(new DiningTableBean("209", 10, false));
mListTableInfo.add(new DiningTableBean("210", 8, false));
mListTableInfo.add(new DiningTableBean("211", 12, false));
mListTableInfo.add(new DiningTableBean("212", 8, false));
mListTableInfo.add(new DiningTableBean("213", 9, false));
mListTableInfo.add(new DiningTableBean("666", 14, false));
mListTableInfo.add(new DiningTableBean("888", 20, false));
}
public void onDinnerType(View view) {
RadioButton rb = (RadioButton)view;
if (rb.getId() == mrbDinnerTypeNoon.getId()) {
ToastUtils.show("午餐");
mrbDinnerTypeEvening.setChecked(false);
} else {
ToastUtils.show("晚餐");
mrbDinnerTypeNoon.setChecked(false);
}
}
public void onCopyResultText(View view) {
// Gets a handle to the clipboard service.
ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(Context.CLIPBOARD_SERVICE);
// Creates a new text clip to put on the clipboard
ClipData clip = ClipData.newPlainText("simple text", metPreBookList.getText());
// Set the clipboard's primary clip.
clipboard.setPrimaryClip(clip);
Toast.makeText(getApplicationContext(), "Copy to clipboard.", Toast.LENGTH_SHORT).show();
}
public void onCleanResultText(View view) {
metPreBookList.setText("");
}
public void onCreatePreBookList(View view) {
String szDinnerTyp = mrbDinnerTypeEvening.isChecked() ?"": "";
EditText etDate = findViewById(R.id.activityprenulldiningtableEditText1);
StringBuilder sbPreBookList = new StringBuilder();
for (DiningTableBean item : mListTableInfo) {
if (item.getIsSelected()) {
/*sbPreBookList.append(etDate.getText());
sbPreBookList.append("号 ");
sbPreBookList.append(szDinnerTyp);
sbPreBookList.append(" ");
sbPreBookList.append(item.getTableNumber());
sbPreBookList.append("房-\n");*/
String szTableType = "";
if (item.getTableType() == DiningTableBean.TableType.Room) {
szTableType = "";
}
if (item.getTableType() == DiningTableBean.TableType.Table) {
szTableType = "";
}
sbPreBookList.append(etDate.getText());
sbPreBookList.append("");
sbPreBookList.append(szDinnerTyp);
sbPreBookList.append(" ");
sbPreBookList.append(item.getTableNumber());
sbPreBookList.append(szTableType);
sbPreBookList.append("-");
sbPreBookList.append(item.getBookDesc());
sbPreBookList.append("\n");
}
}
//metPreBookList.append("\n");
metPreBookList.append(sbPreBookList.toString());
mScrollView.post(new Runnable() {
@Override
public void run() {
mScrollView.fullScroll(ScrollView.FOCUS_DOWN);
}
});
}
public void onSelectALLTable(View view) {
boolean isSelectAll =((CheckBox)findViewById(R.id.activityprenulldiningtableCheckBox1)).isChecked();
for (DiningTableBean item : mListTableInfo) {
item.setIsSelected(isSelectAll);
}
//ToastUtils.show(Boolean.toString(isSelectAll));
mDiningTableBeanListAdapter.notifyDataSetChanged();
}
class DiningTableBeanListAdapter extends RecyclerView.Adapter {
ArrayList<DiningTableBean> mDataList;
public DiningTableBeanListAdapter(ArrayList<DiningTableBean> listInfo) {
mDataList = listInfo;
}
@Override
public int getItemCount() {
return mDataList.size();
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final DiningTableBean item = mDataList.get(position);
if (holder.getItemViewType() == 0) {
final SimpleViewHolder viewHolder = (SimpleViewHolder) holder;
viewHolder.mcbTable.setText(item.getTableNumber() + "房(" + Integer.toString(item.getMaxPersonCount()) + "人)");
viewHolder.mcbTable.setChecked(item.getIsSelected());
viewHolder.mcbTable.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
item.setIsSelected(viewHolder.mcbTable.isChecked());
}
});
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_tableinfo, parent, false);
return new SimpleViewHolder(view);
}
return null;
}
class SimpleViewHolder extends RecyclerView.ViewHolder {
CheckBox mcbTable;
SimpleViewHolder(View itemView) {
super(itemView);
mcbTable = itemView.findViewById(R.id.listviewtableinfoCheckBox1);
}
}
}
}
@@ -0,0 +1,82 @@
package cc.winboll.studio.stallhelper.activities;
/**
* @Author ZhanGSKen@AliYun.Com
* @Date 2025/03/28 15:34:16
* @Describe 应用活动窗口基类
*/
import android.app.Activity;
import android.os.Bundle;
import android.os.PersistableBundle;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.stallhelper.App;
import cc.winboll.studio.stallhelper.R;
public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivityBase";
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
WinBoLLActivityManager getWinBoLLActivityManager() {
return WinBoLLActivityManager.getInstance();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWinBoLLActivityManager().add(this);
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// if (item.getItemId() == cc.winboll.studio.appbase.R.id.item_log) {
// GlobalApplication.getWinBoLLActivityManager().startLogActivity(this);
// return true;
// } else if(item.getItemId() == cc.winboll.studio.appbase.R.id.item_minimal) {
// //moveTaskToBack(true);
// exit();
// }
// 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。
return super.onOptionsItemSelected(item);
}
void exit() {
YesNoAlertDialog.show(this, "Exit " + getString(R.string.app_name), "Close all activity and exit?", new YesNoAlertDialog.OnDialogResultListener(){
@Override
public void onYes() {
WinBoLLActivityManager.getInstance().finishAll();
}
@Override
public void onNo() {
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
getWinBoLLActivityManager().registeRemove(this);
}
}
@@ -0,0 +1,216 @@
package cc.winboll.studio.stallhelper.beans;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/10/16 06:09:54
* @Describe 餐桌
*/
import android.util.JsonReader;
import android.util.JsonWriter;
import cc.winboll.studio.libappbase.BaseBean;
import java.io.IOException;
public class DiningTableBean extends BaseBean {
public static final String TAG = "AuthenticationBean";
public enum DinnerType { Noon, Evening };
public enum TableType { Room, Table };
// 餐桌号
String tableNumber;
// 最大就餐人数
int maxPersonCount;
// 是否选取了这张桌号
boolean isSelected;
// 预定时间类型
DinnerType dinnerType;
// 预定信息
String bookDesc;
// 预定时间
String date;
// 餐桌类型
TableType tableType;
// 是否被识别为 DiningTableBean
boolean isDiningTableBean;
// 或者是无法识别为 DiningTableBean 的原始信息。
String originDesc;
public DiningTableBean(String tableNumber, int maxPersonCount, boolean isSelected) {
this.tableNumber = tableNumber;
this.maxPersonCount = maxPersonCount;
this.isSelected = isSelected;
this.dinnerType = DinnerType.Evening;
this.bookDesc = "";
this.date = "";
this.tableType = TableType.Room;
this.isDiningTableBean = true;
this.originDesc = "";
}
public DiningTableBean(String tableNumber, int maxPersonCount, boolean isSelected, String date) {
this.tableNumber = tableNumber;
this.maxPersonCount = maxPersonCount;
this.isSelected = isSelected;
this.dinnerType = DinnerType.Evening;
this.bookDesc = "";
this.date = date;
this.tableType = TableType.Room;
this.isDiningTableBean = true;
this.originDesc = "";
}
public DiningTableBean(String tableNumber, int maxPersonCount, boolean isSelected, DinnerType dinnerType, String bookDesc, String date, TableType tableType) {
this.tableNumber = tableNumber;
this.maxPersonCount = maxPersonCount;
this.isSelected = isSelected;
this.dinnerType = dinnerType;
this.bookDesc = bookDesc;
this.date = date;
this.tableType = tableType;
this.isDiningTableBean = true;
this.originDesc = "";
}
public DiningTableBean(boolean isSelected, boolean isDiningTableBean, String originDesc) {
this.tableNumber = "";
this.maxPersonCount = 0;
this.isSelected = isSelected;
this.dinnerType = DinnerType.Evening;
this.bookDesc = "";
this.date = "";
this.tableType = TableType.Room;
this.isDiningTableBean = isDiningTableBean;
this.originDesc = originDesc;
}
public void setOriginDesc(String originDesc) {
this.originDesc = originDesc;
}
public String getOriginDesc() {
return originDesc;
}
public void setIsDiningTableBean(boolean isDiningTableBean) {
this.isDiningTableBean = isDiningTableBean;
}
public boolean isDiningTableBean() {
return isDiningTableBean;
}
public void setTableType(TableType tableType) {
this.tableType = tableType;
}
public TableType getTableType() {
return tableType;
}
public void setDate(String date) {
this.date = date;
}
public String getDate() {
return date;
}
public void setDinnerType(DinnerType dinnerType) {
this.dinnerType = dinnerType;
}
public DinnerType getDinnerType() {
return dinnerType;
}
public void setBookDesc(String bookDesc) {
this.bookDesc = bookDesc;
}
public String getBookDesc() {
return bookDesc;
}
public void setIsSelected(boolean isSelected) {
this.isSelected = isSelected;
}
public boolean getIsSelected() {
return isSelected;
}
public void setTableNumber(String tableNumber) {
this.tableNumber = tableNumber;
}
public String getTableNumber() {
return tableNumber;
}
public void setMaxPersonCount(int maxPersonCount) {
this.maxPersonCount = maxPersonCount;
}
public int getMaxPersonCount() {
return maxPersonCount;
}
@Override
public String getName() {
return DiningTableBean.class.getName();
}
@Override
public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException {
super.writeThisToJsonWriter(jsonWriter);
DiningTableBean bean = this;
jsonWriter.name("tableNumber").value(bean.getTableNumber());
jsonWriter.name("maxPersonCount").value(bean.getMaxPersonCount());
jsonWriter.name("isSelected").value(bean.getTableNumber());
jsonWriter.name("dinnerType").value(bean.getDinnerType().ordinal());
jsonWriter.name("bookDesc").value(bean.getBookDesc());
jsonWriter.name("date").value(bean.getDate());
jsonWriter.name("tableType").value(bean.getTableType().ordinal());
}
@Override
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
if (name.equals("tableNumber")) {
setTableNumber(jsonReader.nextString());
} else if (name.equals("maxPersonCount")) {
setMaxPersonCount(jsonReader.nextInt());
} else if (name.equals("isSelected")) {
setIsSelected(jsonReader.nextBoolean());
} else if (name.equals("dinnerType")) {
setDinnerType(DinnerType.values()[jsonReader.nextInt()]);
} else if (name.equals("bookDesc")) {
setBookDesc(jsonReader.nextString());
} else if (name.equals("date")) {
setDate(jsonReader.nextString());
} else if (name.equals("tableType")) {
setTableType(TableType.values()[jsonReader.nextInt()]);
} else {
return false;
}
}
return true;
}
@Override
public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException {
jsonReader.beginObject();
while (jsonReader.hasNext()) {
String name = jsonReader.nextName();
if (!initObjectsFromJsonReader(jsonReader, name)) {
jsonReader.skipValue();
}
}
// 结束 JSON 对象
jsonReader.endObject();
return this;
}
}
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 阴影部分 -->
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
<item
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#0F000000"
android:startColor="#0F000000" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
<!-- 背景部分 -->
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
<item
android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="5dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#0FFFFFFF"
android:startColor="#FFFFFFFF" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 阴影部分 -->
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
<item
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#0F000000"
android:startColor="#0F000000" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
<!-- 背景部分 -->
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
<item
android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="5dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#AF000000"
android:startColor="#AF000000" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 阴影部分 -->
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
<item
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#0FFFFFFF"
android:startColor="#0FFFFFFF" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
<!-- 背景部分 -->
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
<item
android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="5dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#CFFFFFFF"
android:startColor="#CFFFFFFF" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 阴影部分 -->
<!-- 个人觉得更形象的表达:top代表下边的阴影高度,left代表右边的阴影宽度。其实也就是相对应的offset,solid中的颜色是阴影的颜色,也可以设置角度等等 -->
<item
android:left="2dp"
android:top="2dp"
android:right="2dp"
android:bottom="2dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="#0F000000"
android:startColor="#0F000000" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
<!-- 背景部分 -->
<!-- 形象的表达:bottom代表背景部分在上边缘超出阴影的高度,right代表背景部分在左边超出阴影的宽度(相对应的offset) -->
<item
android:left="3dp"
android:top="3dp"
android:right="3dp"
android:bottom="5dp">
<shape android:shape="rectangle" >
<gradient
android:angle="270"
android:endColor="@color/colorAccent"
android:startColor="@color/colorAccent" />
<corners
android:bottomLeftRadius="6dip"
android:bottomRightRadius="6dip"
android:topLeftRadius="6dip"
android:topRightRadius="6dip" />
</shape>
</item>
</layer-list>
@@ -0,0 +1,69 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="256dp"
android:height="256dp"
android:viewportWidth="256"
android:viewportHeight="256">
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M67.56 132.48C67.56 132.48 196.61 132.48 196.61 132.48 196.61 132.48 196.61 140.79 196.61 140.79 196.61 140.79 67.56 140.79 67.56 140.79 67.56 140.79 67.56 132.48 67.56 132.48"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M100.51 140.79C100.51 140.79 108.38 140.79 108.38 140.79 108.38 140.79 108.38 211.22 108.38 211.22 108.38 211.22 100.51 211.22 100.51 211.22 100.51 211.22 100.51 140.79 100.51 140.79"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M157.4 140.79C157.4 140.79 165.72 140.79 165.72 140.79 165.72 140.79 165.72 211.22 165.72 211.22 165.72 211.22 157.4 211.22 157.4 211.22 157.4 211.22 157.4 140.79 157.4 140.79"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M32.05 85.46C32.05 85.46 38.61 85.46 38.61 85.46 38.61 85.46 38.61 211.22 38.61 211.22 38.61 211.22 32.05 211.22 32.05 211.22 32.05 211.22 32.05 85.46 32.05 85.46"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M38.61 160.26C38.61 160.26 77.24 160.26 77.24 160.26 77.24 160.26 77.24 165.51 77.24 165.51 77.24 165.51 38.61 165.51 38.61 165.51 38.61 165.51 38.61 160.26 38.61 160.26"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M73.52 160.26C73.52 160.26 80.96 160.26 80.96 160.26 80.96 160.26 80.96 211.22 80.96 211.22 80.96 211.22 73.52 211.22 73.52 211.22 73.52 211.22 73.52 160.26 73.52 160.26"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M226.71 85.46C226.71 85.46 233.27 85.46 233.27 85.46 233.27 85.46 233.27 211.22 233.27 211.22 233.27 211.22 226.71 211.22 226.71 211.22 226.71 211.22 226.71 85.46 226.71 85.46"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M188.08 157.64C188.08 157.64 226.71 157.64 226.71 157.64 226.71 157.64 226.71 162.89 226.71 162.89 226.71 162.89 188.08 162.89 188.08 162.89 188.08 162.89 188.08 157.64 188.08 157.64"/>
<path
android:fillColor="#FF977A1F"
android:strokeColor="#FF977A1F"
android:strokeWidth="2.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M188.08 157.64C188.08 157.64 195.52 157.64 195.52 157.64 195.52 157.64 195.52 208.59 195.52 208.59 195.52 208.59 188.08 208.59 188.08 208.59 188.08 208.59 188.08 157.64 188.08 157.64"/>
</vector>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:clickable="true">
<item android:drawable="@drawable/ic_launcher_background"/>
<item
android:left="15dp"
android:top="15dp"
android:right="15dp"
android:bottom="15dp"
android:drawable="@drawable/ic_launcher_foreground"/>
</layer-list>
@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="@color/colorPrimary"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
</vector>
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:angle="180"
android:endColor="#FFFFFFFF"
android:startColor="#FFFFFFFF"
android:type="linear" />
<corners android:radius="10dp" />
</shape>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activityBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/toolbarBackgroundColor"
android:id="@+id/toolbar"/>
<cc.winboll.studio.libappbase.views.AboutView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:id="@+id/aboutview"/>
</LinearLayout>
@@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activityBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/toolbarBackgroundColor"
android:id="@+id/toolbar"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前日期:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/activitycompletediningtableTextView2"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="补全设置:"
android:textAppearance="?android:attr/textAppearanceLarge"/>
<EditText
android:layout_width="wrap_content"
android:ems="10"
android:hint="输入(N或N月N)号"
android:layout_height="wrap_content"
android:id="@+id/activitycompletediningtableEditText3"
android:layout_weight="1.0"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号晚"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空"
android:layout_toLeftOf="@id/activitycompletediningtableButton2"
android:id="@+id/activitycompletediningtableButton3"
android:onClick="onCleanResultText"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="复制"
android:layout_toLeftOf="@id/activitycompletediningtableButton1"
android:id="@+id/activitycompletediningtableButton2"
android:onClick="onCopyResultText"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="补全订餐列表"
android:id="@+id/activitycompletediningtableButton1"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:onClick="onCreatePreBookList"/>
</RelativeLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/activitycompletediningtableScrollView2"
android:layout_weight="1.0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top"
android:id="@+id/activitycompletediningtableEditText1"/>
</LinearLayout>
</ScrollView>
<View
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="#ccc"/>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/activitycompletediningtableScrollView1"
android:layout_weight="1.0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="top"
android:id="@+id/activitycompletediningtableEditText2"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
@@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activityBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/toolbarBackgroundColor"
android:id="@+id/toolbar"/>
<LinearLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/bg_frame"
android:onClick="onPreNullDiningTable">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/colorPreNullBackgroung"
android:src="@drawable/diningtable"
android:layout_margin="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="餐桌空白预定表制作"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/bg_frame"
android:onClick="onCompleteDiningTable">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/colorCompleteBackgroung"
android:src="@drawable/diningtable"
android:layout_margin="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="订餐列表补全"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/bg_frame"
android:onClick="onNoteRecordHelper">
<ImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@color/colorCompleteBackgroung"
android:src="@drawable/ic_noterecordhelper"
android:layout_margin="10dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="订单笔录辅助"
android:textAppearance="?android:attr/textAppearanceLarge"/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="?attr/activityBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/toolbarBackgroundColor"
android:id="@+id/toolbar"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="订单笔录辅助"
android:textSize="20sp"
android:textStyle="bold"
android:gravity="center"
android:paddingBottom="16dp"/>
<!-- 输入区域 -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:fillViewport="true">
<EditText
android:id="@+id/et_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:hint="请输入订单内容,每行一条记录"
android:gravity="top|start"
android:background="@android:color/white"
android:textColor="@android:color/black"
android:textSize="18sp"
android:padding="12dp"
android:inputType="textMultiLine|textNoSuggestions"
android:minLines="10"
android:scrollbars="vertical"/>
</ScrollView>
<Button
android:id="@+id/btn_highlight"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="一键高亮标记"
android:layout_marginTop="12dp"/>
<!-- 结果区域:关键是 fillViewport -->
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1.0"
android:layout_marginTop="12dp"
android:fillViewport="true">
<TextView
android:id="@+id/tv_highlight_result"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:padding="12dp"
android:textSize="18sp"
android:gravity="top|start"
android:scrollbars="vertical"/>
</ScrollView>
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,160 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/activityBackgroundColor">
<androidx.appcompat.widget.Toolbar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/toolbarBackgroundColor"
android:id="@+id/toolbar"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="当前日期:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/activityprenulldiningtableTextView2"/>
</LinearLayout>
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="订餐日期:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_alignParentLeft="true"
android:id="@+id/activityprenulldiningtableTextView1"
android:layout_centerVertical="true"/>
<EditText
android:layout_width="50dp"
android:layout_height="wrap_content"
android:inputType="number"
android:ems="10"
android:layout_toRightOf="@+id/activityprenulldiningtableTextView1"
android:id="@+id/activityprenulldiningtableEditText1"
android:layout_centerVertical="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_toRightOf="@id/activityprenulldiningtableEditText1"
android:layout_centerVertical="true"/>
</RelativeLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="午餐"
android:id="@+id/activityprenulldiningtableRadioButton1"
android:onClick="onDinnerType"/>
<RadioButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="晚餐"
android:id="@+id/activityprenulldiningtableRadioButton2"
android:onClick="onDinnerType"/>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/activityprenulldiningtableCheckBox1"
android:text="全选"
android:layout_marginRight="10dp"
android:onClick="onSelectALLTable"/>
<androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_shadow"
android:padding="10dp"
android:id="@+id/activityprenulldiningtableRecyclerView1"/>
</LinearLayout>
<RelativeLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清空"
android:layout_toLeftOf="@id/activityprenulldiningtableButton2"
android:id="@+id/activityprenulldiningtableButton3"
android:onClick="onCleanResultText"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="复制"
android:layout_toLeftOf="@id/activityprenulldiningtableButton1"
android:id="@+id/activityprenulldiningtableButton2"
android:onClick="onCopyResultText"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="制作订餐列表"
android:id="@+id/activityprenulldiningtableButton1"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:onClick="onCreatePreBookList"/>
</RelativeLayout>
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:id="@+id/activityprenulldiningtableScrollView1"
android:layout_weight="1.0">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="top"
android:id="@+id/activityprenulldiningtableEditText2"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:cardBackgroundColor="#F5F5F5"
app:cardElevation="4dp"
app:cardCornerRadius="4dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp">
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listviewtableinfoCheckBox1"/>
</androidx.cardview.widget.CardView>
@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/shape_gradient"
android:gravity="center"
android:orientation="vertical"
android:padding="10dp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/ic_launcher"/>
<TextView
android:id="@android:id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textColor="#FF000000"
android:textSize="16sp"/>
</LinearLayout>
</LinearLayout>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_about"
android:title="About"
android:icon="@android:drawable/ic_menu_info_details"
app:showAsAction="ifRoom"/>
</menu>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">排档辅助管理工具</string>
</resources>
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- WinBoLL 默认方案 -->
<color name="colorPrimary">#FF196ABC</color>
<color name="colorPrimaryDark">#FF002B57</color>
<color name="colorAccent">#FF80BFFF</color>
<color name="colorToastFrame">#FFA9A9A9</color>
<color name="colorToastShadow">#FF000000</color>
<color name="colorToastBackgroung">#FFFFFFFF</color>
<color name="colorPreNullBackgroung">#FF31D423</color>
<color name="colorCompleteBackgroung">#FF34E4E7</color>
<!-- APPBase 主题必需颜色 -->
<color name="mainWindowBackgroundColor">#FFF5F5F5</color>
<color name="mainWindowTextColor">#FF000000</color>
<color name="toolbarTextColor">#FFFFFFFF</color>
<color name="toolbarBackgroundColor">#FF196ABC</color>
<color name="debugTextColor">#FF808080</color>
<!-- 基础颜色 -->
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
</resources>
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">StallHelper</string>
<string name="app_description">LargeStall Stand Auxiliary Management Tool.</string>
</resources>
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyStallHelperTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="themeDebug">@style/MyDebugActivityTheme</item>
<item name="aboutViewBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="aboutViewTextColor">?attr/mainWindowTextColor</item>
<item name="aboutViewTitleColor">?attr/mainWindowTextColor</item>
<item name="aboutViewDividerColor">?attr/mainWindowDarkTextColor</item>
<item name="dialogBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="dialogTextColor">?attr/mainWindowTextColor</item>
<item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="textViewTextColor">?attr/mainWindowTextColor</item>
<item name="editTextBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="editTextTextColor">?attr/mainWindowTextColor</item>
<item name="scrollViewBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="activityBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="activityTextColor">?attr/mainWindowTextColor</item>
<item name="mainWindowBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowDarkBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowDarkTextColor">@color/mainWindowTextColor</item>
</style>
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">?attr/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">?attr/debugTextColor</item>
<item name="colorTextBackgound">?attr/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style>
</resources>
+12
View File
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" >
<application>
<!-- Put flavor specific code here -->
</application>
</manifest>
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Put flavor specific strings here -->
</resources>