Sfoglia il codice sorgente

风险管理8月16日提交代码-liu.bolan-云融大宗

Liu.bolan 4 anni fa
parent
commit
e8495e2179
46 ha cambiato i file con 3916 aggiunte e 119 eliminazioni
  1. 7 0
      RMA/app/src/main/AndroidManifest.xml
  2. 27 0
      RMA/app/src/main/java/cn/muchinfo/rma/business/chart/ChartManager.kt
  3. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/business/future/FutureManager.kt
  4. 17 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/BaseGlobalData.java
  5. 16 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/StringUtils.kt
  6. 145 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/data/DeliveryRelationData.kt
  7. 33 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/data/QuoteDayData.kt
  8. 2 2
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/app/Constant.kt
  9. 0 3
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/chart/ChartActivity.kt
  10. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/markets/MarketBaseModel.kt
  11. 1 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/hnstmain/HnstMainFragment.kt
  12. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/hnstmain/spotwarehouse/listed/ListedViewModel.kt
  13. 5 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/NewHomeFragment.kt
  14. 243 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceActivity.kt
  15. 405 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceAdapter.java
  16. 98 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceViewModel.kt
  17. 21 44
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/login/LoginActivity.kt
  18. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/PlatinumTreasureViewModel.kt
  19. 2 2
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/adapter/QhjRightScrollAdapter.java
  20. 1 11
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/trade/PlatinumBuyOrSellUI.kt
  21. 65 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/procurement/TopTabYrdzAdpater.java
  22. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/recycling/RecyclingViewModel.kt
  23. 1 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/warehousereceipt/WarehouseReceiptViewModel.kt
  24. 222 5
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/BasePriceFragment.kt
  25. 93 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/BasePriceViewMoldel.kt
  26. 4 5
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/PurchaseOrderFragment.kt
  27. 9 7
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/PurchaseOrderViewModel.kt
  28. 45 31
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/adapter/TransferAdapter.java
  29. 114 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessBuyHallViewHolder.kt
  30. 1000 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessHallActivity.kt
  31. 210 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessHallViewModel.kt
  32. 118 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessSellHallViewHolder.kt
  33. 108 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsActivity.kt
  34. 43 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsViewHoder.kt
  35. 16 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsViewModel.kt
  36. 235 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/YrdzChartActivity.kt
  37. 149 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/YrdzChartViewModel.kt
  38. 357 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/delisting/PurchaseDelistingActivity.kt
  39. 84 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/delisting/PurchaseDelistingViewModel.kt
  40. 0 1
      RMA/app/src/main/res/layout/layout_item_transfer_content.xml
  41. 1 1
      RMA/app/src/main/res/layout/layout_qhj_item_scroll.xml
  42. 14 0
      RMA/app/src/main/res/layout/layout_yrdz_item_top_scroll.xml
  43. BIN
      RMA/app/src/main/res/mipmap-xhdpi/rydz_chart_icon.png
  44. BIN
      RMA/app/src/main/res/mipmap-xhdpi/rydz_price_up_icon.png
  45. BIN
      RMA/app/src/main/res/mipmap-xhdpi/yrdz_down_icon.png
  46. BIN
      RMA/app/src/main/res/mipmap-xhdpi/yrdz_up_icon.png

+ 7 - 0
RMA/app/src/main/AndroidManifest.xml

@@ -418,6 +418,13 @@
 
         <activity android:name=".view.base.hnstmain.contractorders.delivery.DeliveryActivity"/>
 
+        <activity android:name=".view.base.yrdzpurchase.chart.YrdzChartActivity"/>
+
+        <activity android:name=".view.base.yrdzpurchase.chart.DealDetailsActivity"/>
+
+        <activity android:name=".view.base.home.reference.ReferenceActivity"/>
+
+        <activity android:name=".view.base.yrdzpurchase.business.ContractBusinessHallActivity"/>
     </application>
 
 </manifest>

+ 27 - 0
RMA/app/src/main/java/cn/muchinfo/rma/business/chart/ChartManager.kt

@@ -1,5 +1,6 @@
 package cn.muchinfo.rma.business.chart;
 
+import cn.muchinfo.rma.global.data.DeliveryRelationData
 import cn.muchinfo.rma.global.data.chart.ChartTSData
 import cn.muchinfo.rma.global.data.chart.HistoryDatas
 import cn.muchinfo.rma.global.data.chart.HistoryTikData
