From 8918b063d9931361cbaea6202d8c42888f7c003a Mon Sep 17 00:00:00 2001 From: wanghao Date: Wed, 19 Feb 2025 15:01:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E5=8E=9F=E6=9D=90?= =?UTF-8?q?=E6=96=99=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 6 +- .../example/haiwei_mom/HomePageActivity.java | 3 + .../haiwei_mom/adapter/CheckAdapter.java | 82 ++++++ .../example/haiwei_mom/data/RawInstock.java | 5 +- .../example/haiwei_mom/qm/CheckActivity.java | 270 ++++++++++++++++++ .../haiwei_mom/qm/data/CheckViewModel.java | 98 +++++++ .../haiwei_mom/qm/data/DefectBeen.java | 153 ++++++++++ .../haiwei_mom/wms/raw/RawInActivity.java | 40 ++- app/src/main/res/layout/activity_check.xml | 153 ++++++++++ app/src/main/res/layout/item_layout.xml | 62 ++++ app/src/main/res/mipmap-xhdpi/icon_select.png | Bin 0 -> 466 bytes 12 files changed, 858 insertions(+), 15 deletions(-) create mode 100644 app/src/main/java/com/example/haiwei_mom/adapter/CheckAdapter.java create mode 100644 app/src/main/java/com/example/haiwei_mom/qm/CheckActivity.java create mode 100644 app/src/main/java/com/example/haiwei_mom/qm/data/CheckViewModel.java create mode 100644 app/src/main/java/com/example/haiwei_mom/qm/data/DefectBeen.java create mode 100644 app/src/main/res/layout/activity_check.xml create mode 100644 app/src/main/res/layout/item_layout.xml create mode 100644 app/src/main/res/mipmap-xhdpi/icon_select.png diff --git a/app/build.gradle b/app/build.gradle index 9667468..6545b93 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -56,4 +56,5 @@ dependencies { implementation 'com.github.bumptech.glide:glide:4.16.0' implementation 'io.github.scwang90:refresh-layout-kernel:2.0.6' //核心必须依赖 implementation 'io.github.scwang90:refresh-footer-classics:2.0.6' //经典加载 + implementation 'com.contrarywind:Android-PickerView:4.1.9' } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index da2881d..87d0e94 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + xmlns:app="http://schemas.android.com/apk/res-auto"> + diff --git a/app/src/main/java/com/example/haiwei_mom/HomePageActivity.java b/app/src/main/java/com/example/haiwei_mom/HomePageActivity.java index 904a133..2ad64d5 100644 --- a/app/src/main/java/com/example/haiwei_mom/HomePageActivity.java +++ b/app/src/main/java/com/example/haiwei_mom/HomePageActivity.java @@ -13,6 +13,7 @@ import com.example.haiwei_mom.base.MyResult; import com.example.haiwei_mom.data.MenuBeen; import com.example.haiwei_mom.data.PdaRouters; import com.example.haiwei_mom.databinding.ActivityHomePageBinding; +import com.example.haiwei_mom.qm.CheckActivity; import com.example.haiwei_mom.uitls.SharedPreferencesUtils; import com.example.haiwei_mom.wms.product.BindVehicleActivity; import com.example.haiwei_mom.wms.product.ProductInActivity; @@ -58,6 +59,8 @@ public class HomePageActivity extends BaseActivity implements ItemClickCall { map.put("原材料出库", RawReturnActivity.class); map.put("原材料盘点", RawReturnActivity.class); map.put("原材料退库", RawReturnActivity.class); + map.put("制品质检", CheckActivity.class); + map.put("制品复检", CheckActivity.class); } private void initRequest() { diff --git a/app/src/main/java/com/example/haiwei_mom/adapter/CheckAdapter.java b/app/src/main/java/com/example/haiwei_mom/adapter/CheckAdapter.java new file mode 100644 index 0000000..2e2d9de --- /dev/null +++ b/app/src/main/java/com/example/haiwei_mom/adapter/CheckAdapter.java @@ -0,0 +1,82 @@ +package com.example.haiwei_mom.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.haiwei_mom.BR; +import com.example.haiwei_mom.R; +import com.example.haiwei_mom.databinding.ItemLayoutBinding; +import com.example.haiwei_mom.qm.data.DefectBeen; + +import java.util.List; + +/** + * @author wanghao + * @date 2023/11/17 17:15 + */ +public class CheckAdapter extends RecyclerView.Adapter { + private Context context; + private List list; + private LayoutInflater from; + private CheckItemClickCall checkItemClickCall; + + public CheckAdapter(Context context, CheckItemClickCall checkItemClickCall) { + this.context = context; + this.checkItemClickCall = checkItemClickCall; + from = LayoutInflater.from(context); + } + + public void setList(List list) { + this.list = list; + } + + @NonNull + @Override + public CheckAdapterVH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + ItemLayoutBinding inflate1 = DataBindingUtil.inflate(from, R.layout.item_layout, parent, false); + return new CheckAdapterVH(inflate1); + } + + @Override + public void onBindViewHolder(@NonNull CheckAdapterVH holder, int position) { + DefectBeen defectBeen = list.get(position); + defectBeen.setIndex(position + 1); + ItemLayoutBinding databing = holder.getInflate1(); + databing.setVariable(BR.item, defectBeen); + databing.itemButtom.setOnClickListener(t -> { + checkItemClickCall.onClick(position); + }); + + databing.executePendingBindings(); + } + + @Override + public int getItemCount() { + return list == null ? 0 : list.size(); + } + + class CheckAdapterVH extends RecyclerView.ViewHolder { + private ItemLayoutBinding inflate1; + + public ItemLayoutBinding getInflate1() { + return inflate1; + } + + public CheckAdapterVH(ItemLayoutBinding inflate1) { + super(inflate1.getRoot()); + this.inflate1 = inflate1; + } + + + } + + public interface CheckItemClickCall { + void onClick(int positon); + } + +} diff --git a/app/src/main/java/com/example/haiwei_mom/data/RawInstock.java b/app/src/main/java/com/example/haiwei_mom/data/RawInstock.java index 953cc1c..823f691 100644 --- a/app/src/main/java/com/example/haiwei_mom/data/RawInstock.java +++ b/app/src/main/java/com/example/haiwei_mom/data/RawInstock.java @@ -78,7 +78,10 @@ public class RawInstock extends BaseObservable { return materialQty; } - + public void setMaterialQty(double materialQty) { + this.materialQty = materialQty; + notifyChange(); + } /** * 物料大类 diff --git a/app/src/main/java/com/example/haiwei_mom/qm/CheckActivity.java b/app/src/main/java/com/example/haiwei_mom/qm/CheckActivity.java new file mode 100644 index 0000000..cda915b --- /dev/null +++ b/app/src/main/java/com/example/haiwei_mom/qm/CheckActivity.java @@ -0,0 +1,270 @@ +package com.example.haiwei_mom.qm; + +import android.content.Intent; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.widget.Toast; + +import androidx.databinding.DataBindingUtil; + + +import com.bigkoo.pickerview.builder.OptionsPickerBuilder; +import com.bigkoo.pickerview.listener.OnOptionsSelectListener; +import com.bigkoo.pickerview.view.OptionsPickerView; +import com.example.haiwei_mom.R; +import com.example.haiwei_mom.adapter.CheckAdapter; +import com.example.haiwei_mom.base.BaseActivity; + +import com.example.haiwei_mom.base.MyRecultCall; +import com.example.haiwei_mom.base.MyResult; +import com.example.haiwei_mom.databinding.ActivityCheckBinding; +import com.example.haiwei_mom.qm.data.CheckViewModel; +import com.example.haiwei_mom.qm.data.DefectBeen; +import com.example.haiwei_mom.uitls.SharedPreferencesUtils; +import com.google.gson.reflect.TypeToken; +import com.lzy.okgo.OkGo; +import com.lzy.okgo.model.Response; + + +import java.util.ArrayList; +import java.util.List; + +import okhttp3.RequestBody; + +public class CheckActivity extends BaseActivity implements CheckAdapter.CheckItemClickCall/*, AdapterView.OnItemClickListener*/, OnOptionsSelectListener/*, RepaitSubmintInfoAdapter.CheckItemClickCall*/ { + private CheckViewModel checkViewModel; + + // private RepairSubmintInfoDialog tipDialog; + private CheckAdapter checkAdapter; + private List list; + private List submitList;// 提交缺陷列表 + private OptionsPickerView opv; + private List options1; + private List> options2; + private List>> options3; + private List topDefects; + private String stationCode; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initView(); + Intent intent = getIntent(); + stationCode = intent.getStringExtra("stationCode"); + // 查询检测 + initStationSum(); + checkViewModel.setStationCode(stationCode); + // binding.setTitle("质量检测 - " + intent.getStringExtra("stationName")); + // 三联 + initOptionpb(stationCode); + // tipDialog = new RepairSubmintInfoDialog(this, this); + } + + private void initView() { + ActivityCheckBinding binding=DataBindingUtil.setContentView(this, R.layout.activity_check); + checkViewModel = new CheckViewModel(); + + binding.setVm(checkViewModel); + checkAdapter = new CheckAdapter(this, this); + submitList = new ArrayList<>(); + checkAdapter.setList(submitList); + binding.recyclerView.setAdapter(checkAdapter); + + } + + private void initStationSum() { + OkGo.post(url + "/api/pdaQueryQuantityNumber").tag(this) + + .params("stationCode", stationCode) + .execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var result = response.body(); + if (result.getCode() == 200) { + var data = result.getData(); + if (data !=null){ + // CheckSum checkSum1= gson.fromJson(data.toString(),CheckSum.class); + // checkSum.setQUANTITY_SUM(checkSum1.getQUANTITY_SUM()); + // checkSum.setREPAIR_SUM(checkSum1.getREPAIR_SUM()); + } + } + } + + }); + } + + @Override + public void getScannerData(String code) { + super.getScannerData(code); + + checkViewModel.setCode(code); + OkGo.post(url + "/api/check/query").tag(this) + + .params("code", code) + .params("station", stationCode) + .execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var result = response.body(); + if (result.getCode() == 200) { + checkViewModel.setName(result.getMsg()); + topDefects = gson.fromJson(gson.toJson(result.getData()), new TypeToken>() { + }.getType()); + if (topDefects == null || topDefects.isEmpty()) { + Toast.makeText(CheckActivity.this, "本工位无需检查返修情况", Toast.LENGTH_SHORT).show(); + return; + } + checkViewModel.setButtonVisbleState(true); + // tipDialog.setList(topDefects); + // tipDialog.show(); + + /*// 直接添加提交数据中submitList.addAll(defectBeens); + checkAdapter.notifyDataSetChanged();*/ + } else { + Toast.makeText(CheckActivity.this, result.getMsg(), Toast.LENGTH_SHORT).show(); + } + } + }); + } + + // 弹出选择框 + public void checkSelect(View view) { + opv.show(); + } + + // 弹出返修 + // public void selectRepair(View view) { + // tipDialog.show(); + // } + + + + public void checkSubmint1(View view) { + getScannerData("B24031483025025351528"); + } // 提交 + public void checkSubmint(View view) { + if (checkViewModel.getName() == null || checkViewModel.getName().isEmpty()) return; + checkViewModel.setList(submitList); + checkViewModel.setMeasure(submitList.isEmpty() ? "3" : "1"); + checkViewModel.setUserName(SharedPreferencesUtils.getstring("loginName", "pda01")); + checkViewModel.setTeamCode(SharedPreferencesUtils.getstring("teamCode", null)); + OkGo.post(url + "/api/checkSubmit").tag(this) + .upRequestBody(RequestBody.create(JSON, gson.toJson(checkViewModel))) + .execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var result = response.body(); + if (result.getCode() == 200) { + Toast.makeText(CheckActivity.this, "提交成功", Toast.LENGTH_SHORT).show(); + checkViewModel.setCode(null); + checkViewModel.setName(null); + checkViewModel.setDefect(null); + checkViewModel.setButtonVisbleState(false); + submitList.clear(); + checkAdapter.notifyDataSetChanged(); + initStationSum(); + } else { + Toast.makeText(CheckActivity.this, result.getMsg(), Toast.LENGTH_SHORT).show(); + } + } + }); + } + + // 删除缺陷 + @Override + public void onClick(int positon) { + Log.e("TAG", "列表点击:" + positon); + submitList.remove(positon); + checkAdapter.notifyDataSetChanged(); + } + + // 初始化-联动选择 + private void initOptionpb(String stationCode) { + opv = new OptionsPickerBuilder(this, this).build(); + OkGo.get(url + "/base/qualityInspectionItem/getQualityDefects/" + stationCode).tag(this) + .execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var body = response.body(); + Log.e("TAG", "onSuccess:" + body.toString()); + if (body.getCode() == 200) { + Toast.makeText(CheckActivity.this, "请求成功", Toast.LENGTH_SHORT).show(); + list = gson.fromJson(gson.toJson(body.getData()), new TypeToken>() { + }.getType()); + if (list == null || list.isEmpty()) { + Toast.makeText(CheckActivity.this, "缺陷列表没有维护", Toast.LENGTH_SHORT).show(); + return; + } + options1 = new ArrayList<>(); + options2 = new ArrayList<>(); + options3 = new ArrayList<>(); + list.forEach(defect -> { + String materialCategories = defect.getMaterialCategories(); + String materialSubclass = defect.getMaterialSubclass(); + String qualityDefectName = defect.getQualityDefectName(); + + if (!options1.contains(materialCategories)) { + options1.add(materialCategories); + } + int index1 = options1.indexOf(materialCategories); + if (options2.size() <= index1) { + options2.add(new ArrayList<>()); + } + if (!options2.get(index1).contains(materialSubclass)) { + options2.get(index1).add(materialSubclass); + } + int index2 = options2.get(index1).indexOf(materialSubclass); + if (options3.size() <= index1) { + options3.add(new ArrayList<>()); + } + if (options3.get(index1).size() <= index2) { + options3.get(index1).add(new ArrayList<>()); + } + if (!options3.get(index1).get(index2).contains(qualityDefectName)) { + options3.get(index1).get(index2).add(qualityDefectName); + } + }); + opv.setPicker(options1, options2, options3); + } else { + Toast.makeText(CheckActivity.this, body.getMsg(), Toast.LENGTH_SHORT).show(); + } + } + + }); + } + + // 三联添加 + @Override + public void onOptionsSelect(int options1, int options2, int options3, View v) { + String defectName = this.options3.get(options1).get(options2).get(options3); + checkViewModel.setDefect(defectName); + DefectBeen defectBeen = new DefectBeen(); + defectBeen.setQualityDefectName(defectName); + DefectBeen defectBeen1 = list.get(list.indexOf(defectBeen)); + if (submitList.contains(defectBeen1)) { + Toast.makeText(this, "已经添加了", Toast.LENGTH_SHORT).show(); + return; + } + submitList.add(defectBeen1); + checkAdapter.notifyDataSetChanged(); + } + + // 返修添加提交数据中 + // @Override + // public void submintRepair(int positon) { + // DefectBeen defectBeen = topDefects.get(positon); + // if (submitList.contains(defectBeen)) { + // Toast.makeText(this, "已经添加了", Toast.LENGTH_SHORT).show(); + // return; + // } + // Log.e("TAG", "返修提交的ID:" + defectBeen.getObjId()); + // submitList.add(defectBeen); + // checkAdapter.notifyDataSetChanged(); + // Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); + // } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/haiwei_mom/qm/data/CheckViewModel.java b/app/src/main/java/com/example/haiwei_mom/qm/data/CheckViewModel.java new file mode 100644 index 0000000..8c15243 --- /dev/null +++ b/app/src/main/java/com/example/haiwei_mom/qm/data/CheckViewModel.java @@ -0,0 +1,98 @@ +package com.example.haiwei_mom.qm.data; + +import androidx.databinding.BaseObservable; + + + +import java.util.List; + +/** + * @author wanghao + * @date 2023/11/17 16:26 + */ +public class CheckViewModel extends BaseObservable { + private String code;//产品条码 + private String name;//产品型号 + private List list;//缺陷列表 + private String stationCode;//人的工位编码 + private String userName; + private String measure;//处置措施 3=放行,1=返修 + private String teamCode;//班组编号 + private boolean buttonVisbleState=false; + private String defect; + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + notifyChange(); + } + + public String getMeasure() { + return measure; + } + + public void setMeasure(String measure) { + this.measure = measure; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + notifyChange(); + } + + public String getDefect() { + return defect; + } + + public void setDefect(String defect) { + this.defect = defect; + notifyChange(); + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public boolean isButtonVisbleState() { + return buttonVisbleState; + } + + public void setButtonVisbleState(boolean buttonVisbleState) { + this.buttonVisbleState = buttonVisbleState; + notifyChange(); + } + + public String getTeamCode() { + return teamCode; + } + + public void setTeamCode(String teamCode) { + this.teamCode = teamCode; + } +} diff --git a/app/src/main/java/com/example/haiwei_mom/qm/data/DefectBeen.java b/app/src/main/java/com/example/haiwei_mom/qm/data/DefectBeen.java new file mode 100644 index 0000000..10d4157 --- /dev/null +++ b/app/src/main/java/com/example/haiwei_mom/qm/data/DefectBeen.java @@ -0,0 +1,153 @@ +package com.example.haiwei_mom.qm.data; + +import androidx.databinding.BaseObservable; + +import java.util.Objects; + +/** + * @author wanghao + * @date 2023/11/17 17:00 + */ +public class DefectBeen extends BaseObservable { + + + + private int index; + private int objId; + private String materialName; + private String materialCategories; + private String materialSubclass; + + private String stationCode; + private String qualityDefectCode; + private String qualityDefectName; + private String processResult;//返修结果 + private String productLineName;//pda 工位名称 + private String productLineCode; + + private String inspectorTime; + + public String getInspectorTime() { + return inspectorTime; + } + + public void setInspectorTime(String inspectorTime) { + this.inspectorTime = inspectorTime; + } + + public String getProductLineCode() { + return productLineCode; + } + + public void setProductLineCode(String productLineCode) { + this.productLineCode = productLineCode; + } + + public String getProductLineName() { + return productLineName; + } + + public void setProductLineName(String productLineName) { + this.productLineName = productLineName; + } + + public void setIndex(int index) { + this.index = index; + } + + public String getStationCode() { + return stationCode; + } + + public void setStationCode(String stationCode) { + this.stationCode = stationCode; + } + + public String getProcessResult() { + return processResult; + } + + public void setProcessResult(String processResult) { + this.processResult = processResult; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DefectBeen that = (DefectBeen) o; + + return Objects.equals(qualityDefectName, that.qualityDefectName); + } + + @Override + public int hashCode() { + return qualityDefectName != null ? qualityDefectName.hashCode() : 0; + } + + public int getObjId() { + return objId; + } + + public void setObjId(int objId) { + this.objId = objId; + } + + public int getIndex() { + return index; + } + + public String getMaterialCategories() { + return materialCategories; + } + + public void setMaterialCategories(String materialCategories) { + this.materialCategories = materialCategories; + } + + public String getMaterialSubclass() { + return materialSubclass; + } + + public void setMaterialSubclass(String materialSubclass) { + this.materialSubclass = materialSubclass; + } + + public String getQualityDefectCode() { + return qualityDefectCode; + } + + public void setQualityDefectCode(String qualityDefectCode) { + this.qualityDefectCode = qualityDefectCode; + } + + public String getQualityDefectName() { + return qualityDefectName; + } + + public void setQualityDefectName(String qualityDefectName) { + this.qualityDefectName = qualityDefectName; + } + + public String getMaterialName() { + return materialName; + } + + public void setMaterialName(String materialName) { + this.materialName = materialName; + } + + @Override + public String toString() { + return "DefectBeen{" + + "index=" + index + + ", objId=" + objId + + // ", materialName='" + materialName + '\'' + + // ", materialCategories='" + materialCategories + '\'' + + // ", materialSubclass='" + materialSubclass + '\'' + + ", qualityDefectCode='" + qualityDefectCode + '\'' + + ", qualityDefectName='" + qualityDefectName + '\'' + + '}'; + } +} diff --git a/app/src/main/java/com/example/haiwei_mom/wms/raw/RawInActivity.java b/app/src/main/java/com/example/haiwei_mom/wms/raw/RawInActivity.java index 4976cb3..d3f9290 100644 --- a/app/src/main/java/com/example/haiwei_mom/wms/raw/RawInActivity.java +++ b/app/src/main/java/com/example/haiwei_mom/wms/raw/RawInActivity.java @@ -6,6 +6,7 @@ import androidx.databinding.DataBindingUtil; import android.os.Bundle; import android.view.View; import android.widget.EditText; +import android.widget.Toast; import com.example.haiwei_mom.R; import com.example.haiwei_mom.base.BaseActivity; @@ -66,19 +67,32 @@ public class RawInActivity extends BaseActivity implements View.OnFocusChangeLis } public void rawinSubmit(View view) { - OkGo.post(url + "/wms/pda/semi/submitOutInfo") - .upRequestBody(RequestBody.create(JSON, gson.toJson(rawInstock))) - .execute(new MyRecultCall(dialog, this) { - @Override - public void onSuccess(Response response) { - super.onSuccess(response); - var body = response.body(); - if (body.getCode() == 200) { + if (rawInstock == null) { + return; + } + var instockQty = rawInstock.getInstockQty(); + if (instockQty == null || instockQty.isEmpty()) return; - finish(); - } - myToastUitls.show(body.getMsg()); - } - }); + var parseDouble = Double.parseDouble(instockQty); + if (parseDouble > rawInstock.getMaterialQty()) { + myToastUitls.show("输入数量不能超过条码数量"); + return; + } + OkGo.post(url + "/wms/pda/raw/inSubmit").upRequestBody(RequestBody.create(JSON, gson.toJson(rawInstock))).execute(new MyRecultCall(dialog, this) { + @Override + public void onSuccess(Response response) { + super.onSuccess(response); + var body = response.body(); + if (body.getCode() == 200) { + rawInstock.setInstockQty(null); + rawInstock.setLocationCode(null); + rawInstock.setMaterialQty(rawInstock.getMaterialQty() - parseDouble); + // finish(); + Toast.makeText(RawInActivity.this, "入库成功", Toast.LENGTH_SHORT).show(); + return; + } + myToastUitls.show(body.getMsg()); + } + }); } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_check.xml b/app/src/main/res/layout/activity_check.xml new file mode 100644 index 0000000..b18ff27 --- /dev/null +++ b/app/src/main/res/layout/activity_check.xml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +