Browse Source

1.0.8

master
ml 8 months ago
parent
commit
dccc2c92c7
  1. 2
      app/build.gradle
  2. 2
      app/release/output.json
  3. 2
      app/src/main/assets/FlowReportWorkUI.json
  4. 2
      app/src/main/assets/litepal.xml
  5. 9
      app/src/main/java/com/techscan/wk/model/AnalysisBarBean.java
  6. 13
      app/src/main/java/com/techscan/wk/model/FlowReportWorkProOrderBean.java
  7. 14
      app/src/main/java/com/techscan/wk/model/ProReqDetailBean.java
  8. 3
      app/src/main/java/com/techscan/wk/rxretrofit/ApiService.java
  9. 9
      app/src/main/java/com/techscan/wk/rxretrofit/HttpMethods.java
  10. 251
      app/src/main/java/com/techscan/wk/ui/proreq/ProReqActivity.java
  11. 263
      app/src/main/java/com/techscan/wk/ui/reportwork/FlowReportWorkActivity.java
  12. 16
      app/src/main/java/com/techscan/wk/utils/BarAnalysisUtils.java
  13. 2
      app/src/main/res/values-en/strings.xml
  14. 2
      app/src/main/res/values-th-rTH/strings.xml
  15. 2
      app/src/main/res/values/strings.xml

2
app/build.gradle