@@ -15,6 +16,32 @@ import java.lang.Exception
 class ChartManager {
 
     /**
+     * 查询商品交割关系表
+     * @param params Map<String, String>  goodsCode 商品代码(必填)
+     * @param responseBack Function3<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] ChartTSData?, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun queryDeliveryRelation(
+        params: Map<String, String>,
+        responseBack: (isSuccess: Boolean, respData: List<DeliveryRelationData>?, error: Error?) -> Unit
+    ) {
+        MyOkHttpUtils().query(
+            URL = SPUtils.getInstance()
+                .getString(Constant.goCommonSearchUrl) + "/Delivery/QueryDeliveryRelation",
+            params = params,
+            type = "1",
+            callback = object : ResponseCallback<BaseResult<List<DeliveryRelationData>>>() {
+                override fun onResponse(response: BaseResult<List<DeliveryRelationData>>?, id: Int) {
+                    responseBack(true, response?.data, null)
+                }
+
+                override fun onError(call: Call?, e: Exception?, id: Int) {
+                    responseBack(false, null, Error(e?.message))
+                }
+            }
+        )
+    }
+
+    /**
      * 分时图数据查询
      * @param params Map<String, String>  goodsCode 商品代码(必填)
      * @param responseBack Function3<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] ChartTSData?, [@kotlin.ParameterName] Error?, Unit>

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/business/future/FutureManager.kt

@@ -89,7 +89,7 @@ class FutureManager {
         goodsInfoList.forEach {
             goodsInfoAndQuotesList?.add(
                 GoodsInfoAndQuotes(
-                    outgoodscode = it.outgoodscode,
+                    outgoodscode = it.outgoodscode ?: "",
                     goodsInfo = it
                 )
             )

+ 17 - 0
RMA/app/src/main/java/cn/muchinfo/rma/global/BaseGlobalData.java

@@ -8,6 +8,7 @@ import cn.muchinfo.rma.global.data.AccountData;
 import cn.muchinfo.rma.global.data.BankAccountSignData;
 import cn.muchinfo.rma.global.data.ClientMenuData;
 import cn.muchinfo.rma.global.data.ContractTradePositionData;
+import cn.muchinfo.rma.global.data.DeliveryRelationData;
 import cn.muchinfo.rma.global.data.ErmcpGoodsSortByPositionData;
 import cn.muchinfo.rma.global.data.ErmcpRoleFuncMenuData;
 import cn.muchinfo.rma.global.data.FutureDetailsData;
@@ -130,6 +131,22 @@ public class BaseGlobalData {
      */
     private ArrayList<ErmcpGoodsSortByPositionData> ermcpGoodsSortByPositionDataArrayList;
 
+    /**
+     * 商品交割关系表
+     */
+    private ArrayList<DeliveryRelationData> deliveryRelationDataArrayList;
+
+    public ArrayList<DeliveryRelationData> getDeliveryRelationDataArrayList() {
+        if (deliveryRelationDataArrayList == null){
+            deliveryRelationDataArrayList = new ArrayList<>();
+        }
+        return deliveryRelationDataArrayList;
+    }
+
+    public void setDeliveryRelationDataArrayList(ArrayList<DeliveryRelationData> deliveryRelationDataArrayList) {
+        this.deliveryRelationDataArrayList = deliveryRelationDataArrayList;
+    }
+
     public ArrayList<ErmcpGoodsSortByPositionData> getErmcpGoodsSortByPositionDataArrayList() {
         if (ermcpGoodsSortByPositionDataArrayList == null){
             ermcpGoodsSortByPositionDataArrayList = new ArrayList<>();

+ 16 - 0
RMA/app/src/main/java/cn/muchinfo/rma/global/StringUtils.kt

@@ -1,5 +1,6 @@
 package cn.muchinfo.rma.global
 
+import cn.muchinfo.rma.R
 import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
 import com.blankj.utilcode.util.TimeUtils
 import java.text.SimpleDateFormat
@@ -27,6 +28,21 @@ fun String.isBlankString() : String{
     return this
 }
 
+fun String.colorType() : Int{
+    if (this.isNullOrEmpty()){
+        return R.color.rma_black_33
+    }
+    var str = R.color.rma_black_33
+    if (this == "1"){
+        str = R.color.rma_black_33
+    }else if (this == "2"){
+        str = R.color.rma_green_color
+    }else if (this == "3"){
+        str = R.color.rma_red_color
+    }
+    return str
+}
+
 /**
  * 金额数量不存在时显示0
  * @receiver String

+ 145 - 0
RMA/app/src/main/java/cn/muchinfo/rma/global/data/DeliveryRelationData.kt

@@ -0,0 +1,145 @@
+package cn.muchinfo.rma.global.data
+
+import android.os.Parcel
+import android.os.Parcelable
+import com.google.gson.annotations.SerializedName
+
+/**
+ * 交割关系表
+ */
+data class DeliveryRelationData(
+    @SerializedName("begindate")
+    val begindate : String? = "",//起始日期(yyyyMMdd)
+    @SerializedName("buytemplateid")
+    val buytemplateid : String? = "",//买履约计划模板ID
+    @SerializedName("deliverygoodscode")
+    val deliverygoodscode : String? = "",//品种代码
+    @SerializedName("deliverygoodsid")
+    val deliverygoodsid : String? = "",//交割商品
+    @SerializedName("deliverygoodsname")
+    val deliverygoodsname : String? = "",//品种名称
+    @SerializedName("deliverymode")
+    val deliverymode : String? = "",//交割方式 - 1:点选式 2:申报式
+    @SerializedName("deliverypricerule")
+    val deliverypricerule : String? = "",//交割价规则- 1:行情价 2:建仓价
+    @SerializedName("deliverytype")
+    val deliverytype : String? = "",//交割模式 - 1:X交割 2:X+P交割 3:X+C交割 4:X+P+C交割  1,3为云融大宗的挂牌转让 2,4为云融大宗的基差点价
+    @SerializedName("enddate")
+    val enddate : String? = "",//结束日期(yyyyMMdd)
+    @SerializedName("goodscode")
+    val goodscode:  String? = "",//商品代码
+    @SerializedName("goodsid")
+    val goodsid : String? = "",//交易合约ID
+    @SerializedName("goodsname")
+    val goodsname:  String? = "",//商品名称
+    @SerializedName("marketid")
+    val marketid : String? = "",//市场ID
+    @SerializedName("mindeliveryqty")
+    val mindeliveryqty : String? = "",//最小交割系数(K)
+    @SerializedName("p2deliveryprice")
+    val p2deliveryprice : String? = "",//P2合约价格(商品价时填写0,固定值时填写固定值)
+    @SerializedName("p2deliveryratio")
+    val p2deliveryratio : String? = "",//P2合约系数§
+    @SerializedName("p2goodsid")
+    val p2goodsid:  String? = "",//P2合约ID
+    @SerializedName("p2pricemode")
+    val p2pricemode : String? = "",//P2合约价格方式 - 1:商品价 2:固定值
+    @SerializedName("pdeliveryprice")
+    val pdeliveryprice : String? = "",//P合约价格(商品价时填写0,固定值时填写固定值)
+    @SerializedName("pdeliveryratio")
+    val pdeliveryratio : String? = "",//P合约系数(n)
+    @SerializedName("pgoodsid")
+    val pgoodsid : String? = "",//P合约ID
+    @SerializedName("ppricemode")
+    val ppricemode : String? = "",//P合约价格方式 - 1:商品价 2:固定值
+    @SerializedName("rratio")
+    val rratio : String? = "",//兑换系数®
+    @SerializedName("rratio1")
+    val rratio1 : String? = "",//兑换系数(交易合约)(R1)
+    @SerializedName("rratio2")
+    val rratio2 : String? = "",//兑换系数(仓单标准)(R2)
+    @SerializedName("selltemplateid")
+    val selltemplateid: String? = "",//卖履约计划模板ID
+    @SerializedName("wrstandardid")
+    val wrstandardid:  String? = "",//仓单标准ID
+    @SerializedName("xdeliveryratio")
+    val xdeliveryratio : String? = ""//交易合约系数(m)
+) : Parcelable{
+    constructor(parcel: Parcel) : this(
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString(),
+        parcel.readString()
+    ) {
+    }
+
+    override fun writeToParcel(parcel: Parcel, flags: Int) {
+        parcel.writeString(begindate)
+        parcel.writeString(buytemplateid)
+        parcel.writeString(deliverygoodscode)
+        parcel.writeString(deliverygoodsid)
+        parcel.writeString(deliverygoodsname)
+        parcel.writeString(deliverymode)
+        parcel.writeString(deliverypricerule)
+        parcel.writeString(deliverytype)
+        parcel.writeString(enddate)
+        parcel.writeString(goodscode)
+        parcel.writeString(goodsid)
+        parcel.writeString(goodsname)
+        parcel.writeString(marketid)
+        parcel.writeString(mindeliveryqty)
+        parcel.writeString(p2deliveryprice)
+        parcel.writeString(p2deliveryratio)
+        parcel.writeString(p2goodsid)
+        parcel.writeString(p2pricemode)
+        parcel.writeString(pdeliveryprice)
+        parcel.writeString(pdeliveryratio)
+        parcel.writeString(pgoodsid)
+        parcel.writeString(ppricemode)
+        parcel.writeString(rratio)
+        parcel.writeString(rratio1)
+        parcel.writeString(rratio2)
+        parcel.writeString(selltemplateid)
+        parcel.writeString(wrstandardid)
+        parcel.writeString(xdeliveryratio)
+    }
+
+    override fun describeContents(): Int {
+        return 0
+    }
+
+    companion object CREATOR : Parcelable.Creator<DeliveryRelationData> {
+        override fun createFromParcel(parcel: Parcel): DeliveryRelationData {
+            return DeliveryRelationData(parcel)
+        }
+
+        override fun newArray(size: Int): Array<DeliveryRelationData?> {
+            return arrayOfNulls(size)
+        }
+    }
+
+}

+ 33 - 0
RMA/app/src/main/java/cn/muchinfo/rma/global/data/QuoteDayData.kt

@@ -156,6 +156,39 @@ data class QuoteDayData(
         }
         return last.minus(ontheprice)
     }
+
+    /**
+     * 根据最新价和上一口价的对比获取字体颜色类型
+     * @return Int
+     */
+    fun getColor() : String{
+        var colorType = "1"//1 黑色 2绿色 3红色
+        if (getPrice() > ontheprice){
+            colorType = "3"
+        }else if (getPrice() < ontheprice){
+            colorType = "2"
+        }else{
+            colorType = "1"
+        }
+        return colorType
+    }
+
+
+    /**
+     * 根据最新价和昨结价的对比获取字体颜色类型
+     * @return Int
+     */
+    fun getPrecloseColor() : String{
+        var colorType = "1"//1 黑色 2绿色 3红色
+        if (getPrice() > presettle){
+            colorType = "3"
+        }else if (getPrice() < presettle){
+            colorType = "2"
+        }else{
+            colorType = "1"
+        }
+        return colorType
+    }
 }
 
 

+ 2 - 2
RMA/app/src/main/java/cn/muchinfo/rma/view/base/app/Constant.kt

@@ -17,7 +17,7 @@ object Constant {
 //     const val baseurl = "http://192.168.31.101:8080/cfg?key=test_101"//李倩千海金 18611112222
 
 //     const val baseurl = "http://192.168.31.107:8080/cfg?key=test_107"//李倩千海金 18611112222
-      const val baseurl = "http://192.168.30.211:8080/cfg?key=test_211"// 瑶姐 130000000001 123456
+//      const val baseurl = "http://192.168.30.211:8080/cfg?key=test_211"// 瑶姐 130000000001 123456
 //          const val baseurl = "http://192.168.31.107:8080/cfg?key=test_107"// 瑶姐 千海金 13760119855
 
 //    const val baseurl = "http://192.168.31.175:8080/cfg?key=test_175" // 8888  123123
@@ -28,7 +28,7 @@ object Constant {
 //    const val baseurl = "http://192.168.31.171:8080/cfg?key=test_171" // 邓工 签约解约环境
 //    const val baseurl = "http://192.168.21.71:8280/cfg?key=mtp_20"
 
-//    const val baseurl = "http://192.168.31.118:8080/cfg?key=test_118"//黄老板 华南顺通 调试
+    const val baseurl = "http://192.168.31.118:8080/cfg?key=test_118"//黄老板 华南顺通 调试
 //        const val baseurl = "http://192.168.31.136:8080/cfg?key=test_136"//黄老板 华南顺通
 
 

+ 0 - 3
RMA/app/src/main/java/cn/muchinfo/rma/view/base/chart/ChartActivity.kt

@@ -15,16 +15,13 @@ import cn.muchinfo.rma.R
 import cn.muchinfo.rma.global.GlobalDataCollection
 import cn.muchinfo.rma.global.isBlankString
 import cn.muchinfo.rma.global.toPercentage
-import cn.muchinfo.rma.lifecycle.bindOptional
 import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
 import cn.muchinfo.rma.view.base.BaseActivity
-import cn.muchinfo.rma.view.base.app.Constant
 import cn.muchinfo.rma.view.base.chart.old.timeCharts.KChartView
 import cn.muchinfo.rma.view.base.chart.old.timeCharts.TimeChartView
 import cn.muchinfo.rma.view.base.future.trade.GoodsTradeActivity
 import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
 import com.blankj.utilcode.util.ActivityUtils
-import com.blankj.utilcode.util.SPUtils
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/future/markets/MarketBaseModel.kt

@@ -86,7 +86,7 @@ class MarketBaseModel : BaseViewModel() {
     fun addSubscriptQuote(tag: String, goodsInfoList: List<GoodsInfo>) {
         GlobalScope.launch {
             MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
-                tag = tag, goodsCodeSet = goodsInfoList.map { it.outgoodscode }.toSet()
+                tag = tag, goodsCodeSet = goodsInfoList.map { it.outgoodscode ?: "" }.toSet()
             ) { isCompleted, err ->
 
             }

+ 1 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/hnstmain/HnstMainFragment.kt

@@ -1,3 +1,4 @@
+
 package cn.muchinfo.rma.view.base.hnstmain
 
 import android.Manifest

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/hnstmain/spotwarehouse/listed/ListedViewModel.kt

@@ -149,7 +149,7 @@ class ListedViewModel : BaseViewModel(){
                     jsonSonBean.name = it.goodsname
                     jsonSonBean.code = it.goodscode
                     goodsList.add(jsonSonBean)
-                    selectGoodsCode.add(it.goodsname)
+                    selectGoodsCode.add(it.goodsname ?: "")
                 }
             }
             selectGoodsName.add(selectGoodsCode)

+ 5 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/NewHomeFragment.kt

@@ -42,6 +42,7 @@ import cn.muchinfo.rma.view.base.home.financial.FinancialActivity
 import cn.muchinfo.rma.view.base.home.hedge.HedgePlanActivity
 import cn.muchinfo.rma.view.base.home.inventory.inventoryaudit.InventoryAuditActivity
 import cn.muchinfo.rma.view.base.home.inventory.inventorymanager.InventoryManagerActivity
+import cn.muchinfo.rma.view.base.home.reference.ReferenceActivity
 import cn.muchinfo.rma.view.base.home.reportquery.ReportQueryActivity
 import cn.muchinfo.rma.view.base.home.set.SettingActivity
 import cn.muchinfo.rma.view.base.home.spotmarket.SpotMarketPriceActivity
@@ -771,7 +772,10 @@ fun jumpActivity(context : Context,code : String){
     }else if (code == "client_mobile_hnstcztx"){//华南顺通-充值提现
 
     }else if (code == "client_mobile_hnstckhq"){//华南顺通-参考行情
-
+        intent.setClass(
+            context,
+            ReferenceActivity::class.java
+        )
     }
     ActivityUtils.startActivity(intent)
 }

+ 243 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceActivity.kt

@@ -0,0 +1,243 @@
+package cn.muchinfo.rma.view.base.home.reference
+
+import android.os.Bundle
+import android.view.Gravity
+import android.view.MotionEvent
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.base.BaseActivity
+import cn.muchinfo.rma.view.base.procurement.TopTabAdpater
+import cn.muchinfo.rma.view.base.procurement.TopTabYrdzAdpater
+import cn.muchinfo.rma.view.base.yrdzpurchase.adapter.TransferAdapter
+import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
+import com.blankj.utilcode.util.LogUtils
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import org.jetbrains.anko.*
+
+class ReferenceActivity : BaseActivity<ReferenceViewModel>() , ReferenceAdapter.OnContentScrollListener{
+
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+    lateinit var horScrollview: CustomHorizontalScrollView
+    lateinit var recyclerView: RecyclerView
+
+    lateinit var dataRecyclerview : RecyclerView
+
+    var fistShow: Int = 0
+    var lastShow: Int = 0
+
+    val thisTag by lazy {
+        "ReferenceActivity"
+    }
+
+    //标题头部
+    val topAdapter by lazy {
+        TopTabYrdzAdpater(this)
+    }
+
+    val referenceAdapter by lazy {
+        ReferenceAdapter(this)
+    }
+
+
+    override fun onDestroy() {
+        super.onDestroy()
+        EventBus.getDefault().unregister(this)
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onQuoteMessageEvent(quoteMessageEvent: QuoteMessageEvent) {
+        /** 行情推送过来的goodsid **/
+        quoteMessageEvent.goodsid.forEach { goodid ->
+            LogUtils.eTag("dadafafsjhdkjahkjdhak",goodid)
+            //找到相应商品信息
+            val goodsInfo = viewModel.transferDataList.value?.find { it.goodsid == goodid }
+            viewModel.transferDataList.value?.indexOf(goodsInfo)?.let {
+                if (it != -1) {//刷新相应item
+                    dataRecyclerview.adapter?.notifyItemChanged(it)
+                }
+            }
+        }
+
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        EventBus.getDefault().register(this)
+        verticalLayout {
+            viewModel.initData(tag = thisTag ?: ""){isCompleted, err ->
+                if (isCompleted){
+                    referenceAdapter.notifyDataSetChanged()
+                }
+            }
+            topBar {
+                // 返回
+                commonLeftButton()
+                commonTitle {
+                    text = "参考行情"
+                }
+            }
+
+            linearLayout {
+                linearLayout {
+                    background = resources.getDrawable(R.color.white)
+                    gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL
+                    textView {//待点价头部左侧数据
+//                            viewModel.titleList.bindOptional(context) {
+//                                text = it?.get(0)?.columntitle?.replace("\\n", "\n") ?: ""
+//                            }
+                        text = "合约"
+                        textColorStr = "#AAAAAA"
+                        textSizeAuto = 31
+                    }.lparams(wrapContent, wrapContent){
+                        marginStart = autoSize(30)
+                    }
+                }.lparams(autoSize(250), autoSize(100))
+                referenceAdapter.setOnContentScrollListener(this@ReferenceActivity)
+                inflateLayout<CustomHorizontalScrollView>(R.layout.scrollview) {
+                    horScrollview = this
+                    setOnCustomScrollChangeListener { listener, scrollX, scrollY, oldScrollX, oldScrollY -> //代码重复,可以抽取/////
+                        referenceAdapter.offestX = scrollX
+                        val viewHolderCacheList: List<ReferenceAdapter.ItemViewHolder> =
+                            referenceAdapter.viewHolderCacheList
+                        if (null != viewHolderCacheList) {
+                            val size = viewHolderCacheList.size
+                            for (i in 0 until size) {
+                                viewHolderCacheList[i].horItemScrollview.scrollTo(
+                                    scrollX,
+                                    0
+                                )
+                            }
+                        }
+                    }
+                    relativeLayout {
+                        recyclerView {//待点价头部右侧数据
+                            val linearLayoutManager = LinearLayoutManager(context)
+                            linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
+                            layoutManager = linearLayoutManager
+                            background = resources.getDrawable(R.color.white)
+                            adapter = topAdapter
+                        }
+//                            viewModel.titleList.bindOptional(context) {
+//                                val titleStringList = arrayListOf<String>()
+//                                it?.subList(1, it.size)?.forEach { data ->
+//                                    titleStringList.add(data.columntitle?.replace("\\n", "\n") ?: "")
+//                                }
+//                                topAdapter.setDatas(titleStringList)
+//                            }
+                        topAdapter.setDatas(arrayListOf("卖价","卖量","买价","买量","最新价","涨跌","幅度","今开","昨收","最低","最高","振幅","总量","现量","持仓量","日增","金额"))
+                    }
+                }.lparams(matchParent, matchParent)
+            }.lparams(matchParent, autoSize(100))
+
+            statusLayout(contentBlock = {
+                statusLayout = this
+                setRetryAction {
+
+                }
+//                bindTaskStatus(viewModule.status)
+                swipeToLoadLayout {
+                    swipeToLayout = this
+                    setEnableRefresh(true)
+                    setEnableLoadMore(false)
+                    setOnRefreshListener {
+                        viewModel.queryQuoteDay(
+                            tag = thisTag ?: "",
+                            first = fistShow,
+                            last = lastShow,
+                            list = viewModel.transferDataList.value ?: arrayListOf()
+                        ) { isCompleted, err ->
+                            if (isCompleted) {
+                                if (swipeToLayout.getIsRefreshing()) {
+                                    swipeToLayout.finishRefresh()
+                                }
+                                dataRecyclerview.adapter?.notifyItemRangeChanged(fistShow, lastShow)
+                            }
+                        }
+                    }
+                    setEnableScrollContentWhenLoaded(false)
+                    setEnableLoadMoreWhenContentNotFull(false)
+
+                    recyclerView {//待点价列表
+                        dataRecyclerview = this
+                        background = resources.getDrawable(R.color.white)
+                        adapter = referenceAdapter
+                        addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+                                super.onScrolled(recyclerView, dx, dy)
+                                val viewHolderCacheList: List<ReferenceAdapter.ItemViewHolder> =
+                                    referenceAdapter.viewHolderCacheList
+                                if (null != viewHolderCacheList) {
+                                    val size = viewHolderCacheList.size
+                                    for (i in 0 until size) {
+                                        viewHolderCacheList[i].horItemScrollview.scrollTo(
+                                            referenceAdapter.getOffestX(),
+                                            0
+                                        )
+                                    }
+                                }
+                            }
+                        })
+
+                        addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                                super.onScrollStateChanged(recyclerView, newState)
+                                // DES: 找出当前可视Item位置
+                                val linearLayoutManager = dataRecyclerview!!.layoutManager as LinearLayoutManager
+                                if (newState == RecyclerView.SCROLL_STATE_IDLE) {// 这个判断是当recyclerview不滚动时
+                                    fistShow = linearLayoutManager.findFirstVisibleItemPosition()//获取第一个显示条目
+                                    lastShow = linearLayoutManager.findLastVisibleItemPosition()//获取最后一个显示条目
+                                    if (fistShow != -1 && lastShow != -1) {
+                                        viewModel.queryQuoteDay(
+                                            tag = thisTag ?: "",
+                                            first = fistShow,
+                                            last = lastShow,
+                                            list = viewModel.transferDataList.value ?: arrayListOf()
+                                        ) { isCompleted, err ->
+                                            if (isCompleted) {
+                                                dataRecyclerview.adapter?.notifyItemRangeChanged(fistShow, lastShow)
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        })
+                    }
+
+
+                }
+            }, emptyBlock = {
+                emptyView(hint = resources.getString(R.string.now_no_data))
+            }).lparams(matchParent, matchParent)
+
+            viewModel.transferDataList.bindOptional(context) {
+                if (it?.size ?: 0 > 10){
+                    lastShow = 10
+                }else{
+                    lastShow = it?.size ?: 0
+                }
+                if (it?.isEmpty() == true || it?.size == 0) {
+                    statusLayout.showEmpty()
+                } else {
+                    if (swipeToLayout.getIsRefreshing()) {
+                        swipeToLayout.finishRefresh()
+//                        mHeadHeaderHSView.scrollTo(scrollXView,scrollYView)
+                    }
+                    statusLayout.showSuccess()
+                    referenceAdapter.setDatas(it)
+                }
+            }
+        }
+    }
+
+    override fun onScroll(event: MotionEvent?) {
+        //处理单个item滚动时,顶部tab需要联动
+        if (null != horScrollview) horScrollview.onTouchEvent(event)
+    }
+
+}

+ 405 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceAdapter.java

@@ -0,0 +1,405 @@
+package cn.muchinfo.rma.view.base.home.reference;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.Intent;
+import android.view.LayoutInflater;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewTreeObserver;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.blankj.utilcode.util.ActivityUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.muchinfo.rma.R;
+import cn.muchinfo.rma.global.GlobalDataCollection;
+import cn.muchinfo.rma.global.data.ContractTradePositionData;
+import cn.muchinfo.rma.global.data.GoodsInfoAndQuotes;
+import cn.muchinfo.rma.global.data.QuoteDayData;
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo;
+import cn.muchinfo.rma.global.database.DataBase;
+import cn.muchinfo.rma.global.utils.TimeUtils;
+import cn.muchinfo.rma.view.autoWidget.CustomHorizontalScrollView;
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils;
+import cn.muchinfo.rma.view.base.chart.ChartActivity;
+import cn.muchinfo.rma.view.base.platinumtreasure.PlatinumTrasureDetailsActivity;
+import cn.muchinfo.rma.view.base.platinumtreasure.adapter.QHjRightData;
+import cn.muchinfo.rma.view.base.platinumtreasure.adapter.QhjRightScrollAdapter;
+import cn.muchinfo.rma.view.base.platinumtreasure.trade.PlatinumTradeActivity;
+
+/**
+ * 用于千海金铂金宝页面额adapter
+ */
+public class ReferenceAdapter extends RecyclerView.Adapter<ReferenceAdapter.ItemViewHolder> {
+
+
+    private Context context;
+    private List<GoodsInfo> datas;
+    private int index = -1;
+    private int position = -1;
+    private List<ItemViewHolder> mViewHolderList = new ArrayList<>();
+    public int offestX = 0;
+    private OnContentScrollListener onContentScrollListener;
+
+
+    public interface OnContentScrollListener {
+        void onScroll(MotionEvent event);
+    }
+
+    public void setOnContentScrollListener(OnContentScrollListener onContentScrollListener) {
+        this.onContentScrollListener = onContentScrollListener;
+    }
+
+    public ReferenceAdapter(Context context) {
+        this.context = context;
+    }
+
+    public void setDatas(List<GoodsInfo> datas) {
+        this.datas = datas;
+        notifyDataSetChanged();
+    }
+
+    private void setPosition(int position) {
+        if (this.position == position) {
+            this.position = -1;
+            notifyItemChanged(index);
+        } else {
+            this.position = position;
+            notifyItemChanged(position);
+        }
+    }
+
+    @NonNull
+    @Override
+    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(context).inflate(R.layout.layout_item_transfer_content, viewGroup, false);
+        return new ItemViewHolder(view);
+    }
+
+    //回购 买一价  销售 卖一价
+    @SuppressLint("SetTextI18n")
+    @Override
+    public void onBindViewHolder(@NonNull final ItemViewHolder itemViewHolder, int i) {
+        this.index = i;
+        GoodsInfo data = datas.get(i);
+        itemViewHolder.tvLeftTitle.setText(datas.get(i).getGoodsname());
+        //右边滑动部分
+        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
+        linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
+        itemViewHolder.rvItemRight.setLayoutManager(linearLayoutManager);
+        itemViewHolder.rvItemRight.setHasFixedSize(true);
+        QhjRightScrollAdapter qhjRightScrollAdapter = new QhjRightScrollAdapter(context);
+        List<QHjRightData> rightData = new ArrayList<>();
+        //获取盘面信息
+        QuoteDayData quoteDayData = null;//当前商品的盘面信息(有用的只有买一卖一价即回购销售价,其他信息用关联商品的)
+
+        List<GoodsInfoAndQuotes> quotesList = GlobalDataCollection.Companion.getInstance().getGoodsInfoAndQuotesList();//获取盘面信息列表
+        for (int j = 0;j < quotesList.size();j++){
+            if (data.getOutgoodscode().equals(quotesList.get(j).getOutgoodscode())){
+                quoteDayData = quotesList.get(j).getQuoteDayData();//赋值当前商品的盘面信息
+            }
+        }
+
+        if (quoteDayData != null){
+            // 卖价取卖一价
+            QHjRightData askData = new QHjRightData();
+            askData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getAsk())),2));
+            askData.setColorType("3");
+            rightData.add(askData);
+
+            // 卖量取卖一量
+            QHjRightData askNumberData = new QHjRightData();
+            askNumberData.setValue(String.valueOf(quoteDayData.getAskvolume()));
+            askNumberData.setColorType("1");
+            rightData.add(askNumberData);
+
+            //买价取买一价
+            QHjRightData bidData = new QHjRightData();
+            bidData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getBid())),2));
+            bidData.setColorType("3");
+            rightData.add(bidData);
+
+            //买量取买一量
+            QHjRightData biNumberData = new QHjRightData();
+            biNumberData.setValue(String.valueOf(quoteDayData.getBidvolume()));
+            biNumberData.setColorType("1");
+            rightData.add(biNumberData);
+        }
+
+        if (quoteDayData != null){
+            //最新价
+            QHjRightData newPriceData = new QHjRightData();
+            newPriceData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getPrice())),2));
+            newPriceData.setColorType(quoteDayData.getColor());
+            rightData.add(newPriceData);
+            //涨跌幅
+            QHjRightData appliesData = new QHjRightData();
+            //涨跌
+            QHjRightData riseFallData = new QHjRightData();
+            //今开
+            QHjRightData openRightData = new QHjRightData();
+            openRightData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getOpened())),2));
+            double openRightDatColor = quoteDayData.getOpened() - quoteDayData.getPreclose();
+            if (openRightDatColor > 0){
+                openRightData.setColorType("3");
+            }else if (openRightDatColor < 0){
+                openRightData.setColorType("2");
+            }else {
+                openRightData.setColorType("1");
+            }
+            //最高价
+            QHjRightData highRightData = new QHjRightData();
+            highRightData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getHighest())),2));
+            double highRightDatColor = quoteDayData.getHighest() - quoteDayData.getPreclose();
+            if (highRightDatColor > 0){
+                highRightData.setColorType("3");
+            }else if (highRightDatColor < 0){
+                highRightData.setColorType("2");
+            }else {
+                highRightData.setColorType("1");
+            }
+            highRightData.setColorType("1");
+            //最低价
+            QHjRightData lowestRightData = new QHjRightData();
+            lowestRightData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getLowest())),data.getDecimalplace()));
+            double lowestRightDatColor = quoteDayData.getLowest() - quoteDayData.getPreclose();
+            if (lowestRightDatColor > 0){
+                lowestRightData.setColorType("3");
+            }else if (lowestRightDatColor < 0){
+                lowestRightData.setColorType("2");
+            }else {
+                lowestRightData.setColorType("1");
+            }
+            lowestRightData.setColorType("1");
+            //昨收价
+            QHjRightData yesCloseRightData = new QHjRightData();
+            yesCloseRightData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getPreclose())),data.getDecimalplace()));
+            yesCloseRightData.setColorType("1");
+            //行情时间
+            QHjRightData timeRightData = new QHjRightData();
+            if (quoteDayData.getLasttime().isEmpty()){
+                timeRightData.setValue("--");
+            }else {
+                timeRightData.setValue(TimeUtils.formatTime2(quoteDayData.getLasttime(),"HH:mm:ss"));
+            }
+            timeRightData.setColorType("1");
+            if (quoteDayData.getLast() != 0 && quoteDayData.getPreclose() != 0) {
+                String textApplies = "";
+                String textUpDown = NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf((quoteDayData.getPrice() - quoteDayData.getPresettle()))),2);//涨跌
+                if (quoteDayData.getPresettle() == 0){
+                    textApplies = "--";
+                }else {
+                    textApplies = NumberUtils.roundNum(String.valueOf((((quoteDayData.getPrice() - quoteDayData.getPresettle()) / quoteDayData.getPresettle()) * 100)),2);//涨跌幅
+                }
+                riseFallData.setValue(textUpDown);
+                appliesData.setValue(textApplies + "%");
+                if (Double.valueOf(textUpDown) > 0){
+                    riseFallData.setColorType("3");
+                    appliesData.setColorType("3");
+                }else if (Double.valueOf(textUpDown) < 0){
+                    riseFallData.setColorType("2");
+                    appliesData.setColorType("2");
+                }else {
+                    riseFallData.setColorType("1");
+                    appliesData.setColorType("1");
+                }
+            } else {
+                appliesData.setValue("--");
+                appliesData.setColorType("1");
+                riseFallData.setValue("--");
+                riseFallData.setColorType("1");
+            }
+            //振幅
+            QHjRightData amplitude = new QHjRightData();
+            amplitude.setValue("--");
+            amplitude.setColorType("1");
+            //总量
+            QHjRightData allAmount = new QHjRightData();
+            allAmount.setValue(NumberUtils.turnoverShort(quoteDayData.getTotalvolume()));
+            allAmount.setColorType("1");
+            //现量
+            QHjRightData nowquantity = new QHjRightData();
+            nowquantity.setValue("--");
+            nowquantity.setColorType("1");
+            //持仓量
+            QHjRightData position = new QHjRightData();
+            position.setValue(NumberUtils.turnoverShort(String.valueOf(quoteDayData.getHoldvolume())));
+            position.setColorType("1");
+            //日增
+            QHjRightData growing = new QHjRightData();
+            growing.setValue("--");
+            growing.setColorType("1");
+            //金额
+            QHjRightData money = new QHjRightData();
+            money.setValue(NumberUtils.turnoverShort(String.valueOf(quoteDayData.getTotalturnover())));
+            money.setColorType("1");
+
+            rightData.add(riseFallData);//涨跌
+            rightData.add(appliesData);//涨跌幅
+            rightData.add(openRightData);//今开
+            rightData.add(yesCloseRightData);//昨收
+            rightData.add(lowestRightData);//最低
+            rightData.add(highRightData);//最高
+            rightData.add(amplitude);//振幅
+            rightData.add(allAmount);//总量
+            rightData.add(nowquantity);//现量
+            rightData.add(position);//持仓量
+            rightData.add(growing);//日增
+            rightData.add(money);//金额
+        }
+        ContractTradePositionData positionData = null;
+        List<ContractTradePositionData> positionDataList = GlobalDataCollection.Companion.getInstance().getContractTradePositionDataArrayList();
+        for (int j = 0;j < positionDataList.size();j++){
+            if (String.valueOf(data.getGoodsid()).equals(positionDataList.get(j).getGoodsid())){
+                positionData = positionDataList.get(j);
+            }
+        }
+
+        qhjRightScrollAdapter.setDatas(rightData);
+        itemViewHolder.rvItemRight.setAdapter(qhjRightScrollAdapter);
+        //缓存当前holder
+        if (!mViewHolderList.contains(itemViewHolder)) {
+            mViewHolderList.add(itemViewHolder);
+        }
+        if (i == this.position) {
+            itemViewHolder.roots_view.setBackgroundColor(context.getResources().getColor(R.color.qhj_click_bg));
+            itemViewHolder.allView.setVisibility(View.VISIBLE);
+        } else {
+            itemViewHolder.roots_view.setBackgroundColor(context.getResources().getColor(R.color.white));
+            itemViewHolder.allView.setVisibility(View.GONE);
+        }
+
+        itemViewHolder.all_click_View.setOnClickListener(view -> setPosition(i));
+        itemViewHolder.horItemScrollview.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                setPosition(i);
+            }
+        });
+
+        itemViewHolder.transfer_buy.setVisibility(View.GONE);
+
+        //图表点击
+        itemViewHolder.platnum_chart.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent();
+                intent.putExtra("outGoodsCode", data.getOutgoodscode());
+                intent.putExtra("goodsCode", data.getGoodscode());
+                intent.putExtra("goodsId", String.valueOf(data.getGoodsid()));
+//                intent.putExtra("goodsGroupId", list?.get(position)?.goodsgroupid)
+                intent.putExtra("marketId", String.valueOf(data.getMarketid()));
+                intent.setClass(context, ChartActivity.class);
+                ActivityUtils.startActivity(intent);
+            }
+        });
+        if (data.getPictureurl().isEmpty()){
+            itemViewHolder.platnum_details.setVisibility(View.GONE);
+        }
+        //详情点击
+        itemViewHolder.platnum_details.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                Intent intent = new Intent();
+                intent.putExtra("goodsname",data.getGoodsname());
+                intent.putExtra("imageString",data.getPictureurl());
+                intent.setClass(context, PlatinumTrasureDetailsActivity.class);
+                ActivityUtils.startActivity(intent);
+            }
+        });
+        itemViewHolder.rvItemRight.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View view) {
+                ToastUtils.showLong("ahhahahha");
+            }
+        });
+
+
+        itemViewHolder.horItemScrollview.setEventListener(new CustomHorizontalScrollView.EventListener() {
+            @Override
+            public void onEvent(MotionEvent ev) {
+
+                if (null != onContentScrollListener) onContentScrollListener.onScroll(ev);
+
+            }
+        });
+        //由于viewHolder的缓存,在1级缓存取出来是2个viewholder,并且不会被重新赋值,所以这里需要处理缓存的viewholder的位移
+        itemViewHolder.horItemScrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
+            @Override
+            public void onGlobalLayout() {
+                if (!itemViewHolder.isLayoutFinish()) {
+                    itemViewHolder.horItemScrollview.scrollTo(offestX, 0);
+                    itemViewHolder.setLayoutFinish(true);
+                }
+            }
+        });
+    }
+
+    float start, end;
+    float distance = 0;
+    boolean isclick = false;
+    boolean isFirst = false;
+
+    @Override
+    public int getItemCount() {
+        return null == datas ? 0 : datas.size();
+    }
+
+    public List<ItemViewHolder> getViewHolderCacheList() {
+        return mViewHolderList;
+    }
+
+    public int getOffestX() {
+        return offestX;
+    }
+
+    public static class ItemViewHolder extends RecyclerView.ViewHolder {
+        LinearLayout roots_view;//根部布局
+        TextView transfer_buy;//买卖大厅
+        TextView platnum_chart;//图表
+        TextView platnum_details;//详情
+        LinearLayout allView;//隐藏的底部操作空间
+        LinearLayout all_click_View;//item左侧点击控件
+        RelativeLayout item_onclick;
+        TextView tvLeftTitle;//左边销售方字段
+        RecyclerView rvItemRight;//右方的列表
+        ImageView click_icon;//图标
+        public CustomHorizontalScrollView horItemScrollview;//右方的滑动控件
+        private boolean isLayoutFinish;//自定义字段,用于标记layout
+
+        public boolean isLayoutFinish() {
+            return isLayoutFinish;
+        }
+
+        public void setLayoutFinish(boolean layoutFinish) {
+            isLayoutFinish = layoutFinish;
+        }
+
+        public ItemViewHolder(@NonNull View itemView) {
+            super(itemView);
+            item_onclick = itemView.findViewById(R.id.item_onclick);
+            click_icon = itemView.findViewById(R.id.click_icon);
+            transfer_buy = itemView.findViewById(R.id.transfer_buy);
+            platnum_chart = itemView.findViewById(R.id.platnum_chart);
+            platnum_details = itemView.findViewById(R.id.platnum_details);
+            tvLeftTitle = itemView.findViewById(R.id.tv_left_title);
+            rvItemRight = itemView.findViewById(R.id.rv_item_right);
+            horItemScrollview = itemView.findViewById(R.id.hor_item_scrollview);
+            allView = itemView.findViewById(R.id.all_view);
+            all_click_View = itemView.findViewById(R.id.all_click_View);
+            roots_view = itemView.findViewById(R.id.roots_view);
+        }
+    }
+}

