Selaa lähdekoodia

出库采集增加获取明细功能.获取明细的增加了接口访问超时, 版本更新增加了权限和分区功能 出库采集获取明细增加点击间隔时长,

songw 5 kuukautta sitten
vanhempi
commit
c17bae5436

+ 5 - 5
app/src/main/AndroidManifest.xml

@@ -15,11 +15,6 @@
     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 
-    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
-
-    <!--8.0及以上系统需要添加此权限才能弹出APP安装界面-->
-    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
-
     <uses-permission android:name="android.permission.BLUETOOTH_CONNECT " />
 
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
@@ -36,6 +31,11 @@
     <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
 
+    <!-- 安装未知来源应用的权限(Android 8.0以下) 8.0及以上系统需要添加此权限才能弹出APP安装界面 -->
+    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
+    <!-- Android 11+ 查询已安装应用权限 -->
+    <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
+
 
     <application
         android:name="uas.erp.xinmaiwei_wms.application.PdaApplication"

+ 41 - 42
app/src/main/java/uas/erp/xinmaiwei_wms/application/PdaApplication.java

@@ -1,46 +1,45 @@
            package uas.erp.xinmaiwei_wms.application;
 
            import android.app.Activity;
-           import android.app.Application;
-           import android.content.Context;
-           import android.media.AudioAttributes;
-           import android.media.SoundPool;
-           import android.os.Build;
-           import android.os.CountDownTimer;
-           import android.util.Log;
-
-           import com.android.volley.RequestQueue;
-           import com.android.volley.toolbox.Volley;
-           import com.facebook.stetho.Stetho;
-           import com.umeng.analytics.MobclickAgent;
-           import com.umeng.commonsdk.UMConfigure;
-
-           import java.io.ByteArrayInputStream;
-           import java.io.IOException;
-           import java.io.InputStream;
-           import java.security.KeyManagementException;
-           import java.security.KeyStore;
-           import java.security.KeyStoreException;
-           import java.security.NoSuchAlgorithmException;
-           import java.security.cert.CertificateException;
-           import java.security.cert.CertificateFactory;
-           import java.util.HashMap;
-           import java.util.Map;
-
-           import javax.net.ssl.SSLContext;
-           import javax.net.ssl.SSLSocketFactory;
-           import javax.net.ssl.TrustManagerFactory;
-
-           import androidx.multidex.MultiDex;
-           import uas.erp.xinmaiwei_wms.R;
-           import uas.erp.xinmaiwei_wms.global.GloableParams;
-           import uas.erp.xinmaiwei_wms.tools.SharedPreUtil;
-           import uas.erp.xinmaiwei_wms.tools.VolleyUtil;
-           import uas.erp.xinmaiwei_wms.util.AndroidUtil;
-           import uas.erp.xinmaiwei_wms.util.Constants;
-           import uas.erp.xinmaiwei_wms.util.FakeX509TrustManager;
-           import uas.erp.xinmaiwei_wms.util.MyLog;
-           import uas.erp.xinmaiwei_wms.util.SoundUtil;
+import android.app.Application;
+import android.content.Context;
+import android.media.AudioAttributes;
+import android.media.SoundPool;
+import android.os.Build;
+import android.os.CountDownTimer;
+
+import com.android.volley.RequestQueue;
+import com.android.volley.toolbox.Volley;
+import com.facebook.stetho.Stetho;
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+
+import androidx.multidex.MultiDex;
+import uas.erp.xinmaiwei_wms.R;
+import uas.erp.xinmaiwei_wms.global.GloableParams;
+import uas.erp.xinmaiwei_wms.tools.SharedPreUtil;
+import uas.erp.xinmaiwei_wms.tools.VolleyUtil;
+import uas.erp.xinmaiwei_wms.util.AndroidUtil;
+import uas.erp.xinmaiwei_wms.util.Constants;
+import uas.erp.xinmaiwei_wms.util.FakeX509TrustManager;
+import uas.erp.xinmaiwei_wms.util.MyLog;
+import uas.erp.xinmaiwei_wms.util.SoundUtil;
 
 /**
  * Created by RaoMeng on 2016/7/28.
@@ -117,7 +116,7 @@ public class PdaApplication extends Application {
             int secondsRemaining = (int) (millisUntilFinished / 1000);
             int minutesRemaining = secondsRemaining / 60;
             int seconds = secondsRemaining % 60;
-            Log.d("Countdown", "Time remaining: " + minutesRemaining + " minutes, " + seconds + " seconds.");
+//            Log.d("Countdown", "Time remaining: " + minutesRemaining + " minutes, " + seconds + " seconds.");
             // 更新UI
         }
 
@@ -132,7 +131,7 @@ public class PdaApplication extends Application {
             String password = SharedPreUtil.getString(activity, "passwords", null);
             VolleyUtil.requestUserLogin(activity, GloableParams.ADDRESS_LOGIN_APPLY, VolleyUtil.METHOD_POST,
             VolleyUtil.FRAGMENT_LOGIN, maName, userName, password);
-            Log.d("Countdown结束", "Countdown finished.");
+//            Log.d("Countdown结束", "Countdown finished.");
             startCountdown();
         }
     };

+ 2 - 1
app/src/main/java/uas/erp/xinmaiwei_wms/fragment/IOCOutMakeMaterial.java

@@ -70,6 +70,7 @@ import uas.erp.xinmaiwei_wms.util.JsonTools;
 import uas.erp.xinmaiwei_wms.util.JsonUtils;
 import uas.erp.xinmaiwei_wms.util.LogUtil;
 import uas.erp.xinmaiwei_wms.util.MyArrayAdapter;
+import uas.erp.xinmaiwei_wms.util.MyLog;
 import uas.erp.xinmaiwei_wms.view.ClearableEditText;
 
 /**
@@ -149,7 +150,6 @@ public class IOCOutMakeMaterial extends BaseFragment {
 
     @Override
     protected void initEvents() {
-
         listInOut.setOnItemClickListener(new AdapterView.OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
@@ -513,6 +513,7 @@ public class IOCOutMakeMaterial extends BaseFragment {
         } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
         }
+        MyLog.e("aaa","地址是:" + url);
         PdaApplication.mRequestQueue.cancelAll(TAG);
         stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
             @Override

+ 59 - 5
app/src/main/java/uas/erp/xinmaiwei_wms/fragment/IOCOutMakeMaterialOper.java

@@ -108,6 +108,8 @@ import uas.erp.xinmaiwei_wms.util.HttpParams;
 import uas.erp.xinmaiwei_wms.util.JsonTools;
 import uas.erp.xinmaiwei_wms.util.JsonUtils;
 import uas.erp.xinmaiwei_wms.util.LogUtil;
+import uas.erp.xinmaiwei_wms.util.MyLog;
+import uas.erp.xinmaiwei_wms.util.NoDoubleClickListener;
 import uas.erp.xinmaiwei_wms.util.PrintUtils;
 import uas.erp.xinmaiwei_wms.util.VolleyRequest;
 import uas.erp.xinmaiwei_wms.util.VollyRequest;
@@ -717,9 +719,10 @@ public class IOCOutMakeMaterialOper extends BaseFragment implements View.OnClick
             }
         });
 
-        bt_get_details.setOnClickListener(new View.OnClickListener() {
+        bt_get_details.setOnClickListener(new NoDoubleClickListener() {
             @Override
-            public void onClick(View v) {
+            protected void onNoDoubleClick(View v) {
+                //1.5秒只能点击一次
                 geDetails();
             }
         });
@@ -727,10 +730,11 @@ public class IOCOutMakeMaterialOper extends BaseFragment implements View.OnClick
 
     private void geDetails() {
         progressDialog.show();
+        MyLog.e("aaa","获取明细:id:" + pi_id);
         VolleyRequest.getInstance().stringRequest(new HttpParams.Builder()
                 .url(GloableParams.ADDRESS_GET_DETAILS)
                 .method(Request.Method.POST)
-                .addParam("id ", pi_id)
+                .addParam("id", pi_id)
                 .build(), new HttpCallback() {
             @Override
             public void onSuccess(int flag, Object o) throws Exception {
@@ -740,6 +744,7 @@ public class IOCOutMakeMaterialOper extends BaseFragment implements View.OnClick
                     com.alibaba.fastjson.JSONObject resultObject = JSON.parseObject(result);
                     if (resultObject != null) {
                         CommonUtil.toastNoRepeat(mActivity, FastjsonUtil.getText(resultObject, "data"));
+                        getProdOut();
                     }
                 } catch (Exception e) {
                     e.printStackTrace();
@@ -751,7 +756,57 @@ public class IOCOutMakeMaterialOper extends BaseFragment implements View.OnClick
                 progressDialog.dismiss();
                 CommonUtil.toastNoRepeat(mActivity, failStr);
             }
-        });
+        }, 60 * 1000);
+    }
+
+    private void getProdOut() {
+        progressDialog.show();
+        MyLog.e("aaa","单号:inoutNo:" + pi_inoutno);
+        VolleyRequest.getInstance().stringRequest(new HttpParams.Builder()
+                .url(GloableParams.ADDRESS_OUTGETPRODOUT)
+                .method(Request.Method.GET)
+                .addParam("inoutNo", pi_inoutno)
+                .build(), new HttpCallback() {
+            @Override
+            public void onSuccess(int flag, Object o) throws Exception {
+                progressDialog.dismiss();
+                try {
+                    String result = o.toString();
+                    JSONObject resultObject = new JSONObject(result);
+                    JSONArray dataArray = resultObject.optJSONArray("data");
+                    if (dataArray != null) {
+                        for (int i = 0; i < dataArray.length(); i++) {
+                            JSONObject materialObject = dataArray.optJSONObject(i);
+                            if (materialObject != null) {
+//                                MaterialOutMessageBean.DataBean dataBean = new MaterialOutMessageBean.DataBean();
+//                                dataBean.setPD_WHCODE(JsonUtils.optStringNotNull(materialObject, "PD_WHCODE"));
+//                                dataBean.setPD_WHNAME(JsonUtils.optStringNotNull(materialObject, "PD_WHNAME"));
+//                                dataBean.setPI_CLASS(JsonUtils.optStringNotNull(materialObject, "PI_CLASS"));
+//                                dataBean.setPI_INOUTNO(JsonUtils.optStringNotNull(materialObject, "PI_INOUTNO"));
+//                                dataBean.setPI_TITLE(JsonUtils.optStringNotNull(materialObject, "PI_TITLE"));
+//                                dataBean.setPI_CARDCODE(JsonUtils.optStringNotNull(materialObject, "PI_CARDCODE"));
+//                                dataBean.setPI_ID(JsonUtils.optLongNotNull(materialObject, "PI_ID"));
+//                                dataBean.setPI_STATUSCODE(JsonUtils.optStringNotNull(materialObject, "PI_STATUSCODE"));
+//                                dataBean.setPI_PDASTATUS(JsonUtils.optStringNotNull(materialObject, "PI_PDASTATUS"));
+
+                                long piID = JsonUtils.optLongNotNull(materialObject, "PI_ID");
+                                pi_id = String.valueOf(piID);
+                            }
+                        }
+                    }else {
+                        CommonUtil.toastNoRepeat(mActivity, "单据ID获取失败");
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+
+            @Override
+            public void onFail(int flag, String failStr) throws Exception {
+                progressDialog.dismiss();
+                CommonUtil.toastNoRepeat(mActivity, failStr);
+            }
+        }, 60 * 1000);
     }
 
     private void getWhcode() {
@@ -1655,7 +1710,6 @@ public class IOCOutMakeMaterialOper extends BaseFragment implements View.OnClick
                 CommonUtil.setBackgroundAlpha(getActivity(), 0.5f);
                 listPopupWindow.showAsDropDown(btnActionbarRight);
 
-
                 /*View materialOutMoreView = View.inflate(getActivity(), R.layout.popupwindow_material_out_listview, null);
                 Button hadCollectBtn = (Button) materialOutMoreView.findViewById(R.id.material_out_menu_1);
                 Button noCollectBtn = (Button) materialOutMoreView.findViewById(R.id.material_out_menu_2);

+ 26 - 32
app/src/main/java/uas/erp/xinmaiwei_wms/fragment/VersionUpgradeFragment.java

@@ -5,6 +5,7 @@ import android.content.Context;
 import android.content.Intent;
 import android.net.Uri;
 import android.os.Build;
+import android.os.Environment;
 import android.os.Handler;
 import android.os.Message;
 import android.text.TextUtils;
@@ -19,7 +20,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.android.volley.Request;
 
 import java.io.File;
-import java.io.IOException;
 
 import androidx.annotation.RequiresApi;
 import androidx.core.content.FileProvider;
@@ -32,13 +32,12 @@ import uas.erp.xinmaiwei_wms.util.FastjsonUtil;
 import uas.erp.xinmaiwei_wms.util.FileUtils;
 import uas.erp.xinmaiwei_wms.util.HttpCallback;
 import uas.erp.xinmaiwei_wms.util.HttpParams;
+import uas.erp.xinmaiwei_wms.util.MyLog;
 import uas.erp.xinmaiwei_wms.util.VolleyRequest;
 import uas.erp.xinmaiwei_wms.util.download.ProgressDownloader;
 import uas.erp.xinmaiwei_wms.util.download.ProgressResponseBody;
 import uas.erp.xinmaiwei_wms.view.business.CommonProgressPop;
 
-import static uas.erp.xinmaiwei_wms.util.Constants.CONSTANT.APK_FILE_NAME;
-
 
 /**
  * Created by RaoMeng on 2020/4/9
@@ -52,6 +51,7 @@ public class VersionUpgradeFragment extends BaseFragment implements ProgressResp
     private long breakPoints, contentLength, totalBytes;
     private File file;
     private String mAttachId;
+    private File apkFile;
 
     @Override
     protected int getLayout() {
@@ -79,27 +79,9 @@ public class VersionUpgradeFragment extends BaseFragment implements ProgressResp
                 mProgressPop.showPopupWindow();
 
                 breakPoints = 0L;
-
-                //                File directory = new File(APK_FILE_PATH);
-                String filesDir = getActivity().getFilesDir().getAbsolutePath();
-                File directory = new File(filesDir + "/xinmaiwei_wms/apk");
-                if (!directory.exists() && !directory.isDirectory()) {
-                    boolean mkdirs = directory.mkdirs();
-                } else {
-                    //                    FileUtils.delAllFile(APK_FILE_PATH);
-                    FileUtils.delAllFile(directory + "/xinmaiwei_wms/apk");
-                }
-
-                //                file = new File(APK_FILE_PATH, APK_FILE_NAME);
-                file = new File(filesDir + "/xinmaiwei_wms/apk", APK_FILE_NAME);
-
-                try {
-                    file.createNewFile();
-                } catch (IOException e) {
-                    e.printStackTrace();
-                }
                 String downloadUrl = GloableParams.ADDRESS_COMMON_DOWNLOADBYID + "?id=" + mAttachId;
-                mDownloader = new ProgressDownloader(downloadUrl, file, VersionUpgradeFragment.this);
+                MyLog.e("aaa","下载路径为:" + downloadUrl);
+                mDownloader = new ProgressDownloader(downloadUrl, apkFile, VersionUpgradeFragment.this);
                 mDownloader.download(0L);
             }
         });
@@ -110,7 +92,24 @@ public class VersionUpgradeFragment extends BaseFragment implements ProgressResp
         mOldVersionTv.setText(AndroidUtil.getVersionName(mActivity));
         getNewVersionMsg();
 
-        //从API 26开始需要申请安装权限
+        //不同版本分区处理
+        String fileName = "update_" + "APP" + ".apk";
+        File downloadDir;
+        if (Build.VERSION.SDK_INT >= 29) {
+            // Android 10+ 使用私有目录
+            downloadDir = getActivity().getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
+        } else {
+            downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+        }
+        if (!downloadDir.exists()) {
+            downloadDir.mkdirs();
+        }else {
+            FileUtils.delAllFile(downloadDir.getAbsolutePath()+ fileName);
+        }
+
+        apkFile = new File(downloadDir, fileName);
+
+        //检查权限
         if (Build.VERSION.SDK_INT >= 26) {
             if (!isHasInstallPermissionWithO(getActivity())) {
                 startInstallPermissionSettingActivity(getActivity());
@@ -233,19 +232,14 @@ public class VersionUpgradeFragment extends BaseFragment implements ProgressResp
                     CommonUtil.toastNoRepeat(mActivity, "下载完成");
                     mProgressPop.dismiss();
                     try {
-                        //                        File apk = new File(APK_FILE_PATH, APK_FILE_NAME);
-                        String filesDir = getActivity().getFilesDir().getAbsolutePath();
-                        File apk = new File(filesDir + "/xinmaiwei_wms/apk", APK_FILE_NAME);
                         Intent intent = new Intent(Intent.ACTION_VIEW);
+                        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                         if (Build.VERSION.SDK_INT >= 24) {
-                            Uri apkUri = FileProvider.getUriForFile(mActivity,
-                                    "uas.erp.xinmaiwei_wms.fileprovider", apk);
-                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                            Uri apkUri = FileProvider.getUriForFile(mActivity, getActivity().getPackageName() +".fileprovider", apkFile);
                             intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                             intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
                         } else {
-                            intent.setDataAndType(Uri.fromFile(apk), "application/vnd.android.package-archive");
-                            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
                         }
                         mActivity.startActivity(intent);
                     } catch (Exception e) {

+ 27 - 0
app/src/main/java/uas/erp/xinmaiwei_wms/util/NoDoubleClickListener.java

@@ -0,0 +1,27 @@
+package uas.erp.xinmaiwei_wms.util;
+
+import android.view.View;
+
+import java.util.Calendar;
+
+/**
+ * Created by sw on 2026-03-23
+ */
+public abstract class NoDoubleClickListener implements View.OnClickListener {
+
+    public static final int MIN_CLICK_DELAY_TIME = 1500;
+
+    private long lastClickTime = 0;
+
+    @Override
+    public void onClick(View v) {
+        long currentTime = Calendar.getInstance().getTimeInMillis();
+        if (currentTime - lastClickTime > MIN_CLICK_DELAY_TIME) {
+            lastClickTime = currentTime;
+            onNoDoubleClick(v);
+        }
+    }
+
+    protected abstract void onNoDoubleClick(View v);
+
+}

