diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_equipment_detail.xml b/app/src/main/res/layout/activity_equipment_detail.xml index 7254762..f0b3028 100644 --- a/app/src/main/res/layout/activity_equipment_detail.xml +++ b/app/src/main/res/layout/activity_equipment_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_equipment_detail.xml b/app/src/main/res/layout/activity_equipment_detail.xml index 7254762..f0b3028 100644 --- a/app/src/main/res/layout/activity_equipment_detail.xml +++ b/app/src/main/res/layout/activity_equipment_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_equipment_detail.xml b/app/src/main/res/layout/activity_equipment_detail.xml index 7254762..f0b3028 100644 --- a/app/src/main/res/layout/activity_equipment_detail.xml +++ b/app/src/main/res/layout/activity_equipment_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability_reasult.xml b/app/src/main/res/layout/activity_search_capability_reasult.xml new file mode 100644 index 0000000..068a33c --- /dev/null +++ b/app/src/main/res/layout/activity_search_capability_reasult.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d6bb4b..78b3de2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,10 +48,14 @@ - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_equipment_detail.xml b/app/src/main/res/layout/activity_equipment_detail.xml index 7254762..f0b3028 100644 --- a/app/src/main/res/layout/activity_equipment_detail.xml +++ b/app/src/main/res/layout/activity_equipment_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability_reasult.xml b/app/src/main/res/layout/activity_search_capability_reasult.xml new file mode 100644 index 0000000..068a33c --- /dev/null +++ b/app/src/main/res/layout/activity_search_capability_reasult.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_standard_device_detail.xml b/app/src/main/res/layout/activity_standard_device_detail.xml index b711b87..211f4d7 100644 --- a/app/src/main/res/layout/activity_standard_device_detail.xml +++ b/app/src/main/res/layout/activity_standard_device_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> - - - - + + + + + + + + +) : RecyclerView.Adapter() { + + private var layoutInflater: LayoutInflater = LayoutInflater.from(context) + + override fun getItemCount(): Int = dataRows.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ItemViewHolder( + layoutInflater.inflate(R.layout.item_capability_rv_l, parent, false) + ) + + override fun onBindViewHolder(holder: ItemViewHolder, position: Int) { + //绑定数据 + val rowsBean = dataRows[position] + holder.capabilityNameView.text = rowsBean.priceName + holder.categoryView.text = rowsBean.categoryName + holder.projectView.text = rowsBean.priceItem + holder.priceView.text = rowsBean.price.toString() + + //绑定事件 + holder.itemView.setOnClickListener { + listener?.onItemClicked(position) + } + } + + inner class ItemViewHolder(view: View) : RecyclerView.ViewHolder(view) { + var capabilityNameView: TextView = view.findViewById(R.id.capabilityNameView) + var categoryView: TextView = view.findViewById(R.id.categoryView) + var projectView: TextView = view.findViewById(R.id.projectView) + var priceView: TextView = view.findViewById(R.id.priceView) + } + + private var listener: OnItemClickListener? = null + + interface OnItemClickListener { + fun onItemClicked(position: Int) + } + + fun setOnItemClickListener(onClickListener: OnItemClickListener?) { + this.listener = onClickListener + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt index 6c4c80c..cdc9762 100644 --- a/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt +++ b/app/src/main/java/com/casic/xz/meterage/fragment/HomePageFragment.kt @@ -5,6 +5,7 @@ import com.casic.xz.meterage.R import com.casic.xz.meterage.adapter.HomeGridAdapter import com.casic.xz.meterage.utils.LocaleConstant +import com.casic.xz.meterage.view.home.CapabilityActivity import com.casic.xz.meterage.view.home.EquipmentActivity import com.casic.xz.meterage.view.home.StandardDeviceActivity import com.casic.xz.meterage.view.notice.NoticeListActivity @@ -45,7 +46,7 @@ // "委托需求" -> requireContext().navigatePageTo() // "访客" -> requireContext().navigatePageTo() // "标准规范" -> requireContext().navigatePageTo() -// "能力列表" -> requireContext().navigatePageTo() + "能力列表" -> requireContext().navigatePageTo() // "计量培训" -> requireContext().navigatePageTo() // "合同发票" -> requireContext().navigatePageTo() // "业务统计" -> requireContext().navigatePageTo() diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java new file mode 100644 index 0000000..32ecaf1 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityDetailModel.java @@ -0,0 +1,215 @@ +package com.casic.xz.meterage.model; + +public class CapabilityDetailModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static class DataModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private int isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getIsDel() { + return isDel; + } + + public void setIsDel(int isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java new file mode 100644 index 0000000..ee308ad --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/model/CapabilityListModel.java @@ -0,0 +1,311 @@ +package com.casic.xz.meterage.model; + +import java.util.List; + +public class CapabilityListModel { + + private int code; + private DataModel data; + private String message; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public DataModel getData() { + return data; + } + + public void setData(DataModel data) { + this.data = data; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + //TODO orders字段后期需要调整 + public static class DataModel { + private String countId; + private String current; + private String maxLimit; + private boolean optimizeCountSql; + private List orders; + private String pages; + private List records; + private boolean searchCount; + private String size; + private String total; + + public String getCountId() { + return countId; + } + + public void setCountId(String countId) { + this.countId = countId; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getMaxLimit() { + return maxLimit; + } + + public void setMaxLimit(String maxLimit) { + this.maxLimit = maxLimit; + } + + public boolean isOptimizeCountSql() { + return optimizeCountSql; + } + + public void setOptimizeCountSql(boolean optimizeCountSql) { + this.optimizeCountSql = optimizeCountSql; + } + + public List getOrders() { + return orders; + } + + public void setOrders(List orders) { + this.orders = orders; + } + + public String getPages() { + return pages; + } + + public void setPages(String pages) { + this.pages = pages; + } + + public List getRecords() { + return records; + } + + public void setRecords(List records) { + this.records = records; + } + + public boolean isSearchCount() { + return searchCount; + } + + public void setSearchCount(boolean searchCount) { + this.searchCount = searchCount; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getTotal() { + return total; + } + + public void setTotal(String total) { + this.total = total; + } + + public static class RecordsModel { + private String categoryName; + private String checkType; + private String createTime; + private String directorDiscountPermission; + private String historicalPriceList; + private String id; + private String isDel; + private String itemName; + private String model; + private String operatorDiscountPermission; + private String price; + private String priceDescription; + private String priceItem; + private String priceLimit; + private String priceName; + private String priceNo; + private String priceStandard; + private String priceType; + private String remark; + private String updateTime; + + public String getCategoryName() { + return categoryName; + } + + public void setCategoryName(String categoryName) { + this.categoryName = categoryName; + } + + public String getCheckType() { + return checkType; + } + + public void setCheckType(String checkType) { + this.checkType = checkType; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public String getDirectorDiscountPermission() { + return directorDiscountPermission; + } + + public void setDirectorDiscountPermission(String directorDiscountPermission) { + this.directorDiscountPermission = directorDiscountPermission; + } + + public String getHistoricalPriceList() { + return historicalPriceList; + } + + public void setHistoricalPriceList(String historicalPriceList) { + this.historicalPriceList = historicalPriceList; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getIsDel() { + return isDel; + } + + public void setIsDel(String isDel) { + this.isDel = isDel; + } + + public String getItemName() { + return itemName; + } + + public void setItemName(String itemName) { + this.itemName = itemName; + } + + public String getModel() { + return model; + } + + public void setModel(String model) { + this.model = model; + } + + public String getOperatorDiscountPermission() { + return operatorDiscountPermission; + } + + public void setOperatorDiscountPermission(String operatorDiscountPermission) { + this.operatorDiscountPermission = operatorDiscountPermission; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getPriceDescription() { + return priceDescription; + } + + public void setPriceDescription(String priceDescription) { + this.priceDescription = priceDescription; + } + + public String getPriceItem() { + return priceItem; + } + + public void setPriceItem(String priceItem) { + this.priceItem = priceItem; + } + + public String getPriceLimit() { + return priceLimit; + } + + public void setPriceLimit(String priceLimit) { + this.priceLimit = priceLimit; + } + + public String getPriceName() { + return priceName; + } + + public void setPriceName(String priceName) { + this.priceName = priceName; + } + + public String getPriceNo() { + return priceNo; + } + + public void setPriceNo(String priceNo) { + this.priceNo = priceNo; + } + + public String getPriceStandard() { + return priceStandard; + } + + public void setPriceStandard(String priceStandard) { + this.priceStandard = priceStandard; + } + + public String getPriceType() { + return priceType; + } + + public void setPriceType(String priceType) { + this.priceType = priceType; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + } + } +} diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt index 3382fae..75f6c2b 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitService.kt @@ -75,4 +75,24 @@ @Header("token") token: String, @Body requestBody: RequestBody ): String + + /** + * 获取能力列表 + */ + @POST("/price/queryPriceList") + suspend fun getCapabilityList( + @Header("token") token: String, + @Body requestBody: RequestBody, + @QueryMap limit: Map, + @QueryMap offset: Map + ): String + + /** + * 获取能力详情 + */ + @POST("/price/queryPriceInfo") + suspend fun getCapabilityDetail( + @Header("token") token: String, + @Body requestBody: RequestBody + ): String } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt index 1af43c3..27e91ca 100644 --- a/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt +++ b/app/src/main/java/com/casic/xz/meterage/utils/retrofit/RetrofitServiceManager.kt @@ -173,7 +173,12 @@ val offsetMap = HashMap() offsetMap["offset"] = offset - return api.getStandardDeviceList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + return api.getStandardDeviceList( + AuthenticationHelper.token!!, + requestBody, + limitMap, + offsetMap + ) } /** @@ -187,4 +192,45 @@ ) return api.getStandardDeviceDetail(AuthenticationHelper.token!!, requestBody) } + + /** + * 获取能力列表 + */ + suspend fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ): String { + val paramObject = JSONObject() + paramObject.put("checkType", checkType) + paramObject.put("priceItem", priceItem) + paramObject.put("priceName", priceName) + paramObject.put("priceNo", priceNo) + paramObject.put("priceType", priceType) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + + val limitMap = HashMap() + limitMap["limit"] = LocaleConstant.PAGE_LIMIT + + val offsetMap = HashMap() + offsetMap["offset"] = offset + return api.getCapabilityList(AuthenticationHelper.token!!, requestBody, limitMap, offsetMap) + } + + /** + * 获取能力详情 + */ + suspend fun getCapabilityDetail(id: String): String { + val paramObject = JSONObject() + paramObject.put("id", id) + val requestBody = paramObject.toString().toRequestBody( + "application/json;charset=UTF-8".toMediaType() + ) + return api.getCapabilityDetail(AuthenticationHelper.token!!, requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt new file mode 100644 index 0000000..7b9c9ec --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityActivity.kt @@ -0,0 +1,149 @@ +package com.casic.xz.meterage.view.home + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.search.SearchCapabilityActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityActivity : KotlinBaseActivity() { + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020902) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + rightOperateView.setOnClickListener { + navigatePageTo() + } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun initLayoutView(): Int = R.layout.activity_capability + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + "", + "", + "", + pageIndex + ) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020902 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt new file mode 100644 index 0000000..ddb486c --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/home/CapabilityDetailActivity.kt @@ -0,0 +1,61 @@ +package com.casic.xz.meterage.view.home + +import androidx.lifecycle.ViewModelProvider +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_capability_detail.* +import kotlinx.android.synthetic.main.include_search_title.* + +class CapabilityDetailActivity : KotlinBaseActivity() { + + private lateinit var capabilityViewModel: CapabilityViewModel + + override fun initData() { + val id = intent.getStringExtra(Constant.INTENT_PARAM)!! + + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.getCapabilityDetail(id) + capabilityViewModel.capabilityDetailResult.observe(this, { + if (it.code == 200) { + val data = it.data!! + + priceCodeView.text = data.priceNo + checkTypeView.text = data.checkType + createView.text = data.createTime + categoryView.text = data.categoryName + projectView.text = data.priceItem + basisStandardView.text = data.priceStandard + limitRangeView.text = data.priceLimit + explainView.text = data.priceDescription + remarkView.text = data.remark + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + } + + override fun initLayoutView(): Int = R.layout.activity_capability_detail + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "能力列表" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt new file mode 100644 index 0000000..9242993 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityActivity.kt @@ -0,0 +1,41 @@ +package com.casic.xz.meterage.view.search + +import com.casic.xz.meterage.R +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import kotlinx.android.synthetic.main.activity_search_capability.* + +/** + * 搜索能力 + * */ +class SearchCapabilityActivity : KotlinBaseActivity() { + + override fun initData() { + + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + searchTextView.setOnClickListener { + navigatePageTo(inputView.text.toString()) + } + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability + + override fun observeRequestState() { + + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + } + + override fun onResume() { + super.onResume() + //TODO 流式布局显示查询记录Tag? + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt new file mode 100644 index 0000000..e8a9fe5 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/view/search/SearchCapabilityResultActivity.kt @@ -0,0 +1,151 @@ +package com.casic.xz.meterage.view.search + +import android.os.Handler +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.DividerItemDecoration +import com.casic.xz.meterage.R +import com.casic.xz.meterage.adapter.CapabilityListAdapter +import com.casic.xz.meterage.extensions.initLayoutImmersionBar +import com.casic.xz.meterage.extensions.showEmptyPage +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.LoadingDialogHub +import com.casic.xz.meterage.view.home.CapabilityDetailActivity +import com.casic.xz.meterage.vm.CapabilityViewModel +import com.gyf.immersionbar.ImmersionBar +import com.pengxh.kt.lite.base.KotlinBaseActivity +import com.pengxh.kt.lite.extensions.navigatePageTo +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.utils.Constant +import com.pengxh.kt.lite.utils.WeakReferenceHandler +import com.pengxh.kt.lite.vm.LoadState +import kotlinx.android.synthetic.main.activity_search_capability_reasult.* +import kotlinx.android.synthetic.main.include_empty_view.* +import kotlinx.android.synthetic.main.include_search_title.* + +class SearchCapabilityResultActivity : KotlinBaseActivity() { + + private lateinit var param: String + + private lateinit var weakReferenceHandler: WeakReferenceHandler + private lateinit var capabilityViewModel: CapabilityViewModel + private lateinit var capabilityListAdapter: CapabilityListAdapter + private var dataBeans: MutableList = ArrayList() + private var pageIndex = 1 + private var isRefresh = false + private var isLoadMore = false + + override fun initData() { + param = intent.getStringExtra(Constant.INTENT_PARAM)!! + + weakReferenceHandler = WeakReferenceHandler(callback) + capabilityViewModel = ViewModelProvider(this)[CapabilityViewModel::class.java] + capabilityViewModel.capabilityResult.observe(this, { + if (it.code == 200) { + val dataRows = it.data?.records!! + when { + isRefresh -> { + dataBeans.clear() + dataBeans = dataRows + capabilityLayout.finishRefresh() + isRefresh = false + } + isLoadMore -> { + if (dataRows.size == 0) { + "到底了,别拉了".show(this) + } + dataBeans.addAll(dataRows) + capabilityLayout.finishLoadMore() + isLoadMore = false + } + else -> { + dataBeans = dataRows + } + } + weakReferenceHandler.sendEmptyMessage(2023020903) + } + }) + } + + override fun initEvent() { + leftBackView.setOnClickListener { finish() } + + capabilityLayout.setOnRefreshListener { + isRefresh = true + //刷新之后页码重置 + pageIndex = 1 + getCapabilityList() + } + + capabilityLayout.setOnLoadMoreListener { + isLoadMore = true + pageIndex++ + getCapabilityList() + } + } + + override fun onResume() { + super.onResume() + pageIndex = 1 + getCapabilityList() + } + + private fun getCapabilityList() { + capabilityViewModel.getCapabilityList( + "", + "", + param, + "", + "", + pageIndex + ) + } + + override fun initLayoutView(): Int = R.layout.activity_search_capability_reasult + + override fun observeRequestState() { + capabilityViewModel.loadState.observe(this, { + when (it) { + LoadState.Loading -> LoadingDialogHub.show(this, "数据加载中...") + else -> LoadingDialogHub.dismiss() + } + }) + } + + private val callback = Handler.Callback { + when (it.what) { + 2023020903 -> { + if (isRefresh || isLoadMore) { + capabilityListAdapter.notifyDataSetChanged() + } else { + if (dataBeans.size == 0) { + emptyView!!.showEmptyPage("无数据") { + pageIndex = 1 + getCapabilityList() + } + } else { + emptyView!!.hide() + capabilityListAdapter = CapabilityListAdapter(this, dataBeans) + capabilityRecyclerView.addItemDecoration( + DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + ) + capabilityRecyclerView.adapter = capabilityListAdapter + capabilityListAdapter.setOnItemClickListener(object : + CapabilityListAdapter.OnItemClickListener { + override fun onItemClicked(position: Int) { + val rowsModel = dataBeans[position] + navigatePageTo(rowsModel.id) + } + }) + } + } + } + } + true + } + + override fun setupTopBarLayout() { + ImmersionBar.with(this).statusBarDarkFont(true).init() + initLayoutImmersionBar(rootView) + titleView.text = "查询结果" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt new file mode 100644 index 0000000..a398906 --- /dev/null +++ b/app/src/main/java/com/casic/xz/meterage/vm/CapabilityViewModel.kt @@ -0,0 +1,67 @@ +package com.casic.xz.meterage.vm + +import androidx.lifecycle.MutableLiveData +import com.casic.xz.meterage.base.BaseApplication +import com.casic.xz.meterage.extensions.separateResponseCode +import com.casic.xz.meterage.extensions.toErrorMessage +import com.casic.xz.meterage.model.CapabilityDetailModel +import com.casic.xz.meterage.model.CapabilityListModel +import com.casic.xz.meterage.utils.retrofit.RetrofitServiceManager +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.pengxh.kt.lite.extensions.launch +import com.pengxh.kt.lite.extensions.show +import com.pengxh.kt.lite.vm.BaseViewModel +import com.pengxh.kt.lite.vm.LoadState + +class CapabilityViewModel : BaseViewModel() { + + private val gson by lazy { Gson() } + val capabilityResult = MutableLiveData() + val capabilityDetailResult = MutableLiveData() + + fun getCapabilityList( + checkType: String, + priceItem: String, + priceName: String, + priceNo: String, + priceType: String, + offset: Int + ) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityList( + checkType, priceItem, priceName, priceNo, priceType, offset + ) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) + + fun getCapabilityDetail(id: String) = launch({ + loadState.value = LoadState.Loading + val response = RetrofitServiceManager.getCapabilityDetail(id) + val responseCode = response.separateResponseCode() + if (responseCode == 200) { + loadState.value = LoadState.Success + capabilityDetailResult.value = gson.fromJson( + response, object : TypeToken() {}.type + ) + } else { + loadState.value = LoadState.Fail + response.toErrorMessage().show(BaseApplication.get()) + } + }, { + loadState.value = LoadState.Fail + it.printStackTrace() + }) +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability.xml b/app/src/main/res/layout/activity_capability.xml new file mode 100644 index 0000000..1d8e1f7 --- /dev/null +++ b/app/src/main/res/layout/activity_capability.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_capability_detail.xml b/app/src/main/res/layout/activity_capability_detail.xml new file mode 100644 index 0000000..8faa3a8 --- /dev/null +++ b/app/src/main/res/layout/activity_capability_detail.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_equipment_detail.xml b/app/src/main/res/layout/activity_equipment_detail.xml index 7254762..f0b3028 100644 --- a/app/src/main/res/layout/activity_equipment_detail.xml +++ b/app/src/main/res/layout/activity_equipment_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_search_capability_reasult.xml b/app/src/main/res/layout/activity_search_capability_reasult.xml new file mode 100644 index 0000000..068a33c --- /dev/null +++ b/app/src/main/res/layout/activity_search_capability_reasult.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_standard_device_detail.xml b/app/src/main/res/layout/activity_standard_device_detail.xml index b711b87..211f4d7 100644 --- a/app/src/main/res/layout/activity_standard_device_detail.xml +++ b/app/src/main/res/layout/activity_standard_device_detail.xml @@ -21,6 +21,7 @@ app:tabIndicatorColor="@color/themeColor" app:tabIndicatorFullWidth="false" app:tabIndicatorHeight="3dp" + app:tabMode="scrollable" app:tabSelectedTextColor="@color/mainTextColor" /> + + + + + + + + + + \ No newline at end of file