+ 98 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/reference/ReferenceViewModel.kt

@@ -0,0 +1,98 @@
+package cn.muchinfo.rma.view.base.home.reference
+
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.global.database.DataBase
+import cn.muchinfo.rma.view.MyApplication
+import cn.muchinfo.rma.view.base.BaseViewModel
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+
+/**
+ * 参考行情viewModel
+ */
+class ReferenceViewModel : BaseViewModel(){
+
+    //基差点价数据列表
+    val transferDataList : MutableLiveData<List<GoodsInfo>> = MutableLiveData()
+
+    /**
+     * 初始化列表
+     * @param tag String
+     * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun initData(tag: String,callback: (isCompleted: Boolean, err: Error?) -> Unit){
+        val list = arrayListOf<GoodsInfo>()
+        val allList = DataBase.getInstance().goodsInfoDao().all
+        allList.forEach {data ->
+            if (data.trademode == 99 && data.goodsstatus == 3){
+                list.add(data)
+            }
+        }
+        transferDataList.postValue(list)
+        if (list.size > 10){
+            queryQuoteDay(tag,0,10,list){isCompleted, err ->
+                callback(isCompleted, err)
+            }
+        }else{
+            queryQuoteDay(tag,0,list.size,list){isCompleted, err ->
+                callback(isCompleted, err)
+            }
+        }
+    }
+
+    /**
+     * 请求盘面信息
+     * @param first Int
+     * @param last Int
+     * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun queryQuoteDay(
+        tag: String,
+        first: Int,
+        last: Int,
+        list : List<GoodsInfo> = arrayListOf(),
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ) {
+        val goodsCodes = getgoodsCodes(first, last,list)
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCodes", goodsCodes)
+        }
+        MyApplication.getInstance()?.futureManager?.queryQuoteDay(params = params) { isSuccess, respData, error ->
+            if (isSuccess) {
+                callback(true, null)
+            } else {
+                callback(false, error)
+            }
+        }
+
+        transferDataList.value?.subList(first, last)?.let { addSubscriptQuote(tag = tag, goodsInfoList = it) }
+    }
+
+    //获取本商品的盘面信息的同时,还要获取关联商品的盘面信息
+    fun getgoodsCodes(first: Int, last: Int,list : List<GoodsInfo>): String {
+        var goodsCodes = ""
+        val newList = list.subList(first, last)
+        newList.forEach {
+            goodsCodes = goodsCodes + it.goodscode + ","
+        }
+        return goodsCodes
+    }
+
+    /**
+     * 订阅行情
+     * @param tag String
+     * @param goodsInfoList List<GoodsInfo>
+     */
+    fun addSubscriptQuote(tag: String, goodsInfoList: List<GoodsInfo>) {
+        GlobalScope.launch {
+            MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
+                tag = tag, goodsCodeSet = goodsInfoList.map { it.goodscode ?: "" }.toSet()
+            ) { isCompleted, err ->
+
+            }
+        }
+    }
+
+}

+ 21 - 44
RMA/app/src/main/java/cn/muchinfo/rma/view/base/login/LoginActivity.kt

@@ -501,57 +501,34 @@ class LoginActivity : BaseActivity<LoginViewModel>(), UserPopupWindow.OnClearAcc
                         } else {
                             MyApplication.getInstance()?.futureManager?.queryGoodsList { isCompleted, err ->
                                 if (isCompleted) {
-                                    viewModel.loadingDialogStatus.value =
-                                        TaskUiModel.success(msg = "登录成功")
                                     SPUtils.getInstance()
                                         .put(Constant.QUERY_GOODS_TIME, TimeUtils.getNowMills())
-                                    goHomePage()
+                                    if (SPUtils.getInstance().getString(Constant.oem) == "yrdz"){//如果为云融大宗登录则需要查询商品交割关系表
+                                        val params = mutableMapOf<String,String>().apply {
+                                            put("marketid",GlobalDataCollection.instance?.getMaketidByTrademode(16).toString())
+                                        }
+                                        MyApplication.getInstance()?.chartManager?.queryDeliveryRelation(params = params){isSuccess, respData, error ->
+                                            if (isSuccess){
+                                                GlobalDataCollection.instance?.setDeliveryRelationDataArrayList(respData?.toArrayList())
+                                                viewModel.loadingDialogStatus.value =
+                                                    TaskUiModel.success(msg = "登录成功")
+                                                goHomePage()
+                                            }else{
+                                                viewModel.loadingDialogStatus.value =
+                                                    TaskUiModel.failed(InteractiveException(errorMessage = "商品交割关系表请求失败"))
+                                            }
+                                        }
+                                    }else{
+                                        viewModel.loadingDialogStatus.value =
+                                            TaskUiModel.success(msg = "登录成功")
+                                        goHomePage()
+                                    }
+
                                 } else {
                                     viewModel.loadingDialogStatus.value =
                                         TaskUiModel.failed(InteractiveException(errorMessage = "商品请求失败"))
                                 }
                             }
-//                            // 商品信息要求每过24小时请求一次
-//                            if (SPUtils.getInstance()
-//                                    .getLong(Constant.QUERY_GOODS_TIME, 0) == 0L
-//                            ) {//如果拿到的记录的商品信息请求时间为空则进行商品信息请求
-//                                MyApplication.getInstance()?.futureManager?.queryGoodsList { isCompleted, err ->
-//                                    if (isCompleted) {
-//                                        viewModel.loadingDialogStatus.value =
-//                                            TaskUiModel.success(msg = "登录成功")
-//                                        SPUtils.getInstance()
-//                                            .put(Constant.QUERY_GOODS_TIME, TimeUtils.getNowMills())
-//                                        goHomePage()
-//                                    } else {
-//                                        viewModel.loadingDialogStatus.value =
-//                                            TaskUiModel.failed(InteractiveException(errorMessage = "商品请求失败"))
-//                                    }
-//                                }
-//                            } else {//如果记录的时间和当前时间相差超过24小时则进行商品信息请求
-//                                if (TimeUtils.getNowMills().minus(
-//                                        SPUtils.getInstance().getLong(Constant.QUERY_GOODS_TIME)
-//                                    ) >= 86400000
-//                                ) {
-//                                    MyApplication.getInstance()?.futureManager?.queryGoodsList { isCompleted, err ->
-//                                        if (isCompleted) {
-//                                            viewModel.loadingDialogStatus.value =
-//                                                TaskUiModel.success(msg = "登录成功")
-//                                            SPUtils.getInstance().put(
-//                                                Constant.QUERY_GOODS_TIME,
-//                                                TimeUtils.getNowMills()
-//                                            )
-//                                            goHomePage()
-//                                        } else {
-//                                            viewModel.loadingDialogStatus.value =
-//                                                TaskUiModel.failed(InteractiveException(errorMessage = "商品请求失败"))
-//                                        }
-//                                    }
-//                                } else {
-//                                    //不请求商品信息时要把本地数据库的商品信息赋值给数据中心
-//                                    MyApplication.getInstance()?.futureManager?.putGoodsInfoAndQuotesList()
-//                                    goHomePage()
-//                                }
-//                            }
                         }
                     }
                 }

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/PlatinumTreasureViewModel.kt

@@ -128,7 +128,7 @@ class PlatinumTreasureViewModel : BaseViewModel(){
         }
         GlobalScope.launch {
             MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
-                tag = tag, goodsCodeSet = newGoodsInfoList.map { it.goodscode }.toSet()
+                tag = tag, goodsCodeSet = newGoodsInfoList.map { it.goodscode ?: "" }.toSet()
             ) { isCompleted, err ->
 
             }

+ 2 - 2
RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/adapter/QhjRightScrollAdapter.java

@@ -46,10 +46,10 @@ public class QhjRightScrollAdapter extends RecyclerView.Adapter<QhjRightScrollAd
 //            scrollViewHolder.mTvScrollItem.setBackgroundColor(null);
             scrollViewHolder.mTvScrollItem.setTextColor(context.getResources().getColor(R.color.rma_black_33));
         }else  if (data.getColorType().equals("2")){//绿色
-            scrollViewHolder.mTvScrollItem.setBackground(context.getResources().getDrawable(R.drawable.qhj_green_bg));
+//            scrollViewHolder.mTvScrollItem.setBackground(context.getResources().getDrawable(R.drawable.qhj_green_bg));
             scrollViewHolder.mTvScrollItem.setTextColor(context.getResources().getColor(R.color.rma_green_color));
         }else {//红色
-            scrollViewHolder.mTvScrollItem.setBackground(context.getResources().getDrawable(R.drawable.qhj_red_bg));
+//            scrollViewHolder.mTvScrollItem.setBackground(context.getResources().getDrawable(R.drawable.qhj_red_bg));
             scrollViewHolder.mTvScrollItem.setTextColor(context.getResources().getColor(R.color.rma_red_color));
         }
         scrollViewHolder.mTvScrollItem.setText(data.getValue());

+ 1 - 11
RMA/app/src/main/java/cn/muchinfo/rma/view/base/platinumtreasure/trade/PlatinumBuyOrSellUI.kt

@@ -1,6 +1,5 @@
 package cn.muchinfo.rma.view.base.platinumtreasure.trade
 
-import android.annotation.SuppressLint
 import android.content.Intent
 import android.graphics.Color
 import android.view.Gravity
@@ -9,37 +8,28 @@ import android.widget.TextView
 import androidx.lifecycle.MutableLiveData
 import cn.muchinfo.rma.R
 import cn.muchinfo.rma.global.GlobalDataCollection
-import cn.muchinfo.rma.global.data.ContractTradeOrderDetailData
 import cn.muchinfo.rma.global.data.ContractTradePositionData
 import cn.muchinfo.rma.global.data.UserNodeCfgAndStatusData
 import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
-import cn.muchinfo.rma.global.database.AppDatabase
 import cn.muchinfo.rma.global.database.DataBase
 import cn.muchinfo.rma.global.isBlankString
-import cn.muchinfo.rma.global.room.Builder
 import cn.muchinfo.rma.lifecycle.bindOptional
 import cn.muchinfo.rma.view.autoWidget.*
 import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
 import cn.muchinfo.rma.view.autoWidget.view.MangeNumberEditText2
 import cn.muchinfo.rma.view.base.AgreementActivity
-import cn.muchinfo.rma.view.base.app.Constant
-import cn.muchinfo.rma.view.base.app.FutureConstent
 import cn.muchinfo.rma.view.base.future.trade.itemView
 import cn.muchinfo.rma.view.base.home.contract.emptyView
 import cn.muchinfo.rma.view.base.main.PayActivity
 import cn.muchinfo.rma.view.base.main.castsurely.AddCastSurelyActivity
-import cn.muchinfo.rma.view.base.main.castsurely.MyCastSurelyViewHolder
 import cn.muchinfo.rma.view.eventbus.EventConstent
 import cn.muchinfo.rma.view.eventbus.MessageEvent
 import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
 import cn.muchinfo.rma.view.eventbus.TradeMessageEvent
 import com.blankj.utilcode.util.ActivityUtils
-import com.blankj.utilcode.util.LogUtils
-import com.blankj.utilcode.util.SPUtils
 import com.blankj.utilcode.util.ToastUtils
 import mtp.polymer.com.autowidget.adapter.BaseAdapter
 import mtp.polymer.com.autowidget.dialog.*
-import mtp.polymer.com.autowidget.utils.TaskUiModel
 import mtp.polymer.com.autowidget.utils.bindTaskStatus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
@@ -165,7 +155,7 @@ class PlatinumBuyOrSellUI(
                     ) {
                         initData(
                             goodsId = this.goodsid.toString(),
-                            outGoodsCode = this.goodscode,
+                            outGoodsCode = this.goodscode ?: "",
                             isShowLoading = false
                         )
                     }

+ 65 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/procurement/TopTabYrdzAdpater.java

@@ -0,0 +1,65 @@
+package cn.muchinfo.rma.view.base.procurement;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import java.util.List;
+
+import cn.muchinfo.rma.R;
+
+/**
+ * @author:JianFeng
+ * @date:2019/3/26 17:19
+ * @description:
+ */
+public class TopTabYrdzAdpater extends RecyclerView.Adapter<TopTabYrdzAdpater.TabViewHolder> {
+
+
+    private Context context;
+    private List<String> datas;
+
+    public TopTabYrdzAdpater(Context context) {
+        this.context = context;
+    }
+
+
+    public void setDatas(List<String> datas) {
+        this.datas = datas;
+        notifyDataSetChanged();
+    }
+
+
+    @NonNull
+    @Override
+    public TabViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
+        View view = LayoutInflater.from(context).inflate(R.layout.layout_yrdz_item_top_scroll, viewGroup, false);
+        return new TabViewHolder(view);
+    }
+
+    @Override
+    public void onBindViewHolder(@NonNull TabViewHolder tabViewHolder, int i) {
+        tabViewHolder.mTabTv.setText(datas.get(i));
+    }
+
+    @Override
+    public int getItemCount() {
+        return null == datas ? 0 : datas.size();
+    }
+
+    class TabViewHolder extends RecyclerView.ViewHolder {
+
+        TextView mTabTv;
+
+        public TabViewHolder(@NonNull View itemView) {
+            super(itemView);
+            mTabTv = itemView.findViewById(R.id.tv_right_scroll);
+        }
+    }
+
+}

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/recycling/RecyclingViewModel.kt