+ 4 - 0
app/src/main/java/uas/erp/xinmaiwei_wms/util/VolleyRequest.java

@@ -53,6 +53,10 @@ public class VolleyRequest {
         stringRequest(null, httpParams, 10 * 1000, httpCallback);
     }
 
+    public void stringRequest(final HttpParams httpParams, final HttpCallback httpCallback,int timeoutMs) {
+        stringRequest(null, httpParams, timeoutMs, httpCallback);
+    }
+
     public void stringRequest(StringRequest stringRequest, final HttpParams httpParams, final int timeoutMs, final HttpCallback httpCallback) {
         if (httpParams == null) {
             throw new IllegalArgumentException("httpParams can not be NULL");

+ 21 - 4
app/src/main/res/xml/file_paths.xml

@@ -1,10 +1,27 @@
 <?xml version="1.0" encoding="utf-8"?>
-<paths xmlns:android="http://schemas.android.com/apk/res/android">
+<paths>
+    <!-- 外部存储根目录 -->
+    <external-path
+        name="external"
+        path="." />
+
+    <!-- 下载目录 -->
+    <external-path
+        name="download"
+        path="Download" />
 
-    <external-path name="ext_root" path="download"/>
+    <!-- 应用私有目录 -->
+    <external-files-path
+        name="files"
+        path="." />
 
-    <root-path
-        name="root_path"
+    <!-- 缓存目录 -->
+    <external-cache-path
+        name="cache"
         path="." />
 
+    <!-- 内部存储目录 -->
+    <files-path
+        name="internal"
+        path="." />
 </paths>

+ 2 - 2
build.gradle

@@ -54,8 +54,8 @@ ext {
             targetSdkVersion : 31,
             compileSdkVersion: 31,
             buildToolsVersion: "35.0.0",
-            versionCode      : 5,
-            versionName      : "1.0.4"
+            versionCode      : 8,
+            versionName      : "1.0.7"
     ]
 
     depsVersion = [