diff --git a/app/build.gradle b/app/build.gradle index 46413f6..81627fa 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -48,4 +48,8 @@ dependencies { // https://mvnrepository.com/artifact/com.alibaba.fastjson2/fastjson2 implementation 'com.alibaba.fastjson2:fastjson2:2.0.45' + // https://mvnrepository.com/artifact/com.github.bumptech.glide/glide + implementation 'com.github.bumptech.glide:glide:4.16.0' + + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0588e69..6c677fc 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,9 +2,20 @@ - + + + + + - + + + + + + + + + - - + + - - + + - - - - - + + + + { + private List list; + private static Context context; + private LayoutInflater inflater; + private ItemClickCall clickCall; + public DisposalFileAdapter(Context context, ItemClickCall clickCall) { + this.context = context; + this.clickCall = clickCall; + inflater = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemDisposalImgBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_disposal_img, parent, false); + return new MyViewHolder(binding); + } + + // @SuppressLint("CheckResult") + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + var outstock = list.get(position); + var binding = holder.binding; + // binding.setVariable(BR.vm,outstock); + Glide.with(context) + .load(outstock.getFaultFile()) + .into(binding.disFile); + binding.disFile.setOnClickListener(v -> clickCall.onClick(position,true)); + binding.disposalDelect.setOnClickListener(v -> clickCall.onClick(position,false)); + } + + @Override + public int getItemCount() { + return list==null?0:list.size(); + } + + class MyViewHolder extends RecyclerView.ViewHolder { + private ItemDisposalImgBinding binding; + + public MyViewHolder(ItemDisposalImgBinding binding) { + super(binding.getRoot()); + this.binding = binding; + } + + + } + public interface ItemClickCall { + void onClick(int position,boolean type); + } +} diff --git a/app/src/main/java/com/example/jingyuan_mes/adapter/check/DisposalInfoAdapter.java b/app/src/main/java/com/example/jingyuan_mes/adapter/check/DisposalInfoAdapter.java new file mode 100644 index 0000000..2204102 --- /dev/null +++ b/app/src/main/java/com/example/jingyuan_mes/adapter/check/DisposalInfoAdapter.java @@ -0,0 +1,62 @@ +package com.example.jingyuan_mes.adapter.check; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.jingyuan_mes.BR; +import com.example.jingyuan_mes.R; +import com.example.jingyuan_mes.databinding.ItemDisposalBinding; +import com.example.jingyuan_mes.entity.check.CheckActivitieBeen; + +import java.util.List; + +/** + * @author wanghao + * @date 2024/3/12 14:32 + */ +public class DisposalInfoAdapter extends RecyclerView.Adapter { + + private Context context; + private List list; +private LayoutInflater from; + public DisposalInfoAdapter(Context context) { + this.context = context; + + from = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public MyViewHoder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemDisposalBinding binding= DataBindingUtil.inflate(from, R.layout.item_disposal,parent,false); + return new MyViewHoder(binding); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHoder holder, int position) { + holder.binding.setVariable(BR.vm,list.get(position)); + } + + @Override + public int getItemCount() { + return list==null?0:list.size(); + } + + public static class MyViewHoder extends RecyclerView.ViewHolder{ + private ItemDisposalBinding binding; + public MyViewHoder(ItemDisposalBinding binding) { + super(binding.getRoot()); + this.binding=binding; + } + } +} diff --git a/app/src/main/java/com/example/jingyuan_mes/base/BaseActivity.java b/app/src/main/java/com/example/jingyuan_mes/base/BaseActivity.java index 64aa162..07bf612 100644 --- a/app/src/main/java/com/example/jingyuan_mes/base/BaseActivity.java +++ b/app/src/main/java/com/example/jingyuan_mes/base/BaseActivity.java @@ -18,6 +18,7 @@ import androidx.appcompat.app.AppCompatActivity; import com.example.jingyuan_mes.uitls.SharedPreferencesUtils; import com.google.gson.Gson; +import java.text.SimpleDateFormat; import java.util.List; import okhttp3.MediaType; @@ -30,8 +31,9 @@ public class BaseActivity extends AppCompatActivity { public Gson gson; public MediaType JSON = MediaType.parse("application/json; charset=utf-8"); private MyReceiver myReceiver; - public String handle = "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjJlZDdiYmMyLWEyZDQtNGFkOS04OGQzLWViZGE5OGJiZTQ2NyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.M_ELTmvE5fM8nafH9XWMmVlFqTN23dUpvrgzSwozx52GfdVprzzPcZ-UvY_nCobVlR2lCQnzG2k5_vKWm_Qfnw"; + public String handle = "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VyX2tleSI6IjNkMjIxYzYzLWEyZGEtNDFlZi1iZjRmLWVlNjQwNTQxNmM5YyIsInVzZXJuYW1lIjoiYWRtaW4ifQ.erdvjHcWd6JDpy854nPauWeHdksSkIiv-GeRrpCjpdMBI5enOE-17ayCmTduS71_8Dg9DGtR4ZBLjLiwpuu9Jg"; public Context context; + public SimpleDateFormat format= new SimpleDateFormat( "yyyyMMdd_HHmmss"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/app/src/main/java/com/example/jingyuan_mes/check/CheckDisposalActivity.java b/app/src/main/java/com/example/jingyuan_mes/check/CheckDisposalActivity.java index e8fa11a..dcf2120 100644 --- a/app/src/main/java/com/example/jingyuan_mes/check/CheckDisposalActivity.java +++ b/app/src/main/java/com/example/jingyuan_mes/check/CheckDisposalActivity.java @@ -1,16 +1,200 @@ package com.example.jingyuan_mes.check; -import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; +import androidx.databinding.DataBindingUtil; +import android.Manifest; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; import android.os.Bundle; +import android.provider.MediaStore; +import android.view.View; +import android.widget.Toast; import com.example.jingyuan_mes.R; +import com.example.jingyuan_mes.adapter.check.DisposalFileAdapter; +import com.example.jingyuan_mes.adapter.check.DisposalInfoAdapter; +import com.example.jingyuan_mes.base.BaseActivity; +import com.example.jingyuan_mes.base.MyRecultCall; +import com.example.jingyuan_mes.base.MyResult; +import com.example.jingyuan_mes.databinding.ActivityCheckDisposalBinding; +import com.example.jingyuan_mes.dialog.ImgDialog; +import com.example.jingyuan_mes.entity.check.CheckActivitieBeen; +import com.example.jingyuan_mes.entity.check.CheckDisposalBeen; +import com.example.jingyuan_mes.entity.check.CheckInstanceFiles; +import com.example.jingyuan_mes.uitls.SharedPreferencesUtils; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; -public class CheckDisposalActivity extends AppCompatActivity { +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import okhttp3.RequestBody; + +public class CheckDisposalActivity extends BaseActivity implements DisposalFileAdapter.ItemClickCall { + private static final int CAMERA_PHOTO = 1; + private DisposalFileAdapter fileAdapter; + private List filesList; + private ActivityCheckDisposalBinding binding; + private DisposalInfoAdapter infoAdapter; + private ImgDialog imgDialog; + private List infoList; + private List files; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_check_disposal); + binding = DataBindingUtil.setContentView(this, R.layout.activity_check_disposal); + fileAdapter = new DisposalFileAdapter(this, this); + binding.setAdapter1(fileAdapter); + infoAdapter = new DisposalInfoAdapter(this); + binding.setAdapter2(infoAdapter); + imgDialog = new ImgDialog(this); + initRequest(); + } + + private void initRequest() { + OkGo.get(url + "/qms/mobile/getCheckResult4Handle").tag(this).headers("Authorization", SharedPreferencesUtils.getstring("access_token", "")).params("checkResultId", 2).params("materialBatch", "123").params("checkMode", 1).params("checkSample", "10").params("materialCode", "111").params("materialName", "物料测试").execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var body = response.body(); + if (body.getCode() == 200) { + CheckDisposalBeen been = gson.fromJson(body.getData().toString(), CheckDisposalBeen.class); + binding.setVm(been); + + infoList = been.getQmsQualityInstanceActivities(); + infoAdapter.setList(infoList); + infoAdapter.notifyDataSetChanged(); + filesList = been.getQmsCheckInstanceFiles(); + if (filesList == null || filesList.isEmpty()) { + binding.disposalFileAdd.setVisibility(View.VISIBLE); + filesList = new ArrayList<>(); + files = new ArrayList<>(); + fileAdapter.setList(filesList); + } else { + binding.disposalFileAdd.setVisibility(View.GONE); + // files = new ArrayList<>(); + fileAdapter.setList(filesList); + fileAdapter.notifyDataSetChanged(); + } + + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + }); + } + + // 图片的点击 + @Override + public void onClick(int position, boolean type) { + if (type) { + imgDialog.setRawReturn(filesList.get(position).getFaultFile()); + return; + } + filesList.remove(position); + fileAdapter.notifyDataSetChanged(); + } + + private Uri img_uri; + private File outputImage; + + // 点击拍照 + public void dispisalTackphoto(View view) { + try { + teke_photo(); + } catch (IOException e) { + throw new RuntimeException(e); + } } + + // 拍照 + private void teke_photo() throws IOException { + outputImage = new File(getExternalCacheDir(), "output_imgage" + format.format(new Date()) + ".jpg"); + outputImage.createNewFile(); + if (Build.VERSION.SDK_INT >= 24) { + img_uri = FileProvider.getUriForFile(this, "com.example.jingyuan_mes", outputImage); + } else { + img_uri = Uri.fromFile(outputImage); + } + if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)) { + Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); + intent.putExtra(MediaStore.EXTRA_OUTPUT, img_uri); + startActivityForResult(intent, CAMERA_PHOTO); + } else { + // 提示用户开户权限 拍照和读写sd卡权限 + String[] perms = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + ActivityCompat.requestPermissions(this, perms, CAMERA_PHOTO); + } + } + + // 拍照的回调 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (resultCode == RESULT_OK) { + CheckInstanceFiles checkInstanceFiles = new CheckInstanceFiles(); + var faultFile = img_uri.toString(); + checkInstanceFiles.setFaultFile(faultFile); + filesList.add(checkInstanceFiles); + fileAdapter.notifyDataSetChanged(); + Bitmap compressedImageBitmap = BitmapFactory.decodeFile(outputImage.getPath()); + // 选择压缩质量 + int quality = 10; + // 创建一个字节数组输出流 + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + // 将Bitmap压缩成JPEG格式,并将压缩后的数据保存到字节数组输出流中 + compressedImageBitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos); + // 将字节数组输出流中的数据转换为字节数组 + byte[] compressedImageData = baos.toByteArray(); + // 清空字节数组输出流 + baos.reset(); + // 将压缩后的字节数组保存到文件中 + FileOutputStream fos = null; + try { + fos = new FileOutputStream(outputImage); + fos.write(compressedImageData); + fos.flush(); + fos.close(); + files.add(outputImage); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + + } + } + + public void checkDisposalSubmit(View view) { + var been = infoList.get(infoList.size() - 1); + + OkGo.post(url + "/qms/mobile/handleQualityInstance").headers("Authorization", SharedPreferencesUtils.getstring("access_token", "")).params("checkResultId", "2").params("processActivityId", been.getProcessActivityId()).params("processHandleResolution", been.getProcessHandleResolution()).params("processStepOrder", been.getProcessStepOrder()).addFileParams("files", files).execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var body = response.body(); + if (body.getCode() == 200) { + // finish(); + } + Toast.makeText(context, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + }); + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/example/jingyuan_mes/dialog/ImgDialog.java b/app/src/main/java/com/example/jingyuan_mes/dialog/ImgDialog.java new file mode 100644 index 0000000..5019da5 --- /dev/null +++ b/app/src/main/java/com/example/jingyuan_mes/dialog/ImgDialog.java @@ -0,0 +1,42 @@ +package com.example.jingyuan_mes.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.view.LayoutInflater; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; + +import com.bumptech.glide.Glide; +import com.example.jingyuan_mes.R; +import com.example.jingyuan_mes.databinding.DialogImgBinding; +import com.example.jingyuan_mes.databinding.DialogReturnBinding; +import com.example.jingyuan_mes.entity.store.RawReturn; + +/** + * @author wanghao + * @date 2024/2/22 11:07 + */ +public class ImgDialog extends Dialog { + private DialogImgBinding binding; + + private Context context; + + public void setRawReturn(String url) { + Glide.with(context).load(url).into(binding.dialogImg); + binding.executePendingBindings(); + show(); + + } + + public ImgDialog(@NonNull Context context) { + super(context,R.style.dialog_style); + this.context=context; + binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.dialog_img, null, false); + setContentView(binding.getRoot()); + binding.dialogImgDis.setOnClickListener(v -> dismiss()); + } + + +} diff --git a/app/src/main/java/com/example/jingyuan_mes/dialog/StockReturnDialog.java b/app/src/main/java/com/example/jingyuan_mes/dialog/StockReturnDialog.java index 99974c7..fd6b8ad 100644 --- a/app/src/main/java/com/example/jingyuan_mes/dialog/StockReturnDialog.java +++ b/app/src/main/java/com/example/jingyuan_mes/dialog/StockReturnDialog.java @@ -26,7 +26,7 @@ public class StockReturnDialog extends Dialog { this.rawReturn = rawReturn; binding.setVm(rawReturn); binding.auditReason.setText(null); - // binding.executePendingBindings(); + binding.executePendingBindings(); } public StockReturnDialog(@NonNull Context context,StockReturnDialogCall stockReturnDialogCall) { diff --git a/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckActivitieBeen.java b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckActivitieBeen.java new file mode 100644 index 0000000..0ff69da --- /dev/null +++ b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckActivitieBeen.java @@ -0,0 +1,71 @@ +package com.example.jingyuan_mes.entity.check; + +import androidx.databinding.BaseObservable; + +/** + * @author wanghao + * @date 2024/3/11 10:12 + */ +public class CheckActivitieBeen extends BaseObservable{ + + + private String createBy; + private String createTime; + private String processHandleResolution; + private int processActivityId; + private int processStepOrder; + private boolean editedAble; + + + + public boolean isEditedAble() { + return editedAble; + } + + public void setEditedAble(boolean editedAble) { + this.editedAble = editedAble; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + + } + + public String getProcessHandleResolution() { + return processHandleResolution; + } + + public void setProcessHandleResolution(String processHandleResolution) { + this.processHandleResolution = processHandleResolution; + } + + public int getProcessActivityId() { + return processActivityId; + } + + public void setProcessActivityId(int processActivityId) { + this.processActivityId = processActivityId; + } + + public int getProcessStepOrder() { + return processStepOrder; + } + + public void setProcessStepOrder(int processStepOrder) { + this.processStepOrder = processStepOrder; + } + + +} diff --git a/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckDisposalBeen.java b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckDisposalBeen.java new file mode 100644 index 0000000..4571025 --- /dev/null +++ b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckDisposalBeen.java @@ -0,0 +1,129 @@ +package com.example.jingyuan_mes.entity.check; + +import java.util.List; + +/** + * @author wanghao + * @date 2024/3/11 10:09 + */ +public class CheckDisposalBeen { + + /** + * batchAmount : 0 + * passAmount : 0 + * failAmount : 1 + * checkMode : 1 + * checkSample : 10 + * materialCode : 111 + * materialName : 物料测试 + */ + + private int batchAmount; + private int passAmount; + private int failAmount; + private String checkMode; + private int checkSample; + private String materialCode; + private String materialName; + private List qmsCheckInstanceFiles; + private String checkRuleType; + private List qmsQualityInstanceActivities; + /** + * 1来料检验,2,半成品检验,3成品检验,4工序检验 + * + * @return + */ + public String getCheckRuleType() { + if (checkRuleType==null){ + return null; + } + switch (checkRuleType) { + case "1": + return "来料检验"; + case "2": + return "半成品检验"; + case "3": + return "成品检验"; + case "4": + return "工序检验"; + } + return checkRuleType; + } + + public List getQmsQualityInstanceActivities() { + return qmsQualityInstanceActivities; + } + + public void setQmsQualityInstanceActivities(List qmsQualityInstanceActivities) { + this.qmsQualityInstanceActivities = qmsQualityInstanceActivities; + } + + public void setCheckRuleType(String checkRuleType) { + this.checkRuleType = checkRuleType; + } + + public List getQmsCheckInstanceFiles() { + return qmsCheckInstanceFiles; + } + + public void setQmsCheckInstanceFiles(List qmsCheckInstanceFiles) { + this.qmsCheckInstanceFiles = qmsCheckInstanceFiles; + } + + public int getBatchAmount() { + return batchAmount; + } + + public void setBatchAmount(int batchAmount) { + this.batchAmount = batchAmount; + } + + public int getPassAmount() { + return passAmount; + } + + public void setPassAmount(int passAmount) { + this.passAmount = passAmount; + } + + public int getFailAmount() { + return failAmount; + } + + public void setFailAmount(int failAmount) { + this.failAmount = failAmount; + } + + public String getCheckMode() { + + return checkMode.equals("1") ? "全检" : "抽检"; + } + + public void setCheckMode(String checkMode) { + this.checkMode = checkMode; + } + + public int getCheckSample() { + return checkSample; + } + + public void setCheckSample(int checkSample) { + this.checkSample = checkSample; + } + + public String getMaterialCode() { + return materialCode; + } + + public void setMaterialCode(String materialCode) { + this.materialCode = materialCode; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } +} diff --git a/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckInstanceFiles.java b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckInstanceFiles.java new file mode 100644 index 0000000..ebc2e88 --- /dev/null +++ b/app/src/main/java/com/example/jingyuan_mes/entity/check/CheckInstanceFiles.java @@ -0,0 +1,26 @@ +package com.example.jingyuan_mes.entity.check; + +import androidx.databinding.BaseObservable; + +/** + * @author wanghao + * @date 2024/3/11 10:00 + */ +public class CheckInstanceFiles extends BaseObservable { + private String faultFile; + + public String getFaultFile() { + return faultFile; + } + + public void setFaultFile(String faultFile) { + this.faultFile = faultFile; + } + + @Override + public String toString() { + return "CheckInstanceFiles{" + + "faultFile='" + faultFile + '\'' + + '}'; + } +} diff --git a/app/src/main/res/layout/activity_check_disposal.xml b/app/src/main/res/layout/activity_check_disposal.xml index fc1d107..06ebc2c 100644 --- a/app/src/main/res/layout/activity_check_disposal.xml +++ b/app/src/main/res/layout/activity_check_disposal.xml @@ -11,11 +11,14 @@ + type="com.example.jingyuan_mes.entity.check.CheckDisposalBeen" /> + name="adapter1" + type="com.example.jingyuan_mes.adapter.check.DisposalFileAdapter" /> + @@ -61,14 +64,13 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" - android:text="@{vm.checkRuleType}" /> + android:text="@{vm.checkRuleType}"/> + android:paddingLeft="40dp" + android:text="@{String.valueOf(vm.batchAmount)}" /> + android:text="@{String.valueOf(vm.passAmount)}" /> @@ -149,38 +150,9 @@ style="@style/item_info" android:layout_width="55dp" android:layout_height="match_parent" - android:text="@{vm.checkStatus}" /> + android:text="@{String.valueOf(vm.failAmount)}" /> - - - - - - - + + + android:layout_height="match_parent" + android:layout_weight="1" + android:adapter="@{adapter1}" + android:orientation="horizontal" + android:paddingLeft="5dp" + android:paddingRight="5dp" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> + + + + android:adapter="@{adapter2}" + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" /> +