@@ -102,7 +102,7 @@ class RecyclingViewModel : BaseViewModel(){
         }
         GlobalScope.launch {
             MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
-                tag = tag, goodsCodeSet = newGoodsInfoList.map { it.goodscode }.toSet()
+                tag = tag, goodsCodeSet = newGoodsInfoList.map { it.goodscode ?: "" }.toSet()
             ) { isCompleted, err ->
 
             }

+ 1 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/warehousereceipt/WarehouseReceiptViewModel.kt

@@ -273,7 +273,7 @@ class WarehouseReceiptViewModel : BaseViewModel(){
         val goodsInfoList1 = DataBase.getInstance().goodsInfoDao().all
         goodsInfoList1?.forEach {
             if (it?.goodsgroupid.toString() == goodsgroupid){
-                newGoodsInfoList.add(SelectData(id = it?.goodsid.toString(),value = it?.goodsname.toString(),goodsCode = it.goodscode))
+                newGoodsInfoList.add(SelectData(id = it?.goodsid.toString(),value = it?.goodsname.toString(),goodsCode = it.goodscode ?: ""))
             }
         }
         goodsInfoList.postValue(newGoodsInfoList)

+ 222 - 5
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/BasePriceFragment.kt

@@ -1,33 +1,250 @@
 package cn.muchinfo.rma.view.base.yrdzpurchase
 
 import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
+import android.view.*
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
 import cn.muchinfo.rma.view.base.BaseFragment
 import cn.muchinfo.rma.view.base.future.markets.FutureMarket
+import cn.muchinfo.rma.view.base.procurement.TopTabAdpater
+import cn.muchinfo.rma.view.base.procurement.TopTabYrdzAdpater
+import cn.muchinfo.rma.view.base.yrdzpurchase.adapter.TransferAdapter
+import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
+import com.blankj.utilcode.util.LogUtils
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import org.jetbrains.anko.*
 import org.jetbrains.anko.support.v4.UI
-import org.jetbrains.anko.verticalLayout
 
 /**
  * 云融大宗-订单交易-基差点价页面
  */
-class BasePriceFragment : BaseFragment<BasePriceViewMoldel>(){
+class BasePriceFragment : BaseFragment<BasePriceViewMoldel>(),TransferAdapter.OnContentScrollListener{
 
     companion object {
         fun getInstance() = BasePriceFragment()
     }
 
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+    lateinit var horScrollview: CustomHorizontalScrollView
+    lateinit var recyclerView: RecyclerView
+
+    lateinit var dataRecyclerview : RecyclerView
+
+    var fistShow: Int = 0
+    var lastShow: Int = 0
+
+    val thisTag by lazy {
+        this.tag
+    }
+
+    //标题头部
+    val topAdapter by lazy {
+        TopTabYrdzAdpater(activity)
+    }
+
+    val basePriceAdapter by lazy {
+        TransferAdapter(activity)
+    }
+
+    //注册eventbus
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        EventBus.getDefault().register(this)
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        EventBus.getDefault().unregister(this)
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onQuoteMessageEvent(quoteMessageEvent: QuoteMessageEvent) {
+        /** 行情推送过来的goodsid **/
+        quoteMessageEvent.goodsid.forEach { goodid ->
+            LogUtils.eTag("dadafafsjhdkjahkjdhak",goodid)
+            //找到相应商品信息
+            val goodsInfo = viewModel.transferDataList.value?.find { it.goodsid == goodid }
+            viewModel.transferDataList.value?.indexOf(goodsInfo)?.let {
+                if (it != -1) {//刷新相应item
+                    dataRecyclerview.adapter?.notifyItemChanged(it)
+                }
+            }
+        }
+
+    }
+
     override fun onCreateView(
         inflater: LayoutInflater,
         container: ViewGroup?,
         savedInstanceState: Bundle?
     ): View? {
         return UI {
+            viewModel.initData(tag = thisTag ?: ""){isCompleted, err ->
+                if (isCompleted){
+                    basePriceAdapter.notifyDataSetChanged()
+                }
+            }
             verticalLayout {
 
+                linearLayout {
+                    linearLayout {
+                        gravity = Gravity.CENTER
+                        textView {//待点价头部左侧数据
+//                            viewModel.titleList.bindOptional(context) {
+//                                text = it?.get(0)?.columntitle?.replace("\\n", "\n") ?: ""
+//                            }
+                            text = "合约"
+                            textColorStr = "#AAAAAA"
+                            textSizeAuto = 31
+                        }.lparams(wrapContent, wrapContent)
+                    }.lparams(autoSize(250), autoSize(100))
+                    basePriceAdapter.setOnContentScrollListener(this@BasePriceFragment)
+                    inflateLayout<CustomHorizontalScrollView>(R.layout.scrollview) {
+                        horScrollview = this
+                        setOnCustomScrollChangeListener { listener, scrollX, scrollY, oldScrollX, oldScrollY -> //代码重复,可以抽取/////
+                            basePriceAdapter.offestX = scrollX
+                            val viewHolderCacheList: List<TransferAdapter.ItemViewHolder> =
+                                basePriceAdapter.viewHolderCacheList
+                            if (null != viewHolderCacheList) {
+                                val size = viewHolderCacheList.size
+                                for (i in 0 until size) {
+                                    viewHolderCacheList[i].horItemScrollview.scrollTo(
+                                        scrollX,
+                                        0
+                                    )
+                                }
+                            }
+                        }
+                        relativeLayout {
+                            recyclerView {//待点价头部右侧数据
+                                val linearLayoutManager = LinearLayoutManager(context)
+                                linearLayoutManager.orientation = LinearLayoutManager.HORIZONTAL
+                                layoutManager = linearLayoutManager
+                                background = resources.getDrawable(R.color.white)
+                                adapter = topAdapter
+                            }
+//                            viewModel.titleList.bindOptional(context) {
+//                                val titleStringList = arrayListOf<String>()
+//                                it?.subList(1, it.size)?.forEach { data ->
+//                                    titleStringList.add(data.columntitle?.replace("\\n", "\n") ?: "")
+//                                }
+//                                topAdapter.setDatas(titleStringList)
+//                            }
+                            topAdapter.setDatas(arrayListOf("卖价","卖量","买价","买量","最新价","涨跌","幅度","今开","昨收","最低","最高"))
+                        }
+                    }.lparams(matchParent, matchParent)
+                }.lparams(matchParent, autoSize(100))
+
+                statusLayout(contentBlock = {
+                    statusLayout = this
+                    setRetryAction {
+
+                    }
+//                bindTaskStatus(viewModule.status)
+                    swipeToLoadLayout {
+                        swipeToLayout = this
+                        setEnableRefresh(true)
+                        setEnableLoadMore(false)
+                        setOnRefreshListener {
+                            viewModel.queryQuoteDay(
+                                tag = thisTag ?: "",
+                                first = fistShow,
+                                last = lastShow,
+                                list = viewModel.transferDataList.value ?: arrayListOf()
+                            ) { isCompleted, err ->
+                                if (isCompleted) {
+                                    if (swipeToLayout.getIsRefreshing()) {
+                                        swipeToLayout.finishRefresh()
+                                    }
+                                    dataRecyclerview.adapter?.notifyItemRangeChanged(fistShow, lastShow)
+                                }
+                            }
+                        }
+                        setEnableScrollContentWhenLoaded(false)
+                        setEnableLoadMoreWhenContentNotFull(false)
+
+                        recyclerView {//待点价列表
+                            dataRecyclerview = this
+                            background = resources.getDrawable(R.color.white)
+                            adapter = basePriceAdapter
+                            addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                                override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
+                                    super.onScrolled(recyclerView, dx, dy)
+                                    val viewHolderCacheList: List<TransferAdapter.ItemViewHolder> =
+                                        basePriceAdapter.viewHolderCacheList
+                                    if (null != viewHolderCacheList) {
+                                        val size = viewHolderCacheList.size
+                                        for (i in 0 until size) {
+                                            viewHolderCacheList[i].horItemScrollview.scrollTo(
+                                                basePriceAdapter.getOffestX(),
+                                                0
+                                            )
+                                        }
+                                    }
+                                }
+                            })
+
+                            addOnScrollListener(object : RecyclerView.OnScrollListener() {
+                                override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+                                    super.onScrollStateChanged(recyclerView, newState)
+                                    // DES: 找出当前可视Item位置
+                                    val linearLayoutManager = dataRecyclerview!!.layoutManager as LinearLayoutManager
+                                    if (newState == RecyclerView.SCROLL_STATE_IDLE) {// 这个判断是当recyclerview不滚动时
+                                        fistShow = linearLayoutManager.findFirstVisibleItemPosition()//获取第一个显示条目
+                                        lastShow = linearLayoutManager.findLastVisibleItemPosition()//获取最后一个显示条目
+                                        if (fistShow != -1 && lastShow != -1) {
+                                            viewModel.queryQuoteDay(
+                                                tag = thisTag ?: "",
+                                                first = fistShow,
+                                                last = lastShow,
+                                                list = viewModel.transferDataList.value ?: arrayListOf()
+                                            ) { isCompleted, err ->
+                                                if (isCompleted) {
+                                                    dataRecyclerview.adapter?.notifyItemRangeChanged(fistShow, lastShow)
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+                            })
+                        }
+
+
+                    }
+                }, emptyBlock = {
+                    emptyView(hint = resources.getString(R.string.now_no_data))
+                }).lparams(matchParent, matchParent)
+
+                viewModel.transferDataList.bindOptional(context) {
+                    if (it?.size ?: 0 > 10){
+                        lastShow = 10
+                    }else{
+                        lastShow = it?.size ?: 0
+                    }
+                    if (it?.isEmpty() == true || it?.size == 0) {
+                        statusLayout.showEmpty()
+                    } else {
+                        if (swipeToLayout.getIsRefreshing()) {
+                            swipeToLayout.finishRefresh()
+//                        mHeadHeaderHSView.scrollTo(scrollXView,scrollYView)
+                        }
+                        statusLayout.showSuccess()
+                        basePriceAdapter.setDatas(it)
+                    }
+                }
             }
         }.view
     }
 
+    override fun onScroll(event: MotionEvent?) {
+        //处理单个item滚动时,顶部tab需要联动
+        if (null != horScrollview) horScrollview.onTouchEvent(event)
+    }
+
 }

+ 93 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/BasePriceViewMoldel.kt

@@ -1,11 +1,104 @@
 package cn.muchinfo.rma.view.base.yrdzpurchase
 
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.global.database.DataBase
+import cn.muchinfo.rma.view.MyApplication
 import cn.muchinfo.rma.view.base.BaseViewModel
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
 
 /**
  * 云融大宗-订单交易-基差点价viewMoldel
  */
 class BasePriceViewMoldel : BaseViewModel(){
+    //基差点价数据列表
+    val transferDataList : MutableLiveData<List<GoodsInfo>> = MutableLiveData()
+
+    /**
+     * 初始化列表
+     * @param tag String
+     * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun initData(tag: String,callback: (isCompleted: Boolean, err: Error?) -> Unit){
+        val list = arrayListOf<GoodsInfo>()
+        val allList = DataBase.getInstance().goodsInfoDao().all
+        val deliveryRelationList = GlobalDataCollection.instance?.deliveryRelationDataArrayList
+        allList.forEach {data ->
+            if (data.trademode == 16 && data.goodsstatus == 3){
+                val deliveryRelationData = deliveryRelationList?.find { it?.goodsid == data.goodsid.toString() }
+                if (deliveryRelationData?.goodsid.isNullOrEmpty().not()){
+                    if (deliveryRelationData?.deliverytype == "2" || deliveryRelationData?.deliverytype == "4"){////交割模式 - 1:X交割 2:X+P交割 3:X+C交割 4:X+P+C交割  1,3为云融大宗的挂牌转让 2,4为云融大宗的基差点价
+                        list.add(data)
+                    }
+                }
+            }
+        }
+        transferDataList.postValue(list)
+        if (list.size > 10){
+            queryQuoteDay(tag,0,10,list){isCompleted, err ->
+                callback(isCompleted, err)
+            }
+        }else{
+            queryQuoteDay(tag,0,list.size,list){isCompleted, err ->
+                callback(isCompleted, err)
+            }
+        }
+    }
+
+    /**
+     * 请求盘面信息
+     * @param first Int
+     * @param last Int
+     * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun queryQuoteDay(
+        tag: String,
+        first: Int,
+        last: Int,
+        list : List<GoodsInfo> = arrayListOf(),
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ) {
+        val goodsCodes = getgoodsCodes(first, last,list)
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCodes", goodsCodes)
+        }
+        MyApplication.getInstance()?.futureManager?.queryQuoteDay(params = params) { isSuccess, respData, error ->
+            if (isSuccess) {
+                callback(true, null)
+            } else {
+                callback(false, error)
+            }
+        }
+
+        transferDataList.value?.subList(first, last)?.let { addSubscriptQuote(tag = tag, goodsInfoList = it) }
+    }
+
+    //获取本商品的盘面信息的同时,还要获取关联商品的盘面信息
+    fun getgoodsCodes(first: Int, last: Int,list : List<GoodsInfo>): String {
+        var goodsCodes = ""
+        val newList = list.subList(first, last)
+        newList.forEach {
+            goodsCodes = goodsCodes + it.goodscode + ","
+        }
+        return goodsCodes
+    }
+
+    /**
+     * 订阅行情
+     * @param tag String
+     * @param goodsInfoList List<GoodsInfo>
+     */
+    fun addSubscriptQuote(tag: String, goodsInfoList: List<GoodsInfo>) {
+        GlobalScope.launch {
+            MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
+                tag = tag, goodsCodeSet = goodsInfoList.map { it.goodscode ?: "" }.toSet()
+            ) { isCompleted, err ->
+
+            }
+        }
+    }
 
 
 }

+ 4 - 5
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/PurchaseOrderFragment.kt

@@ -11,6 +11,7 @@ import cn.muchinfo.rma.view.autoWidget.*
 import cn.muchinfo.rma.view.base.BaseFragment
 import cn.muchinfo.rma.view.base.platinumtreasure.adapter.PlatnumTreasureAdapter
 import cn.muchinfo.rma.view.base.procurement.TopTabAdpater
+import cn.muchinfo.rma.view.base.procurement.TopTabYrdzAdpater
 import cn.muchinfo.rma.view.base.yrdzpurchase.adapter.TransferAdapter
 import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
 import com.blankj.utilcode.util.LogUtils
@@ -46,7 +47,7 @@ class PurchaseOrderFragment : BaseFragment<PurchaseOrderViewModel>() ,TransferAd
 
     //标题头部
     val topAdapter by lazy {
-        TopTabAdpater(activity)
+        TopTabYrdzAdpater(activity)
     }
 
     val transferAdapter by lazy {
@@ -95,7 +96,7 @@ class PurchaseOrderFragment : BaseFragment<PurchaseOrderViewModel>() ,TransferAd
 
                 linearLayout {
                     linearLayout {
-                        gravity = Gravity.LEFT or Gravity.CENTER_VERTICAL
+                        gravity = Gravity.CENTER
                         textView {//待点价头部左侧数据
 //                            viewModel.titleList.bindOptional(context) {
 //                                text = it?.get(0)?.columntitle?.replace("\\n", "\n") ?: ""
@@ -103,9 +104,7 @@ class PurchaseOrderFragment : BaseFragment<PurchaseOrderViewModel>() ,TransferAd
                             text = "合约"
                             textColorStr = "#AAAAAA"
                             textSizeAuto = 31
-                        }.lparams(wrapContent, wrapContent){
-                            marginStart = autoSize(30)
-                        }
+                        }.lparams(wrapContent, wrapContent)
                     }.lparams(autoSize(250), autoSize(100))
                     transferAdapter.setOnContentScrollListener(this@PurchaseOrderFragment)
                     inflateLayout<CustomHorizontalScrollView>(R.layout.scrollview) {

+ 9 - 7
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/PurchaseOrderViewModel.kt

@@ -25,12 +25,14 @@ class PurchaseOrderViewModel : BaseViewModel(){
     fun initData(tag: String,callback: (isCompleted: Boolean, err: Error?) -> Unit){
         val list = arrayListOf<GoodsInfo>()
         val allList = DataBase.getInstance().goodsInfoDao().all
-        val goodsExList = GlobalDataCollection.instance?.goodsExInfoDataArrayList
+        val deliveryRelationList = GlobalDataCollection.instance?.deliveryRelationDataArrayList
         allList.forEach {data ->
-            if (data.trademode == 69 && data.goodsstatus == 3){
-                val goodsExData = goodsExList?.find { it?.goodsid == data.goodsid.toString() }
-                if (goodsExData?.goodsid.isNullOrEmpty().not()){
-                    list.add(data)
+            if (data.trademode == 16 && data.goodsstatus == 3){
+                val deliveryRelationData = deliveryRelationList?.find { it?.goodsid == data.goodsid.toString() }
+                if (deliveryRelationData?.goodsid.isNullOrEmpty().not()){
+                    if (deliveryRelationData?.deliverytype == "1" || deliveryRelationData?.deliverytype == "3"){////交割模式 - 1:X交割 2:X+P交割 3:X+C交割 4:X+P+C交割  1,3为云融大宗的挂牌转让 2,4为云融大宗的基差点价
+                        list.add(data)
+                    }
                 }
             }
         }
@@ -92,8 +94,8 @@ class PurchaseOrderViewModel : BaseViewModel(){
     fun addSubscriptQuote(tag: String, goodsInfoList: List<GoodsInfo>) {
         GlobalScope.launch {
             MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
-                tag = tag, goodsCodeSet = goodsInfoList.map { it.goodscode }.toSet()
-            ) { isCompleted, err ->
+                tag = tag, goodsCodeSet = goodsInfoList.map { it.goodscode ?: "" }.toSet()
+            ) { _, _ ->
 
             }
         }

+ 45 - 31
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/adapter/TransferAdapter.java

@@ -38,6 +38,7 @@ import cn.muchinfo.rma.view.base.platinumtreasure.PlatinumTrasureDetailsActivity
 import cn.muchinfo.rma.view.base.platinumtreasure.adapter.QHjRightData;
 import cn.muchinfo.rma.view.base.platinumtreasure.adapter.QhjRightScrollAdapter;
 import cn.muchinfo.rma.view.base.platinumtreasure.trade.PlatinumTradeActivity;
+import cn.muchinfo.rma.view.base.yrdzpurchase.business.ContractBusinessHallActivity;
 
 /**
  * 用于千海金铂金宝页面额adapter
@@ -115,15 +116,35 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
         }
 
         if (quoteDayData != null){
+            // 卖价取卖一价
+            QHjRightData askData = new QHjRightData();
+            askData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getAsk())),2));
+            askData.setColorType("3");
+            rightData.add(askData);
+
+            // 卖量取卖一量
+            QHjRightData askNumberData = new QHjRightData();
+            askNumberData.setValue(String.valueOf(quoteDayData.getAskvolume()));
+            askNumberData.setColorType("1");
+            rightData.add(askNumberData);
+
+            //买价取买一价
             QHjRightData bidData = new QHjRightData();
-            bidData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getBid())),2));//加入回购价买一价
-            bidData.setColorType("1");
+            bidData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getBid())),2));
+            bidData.setColorType("3");
             rightData.add(bidData);
 
-            QHjRightData askData = new QHjRightData();
-            askData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getAsk())),2));//加入销售价卖一价
-            askData.setColorType("1");
-            rightData.add(askData);
+            //买量取买一量
+            QHjRightData biNumberData = new QHjRightData();
+            biNumberData.setValue(String.valueOf(quoteDayData.getBidvolume()));
+            biNumberData.setColorType("1");
+            rightData.add(biNumberData);
+
+            //最新价
+            QHjRightData newPriceData = new QHjRightData();
+            newPriceData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getPrice())),2));
+            newPriceData.setColorType(quoteDayData.getColor());
+            rightData.add(newPriceData);
         }
 
         if (quoteDayData != null){
@@ -170,14 +191,7 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
             QHjRightData yesCloseRightData = new QHjRightData();
             yesCloseRightData.setValue(NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf(quoteDayData.getPreclose())),data.getDecimalplace()));
             yesCloseRightData.setColorType("1");
-            //行情时间
-            QHjRightData timeRightData = new QHjRightData();
-            if (quoteDayData.getLasttime().isEmpty()){
-                timeRightData.setValue("--");
-            }else {
-                timeRightData.setValue(TimeUtils.formatTime2(quoteDayData.getLasttime(),"HH:mm:ss"));
-            }
-            timeRightData.setColorType("1");
+
             if (quoteDayData.getLast() != 0 && quoteDayData.getPreclose() != 0) {
                 String textApplies = "";
                 String textUpDown = NumberUtils.roundNum(NumberUtils.doubleDistortion(String.valueOf((quoteDayData.getPrice() - quoteDayData.getPresettle()))),2);//涨跌
@@ -204,13 +218,14 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
                 riseFallData.setValue("--");
                 riseFallData.setColorType("1");
             }
-            rightData.add(appliesData);//涨跌幅
+
             rightData.add(riseFallData);//涨跌
+            rightData.add(appliesData);//涨跌幅
             rightData.add(openRightData);//今开
-            rightData.add(highRightData);//最高
-            rightData.add(lowestRightData);//最低
             rightData.add(yesCloseRightData);//昨收
-            rightData.add(timeRightData);//时间
+            rightData.add(lowestRightData);//最低
+            rightData.add(highRightData);//最高
+
         }
         ContractTradePositionData positionData = null;
         List<ContractTradePositionData> positionDataList = GlobalDataCollection.Companion.getInstance().getContractTradePositionDataArrayList();
@@ -247,9 +262,8 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
             public void onClick(View view) {
                 Intent intent = new Intent();
                 intent.putExtra("goodsId",String.valueOf(data.getGoodsid()));
-                intent.putExtra("outGoodsCode",data.getGoodscode());
-                intent.putExtra("index",0);
-                intent.setClass(context, PlatinumTradeActivity.class);
+                intent.putExtra("goodsCode",data.getGoodscode());
+                intent.setClass(context, ContractBusinessHallActivity.class);
                 ActivityUtils.startActivity(intent);
             }
         });
@@ -257,13 +271,13 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
         itemViewHolder.platnum_chart.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                GoodsInfo goodsInfo = DataBase.Companion.getInstance().goodsInfoDao().getGoodsInfo(data.getRelatedgoodsid());
+
                 Intent intent = new Intent();
-                intent.putExtra("outGoodsCode", goodsInfo.getOutgoodscode());
-                intent.putExtra("goodsCode", goodsInfo.getGoodscode());
-                intent.putExtra("goodsId", String.valueOf(goodsInfo.getGoodsid()));
+                intent.putExtra("outGoodsCode", data.getOutgoodscode());
+                intent.putExtra("goodsCode", data.getGoodscode());
+                intent.putExtra("goodsId", String.valueOf(data.getGoodsid()));
 //                intent.putExtra("goodsGroupId", list?.get(position)?.goodsgroupid)
-                intent.putExtra("marketId", String.valueOf(goodsInfo.getMarketid()));
+                intent.putExtra("marketId", String.valueOf(data.getMarketid()));
                 intent.setClass(context, ChartActivity.class);
                 ActivityUtils.startActivity(intent);
             }
@@ -275,11 +289,11 @@ public class TransferAdapter extends RecyclerView.Adapter<TransferAdapter.ItemVi
         itemViewHolder.platnum_details.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View view) {
-                Intent intent = new Intent();
-                intent.putExtra("goodsname",data.getGoodsname());
-                intent.putExtra("imageString",data.getPictureurl());
-                intent.setClass(context, PlatinumTrasureDetailsActivity.class);
-                ActivityUtils.startActivity(intent);
+//                Intent intent = new Intent();
+//                intent.putExtra("goodsname",data.getGoodsname());
+//                intent.putExtra("imageString",data.getPictureurl());
+//                intent.setClass(context, PlatinumTrasureDetailsActivity.class);
+//                ActivityUtils.startActivity(intent);
             }
         });
         itemViewHolder.rvItemRight.setOnClickListener(new View.OnClickListener() {

+ 114 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessBuyHallViewHolder.kt

@@ -0,0 +1,114 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.business
+
+import android.view.Gravity
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.data.OrderQuoteDetailData
+import cn.muchinfo.rma.global.utils.VIewUtils
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.autoSize
+import cn.muchinfo.rma.view.autoWidget.onThrottleFirstClick
+import cn.muchinfo.rma.view.autoWidget.textColorInt
+import cn.muchinfo.rma.view.autoWidget.textSizeAuto
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import mtp.polymer.com.autowidget.adapter.BaseViewHolder
+import org.jetbrains.anko.*
+
+/**
+ * 买大厅viewholer
+ * @property activity AppCompatActivity
+ * @property viewModel BusinessHallViewModel
+ * @property itemSize IntArray
+ * @constructor
+ */
+class ContractBusinessBuyHallViewHolder(private val activity : AppCompatActivity, private val viewModel: ContractBusinessHallViewModel) : BaseViewHolder<OrderQuoteDetailData>(activity){
+    override val itemSize: IntArray = intArrayOf(matchParent, wrapContent)
+
+    override fun _FrameLayout.createContentView() {
+        verticalLayout {
+            background = resources.getDrawable(R.color.buy_color_bg)
+            data.bindOptional(context) {
+                if (it?.isClick == 0) {
+                   background = resources.getDrawable(R.color.buy_color_bg)
+                } else if (it?.isClick == 1) {
+                    background = resources.getDrawable(R.color.white)
+                }
+            }
+            onThrottleFirstClick {
+                viewModel.setOnBuyItemClick(data.value?.wrtradeorderid ?: "")
+            }
+
+            linearLayout {
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.LEFT
+                    textView {
+                        data.bindOptional(context){
+                            text = NumberUtils.roundNum(it?.fixedprice,2)
+                        }
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_black_33
+                    }.lparams(wrapContent, wrapContent){
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(0, autoSize(90),1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER
+                    textView {
+                        data.bindOptional(context){
+                            text = it?.orderqty
+                        }
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_black_33
+                    }.lparams(wrapContent, wrapContent)
+                }.lparams(0, autoSize(90),1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.RIGHT
+                    textView {
+                        data.bindOptional(context){
+                            text = it?.username
+                        }
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_black_33
+                    }.lparams(wrapContent, wrapContent){
+                        marginEnd = autoSize(36)
+                    }
+                }.lparams(0, autoSize(90),1f)
+            }.lparams(matchParent, autoSize(90))
+
+            // 控制区
+            linearLayout {
+                data.bindOptional(context) {
+                    if (it?.isClick == 0) {
+                        visibility = View.GONE
+                    } else if (it?.isClick == 1) {
+                        visibility = View.VISIBLE
+                    }
+                }
+                gravity = Gravity.CENTER_VERTICAL
+
+                emptyView()
+
+                textView {
+                    onThrottleFirstClick {
+                        onThrottleFirstClick {
+                            viewModel.selectData.postValue(data.value)
+                            viewModel.showPriceDialog.postValue(true)
+                        }
+                    }
+                    backgroundResource = R.drawable.rma_item_click_bg
+                    gravity = Gravity.CENTER
+                    text = "摘牌"
+                    textColorInt = R.color.rma_item_click_color
+                    textSizeAuto = 26
+                }.lparams(autoSize(120), autoSize(48)) {
+                    marginEnd = autoSize(24)
+                }
+            }.lparams(matchParent, autoSize(72))
+        }.lparams(matchParent, wrapContent)
+    }
+
+}

+ 1000 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessHallActivity.kt

@@ -0,0 +1,1000 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.business
+
+import android.annotation.SuppressLint
+import android.content.Intent
+import android.os.Bundle
+import android.view.Gravity
+import android.view.View
+import android.view.ViewGroup
+import androidx.appcompat.app.AppCompatActivity
+import androidx.lifecycle.MutableLiveData
+import androidx.viewpager.widget.PagerAdapter
+import androidx.viewpager.widget.ViewPager
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.colorType
+import cn.muchinfo.rma.global.data.OrderQuoteData
+import cn.muchinfo.rma.global.data.OrderQuoteDetailData
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.global.database.DataBase
+import cn.muchinfo.rma.global.isBlankString
+import cn.muchinfo.rma.global.toPercentage
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
+import cn.muchinfo.rma.view.base.BaseActivity
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import cn.muchinfo.rma.view.base.warehousereceipt.*
+import cn.muchinfo.rma.view.eventbus.EventConstent
+import cn.muchinfo.rma.view.eventbus.MessageEvent
+import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
+import com.blankj.utilcode.util.ActivityUtils
+import com.blankj.utilcode.util.ConvertUtils
+import com.blankj.utilcode.util.LogUtils
+import com.qmuiteam.qmui.util.QMUIDisplayHelper
+import com.qmuiteam.qmui.widget.tab.QMUITabIndicator
+import com.qmuiteam.qmui.widget.tab.QMUITabSegment
+import mtp.polymer.com.autowidget.adapter.BaseAdapter
+import mtp.polymer.com.autowidget.dialog.createLoadingDialog
+import mtp.polymer.com.autowidget.utils.bindTaskStatus
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import org.jetbrains.anko.*
+import org.jetbrains.anko.support.v4.viewPager
+
+/**
+ * 合约市场买卖大厅
+ */
+class ContractBusinessHallActivity : BaseActivity<ContractBusinessHallViewModel>(){
+
+    lateinit var segment: QMUITabSegment
+    var selectedTabIndex: Int = 0
+    private lateinit var viewPager: ViewPager
+
+    val goodsId by lazy { intent.getStringExtra("goodsId")}
+
+    val goodsCode by lazy { intent.getStringExtra("goodsCode") }
+
+    //顶部数据是否展开
+    val priceUpDown : MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = false }
+
+    /** 用于订阅行情的唯一标识 */
+    val thisTag by lazy {
+        "ContractBusinessHallActivity"
+    }
+
+    //买大厅
+    val buyHallUI by lazy { BuyHallUI(this,viewModel) }
+
+    //卖大厅
+    val sellHallUI by lazy { SellHallUI(this,viewModel) }
+
+    //viewpager的适配器
+    private var newPagerAdapter: PagerAdapter? = null
+
+    //tabSegment标题
+    private val newTabsArray: ArrayList<String> = arrayListOf()
+
+    //暂存的页面组
+    private val uiList: ArrayList<_FrameLayout> = arrayListOf()
+
+    val selectIndex: MutableLiveData<Int> = MutableLiveData()
+
+    fun initMenuData() {
+
+        newTabsArray.add("卖大厅")
+        uiList.add(sellHallUI.root)
+
+        newTabsArray.add("买大厅")
+        uiList.add(buyHallUI.root)
+
+        newPagerAdapter = object : PagerAdapter() {
+
+            override fun getPageTitle(position: Int): CharSequence? = newTabsArray[position]
+
+            override fun instantiateItem(container: ViewGroup, position: Int): Any {
+                return uiList.get(position).apply {
+                    container.addView(
+                        this,
+                        ViewGroup.LayoutParams(matchParent, matchParent)
+                    )
+                }
+            }
+
+            override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) {
+                (`object` as? View)?.let { container.removeView(it) }
+            }
+
+            override fun isViewFromObject(view: View, `object`: Any): Boolean = view == `object`
+
+            override fun getCount(): Int = newTabsArray.size
+
+        }
+
+    }
+
+    //通用的消息更新通知
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMessageEvent(messageEvent : MessageEvent) {
+        if (messageEvent.messageType == EventConstent.FID_MoneyChangedNtf){//资金账号变化通知
+            viewModel.getTaAccounts()
+        }
+    }
+
+    //行情推送通知
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onQuoteMessageEvent(quoteMessageEvent: QuoteMessageEvent) {
+        val goodsids = quoteMessageEvent.goodsid
+        //如果推送的goodsid包含当前页面的goodsid,则进行页面刷新
+        if (goodsids.contains(goodsId?.toInt())) {
+            LogUtils.eTag("BusinessHallActivity", "行情推送" + goodsId)
+            val quote =
+                GlobalDataCollection.instance?.goodsInfoAndQuotesList?.find { goodsCode == it.outgoodscode }?.quoteDayData
+            if (quote != null) {
+                //赋值盘面信息
+                viewModel.quoteDayData.postValue(quote)
+            }
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        viewModel.removeSubscriptQuote(thisTag)
+        EventBus.getDefault().unregister(this)
+    }
+
+    //初始化商品信息
+    fun initializeData(){
+        viewModel.goodsInfo.postValue(DataBase.getInstance().goodsInfoDao().getGoodsInfo(goodsId?.toInt() ?: 0))
+        viewModel.queryQuoteDay(tag = thisTag,goodsCodes = goodsCode ?: "",isShowLoading = false)
+    }
+
+    @SuppressLint("SetTextI18n")
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        initMenuData()
+        initializeData()
+
+        verticalLayout {
+
+            createLoadingDialog(hintStr = "").bindTaskStatus(context, viewModel.loadingDialogStatus)
+
+            //头部标题
+            linearLayout {
+                background = resources.getDrawable(R.color.main_title_bg_color)
+                gravity = Gravity.CENTER_VERTICAL
+                imageView {
+                    onThrottleFirstClick {
+                        finish()
+                    }
+                    imageResource = R.mipmap.back
+                }.lparams(autoSize(45), autoSize(45)) {
+                    marginStart = autoSize(36)
+                }
+
+                view {
+
+                }.lparams(autoSize(45), autoSize(45)) {
+                    marginStart = autoSize(36)
+                }
+
+                emptyView()
+
+                verticalLayout {
+                    gravity = Gravity.CENTER
+                    textView {
+                        viewModel.goodsInfo.bindOptional(context){
+                            text = it?.goodsname
+                        }
+                        textSizeAuto = 41
+                        textColorInt = R.color.white
+                    }.lparams(wrapContent, wrapContent) {
+                        topMargin = autoSize(10)
+                    }
+                }.lparams(wrapContent, autoSize(120))
+
+                emptyView()
+
+
+                imageView {
+                    onThrottleFirstClick {
+                         // TODO 挂牌
+                    }
+                    imageResource = R.mipmap.hnst_add_icon
+                }.lparams(autoSize(45), autoSize(45)) {
+                    marginEnd = autoSize(36)
+                }
+
+                imageView {
+                    onThrottleFirstClick {
+//                        val intent = Intent()
+//                        intent.putExtra("data", orderQuoteData)
+//                        intent.putExtra("type",type)
+//                        intent.setClass(context, BusinessHallDetailsActivity::class.java)
+//                        ActivityUtils.startActivity(intent)
+                    }
+                    imageResource = R.mipmap.business_two
+                }.lparams(autoSize(45), autoSize(45)) {
+                    marginEnd = autoSize(36)
+                }
+            }.lparams(matchParent, autoSize(120))
+
+            linearLayout {
+                verticalLayout {
+                    verticalLayout {
+                        linearLayout {
+                            textView {
+                                viewModel.quoteDayData.bindOptional(context){
+                                    text = NumberUtils.roundNum(NumberUtils.doubleDistortion(it?.getPrice()?.toString()),2)
+                                    textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                                }
+                                textSizeAuto = 58
+                            }.lparams(wrapContent, wrapContent){
+                                marginStart = autoSize(30)
+                            }
+
+                            imageView {
+                                imageResource = R.mipmap.rydz_price_up_icon
+                            }.lparams(autoSize(31), autoSize(31)){
+                                marginStart = autoSize(12)
+                                topMargin = autoSize(25)
+                            }
+
+                            imageView {
+                                imageResource = R.mipmap.rydz_chart_icon
+                            }.lparams(autoSize(36), autoSize(36)){
+                                marginStart = autoSize(10)
+                                topMargin = autoSize(25)
+                            }
+                        }.lparams(matchParent, wrapContent){
+                            topMargin = autoSize(10)
+                        }
+
+                        linearLayout {
+                            textView {
+                                viewModel.quoteDayData.bindOptional(context){
+                                    val gainsamount = it?.getPrice()?.minus(it.preclose)
+                                    if (gainsamount ?: 0.0 > 0.0){
+                                        text = "+" + NumberUtils.roundNum(gainsamount?.toString(),2)
+                                    }else if (gainsamount ?: 0.0 < 0.0){
+                                        text = "-" + NumberUtils.roundNum(gainsamount?.toString(),2)
+                                    }else{
+                                        text = "0"
+                                    }
+                                    textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                                }
+                                textSizeAuto = 29
+                            }.lparams(wrapContent, wrapContent){
+                                marginStart = autoSize(30)
+                            }
+
+                            emptyView()
+
+                            textView {
+                                viewModel.quoteDayData.bindOptional(context){
+                                    val gainsamount = it?.getPrice()?.minus(it.preclose)?.div(it.preclose)
+                                    if (gainsamount ?: 0.0 > 0.0){
+                                        text = "+" + gainsamount?.toString()?.toPercentage()
+                                    }else if (gainsamount ?: 0.0 < 0.0){
+                                        text = "-" + gainsamount?.toString()?.toPercentage()
+                                    }else{
+                                        text = "0%"
+                                    }
+                                    textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                                }
+                                textSizeAuto = 29
+                            }.lparams(wrapContent, wrapContent){
+                                marginStart = autoSize(30)
+                            }
+
+                            emptyView()
+                        }.lparams(matchParent, wrapContent)
+                    }.lparams(matchParent, autoSize(120))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "成交量"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.turnoverShort(it?.lastvolume?.toString())
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "持仓量"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.turnoverShort(it?.holdvolume?.toString())
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "昨结"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.presettle?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "昨收"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.preclose?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                }.lparams(0, autoSize(360),1f)
+
+                verticalLayout {
+                    linearLayout {
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "卖价"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.ask?.toString(),2)
+                                textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                            }
+                            textSizeAuto = 29
+
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "买价"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.bid?.toString(),2)
+                                textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                            }
+                            textSizeAuto = 29
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "最高"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.highest?.toString(),2)
+                                textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                            }
+                            textSizeAuto = 29
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "最低"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.lowest?.toString(),2)
+                                textColorInt = it?.getPrecloseColor()?.colorType() ?: R.color.rma_black_33
+                            }
+                            textSizeAuto = 29
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "涨停"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                             viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.limitup?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_red_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "跌停"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.limitdown?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_green_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+                }.lparams(0, autoSize(360),1f)
+
+                verticalLayout {
+                    linearLayout {
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "卖量"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.turnoverShort(it?.askvolume?.toString())
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "买量"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.turnoverShort(it?.bidvolume?.toString())
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_black_33
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "开盘"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.opened?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_red_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "均价"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.averageprice?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_red_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+
+                    linearLayout {
+                        priceUpDown.bindOptional(context){
+                            if (it == true){//收起
+                                visibility = View.GONE
+                            }else{
+                                visibility = View.VISIBLE
+                            }
+                        }
+                        visibility = View.VISIBLE
+                        gravity = Gravity.CENTER_VERTICAL
+                        textView {
+                            text = "结算"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginStart = autoSize(30)
+                        }
+
+                        emptyView()
+
+                        textView {
+                            viewModel.quoteDayData.bindOptional(context){
+                                text = NumberUtils.roundNum(it?.settle?.toString(),2)
+                            }
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_red_color
+                        }.lparams(wrapContent, wrapContent){
+                            marginEnd = autoSize(20)
+                        }
+                    }.lparams(matchParent, autoSize(60))
+                }.lparams(0, autoSize(360),1f)
+            }.lparams(matchParent, autoSize(360))
+
+            linearLayout {
+                onThrottleFirstClick {
+                    priceUpDown.postValue(priceUpDown.value?.not())
+                }
+                gravity = Gravity.CENTER_HORIZONTAL
+                imageView {
+                    priceUpDown.bindOptional(context){
+                        if (it == true){//收起
+                            imageResource = R.mipmap.yrdz_down_icon
+                        }else{
+                            imageResource = R.mipmap.yrdz_up_icon
+                        }
+                    }
+                    imageResource = R.mipmap.yrdz_up_icon
+                }.lparams(autoSize(40), autoSize(40))
+            }.lparams(matchParent, autoSize(40))
+
+            tabSegment {
+                segment = this
+                background = resources.getDrawable(R.color.segtabment_bg_color)
+                addOnTabSelectedListener(object :
+                    QMUITabSegment.OnTabSelectedListener {
+                    override fun onDoubleTap(index: Int) {}
+                    override fun onTabReselected(index: Int) {}
+                    override fun onTabUnselected(index: Int) {}
+                    override fun onTabSelected(index: Int) {
+                        selectedTabIndex = index
+                        selectIndex.postValue(index)
+                    }
+                })
+                setIndicator(
+                    QMUITabIndicator(
+                        QMUIDisplayHelper.dp2px(context, 2),
+                        false,
+                        true
+                    )
+                )
+                setDefaultTextSize(ConvertUtils.sp2px(16f), ConvertUtils.sp2px(16f))
+            }.lparams(matchParent, autoSize(100))
+
+            view {
+                background = resources.getDrawable(R.color.main_hit_bg_color)
+            }.lparams(matchParent, autoSize(1)) {
+                marginStart = autoSize(32)
+                marginEnd = autoSize(32)
+            }
+            viewPager {
+                background = resources.getDrawable(R.color.white)
+                viewPager = this
+                adapter = newPagerAdapter
+            }.lparams(matchParent, matchParent)
+
+            segment.setupWithViewPager(viewPager)
+            segment.selectTab(selectedTabIndex)
+
+        }
+    }
+
+}
+
+
+/**
+ * 卖大厅
+ * @property activity AppCompatActivity
+ * @property viewModel BusinessHallViewModel
+ * @constructor
+ */
+class SellHallUI(
+    private val activity: AppCompatActivity,
+    private val viewModel: ContractBusinessHallViewModel
+) {
+
+    // 下拉刷新
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+
+    private val businessSellHallAdapter: BaseAdapter<OrderQuoteDetailData, ContractBusinessSellHallViewHolder> =
+        BaseAdapter { _, _ ->
+            ContractBusinessSellHallViewHolder(
+                activity,
+                viewModel
+            )
+        }
+
+    val root = _FrameLayout(activity).apply {
+        verticalLayout {
+            viewModel.querySellDataList()
+            linearLayout {
+                background = resources.getDrawable(R.color.hnst_sell_hall_top_bg_color)
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.LEFT
+                    textView {
+                        text = "价格"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(0, autoSize(74), 1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER
+                    textView {
+                        text = "数量"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent)
+                }.lparams(0, autoSize(74), 1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.RIGHT
+                    textView {
+                        text = "挂牌方"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent) {
+                        marginEnd = autoSize(36)
+                    }
+                }.lparams(0, autoSize(74), 1f)
+            }.lparams(matchParent, autoSize(74))
+
+            statusLayout(contentBlock = {
+                statusLayout = this
+//                bindTaskStatus(viewModule.status)
+                setRetryAction {
+                    viewModel.querySellDataList()
+                }
+                swipeToLoadLayout {
+                    swipeToLayout = this
+                    setEnableRefresh(true)
+                    setEnableLoadMore(false)
+                    setOnRefreshListener {
+                        viewModel.querySellDataList()
+                    }
+                    setEnableScrollContentWhenLoaded(false)
+                    setEnableLoadMoreWhenContentNotFull(false)
+
+                    // 未提交列表
+                    recyclerView {
+                        background = resources.getDrawable(R.color.white)
+                        adapter = businessSellHallAdapter
+                    }.lparams(matchParent, matchParent)
+                }
+            }, emptyBlock = {
+                emptyView(hint = resources.getString(R.string.now_no_data))
+            }).lparams(matchParent, matchParent)
+
+            viewModel.businessSellHallDataList.bindOptional(context) {
+                if (it?.isEmpty() == true || it?.size == 0) {
+                    statusLayout.showEmpty()
+                } else {
+                    if (swipeToLayout.getIsRefreshing()) {
+                        swipeToLayout.finishRefresh()
+                    }
+                    statusLayout.showSuccess()
+                    businessSellHallAdapter.setNewData(it)
+                }
+            }
+        }
+    }
+
+}
+
+
+/**
+ * 买大厅
+ * @property activity AppCompatActivity
+ * @property viewModel BusinessHallViewModel
+ * @constructor
+ */
+class BuyHallUI(
+    private val activity: AppCompatActivity,
+    private val viewModel: ContractBusinessHallViewModel
+) {
+
+    // 下拉刷新
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+
+    private val businessBuyHallAdapter: BaseAdapter<OrderQuoteDetailData, ContractBusinessBuyHallViewHolder> =
+        BaseAdapter { _, _ ->
+            ContractBusinessBuyHallViewHolder(
+                activity,
+                viewModel
+            )
+        }
+
+    val root = _FrameLayout(activity).apply {
+        verticalLayout {
+            viewModel.queryBuyDataList()
+            linearLayout {
+                background = resources.getDrawable(R.color.hnst_buy_hall_top_bg_color)
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.LEFT
+                    textView {
+                        text = "价格"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(0, autoSize(74), 1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER
+                    textView {
+                        text = "数量"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent)
+                }.lparams(0, autoSize(74), 1f)
+
+                linearLayout {
+                    gravity = Gravity.CENTER_VERTICAL or Gravity.RIGHT
+                    textView {
+                        text = "挂牌方"
+                        textSizeAuto = 29
+                        textColorInt = R.color.rma_gray_color
+                    }.lparams(wrapContent, wrapContent) {
+                        marginEnd = autoSize(36)
+                    }
+                }.lparams(0, autoSize(74), 1f)
+            }.lparams(matchParent, autoSize(74))
+
+            statusLayout(contentBlock = {
+                statusLayout = this
+//                bindTaskStatus(viewModule.status)
+                setRetryAction {
+                    viewModel.queryBuyDataList()
+                }
+                swipeToLoadLayout {
+                    swipeToLayout = this
+                    setEnableRefresh(true)
+                    setEnableLoadMore(false)
+                    setOnRefreshListener {
+                        viewModel.queryBuyDataList()
+                    }
+                    setEnableScrollContentWhenLoaded(false)
+                    setEnableLoadMoreWhenContentNotFull(false)
+
+                    // 未提交列表
+                    recyclerView {
+                        background = resources.getDrawable(R.color.white)
+                        adapter = businessBuyHallAdapter
+                    }.lparams(matchParent, matchParent)
+                }
+            }, emptyBlock = {
+                emptyView(hint = resources.getString(R.string.now_no_data))
+            }).lparams(matchParent, matchParent)
+
+            viewModel.businessBuyHallDataList.bindOptional(context) {
+                if (it?.isEmpty() == true || it?.size == 0) {
+                    statusLayout.showEmpty()
+                } else {
+                    if (swipeToLayout.getIsRefreshing()) {
+                        swipeToLayout.finishRefresh()
+                    }
+                    statusLayout.showSuccess()
+                    businessBuyHallAdapter.setNewData(it)
+                }
+            }
+        }
+    }
+
+}

+ 210 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessHallViewModel.kt

@@ -0,0 +1,210 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.business
+
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.AccountData
+import cn.muchinfo.rma.global.data.OrderQuoteDetailData
+import cn.muchinfo.rma.global.data.QuoteDayData
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.netManage.base.InteractiveException
+import cn.muchinfo.rma.view.MyApplication
+import cn.muchinfo.rma.view.base.BaseViewModel
+import com.blankj.utilcode.util.LogUtils
+import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.launch
+import mtp.polymer.com.autowidget.utils.TaskUiModel
+
+/**
+ * 合约市场买卖大厅viewmodel
+ */
+class ContractBusinessHallViewModel : BaseViewModel(){
+
+    //该买卖大厅的商品信息
+    val goodsInfo : MutableLiveData<GoodsInfo> = MutableLiveData()
+
+    /**
+     * 加载状态控制
+     */
+    val loadingDialogStatus: MutableLiveData<TaskUiModel> = MutableLiveData()
+
+    //卖大厅数据
+    val businessSellHallDataList : MutableLiveData<List<OrderQuoteDetailData>> = MutableLiveData()
+
+    //买大厅数据
+    val businessBuyHallDataList : MutableLiveData<List<OrderQuoteDetailData>> = MutableLiveData()
+
+    /**
+     * 当前选择的资金账户
+     */
+    val usedAccountData : MutableLiveData<AccountData> = MutableLiveData()
+
+    /**
+     * 交易页面的当前商品的盘面信息
+     */
+    val quoteDayData: MutableLiveData<QuoteDayData> = MutableLiveData()
+
+    //摘牌时选择的买卖大厅实体
+    val selectData : MutableLiveData<OrderQuoteDetailData> = MutableLiveData()
+    //弹出摘牌dialog
+    val showPriceDialog : MutableLiveData<Boolean> = MutableLiveData<Boolean>().apply { value = false }
+
+
+    /**
+     * 查询买大厅数据
+     */
+    fun queryBuyDataList(){
+
+    }
+
+    /**
+     * 查询卖大厅数据
+     */
+    fun querySellDataList(){
+
+    }
+
+    //查询资金账号信息
+    fun getTaAccounts(){
+        val params = mutableMapOf<String, String>().apply {
+            put("loginID", GlobalDataCollection.instance?.loginRsp?.loginID.toString())
+        }
+        MyApplication.getInstance()?.initializeManager?.getTaAccounts(params = params) { isSuccess, respData, error ->
+            if (isSuccess) {
+                GlobalDataCollection.instance?.accountDataList = respData
+                resetAccountData()
+            }
+        }
+    }
+
+    //重新赋值资金账户
+    fun resetAccountData(){
+        val accountDataList = GlobalDataCollection.instance?.accountDataList
+        if (accountDataList.isNullOrEmpty().not()) {
+            val accountData = GlobalDataCollection.instance?.accountData
+            accountData?.clearData()
+            accountData?.setNormalData()
+            usedAccountData.postValue(accountData)
+        }
+    }
+
+    //重新赋值资金账户
+    fun resetAccountDataBySelect(data : AccountData){
+        data.clearData()
+        data.setNormalData()
+        usedAccountData.postValue(data)
+    }
+
+
+    /**
+     * 买大厅item点击
+     * @param deliverygoodsid String
+     */
+    fun setOnBuyItemClick(wrtradeorderid : String){
+        val oldList = businessBuyHallDataList.value
+        val newDataList = arrayListOf<OrderQuoteDetailData>()
+        oldList?.forEach {
+            if (wrtradeorderid == it.wrtradeorderid){
+                if (it.isClick == 0){
+                    newDataList.add(it.copy(isClick = 1))
+                }else{
+                    newDataList.add(it.copy(isClick = 0))
+                }
+            }else{
+                newDataList.add(it.copy(isClick = 0))
+            }
+        }
+        businessBuyHallDataList.postValue(newDataList)
+    }
+
+    /**
+     * 卖大厅item点击
+     * @param deliverygoodsid String
+     */
+    fun setOnSellItemClick(wrtradeorderid : String){
+        val oldList = businessSellHallDataList.value
+        val newDataList = arrayListOf<OrderQuoteDetailData>()
+        oldList?.forEach {
+            if (wrtradeorderid == it.wrtradeorderid){
+                if (it.isClick == 0){
+                    newDataList.add(it.copy(isClick = 1))
+                }else{
+                    newDataList.add(it.copy(isClick = 0))
+                }
+            }else{
+                newDataList.add(it.copy(isClick = 0))
+            }
+        }
+        businessSellHallDataList.postValue(newDataList)
+    }
+
+    /**
+     * 请求盘面信息
+     * @param first Int
+     * @param last Int
+     * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
+     */
+    fun queryQuoteDay(
+        tag: String,
+        goodsCodes: String,
+        isShowLoading: Boolean
+    ) {
+        if (isShowLoading) {
+            loadingDialogStatus.postValue(TaskUiModel.inFlight())
+        }
+
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCodes", goodsCodes)
+        }
+        MyApplication.getInstance()?.futureManager?.queryQuoteDay(params = params) { isSuccess, respData, error ->
+            if (isSuccess) {
+                if (respData?.isEmpty()?.not() == true) {
+                    quoteDayData.postValue(respData[0])
+                }
+                if (isShowLoading) {
+                    loadingDialogStatus.postValue(TaskUiModel.success(msg = "数据请求成功"))
+                }
+
+            } else {
+                if (isShowLoading) {
+                    loadingDialogStatus.postValue(
+                        TaskUiModel.failed(
+                            InteractiveException(
+                                errorMessage = "数据请求失败"
+                            )
+                        )
+                    )
+                }
+            }
+        }
+        addSubscriptQuote(tag = tag, goodsCodes = setOf(goodsCodes))
+    }
+
+
+    /**
+     * 订阅行情
+     * @param tag String
+     * @param goodsInfoList List<GoodsInfo>
+     */
+    fun addSubscriptQuote(tag: String, goodsCodes: Set<String>) {
+        GlobalScope.launch {
+            MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
+                tag = tag, goodsCodeSet = goodsCodes
+            ) { isCompleted, err ->
+                LogUtils.eTag("订阅行情", goodsCodes)
+            }
+        }
+    }
+
+    /**
+     * 取消订阅
+     * @param tag String
+     */
+    fun removeSubscriptQuote(tag: String) {
+        GlobalScope.launch {
+            MyApplication.getInstance()?.quoteManager?.removeSubscriptQuote(
+                tag = tag
+            )
+        }
+    }
+
+}

+ 118 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/business/ContractBusinessSellHallViewHolder.kt

@@ -0,0 +1,118 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.business
+
+import android.content.Intent
+import android.view.Gravity
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.OrderQuoteDetailData
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.autoSize
+import cn.muchinfo.rma.view.autoWidget.onThrottleFirstClick
+import cn.muchinfo.rma.view.autoWidget.textColorInt
+import cn.muchinfo.rma.view.autoWidget.textSizeAuto
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import cn.muchinfo.rma.view.base.home.spotmarket.AddSpotMarketPriceActivity
+import cn.muchinfo.rma.view.base.home.spotmarket.SpotMarketDetailsActivity
+import com.blankj.utilcode.util.ActivityUtils
+import mtp.polymer.com.autowidget.adapter.BaseViewHolder
+import mtp.polymer.com.autowidget.dialog.createWarningDialog
+import org.jetbrains.anko.*
+
+/**
+ * 卖大厅viewholder
+ * @property activity AppCompatActivity
+ * @property viewModel BusinessHallViewModel
+ * @property itemSize IntArray
+ * @constructor
+ */
+class ContractBusinessSellHallViewHolder(private val activity : AppCompatActivity, private val viewModel: ContractBusinessHallViewModel) : BaseViewHolder<OrderQuoteDetailData>(activity){
+    override val itemSize: IntArray = intArrayOf(matchParent, wrapContent)
+
+    override fun _FrameLayout.createContentView() {
+         verticalLayout {
+             background = resources.getDrawable(R.color.sell_color_bg)
+             data.bindOptional(context) {
+                 if (it?.isClick == 0) {
+                     background = resources.getDrawable(R.color.sell_color_bg)
+                 } else if (it?.isClick == 1) {
+                     background = resources.getDrawable(R.color.white)
+                 }
+             }
+             onThrottleFirstClick {
+                 viewModel.setOnSellItemClick(data.value?.wrtradeorderid ?: "")
+             }
+
+             linearLayout {
+
+                 linearLayout {
+                     gravity = Gravity.CENTER_VERTICAL or Gravity.LEFT
+                     textView {
+                         data.bindOptional(context){
+                             text = NumberUtils.roundNum(it?.pricemove,2)
+                         }
+                         textSizeAuto = 34
+                         textColorInt = R.color.rma_black_33
+                     }.lparams(wrapContent, wrapContent){
+                         marginStart = autoSize(36)
+                     }
+                 }.lparams(0, autoSize(90),1f)
+
+                 linearLayout {
+                    gravity = Gravity.CENTER
+                     textView {
+                         data.bindOptional(context){
+                             text = it?.orderqty
+                         }
+                         textSizeAuto = 34
+                         textColorInt = R.color.rma_black_33
+                     }.lparams(wrapContent, wrapContent)
+                 }.lparams(0, autoSize(90),1f)
+
+                 linearLayout {
+                     gravity = Gravity.CENTER_VERTICAL or Gravity.RIGHT
+                     textView {
+                         data.bindOptional(context){
+                             text = it?.username
+                         }
+                         textSizeAuto = 34
+                         textColorInt = R.color.rma_black_33
+                     }.lparams(wrapContent, wrapContent){
+                         marginEnd = autoSize(36)
+                     }
+                 }.lparams(0, autoSize(90),1f)
+             }.lparams(matchParent, autoSize(90))
+
+             // 控制区
+             linearLayout {
+                 data.bindOptional(context) {
+                     if (it?.isClick == 0) {
+                         visibility = View.GONE
+                     } else if (it?.isClick == 1) {
+                         visibility = View.VISIBLE
+                     }
+                 }
+                 gravity = Gravity.CENTER_VERTICAL
+
+                 emptyView()
+
+                 textView {
+                     onThrottleFirstClick {
+                         viewModel.selectData.postValue(data.value)
+                         viewModel.showPriceDialog.postValue(true)
+                     }
+                     backgroundResource = R.drawable.rma_item_click_bg
+                     gravity = Gravity.CENTER
+                     text = "摘牌"
+                     textColorInt = R.color.rma_item_click_color
+                     textSizeAuto = 26
+                 }.lparams(autoSize(120), autoSize(48)) {
+                     marginEnd = autoSize(24)
+                 }
+             }.lparams(matchParent, autoSize(72))
+         }.lparams(matchParent, wrapContent)
+    }
+
+}

+ 108 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsActivity.kt

@@ -0,0 +1,108 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.chart
+
+import android.os.Bundle
+import android.view.Gravity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.data.SpotGoodsPriceData
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.base.BaseActivity
+import cn.muchinfo.rma.view.base.home.spotmarket.SpotMarketPriceViewHolder
+import mtp.polymer.com.autowidget.adapter.BaseAdapter
+import org.jetbrains.anko.linearLayout
+import org.jetbrains.anko.matchParent
+import org.jetbrains.anko.textView
+import org.jetbrains.anko.verticalLayout
+
+//成交明细
+class DealDetailsActivity : BaseActivity<DealDetailsViewModel>(){
+
+    val goodsId by lazy { intent.getStringExtra("goodsId") }
+
+    val goodsName by lazy { intent.getStringExtra("goodsName") }
+
+    // 下拉刷新
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+
+    private val dealDetailsViewHolder: BaseAdapter<String, DealDetailsViewHolder> =
+        BaseAdapter { _, _ ->
+            DealDetailsViewHolder(
+                this,
+                viewModel
+            )
+        }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        verticalLayout {
+            background = resources.getDrawable(R.color.segtabment_bg_color)
+            topBar {
+                commonLeftButton()
+                commonTitle {
+                    text = goodsName
+                }
+            }
+            linearLayout {
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "时间"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "成交价"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "成交量"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+            }.lparams(matchParent, autoSize(100))
+
+            statusLayout(contentBlock = {
+                statusLayout = this
+//                bindTaskStatus(viewModule.status)
+                setRetryAction {
+                    viewModel.getDealDetailsDataList()
+                }
+                swipeToLoadLayout {
+                    swipeToLayout = this
+                    setEnableRefresh(true)
+                    setEnableLoadMore(false)
+                    setOnRefreshListener {
+                        viewModel.getDealDetailsDataList()
+                    }
+                    setEnableScrollContentWhenLoaded(false)
+                    setEnableLoadMoreWhenContentNotFull(false)
+
+                    // 未提交列表
+                    recyclerView {
+                        background = resources.getDrawable(R.color.white)
+                        adapter = dealDetailsViewHolder
+                    }.lparams(matchParent, matchParent)
+                }
+            }, emptyBlock = {
+                emptyView(hint = resources.getString(R.string.now_no_data))
+            }).lparams(matchParent, matchParent)
+
+            viewModel.dealDetailsDataList.bindOptional(context) {
+                if (it?.isEmpty() == true || it?.size == 0) {
+                    statusLayout.showEmpty()
+                } else {
+                    if (swipeToLayout.getIsRefreshing()) {
+                        swipeToLayout.finishRefresh()
+                    }
+                    statusLayout.showSuccess()
+                    dealDetailsViewHolder.setNewData(it)
+                }
+            }
+
+        }
+    }
+
+}

+ 43 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsViewHoder.kt

@@ -0,0 +1,43 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.chart
+
+import android.view.Gravity
+import androidx.appcompat.app.AppCompatActivity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.view.autoWidget.autoSize
+import cn.muchinfo.rma.view.autoWidget.textColorInt
+import cn.muchinfo.rma.view.autoWidget.textSizeAuto
+import cn.muchinfo.rma.view.base.future.trade.itemView
+import mtp.polymer.com.autowidget.adapter.BaseViewHolder
+import org.jetbrains.anko.*
+
+class DealDetailsViewHolder(private val activity : AppCompatActivity,private val viewModel: DealDetailsViewModel) : BaseViewHolder<String>(activity){
+    override val itemSize: IntArray = intArrayOf(matchParent, wrapContent)
+
+    override fun _FrameLayout.createContentView() {
+        verticalLayout {
+            linearLayout {
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "时间"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "成交价"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+                textView {
+                    gravity = Gravity.CENTER
+                    text = "成交量"
+                    textSizeAuto = 30
+                    textColorInt = R.color.rma_hint_title_text_color
+                }.lparams(0, autoSize(100),1f)
+            }.lparams(matchParent, autoSize(100))
+
+            itemView()
+        }.lparams(matchParent, wrapContent)
+    }
+
+}

+ 16 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/DealDetailsViewModel.kt

@@ -0,0 +1,16 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.chart
+
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.view.base.BaseViewModel
+
+//云融大宗成交明细
+class DealDetailsViewModel : BaseViewModel(){
+
+    val dealDetailsDataList : MutableLiveData<List<String>> = MutableLiveData()
+
+
+    fun getDealDetailsDataList(){
+
+    }
+
+}

+ 235 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/YrdzChartActivity.kt

@@ -0,0 +1,235 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.chart;
+
+import android.content.Context
+import android.content.Intent
+import android.os.Bundle
+import android.view.View
+import android.widget.ImageView
+import android.widget.ProgressBar
+import android.widget.RelativeLayout
+import com.google.android.material.tabs.TabLayout
+
+import android.widget.TextView
+import androidx.lifecycle.Observer
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.isBlankString
+import cn.muchinfo.rma.global.toPercentage
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
+import cn.muchinfo.rma.view.base.BaseActivity
+import cn.muchinfo.rma.view.base.chart.ChartDataAdapter
+import cn.muchinfo.rma.view.base.chart.old.timeCharts.KChartView
+import cn.muchinfo.rma.view.base.chart.old.timeCharts.TimeChartView
+import cn.muchinfo.rma.view.base.future.trade.GoodsTradeActivity
+import cn.muchinfo.rma.view.eventbus.QuoteMessageEvent
+import com.blankj.utilcode.util.ActivityUtils
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import org.jetbrains.anko.textColor
+
+/**
+ * 图表相关
+ */
+class YrdzChartActivity : BaseActivity<YrdzChartViewModel>() , View.OnClickListener{
+
+    lateinit var timeChartView: TimeChartView
+    lateinit var tabLayout: TabLayout
+    lateinit var kChartView: KChartView
+    lateinit var progressBar: ProgressBar
+
+    companion object {
+        // 启动页面
+        fun start(goodsId: String?, goodsCode: String?, outGoodsCode: String?, context: Context) {
+            val intent = Intent()
+            intent.setClass(context, YrdzChartActivity::class.java)
+            intent.putExtra("goodsId", goodsId)
+            intent.putExtra("goodsCode", goodsCode)
+            intent.putExtra("outGoodsCode", outGoodsCode)
+            context.startActivity(intent)
+        }
+    }
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        EventBus.getDefault().register(this)
+        setContentView(R.layout.activity_chart)
+        initView()
+        viewModel.initData(intent)
+        viewModel.initRequest()
+
+    }
+
+    fun initView(){
+        findViewById<ImageView>(R.id.back_img).setOnClickListener {
+            finish()
+        }
+        tabLayout = findViewById(R.id.mtp_chart_head)
+        timeChartView =  findViewById(R.id.time_chart_view)  // 分时图
+        kChartView = findViewById(R.id.k_chart_view)  //        k线图
+        progressBar = findViewById(R.id.progress_view)
+
+        findViewById<RelativeLayout>(R.id.trade_rly).setOnClickListener(this)
+
+//        if (SPUtils.getInstance().getString(Constant.oem) == "qhj"){
+//            findViewById<RelativeLayout>(R.id.trade_rly).visibility = View.GONE
+//        }
+
+        viewModel.goodsInfo.observe(this, Observer {
+            findViewById<TextView>(R.id.goods_name_tv).text = it?.goodsname
+            findViewById<TextView>(R.id.goods_code_tv).text = it?.goodscode
+            findViewById<TextView>(R.id.tag_market_tag).text = viewModel.marketName
+        })
+
+        viewModel.quoteDayData.observe(this, Observer {
+            findViewById<TextView>(R.id.business_value_value).text = NumberUtils.turnoverShort(it?.totalvolume.toString())//成交量
+            findViewById<TextView>(R.id.holder_amount_value).text = NumberUtils.turnoverShort(it?.holdvolume.toString())//持仓量
+            if (it?.presettle == 0.0){
+                findViewById<TextView>(R.id.daily_settlement_value).text = "--"
+            }else{
+                findViewById<TextView>(R.id.daily_settlement_value).text = NumberUtils.doubleDistortion(it?.presettle.toString())//昨结价
+            }
+
+            findViewById<TextView>(R.id.daily_close_value).text = NumberUtils.doubleDistortion(it?.preclose.toString()) //昨收
+            findViewById<TextView>(R.id.sell_price_value).text = NumberUtils.doubleDistortion(it?.ask.toString())//卖价
+            findViewById<TextView>(R.id.buy_price_present).text = NumberUtils.doubleDistortion(it?.bid.toString())//买价
+            findViewById<TextView>(R.id.highest_price_value).text = NumberUtils.doubleDistortion(it?.highest.toString())//最高价
+            findViewById<TextView>(R.id.lowest_price_value).text = NumberUtils.doubleDistortion(it?.lowest.toString())//最低价
+            if (it?.limitup == 0.0){
+                findViewById<TextView>(R.id.trading_limit_value).text = "--"
+            }else{
+                findViewById<TextView>(R.id.trading_limit_value).text = NumberUtils.doubleDistortion(it?.limitup.toString())//涨停价
+            }
+            if (it?.limitdown == 0.0){
+                findViewById<TextView>(R.id.drop_limit_value).text = "--"
+            }else{
+                findViewById<TextView>(R.id.drop_limit_value).text = NumberUtils.doubleDistortion(it?.limitdown.toString())//跌停价
+            }
+            findViewById<TextView>(R.id.sell_amount_value).text = it?.askvolume.toString().isBlankString()//卖量
+            findViewById<TextView>(R.id.buy_amount_present).text = it?.bidvolume.toString().isBlankString()//买量
+            findViewById<TextView>(R.id.opening_quotation_value).text = it?.opened.toString().isBlankString()//开盘
+            findViewById<TextView>(R.id.average_price_value).text = NumberUtils.doubleDistortion(it?.averageprice.toString())//均价
+            if (it?.settle == 0.0){
+                findViewById<TextView>(R.id.settlement_price_value).text = "--"
+            }else{
+                findViewById<TextView>(R.id.settlement_price_value).text = NumberUtils.doubleDistortion(it?.settle.toString())//结算
+            }
+            findViewById<TextView>(R.id.now_price_title).text = NumberUtils.doubleDistortion(it?.last.toString())//最新价
+            //和上一口价的差额
+            val upDown = it?.pricesDifference()
+            if (upDown == 0.0) {
+                findViewById<TextView>(R.id.now_price_title)?.textColor = R.color.rma_black_33
+                findViewById<TextView>(R.id.now_price_value)?.visibility = View.GONE
+            } else if (upDown ?: 0.0 > 0) {
+                findViewById<TextView>(R.id.now_price_value)?.visibility = View.VISIBLE
+                findViewById<TextView>(R.id.now_price_value).text = "↑"
+                findViewById<TextView>(R.id.now_price_value)?.textColor = this.getColor(R.color.rma_red_color)
+                findViewById<TextView>(R.id.now_price_title)?.textColor = this.getColor(R.color.rma_red_color)
+            } else if (upDown ?: 0.0 < 0) {
+                findViewById<TextView>(R.id.now_price_value)?.visibility = View.VISIBLE
+                findViewById<TextView>(R.id.now_price_value).text = "↓"
+                findViewById<TextView>(R.id.now_price_value)?.textColor = this.getColor(R.color.rma_green_color)
+                findViewById<TextView>(R.id.now_price_title)?.textColor = this.getColor(R.color.rma_green_color)
+            }
+            findViewById<TextView>(R.id.up_down_value).text = NumberUtils.roundNum(NumberUtils.doubleDistortion(it?.getPrice()?.minus(it.presettle).toString()),2)//涨额
+            findViewById<TextView>(R.id.up_down_present).text = it?.getPrice()?.minus(it.presettle)?.div(it.getPrice())//涨幅
+                .toString().toPercentage()
+            if (it?.getPrice()?.minus(it.presettle) ?: 0.0 > 0){
+                findViewById<TextView>(R.id.up_down_value)?.textColor = this.getColor(R.color.rma_red_color)
+                findViewById<TextView>(R.id.up_down_present)?.textColor = this.getColor(R.color.rma_red_color)
+            }else if (it?.getPrice()?.minus(it.presettle) ?: 0.0 < 0){
+                findViewById<TextView>(R.id.up_down_value)?.textColor = this.getColor(R.color.rma_green_color)
+                findViewById<TextView>(R.id.up_down_present)?.textColor = this.getColor(R.color.rma_green_color)
+            }
+        })
+
+        viewModel.tsData.observe(this, Observer {
+            progressBar.visibility = View.INVISIBLE
+            timeChartView.setData(it)
+        })
+
+        viewModel.kData.observe(this, Observer {
+            progressBar.visibility = View.INVISIBLE
+            kChartView.setDates(viewModel.outGoodsCode, it)
+        })
+
+        tabLayout.addTab(tabLayout.newTab().setText("分时图").setTag(10086))
+        tabLayout.addTab(tabLayout.newTab().setText("日 K").setTag(11))
+        tabLayout.addTab(tabLayout.newTab().setText("周 K").setTag(12))
+        tabLayout.addTab(tabLayout.newTab().setText("月 K").setTag(13))
+        tabLayout.addTab(tabLayout.newTab().setText("年 K").setTag(14))
+        tabLayout.addTab(tabLayout.newTab().setText("1 分").setTag(1))
+        tabLayout.addTab(tabLayout.newTab().setText("5 分").setTag(2))
+        tabLayout.addTab(tabLayout.newTab().setText("30 分").setTag(3))
+
+        tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
+            override fun onTabReselected(tab: TabLayout.Tab?) {
+
+            }
+
+            override fun onTabUnselected(tab: TabLayout.Tab?) {
+
+            }
+
+            override fun onTabSelected(tab: TabLayout.Tab?) {
+                when(tab?.tag){
+                    10086 -> {
+                        kChartView.visibility = View.INVISIBLE
+                        timeChartView.visibility = View.VISIBLE
+                        viewModel.queryTimeChart()
+                        progressBar.visibility = View.VISIBLE
+                    }
+                    1,2,3,11,12,13,14 -> {
+                        kChartView.visibility = View.VISIBLE
+                        timeChartView.visibility = View.INVISIBLE
+                        viewModel.queryKChart( tab.tag.toString())
+                        progressBar.visibility = View.VISIBLE
+                    }
+                }
+            }
+        })
+
+        timeChartView.setTimeChartListener {
+            // 重新刷新
+            viewModel.queryTimeChart()
+        }
+    }
+
+    override fun onClick(v: View?) {
+        when(v?.id){
+            R.id.trade_rly -> {
+                val intent = Intent()
+                intent.putExtra("goodsId", viewModel.goodsId.toString())
+                intent.putExtra("outGoodsCode", viewModel.outGoodsCode.toString())
+                intent.setClass(this, GoodsTradeActivity::class.java)
+                ActivityUtils.startActivity(intent)
+            }
+        }
+    }
+
+
+    //行情推送通知
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onQuoteMessageEvent(quoteMessageEvent: QuoteMessageEvent) {
+        val goodsids = quoteMessageEvent.goodsid
+        //如果推送的goodsid包含当前页面的goodsid,则进行页面刷新
+        if (goodsids.contains(viewModel.goodsId.toInt())){
+            // 这里把当前最新价转化为历史
+            timeChartView.refreshDate(ChartDataAdapter().getHisTikData(viewModel.outGoodsCode))
+            // 这里更新最新价
+            viewModel.refreshTimePrice(timeChartView)
+            //更新当前商品的盘面信息
+            val quote = GlobalDataCollection.instance?.goodsInfoAndQuotesList?.find { viewModel.outGoodsCode == it.outgoodscode }?.quoteDayData
+            if (quote != null){
+                viewModel.quoteDayData.postValue(quote)
+            }
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        EventBus.getDefault().unregister(this)
+    }
+
+
+}

