Commit 88785ac4 authored by YONG-LIN SU's avatar YONG-LIN SU

1. 針對資料庫進行調整

2. 刪除不必要欄位
3. 修正部分bug
parent d4472e97
......@@ -12,6 +12,6 @@
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-08-03T07:12:30.738727600Z" />
<timeTargetWasSelectedWithDropDown value="2022-08-04T00:44:36.745181400Z" />
</component>
</project>
\ No newline at end of file
......@@ -13,6 +13,7 @@ import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.text.SimpleDateFormat;
import ecom.android.newparkapp.converter.CaseStatusConverter;
import ecom.android.newparkapp.databinding.CardViewListFilesItemBinding;
import ecom.android.newparkapp.entity.CaseAndAllCasePhoto;
......@@ -68,13 +69,13 @@ public class CaseListAdapter extends ListAdapter<CaseAndAllCasePhoto, CaseListAd
dataBinding.txvBillingNumber2.setText(caseAndAllCasePhoto.thisCase.billingNumber2);
// 狀態
dataBinding.txvStatus.setText(String.valueOf(caseAndAllCasePhoto.thisCase.billStatus));
dataBinding.txvStatus.setText(CaseStatusConverter.toString(caseAndAllCasePhoto.thisCase.caseStatus));
// 時數
dataBinding.txvHours.setText(String.valueOf(caseAndAllCasePhoto.thisCase.periodHour));
// 第一張 照片
// TODO: 2022/8/1 取得第一張 照片作為展示之用途
// 2022/8/1 取得第一張 照片作為展示之用途
File file = null;
for (int i = 0; i < caseAndAllCasePhoto.casePhotos.size(); i ++){
......
......@@ -10,6 +10,7 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CaseStatus;
import ecom.android.newparkapp.viewModel.BlueToothViewModel;
public class ConvertBindingAdapter {
......@@ -48,4 +49,17 @@ public class ConvertBindingAdapter {
textView.setTextColor(colorCode);
}
@BindingAdapter("caseStatus2Color")
public static void CaseStatus2Color(TextView textView, CaseStatus caseStatus){
int colorCode = Color.BLACK;
switch (caseStatus){
case LOCK:
colorCode = Color.RED;
break;
default:
break;
}
textView.setTextColor(colorCode);
}
}
\ No newline at end of file
package ecom.android.newparkapp.converter;
import androidx.room.ProvidedTypeConverter;
import androidx.room.TypeConverter;
import ecom.android.newparkapp.entity.CaseStatus;
@ProvidedTypeConverter
public class CaseStatusConverter {
@TypeConverter
public static CaseStatus toCaseStatus(int value){
return CaseStatus.values()[value];
}
@TypeConverter
public static int fromCaseStatus(CaseStatus caseStatus){
return caseStatus.ordinal();
}
public static String toString(CaseStatus caseStatus){
String caseStatusString = "";
switch (caseStatus){
case LOCK:
caseStatusString = "註銷";
break;
default:
caseStatusString = "啟用";
break;
}
return caseStatusString;
}
}
package ecom.android.newparkapp.converter;
import androidx.room.ProvidedTypeConverter;
import androidx.room.TypeConverter;
import ecom.android.newparkapp.entity.Shift;
@ProvidedTypeConverter
public class ShiftConverter {
@TypeConverter
public static Shift toShift(int value){
return Shift.values()[value];
}
@TypeConverter
public static int fromShift(Shift shift){
return shift.ordinal();
}
}
package ecom.android.newparkapp.converter;
import androidx.room.ProvidedTypeConverter;
import androidx.room.TypeConverter;
import ecom.android.newparkapp.entity.SpaceStatus;
@ProvidedTypeConverter
public class SpaceStatusConverter {
@TypeConverter
public static SpaceStatus toSpaceStatus(int value){
return SpaceStatus.values()[value];
}
@TypeConverter
public static int fromSpaceStatus(SpaceStatus spaceStatus){
return spaceStatus.ordinal();
}
}
package ecom.android.newparkapp.converter;
import static ecom.android.newparkapp.entity.Space.SpaceType.UNSET_SPACE;
import androidx.room.ProvidedTypeConverter;
import androidx.room.TypeConverter;
import ecom.android.newparkapp.entity.Space.SpaceType;
import ecom.android.newparkapp.entity.SpaceType;
@ProvidedTypeConverter
public class SpaceTypeConverter {
@TypeConverter
public static SpaceType toSpaceType(int value) {
return value > SpaceType.values().length ? UNSET_SPACE:SpaceType.values()[value];
return value > SpaceType.values().length ? SpaceType.UNSET_SPACE:SpaceType.values()[value];
}
@TypeConverter
......
package ecom.android.newparkapp.dao;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import java.util.List;
import ecom.android.newparkapp.entity.SpaceStatus;
@Dao
public interface SpaceStatusDao {
@Query("SELECT * FROM spacestatus")
List<SpaceStatus> getAll();
@Query("SELECT * FROM spacestatus")
LiveData<List< SpaceStatus>> getAllLiveData();
@Query("SELECT * FROM spacestatus WHERE id IN (:Ids)")
List<SpaceStatus> loadAllByIds(int[] Ids);
@Query("SELECT * FROM spacestatus WHERE name LIKE :first LIMIT 1")
SpaceStatus findByName(String first);
@Insert
void insertAll(SpaceStatus... spaceStatuses);
@Delete
void delete(SpaceStatus spaceStatus);
@Query("DELETE FROM spacestatus")
void deleteAll();
}
......@@ -8,13 +8,15 @@ import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.converter.CaseStatusConverter;
import ecom.android.newparkapp.converter.ShiftConverter;
import ecom.android.newparkapp.converter.SpaceStatusConverter;
import ecom.android.newparkapp.converter.SpaceTypeConverter;
import ecom.android.newparkapp.dao.CaseDao;
import ecom.android.newparkapp.dao.CasePhotoDao;
import ecom.android.newparkapp.dao.RoadDao;
import ecom.android.newparkapp.dao.SpaceDao;
import ecom.android.newparkapp.dao.SpaceRateDao;
import ecom.android.newparkapp.dao.SpaceStatusDao;
import ecom.android.newparkapp.dao.UserDao;
import ecom.android.newparkapp.dao.UserPermissionDao;
import ecom.android.newparkapp.dao.VehicleBrandDao;
......@@ -26,7 +28,6 @@ import ecom.android.newparkapp.converter.LocationConverter;
import ecom.android.newparkapp.entity.Road;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.SpaceRate;
import ecom.android.newparkapp.entity.SpaceStatus;
import ecom.android.newparkapp.converter.TimestampConverter;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.UserPermission;
......@@ -35,16 +36,15 @@ import ecom.android.newparkapp.entity.VehicleColor;
import ecom.android.newparkapp.entity.VehicleType;
// DataBase 一個資料庫一個,並涵蓋多個資料表
@Database(entities = {Case.class, CasePhoto.class, Road.class, Space.class, SpaceRate.class, SpaceStatus.class, User.class, UserPermission.class, VehicleBrand.class, VehicleColor.class, VehicleType.class},
@Database(entities = {Case.class, CasePhoto.class, Road.class, Space.class, SpaceRate.class, User.class, UserPermission.class, VehicleBrand.class, VehicleColor.class, VehicleType.class},
version = 1)
@TypeConverters({LocationConverter.class, TimestampConverter.class, SpaceTypeConverter.class})
@TypeConverters({LocationConverter.class, TimestampConverter.class, SpaceTypeConverter.class, SpaceStatusConverter.class, CaseStatusConverter.class, ShiftConverter.class})
public abstract class InfoDatabase extends RoomDatabase {
public abstract CaseDao caseDao();
public abstract CasePhotoDao casePhotoDao();
public abstract RoadDao roadDao();
public abstract SpaceDao spaceDao();
public abstract SpaceRateDao spaceRateDao();
public abstract SpaceStatusDao spaceStatusDao();
public abstract UserDao userDao();
public abstract VehicleBrandDao vehicleBrandDao();
public abstract VehicleColorDao vehicleColorDao();
......
......@@ -4,6 +4,7 @@ import android.bluetooth.BluetoothDevice;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Build;
import android.os.Environment;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
......@@ -21,6 +22,8 @@ import java.util.Date;
import java.util.Locale;
import java.util.Objects;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.printer.CarPrinter_TPB250;
import ecom.android.newparkapp.printer.IBluetoothPrinter;
......@@ -65,9 +68,6 @@ public class Case {
@ColumnInfo(name = "location")
public Location location; // gps 座標
@ColumnInfo(name = "bill_status")
public int billStatus;
@ColumnInfo(name = "photo_count")
public int photoCount;
......@@ -83,8 +83,11 @@ public class Case {
@ColumnInfo(name = "agency")
public int agency;
@ColumnInfo(name = "shift_id")
public String shiftId; // 早班或晚班
@ColumnInfo(name = "shift")
public Shift shift; // 早班或晚班
@ColumnInfo(name = "case_status")
public CaseStatus caseStatus; // 案件狀態
@Ignore
public String datePath;
......@@ -98,10 +101,7 @@ public class Case {
@Ignore
public String uploadPath;
@Ignore
public CaseStatus caseStatus;
public Case(String billingNumber2, String billingNumber1, User user, Date terminateDate, Date caseTime, Space space, String plateNumber, VehicleType vehicleType, VehicleColor vehicleColor, VehicleBrand vehicleBrand, float periodHour, int finalExpenses, Location location, int billStatus, int photoCount, Date updateDate, Date finalTime, Boolean autoPay, int agency, String shiftId) {
public Case(String billingNumber2, String billingNumber1, User user, Date terminateDate, Date caseTime, Space space, String plateNumber, VehicleType vehicleType, VehicleColor vehicleColor, VehicleBrand vehicleBrand, float periodHour, int finalExpenses, Location location, int photoCount, Date updateDate, Date finalTime, Boolean autoPay, int agency, Shift shift, CaseStatus caseStatus) {
this.billingNumber2 = billingNumber2;
this.billingNumber1 = billingNumber1;
this.user = user;
......@@ -115,13 +115,13 @@ public class Case {
this.periodHour = periodHour;
this.finalExpenses = finalExpenses;
this.location = location;
this.billStatus = billStatus;
this.photoCount = photoCount;
this.updateDate = updateDate;
this.finalTime = finalTime;
this.autoPay = autoPay;
this.agency = agency;
this.shiftId = shiftId;
this.shift = shift;
this.caseStatus = caseStatus;
}
public Case(){
......@@ -132,14 +132,49 @@ public class Case {
* @return A 或 B
*/
public String getShift(){
// TODO: 2022/7/29 資料庫新增早晚班參照後,取消該方法
return "A";
// 2022/7/29 資料庫新增早晚班參照後,取消該方法
String shiftLabel = "";
switch (this.shift){
case MORNING:
shiftLabel = "A";
break;
case AFTERNOON:
shiftLabel = "B";
break;
default:
break;
}
return shiftLabel;
}
public String getUploadFileName() {
return billingNumber2 + ".txt";
}
public String getDatePath(String sysData_path) {
Calendar caseCalendar = Calendar.getInstance();
caseCalendar.setTime(this.caseTime);
return Environment.getExternalStorageDirectory() + sysData_path + Common.getDate(caseCalendar, false);
}
public String getUserDateFileName() {
Calendar caseCalendar = Calendar.getInstance();
caseCalendar.setTime(this.caseTime);
fileNameBackup = "/" + getShift();//[A]早/晚
fileNameBackup += getUserIDString() + "-";//[85]使用者代號 [-]
fileNameBackup += Common.getDate(caseCalendar, false);//[20200114]日期
userDateFileName = fileNameBackup + ".txt";//[A][85][-][20200114][.txt]
return userDateFileName;
}
public String getUserIDString(){
return String.format("%02d", this.user.id);
}
public String getUploadPath(String sysDataUpload_path) {
return Environment.getExternalStorageDirectory() + sysDataUpload_path;
}
/**
* 交換用檔案,串連各項資訊獲得
* @return 交換用檔案字串 A999;99B17V00189;20220817;10:43;A 中山路A;A216 2 1 中山路A;01 自小客;8052-LZ; ; ;0.5;25;Lat:24.1434911 Lon:120.7285887;1;1;
......@@ -151,7 +186,7 @@ public class Case {
DateFormat caseTimeFormat = new SimpleDateFormat("HH:mm");
String caseTimeString = caseTimeFormat.format(caseTime); // 10:43
// TODO: 2022/7/29 加入GPS座標功能後,修改該處假資料
// 2022/7/29 加入GPS座標功能後,修改該處假資料
String locationString = String.format("Lat:%f Lon:%f", location.getLatitude(), location.getLongitude()); // Lat:24.1434911 Lon:120.7285887
......@@ -169,10 +204,23 @@ public class Case {
periodHour,
finalExpenses,
locationString,
billStatus,
getBillStatus(),
photoCount);
}
/**
* 透過 CaseStatus 轉換成 billStatus 交換用String
* @return 註銷或啟用狀態
*/
public String getBillStatus(){
// billStatus 0 -> 撤銷 , 1 -> 啟用
String billStatus = "1";
if (this.caseStatus == CaseStatus.LOCK){
billStatus = "0";
}
return billStatus;
}
public Calendar getCaseCalendar() {
Calendar calendar = Calendar.getInstance();
calendar.setTime(this.caseTime);
......@@ -221,7 +269,11 @@ public class Case {
* @return 是否為早班
*/
private boolean isMorningShift(){
return true;
boolean isMorningShift = true;
if (this.shift == Shift.AFTERNOON){
isMorningShift = false;
}
return isMorningShift;
}
/**
......@@ -245,4 +297,5 @@ public class Case {
// TODO: 2022/8/3 加入 CarPrinter_LK-P34L 印表機功能
return printer;
}
}
package ecom.android.newparkapp.entity;
public enum CaseStatus {
import android.os.Parcel;
import android.os.Parcelable;
public enum CaseStatus implements Parcelable {
NEW, //尚未儲存之新案件
LIST, //已儲存之案件
CHANGED, //已儲存但有異動過之案件
LOCK //註銷之案件
LOCK; //註銷之案件
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<CaseStatus> CREATOR = new Creator<CaseStatus>() {
@Override
public CaseStatus createFromParcel(Parcel in) {
return CaseStatus.values()[in.readInt()];
}
@Override
public CaseStatus[] newArray(int size) {
return new CaseStatus[size];
}
};
}
package ecom.android.newparkapp.entity;
import android.os.Parcel;
import android.os.Parcelable;
/**
* 班別
*/
public enum Shift implements Parcelable {
MORNING, // 早班 08:00 ~ 16:30
AFTERNOON; // 午班 13:30 ~ 22:00
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<Shift> CREATOR = new Creator<Shift>() {
@Override
public Shift createFromParcel(Parcel in) {
return Shift.values()[in.readInt()];
}
@Override
public Shift[] newArray(int size) {
return new Shift[size];
}
};
}
......@@ -35,7 +35,7 @@ public class Space implements Parcelable {
@ColumnInfo(name = "longitude")
public float longitude;
@Embedded(prefix = "space_status_")
@ColumnInfo(name = "space_status")
public SpaceStatus spaceStatus;
public Space(String id, Road road, SpaceType spaceType, int fee, SpaceRate spaceRate, float latitude, float longitude, SpaceStatus spaceStatus) {
......@@ -52,6 +52,7 @@ public class Space implements Parcelable {
protected Space(Parcel in) {
id = in.readString();
road = in.readParcelable(Road.class.getClassLoader());
spaceType = in.readParcelable(SpaceType.class.getClassLoader());
fee = in.readInt();
spaceRate = in.readParcelable(SpaceRate.class.getClassLoader());
latitude = in.readFloat();
......@@ -63,6 +64,7 @@ public class Space implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeParcelable(road, flags);
dest.writeParcelable(spaceType, flags);
dest.writeInt(fee);
dest.writeParcelable(spaceRate, flags);
dest.writeFloat(latitude);
......@@ -88,7 +90,16 @@ public class Space implements Parcelable {
};
public String getCombineInfo() {
return String.format("%s %s %s %s", id, spaceRate.id, spaceType, road.name);
// TODO: 2022/8/4 停車格類型 轉換 成文字檔
// 文字檔 舊的格式 0 -> 未啟用 1 -> 啟用 3 -> 殘障車位
int spaceTypeString = 0;
if (this.spaceType == SpaceType.HANDICAPPED_SPACE){
spaceTypeString = 3;
}else {
spaceTypeString = this.spaceStatus == SpaceStatus.ENABLE ? 1 : 0;
}
return String.format("%s %s %s %s", id, spaceRate.id, spaceTypeString, road.name);
}
/**
......@@ -99,13 +110,5 @@ public class Space implements Parcelable {
public int getAddMinutes() {
return (int)(60 * this.spaceRate.perHours);
}
public enum SpaceType {
UNSET_SPACE,
MOTO_SPACE,
VEHICLE_SPACE,
HANDICAPPED_SPACE,
FRIENDLY_SPACE
}
}
......@@ -3,32 +3,13 @@ package ecom.android.newparkapp.entity;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class SpaceStatus implements Parcelable {
@PrimaryKey
public int id;
@ColumnInfo(name = "name")
public String name;
public SpaceStatus(int id, String name) {
this.id = id;
this.name = name;
}
protected SpaceStatus(Parcel in) {
id = in.readInt();
name = in.readString();
}
public enum SpaceStatus implements Parcelable {
DISABLE,
ENABLE;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeInt(ordinal());
}
@Override
......@@ -39,7 +20,7 @@ public class SpaceStatus implements Parcelable {
public static final Creator<SpaceStatus> CREATOR = new Creator<SpaceStatus>() {
@Override
public SpaceStatus createFromParcel(Parcel in) {
return new SpaceStatus(in);
return SpaceStatus.values()[in.readInt()];
}
@Override
......
package ecom.android.newparkapp.entity;
import android.os.Parcel;
import android.os.Parcelable;
public enum SpaceType implements Parcelable {
UNSET_SPACE,
MOTO_SPACE,
VEHICLE_SPACE,
HANDICAPPED_SPACE,
FRIENDLY_SPACE;
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(ordinal());
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<SpaceType> CREATOR = new Creator<SpaceType>() {
@Override
public SpaceType createFromParcel(Parcel in) {
return SpaceType.values()[in.readInt()];
}
@Override
public SpaceType[] newArray(int size) {
return new SpaceType[size];
}
};
}
......@@ -26,7 +26,6 @@ public class User implements Parcelable {
@Embedded(prefix = "user_permission_")
public UserPermission userPermission;
public User(int id, String name, String account, String password, UserPermission userPermission) {
this.id = id;
this.name = name;
......
......@@ -5,7 +5,6 @@ import static ecom.android.newparkapp.BlueToothComm.PrintBarCode;
import static ecom.android.newparkapp.BlueToothComm.PrintChangeLine;
import static ecom.android.newparkapp.BlueToothComm.PrintString;
import static ecom.android.newparkapp.BlueToothComm.ToBlackMark;
import static ecom.android.newparkapp.entity.Space.SpaceType.HANDICAPPED_SPACE;
import static ecom.android.newparkapp.printer.IBluetoothPrinter.ResultCode.NOT_CONNECT;
import static ecom.android.newparkapp.printer.IBluetoothPrinter.ResultCode.PRINT_SUCCESS;
......@@ -18,6 +17,7 @@ import java.util.Locale;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.SpaceType;
/**
* 2021年新型印表機
......@@ -89,7 +89,7 @@ public class CarPrinter_TPB250 implements IBluetoothPrinter {
String.format(Locale.TAIWAN, " %02d:%02d %5d %s", nHour, nowCalendar.get(Calendar.MINUTE), carCase.getPricing(), carCase.user.name) :
String.format(Locale.TAIWAN, " %02d:%02d %5s %s", nHour + (b60Min ? 1 : 0), b60Min ? 0 : (nowCalendar.get(Calendar.MINUTE) + 1), " ", "________");
if (carCase.space.spaceType == HANDICAPPED_SPACE) {//身障車格
if (carCase.space.spaceType == SpaceType.HANDICAPPED_SPACE) {//身障車格
if (carCase.vehicleType.id == 12) {//身心障礙(府-2)
if (i == 0) {
szList = String.format(Locale.TAIWAN, " %02d:%02d %5d %s",
......
......@@ -11,7 +11,6 @@ import ecom.android.newparkapp.dao.CasePhotoDao;
import ecom.android.newparkapp.dao.RoadDao;
import ecom.android.newparkapp.dao.SpaceDao;
import ecom.android.newparkapp.dao.SpaceRateDao;
import ecom.android.newparkapp.dao.SpaceStatusDao;
import ecom.android.newparkapp.dao.UserDao;
import ecom.android.newparkapp.dao.UserPermissionDao;
import ecom.android.newparkapp.dao.VehicleBrandDao;
......@@ -31,7 +30,6 @@ public class InfoRepository {
public UserDao userDao;
public UserPermissionDao userPermissionDao;
public SpaceStatusDao spaceStatusDao;
public SpaceRateDao spaceRateDao;
public RoadDao roadDao;
public SpaceDao spaceDao;
......@@ -48,7 +46,6 @@ public class InfoRepository {
userDao = infoDatabase.userDao();
userPermissionDao = infoDatabase.userPermissionDao();
spaceStatusDao = infoDatabase.spaceStatusDao();
spaceRateDao = infoDatabase.spaceRateDao();
roadDao = infoDatabase.roadDao();
spaceDao = infoDatabase.spaceDao();
......
......@@ -9,6 +9,7 @@ import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.icu.util.BuddhistCalendar;
import android.os.Bundle;
import android.widget.Toast;
......@@ -24,6 +25,7 @@ import java.util.Map;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.databinding.ActivityMainBinding;
import ecom.android.newparkapp.entity.Shift;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.viewModel.T01SettingViewModel;
......@@ -151,13 +153,13 @@ public class MainActivity extends AppCompatActivity {
* 所有事件註冊及綁定
*/
private void eventBinding(){
dataBinding.btnStartMorning.setOnClickListener(view -> btnStartOnClicked() );
dataBinding.btnStartAfternoon.setOnClickListener(view -> btnStartOnClicked() );
dataBinding.btnStartMorning.setOnClickListener(view -> btnStartOnClicked(Shift.MORNING) );
dataBinding.btnStartAfternoon.setOnClickListener(view -> btnStartOnClicked(Shift.AFTERNOON) );
dataBinding.btnGoSetting.setOnClickListener(view -> {btnGoSettingOnClicked();});
}
private void btnStartOnClicked(){
private void btnStartOnClicked(Shift shift){
if (t01SettingViewModel.getCurrentUser() == null || t01SettingViewModel.getCurrentUser().id == 999){
Toast.makeText(this,"請先設定使用者",Toast.LENGTH_LONG).show();
return;
......@@ -165,7 +167,11 @@ public class MainActivity extends AppCompatActivity {
Intent intent = new Intent();
intent.setClass(this, T02StartActivity.class);
intent.putExtra("CurrentUser", t01SettingViewModel.getCurrentUser());
Bundle bundle = new Bundle();
bundle.putParcelable("CurrentUser", t01SettingViewModel.getCurrentUser());
bundle.putParcelable("Shift", shift);
intent.putExtras(bundle);
startActivity(intent);
}
......
......@@ -41,6 +41,7 @@ import ecom.android.newparkapp.databinding.AlertDialogT03CumulativeTimeBinding;
import ecom.android.newparkapp.databinding.AlertDialogProgressBarBinding;
import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CaseStatus;
import ecom.android.newparkapp.entity.Shift;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleType;
......@@ -75,6 +76,7 @@ public class T02StartActivity extends AppCompatActivity {
private ActivityResultLauncher requestBluetooth;
private User currentUser;
private Shift shift;
private File photoFile;
private AlertDialog alertDialogProgress;
......@@ -93,10 +95,12 @@ public class T02StartActivity extends AppCompatActivity {
blueToothViewModel = viewModelProvider.get(BlueToothViewModel.class);
currentUser = t01SettingViewModel.getCurrentUser();
if (currentUser == null) {
shift = getIntent().getParcelableExtra("Shift");
if (currentUser == null || shift == null) {
finish();
}
t02StartViewModel.setCurrentUser(currentUser);
t02StartViewModel.setShift(shift);
t02StartViewModel.initCurrentCase();
dataBinding.setT02StartViewModel(t02StartViewModel);
......@@ -110,7 +114,6 @@ public class T02StartActivity extends AppCompatActivity {
hasPermissions.setValue(false);
initBlueTooth();
// progress alert dialog init
initAlertDialogProgress();
......@@ -421,8 +424,20 @@ public class T02StartActivity extends AppCompatActivity {
});
// 註銷
if (tempCase.caseStatus == CaseStatus.LOCK){
t03CumulativeTimeDataBinding.diaOffButton.setTextColor(getColor(R.color.black));
t03CumulativeTimeDataBinding.diaOffButton.setText("恢復本單");
}else {
t03CumulativeTimeDataBinding.diaOffButton.setTextColor(getColor(R.color.red));
t03CumulativeTimeDataBinding.diaOffButton.setText("註銷本單");
}
t03CumulativeTimeDataBinding.diaOffButton.setOnClickListener(view -> {
if (tempCase.caseStatus == CaseStatus.LOCK){
t02StartViewModel.enableCurrentCase();
}else {
t02StartViewModel.disableCurrentCase();
}
tempDialog.dismiss();
});
// 累加確認
......@@ -466,7 +481,7 @@ public class T02StartActivity extends AppCompatActivity {
}
if (!blueToothViewModel.getBluetoothAdapter().isEnabled()) {
// TODO: 2022/8/3 Android 12 以上的版本 需額外請求藍芽權限
// 2022/8/3 Android 12 以上的版本 需額外請求藍芽權限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
requestMultiplePermissions.launch(bluetoothPermissions);
}else {
......
......@@ -19,9 +19,10 @@ import java.util.List;
import ecom.android.newparkapp.Common;
import ecom.android.newparkapp.R;
import ecom.android.newparkapp.converter.SpaceStatusConverter;
import ecom.android.newparkapp.entity.Road;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.Space.SpaceType;
import ecom.android.newparkapp.entity.SpaceType;
import ecom.android.newparkapp.entity.SpaceRate;
import ecom.android.newparkapp.entity.SpaceStatus;
import ecom.android.newparkapp.entity.User;
......@@ -202,24 +203,6 @@ public class T01ImportDbViewModel extends AndroidViewModel {
}
});
break;
case SpaceStatus:
infoRepository.executorService.execute(()->{
infoRepository.spaceStatusDao.deleteAll();
for (int i = 0; i < lines.length; i++){
String[] columnString = lines[i].trim().split("[ ]");
int newId;
if (columnString.length != 2){ break; }
try {
newId = Integer.parseInt(columnString[0]);
}catch (NumberFormatException exception){
break;
}
String newName = columnString[1];
SpaceStatus newSpaceStatus = new SpaceStatus(newId, newName);
infoRepository.spaceStatusDao.insertAll(newSpaceStatus);
}
});
break;
case Road:
infoRepository.executorService.execute(()->{
infoRepository.roadDao.deleteAll();
......@@ -264,9 +247,7 @@ public class T01ImportDbViewModel extends AndroidViewModel {
SpaceType newSpaceType = toSpaceType(spaceTypeId);
List<SpaceStatus> spaceStatusList = infoRepository.spaceStatusDao.loadAllByIds(new int[]{spaceStatusId});
if (spaceStatusList.size() == 0){break;}
SpaceStatus newSpaceStatus = spaceStatusList.get(0);
SpaceStatus newSpaceStatus = SpaceStatusConverter.toSpaceStatus(spaceStatusId);
Space newSpace = new Space(newId, newRoad, newSpaceType, fee, newSpaceRate, latitude, longitude, newSpaceStatus);
infoRepository.spaceDao.insertAll(newSpace);
......@@ -281,6 +262,6 @@ public class T01ImportDbViewModel extends AndroidViewModel {
}
public enum DBTableName {
UserPermission,User, VehicleBrand, VehicleColor, VehicleType,SpaceRate, SpaceStatus,Road,Space
UserPermission,User, VehicleBrand, VehicleColor, VehicleType,SpaceRate,Road,Space
}
}
\ No newline at end of file
......@@ -25,6 +25,7 @@ import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.CasePhoto;
import ecom.android.newparkapp.entity.CaseStatus;
import ecom.android.newparkapp.entity.Road;
import ecom.android.newparkapp.entity.Shift;
import ecom.android.newparkapp.entity.Space;
import ecom.android.newparkapp.entity.User;
import ecom.android.newparkapp.entity.VehicleType;
......@@ -43,6 +44,7 @@ public class T02StartViewModel extends AndroidViewModel {
private InfoRepository infoRepository;
private MutableLiveData<User> currentUser = new MutableLiveData<>();
private MutableLiveData<Shift> shift = new MutableLiveData<>();
private List<CasePhoto> tempCasePhoto = new ArrayList<>();
public T02StartViewModel(@NonNull Application application) {
......@@ -127,9 +129,22 @@ public class T02StartViewModel extends AndroidViewModel {
public void setPlateNumber(String plateNumber) {
Case tempCase = currentCase.getValue();
tempCase.plateNumber = plateNumber;
// TODO: 2022/8/4 檢查自動扣款
tempCase.autoPay = checkAutoPay(plateNumber);
currentCase.setValue(tempCase);
}
/**
* @param plateNumber 車牌號碼
* @return 是否有自動扣款
*/
private boolean checkAutoPay(String plateNumber){
boolean autoPay = false;
return autoPay;
}
public void initCurrentCase(){
// 清空佔存
tempCasePhoto.clear();
......@@ -142,6 +157,7 @@ public class T02StartViewModel extends AndroidViewModel {
newCase.user = currentUser.getValue();
newCase.caseTime = Calendar.getInstance().getTime();
newCase.finalTime = Calendar.getInstance().getTime();
newCase.shift = shift.getValue();
generateBillingNumber(newCase);
return newCase;
......@@ -177,7 +193,6 @@ public class T02StartViewModel extends AndroidViewModel {
});
break;
case LIST:
// 跳至新單
currentCase.postValue(newCase());
caseCursor.postValue(caseCursor.getValue() + 1);
break;
......@@ -195,8 +210,8 @@ public class T02StartViewModel extends AndroidViewModel {
// 更新併檔用文字檔
// TODO: 2022/8/1 更新併檔用文字檔
//Common.updateTXT(getApplication(), tempCase.datePath + tempCase.userDateFileName, tempCase.billingNumber2, tempCase.getDetailString());
//Common.writeTXT(getApplication(), tempCase.uploadPath, tempCase.getUploadFileName(), tempCase.getDetailString());
Common.updateTXT(getApplication(), tempCase.getDatePath(getApplication().getString(R.string.sysData_path)) + tempCase.getUserDateFileName(), tempCase.billingNumber2, tempCase.getDetailString());
Common.writeTXT(getApplication(), tempCase.getUploadPath(getApplication().getString(R.string.sysDataUpload_path)), tempCase.getUploadFileName(), tempCase.getDetailString());
// TODO: 2022/8/1 判斷 是否 為 註銷
tempCase.caseStatus = CaseStatus.LIST; //saveBills
......@@ -204,10 +219,26 @@ public class T02StartViewModel extends AndroidViewModel {
// 更新當前list結果
cases.set(caseCursor.getValue(), tempCase);
});
break;
case LOCK:
// 更新資料
infoRepository.executorService.execute(()->{
// 更新 Case
infoRepository.caseDao.update(tempCase);
// 新增車牌辨識結果
for (int i = 0 ; i < tempCasePhoto.size(); i++){
infoRepository.casePhotoDao.insertAll(tempCasePhoto.get(i));
}
tempCasePhoto.clear();
// 更新併檔用文字檔
Common.updateTXT(getApplication(), tempCase.getDatePath(getApplication().getString(R.string.sysData_path)) + tempCase.getUserDateFileName(), tempCase.billingNumber2, tempCase.getDetailString());
Common.writeTXT(getApplication(), tempCase.getUploadPath(getApplication().getString(R.string.sysDataUpload_path)), tempCase.getUploadFileName(), tempCase.getDetailString());
// 更新當前list結果
cases.set(caseCursor.getValue(), tempCase);
});
break;
default:
break;
......@@ -459,4 +490,33 @@ public class T02StartViewModel extends AndroidViewModel {
tempCase.location = location;
currentCase.setValue(tempCase);
}
/**
* 設置選定班表
* @param shift 班表
*/
public void setShift(Shift shift) {
this.shift.setValue(shift);
}
/**
* 註銷當前的案件
*/
public void disableCurrentCase() {
Case tempCase = currentCase.getValue();
if (tempCase.caseStatus != CaseStatus.LOCK){
tempCase.caseStatus = CaseStatus.LOCK;
currentCase.setValue(tempCase);
saveCurrentCase();
}
}
public void enableCurrentCase() {
Case tempCase = currentCase.getValue();
if (tempCase.caseStatus == CaseStatus.LOCK){
tempCase.caseStatus = CaseStatus.CHANGED;
currentCase.setValue(tempCase);
saveCurrentCase();
}
}
}
......@@ -8,6 +8,7 @@
<import type="ecom.android.newparkapp.entity.Road"/>
<import type="ecom.android.newparkapp.entity.SpaceStatus"/>
<import type="ecom.android.newparkapp.entity.SpaceRate"/>
<import type="ecom.android.newparkapp.entity.CaseStatus"/>
<variable
name="t02StartViewModel"
type="ecom.android.newparkapp.viewModel.T02StartViewModel" />
......@@ -37,42 +38,43 @@ tools:layout_editor_absoluteY="25dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:orientation="horizontal"
android:layout_marginTop="5dp"
>
<TextView
android:id="@+id/textView23"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_weight="0.6"
android:paddingStart="3dp"
android:text="印表機"
android:textAlignment="center"
android:textSize="20sp" />
android:textSize="21sp" />
<TextView
android:id="@+id/textView21"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_weight="0.95"
android:text="@{blueToothViewModel.bluetoothDevice.name}"
android:textAlignment="center"
android:textSize="20sp" />
<TextView
android:id="@+id/textView24"
android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:layout_weight="0.95"
android:textAlignment="center"
android:textColor="#8BC34A"
android:textSize="20sp"
app:blueToothStatus2String="@{blueToothViewModel.blueToothStatus}"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
......@@ -122,7 +124,8 @@ tools:layout_editor_absoluteY="25dp">
android:layout_weight="0.47"
android:gravity="center"
android:textSize="21sp"
android:text="@{t02StartViewModel.currentCase.billingNumber2}"/>
android:text="@{(t02StartViewModel.currentCase.caseStatus == CaseStatus.LOCK ? `[註]` : ``) + t02StartViewModel.currentCase.billingNumber2}"
app:caseStatus2Color= "@{t02StartViewModel.currentCase.caseStatus}"/>
<Button
android:id="@+id/btn_start_back"
......
......@@ -79,5 +79,5 @@
<string name="hello_first_fragment">Hello first fragment</string>
<string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
<string name="current_user">當前使用者: %s</string>
<string name="current_user">當前使用者:\n %s</string>
</resources>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment