app/build.gradle
@@ -7,11 +7,16 @@ defaultConfig { applicationId "com.dayu.recharge" minSdk 23 targetSdk 33 targetSdk 26 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" ndk{ abiFilters 'armeabi-v7a' } } buildTypes { @@ -33,7 +38,9 @@ // } // } } //ps:dycz@2023 //alias:dayu //ps:dycz@2023 dependencies { implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:28.0.0' app/dycz.jksBinary files differ
app/libs/oaid_sdk_1.0.25.aarBinary files differ
app/src/main/AndroidManifest.xml
@@ -44,7 +44,10 @@ <activity android:name=".activity.LoginActivity" 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=".activity.AdminSetupActivity" @@ -55,16 +58,13 @@ <activity android:name=".activity.HomeActivity" 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=".activity.NewCardActivity" android:exported="true" android:screenOrientation="portrait" android:launchMode="singleTop"> android:launchMode="singleTop" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED" /> <data android:mimeType="text/plain" /> @@ -103,8 +103,10 @@ <activity android:name=".activity.SysIpActivity" /> <activity android:name=".activity.ParameterActivity" /> <activity android:name=".activity.PowerActivity" /> <activity android:name=".activity.DomainActivity"/> <activity android:name=".activity.ElectricPriceActivity"/> <activity android:name=".activity.DomainActivity" /> <activity android:name=".activity.ElectricPriceActivity" /> <activity android:name=".activity.IdentifyingActivity" /> <activity android:name=".activity.ReplacementActivity"/> <meta-data app/src/main/java/com/dayu/recharge/MyApplication.java
@@ -7,6 +7,7 @@ import android.util.Log; import com.dayu.recharge.dao.BaseDaoSingleton; import com.dayu.recharge.dbBean.DeviceNumber; import com.dayu.recharge.dbBean.IpBean; import com.easysocket.EasySocket; import com.easysocket.config.EasySocketOptions; @@ -175,8 +176,16 @@ //BCD码00成功01失败(注册号不是服务器返回信息) if (state.equalsIgnoreCase("00")) { //保存设备注册号 BaseDaoSingleton.getInstance(MyApplication.myApplication).ipDao().findFirst(); WSHelper.getInstance(MyApplication.this).put("initCode", initCode); DeviceNumber deviceNumber = BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().findFirst(); if (deviceNumber != null) { deviceNumber.setDeviceRegistrationNumber(initCode); } else { deviceNumber = new DeviceNumber(); deviceNumber.setDeviceRegistrationNumber(initCode); } BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().insert(deviceNumber); // WSHelper.getInstance(MyApplication.this).put("initCode", initCode); ToastUtil.show(MyApplication.this, "充值管理注册报文获取成功"); } else { //校验CRC错误 app/src/main/java/com/dayu/recharge/activity/AdminSetupActivity.java
@@ -1,6 +1,7 @@ package com.dayu.recharge.activity; import android.content.Context; import android.os.Build; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; @@ -16,6 +17,9 @@ import com.example.pickerviewlibrary.picker.entity.PickerData; import com.example.pickerviewlibrary.picker.listener.OnPickerClickListener; import com.tencent.bugly.crashreport.CrashReport; import java.lang.reflect.Method; import java.util.zip.CRC32; /** * Copyright (C), 2023, @@ -107,6 +111,8 @@ adminBinding.adminPhone.setText(adminData.getPhone()); adminBinding.adminName.setText(adminData.getName()); adminBinding.adminAddress.setText(adminData.getSheng() + adminData.getShi() + adminData.getXian() + adminData.getZhen() + adminData.getCun()); } else { adminBinding.adminSerial.setText("12" + generateUniqueNumber(getSN())); } } catch (Exception e) { @@ -155,5 +161,52 @@ } } public static String getSN() { String serial = null; try { Class<?> c = Class.forName("android.os.SystemProperties"); Method get = c.getMethod("get", String.class); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { try { serial = (String) get.invoke(c, "ro.sunmi.serial"); } catch (Exception e) { e.printStackTrace(); } return serial; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { serial = Build.getSerial(); return serial; } else { //安卓8以下使用Build.SERIAL相同方式 //return Build.SERIAL; try { serial = (String) get.invoke(c, "ro.serialno"); } catch (Exception e) { e.printStackTrace(); } return serial; } } catch (ClassNotFoundException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } } public static String generateUniqueNumber(String input) { try { // 使用CRC32哈希函数 CRC32 crc32 = new CRC32(); crc32.update(input.getBytes()); long crcValue = crc32.getValue(); // 将哈希值映射到6位数字的范围 long sixDigitNumber = Math.abs(crcValue) % 1000000; // 格式化为6位数字的字符串 return String.format("%06d", sixDigitNumber); } catch (Exception e) { e.printStackTrace(); return null; } } } app/src/main/java/com/dayu/recharge/activity/DomainActivity.java
@@ -66,9 +66,10 @@ if (domainBean != null) { binding.domainOldTV.setText("序号:" + domainBean.getDomainNumber() + "\n" + "域名:" + domainBean.getDomain() + "\n" + "端口号:" + domainBean.getPort()); } else { domainBean = new DomainBean(); binding.domainOldTV.setText("请设置新的域名卡信息"); } domainBean = new DomainBean(); } } app/src/main/java/com/dayu/recharge/activity/HomeActivity.java
@@ -1,5 +1,6 @@ package com.dayu.recharge.activity; import android.Manifest; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; @@ -8,6 +9,7 @@ import com.dayu.recharge.databinding.ActivityHomeBinding; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.utils.ToastUtil; import com.permissionx.guolindev.PermissionX; /** @@ -27,6 +29,23 @@ homeBinding = ActivityHomeBinding.inflate(LayoutInflater.from(this)); setContentView(homeBinding.getRoot()); initView(); getPermission(); } private void getPermission() { PermissionX.init(HomeActivity.this).permissions(Manifest.permission.READ_PHONE_STATE) .onExplainRequestReason((scope, deniedList) -> { // val message = "PermissionX需要您同意以下权限才能正常使用" }) .request((allGranted, grantedList, deniedList) -> { if (allGranted) {//所有申请的权限都已通过 } else {//您拒绝了如下权限:$deniedList } }); } private void initView() { app/src/main/java/com/dayu/recharge/activity/IdentifyingActivity.java
New file @@ -0,0 +1,53 @@ package com.dayu.recharge.activity; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import com.dayu.recharge.databinding.ActivityIdentyfyingBinding; import com.dayu.recharge.dbBean.IdentityBean; import com.dayu.recharge.utils.ToastUtil; /** * Created by Android Studio. * author: zuo * Date: 2023-11-20 * Time: 10:21 * 备注:卡标识设置 */ public class IdentifyingActivity extends BaseActivity { ActivityIdentyfyingBinding binding; IdentityBean myIdentityBean; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding=ActivityIdentyfyingBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); IdentityBean identityBean=baseDao.identityDao().findFirst(); if (identityBean!=null){ myIdentityBean= identityBean; binding.electricOldNumber.setText(myIdentityBean.getIdentity()); }else { myIdentityBean=new IdentityBean(); binding.electricOldNumber.setText("3668F7A30119"); } binding.electricOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String data = binding.electricOldNumber.getText().toString(); if (!TextUtils.isEmpty(data)){ myIdentityBean.setIdentity(binding.electricOldNumber.getText().toString()); baseDao.identityDao().insert(myIdentityBean); ToastUtil.show("保存成功"); }else { ToastUtil.show("请输入卡标识"); } } }); } } app/src/main/java/com/dayu/recharge/activity/MyActivity.java
@@ -14,6 +14,7 @@ import com.dayu.recharge.databinding.ActivityMyBinding; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.net.SocketNet; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.ExcelUtil; import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.utils.WSHelper; @@ -55,12 +56,18 @@ } private void initView() { myBinding.cardReplacement.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startActivity(new Intent(MyActivity.this, ReplacementActivity.class)); } }); myBinding.myAdmin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // PassWordDialog passWordDialog = new PassWordDialog(MyActivity.this, new Intent(MyActivity.this, AdminSetupActivity.class)); // passWordDialog.show(); startActivity(new Intent(MyActivity.this, AdminSetupActivity.class)); PassWordDialog passWordDialog = new PassWordDialog(MyActivity.this, new Intent(MyActivity.this, AdminSetupActivity.class)); passWordDialog.show(); // startActivity(new Intent(MyActivity.this, AdminSetupActivity.class)); } }); myBinding.myPsw.setOnClickListener(new View.OnClickListener() { @@ -105,8 +112,9 @@ myBinding.sysIp.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MyActivity.this, SysIpActivity.class); startActivity(intent); PassWordDialog passWordDialog = new PassWordDialog(MyActivity.this, new Intent(MyActivity.this, SysIpActivity.class)); passWordDialog.show(); } }); } @@ -184,7 +192,8 @@ } else { msgData.append("未连接数据中心"); } String initCode = WSHelper.getInstance(this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); if (TextUtils.isEmpty(initCode)) { msgData.append(",设备未注册"); } else { app/src/main/java/com/dayu/recharge/activity/NFCWreatActivity.java
@@ -9,6 +9,7 @@ import com.dayu.recharge.MyApplication; import com.dayu.recharge.R; import com.dayu.recharge.card.CleanCard; import com.dayu.recharge.card.CleanUserCard; import com.dayu.recharge.card.ConfigurationPowerCard; @@ -20,6 +21,8 @@ import com.dayu.recharge.card.UserCard; import com.dayu.recharge.databinding.ActivityWriteTextBinding; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.dbBean.DeviceNumber; import com.dayu.recharge.dbBean.ElectricPriceBean; import com.dayu.recharge.dbBean.RechargeBean; import com.dayu.recharge.dbBean.UserCardBean; import com.dayu.recharge.net.SocketCallBack; @@ -34,6 +37,7 @@ import com.dayu.recharge.utils.AidlUtil; import com.dayu.recharge.utils.CRC8; import com.dayu.recharge.utils.DateUtil; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.MornyUtil; import com.dayu.recharge.utils.SocketUtil; import com.dayu.recharge.utils.ToastUtil; @@ -45,6 +49,12 @@ import java.util.List; import java.util.Map; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-08 21:19 * Description: nfc写卡界面 */ public class NFCWreatActivity extends BaseNfcActivity { @@ -133,33 +143,44 @@ } if (this.getIntent().hasExtra("cleanCard")) { cleanCard = (CleanCard) this.getIntent().getSerializableExtra("cleanCard"); binding.cardData.setText("制作清零卡"); } if (this.getIntent().hasExtra("manageCard")) { manageCard = (ManageCard) this.getIntent().getSerializableExtra("manageCard"); binding.cardData.setText("制作管理卡"); } if (this.getIntent().hasExtra("registeredCard")) { registeredCard = (RegisteredCard) this.getIntent().getSerializableExtra("registeredCard"); binding.cardData.setText("制作重新注册设备卡"); } if (this.getIntent().hasExtra("dbUserCard")) { userCardBean = (UserCardBean) this.getIntent().getSerializableExtra("dbUserCard"); } if (this.getIntent().hasExtra("cleanUserCard")) { cleanUserCard = (CleanUserCard) this.getIntent().getSerializableExtra("cleanUserCard"); binding.cardData.setText("制作删除全部用户卡"); } if (this.getIntent().hasExtra("domainCard")) { domainCard = (DomainCard) this.getIntent().getSerializableExtra("domainCard"); binding.cardData.setText("制作设置域名卡"); } if (this.getIntent().hasExtra("testCard")) { testCard = (TestCard) this.getIntent().getSerializableExtra("testCard"); binding.cardData.setText("制作测试卡"); } if (this.getIntent().hasExtra("configureDeviceRegistrationCrad")) { configureDeviceRegistrationCrad = (ConfigureDeviceRegistrationCrad) this.getIntent().getSerializableExtra("configureDeviceRegistrationCrad"); binding.cardData.setText("制作配置设备注册信息卡"); } if (this.getIntent().hasExtra("configurationPowerCard")) { configurationPowerCard = (ConfigurationPowerCard) this.getIntent().getSerializableExtra("configurationPowerCard"); binding.cardData.setText("制作配置水泵功率卡"); } if (this.getIntent().hasExtra("morny")) { morny = this.getIntent().getStringExtra("morny"); binding.cardData.setText("充值金额:" + morny + "元"); } morny = this.getIntent().getStringExtra("morny"); try { adminData = baseDao.adminDao().findFirst(); } catch (Exception e) { @@ -248,7 +269,7 @@ if ((configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag)) { try { if (userFlag && userCardBean != null) { baseDao.userCardDao().insert(userCardBean); ToastUtil.show(this, "注册成功"); NFCWreatActivity.this.finish(); if (NewCardActivity.newCardActivity != null) { @@ -273,6 +294,9 @@ stopAnim(); } else if (!TextUtils.isEmpty(morny)) { readAllData(intent); } else if (userCard == null && userCardBean != null) { //补卡逻辑 selectBalance(userCardBean.getInitPeasantCode()); } else { stopAnim(); ToastUtil.show(this, "参数错误"); @@ -369,7 +393,7 @@ StringBuffer data = new StringBuffer(); if (rechargeBean != null) { data.append("*****************************" + "\n"); data.append(" 农业水价综合改革充值系统\n\n"); data.append(getResources().getString(R.string.login_title) + "\n"); data.append("设备序列号:" + rechargeBean.getSerial() + "\n"); data.append("用户名:" + rechargeBean.getUserName() + "\n"); // data.append("户 号:" + rechargeBean.getUserNum() + "\n"); @@ -406,7 +430,7 @@ try { RechargeRequestBean rechargeRequestBean = new RechargeRequestBean(); rechargeRequestBean.setControl("01"); String initCode = WSHelper.getInstance(this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); rechargeRequestBean.setInitCode(initCode); rechargeRequestBean.setXuLie(SocketUtil.getXuLie(this)); rechargeRequestBean.setAFN("95"); @@ -625,6 +649,8 @@ /** * 查询余额 * * @param initPeasantCode 农户注册编号 */ private void selectBalance(String initPeasantCode) { @@ -633,7 +659,7 @@ BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean(); requestBean.setAFN("94"); requestBean.setControl("01"); String initCode = WSHelper.getInstance(this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); requestBean.setInitCode(initCode); requestBean.setInitPeasantCode(initPeasantCode); requestBean.setXuLie(SocketUtil.getXuLie(this)); @@ -648,6 +674,24 @@ stateText = new StringBuffer(); stateText.append("状 态:"); String state = BcdUtil.bcdToStr(readData.getBodyBytes()[2]); //BCD码00启用 01禁用 02隶属信息不符 03无此卡信息 04其它s if (userCard == null) { userCard = new UserCard(); userCard.setRechargeTimes(0); ElectricPriceBean electricPriceBean = baseDao.electricPriceDao().findFirst(); if (electricPriceBean != null) { userCard.setElectricityPrice(electricPriceBean.getPrice()); } else { //默认是1元 userCard.setElectricityPrice(1.000f); } userCard.setSwipeNumber((short) 0); userCard.setState("00"); userCard.setBalance(0); userCard.setAddressCode(adminData.getAddressCode()); userCard.setInitPeasantCode(initPeasantCode); } if ("00".equals(state)) { //只有启动状态才能充值 //金额 @@ -656,30 +700,42 @@ //姓名 byte[] nameByte = Arrays.copyOfRange(readData.getBodyBytes(), 7, 19); String name = SocketUtil.fromHexString(SocketUtil.bytesToHexClean0(nameByte)); rechargeBean = new RechargeBean(); rechargeBean.setDate(System.currentTimeMillis()); rechargeBean.setMorny(morny); if (userCardBean != null) { rechargeBean.setUserName(userCardBean.getUserName()); } else { rechargeBean.setUserName(name); } List<UserCardBean> userCardBeans = baseDao.userCardDao().findAll(); String userId = ""; if (userCardBeans != null) { for (int i = 0; i < userCardBeans.size(); i++) { if (initPeasantCode.equalsIgnoreCase(userCardBeans.get(i).getInitPeasantCode())) { userId = userCardBeans.get(i).getUserID(); userCard.setBalance(balance); //与socket服务器通信后进行后续操作 if (!TextUtils.isEmpty(morny)) { //充值 rechargeBean = new RechargeBean(); rechargeBean.setDate(System.currentTimeMillis()); rechargeBean.setMorny(morny); if (userCardBean != null) { rechargeBean.setUserName(userCardBean.getUserName()); } else { rechargeBean.setUserName(name); } List<UserCardBean> userCardBeans = baseDao.userCardDao().findAll(); String userId = ""; if (userCardBeans != null) { for (int i = 0; i < userCardBeans.size(); i++) { if (initPeasantCode.equalsIgnoreCase(userCardBeans.get(i).getInitPeasantCode())) { userId = userCardBeans.get(i).getUserID(); } } } rechargeBean.setSerial(adminData.getSerial()); userCard.setRechargeDate(Calendar.getInstance()); rechargeBean.setBalance(MornyUtil.changeF2Y(balance + MornyUtil.changeY2F(morny)) + ""); rechargeBean.setUserId(userId); recharge(initPeasantCode); } else { //补卡逻辑 setUser(intent, userCard); if (userFlag) { NFCWreatActivity.this.finish(); ToastUtil.show(NFCWreatActivity.this, "补卡成功"); } } rechargeBean.setSerial(adminData.getSerial()); userCard.setBalance(balance); userCard.setRechargeDate(Calendar.getInstance()); rechargeBean.setBalance(MornyUtil.changeF2Y(balance) + ""); rechargeBean.setUserId(userId); //与socket服务器通信后进行后续操作 recharge(initPeasantCode); stateText.append("启用"); return; } else if ("01".equals(state)) { app/src/main/java/com/dayu/recharge/activity/NewCardActivity.java
@@ -5,10 +5,13 @@ import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.text.InputFilter; import android.text.Spanned; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import com.dayu.recharge.utils.DeviceNumberUtils; import com.msd.ocr.idcard.LibraryInitOCR; import com.dayu.recharge.MyApplication; import com.dayu.recharge.card.UserCard; @@ -60,10 +63,11 @@ setContentView(newCardBinding.getRoot()); setData(); initView(); LibraryInitOCR.initOCR(NewCardActivity.this); // LibraryInitOCR.initOCR(NewCardActivity.this); } private void initView() { newCardBinding.newCardId.setFilters(new InputFilter[] { new AlphaNumericXFilter(),new InputFilter.LengthFilter(18) }); //身份证识别 newCardBinding.newCardScanBtn.setOnClickListener(new View.OnClickListener() { @Override @@ -191,7 +195,7 @@ */ private void initCard() { String initCode = WSHelper.getInstance(this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); if (TextUtils.isEmpty(initCode)) { ToastUtil.show(this, "设备注册号为空,请先设置IP和管理员地址"); IpBean ipBean = baseDao.ipDao().findFirst(); @@ -249,6 +253,7 @@ userCardBean.setPhone(newCardBinding.newCardPhone.getText().toString()); userCardBean.setUserID(newCardBinding.newCardId.getText().toString()); userCardBean.setDate(System.currentTimeMillis()); baseDao.userCardDao().insert(userCardBean); Intent intent = new Intent(NewCardActivity.this, NFCWreatActivity.class); intent.putExtra("userCard", userCard); intent.putExtra("dbUserCard", userCardBean); @@ -280,4 +285,19 @@ return name.matches(regex); } private static class AlphaNumericXFilter implements InputFilter { // 正则表达式定义只能输入数字和字母 "X"(大写或小写) private final String regex = "[0-9Xx]*"; @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { // 检查每个输入字符是否符合正则表达式 for (int i = start; i < end; i++) { if (!String.valueOf(source.charAt(i)).matches(regex)) { return ""; // 不符合规定的字符被过滤掉 } } return null; // 允许输入字符 } } } app/src/main/java/com/dayu/recharge/activity/NewCardListActivity.java
@@ -5,6 +5,7 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import com.dayu.recharge.adapter.NewCardAdapter; import com.dayu.recharge.databinding.ActivityNewcardListBinding; @@ -16,7 +17,10 @@ import java.util.List; /** * Created by zuoxiao on 2018/12/24. * Copyright (C), 2023, * Author: zuo * Date: 2023-11-10 19:52 * Description: 新卡注册列表界面 */ public class NewCardListActivity extends BaseActivity { @@ -48,6 +52,7 @@ } adapter = new NewCardAdapter(this, userCardBeanList); newcardListBinding.newCardListView.setAdapter(adapter); } private void setRightButton() { app/src/main/java/com/dayu/recharge/activity/ParameterActivity.java
@@ -33,7 +33,7 @@ startActivity(intent); } }); // 水泵功率设置 binding.parameterPower.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -41,6 +41,7 @@ startActivity(intent); } }); //电量单价设置 binding.parameterElectricPrice.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -48,5 +49,13 @@ startActivity(intent); } }); //卡标识设置 binding.parameterCardIdentifying.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(ParameterActivity.this, IdentifyingActivity.class); startActivity(intent); } }); } } app/src/main/java/com/dayu/recharge/activity/PassWordActivity.java
@@ -10,6 +10,12 @@ import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.utils.WSMD5; /** * Copyright (C), 2023, * Author: zuo * Date: 2023-11-10 19:52 * Description: 修改密码界面 */ public class PassWordActivity extends BaseActivity { ActivityPswBinding pswBinding; app/src/main/java/com/dayu/recharge/activity/PowerActivity.java
@@ -13,7 +13,7 @@ * Copyright (C), 2023, * Author: zuo * Date: 2023-11-08 21:19 * Description: * Description: 功率设置 */ public class PowerActivity extends BaseActivity { ActivityPowerBinding powerBinding; app/src/main/java/com/dayu/recharge/activity/ReadCardAcitivy.java
@@ -24,6 +24,7 @@ import com.dayu.recharge.tools.HexUtil; import com.dayu.recharge.tools.NfcReadHelper; import com.dayu.recharge.utils.CRC8; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.MornyUtil; import com.dayu.recharge.utils.MyCommon; import com.dayu.recharge.utils.SocketUtil; @@ -267,7 +268,7 @@ BalanceSelecteRequestBean requestBean = new BalanceSelecteRequestBean(); requestBean.setAFN("94"); requestBean.setControl("01"); String initCode = WSHelper.getInstance(this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); requestBean.setInitCode(initCode); requestBean.setInitPeasantCode(initPeasantCode); requestBean.setXuLie(SocketUtil.getXuLie(this)); app/src/main/java/com/dayu/recharge/activity/RechargeActivity.java
@@ -10,6 +10,7 @@ import android.widget.EditText; import com.dayu.recharge.databinding.ActivityRechargeBinding; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.utils.WSHelper; import com.tencent.bugly.crashreport.CrashReport; @@ -48,7 +49,7 @@ public void onClick(View v) { String morny = binding.rechargeWater.getText().toString(); if (!TextUtils.isEmpty(morny)) { String initCode = WSHelper.getInstance(RechargeActivity.this).get("initCode", ""); String initCode = DeviceNumberUtils.getDeviceNumber(); if (TextUtils.isEmpty(initCode)) { ToastUtil.show(RechargeActivity.this, "设备注册号为空,请先设置IP和管理员地址"); // return; @@ -72,7 +73,7 @@ if (s.toString().contains(".")) { if (s.length() - 1 - s.toString().indexOf(".") > 2) { s = s.toString().subSequence(0, s.toString().indexOf(".") + 2); s.toString().indexOf(".") + 3); editText.setText(s); editText.setSelection(s.length()); } app/src/main/java/com/dayu/recharge/activity/ReplacementActivity.java
New file @@ -0,0 +1,88 @@ package com.dayu.recharge.activity; import static com.dayu.recharge.view.TitleBar.ClickType_RIGHT_TEXT; import android.content.Intent; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.widget.AdapterView; import com.dayu.recharge.adapter.NewCardAdapter; import com.dayu.recharge.databinding.ActivityReplacementBinding; import com.dayu.recharge.dbBean.UserCardBean; import com.dayu.recharge.utils.ToastUtil; import com.dayu.recharge.view.EdtDialog; import java.util.List; /** * Created by Android Studio. * author: zuo * Date: 2023-11-20 * Time: 17:32 * 备注: 补卡界面 */ public class ReplacementActivity extends BaseActivity { ActivityReplacementBinding binding; List<UserCardBean> userCardBeanList; NewCardAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityReplacementBinding.inflate(LayoutInflater.from(this)); setContentView(binding.getRoot()); setRightButton(); setData(); initView(); } private void initView() { binding.newCardListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { UserCardBean userCardBean = userCardBeanList.get(position); Intent intent = new Intent(ReplacementActivity.this, NFCWreatActivity.class); intent.putExtra("dbUserCard", userCardBean); startActivity(intent); } }); } private void setData() { try { userCardBeanList = baseDao.userCardDao().findAll(); } catch (Exception e) { e.printStackTrace(); } adapter = new NewCardAdapter(this, userCardBeanList); binding.newCardListView.setAdapter(adapter); } private void setRightButton() { titleBar.setOnItemclickListner(ClickType_RIGHT_TEXT, new View.OnClickListener() { @Override public void onClick(View v) { EdtDialog edtDialog = new EdtDialog(ReplacementActivity.this, new EdtDialog.DialogBack() { @Override public void onOk(String data) { List<UserCardBean> beans = baseDao.userCardDao().findByData(data); if (beans != null && beans.size() > 0) { userCardBeanList.clear(); userCardBeanList.addAll(beans); adapter.notifyDataSetChanged(); } else { ToastUtil.show("未找到该用户"); } } @Override public void onCancel() { } }); } }); } } app/src/main/java/com/dayu/recharge/activity/SysActivity.java
@@ -1,7 +1,9 @@ package com.dayu.recharge.activity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.TelephonyManager; import android.view.LayoutInflater; import android.view.View; app/src/main/java/com/dayu/recharge/activity/SysIpActivity.java
@@ -9,6 +9,7 @@ import com.dayu.recharge.databinding.ActivityIpBinding; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.dbBean.IpBean; import com.dayu.recharge.utils.DeviceNumberUtils; import com.dayu.recharge.utils.WSHelper; /** @@ -47,10 +48,12 @@ ipBinding.ipOk.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String oldIp = WSHelper.getInstance(SysIpActivity.this).get("local_ip", ""); int oldPort = WSHelper.getInstance(SysIpActivity.this).get("local_port", 0); if (!oldIp.equals(ipBinding.ip.getText().toString()) && oldPort != Integer.valueOf(ipBinding.port.getText().toString())) { WSHelper.getInstance(SysIpActivity.this).put("initCode", ""); if (ipBean != null) { String oldIp = ipBean.getIp(); int oldPort = ipBean.getPort(); if (!oldIp.equals(ipBinding.ip.getText().toString())|| oldPort != Integer.valueOf(ipBinding.port.getText().toString())) { DeviceNumberUtils.setDeviceNumber(""); } } if (ipBean == null) { ipBean = new IpBean(); app/src/main/java/com/dayu/recharge/card/ConfigurationPowerCard.java
@@ -10,7 +10,7 @@ * Copyright (C), 2023, * Author: zuo * Date: 2023-11-08 13:26 * Description: 配置设备注册信息卡: * Description: 配置水泵功率卡: * <p> * 为方便现场更换设备时重新注册的问题,配置设备信息卡,首先刷卡,把原设备的注册号和ID号读到卡内, * 同时卡状态则00修改为FF,再新设备上刷此卡时,注册号和ID号自动写到控制器内,可以直接刷卡使用 app/src/main/java/com/dayu/recharge/dao/AppDatabase.java
@@ -4,8 +4,10 @@ import androidx.room.RoomDatabase; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.dbBean.DeviceNumber; import com.dayu.recharge.dbBean.DomainBean; import com.dayu.recharge.dbBean.ElectricPriceBean; import com.dayu.recharge.dbBean.IdentityBean; import com.dayu.recharge.dbBean.IpBean; import com.dayu.recharge.dbBean.PassWordBean; import com.dayu.recharge.dbBean.PowerBean; @@ -18,7 +20,7 @@ * Date: 2023-11-05 16:23 * Description: */ @Database(entities = {DomainBean.class,ElectricPriceBean.class, IpBean.class, AdminDataBean.class, PassWordBean.class, UserCardBean.class, RechargeBean.class, PowerBean.class}, version = 1, exportSchema = false) @Database(entities = {DeviceNumber.class,IdentityBean.class,DomainBean.class,ElectricPriceBean.class, IpBean.class, AdminDataBean.class, PassWordBean.class, UserCardBean.class, RechargeBean.class, PowerBean.class}, version = 1, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { @@ -37,4 +39,8 @@ public abstract ElectricPriceDao electricPriceDao(); public abstract DomainPortDao domainPortDao(); public abstract IdentityDao identityDao(); public abstract DeviceNumberDao deviceNumberDao(); } app/src/main/java/com/dayu/recharge/dao/DeviceNumberDao.java
@@ -1,6 +1,13 @@ package com.dayu.recharge.dao; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import com.dayu.recharge.dbBean.DeviceNumber; /** * Copyright (C), 2023, @@ -9,5 +16,16 @@ * Description:后台返回的设备码 */ @Dao interface DeviceNumberDao { public interface DeviceNumberDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(DeviceNumber deviceNumber); @Update void update(DeviceNumber IpBean); @Delete void delete(DeviceNumber IpBean); @Query("select * from DeviceNumber limit 1") DeviceNumber findFirst(); } app/src/main/java/com/dayu/recharge/dao/IdentityDao.java
New file @@ -0,0 +1,33 @@ package com.dayu.recharge.dao; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; import androidx.room.Update; import com.dayu.recharge.dbBean.IdentityBean; /** * Created by Android Studio. * author: zuo * Date: 2023-11-20 * Time: 10:42 * 备注: */ @Dao public interface IdentityDao { @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(IdentityBean identityBean); @Update void update(IdentityBean identityBean); @Delete void delete(IdentityBean identityBean); @Query("select * from IdentityBean limit 1") IdentityBean findFirst(); } app/src/main/java/com/dayu/recharge/dao/UserCardDao.java
@@ -33,4 +33,6 @@ @Query("select * from UserCardBean where date>=:beginTime and date<=:endTime") List<UserCardBean> findByTime(long beginTime, long endTime); @Query("select * from UserCardBean where userName like :data or userID like :data or phone like :data") List<UserCardBean> findByData(String data); } app/src/main/java/com/dayu/recharge/dbBean/IdentityBean.java
New file @@ -0,0 +1,34 @@ package com.dayu.recharge.dbBean; import androidx.room.Entity; import androidx.room.PrimaryKey; /** * Created by Android Studio. * author: zuo * Date: 2023-11-20 * Time: 10:35 * 备注:卡标识 */ @Entity public class IdentityBean { @PrimaryKey(autoGenerate = true) public long id; private String identity = ""; public long getId() { return id; } public void setId(long id) { this.id = id; } public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; } } app/src/main/java/com/dayu/recharge/net/SocketNet.java
@@ -7,6 +7,7 @@ import com.dayu.recharge.dao.BaseDaoSingleton; import com.dayu.recharge.dbBean.AdminDataBean; import com.dayu.recharge.dbBean.DeviceNumber; import com.dayu.recharge.dbBean.IpBean; import com.easysocket.EasySocket; import com.easysocket.entity.OriginReadData; @@ -96,8 +97,8 @@ @Override public void onSocketConnSuccess(SocketAddress socketAddress) { Log.i("SocketActionListener", "连接成功"); String initCode = WSHelper.getInstance(MyApplication.myApplication).get("initCode", ""); if (TextUtils.isEmpty(initCode) && !MyApplication.myApplication.isDoInitMachine) { DeviceNumber initCode = BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().findFirst(); if (initCode==null && !MyApplication.myApplication.isDoInitMachine) { new Handler().postDelayed(new Runnable() { @Override public void run() { app/src/main/java/com/dayu/recharge/utils/DeviceNumberUtils.java
New file @@ -0,0 +1,36 @@ package com.dayu.recharge.utils; import com.dayu.recharge.MyApplication; import com.dayu.recharge.dao.BaseDaoSingleton; import com.dayu.recharge.dbBean.DeviceNumber; /** * Created by Android Studio. * author: zuo * Date: 2023-11-20 * Time: 16:33 * 备注: 获取服务器返回的设备号的工具类 */ public class DeviceNumberUtils { public static String getDeviceNumber() { DeviceNumber deviceNumber = BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().findFirst(); if (deviceNumber != null) { return deviceNumber.getDeviceRegistrationNumber(); } else { return ""; } } public static void setDeviceNumber(String deviceRegistrationNumber) { DeviceNumber deviceNumber = BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().findFirst(); if (deviceNumber != null) { deviceNumber.setDeviceRegistrationNumber(deviceRegistrationNumber); } else { deviceNumber = new DeviceNumber(); deviceNumber.setDeviceRegistrationNumber(deviceRegistrationNumber); } BaseDaoSingleton.getInstance(MyApplication.myApplication).deviceNumberDao().insert(deviceNumber); } } app/src/main/java/com/dayu/recharge/view/EdtDialog.java
@@ -24,11 +24,19 @@ Intent intent; Context mContext; DialogBack mDialogBack; public EdtDialog(Context context, Intent intent) { super(context, R.style.ws_pay_showSelfDialog); this.intent = intent; mContext = context; initView(); } public EdtDialog(Context context, DialogBack dialogBack) { super(context, R.style.ws_pay_showSelfDialog); mContext = context; mDialogBack=dialogBack; initView(); } @@ -42,24 +50,32 @@ textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (TextUtils.isEmpty(editText.getText().toString())) { ToastUtil.show(mContext, "请输入序列号"); } else { if(Integer.valueOf(editText.getText().toString())<=16777215){ if (intent!=null){ if (TextUtils.isEmpty(editText.getText().toString())) { ToastUtil.show(mContext, "请输入序列号"); } else { if (Integer.valueOf(editText.getText().toString()) <= 16777215) { // EquipmentNumber equipmentNumber = (EquipmentNumber) intent.getSerializableExtra("equipmentNumber"); // equipmentNumber.setNumber(Integer.valueOf(editText.getText().toString())); mContext.startActivity(intent); EdtDialog.this.dismiss(); }else { ToastUtil.show(mContext, "输入的数字不能超过16777215"); } mContext.startActivity(intent); EdtDialog.this.dismiss(); } else { ToastUtil.show(mContext, "输入的数字不能超过16777215"); } } } if (mDialogBack!=null){ mDialogBack.onOk(editText.getText().toString()); } } }); cannel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mDialogBack!=null){ mDialogBack.onCancel(); } EdtDialog.this.dismiss(); } }); @@ -80,4 +96,9 @@ getWindow().setAttributes(layoutParams); } public interface DialogBack { void onOk(String data); void onCancel(); } } app/src/main/java/com/dayu/recharge/view/PassWordDialog.java
@@ -42,7 +42,7 @@ @Override public void onClick(View v) { try { if (WSMD5.getMD5Str(editText.getText().toString()).equals("8af357996269a1b52b182a839150097d")) { if (WSMD5.getMD5Str(editText.getText().toString()).equals("c4ca4238a0b923820dcc509a6f75849b")) { mContext.startActivity(intent); PassWordDialog.this.dismiss(); } else { app/src/main/res/layout/activity_admin_setup.xml
@@ -35,7 +35,7 @@ android:text="设备序列号:" android:textSize="@dimen/new_card_size" /> <EditText <TextView android:id="@+id/admin_serial" android:layout_width="match_parent" android:layout_height="wrap_content" app/src/main/res/layout/activity_domain.xml
@@ -55,6 +55,7 @@ android:layout_marginTop="20dp" android:layout_marginEnd="20dp" android:layout_marginBottom="20dp" android:maxLength="38" android:hint="请输入新的域名" android:inputType="textUri" /> app/src/main/res/layout/activity_identyfying.xml
New file @@ -0,0 +1,58 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.dayu.recharge.view.TitleBar android:id="@+id/titleBar" android:layout_width="match_parent" android:layout_height="@dimen/dimen_title_height" android:background="@drawable/title_bar_bg" app:centerText="水表脉冲设置" app:leftImage="@mipmap/icon_back" /> <LinearLayout android:id="@+id/electric_ll" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/titleBar" android:layout_margin="20dp" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="当前卡标识:" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/electric_oldNumber" android:layout_width="wrap_content" android:layout_height="match_parent" android:textSize="@dimen/text_size" /> </LinearLayout> <EditText android:id="@+id/electric_newNum" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/electric_ll" android:layout_alignParentStart="true" android:layout_margin="20dp" android:inputType="number" android:hint="请输入新的卡标识" /> <TextView android:id="@+id/electric_ok" android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="@color/title_bg" android:gravity="center" android:text="确 定" android:textSize="@dimen/text_size" /> </RelativeLayout> app/src/main/res/layout/activity_login.xml
@@ -13,7 +13,7 @@ android:layout_marginRight="20dp" android:layout_weight="1.5" android:gravity="center" android:text="农业水价综合改革智能充值管理系统" android:text="@string/login_title" android:textSize="30sp" android:textStyle="bold" /> app/src/main/res/layout/activity_my.xml
@@ -68,13 +68,12 @@ </LinearLayout> <RelativeLayout android:layout_width="match_parent" android:visibility="visible" android:layout_height="wrap_content" android:layout_marginTop="15dp"> android:layout_marginTop="15dp" android:visibility="visible"> <TextView android:id="@+id/my_newCardList_ll" @@ -118,29 +117,36 @@ </RelativeLayout> <TextView android:id="@+id/sys_ip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="IP设置" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/sys_ip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="IP设置" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/card_replacement" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="用户补卡" android:textSize="@dimen/text_size" /> <TextView android:layout_marginTop="15dp" android:id="@+id/my_psw" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="密码设置" android:textSize="@dimen/text_size" /> <TextView android:layout_marginTop="15dp" android:id="@+id/my_testConnect" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:text="未连接数据中心" android:textSize="@dimen/text_size" /> </LinearLayout> app/src/main/res/layout/activity_new_card.xml
@@ -89,7 +89,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:digits="0123456789Xx" android:inputType="numberSigned" android:inputType="text" android:maxLength="18" android:textSize="@dimen/new_card_size" /> app/src/main/res/layout/activity_parameter.xml
@@ -41,8 +41,17 @@ android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:padding="5dp" android:text="电量单价" android:text="电量单价设置" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/parameter_cardIdentifying" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginTop="20dp" android:padding="5dp" android:text="卡标识码设置" android:textSize="@dimen/text_size" /> </LinearLayout> app/src/main/res/layout/activity_replacement.xml
New file @@ -0,0 +1,26 @@ <?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="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.dayu.recharge.view.TitleBar android:id="@+id/titleBar" android:layout_width="match_parent" android:layout_height="@dimen/dimen_title_height" android:background="@drawable/title_bar_bg" app:centerText="用户列表" app:leftImage="@mipmap/icon_back" app:rightText="筛选" /> <ListView android:id="@+id/newCard_listView" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="#ffffff" android:divider="@null" android:dividerHeight="0dp" /> </LinearLayout> app/src/main/res/layout/activity_write_text.xml
@@ -14,11 +14,22 @@ app:centerText="写卡" app:leftImage="@mipmap/icon_back" /> <TextView android:id="@+id/cardData" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/titleBar" android:gravity="center" android:layout_marginTop="20dp" android:textSize="@dimen/text_size" /> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/titleBar" android:layout_below="@id/cardData" android:layout_marginTop="20dp" android:gravity="center" android:text="请将卡贴在设备上进行写卡" app/src/main/res/layout/edt_dialog.xml
@@ -20,9 +20,9 @@ android:layout_width="300dp" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:hint="请输入序列号" android:maxLength="8" android:hint="请输入信息" android:inputType="number" android:maxLength="8" android:textColor="#000000" /> app/src/main/res/mipmap-xhdpi/icon_search.png
app/src/main/res/values/strings.xml
@@ -25,5 +25,6 @@ <string name="toast_7">AIDL 暂时只打印单个二维码</string> <string name="toast_8">两个二维码尺寸最大为7</string> <string name="toast_9">条码类型或内容不正确!</string> <string name="login_title">大禹节水\n智能充值管理系统</string> </resources>