+ 149 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/chart/YrdzChartViewModel.kt

@@ -0,0 +1,149 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.chart
+
+import android.content.Intent
+import androidx.core.content.ContextCompat.getColor
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.QuoteDayData
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.global.data.account.loginQeruy.Markets
+import cn.muchinfo.rma.global.data.chart.ChartTSData
+import cn.muchinfo.rma.global.data.chart.HistoryDatas
+import cn.muchinfo.rma.global.database.AppDatabase
+import cn.muchinfo.rma.global.database.DataBase
+import cn.muchinfo.rma.global.room.Builder
+import cn.muchinfo.rma.view.MyApplication
+import cn.muchinfo.rma.view.base.BaseViewModel
+import cn.muchinfo.rma.view.base.chart.ChartDataAdapter
+import cn.muchinfo.rma.view.base.chart.old.timeCharts.TimeChartView
+
+/**
+ * 分时图使用goodscode请求接口  用outgoodscode请求盘面
+ */
+class YrdzChartViewModel : BaseViewModel() {
+
+    var goodsInfo: MutableLiveData<GoodsInfo> = MutableLiveData()  // 当前选中的商品信息
+    var tsData: MutableLiveData<ChartTSData> = MutableLiveData()
+    var kData: MutableLiveData<List<HistoryDatas>> = MutableLiveData()
+
+    val quoteDayData : MutableLiveData<QuoteDayData> = MutableLiveData()//盘面数据
+
+    var goodsId = ""
+    var outGoodsCode = ""
+    var goodsCode = ""
+    var goodsGroupId = 0
+    var marketName = ""
+    var marketId = 0
+
+    fun initData(intent: Intent) {
+        goodsId = intent.getStringExtra("goodsId").toString()
+        outGoodsCode = intent.getStringExtra("outGoodsCode").toString()
+        goodsCode = intent.getStringExtra("goodsCode").toString()
+        goodsGroupId = intent.getIntExtra("goodsGroupId", 0)
+        marketId = intent.getIntExtra("marketId", 0)
+        goodsInfo.postValue(DataBase.getInstance().goodsInfoDao().getGoodsInfo(goodsId.toInt()))
+        // FIXME: 2021/4/25  这里以后要根据市场id去判断交易模式 现在只有一种交易模式
+        // autoId 关联 exchangeId
+        if(GlobalDataCollection.instance?.loginQueryData?.market?.size != 0){
+            val markets: Markets =
+                GlobalDataCollection.instance?.loginQueryData?.market?.find { it.marketid == marketId }!!
+            marketName = if (markets.trademode == 15) {
+                GlobalDataCollection.instance?.loginQueryData?.externalExchanges?.find { externalExchanges ->
+                    externalExchanges.autoid ==
+                            GlobalDataCollection.instance?.loginQueryData?.goodsgroups?.find { it.goodsgroupid == goodsGroupId }?.exexchangeid
+                }?.exexchangename.toString()
+            } else {
+                markets.marketname
+            }
+        }
+        // 订阅当前商品行情
+        MyApplication.getInstance()?.quoteManager?.addSubscriptQuote(
+            "11112",
+            setOf(outGoodsCode)
+        ) { isCompleted, err ->
+            System.out.println(isCompleted)
+        }
+    }
+
+    fun initRequest() {
+        queryTsData(goodsCode)
+        queryQuoteDay(outGoodsCode)
+    }
+
+
+    /**
+     * 分时图请求
+     */
+    fun queryTimeChart(){
+        queryTsData(goodsCode)
+    }
+
+    /**
+     * 请求当前商品k线
+     */
+    fun queryKChart(type: String){
+        queryKChartData(outGoodsCode, type)
+    }
+
+    /**
+     * 请求当前商品历史数据
+     */
+    fun queryTsData(goodsCode: String) {
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCode", goodsCode)
+        }
+        MyApplication.getInstance()?.chartManager?.queryTsData(params = params) { isSuccess, respData, _ ->
+            if (isSuccess) {
+                tsData.postValue(respData)
+            }
+        }
+    }
+
+    /**
+     * 请求当前商品盘面
+     */
+    fun queryQuoteDay(goodsCode: String) {
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCodes", goodsCode)
+        }
+        MyApplication.getInstance()?.futureManager?.queryQuoteDay(params = params) { isSuccess, respData, _ ->
+            if (isSuccess) {
+                // 盘面请求成功
+                tsData.postValue(tsData.value)  // 刷新图表
+                //盘面数据更新
+                if (respData?.isEmpty()?.not() == true) {
+                    quoteDayData.postValue(respData[0])
+                }
+            }
+        }
+      }
+
+    /**
+     * 请求k线数据
+     */
+    fun queryKChartData(goodsCode: String, type: String){
+        val params = mutableMapOf<String, String>().apply {
+            put("goodsCode", goodsCode)
+            put("cycleType", type)
+            put("count", "600")
+            put("isAsc", "true")
+        }
+        MyApplication.getInstance()?.chartManager?.queryHistoryDatas(params = params) { isSuccess, respData, _ ->
+            if (isSuccess) {
+                kData.postValue(respData)
+            }
+        }
+    }
+
+    /**
+     * 更新分时图最新价
+     */
+    fun refreshTimePrice(timeChartView: TimeChartView){
+        timeChartView.setLastPrice(
+            ChartDataAdapter().getGoodsInfoMarket(outGoodsCode)!!.quoteDayData.last.toString(), getColor(getApplication(),
+                R.color.p_down_color))
+    }
+
+
+}