@ -9,7 +9,7 @@ android {
//noinspection ExpiredTargetSdkVersion //noinspection ExpiredTargetSdkVersion
targetSdkVersion 29 targetSdkVersion 29
versionCode 1 versionCode 1
versionName "1.0.7"
versionName "1.0.8"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk { ndk {
abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' abiFilters 'armeabi', 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'

2
app/release/output.json

@ -1 +1 @@
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0.7","enabled":true,"outputFile":"维科上料报工系统_v1.0.7.apk","fullName":"release","baseName":"release"},"path":"维科上料报工系统_v1.0.7.apk","properties":{}}]
[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0.8","enabled":true,"outputFile":"维科上料报工系统_v1.0.8.apk","fullName":"release","baseName":"release"},"path":"维科上料报工系统_v1.0.8.apk","properties":{}}]

2
app/src/main/assets/FlowReportWorkUI.json

@ -128,7 +128,7 @@
"fieldName": "GMNGA", "fieldName": "GMNGA",
"name": "报工数量", "name": "报工数量",
"value": "", "value": "",
"editExp": 0,
"editExp": 2,
"values": [], "values": [],
"mast": false, "mast": false,
"canChange": true, "canChange": true,

2
app/src/main/assets/litepal.xml

@ -19,7 +19,7 @@
For example: For example:
<version value="1" /> <version value="1" />
--> -->
<version value="18" />
<version value="21" />
<!-- <!--
Define your models in the list with mapping tag, LitePal will Define your models in the list with mapping tag, LitePal will
create tables for each mapping class. The supported fields create tables for each mapping class. The supported fields

9
app/src/main/java/com/techscan/wk/model/AnalysisBarBean.java

@ -4,6 +4,7 @@ package com.techscan.wk.model;
* ml * ml
*/ */
public class AnalysisBarBean { public class AnalysisBarBean {
private String barcode;
private String factory; private String factory;
private String materiel; private String materiel;
private String versions; private String versions;
@ -12,6 +13,14 @@ public class AnalysisBarBean {
private String quantity; private String quantity;
private String ext; private String ext;
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public String getFactory() { public String getFactory() {
return factory; return factory;
} }

13
app/src/main/java/com/techscan/wk/model/FlowReportWorkProOrderBean.java

@ -19,15 +19,24 @@ public class FlowReportWorkProOrderBean extends LitePalSupport {
private String plnal; private String plnal;
private String plnnr; private String plnnr;
private String projn; private String projn;
private String psmng;
private String psmng;//订单数量
private String stlal; private String stlal;
private String ueeto;
private String ueeto;//容差数量1.0表示1%
private String ybzq; private String ybzq;
private String zremark; private String zremark;
private String zszjd; private String zszjd;
private String zwlbc; private String zwlbc;
private String zzt; private String zzt;
private String zzy; private String zzy;
private String gwemg;//已交货数量
public String getGwemg() {
return gwemg;
}
public void setGwemg(String gwemg) {
this.gwemg = gwemg;
}
public void setAmein(String amein) { public void setAmein(String amein) {
this.amein = amein; this.amein = amein;

14
app/src/main/java/com/techscan/wk/model/ProReqDetailBean.java

@ -5,9 +5,10 @@ import org.litepal.crud.LitePalSupport;
public class ProReqDetailBean extends LitePalSupport { public class ProReqDetailBean extends LitePalSupport {
private String gid; private String gid;
private long taskRowId; private long taskRowId;
private String barcode;
private String aufnr;//订单号 private String aufnr;//订单号
private String erfme;//单位 private String erfme;//单位
private Double erfmg;//物料数量
private double erfmg;//物料数量
private String matnr;//物料编码 private String matnr;//物料编码
private String werks;//工厂代码 private String werks;//工厂代码
private String zcjbm;//车间编码 private String zcjbm;//车间编码
@ -23,6 +24,13 @@ public class ProReqDetailBean extends LitePalSupport {
private String lgort;//库存地点 private String lgort;//库存地点
private String lgortName;//库存地点 private String lgortName;//库存地点
public String getBarcode() {
return barcode;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public String getZboxid() { public String getZboxid() {
return zboxid; return zboxid;
@ -64,11 +72,11 @@ public class ProReqDetailBean extends LitePalSupport {
this.erfme = erfme; this.erfme = erfme;
} }
public Double getErfmg() {
public double getErfmg() {
return erfmg; return erfmg;
} }
public void setErfmg(Double erfmg) {
public void setErfmg(double erfmg) {
this.erfmg = erfmg; this.erfmg = erfmg;
} }

3
app/src/main/java/com/techscan/wk/rxretrofit/ApiService.java

@ -86,6 +86,9 @@ public interface ApiService {
@GET("/web/order/info") @GET("/web/order/info")
Observable<ResponseBody> getOrderInfo(@Query("id") String order); Observable<ResponseBody> getOrderInfo(@Query("id") String order);
@GET("/web/order/getByzboxid")
Observable<ResponseBody> getByzboxid(@Query("zboxid") String zboxid);
@GET("/web/order/getlgort") @GET("/web/order/getlgort")
Observable<ResponseBody> getlgort(); Observable<ResponseBody> getlgort();

9
app/src/main/java/com/techscan/wk/rxretrofit/HttpMethods.java

@ -354,6 +354,15 @@ public class HttpMethods {
.subscribe(observer); .subscribe(observer);
} }
public void getByzboxid(String zboxid,
Observer<ResponseBody> observer) {
getApiService().getByzboxid(zboxid)
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
public void getlgort(Observer<ResponseBody> observer) { public void getlgort(Observer<ResponseBody> observer) {
getApiService().getlgort() getApiService().getlgort()
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())

251
app/src/main/java/com/techscan/wk/ui/proreq/ProReqActivity.java

@ -29,7 +29,6 @@ import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.blankj.utilcode.util.KeyboardUtils; import com.blankj.utilcode.util.KeyboardUtils;
import com.blankj.utilcode.util.SPUtils;
import com.blankj.utilcode.util.StringUtils; import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ToastUtils; import com.blankj.utilcode.util.ToastUtils;
import com.codbking.widget.DatePickDialog; import com.codbking.widget.DatePickDialog;
@ -46,6 +45,7 @@ import com.techscan.wk.app.AppConst;
import com.techscan.wk.base.CommonFunctionActivity; import com.techscan.wk.base.CommonFunctionActivity;
import com.techscan.wk.model.AnalysisBarBean; import com.techscan.wk.model.AnalysisBarBean;
import com.techscan.wk.model.DynamicFormBean; import com.techscan.wk.model.DynamicFormBean;
import com.techscan.wk.model.FlowReportWorkProOrderBean;
import com.techscan.wk.model.ProReqDetailBean; import com.techscan.wk.model.ProReqDetailBean;
import com.techscan.wk.model.ProReqOrdeTaskBean; import com.techscan.wk.model.ProReqOrdeTaskBean;
import com.techscan.wk.model.ProReqOrderBean; import com.techscan.wk.model.ProReqOrderBean;
@ -55,12 +55,12 @@ import com.techscan.wk.rxretrofit.BaseObserver;
import com.techscan.wk.rxretrofit.BaseResponseBean; import com.techscan.wk.rxretrofit.BaseResponseBean;
import com.techscan.wk.rxretrofit.HttpMethods; import com.techscan.wk.rxretrofit.HttpMethods;
import com.techscan.wk.ui.baseAct.LgortListActivity; import com.techscan.wk.ui.baseAct.LgortListActivity;
import com.techscan.wk.ui.login.SettingActivity;
import com.techscan.wk.ui.reportwork.ConfigSettingActivity; import com.techscan.wk.ui.reportwork.ConfigSettingActivity;
import com.techscan.wk.ui.scan.CustomCaptureActivity; import com.techscan.wk.ui.scan.CustomCaptureActivity;
import com.techscan.wk.utils.AntiShakeUtils; import com.techscan.wk.utils.AntiShakeUtils;
import com.techscan.wk.utils.BarAnalysisUtils; import com.techscan.wk.utils.BarAnalysisUtils;
import com.techscan.wk.utils.DateUtils; import com.techscan.wk.utils.DateUtils;
import com.techscan.wk.utils.DialogUtil;
import com.techscan.wk.utils.FindUtils; import com.techscan.wk.utils.FindUtils;
import com.techscan.wk.utils.PreferencesUtil; import com.techscan.wk.utils.PreferencesUtil;
import com.techscan.wk.utils.SoundUtils; import com.techscan.wk.utils.SoundUtils;
@ -89,6 +89,7 @@ import q.rorbin.badgeview.QBadgeView;
/** /**
* Description:生产上料 * Description:生产上料
* [)>@06@QRPART@10V101010@1P11002734@3SX1000019400001@1T20240724001@Q20@14D20240724@@
* @author MULEI * @author MULEI
* @date 2024/9/11 * @date 2024/9/11
*/ */
@ -123,6 +124,7 @@ public class ProReqActivity extends CommonFunctionActivity {
private Map<String, List<String>> scanBarcodeListMap;//存放条码扫描明细 private Map<String, List<String>> scanBarcodeListMap;//存放条码扫描明细
private ProReqOrderBean proReqOrderBean; private ProReqOrderBean proReqOrderBean;
private boolean isSave = false; private boolean isSave = false;
private AnalysisBarBean barDataBean;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -317,14 +319,6 @@ public class ProReqActivity extends CommonFunctionActivity {
showError(getString(R.string.The_barcode_format_is_incorrect) + value); showError(getString(R.string.The_barcode_format_is_incorrect) + value);
return; return;
} }
AnalysisBarBean analysisBarBean = BarAnalysisUtils.analysisBarcode(value);
String materiel = analysisBarBean.getMateriel();
if (TextUtils.isEmpty(materiel)) {
dynamicFormAdapter.setFocusById(dynamicFormBean.getId());
showError(getString(R.string.There_is_no_aterial_information_in_the_barcode_please_confirm));
return;
}
// //判断条码是否已经被扫描 // //判断条码是否已经被扫描
// if (isInBarcodeList(scanBarcodeListMap, value)) { // if (isInBarcodeList(scanBarcodeListMap, value)) {
// showError(getString(R.string.Do_not_scan_the_barcode_again)); // showError(getString(R.string.Do_not_scan_the_barcode_again));
@ -334,7 +328,7 @@ public class ProReqActivity extends CommonFunctionActivity {
getBarcodeInfo(value); getBarcodeInfo(value);
break; break;
case "quantity": case "quantity":
addDetail();
addDetailCheck(value);
break; break;
default: default:
break; break;
@ -348,10 +342,16 @@ public class ProReqActivity extends CommonFunctionActivity {
* @param value 条码内容 * @param value 条码内容
*/ */
private void getBarcodeInfo(String value) { private void getBarcodeInfo(String value) {
AnalysisBarBean bean = BarAnalysisUtils.analysisBarcode(value);
barDataBean = BarAnalysisUtils.analysisBarcode(value);
String materiel = barDataBean.getMateriel();
if (TextUtils.isEmpty(materiel)) {
setNextFocus("barcode");
showError(getString(R.string.There_is_no_aterial_information_in_the_barcode_please_confirm));
return;
}
LitePal LitePal
//.where("matnr = ? and complete = ?", materiel, "0") //.where("matnr = ? and complete = ?", materiel, "0")
.where("matnr = ?", bean.getMateriel())
.where("matnr = ?", barDataBean.getMateriel())
.findAsync(ProReqOrdeTaskBean.class) .findAsync(ProReqOrdeTaskBean.class)
.listen(proReqOrdeTaskBeans -> { .listen(proReqOrdeTaskBeans -> {
if (proReqOrdeTaskBeans.size() == 0) { if (proReqOrdeTaskBeans.size() == 0) {
@ -370,19 +370,19 @@ public class ProReqActivity extends CommonFunctionActivity {
d.setValue(showValue); d.setValue(showValue);
break; break;
case "MATNR"://物料号 case "MATNR"://物料号
d.setValue(bean.getMateriel());
d.setValue(barDataBean.getMateriel());
d.setFocus(false); d.setFocus(false);
break; break;
case "ZXTPC"://包装容器号 --箱号 case "ZXTPC"://包装容器号 --箱号
d.setValue(bean.getPackageNumber());
d.setValue(barDataBean.getPackageNumber());
d.setFocus(false); d.setFocus(false);
break; break;
case "ZPC"://批次 case "ZPC"://批次
d.setValue(bean.getBatch());
d.setValue(barDataBean.getBatch());
d.setFocus(false); d.setFocus(false);
break; break;
case "quantity"://数量 case "quantity"://数量
d.setValue(bean.getQuantity());
d.setValue(barDataBean.getQuantity());
d.setFocus(true); d.setFocus(true);
break; break;
case "erfme"://单位 case "erfme"://单位
@ -400,12 +400,7 @@ public class ProReqActivity extends CommonFunctionActivity {
//判断是否开启 扫描自动加入明细 //判断是否开启 扫描自动加入明细
boolean aBoolean = PreferencesUtil.getBoolean(context, AppConst.SCAN_ADD_DETAIL, true); boolean aBoolean = PreferencesUtil.getBoolean(context, AppConst.SCAN_ADD_DETAIL, true);
if (aBoolean) { if (aBoolean) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addDetail();
}
}, 300);
new Handler().postDelayed(() -> addDetailCheck(barDataBean.getQuantity()), 300);
} }
}); });
@ -413,66 +408,75 @@ public class ProReqActivity extends CommonFunctionActivity {
} }
/** /**
* 根据工单获取工单物料信息
*
* @param id 工单号
* 加入明细前校验
*/ */
private void query(String id) {
HttpMethods.getInstance().getOrderInfo(id, new BaseObserver<ResponseBody>(context) {
@Override
protected void onSuccess(ResponseBody body) throws Exception {
String string = body.string();
Type objectType = new TypeToken<BaseResponseBean<List<ProReqOrderBean>>>() {
}.getType();
BaseResponseBean<List<ProReqOrderBean>> baseResponseBean = gson.fromJson(string, objectType);
if (baseResponseBean.getCode() != 200) {
showError(baseResponseBean.getMsg());
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
}
List<ProReqOrderBean> data = baseResponseBean.getData();
if (data.size() == 0) {
showError(getString(R.string.No_data_was_obtained));
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
}
private void addDetailCheck(String quantity) {
if (LitePal.count(ProReqOrdeTaskBean.class) == 0) {
showError(getString(R.string.Please_scan_the_ticket_number_first));
setNextFocus("AUFNR");
return;
}
if (barDataBean == null) {
showError(getString(R.string.The_bar_code_cannot_be_blank));
setNextFocus("barcode");
return;
}
proReqOrderBean = data.get(0);
List<ProReqOrdeTaskBean> item = proReqOrderBean.getItem();
if (item.size() == 0) {
showError(getString(R.string.No_data_was_obtained));
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
if (TextUtils.isEmpty(quantity)) {
setNextFocus("quantity");
showError(getString(R.string.The_quantity_cannot_be_empty));
return;
}
//当前加入明细的数量
double currenScanNum = Double.parseDouble(quantity);
if (currenScanNum <= 0) {
showError(getString(R.string.The_number_of_scanned_codes_must_be_greater_than_0));
return;
}
//条码数量
String barNum = barDataBean.getQuantity();
String packageNumber = barDataBean.getPackageNumber();
if (!TextUtils.isEmpty(barNum) && checkNumber(barNum)) {
//计算出当前箱号在明细中已扫描的数量
Double hisScanNum = LitePal.where("zboxid = ? ", packageNumber).sum(ProReqDetailBean.class, "erfmg", double.class);
double finalHisScanNum = hisScanNum;
double finalBarNum = Double.parseDouble(barNum);
double finalCurrenScanNum = currenScanNum;
HttpMethods.getInstance().getByzboxid(packageNumber, new BaseObserver<ResponseBody>(context) {
@Override
protected void onSuccess(ResponseBody body) throws Exception {
String string = body.string();
Type objectType = new TypeToken<BaseResponseBean<Double>>() {
}.getType();
BaseResponseBean<Double> baseResponseBean = gson.fromJson(string, objectType);
if (baseResponseBean.getCode() != 200) {
showError(baseResponseBean.getMsg());
return;
}
if (baseResponseBean.getData() != null) {
//服务端返回该箱号已扫描数量
double data = baseResponseBean.getData();
//当前扫描数量+本地历史扫描数量+服务扫描数量
double scanTotal = finalCurrenScanNum + finalHisScanNum + data;
if (scanTotal > finalBarNum) {
DialogUtil.showErrorInfoDialog(context, "当前数量" + quantity + ",历史已扫数量" + (finalHisScanNum + data) +
",已扫数量总和超过条码数量" + finalBarNum + ",请确认");
} else {
addDetail();
}
}
} }
QMUITipDialog qmuiTipDialog = new QMUITipDialog.Builder(context).setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING).create();
qmuiTipDialog.setCancelable(false);
qmuiTipDialog.setCanceledOnTouchOutside(false);
qmuiTipDialog.show();
for (int i = 0; i < item.size(); i++) {
ProReqOrdeTaskBean taskBean = item.get(i);
taskBean.setRowid(System.currentTimeMillis());
taskBean.save();
@Override
protected void onFailure(Throwable e) throws Exception {
CustomErrorDialog(e, ProReqActivity.this);
} }
showTaskDetailBadgeNum();
qmuiTipDialog.dismiss();
setNextFocus("ZCJBM");
});
}
} else {
addDetail();
}
@Override
protected void onFailure(Throwable e) throws Exception {
showTaskDetailBadgeNum();
setNextFocus("AUFNR");
SoundUtils.playSound(ProReqActivity.this, R.raw.warning);
CustomErrorDialog(e, ProReqActivity.this);
}
});
} }
/** /**
@ -490,12 +494,6 @@ public class ProReqActivity extends CommonFunctionActivity {
DynamicFormBean quantityItem = dynamicFormAdapter.getItemByFieldName("quantity");//数量 DynamicFormBean quantityItem = dynamicFormAdapter.getItemByFieldName("quantity");//数量
DynamicFormBean erfmeItem = dynamicFormAdapter.getItemByFieldName("erfme");//单位 DynamicFormBean erfmeItem = dynamicFormAdapter.getItemByFieldName("erfme");//单位
if (LitePal.count(ProReqOrdeTaskBean.class) == 0) {
showError(getString(R.string.Please_scan_the_ticket_number_first));
setNextFocus("AUFNR");
return;
}
if (TextUtils.isEmpty(lgortItem.getValue())) { if (TextUtils.isEmpty(lgortItem.getValue())) {
showError(getString(R.string.Please_select_a_stock_location)); showError(getString(R.string.Please_select_a_stock_location));
return; return;
@ -508,17 +506,6 @@ public class ProReqActivity extends CommonFunctionActivity {
return; return;
} }
String value = quantityItem.getValue();
if (TextUtils.isEmpty(value)) {
setNextFocus("quantity");
showError(getString(R.string.The_quantity_cannot_be_empty));
return;
}
double num = Double.parseDouble(value);
if (Double.parseDouble(value) <= 0) {
showError(getString(R.string.The_number_of_scanned_codes_must_be_greater_than_0));
return;
}
LitePal LitePal
//.where("matnr = ? and complete = ?", MATNRItem.getValue(), "0") //.where("matnr = ? and complete = ?", MATNRItem.getValue(), "0")
@ -530,8 +517,7 @@ public class ProReqActivity extends CommonFunctionActivity {
showError(getString(R.string.There_is_no_data_of_the_same_dimension_in_the_task_list)); showError(getString(R.string.There_is_no_data_of_the_same_dimension_in_the_task_list));
return; return;
} }
double scanQuantity = num;
double scanQuantity = Double.parseDouble(quantityItem.getValue());
String gid = System.currentTimeMillis() + ""; String gid = System.currentTimeMillis() + "";
//加入明细,并且可以超量,每次只匹配任务一行 //加入明细,并且可以超量,每次只匹配任务一行
for (ProReqOrdeTaskBean bean : proReqOrdeTaskBeans) { for (ProReqOrdeTaskBean bean : proReqOrdeTaskBeans) {
@ -546,6 +532,7 @@ public class ProReqActivity extends CommonFunctionActivity {
bean.save(); bean.save();
ProReqDetailBean detailBean = new ProReqDetailBean(); ProReqDetailBean detailBean = new ProReqDetailBean();
detailBean.setBarcode(barDataBean.getBarcode());
detailBean.setTaskRowId(bean.getRowid()); detailBean.setTaskRowId(bean.getRowid());
detailBean.setGid(gid); detailBean.setGid(gid);
detailBean.setAufnr(bean.getAufnr()); detailBean.setAufnr(bean.getAufnr());
@ -580,6 +567,7 @@ public class ProReqActivity extends CommonFunctionActivity {
scanBarcodeListMap.put(gid, keyBarcodes); scanBarcodeListMap.put(gid, keyBarcodes);
runOnUiThread(() -> { runOnUiThread(() -> {
barDataBean = null;
SoundUtils.playSound(this, R.raw.ok); SoundUtils.playSound(this, R.raw.ok);
if (KeyboardUtils.isSoftInputVisible(context)) { if (KeyboardUtils.isSoftInputVisible(context)) {
KeyboardUtils.hideSoftInput(context); KeyboardUtils.hideSoftInput(context);
@ -603,6 +591,70 @@ public class ProReqActivity extends CommonFunctionActivity {
} }
/**
* 根据工单获取工单物料信息
*
* @param id 工单号
*/
private void query(String id) {
HttpMethods.getInstance().getOrderInfo(id, new BaseObserver<ResponseBody>(context) {
@Override
protected void onSuccess(ResponseBody body) throws Exception {
String string = body.string();
Type objectType = new TypeToken<BaseResponseBean<List<ProReqOrderBean>>>() {
}.getType();
BaseResponseBean<List<ProReqOrderBean>> baseResponseBean = gson.fromJson(string, objectType);
if (baseResponseBean.getCode() != 200) {
showError(baseResponseBean.getMsg());
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
}
List<ProReqOrderBean> data = baseResponseBean.getData();
if (data.size() == 0) {
showError(getString(R.string.No_data_was_obtained));
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
}
proReqOrderBean = data.get(0);
List<ProReqOrdeTaskBean> item = proReqOrderBean.getItem();
if (item.size() == 0) {
showError(getString(R.string.No_data_was_obtained));
setNextFocus("AUFNR");
showTaskDetailBadgeNum();
return;
}
QMUITipDialog qmuiTipDialog = new QMUITipDialog.Builder(context).setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING).create();
qmuiTipDialog.setCancelable(false);
qmuiTipDialog.setCanceledOnTouchOutside(false);
qmuiTipDialog.show();
for (int i = 0; i < item.size(); i++) {
ProReqOrdeTaskBean taskBean = item.get(i);
taskBean.setRowid(System.currentTimeMillis());
taskBean.save();
}
showTaskDetailBadgeNum();
qmuiTipDialog.dismiss();
setNextFocus("ZCJBM");
}
@Override
protected void onFailure(Throwable e) throws Exception {
showTaskDetailBadgeNum();
setNextFocus("AUFNR");
SoundUtils.playSound(ProReqActivity.this, R.raw.warning);
CustomErrorDialog(e, ProReqActivity.this);
}
});
}
/** /**
* 显示任务和明细角标 * 显示任务和明细角标
*/ */
@ -899,6 +951,15 @@ public class ProReqActivity extends CommonFunctionActivity {
} }
//数字验证(包含小数点)
public static boolean checkNumber(String str) {
String regex = "-[0-9]+(.[0-9]+)?|[0-9]+(.[0-9]+)?";
if (str == null || !str.matches(regex)) {
return false;
}
return true;
}
public void clearAllData() { public void clearAllData() {
if (LitePal.count(ProReqDetailBean.class) > 0) { if (LitePal.count(ProReqDetailBean.class) > 0) {
LitePal.deleteAll(ProReqDetailBean.class); LitePal.deleteAll(ProReqDetailBean.class);

263
app/src/main/java/com/techscan/wk/ui/reportwork/FlowReportWorkActivity.java

@ -64,6 +64,7 @@ import com.techscan.wk.widgets.CustomBottomSheet;
import org.litepal.LitePal; import org.litepal.LitePal;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -75,8 +76,12 @@ import butterknife.OnClick;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import q.rorbin.badgeview.QBadgeView; import q.rorbin.badgeview.QBadgeView;
/** /**
* Description:流转单报工 * Description:流转单报工
* 按规则解析条码 [)>@06@QRPART@10V101010@1P31107550@3SX1000019400001@1T20240724001@Q934@14D20240724@@
* 流转单号 T10000194000001
*
* @author MULEI * @author MULEI
* @date 2024/9/11 * @date 2024/9/11
*/ */
@ -113,6 +118,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
private Map<String, List<String>> scanBarcodeListMap;//存放条码扫描明细 private Map<String, List<String>> scanBarcodeListMap;//存放条码扫描明细
private boolean isSave = false; private boolean isSave = false;
private String[] items = new String[]{}; private String[] items = new String[]{};
private AnalysisBarBean barDataBean;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -288,7 +294,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
int count = LitePal.count(FlowOrderDetailBean.class); int count = LitePal.count(FlowOrderDetailBean.class);
int detailCount = LitePal.count(FlowReportWorkDetailBean.class); int detailCount = LitePal.count(FlowReportWorkDetailBean.class);
if(which == finalSelectIndex || (!rvUiHaveData() && count == 0 && detailCount == 0)){
if (which == finalSelectIndex || (!rvUiHaveData() && count == 0 && detailCount == 0)) {
dialog.dismiss(); dialog.dismiss();
String item = items[which]; String item = items[which];
dynamicFormBean.setValue(item); dynamicFormBean.setValue(item);
@ -458,7 +464,25 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
break; break;
//报工数量 //报工数量
case "GMNGA": case "GMNGA":
addDetail();
DynamicFormBean MATNRItem = dynamicFormAdapter.getItemByFieldName("MATNR");//物料号
if (TextUtils.isEmpty(MATNRItem.getValue())) {
showError(getString(R.string.Please_scan_the_package_barcode_first));
setNextFocus("PacketBarcode");
return;
}
LitePal
.where("matnr = ?", MATNRItem.getValue())
.findAsync(FlowReportWorkProOrderBean.class)
.listen(orderBeans -> {
if (orderBeans.size() == 0) {
//未找到相同维度数据,报错
showError(getString(R.string.The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code));
dynamicFormAdapter.setFocusById(dynamicFormBean.getId());
return;
}
addDetailCheck(orderBeans.get(0), value);
});
break; break;
default: default:
break; break;
@ -466,6 +490,151 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
}); });
} }
/**
* 解析条码信息并比对工单产品信息
*
* @param value 条码内容
* @param dynamicFormBean 当前条码栏目
*/
private void getBarcodeInfo(String value, DynamicFormBean dynamicFormBean) {
barDataBean = BarAnalysisUtils.analysisBarcode(value);
String materiel = barDataBean.getMateriel();
if (TextUtils.isEmpty(materiel)) {
setNextFocus("PacketBarcode");
showError(getString(R.string.There_is_no_aterial_information_in_the_barcode_please_confirm));
return;
}
String packageNumber = barDataBean.getPackageNumber();
if (!TextUtils.isEmpty(packageNumber) && packageNumber.length() > 9) {
String order = packageNumber.substring(1, 9);
//工单栏目
DynamicFormBean AUFNRItem = dynamicFormAdapter.getItemByFieldName("AUFNR");
if (!order.equalsIgnoreCase(AUFNRItem.getValue())) {
showError(getString(R.string.The_order_number_is_inconsistent_please_confirm));
return;
}
}
//先根据条码物料信息比对工单产品信息
LitePal
.where("matnr = ?", barDataBean.getMateriel())
.findAsync(FlowReportWorkProOrderBean.class)
.listen(orderBeans -> {
if (orderBeans.size() == 0) {
//未找到相同维度数据,报错
showError(getString(R.string.The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code));
dynamicFormAdapter.setFocusById(dynamicFormBean.getId());
return;
}
for (DynamicFormBean d : dynamicFormBeans) {
switch (d.getFieldName()) {
case "MATNR"://物料号
d.setValue(barDataBean.getMateriel());
d.setFocus(false);
break;
case "ZXTPC"://包装容器号 --箱号
d.setValue(barDataBean.getPackageNumber());
d.setFocus(false);
break;
case "ZPC"://批次
d.setValue(barDataBean.getBatch());
d.setFocus(false);
break;
case "GMNGA"://报工数量
d.setValue(barDataBean.getQuantity());
d.setFocus(false);
break;
default:
d.setFocus(false);
break;
}
}
dynamicFormAdapter.setList(dynamicFormBeans);
dynamicFormAdapter.notifyDataSetChanged();
new Handler().postDelayed(() -> addDetailCheck(orderBeans.get(0), barDataBean.getQuantity()), 300);
});
}
/**
* 加入明细前校验
*/
private void addDetailCheck(FlowReportWorkProOrderBean workProOrderBean, String quantity) {
if (barDataBean == null) {
showError(getString(R.string.The_packet_barcode_cannot_be_empty));
setNextFocus("PacketBarcode");
return;
}
if (TextUtils.isEmpty(quantity)) {
showError(getString(R.string.The_number_of_reports_cannot_be_empty));
setNextFocus("GMNGA");
return;
}
if (Double.parseDouble(quantity) <= 0) {
showError(getString(R.string.The_number_of_jobs_reported_cannot_be_0_or_smaller_than_0));
setNextFocus("GMNGA");
return;
}
// String ueeto = "0";
// if (!TextUtils.isEmpty(workProOrderBean.getUeeto())) {
// ueeto = workProOrderBean.getUeeto();
// }
// String psmng = "0";
// if (!TextUtils.isEmpty(workProOrderBean.getPsmng())) {
// psmng = workProOrderBean.getPsmng();
// }
// String gwemg = "0";
// if (!TextUtils.isEmpty(workProOrderBean.getGwemg())) {
// gwemg = workProOrderBean.getGwemg();
// }
// BigDecimal ueetodecimal = new BigDecimal(ueeto);//容差数量1.0表示1%
// BigDecimal psmngdecimal = new BigDecimal(psmng);//订单数量
// BigDecimal gwemgdecimal = new BigDecimal(gwemg);//已交货数量
//
// BigDecimal gmnga = new BigDecimal(quantity);//当前扫描的报工数量
//
// //统计明细里已报工的数量
// Double sum = LitePal.sum(FlowReportWorkDetailBean.class, "gmnga", double.class);
// //当扫描总数>工单数量*(1+过量交货容差)-已交货数量,系统不允许继续扫描。
// if (gmnga.doubleValue() + sum > psmngdecimal.doubleValue() * (1 + (ueetodecimal.doubleValue() / 100)) - gwemgdecimal.doubleValue()) {
// String msg = "当前数量" + gmnga.doubleValue() + ",已扫数量" + sum + ",超过订单数量(" + psmngdecimal.doubleValue()
// + ") * (1 + 过量交货容差(" + (ueetodecimal.doubleValue() / 100) + ")) - 已交货数量(" + gwemgdecimal.doubleValue() + ")";
// QMUIDialog qmuiDialog = new QMUIDialog.MessageDialogBuilder(context)
// .setTitle(getResources().getString(R.string.tips_title))
// .setMessage(msg)
// .addAction(getResources().getString(R.string.confirm_info), (dialog, index) -> {
// dialog.dismiss();
// })
// .create(R.style.QMUI_Dialog);
// qmuiDialog.show();
// return;
// }
//
// //如果扫描总数>工单数量-已交货数量 系统给出提示,当前数量已超过订单总数,但允许继续操作。
// if (gmnga.doubleValue() + sum > psmngdecimal.doubleValue() - gwemgdecimal.doubleValue()) {
// String msg = "当前数量" + gmnga.doubleValue() + ",已扫数量" + sum + ",超过订单数量(" + psmngdecimal.doubleValue() + ") - 已交货数量(" + gwemgdecimal.doubleValue() + "),是否继续操作?";
// QMUIDialog qmuiDialog = new QMUIDialog.MessageDialogBuilder(context)
// .setTitle(getResources().getString(R.string.tips_title))
// .setMessage(msg)
// .addAction(getResources().getString(R.string.cancel_info), (dialog, index) -> dialog.dismiss())
// .addAction(getResources().getString(R.string.confirm_info), (dialog, index) -> {
// dialog.dismiss();
// addDetail();
// })
// .create(R.style.QMUI_Dialog);
// qmuiDialog.show();
// } else {
addDetail();
// }
}
/** /**
* 加入明细列表 * 加入明细列表
*/ */
@ -485,21 +654,6 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
showError(getString(R.string.The_work_order_number_cannot_be_empty)); showError(getString(R.string.The_work_order_number_cannot_be_empty));
return; return;
} }
if (TextUtils.isEmpty(gmngaItem.getValue())) {
showError(getString(R.string.The_number_of_reports_cannot_be_empty));
setNextFocus("GMNGA");
return;
}
if (gmngaItem.getValue().equals("0")) {
showError(getString(R.string.The_number_of_jobs_reported_cannot_be_0_or_smaller_than_0));
setNextFocus("GMNGA");
return;
}
if (Double.parseDouble(gmngaItem.getValue()) < 0) {
showError(getString(R.string.The_number_of_jobs_reported_cannot_be_0_or_smaller_than_0));
setNextFocus("GMNGA");
return;
}
if (TextUtils.isEmpty(PacketBarcodeItem.getValue())) { if (TextUtils.isEmpty(PacketBarcodeItem.getValue())) {
showError(getString(R.string.The_packet_barcode_cannot_be_empty)); showError(getString(R.string.The_packet_barcode_cannot_be_empty));
setNextFocus("PacketBarcode"); setNextFocus("PacketBarcode");
@ -546,7 +700,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
List<String> keyBarcodes = new ArrayList<>(); List<String> keyBarcodes = new ArrayList<>();
keyBarcodes.add(barcode); keyBarcodes.add(barcode);
scanBarcodeListMap.put(gid, keyBarcodes); scanBarcodeListMap.put(gid, keyBarcodes);
barDataBean = null;
reInitUI(ScanRuleItem.getValue()); reInitUI(ScanRuleItem.getValue());
} else { } else {
showError(getString(R.string.Failed_to_join_details)); showError(getString(R.string.Failed_to_join_details));
@ -580,7 +734,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
List<String> keyBarcodes = new ArrayList<>(); List<String> keyBarcodes = new ArrayList<>();
keyBarcodes.add(barcode); keyBarcodes.add(barcode);
scanBarcodeListMap.put(gid, keyBarcodes); scanBarcodeListMap.put(gid, keyBarcodes);
barDataBean = null;
reInitUI(ScanRuleItem.getValue()); reInitUI(ScanRuleItem.getValue());
} else { } else {
showError(getString(R.string.Failed_to_join_details)); showError(getString(R.string.Failed_to_join_details));
@ -592,10 +746,11 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
/** /**
* 根据工单获取产品信息 * 根据工单获取产品信息
* @param workOrder 工单号
* @param flowOrder 流转单号
* @param scanRuleItem 扫描规则栏目
* @param AUFNRItem 工单号栏目
*
* @param workOrder 工单号
* @param flowOrder 流转单号
* @param scanRuleItem 扫描规则栏目
* @param AUFNRItem 工单号栏目
* @param dynamicFormBean 当前栏目也就是流转单号栏目 * @param dynamicFormBean 当前栏目也就是流转单号栏目
*/ */
private void query(String workOrder, String flowOrder, DynamicFormBean scanRuleItem, DynamicFormBean AUFNRItem, DynamicFormBean dynamicFormBean) { private void query(String workOrder, String flowOrder, DynamicFormBean scanRuleItem, DynamicFormBean AUFNRItem, DynamicFormBean dynamicFormBean) {
@ -667,64 +822,10 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
}); });
} }
/**
* 解析条码信息并比对工单产品信息
* @param value 条码内容
* @param dynamicFormBean 当前条码栏目
*/
private void getBarcodeInfo(String value, DynamicFormBean dynamicFormBean) {
AnalysisBarBean bean = BarAnalysisUtils.analysisBarcode(value);
//先根据条码物料信息比对工单产品信息
LitePal
.where("matnr = ?", bean.getMateriel())
.findAsync(FlowReportWorkProOrderBean.class)
.listen(orderBeans -> {
if (orderBeans.size() == 0) {
//未找到相同维度数据,报错
showError(getString(R.string.The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code));
dynamicFormAdapter.setFocusById(dynamicFormBean.getId());
return;
}
for (DynamicFormBean d : dynamicFormBeans) {
switch (d.getFieldName()) {
case "MATNR"://物料号
d.setValue(bean.getMateriel());
d.setFocus(false);
break;
case "ZXTPC"://包装容器号 --箱号
d.setValue(bean.getPackageNumber());
d.setFocus(false);
break;
case "ZPC"://批次
d.setValue(bean.getBatch());
d.setFocus(false);
break;
case "GMNGA"://报工数量
d.setValue(bean.getQuantity());
d.setFocus(false);
break;
default:
d.setFocus(false);
break;
}
}
dynamicFormAdapter.setList(dynamicFormBeans);
dynamicFormAdapter.notifyDataSetChanged();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
addDetail();
}
}, 300);
});
}
/** /**
* 设置光标跳转 * 设置光标跳转
*
* @param name * @param name
*/ */
private void setNextFocus(String name) { private void setNextFocus(String name) {
@ -815,9 +916,12 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
return; return;
} }
isSave = true; isSave = true;
BigDecimal gmnga = new BigDecimal("0.0");//报工数量 扫描数量
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
FlowReportWorkDetailBean flowReportWorkDetailBean = items.get(i);
items.get(i).setPacketBarcode(""); items.get(i).setPacketBarcode("");
items.get(i).setFlowReport(items.get(i).getFlowOrders()); items.get(i).setFlowReport(items.get(i).getFlowOrders());
gmnga = new BigDecimal(flowReportWorkDetailBean.getGmnga()).add(gmnga);
} }
Map<String, Object> saveItemRequestBean = new HashMap<>(); Map<String, Object> saveItemRequestBean = new HashMap<>();
saveItemRequestBean.put("imports", items); saveItemRequestBean.put("imports", items);
@ -897,7 +1001,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
} }
switch (selectDynamicFormBean.getFieldName()) { switch (selectDynamicFormBean.getFieldName()) {
case "PacketBarcode": case "PacketBarcode":
getBarcodeInfo(scanResult, selectDynamicFormBean);
break; break;
} }
} }
@ -961,6 +1065,7 @@ public class FlowReportWorkActivity extends CommonFunctionActivity {
/** /**
* 判断界面是否填写数据 * 判断界面是否填写数据
*
* @return * @return
*/ */
private boolean rvUiHaveData() { private boolean rvUiHaveData() {

16
app/src/main/java/com/techscan/wk/utils/BarAnalysisUtils.java

@ -1,5 +1,7 @@
package com.techscan.wk.utils; package com.techscan.wk.utils;
import android.text.TextUtils;
import com.techscan.wk.model.AnalysisBarBean; import com.techscan.wk.model.AnalysisBarBean;
/** /**
@ -14,21 +16,25 @@ public class BarAnalysisUtils {
* @return * @return
*/ */
public static boolean checkBarcodePresuffix(String barcode) { public static boolean checkBarcodePresuffix(String barcode) {
if (TextUtils.isEmpty(barcode)) return false;
if (!barcode.startsWith("[)>@06") || !barcode.endsWith("@@")) { if (!barcode.startsWith("[)>@06") || !barcode.endsWith("@@")) {
return false; return false;
} }
return true; return true;
} }
/** 流转单号 T10000194000001
/**
* 流转单号 T10000194000001
* 按规则解析条码 [)>@06@QRPART@10V101010@1P31107550@3SX001@1T20240724001@Q100@14D20240724@@ * 按规则解析条码 [)>@06@QRPART@10V101010@1P31107550@3SX001@1T20240724001@Q100@14D20240724@@
* @param barcode
*
* @param bar
* @return * @return
*/ */
public static AnalysisBarBean analysisBarcode(String barcode) {
barcode = barcode.replaceFirst("\\[\\)>@06@QRPART", "");
System.out.println(barcode);
public static AnalysisBarBean analysisBarcode(String bar) {
AnalysisBarBean bean = new AnalysisBarBean(); AnalysisBarBean bean = new AnalysisBarBean();
bean.setBarcode(bar);
String barcode = bar.replaceFirst("\\[\\)>@06@QRPART", "");
System.out.println(barcode);
//工厂 //工厂
// 查找@10V到下一个@之间的内容 // 查找@10V到下一个@之间的内容
int startIndex10V = barcode.indexOf("@10V"); int startIndex10V = barcode.indexOf("@10V");

2
app/src/main/res/values-en/strings.xml

@ -174,4 +174,6 @@
<string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">The material of the work order is inconsistent with that of the scanning code</string> <string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">The material of the work order is inconsistent with that of the scanning code</string>
<string name="Abnormal_cause">Error message</string> <string name="Abnormal_cause">Error message</string>
<string name="Please_confirm_the_new_password">Please confirm the new password</string> <string name="Please_confirm_the_new_password">Please confirm the new password</string>
<string name="The_order_number_is_inconsistent_please_confirm">The order number is inconsistent, please confirm</string>
<string name="Please_scan_the_package_barcode_first">Please scan the package barcode first</string>
</resources> </resources>

2
app/src/main/res/values-th-rTH/strings.xml

@ -174,4 +174,6 @@
<string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">วัสดุรายการเชิงพาณิชย์ไม่สอดคล้องกับการค้นหารหัสโปรดยืนยัน</string> <string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">วัสดุรายการเชิงพาณิชย์ไม่สอดคล้องกับการค้นหารหัสโปรดยืนยัน</string>
<string name="Abnormal_cause">ข้อความผิดพลาด</string> <string name="Abnormal_cause">ข้อความผิดพลาด</string>
<string name="Please_confirm_the_new_password">กรุณายืนยันรหัสใหม่</string> <string name="Please_confirm_the_new_password">กรุณายืนยันรหัสใหม่</string>
<string name="The_order_number_is_inconsistent_please_confirm">The order number is inconsistent, please confirm</string>
<string name="Please_scan_the_package_barcode_first">สแกนบาร์โค้ดก่อน</string>
</resources> </resources>

2
app/src/main/res/values/strings.xml

@ -185,5 +185,7 @@
<string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">工单物料与扫码物料不一致,请确认</string> <string name="The_material_of_the_work_order_is_inconsistent_with_that_of_the_scanning_code">工单物料与扫码物料不一致,请确认</string>
<string name="Abnormal_cause">错误消息</string> <string name="Abnormal_cause">错误消息</string>
<string name="Please_confirm_the_new_password">请确认新密码</string> <string name="Please_confirm_the_new_password">请确认新密码</string>
<string name="The_order_number_is_inconsistent_please_confirm">箱码订单号不一致,请确认</string>
<string name="Please_scan_the_package_barcode_first">请先扫描包条码</string>
</resources> </resources>

Loading…
Cancel
Save