diff --git a/app/src/main/java/com/rehome/zhdcoa/Contans.java b/app/src/main/java/com/rehome/zhdcoa/Contans.java index 2146cb6..ae717ae 100644 --- a/app/src/main/java/com/rehome/zhdcoa/Contans.java +++ b/app/src/main/java/com/rehome/zhdcoa/Contans.java @@ -584,10 +584,18 @@ public class Contans { //通讯录 public static String GETCONTACTLIST_URL="PubFile/Data/GetAddressbookRsa.ashx"; - //修改手机号或者密码 public static String UPLOAD_PHONE_OR_PWD_URL="PubFile/Data/aboutme/UpdateUserPwd.ashx"; + //气象获取实时数据 + public final static String GET_WEATHER_NOW_DATA = "PubFile/Data/QXZ/GetCurrentData.ashx"; + + //气象获取历史数据 + public final static String GET_WEATHER_HISTORY_DATA = "PubFile/Data/QXZ/GetHistoryData.ashx"; + + //http://localhost:28105/PubFile/Data/QXZ/GetHistoryData.ashx?times=2025-09-07 00:00:00&timee=2025-09-19 23:00:00&page=2&pageSize=20&dataType=E1 + //http://localhost:28105/PubFile/Data/QXZ/GetCurrentData.ashx + /** * 获取关于我的数据,总数量。 * 提到我的 diff --git a/app/src/main/java/com/rehome/zhdcoa/bean/WeatherRealDataBean.java b/app/src/main/java/com/rehome/zhdcoa/bean/WeatherRealDataBean.java new file mode 100644 index 0000000..b810144 --- /dev/null +++ b/app/src/main/java/com/rehome/zhdcoa/bean/WeatherRealDataBean.java @@ -0,0 +1,196 @@ +package com.rehome.zhdcoa.bean; + +public class WeatherRealDataBean extends AIBaseBean{ + private DataBean data; + + public DataBean getData() { + return data; + } + + public void setData(DataBean data) { + this.data = data; + } + + public static class DataBean { + private String IDM; + private String IDFAC; + private String TIME; + private String E1; + private String E2; + private String E3; + private String E4; + private String E5; + private String E6; + private String E7; + private String E8; + private String E9; + private String E10; + private String E11; + private String E12; + private String E13; + private String E14; + private String E15; + private String E16; + private String TBSJ; + + public String getIDM() { + return IDM; + } + + public void setIDM(String IDM) { + this.IDM = IDM; + } + + public String getIDFAC() { + return IDFAC; + } + + public void setIDFAC(String IDFAC) { + this.IDFAC = IDFAC; + } + + public String getTIME() { + return TIME; + } + + public void setTIME(String TIME) { + this.TIME = TIME; + } + + public String getE1() { + return E1; + } + + public void setE1(String e1) { + E1 = e1; + } + + public String getE2() { + return E2; + } + + public void setE2(String e2) { + E2 = e2; + } + + public String getE3() { + return E3; + } + + public void setE3(String e3) { + E3 = e3; + } + + public String getE4() { + return E4; + } + + public void setE4(String e4) { + E4 = e4; + } + + public String getE5() { + return E5; + } + + public void setE5(String e5) { + E5 = e5; + } + + public String getE6() { + return E6; + } + + public void setE6(String e6) { + E6 = e6; + } + + public String getE7() { + return E7; + } + + public void setE7(String e7) { + E7 = e7; + } + + public String getE8() { + return E8; + } + + public void setE8(String e8) { + E8 = e8; + } + + public String getE9() { + return E9; + } + + public void setE9(String e9) { + E9 = e9; + } + + public String getE10() { + return E10; + } + + public void setE10(String e10) { + E10 = e10; + } + + public String getE11() { + return E11; + } + + public void setE11(String e11) { + E11 = e11; + } + + public String getE12() { + return E12; + } + + public void setE12(String e12) { + E12 = e12; + } + + public String getE13() { + return E13; + } + + public void setE13(String e13) { + E13 = e13; + } + + public String getE14() { + return E14; + } + + public void setE14(String e14) { + E14 = e14; + } + + public String getE15() { + return E15; + } + + public void setE15(String e15) { + E15 = e15; + } + + public String getE16() { + return E16; + } + + public void setE16(String e16) { + E16 = e16; + } + + public String getTBSJ() { + return TBSJ; + } + + public void setTBSJ(String TBSJ) { + this.TBSJ = TBSJ; + } + } +} diff --git a/app/src/main/java/com/rehome/zhdcoa/bean/WorkRiskLevelListBean.java b/app/src/main/java/com/rehome/zhdcoa/bean/WorkRiskLevelListBean.java index 51579d2..f6fe171 100644 --- a/app/src/main/java/com/rehome/zhdcoa/bean/WorkRiskLevelListBean.java +++ b/app/src/main/java/com/rehome/zhdcoa/bean/WorkRiskLevelListBean.java @@ -6,7 +6,7 @@ import java.util.List; /** * 每日作业风险清单 */ -public class WorkRiskLevelListBean extends AIBaseBean{ +public class WorkRiskLevelListBean extends AIBaseBean{ //每日作业风险清单 private List data; diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WeatherActivity.kt b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WeatherActivity.kt index a5bd657..e5cc500 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/activity/WeatherActivity.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/activity/WeatherActivity.kt @@ -12,9 +12,11 @@ import com.rehome.zhdcoa.R import com.rehome.zhdcoa.adapter.WorkRiskLevelListAdapter import com.rehome.zhdcoa.base.BaseActivityOaToolbarTwoViewBinding import com.rehome.zhdcoa.base.BaseActivityOaToolbarViewBinding +import com.rehome.zhdcoa.bean.WeatherRealDataBean import com.rehome.zhdcoa.bean.WorkRiskLevelListBean import com.rehome.zhdcoa.completionUtil.ReplaceSpan import com.rehome.zhdcoa.completionUtil.ReplaceSpan.OnClickListener +import com.rehome.zhdcoa.databinding.ActivityWeatherBinding import com.rehome.zhdcoa.databinding.ActivityWorkRiskListBinding import com.rehome.zhdcoa.utils.AuthenticationLoginAIUtils import com.rehome.zhdcoa.utils.GsonUtils @@ -33,7 +35,7 @@ import javax.net.ssl.HostnameVerifier * 创建日期:2025-09-18 15:19 * 描述:气象数据 实时概况 */ -class WeatherActivity : BaseActivityOaToolbarViewBinding() { +class WeatherActivity : BaseActivityOaToolbarViewBinding() { private lateinit var headView: View @@ -55,183 +57,88 @@ class WeatherActivity : BaseActivityOaToolbarViewBinding = mutableListOf() private var dataC3: MutableList = mutableListOf() private var dataLowRisk: MutableList = mutableListOf() - private var isNetworkNormal = false - private lateinit var launcherResultQRCode: ActivityResultLauncher - override fun getViewBinding() = ActivityWorkRiskListBinding.inflate(layoutInflater) + + + override fun getViewBinding() = ActivityWeatherBinding.inflate(layoutInflater) override fun getToolbar() = binding.toolbarView.toolbar override fun initView() { - initToolbar("气象数据实时概况", "",{ + initToolbar("气象实时概况", "",{ }) - launcherResultQRCode = createQRCodeActivityResultLauncher() - - binding.lv.emptyView = binding.tvNodata - headView = View.inflate(this, R.layout.item_work_risk_list, null) - - mAdapter = WorkRiskLevelListAdapter(this,datas, - { position -> - val item = datas[position] - if(item.hazardList!=null&&item.hazardList.size>0){ - //进入风险提示页面 - val intent = Intent(context, WorkRiskListTipActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("hazardList", GsonUtils.GsonString(item.hazardList)) - startActivity(intent) - } - }, - { position -> - val item = datas[position] - if(item.hazardList!=null&&item.hazardList.size>0){ - //进入修改风险等级 - val intent = Intent(context, CustomDialogChangeLevelActivity::class.java) - intent.putExtra("id",item.id) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("level", item.level) - intent.putExtra("type", item.type) - launcherResultQRCode.launch(intent) - } - }, - { position -> - val item = datas[position] - showLog("---------") - showLog(GsonUtils.GsonString(item)) - //工作情况汇报 - val intent = Intent(context, WorkRiskListHuiBaoActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("level",item.level) - intent.putExtra("type",item.type) - intent.putExtra("id",item.id) - startActivity(intent) - } - ) - //binding.lv.addHeaderView(headView, null, false) - binding.lv.adapter = mAdapter - - binding.llRefresh.setOnClickListener { authenticationLoginAI() } - - binding.llWorkTicket.setOnClickListener { - if(isNetworkNormal){ - //进入风险提示页面 WorkTickerSelectListActivity - val intent = Intent(context, WorkTickerSelectListActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("selectList", GsonUtils.GsonString(selectList)) - intent.putExtra("jobNoList", GsonUtils.GsonString(jobNoList)) - startActivity(intent) - }else{ - //WorkTickerAssistantSelectListActivity - showToast("列表数据加载失败,请检查网络环境或重新加载列表数据") - } - } - - binding.llAssiting.setOnClickListener { - if(isNetworkNormal){ - //进入风险提示页面 WorkTickerAssistantSelectListActivity - val intent = Intent(context, WorkTickerAssistantSelectListActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("selectList", GsonUtils.GsonString(selectListAssistant)) - intent.putExtra("jobNoList", GsonUtils.GsonString(jobNoListAssistant)) - startActivity(intent) - }else{ - showToast("列表数据加载失败,请检查网络环境或重新加载列表数据") - } - } - - binding.llCustomAdd.setOnClickListener { - if(isNetworkNormal){ - //进入风险提示页面 WorkTickerAssistantSelectListActivity - val intent = Intent(context, WorkTickerCustomListActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - intent.putExtra("selectList", GsonUtils.GsonString(selectListCustom)) - intent.putExtra("jobNoList", GsonUtils.GsonString(jobNoListCustom)) - startActivity(intent) - }else{ - showToast("列表数据加载失败,请检查网络环境或重新加载列表数据") - } - } //格式化日期的对象(转化成习惯的时间格式) - val sdFormat = SimpleDateFormat("yyyy.MM.dd") + val sdFormat = SimpleDateFormat("yyyy.MM.dd HH:mm:ss") //静态方法getInstance()使用默认时区和语言环境获得一个日历。 val calendar = Calendar.getInstance() //输出当前系统时间; - binding.tvTime.text = sdFormat.format(calendar.time) - bindViewClick() - } + //binding.tvTime.text = sdFormat.format(calendar.time) + binding.tvRefresh1.setOnClickListener { + refreshData() + } + binding.tvRefresh2.setOnClickListener { + refreshData() + } + binding.tvRefresh3.setOnClickListener { + refreshData() + } + binding.tvRefresh4.setOnClickListener { + refreshData() + } + binding.tvRefresh5.setOnClickListener { + refreshData() + } + binding.tvRefresh6.setOnClickListener { + refreshData() + } - override fun initData() { - authenticationLoginAI() + binding.rlWendu.setOnClickListener { + showHistoryPage("大气温度") + } + binding.rlShidu.setOnClickListener { + showHistoryPage("大气湿度") + } + binding.rlQiya.setOnClickListener { + showHistoryPage("大气气压") + } + binding.rlFengqiang.setOnClickListener { + showHistoryPage("实时风速") + } + binding.rlYuliang.setOnClickListener { + showHistoryPage("实时风向") + } + binding.rlFengshu.setOnClickListener { + showHistoryPage("日雨量累计") + } } - override fun onRestart() { - super.onRestart() - authenticationLoginAI() + private fun refreshData() { + requestData() } - //创建一个ActivityResultLauncher - private fun createQRCodeActivityResultLauncher(): ActivityResultLauncher { - //kotlin写法 - return registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - val data = it.data - val resultCode = it.resultCode - if (resultCode == RESULT_OK) { - if (data != null) { - val qrCodeStr = data.getStringExtra("code") ?: "" - showLog(qrCodeStr) - if(!TextUtils.isEmpty(qrCodeStr)){ - //刷新列表数据 - authenticationLoginAI() - } - } - } - } + private fun showHistoryPage(type: String) { + val intent = Intent(context, WorkTickerAssistantSelectListActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.putExtra("selectList", GsonUtils.GsonString(selectListAssistant)) + intent.putExtra("jobNoList", GsonUtils.GsonString(jobNoListAssistant)) + startActivity(intent) } - private fun authenticationLoginAI() { - try { - //AI三维登录接口 - val userName = Contans.SP.AI_ACCOUNT - //String strPrivateEncode=RSAAndroid.encryptByPrivateKeyForSpiltStr(Contans.SP.AI_PWD,RSAAndroid.privateRsaKeyLocal); - val strPublicDecode = RSAAndroid.decryptByPublicKeyForSpiltStr( - Contans.SP.AI_PWD_ENCODE, - RSAAndroid.publicRsaKeyLocal - ) - AuthenticationLoginAIUtils.authenticationAILoginShowProgress( - this, userName, strPublicDecode - ) { _, token -> - if (token != null && token == "") { - showToast("AI三维平台登录失败") - isNetworkNormal = false - } else { - getWorkRiskListData() - } - } - } catch (e: Exception) { - e.printStackTrace() - } + override fun initData() { + requestData() } - private fun getWorkRiskListData() { + private fun requestData() { val request = NoHttp.createStringRequest( - Contans.BASE_URL_AI_3D_SERVER + Contans.DAYLY_RISK_LIST_NEW, + Contans.BASE_URL + Contans.GET_WEATHER_NOW_DATA, RequestMethod.GET ) - request.add("filter",true); - - if (Contans.BASE_URL_AI_3D_SERVER == Contans.BASE_URL_AI_3D_SERVER_EXTRANET) { - val socketFactory = NohttpUtils.getSSLSocketFactory(context) - if (socketFactory != null) { - request.sslSocketFactory = socketFactory - request.hostnameVerifier = HostnameVerifier { _, _ -> true } - } - } - NohttpUtils.getInstance().add(this, 0, request, object : HttpListener { override fun onSucceed(what: Int, response: Response?) { @@ -240,128 +147,34 @@ class WeatherActivity : BaseActivityOaToolbarViewBinding 0) { - binding.tvNodata.visibility = View.GONE - headView.visibility = View.VISIBLE - datas.clear() - datas.addAll(workRiskLevelLists) - mAdapter.notifyDataSetChanged() - - dataA.clear() - dataB.clear() - dataC1.clear() - dataC2.clear() - dataC3.clear() - dataLowRisk.clear() - - - selectList.clear() - jobNoList.clear() - - selectListAssistant.clear() - jobNoListAssistant.clear() - - selectListCustom.clear() - jobNoListCustom.clear() - - for(item in datas){ - if("ticket" == item.type){ - selectList.add(item.id) - jobNoList.add(item.jobNo) - } - if("assisting" == item.type){ - selectListAssistant.add(item.id) - jobNoListAssistant.add(item.jobNo) - } - if("custom" == item.type){ - selectListCustom.add(item.id) - jobNoListCustom.add(item.jobNo) - } - - - showLog(GsonUtils.GsonString(item)) - if(item.level!=null&&item.level=="A"){ - dataA.add(item) - } - if(item.level!=null&&item.level=="B"){ - dataB.add(item) - } - if(item.level!=null&&item.level=="C1"){ - dataC1.add(item) - } - if(item.level!=null&&item.level=="C2"){ - dataC2.add(item) - } - if(item.level!=null&&item.level=="C3"){ - dataC3.add(item) - } - if(item.level!=null&&item.level=="低风险"){ - dataLowRisk.add(item) - } - } - binding.tvA.text = dataA.size.toString() - binding.tvB.text = dataB.size.toString() - binding.tvC1.text = dataC1.size.toString() - binding.tvC2.text = dataC2.size.toString() - binding.tvC3.text = dataC3.size.toString() - binding.tvLowLisk.text = dataLowRisk.size.toString() - - } else { - binding.tvNodata.visibility = View.VISIBLE - } - }else{ - isNetworkNormal = false + if (bean != null && bean.code==1 && bean.data != null) { + val data = bean.data + binding.timeQiya.text=data.tbsj + binding.timeShidu.text=data.tbsj + binding.timeWendu.text=data.tbsj + binding.timeFengsu.text=data.tbsj + binding.timeYuliang.text=data.tbsj + binding.timeFengxiang.text=data.tbsj + + binding.tvWendu.text=data.e16 + binding.tvShidu.text=data.e14 + binding.tvQiya.text=data.e15 + binding.tvFengsu.text=data.e1 + binding.tvFengxiang.text=data.e12 + binding.tvYuliang.text=data.e4 + } } override fun onFailed(what: Int, response: Response?) { - isNetworkNormal = false + } }) } - private fun bindViewClick() { - binding.tvA.setOnClickListener { - datas.clear() - datas.addAll(dataA) - mAdapter.notifyDataSetChanged() - } - binding.tvB.setOnClickListener { - datas.clear() - datas.addAll(dataB) - mAdapter.notifyDataSetChanged() - } - binding.tvC1.setOnClickListener { - datas.clear() - datas.addAll(dataC1) - mAdapter.notifyDataSetChanged() - } - binding.tvC2.setOnClickListener { - datas.clear() - datas.addAll(dataC2) - mAdapter.notifyDataSetChanged() - } - binding.tvC3.setOnClickListener { - datas.clear() - datas.addAll(dataC3) - mAdapter.notifyDataSetChanged() - } - binding.tvLowLisk.setOnClickListener { - datas.clear() - datas.addAll(dataLowRisk) - mAdapter.notifyDataSetChanged() - } - binding.tvReport.setOnClickListener { - val intent = Intent(context, WorkRiskListReportActivity::class.java) - intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP) - startActivity(intent) - } - } + private fun toWorkRiskListHuiBaoActivity(type:String){ //工作情况汇报 diff --git a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/HomeFragment.kt b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/HomeFragment.kt index 1d38adb..76382a7 100644 --- a/app/src/main/java/com/rehome/zhdcoa/ui/fragment/HomeFragment.kt +++ b/app/src/main/java/com/rehome/zhdcoa/ui/fragment/HomeFragment.kt @@ -209,8 +209,8 @@ class HomeFragment : BaseViewBindingFragment() { "党建", // "工会培训问卷", "生产过程监督", - "安防" - //"气象数据" + "安防", + "气象数据" ) val imgIds = intArrayOf( // R.drawable.icon_visit, @@ -225,8 +225,8 @@ class HomeFragment : BaseViewBindingFragment() { R.drawable.icon_dj, // R.drawable.gh_icon, R.drawable.icon_gcjd, - R.drawable.icon1 - //R.drawable.real_weather + R.drawable.icon1, + R.drawable.icon_weather ) for (i in titles.indices) { val item = GridItem(titles[i], imgIds[i]) diff --git a/app/src/main/res/drawable-xhdpi/arrow_right_weather.png b/app/src/main/res/drawable-xhdpi/arrow_right_weather.png new file mode 100644 index 0000000..ea04cc0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/arrow_right_weather.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_refresh.png b/app/src/main/res/drawable-xhdpi/icon_refresh.png new file mode 100644 index 0000000..fb7e67d Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_refresh.png differ diff --git a/app/src/main/res/drawable-xhdpi/icon_weather.png b/app/src/main/res/drawable-xhdpi/icon_weather.png new file mode 100644 index 0000000..9762c6e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/icon_weather.png differ diff --git a/app/src/main/res/drawable/lv_border_all_weather.xml b/app/src/main/res/drawable/lv_border_all_weather.xml new file mode 100644 index 0000000..e5901d5 --- /dev/null +++ b/app/src/main/res/drawable/lv_border_all_weather.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_weather.xml b/app/src/main/res/layout/activity_weather.xml index d3774e3..1be05ff 100644 --- a/app/src/main/res/layout/activity_weather.xml +++ b/app/src/main/res/layout/activity_weather.xml @@ -11,394 +11,643 @@ layout="@layout/layout_base" /> - - - - - - + - + android:layout_height="120dp" + android:paddingBottom="10dp" + android:paddingTop="10dp" + android:layout_weight="2" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + android:layout_marginStart="10dp" + android:orientation="horizontal"> - - + android:layout_width="match_parent" + android:layout_height="120dp" + android:layout_weight="2" + android:paddingBottom="10dp" + android:paddingTop="10dp" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + - - - + android:gravity="center|bottom" + android:paddingBottom="20dp" + android:orientation="vertical"> + android:id="@+id/tv_refresh2" + android:layout_width="25dp" + android:layout_height="25dp" + android:gravity="center" + android:background="@drawable/icon_refresh" + android:text=""/> - + + - - - - - - - - - - - - - - + android:layout_width="match_parent" + android:layout_height="120dp" + android:paddingBottom="10dp" + android:paddingTop="10dp" + android:layout_weight="2" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + - - - - + android:gravity="center|bottom" + android:paddingBottom="20dp" + android:orientation="vertical"> - + android:id="@+id/tv_refresh3" + android:layout_width="25dp" + android:layout_height="25dp" + android:gravity="center" + android:background="@drawable/icon_refresh" + android:text=""/> - - - - - + - - + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - + android:gravity="center|bottom" + android:paddingBottom="20dp" + android:orientation="vertical"> - + android:id="@+id/tv_refresh4" + android:layout_width="25dp" + android:layout_height="25dp" + android:gravity="center" + android:background="@drawable/icon_refresh" + android:text=""/> - - - - - - - - - - - + - + android:layout_height="120dp" + android:paddingBottom="10dp" + android:paddingTop="10dp" + android:layout_weight="2" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + - - + - + android:layout_height="120dp" + android:layout_weight="2" + android:paddingBottom="10dp" + android:paddingTop="10dp" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_work_risk_list.xml b/app/src/main/res/layout/activity_work_risk_list.xml index 2a58902..6c84344 100644 --- a/app/src/main/res/layout/activity_work_risk_list.xml +++ b/app/src/main/res/layout/activity_work_risk_list.xml @@ -4,6 +4,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" + android:background="#E7F1F7" tools:context=".ui.activity.WorkRiskListActivity">