+ 357 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/delisting/PurchaseDelistingActivity.kt

@@ -0,0 +1,357 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.delisting
+
+import android.annotation.SuppressLint
+import android.os.Build
+import android.os.Bundle
+import android.view.Gravity
+import android.view.View
+import android.widget.SeekBar
+import android.widget.TextView
+import androidx.annotation.RequiresApi
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.AccountData
+import cn.muchinfo.rma.global.database.DataBase
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.autoWidget.utils.NumberUtils
+import cn.muchinfo.rma.view.autoWidget.view.MangeNumberEditText2
+import cn.muchinfo.rma.view.base.BaseActivity
+import cn.muchinfo.rma.view.base.future.trade.itemView
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import cn.muchinfo.rma.view.base.home.contract.verticalEmptyView
+import com.blankj.utilcode.util.ToastUtils
+import mtp.polymer.com.autowidget.dialog.creatAccountDataSheetDialog
+import org.jetbrains.anko.*
+
+/**
+ * 合约市场
+ */
+class PurchaseDelistingActivity : BaseActivity<PurchaseDelistingViewModel>(){
+
+    /** 传入的goodsid **/
+    val goodsId by lazy { intent.getStringExtra("goodsId") }
+
+    /** 传入的goodscode **/
+    val goodsCode by lazy { intent.getStringExtra("goodsCode") }
+
+    /** 传入的摘买摘卖类型 **/
+    val type by lazy { intent.getStringExtra("type") }
+
+    /** 选择的资金账号 **/
+    val selectAccountData: MutableLiveData<AccountData> = MutableLiveData()
+
+    /** 摘牌数量 **/
+    lateinit var onePriceInputNumberEdittext: MangeNumberEditText2
+
+    /** SeekBar **/
+    lateinit var one_seekbar: SeekBar
+
+    /** 摘牌金额 **/
+    lateinit var one_delisting_amount: TextView
+
+    /** 对页面数据进行初始化 **/
+    fun initializeData(){
+        viewModel.goodsInfo.postValue(DataBase.getInstance().goodsInfoDao().getGoodsInfo(goodsId?.toInt() ?: 0))
+        if (type == "0"){//摘卖 摘卖操作时需要查找相应accountid的持仓单
+            viewModel.queryContractTradePosition(accountid = GlobalDataCollection.instance?.accountId.toString(),goodsId = goodsId ?: "")
+        }else{
+            viewModel.maxDelistedingNumber.postValue("10")//摘买时直接取值挂牌数量
+        }
+    }
+
+    @SuppressLint("SetTextI18n")
+    @RequiresApi(Build.VERSION_CODES.O)
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        initializeData()
+        verticalLayout {
+            viewModel.tradePositionData.bindOptional(context){
+                val maxNumber = 10.coerceAtMost(it?.enableqty?.toInt() ?: 0)
+                //对最大可摘进行赋值
+                viewModel.maxDelistedingNumber.postValue(maxNumber.toString())
+            }
+
+            topBar {
+                // 返回
+                commonLeftButton()
+                commonTitle {
+                    text = goodsCode
+                }
+            }
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                onThrottleFirstClick {
+                    creatAccountDataSheetDialog(
+                        "请选择资金账号",
+                        GlobalDataCollection.instance?.accountDataList ?: arrayListOf()
+                    ) {
+                        selectAccountData.postValue(this)
+                        viewModel.resetAccountDataBySelect(this)
+                        //选择资金账号后重新请求当前要交易的accoundid的持仓汇总
+                        viewModel.queryContractTradePosition(accountid = GlobalDataCollection.instance?.accountId.toString(),goodsId = goodsId ?: "")
+                    }
+                }
+                linearLayout {
+                    textView {
+                        text = "交易账户"
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_hint_text_color_ccc
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(autoSize(250), wrapContent)
+
+                textView {
+                    selectAccountData.bindOptional(context) {
+                        text = it?.accountid.toString() + "   " + it?.accountname
+                    }
+                    textSizeAuto = 34
+                    textColorInt = R.color.rma_black_33
+                }.lparams(wrapContent, wrapContent)
+
+                emptyView()
+
+                imageView {
+                    imageResource = R.mipmap.rma_more
+                }.lparams(autoSize(36), autoSize(36))
+
+            }.lparams(matchParent, autoSize(172))
+
+            itemView()
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                linearLayout {
+                    textView {
+                        text = "挂牌方"
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_hint_text_color_ccc
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(autoSize(250), wrapContent)
+
+                textView {
+                    text = "南方铜业"
+                    textSizeAuto = 34
+                    textColorInt = R.color.rma_black_33
+                }.lparams(wrapContent, wrapContent)
+            }.lparams(matchParent, autoSize(143))
+
+            itemView()
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                linearLayout {
+                    textView {
+                        text = "挂牌价格"
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_hint_text_color_ccc
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(autoSize(250), wrapContent)
+
+                textView {
+                    text = "123213"
+                    textSizeAuto = 34
+                    textColorInt = R.color.rma_red_color
+                }.lparams(wrapContent, wrapContent)
+            }.lparams(matchParent, autoSize(143))
+
+            itemView()
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                linearLayout {
+                    textView {
+                        text = "挂牌数量"
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_hint_text_color_ccc
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                    }
+                }.lparams(autoSize(250), wrapContent)
+
+                textView {
+                    text = "100"
+                    textSizeAuto = 34
+                    textColorInt = R.color.rma_black_33
+                }.lparams(wrapContent, wrapContent)
+            }.lparams(matchParent, autoSize(143))
+
+            itemView()
+
+            linearLayout {
+                verticalLayout {
+                    textView {
+                        text = "摘牌数量"
+                        textSizeAuto = 34
+                        textColorInt = R.color.rma_hint_text_color_ccc
+                    }.lparams(wrapContent, wrapContent) {
+                        marginStart = autoSize(36)
+                        topMargin = autoSize(36)
+                    }
+
+                }.lparams(autoSize(250), autoSize(290))
+
+                verticalLayout {
+                    linearLayout {
+                        gravity = Gravity.CENTER_VERTICAL
+                        numberEditText {
+                            text = "1"
+                            onePriceInputNumberEdittext = this
+                            setOnTextChangeListener { view, value ->
+                                if (value.isNullOrEmpty().not()) {
+
+                                }
+                            }
+
+                        }.lparams(0, autoSize(72), 1f) {
+                            marginEnd = autoSize(36)
+                        }
+
+                        textView {
+                            visibility = View.GONE
+                            textSizeAuto = 34
+                            textColorInt = R.color.rma_hint_text_color_ccc
+                        }.lparams(wrapContent, wrapContent) {
+                            marginEnd = autoSize(36)
+                        }
+                    }.lparams(matchParent, autoSize(143))
+
+
+                    inflateLayout<SeekBar>(R.layout.main_seekbar) {
+                        one_seekbar = this
+                        min = 10
+                        max = 100
+                        isIndeterminate = false
+                        splitTrack = false
+                        setPadding(0, 0, 0, 0)
+                        thumb = resources.getDrawable(R.mipmap.hnst_seekbar)
+                        progressDrawable = resources.getDrawable(R.drawable.seekbar_bg)
+                        setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
+                            override fun onProgressChanged(p0: SeekBar?, p1: Int, p2: Boolean) {
+//                                onePriceInputNumberEdittext.text = NumberUtils.roundNum(
+//                                    maxpickNumber.value?.times(p1.div(100.0))
+//                                        .toString(), 0
+//                                )
+                            }
+
+                            override fun onStartTrackingTouch(p0: SeekBar?) {
+
+                            }
+
+                            override fun onStopTrackingTouch(p0: SeekBar?) {
+
+                            }
+                        })
+                    }.lparams(matchParent, autoSize(46)) {
+                        marginEnd = autoSize(110)
+                        topMargin = autoSize(20)
+                    }
+
+                    linearLayout {
+                        textView {
+                            text = "0"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent)
+
+                        emptyView()
+
+                        textView {
+                            viewModel.maxDelistedingNumber.bindOptional(context){
+                                text = it.toString()
+                            }
+                            text = "0"
+                            textSizeAuto = 29
+                            textColorInt = R.color.rma_gray_color
+                        }.lparams(wrapContent, wrapContent)
+                    }.lparams(matchParent, wrapContent) {
+                        marginEnd = autoSize(110)
+                        topMargin = autoSize(10)
+                    }
+
+                }.lparams(matchParent, autoSize(290))
+            }.lparams(matchParent, autoSize(290))
+
+            itemView()
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                textView {
+                    text = "摘牌金额"
+                    textSizeAuto = 34
+                    textColorInt = R.color.rma_hint_text_color_ccc
+                }.lparams(autoSize(214), wrapContent) {
+                    marginStart = autoSize(36)
+                }
+
+                textView {
+                    one_delisting_amount = this
+                    text = "--"
+                    textSizeAuto = 29
+                    textColorInt = R.color.rma_black_33
+                }.lparams(wrapContent, wrapContent)
+            }.lparams(matchParent, autoSize(143))
+
+            textView {
+                viewModel.usedAccountData.bindOptional(context) {
+                    text = "可用资金" + NumberUtils.roundNum(it?.canUserAmount.toString(), 2)
+                }
+                textSizeAuto = 29
+                textColorInt = R.color.rma_black_33
+            }.lparams(wrapContent, wrapContent) {
+                topMargin = autoSize(20)
+                marginStart = autoSize(250)
+            }
+
+            verticalEmptyView()
+
+            linearLayout {
+                background = resources.getDrawable(R.color.white)
+                gravity = Gravity.CENTER_VERTICAL
+                textView {
+                    onThrottleFirstClick {
+                        if (onePriceInputNumberEdittext.text.toString()
+                                .isNullOrEmpty() || onePriceInputNumberEdittext.text.toString()
+                                .toDouble() == 0.0
+                        ) {
+                            ToastUtils.showLong("请输入摘牌数量")
+                            return@onThrottleFirstClick
+                        }
+
+
+                    }
+                    gravity = Gravity.CENTER
+                    backgroundResource = R.drawable.qhj_main_blue_bg
+                    text = if (type == "0") { "卖出" } else { "买入" }
+                    textSizeAuto = 38
+                    textColorInt = R.color.white
+                }.lparams(autoSize(419), autoSize(119)) {
+                    marginStart = autoSize(24)
+                }
+
+                textView {
+                    onThrottleFirstClick {
+                        finish()
+                    }
+                    gravity = Gravity.CENTER
+                    backgroundResource = R.drawable.hnxt_cancel_bg
+                    text = "取消"
+                    textColorInt = R.color.white
+                    textSizeAuto = 38
+                }.lparams(autoSize(419), autoSize(119)) {
+                    marginStart = autoSize(13)
+                }
+            }.lparams(matchParent, autoSize(144)) {
+                gravity = Gravity.BOTTOM
+            }
+        }
+    }
+
+}

+ 84 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/yrdzpurchase/delisting/PurchaseDelistingViewModel.kt

@@ -0,0 +1,84 @@
+package cn.muchinfo.rma.view.base.yrdzpurchase.delisting
+
+import androidx.lifecycle.MutableLiveData
+import cn.muchinfo.rma.global.GlobalDataCollection
+import cn.muchinfo.rma.global.data.AccountData
+import cn.muchinfo.rma.global.data.ContractTradePositionData
+import cn.muchinfo.rma.global.data.account.loginQeruy.GoodsInfo
+import cn.muchinfo.rma.view.MyApplication
+import cn.muchinfo.rma.view.base.BaseViewModel
+
+/**
+ * 合约市场摘牌viewmodel
+ */
+class PurchaseDelistingViewModel : BaseViewModel(){
+
+    /**
+     * 当前页面选择的商品详情
+     */
+    val goodsInfo : MutableLiveData<GoodsInfo> = MutableLiveData()
+
+    /**
+     * 当前选择的资金账户
+     */
+    val usedAccountData : MutableLiveData<AccountData> = MutableLiveData()
+
+    /**
+     * 当前资金账号的持仓汇总信息
+     */
+    val tradePositionData : MutableLiveData<ContractTradePositionData> = MutableLiveData()
+
+    /**
+     * 当前页面最大可摘数量(摘卖-min{持仓可用数量,挂牌数量},摘买-挂牌数量)
+     */
+    val maxDelistedingNumber : MutableLiveData<String> = MutableLiveData()
+
+    /**
+     * 查询当前选择资金账号的持仓汇总单据
+     * @param accountid String 当前资金账号
+     * @param goodsId String 当前页面的goodsid
+     */
+    fun queryContractTradePosition(accountid : String,goodsId : String){
+        val params = mutableMapOf<String,String>().apply {
+            put("accountid",accountid)
+        }
+        MyApplication.getInstance()?.contractGoodsManager?.queryContractTradePosition(params = params){isSuccess, respData, error ->
+            if (isSuccess){
+                setPositionDataByGoodsid(respData ?: arrayListOf(),goodsId)
+            }
+        }
+    }
+
+    /**
+     * 通过goodsid筛选当前需要的持仓单
+     * @param dataList List<ContractTradePositionData>
+     * @param goodsId String
+     */
+    fun setPositionDataByGoodsid(dataList : List<ContractTradePositionData>, goodsId: String){
+        val selectPositionData = dataList.find { it.goodsid == goodsId }
+        if (selectPositionData?.goodsid.isNullOrEmpty()){
+            tradePositionData.postValue(selectPositionData)
+        }else{
+            tradePositionData.postValue(ContractTradePositionData())
+        }
+    }
+
+    //重新赋值资金账户
+    fun resetAccountData(){
+        val accountDataList = GlobalDataCollection.instance?.accountDataList
+        if (accountDataList.isNullOrEmpty().not()) {
+            val accountData = GlobalDataCollection.instance?.accountData
+            accountData?.clearData()
+            accountData?.setNormalData()
+            usedAccountData.postValue(accountData)
+        }
+    }
+
+    //重新赋值资金账户
+    fun resetAccountDataBySelect(data : AccountData){
+        data.clearData()
+        data.setNormalData()
+        usedAccountData.postValue(data)
+    }
+
+}

+ 0 - 1
RMA/app/src/main/res/layout/layout_item_transfer_content.xml

@@ -22,7 +22,6 @@
                 android:layout_height="match_parent">
 
                 <TextView
-                    android:layout_marginLeft="5dp"
                     android:layout_gravity="center"
                     android:layout_marginStart="7dp"
                     android:id="@+id/tv_left_title"

+ 1 - 1
RMA/app/src/main/res/layout/layout_qhj_item_scroll.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="110dp"
+    android:layout_width="80dp"
     android:layout_height="45dp"
     android:gravity="center"
     android:id="@+id/item_click"

+ 14 - 0
RMA/app/src/main/res/layout/layout_yrdz_item_top_scroll.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="80dp"
+    android:layout_height="40dp"
+    android:orientation="vertical">
+
+    <TextView
+        android:textSize="12sp"
+        android:gravity="center"
+        android:id="@+id/tv_right_scroll"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:textColor="#AAAAAA" />
+</LinearLayout>

BIN
RMA/app/src/main/res/mipmap-xhdpi/rydz_chart_icon.png


BIN
RMA/app/src/main/res/mipmap-xhdpi/rydz_price_up_icon.png


BIN
RMA/app/src/main/res/mipmap-xhdpi/yrdz_down_icon.png


BIN
RMA/app/src/main/res/mipmap-xhdpi/yrdz_up_icon.png