Explorar el Código

风险管理4月15日提交代码-liu.bolan

Liu.bolan hace 4 años
padre
commit
f6cae9cbc0
Se han modificado 19 ficheros con 1739 adiciones y 48 borrados
  1. 7 0
      RMA/app/build.gradle
  2. 375 8
      RMA/app/src/main/java/cn/muchinfo/rma/business/account/AccountManager.kt
  3. 529 2
      RMA/app/src/main/java/cn/muchinfo/rma/business/account/adapter/AccountAdapter.kt
  4. 35 0
      RMA/app/src/main/java/cn/muchinfo/rma/global/StringUtils.kt
  5. 4 2
      RMA/app/src/main/java/cn/muchinfo/rma/global/data/AccMgrTaaccountData.kt
  6. 4 0
      RMA/app/src/main/java/cn/muchinfo/rma/protobuf/funcode/FunCode.java
  7. 3 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/app/Constant.kt
  8. 124 8
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/AccountManagerActivity.kt
  9. 110 3
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/AccountManagerViewModel.kt
  10. 7 10
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/AccountUserViewHolder.kt
  11. 83 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/FutureManagerViewHolder.kt
  12. 79 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/FutureUserViewHolder.kt
  13. 309 7
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/AddRoleSetActivity.kt
  14. 29 5
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/RoleSetViewHolder.kt
  15. 25 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/RoleSetViewModel.kt
  16. 4 1
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/login/LoginActivity.kt
  17. 2 0
      RMA/app/src/main/java/cn/muchinfo/rma/view/base/login/LoginViewModel.kt
  18. 8 0
      RMA/app/src/main/res/drawable/rma_item_click_yellow_bg.xml
  19. 2 0
      RMA/app/src/main/res/values/colors.xml

+ 7 - 0
RMA/app/build.gradle

@@ -39,6 +39,13 @@ android {
         }
     }
 
+    lintOptions {
+        checkReleaseBuilds false
+        // Or, if you prefer, you can continue to checkforerrorsinrelease builds,
+        // but continue the build even whenerrorsarefound:
+        abortOnError false
+    }
+
     packagingOptions {
         exclude 'META-INF/metadata.kotlin_module'
         exclude 'META-INF/metadata.jvm.kotlin_module'

+ 375 - 8
RMA/app/src/main/java/cn/muchinfo/rma/business/account/AccountManager.kt

@@ -2,6 +2,7 @@ package cn.muchinfo.rma.business.account
 
 import cn.muchinfo.rma.business.account.adapter.AccountAdapter
 import cn.muchinfo.rma.business.commodity.adapter.CommodityAdapter
+import cn.muchinfo.rma.business.contract.adapter.ContractAdapter
 import cn.muchinfo.rma.global.GlobalDataCollection
 import cn.muchinfo.rma.global.data.*
 import cn.muchinfo.rma.global.data.account.LoginQueryData
@@ -12,6 +13,7 @@ import cn.muchinfo.rma.netcore.socket.Callback
 import cn.muchinfo.rma.netcore.socket.MTP2Socket.ReconnectChangeState_LoginFail
 import cn.muchinfo.rma.netcore.socket.MTP2Socket.ReconnectChangeState_Logined
 import cn.muchinfo.rma.protobuf.funcode.FunCode
+import cn.muchinfo.rma.protobuf.protoclasses.ManageServiceMI2
 import cn.muchinfo.rma.protobuf.protoclasses.SystemMI1
 import cn.muchinfo.rma.view.MyApplication
 import cn.muchinfo.rma.view.autoWidget.guard
@@ -73,6 +75,7 @@ class AccountManager {
      * @param port String 交易接入端口
      * @param loginID String 账户名称
      * @param password String 账户密码
+     * byteArray // 终端系统信息
      * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
      */
     fun login(
@@ -80,6 +83,7 @@ class AccountManager {
         port: String,
         loginID: String,
         password: String,
+        byteArray: ByteArray,
         callback: (isCompleted: Boolean, err: Error?) -> Unit
     ) {
 
@@ -95,7 +99,7 @@ class AccountManager {
         // 连接交易链路
         tradeSocketManager.conn(IP, port, object : Callback<Packet50> {
             override fun onSuccess(rsp: Packet50?) {
-                val reqPacket = AccountAdapter.buildLoginReqPacket(loginID, password)
+                val reqPacket = AccountAdapter.buildLoginReqPacket(loginID, password, byteArray)
                 // 发送请求
                 tradeSocketManager.send(
                     reqPacket,
@@ -161,7 +165,8 @@ class AccountManager {
 
         // 获取LoginID和Token
         val loginRsp = GlobalDataCollection.instance?.loginRsp
-        val reqPacket = AccountAdapter.buildTokenCheckReqPacket(loginRsp?.loginID ?: 0, loginRsp?.token ?: "")
+        val reqPacket =
+            AccountAdapter.buildTokenCheckReqPacket(loginRsp?.loginID ?: 0, loginRsp?.token ?: "")
         // 发送请求
         tradeSocketManager.send(
             reqPacket,
@@ -271,7 +276,11 @@ class AccountManager {
      * @param newPwd String 加密后的新密码
      * @param callBack Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
      */
-    fun modifyPwd(oldpwd : String,newPwd : String, callback: (isCompleted: Boolean, err: Error?) -> Unit){
+    fun modifyPwd(
+        oldpwd: String,
+        newPwd: String,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ) {
         val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
             callback(false, Error("交易链路未初始化"))
             return
@@ -303,7 +312,7 @@ class AccountManager {
      * 用户登出
      * @param callback Function2<[@kotlin.ParameterName] Boolean, [@kotlin.ParameterName] Error?, Unit>
      */
-    fun loginOut(callback: (isCompleted: Boolean, err: Error?) -> Unit){
+    fun loginOut(callback: (isCompleted: Boolean, err: Error?) -> Unit) {
         val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
             callback(false, Error("交易链路未初始化"))
             return
@@ -336,7 +345,7 @@ class AccountManager {
     fun queryAccMgrLoginUser(
         params: Map<String, String>,
         responseBack: (isSuccess: Boolean, respData: List<AccMgrLoginUserData>?, error: Error?) -> Unit
-    ){
+    ) {
         MyOkHttpUtils().query(
             URL = SPUtils.getInstance()
                 .getString(Constant.goCommonSearchUrl) + "/Ermcp/QueryAccMgrLoginUser",
@@ -362,14 +371,17 @@ class AccountManager {
     fun queryAccMgrMainAccountInfo(
         params: Map<String, String>,
         responseBack: (isSuccess: Boolean, respData: List<AccMgrMainAccountInfoData>?, error: Error?) -> Unit
-    ){
+    ) {
         MyOkHttpUtils().query(
             URL = SPUtils.getInstance()
                 .getString(Constant.goCommonSearchUrl) + "/Ermcp/QueryAccMgrMainAccountInfo",
             params = params,
             type = "1",
             callback = object : ResponseCallback<BaseResult<List<AccMgrMainAccountInfoData>>>() {
-                override fun onResponse(response: BaseResult<List<AccMgrMainAccountInfoData>>?, id: Int) {
+                override fun onResponse(
+                    response: BaseResult<List<AccMgrMainAccountInfoData>>?,
+                    id: Int
+                ) {
                     responseBack(true, response?.data, null)
                 }
 
@@ -447,7 +459,10 @@ class AccountManager {
             params = params,
             type = "1",
             callback = object : ResponseCallback<BaseResult<List<AccMgrTaAccountInfoData>>>() {
-                override fun onResponse(response: BaseResult<List<AccMgrTaAccountInfoData>>?, id: Int) {
+                override fun onResponse(
+                    response: BaseResult<List<AccMgrTaAccountInfoData>>?,
+                    id: Int
+                ) {
                     responseBack(true, response?.data, null)
                 }
 
@@ -485,4 +500,356 @@ class AccountManager {
         )
     }
 
+    /**
+     * 期货账户新增修改请求报文装箱
+    optional MessageHead Header = 1; // MessageHead
+    optional uint64 marketid = 2; // uint64 内部市场ID(HedgeOutMainConfig)
+    optional string hedgeaccountcode = 3; // string 对冲账号ID(HedgeOutMainConfig)
+    optional int32 connectflag = 4; // int32 是否联接外部交易 - 0:不连接 1:连接(HedgeOutMainConfig)
+    optional string hedgeaccountpwd = 5; // string 对冲账号密码(HedgeOutMainConfig)
+    optional string appid = 6; // string AppID(HedgeOutMainConfig)
+    optional string authcode = 7; // string 授权码(HedgeOutMainConfig)
+    optional uint64 limitnumber = 8; // uint64 挂单笔数限额默认0(HedgeOutMainConfig)
+    optional int32 status = 9; // int32 渠道账号状态 1-可买入可卖出 2-可卖出不可买入默认1(HedgeOutMainConfig)
+    optional string accountname = 10; // string 账户名称accountname1(Taaccount)
+    optional uint64 accountid = 11; // uint64 资金账户ID(Taaccount)
+    optional int32 taaccounttype = 12; // int32 账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号(Taaccount)
+    optional int32 currencyid = 13; // int32 货币ID默认为1(Taaccount)
+    optional double outthreshold = 14; // double 出金阈值默认为0(Taaccount)
+    optional int32 ismain = 15; // int32 是否母账号 0:不是母账户 1:是母账户(Taaccount)
+    optional uint64 parentaccountid = 16; // uint64 所属根账号(Taaccount)
+    optional uint64 relateduserid = 17; // uint64 关联用户(Taaccount)
+    optional uint64 fromaccountid = 18; // uint64 所属上级账户(Taaccount)
+    optional uint64 trademargintmpid = 19; // uint64 保证金模板id(TAACCOUNTCONFIG)
+    optional uint64 tradefeetmpid = 20; // uint64 手续费模板ID(TAACCOUNTCONFIG)
+    optional uint64 maxsubaccouts = 21; // uint64 最大子账户数[最大99999][外部母账户用 默认0(TAACCOUNTCONFIG)
+    optional uint64 fcid = 22; // uint64 期货公司
+    optional uint64 creatorid = 23; // uint64 创建人
+    optional uint64 modifierid = 24; // uint64 修改人
+    optional uint64 areauserid = 25; // uint64 机构用户ID
+     */
+    fun hedgeOutMainConfigReq(
+        hedgeaccountcode: String = "",
+        hedgeaccountpwd: String = "",
+        limitnumber: Long = 0,
+        status: Int = 1,
+        accountname: String = "",
+        currencyid: Int = 1,
+        outthreshold: Double = 0.0,
+        ismain: Int,
+        parentaccountid: Long = 0,
+        fromaccountid: Long = 0,
+        trademargintmpid: Long = 0,
+        tradefeetmpid: Long = 0,
+        maxsubaccouts: Long = 0,
+        fcid: Long = 0,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ) {
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getHedgeOutMainConfigReqInfo(
+            hedgeaccountcode,
+            hedgeaccountpwd,
+            limitnumber,
+            status,
+            accountname,
+            currencyid,
+            outthreshold,
+            ismain,
+            parentaccountid,
+            fromaccountid,
+            trademargintmpid,
+            tradefeetmpid,
+            maxsubaccouts,
+            fcid
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.HedgeOutMainConfigRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisHedgeOutMainConfigRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 期货账户设置请求报文装箱
+    optional uint64 BizGroupID = 2; // uint64 分组ID(修改/删除必填)
+    optional int32 BizType = 3; // int32 业务类型 - 1:套保 2:套利
+    optional string Remark = 4; // string 新增/修改备注
+    optional int32 ApplySrc = 5; // int32 新增/修改来源 - 1:管理端 2:终端
+    optional uint64 ApplyId = 6; // uint64 新增/修改人
+    repeated ManageServiceMI2.ErmcpBizGroupSpotGoods SpotGoods = 7; // ErmcpBizGroupSpotGoods 期货账户分组商品
+    repeated ManageServiceMI2.ErmcpBizGroupTAAccount TAAccount = 8; // ErmcpBizGroupTAAccount 期货账户分组账户
+    optional int32 OptType = 9; // int32 操作类型 - 1:新增 2:修改 3:删除
+    optional uint64 AreaUserID = 10; // uint64 所属机构
+     */
+    fun ErmcpBizGroupReq(
+        BizGroupID : Long = 0,
+        BizType : Int,
+        Remark : String = "",
+        ApplySrc : Int = 2,
+        SpotGoods : List<ManageServiceMI2.ErmcpBizGroupSpotGoods>,
+        TAAccount : List<ManageServiceMI2.ErmcpBizGroupTAAccount>,
+        OptType : Int = 0,
+        AreaUserID : Long = 0,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getErmcpBizGroupReqInfo(
+            BizGroupID, BizType, Remark, ApplySrc, SpotGoods, TAAccount, OptType, AreaUserID
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.ErmcpBizGroupRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisErmcpBizGroupRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 角色设置操作请求报文装箱
+     * @param autoid Long 角色ID(新增成功接口返回的autoid,默认角色除外)
+     * @param operatetype Int 操作类型-1:新增 2:修改 3:删除(默认角色不能删除)
+     * @param areauserid Long 所属机构(当前登录userid 必填)
+     * @param modifierid Long 修改人ID(当前登录loginid 必填)
+     * @param modifyremark String 修改备注
+     * @param rolename String 角色名称(新增修改必填)
+     * @param memberfuncmenus List<MemberFuncMenu> 机构菜单(新增修改必填)
+     */
+    fun ManagerRoleOperateReq(
+        autoid : Long = 0,
+        operatetype : Int,
+        modifyremark : String = "",
+        rolename : String,
+        memberfuncmenus : List<ManageServiceMI2.MemberFuncMenu>,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getManagerRoleOperateReqInfo(
+            autoid, operatetype, modifyremark, rolename, memberfuncmenus
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.ManagerRoleOperateRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisManagerRoleOperateRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 期货账户注销报文装箱
+     * @param accountid Long 期货账户ID
+     * @return Packet50
+     */
+    fun TaaccountOperateReq(
+        accountid : Long,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getTaaccountOperateReqInfo(
+            accountid
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.TaaccountOperateRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisTaaccountOperateRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 期货账户授信报文装箱
+     * @param accountid Long 期货账户ID
+     * @param sxmoney Double 授信金额正为加负为减
+     */
+    fun TaaccountTransfersxmoneyReq(
+        accountid : Long,
+        sxmoney : Double,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getTaaccountTransfersxmoneyReqInfo(
+            accountid, sxmoney
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.TaaccountTransfersxmoneyRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisTaaccountTransfersxmoneyRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 登录账户操作请求报文装箱
+     * @param operatetype Int 操作类型-1:新增 2:修改 3:新增管理员 4:修改管理员 5:锁定 6:解锁 7:注销 8:恢复 9:重置密码
+     * @param userid Long 用户ID(新增成功接口返回的userid)
+     * @param loginid Long 登录ID(新增成功接口返回的loginid)
+     * @param logincode String 登录账号
+     * @param accountname String 账户名称
+     * @param password String 登录密码(明文)
+     * @param mobile String 手机号码(明文)
+     * @param roleids List<Long> 账号角色
+     * @param logintaaccounts List<LoginTaaccount> 期货账户(勾选交易员必填)
+     * @return Packet50
+     */
+    fun LoginaccountOperateReq(
+        operatetype : Int,
+        userid : Long = 0,
+        loginid : Long = 0,
+        logincode : String = "",
+        accountname : String = "",
+        password : String = "",
+        mobile : String = "",
+        roleids : List<Long>,
+        logintaaccounts : List<ManageServiceMI2.LoginTaaccount>,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getLoginaccountOperateReqInfo(
+            operatetype, userid, loginid, logincode, accountname, password, mobile, roleids, logintaaccounts
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.LoginaccountOperateRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisLoginaccountOperateRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
+    /**
+     * 现货市价请求报文装箱
+     * @param WRStandardID Long 现货商品ID
+     * @param SpotGoodsModelID Long 现货品类ID(通用则为0)
+     * @param SpotGoodsBrandID Long 现货品牌ID(通用则为0, 不为0则须先有品类ID)
+     * @param CurrencyID Long 报价货币ID
+     * @param SpotGoodsPrice Double 现货价格
+     * @param TradeDate String 交易日(yyyyMMdd)
+     * @param OperateType Int 操作类型 - 1:新增 2:修改 3:删除
+     */
+    fun ErmcpSpotGoodsPriceReq(
+        WRStandardID : Long,
+        SpotGoodsModelID : Long = 0,
+        SpotGoodsBrandID : Long = 0,
+        CurrencyID : Long = 0,
+        SpotGoodsPrice : Double,
+        TradeDate : String,
+        OperateType : Int,
+        callback: (isCompleted: Boolean, err: Error?) -> Unit
+    ){
+        val tradeSocketManager = MyApplication.getInstance()?.tradeSocketManager.guard {
+            callback(false, Error("交易链路未初始化"))
+            return
+        }
+
+        val reqPacket = AccountAdapter.getErmcpSpotGoodsPriceReqInfo(
+           WRStandardID, SpotGoodsModelID, SpotGoodsBrandID, CurrencyID, SpotGoodsPrice, TradeDate, OperateType
+        )
+
+        tradeSocketManager.send(
+            reqPacket,
+            FunCode.FunCode_Trade_ErmcpSpotGoodsPriceRsp,
+            object : Callback<Packet50> {
+                override fun onSuccess(rsp: Packet50?) {
+                    val rst = AccountAdapter.analysisErmcpSpotGoodsPriceRsq(rsp!!)
+                    callback(rst.first, rst.second)
+                }
+
+                override fun onFail(err: Error?) {
+                    // 发送数据失败
+                    callback(false, err)
+                }
+
+            }
+        )
+    }
+
 }

+ 529 - 2
RMA/app/src/main/java/cn/muchinfo/rma/business/account/adapter/AccountAdapter.kt

@@ -1,14 +1,20 @@
 package cn.muchinfo.rma.business.account.adapter
 
+import cn.muchinfo.rma.BuildConfig
 import cn.muchinfo.rma.business.global.MessageHeadModel
+import cn.muchinfo.rma.global.ErrorMessageUtils
 import cn.muchinfo.rma.global.GlobalDataCollection
 import cn.muchinfo.rma.netcore.crypto.SHA256Encrypt
 import cn.muchinfo.rma.netcore.packet.Packet50
 import cn.muchinfo.rma.protobuf.funcode.FunCode
+import cn.muchinfo.rma.protobuf.protoclasses.ErmcpMI1
+import cn.muchinfo.rma.protobuf.protoclasses.ManageServiceMI2
 import cn.muchinfo.rma.protobuf.protoclasses.SystemMI1
+import com.google.protobuf.ByteString
 import java.io.ByteArrayOutputStream
 import java.lang.Exception
 import java.util.*
+import kotlin.math.log
 
 /**
  * 账户相关装解箱
@@ -19,7 +25,7 @@ class AccountAdapter {
          * 构建登录请求报文
          * @return Packet50 登录请求报文
          */
-        fun buildLoginReqPacket(loginID: String, password: String): Packet50 {
+        fun buildLoginReqPacket(loginID: String, password: String,byteArray: ByteArray): Packet50 {
             val funCode = FunCode.LoginReq
 
             val builder = SystemMI1.LoginReq.newBuilder()
@@ -29,8 +35,10 @@ class AccountAdapter {
                 encrypt.getEncryptString(encrypt.encrypt(String.format("%s%s", loginID, password)))
                     .toLowerCase(Locale.ROOT)
             builder.loginType = 0
+            builder.clientSystemInfo = ByteString.copyFrom(byteArray)
+            builder.clientAppID = "muchinfo_mtpclient_5.0.1"
             builder.clientType = 3
-            builder.version = "5.0.0.0"
+            builder.version = BuildConfig.VERSION_NAME
             val uuid = UUID.randomUUID()
             builder.guid = uuid.toString()
             // deviceID主要用于标记设备唯一标识,由于无法获取MAC或IP信息,故使用UUID
@@ -194,5 +202,524 @@ class AccountAdapter {
                 Pair(false, Error("装箱失败"))
             }
         }
+
+
+        /**
+         * 期货账户新增修改请求报文装箱
+        optional MessageHead Header = 1; // MessageHead
+        optional uint64 marketid = 2; // uint64 内部市场ID(HedgeOutMainConfig)
+        optional string hedgeaccountcode = 3; // string 对冲账号ID(HedgeOutMainConfig)
+        optional int32 connectflag = 4; // int32 是否联接外部交易 - 0:不连接 1:连接(HedgeOutMainConfig)
+        optional string hedgeaccountpwd = 5; // string 对冲账号密码(HedgeOutMainConfig)
+        optional string appid = 6; // string AppID(HedgeOutMainConfig)
+        optional string authcode = 7; // string 授权码(HedgeOutMainConfig)
+        optional uint64 limitnumber = 8; // uint64 挂单笔数限额默认0(HedgeOutMainConfig)
+        optional int32 status = 9; // int32 渠道账号状态 1-可买入可卖出 2-可卖出不可买入默认1(HedgeOutMainConfig)
+        optional string accountname = 10; // string 账户名称accountname1(Taaccount)
+        optional uint64 accountid = 11; // uint64 资金账户ID(Taaccount)
+        optional int32 taaccounttype = 12; // int32 账号类型 - 1:外部账号 2:内部账号 3:内部做市自营账号 4:内部做市接单账号(Taaccount)
+        optional int32 currencyid = 13; // int32 货币ID默认为1(Taaccount)
+        optional double outthreshold = 14; // double 出金阈值默认为0(Taaccount)
+        optional int32 ismain = 15; // int32 是否母账号 0:不是母账户 1:是母账户(Taaccount)
+        optional uint64 parentaccountid = 16; // uint64 所属根账号(Taaccount)
+        optional uint64 relateduserid = 17; // uint64 关联用户(Taaccount)
+        optional uint64 fromaccountid = 18; // uint64 所属上级账户(Taaccount)
+        optional uint64 trademargintmpid = 19; // uint64 保证金模板id(TAACCOUNTCONFIG)
+        optional uint64 tradefeetmpid = 20; // uint64 手续费模板ID(TAACCOUNTCONFIG)
+        optional uint64 maxsubaccouts = 21; // uint64 最大子账户数[最大99999][外部母账户用 默认0(TAACCOUNTCONFIG)
+        optional uint64 fcid = 22; // uint64 期货公司
+        optional uint64 creatorid = 23; // uint64 创建人
+        optional uint64 modifierid = 24; // uint64 修改人
+        optional uint64 areauserid = 25; // uint64 机构用户ID
+         */
+        fun getHedgeOutMainConfigReqInfo(
+            hedgeaccountcode : String = "",
+            hedgeaccountpwd : String = "",
+            limitnumber : Long = 0,
+            status : Int = 1,
+            accountname : String = "",
+            currencyid : Int = 1,
+            outthreshold : Double = 0.0,
+            ismain : Int,
+            parentaccountid : Long = 0,
+            fromaccountid : Long = 0,
+            trademargintmpid : Long = 0,
+            tradefeetmpid : Long = 0,
+            maxsubaccouts : Long = 0,
+            fcid : Long = 0
+        )  : Packet50{
+            val builder = ManageServiceMI2.HedgeOutMainConfigReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+            // FIXME: - 250000000005
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.HedgeOutMainConfigReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            if (hedgeaccountcode.isNotEmpty()){
+                builder.hedgeaccountcode = hedgeaccountcode
+            }
+            if (hedgeaccountpwd.isNotEmpty()){
+                builder.hedgeaccountpwd = hedgeaccountpwd
+            }
+//        if (appid.isNotEmpty()){
+//            builder.appid = appid
+//        }
+//        if (authcode.isNotEmpty()){
+//            builder.authcode = authcode
+//        }
+            builder.limitnumber = limitnumber
+            builder.status = status
+            builder.currencyid = currencyid
+            builder.outthreshold = outthreshold
+            if (accountname.isNotEmpty()){
+                builder.accountname = accountname
+            }
+            builder.ismain = ismain
+            if (parentaccountid != 0L){
+                builder.parentaccountid = parentaccountid
+            }
+            builder.relateduserid = loginInfo.userID.toLong()
+            if (tradefeetmpid != 0L){
+                builder.tradefeetmpid = tradefeetmpid
+            }
+            builder.maxsubaccouts = maxsubaccouts
+            if (fromaccountid != 0L){
+                builder.fromaccountid = fromaccountid
+            }
+            if (trademargintmpid != 0L){
+                builder.trademargintmpid = trademargintmpid
+            }
+            if (fcid != 0L){
+                builder.fcid = fcid
+            }
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.HedgeOutMainConfigReq, arrayOutputStream.toByteArray())
+
+        }
+
+        /**
+         * 期货账户新增修改报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.HedgeOutMainConfigRsp?>
+         */
+        fun analysisHedgeOutMainConfigRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.HedgeOutMainConfigRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.HedgeOutMainConfigRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 期货账户设置请求报文装箱
+        optional uint64 BizGroupID = 2; // uint64 分组ID(修改/删除必填)
+        optional int32 BizType = 3; // int32 业务类型 - 1:套保 2:套利
+        optional string Remark = 4; // string 新增/修改备注
+        optional int32 ApplySrc = 5; // int32 新增/修改来源 - 1:管理端 2:终端
+        optional uint64 ApplyId = 6; // uint64 新增/修改人
+        repeated ManageServiceMI2.ErmcpBizGroupSpotGoods SpotGoods = 7; // ErmcpBizGroupSpotGoods 期货账户分组商品
+        repeated ManageServiceMI2.ErmcpBizGroupTAAccount TAAccount = 8; // ErmcpBizGroupTAAccount 期货账户分组账户
+        optional int32 OptType = 9; // int32 操作类型 - 1:新增 2:修改 3:删除
+        optional uint64 AreaUserID = 10; // uint64 所属机构
+         */
+        fun getErmcpBizGroupReqInfo(
+            BizGroupID : Long = 0,
+            BizType : Int,
+            Remark : String = "",
+            ApplySrc : Int = 2,
+            SpotGoods : List<ManageServiceMI2.ErmcpBizGroupSpotGoods>,
+            TAAccount : List<ManageServiceMI2.ErmcpBizGroupTAAccount>,
+            OptType : Int = 0,
+            AreaUserID : Long = 0
+        ) : Packet50{
+            val builder = ManageServiceMI2.ErmcpBizGroupReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.ErmcpBizGroupReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            if (BizGroupID != 0L){
+                builder.bizGroupID = BizGroupID
+            }
+            builder.bizType = BizType
+            builder.remark = Remark
+            builder.applySrc = ApplySrc
+            builder.applyId = loginInfo.loginID
+            builder.addAllSpotGoods(SpotGoods)
+            builder.addAllTAAccount(TAAccount)
+            builder.optType = OptType
+            builder.areaUserID = AreaUserID
+
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.ErmcpBizGroupReq, arrayOutputStream.toByteArray())
+        }
+
+        /**
+         * 期货账户设置请求报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.HedgeOutMainConfigRsp?>
+         */
+        fun analysisErmcpBizGroupRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.ErmcpBizGroupRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.ErmcpBizGroupRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 角色设置操作请求报文装箱
+         * @param autoid Long 角色ID(新增成功接口返回的autoid,默认角色除外)
+         * @param operatetype Int 操作类型-1:新增 2:修改 3:删除(默认角色不能删除)
+         * @param areauserid Long 所属机构(当前登录userid 必填)
+         * @param modifierid Long 修改人ID(当前登录loginid 必填)
+         * @param modifyremark String 修改备注
+         * @param rolename String 角色名称(新增修改必填)
+         * @param memberfuncmenus List<MemberFuncMenu> 机构菜单(新增修改必填)
+         */
+        fun getManagerRoleOperateReqInfo(
+            autoid : Long = 0,
+            operatetype : Int,
+            modifyremark : String = "",
+            rolename : String,
+            memberfuncmenus : List<ManageServiceMI2.MemberFuncMenu>
+        ) : Packet50{
+            val builder = ManageServiceMI2.ManagerRoleOperateReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.ManagerRoleOperateReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            if (autoid != 0L){
+                builder.autoid = autoid
+            }
+            builder.operatetype = operatetype
+            builder.areauserid = loginInfo.userID.toLong()
+            builder.modifierid = loginInfo.loginID
+            builder.modifyremark = modifyremark
+            builder.rolename = rolename
+            builder.addAllMemberfuncmenus(memberfuncmenus)
+
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.ManagerRoleOperateReq, arrayOutputStream.toByteArray())
+        }
+
+        /**
+         * 角色设置操作请求报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.HedgeOutMainConfigRsp?>
+         */
+        fun analysisManagerRoleOperateRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.ManagerRoleOperateRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.ManagerRoleOperateRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 期货账户注销报文装箱
+         * @param accountid Long 期货账户ID
+         * @return Packet50
+         */
+        fun getTaaccountOperateReqInfo(
+            accountid : Long
+        ) : Packet50{
+            val builder = ManageServiceMI2.TaaccountOperateReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.TaaccountOperateReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            builder.accountid = accountid
+            builder.tradestatus = 7
+            builder.modifierid = loginInfo.loginID
+            builder.areauserid = loginInfo.userID.toLong()
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.TaaccountOperateReq, arrayOutputStream.toByteArray())
+        }
+
+        /**
+         * 期货账户注销报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.TaaccountOperateRsp?>
+         */
+        fun analysisTaaccountOperateRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.TaaccountOperateRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.TaaccountOperateRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 期货账户授信报文装箱
+         * @param accountid Long 期货账户ID
+         * @param sxmoney Double 授信金额正为加负为减
+         */
+        fun getTaaccountTransfersxmoneyReqInfo(
+            accountid : Long,
+            sxmoney : Double
+        ) : Packet50{
+            val builder = ManageServiceMI2.TaaccountTransfersxmoneyReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.TaaccountTransfersxmoneyReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+
+            builder.accountid = accountid
+            builder.sxmoney = sxmoney
+            builder.modifierid = loginInfo.loginID
+            builder.areauserid = loginInfo.userID.toLong()
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.TaaccountTransfersxmoneyReq, arrayOutputStream.toByteArray())
+        }
+
+        /**
+         * 期货账户授信报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.TaaccountOperateRsp?>
+         */
+        fun analysisTaaccountTransfersxmoneyRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.TaaccountTransfersxmoneyRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.TaaccountTransfersxmoneyRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 登录账户操作请求报文装箱
+         * @param operatetype Int 操作类型-1:新增 2:修改 3:新增管理员 4:修改管理员 5:锁定 6:解锁 7:注销 8:恢复 9:重置密码
+         * @param userid Long 用户ID(新增成功接口返回的userid)
+         * @param loginid Long 登录ID(新增成功接口返回的loginid)
+         * @param logincode String 登录账号
+         * @param accountname String 账户名称
+         * @param password String 登录密码(明文)
+         * @param mobile String 手机号码(明文)
+         * @param roleids List<Long> 账号角色
+         * @param logintaaccounts List<LoginTaaccount> 期货账户(勾选交易员必填)
+         * @return Packet50
+         */
+        fun getLoginaccountOperateReqInfo(
+            operatetype : Int,
+            userid : Long = 0,
+            loginid : Long = 0,
+            logincode : String = "",
+            accountname : String = "",
+            password : String = "",
+            mobile : String = "",
+            roleids : List<Long>,
+            logintaaccounts : List<ManageServiceMI2.LoginTaaccount>
+        ) : Packet50{
+            val builder = ManageServiceMI2.LoginaccountOperateReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.LoginaccountOperateReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            builder.modifierid = loginInfo.loginID
+            builder.areauserid = loginInfo.userID.toLong()
+            builder.operatetype = operatetype
+            builder.userid = userid
+            builder.loginid =loginid
+            if (logincode.isNotEmpty()){
+                builder.logincode = logincode
+            }
+            if (accountname.isNotEmpty()){
+                builder.accountname = accountname
+            }
+            if (password.isNotEmpty()){
+                builder.password = password
+            }
+            if (mobile.isNotEmpty()){
+                builder.mobile = mobile
+            }
+            builder.addAllRoleids(roleids)
+            builder.addAllLogintaaccounts(logintaaccounts)
+
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.LoginaccountOperateReq, arrayOutputStream.toByteArray())
+        }
+
+
+        /**
+         * 期货账户授信报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.TaaccountOperateRsp?>
+         */
+        fun analysisLoginaccountOperateRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.LoginaccountOperateRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.LoginaccountOperateRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
+        /**
+         * 现货市价请求报文装箱
+         * @param WRStandardID Long 现货商品ID
+         * @param SpotGoodsModelID Long 现货品类ID(通用则为0)
+         * @param SpotGoodsBrandID Long 现货品牌ID(通用则为0, 不为0则须先有品类ID)
+         * @param CurrencyID Long 报价货币ID
+         * @param SpotGoodsPrice Double 现货价格
+         * @param TradeDate String 交易日(yyyyMMdd)
+         * @param OperateType Int 操作类型 - 1:新增 2:修改 3:删除
+         */
+        fun getErmcpSpotGoodsPriceReqInfo(
+            WRStandardID : Long,
+            SpotGoodsModelID : Long = 0,
+            SpotGoodsBrandID : Long = 0,
+            CurrencyID : Long = 0,
+            SpotGoodsPrice : Double,
+            TradeDate : String,
+            OperateType : Int
+        ) : Packet50{
+            val builder = ManageServiceMI2.ErmcpSpotGoodsPriceReq.newBuilder()
+            val loginInfo = GlobalDataCollection.instance?.loginRsp!!
+
+            builder.setHeader(
+                MessageHeadModel.getHead(
+                    FunCode.FunCode_Trade_ErmcpSpotGoodsPriceReq,
+                    loginInfo.userID,
+                    GlobalDataCollection.instance?.accountId ?: 0,
+                    0,
+                    18
+                )
+            )
+            builder.operateID = loginInfo.loginID
+            builder.operateSrc = 2
+            builder.wrStandardID = WRStandardID
+            if (SpotGoodsModelID != 0L){
+                builder.spotGoodsModelID = SpotGoodsModelID
+            }
+            if (SpotGoodsBrandID != 0L){
+                builder.spotGoodsBrandID = SpotGoodsBrandID
+            }
+            if (CurrencyID != 0L){
+                builder.currencyID = CurrencyID
+            }
+            builder.spotGoodsPrice = SpotGoodsPrice
+            builder.tradeDate = TradeDate
+            builder.operateType = OperateType
+
+            val arrayOutputStream = ByteArrayOutputStream()
+            builder.build().writeTo(arrayOutputStream)
+            return Packet50(FunCode.FunCode_Trade_ErmcpSpotGoodsPriceReq, arrayOutputStream.toByteArray())
+        }
+
+
+        /**
+         * 期货账户授信报文解析
+         * @param packet50 Packet50
+         * @return Triple<Boolean, Error?, ManageServiceMI2.TaaccountOperateRsp?>
+         */
+        fun analysisErmcpSpotGoodsPriceRsq(packet50: Packet50): Triple<Boolean, Error?, ManageServiceMI2.ErmcpSpotGoodsPriceRsp?> {
+            return try {
+                val loginRsp = ManageServiceMI2.ErmcpSpotGoodsPriceRsp.parseFrom(packet50.content)
+                if (loginRsp.retCode == 0) {
+                    // 操作成功
+                    Triple(true, null, loginRsp)
+                } else {
+                    // 操作失败
+                    Triple(false, Error(ErrorMessageUtils.getErrorString(loginRsp.retCode)), null)
+                }
+            } catch (e: Exception) {
+                // 操作失败
+                Triple(false, Error("装箱失败"), null)
+            }
+        }
+
     }
+
 }

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

@@ -220,3 +220,38 @@ fun String.loginstatus() : String{
 }
 
 
+/**
+ * 期货账户状态 -  1:正常 2:受限 3:冻结 4:禁止建仓(人工受限) 5:禁止交易(人工冻结) 6:待激活 7:已注销
+ */
+fun String.tradestatus() : String{
+    if (this.isNullOrEmpty()){
+        return "--"
+    }
+    var str = ""
+    when {
+        this == "1" -> {
+            str = "正常"
+        }
+        this == "2" -> {
+            str = "受限"
+        }
+        this == "3" -> {
+            str = "冻结"
+        }
+        this == "4" -> {
+            str = "禁止建仓"
+        }
+        this == "5" -> {
+            str = "禁止交易"
+        }
+        this == "6" -> {
+            str = "待激活"
+        }
+        this == "7" -> {
+            str = "已注销"
+        }
+    }
+    return str
+}
+
+

+ 4 - 2
RMA/app/src/main/java/cn/muchinfo/rma/global/data/AccMgrTaaccountData.kt

@@ -5,7 +5,8 @@ package cn.muchinfo.rma.global.data
  */
 data class AccMgrTaaccountData(
     val mainAcc : AccMgrTaaccountSonData? = AccMgrTaaccountSonData(),
-    val subacclist : List<AccMgrTaaccountSonData>? = arrayListOf()//子账户列表
+    val subacclist : List<AccMgrTaaccountSonData>? = arrayListOf(),//子账户列表
+    var isSelect : Int = 0//是否点击展开
 )
 
 data class AccMgrTaaccountSonData(
@@ -15,5 +16,6 @@ data class AccMgrTaaccountSonData(
     val ismain : String? = "",//是否主账户 0-否 1-是
     val parentaccountid : String? = "",//父账户id
     val relateduserid : String? = "",//关联userid
-    val tradestatus : String? = ""//交易状态 - 1:正常 2:受限 3:冻结 4:禁止建仓(人工受限) 5:禁止交易(人工冻结) 6:待激活 7:已注销
+    val tradestatus : String? = "",//交易状态 - 1:正常 2:受限 3:冻结 4:禁止建仓(人工受限) 5:禁止交易(人工冻结) 6:待激活 7:已注销
+    var isSelect: Int = 0//是否点击展开
 )

+ 4 - 0
RMA/app/src/main/java/cn/muchinfo/rma/protobuf/funcode/FunCode.java

@@ -183,6 +183,10 @@ public class FunCode {
     public static final int LoginaccountOperateReq = 1900704;
     /// 登录账户操作响应
     public static final int LoginaccountOperateRsp = 1900705;
+    // 现货市价请求(1900706)
+    public static final int FunCode_Trade_ErmcpSpotGoodsPriceReq = 1900706;
+    // 现货市价响应(1900707)
+    public static final int FunCode_Trade_ErmcpSpotGoodsPriceRsp = 1900707;
 
     /**
      * 交易委托请求(196639)

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

@@ -8,9 +8,10 @@ object Constant {
      */
 //    const val baseurl = "http://103.40.249.127:28280/cfg?key=mtp_20"
 //    const val baseurl = "http://192.168.30.125:8080/cfg?key=test_125"
-    const val baseurl = "http://192.168.31.114:8080/cfg?key=test_114" // shenzhen01  123123
+//    const val baseurl = "http://192.168.31.114:8080/cfg?key=test_114" // shenzhen01  123123
 //    const val baseurl = "http://192.168.31.220:8080/cfg?key=test_220"//李倩
 //      const val baseurl = "http://192.168.30.211:8080/cfg?key=test_211"// 瑶姐
+    const val baseurl = "http://192.168.31.175:8080/cfg?key=test_175" // shenzhen01  123123
 
     /**
      * 用sp存储基础url的key
@@ -111,6 +112,7 @@ object Constant {
 
     /** 库存报表-出库明细 **/
     const val table_mobile_stock_report_out_detail = "table_mobile_stock_report_out_detail"
+
     /**--------------------------------------------------------------------------------------**/
 
     const val FISTOPENAPP = "first_open_app"

+ 124 - 8
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/AccountManagerActivity.kt

@@ -2,21 +2,24 @@ package cn.muchinfo.rma.view.base.home.accountmanager
 
 import android.content.Intent
 import android.os.Bundle
+import android.text.TextUtils
+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.data.AccMgrLoginUserData
-import cn.muchinfo.rma.global.data.Userlist
+import cn.muchinfo.rma.global.data.AccMgrTaaccountData
 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.accountmanager.accountviewholder.AccountManagerViewHolder
-import cn.muchinfo.rma.view.base.home.accountmanager.accountviewholder.AccountUserViewHolder
-import cn.muchinfo.rma.view.base.home.commodity.AddHedgeGoodsActivity
-import cn.muchinfo.rma.view.base.home.commodity.AddSpotGoodsActivity
+import cn.muchinfo.rma.view.base.home.accountmanager.accountviewholder.FutureManagerViewHolder
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import cn.muchinfo.rma.view.base.home.rolemanagement.RoleSetActivity
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.ConvertUtils
 import com.qmuiteam.qmui.util.QMUIDisplayHelper
@@ -24,11 +27,8 @@ import com.qmuiteam.qmui.widget.tab.QMUITabIndicator
 import com.qmuiteam.qmui.widget.tab.QMUITabSegment
 import com.sfit.ctp.info.DeviceInfoManager
 import mtp.polymer.com.autowidget.adapter.BaseAdapter
-import org.jetbrains.anko._FrameLayout
-import org.jetbrains.anko.matchParent
+import org.jetbrains.anko.*
 import org.jetbrains.anko.support.v4.viewPager
-import org.jetbrains.anko.verticalLayout
-import org.jetbrains.anko.view
 
 /**
  * 账户管理页面
@@ -167,13 +167,87 @@ class LoginAccountManager(
     private val accountManagerAdapter: BaseAdapter<AccMgrLoginUserData, AccountManagerViewHolder> =
         BaseAdapter { _, _ -> AccountManagerViewHolder(activity, viewModel) }
 
+    val isClickSelect : MutableLiveData<Int> = MutableLiveData<Int>().apply { value = 1 }
+
     init {
+        viewModel.initAccountData()
         viewModel.queryAccMgrLoginUser()
     }
 
     val root = _FrameLayout(activity).apply {
         verticalLayout {
+
+            linearLayout {
+                onThrottleFirstClick {
+                    if (isClickSelect.value == 0){
+                        isClickSelect.postValue(1)
+                    }else{
+                        isClickSelect.postValue(0)
+                    }
+                }
+                gravity = Gravity.CENTER_VERTICAL
+                imageView {
+                    imageResource = R.mipmap.list_folding
+                }.lparams(autoSize(43), autoSize(43)) {
+                    marginStart = autoSize(36)
+                }
+
+                textView {
+                    viewModel.userAccount.bindOptional(context) {
+                        text = it?.accountname
+                    }
+                    textColorInt = R.color.rma_black_33
+                    maxLines = 1
+                    maxEms = 9
+                    ellipsize = TextUtils.TruncateAt.END
+                    textSizeAuto = 36
+                }.lparams(wrapContent, wrapContent){
+                    marginStart = autoSize(20)
+                }
+                textView {
+                    text = "(13)"
+                    textColorInt = R.color.rma_hint_text_color_ccc
+                    textSizeAuto = 36
+                }.lparams(wrapContent, wrapContent){
+                    marginStart = autoSize(20)
+                }
+
+                emptyView()
+
+                textView {
+                    onThrottleFirstClick {
+                        val intent = Intent()
+                        intent.setClass(context,RoleSetActivity::class.java)
+                        ActivityUtils.startActivity(intent)
+                    }
+                    backgroundResource = R.drawable.rma_item_click_yellow_bg
+                    gravity = Gravity.CENTER
+                    text = "账户设置"
+                    textColorInt = R.color.rma_item_yellow_color
+                    textSizeAuto = 26
+                }.lparams(autoSize(120), autoSize(48)) {
+                    marginEnd = autoSize(24)
+                }
+
+                imageView {
+                    onThrottleFirstClick {
+
+                    }
+                    imageResource = R.mipmap.rma_account_add
+                }.lparams(autoSize(43), autoSize(43)){
+                    marginEnd = autoSize(36)
+                }
+
+            }.lparams(matchParent, autoSize(96))
+
             statusLayout(contentBlock = {
+                isClickSelect.bindOptional(context){
+                    if (it == 0){
+                        visibility = View.GONE
+                    }else{
+                        visibility = View.VISIBLE
+                    }
+                }
                 statusLayout = this
 //                bindTaskStatus(viewModule.status)
                 swipeToLoadLayout {
@@ -221,9 +295,51 @@ class FuturesAccountManager(
     private val viewModel: AccountManagerViewModel
 ){
 
+    private lateinit var swipeToLayout: SwipeToLoadLayout
+    private lateinit var statusLayout: StatusLayout
+
+    //期货合约
+    private val futureManagerAdapter: BaseAdapter<AccMgrTaaccountData, FutureManagerViewHolder> =
+        BaseAdapter { _, _ -> FutureManagerViewHolder(activity, viewModel) }
+
+    init {
+        viewModel.queryAccMgrTaaccount()
+    }
+
     val root = _FrameLayout(activity).apply {
         verticalLayout {
+            statusLayout(contentBlock = {
+                statusLayout = this
+//                bindTaskStatus(viewModule.status)
+                swipeToLoadLayout {
+                    swipeToLayout = this
+                    setEnableRefresh(true)
+                    setEnableLoadMore(false)
+                    setOnRefreshListener {
+                        viewModel.queryAccMgrLoginUser()
+                    }
+                    setEnableScrollContentWhenLoaded(false)
+                    setEnableLoadMoreWhenContentNotFull(false)
+                    recyclerView {
+                        background = resources.getDrawable(R.color.white)
+                        adapter = futureManagerAdapter
+                    }.lparams(matchParent, matchParent)
+                }
+            }, emptyBlock = {
+                emptyView(hint = resources.getString(R.string.now_no_data))
+            }).lparams(matchParent, matchParent)
 
+            viewModel.futureManagerList.bindOptional(context){
+                if (it?.isEmpty() == true || it?.size == 0){
+                    statusLayout.showEmpty()
+                }else {
+                    if (swipeToLayout.getIsRefreshing()){
+                        swipeToLayout.finishRefresh()
+                    }
+                    statusLayout.showSuccess()
+                    futureManagerAdapter.setNewData(it)
+                }
+            }
         }
     }
 }

+ 110 - 3
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/AccountManagerViewModel.kt

@@ -2,10 +2,9 @@ package cn.muchinfo.rma.view.base.home.accountmanager
 
 import androidx.lifecycle.MutableLiveData
 import cn.muchinfo.rma.global.GlobalDataCollection
-import cn.muchinfo.rma.global.data.AccMgrLoginUserData
+import cn.muchinfo.rma.global.data.*
 import cn.muchinfo.rma.view.MyApplication
 import cn.muchinfo.rma.view.base.BaseViewModel
-import cn.muchinfo.rma.view.base.home.commodity.newcommodity.newhedge.HedgeSpeciesData
 
 class AccountManagerViewModel : BaseViewModel(){
 
@@ -15,6 +14,16 @@ class AccountManagerViewModel : BaseViewModel(){
     val accountManagerList : MutableLiveData<List<AccMgrLoginUserData>> = MutableLiveData()
 
     /**
+     * 期货账户列表数据
+     */
+    val futureManagerList : MutableLiveData<List<AccMgrTaaccountData>> = MutableLiveData()
+
+    /**
+     * 当前的账户信息
+     */
+    val userAccount : MutableLiveData<UserAccountData> = MutableLiveData()
+
+    /**
      * 查询账户管理登录账号(账户管理/登录账号)
      */
     fun queryAccMgrLoginUser(){
@@ -29,7 +38,78 @@ class AccountManagerViewModel : BaseViewModel(){
     }
 
     /**
-     * 商品信息-套保品种的item点击展开
+     * 查询账户管理/期货账户
+     */
+    fun queryAccMgrTaaccount(){
+        val params = mutableMapOf<String, String>().apply {
+            put("userid", GlobalDataCollection.instance?.loginRsp?.userID.toString())
+        }
+        MyApplication.getInstance()?.accountManager?.queryAccMgrTaaccount(params = params){isSuccess, respData, error ->
+            if (isSuccess){
+                futureManagerList.postValue(respData)
+            }
+        }
+    }
+
+    /**
+     * 更新hoefragment的account
+     */
+    fun initAccountData(){
+        val accountData = GlobalDataCollection.instance?.userAccountData
+        userAccount.postValue(accountData)
+    }
+
+    /**
+     * 账户管理-期货账户的item点击展开
+     * @param index Int
+     */
+    fun setOnFutureAccountClick(index: Int){
+        val datanewList = arrayListOf<AccMgrTaaccountData>()
+        futureManagerList.value?.forEach {
+            if (index == futureManagerList.value?.indexOf(it)) {
+                if (it.isSelect == 0) {
+                    datanewList.add(it.copy(isSelect = 1))
+                } else {
+                    datanewList.add(it.copy(isSelect = 0))
+                }
+            } else {
+                datanewList.add(it)
+            }
+        }
+        futureManagerList.postValue(datanewList)
+    }
+
+
+    //账户管理-期货账户的item的子item展开隐藏点击事件
+    fun setOnFutureSonItemClick(index: Int, sonIndex: Int) {
+        val datanewlist = arrayListOf<AccMgrTaaccountData>()
+        val oldList = futureManagerList.value
+        futureManagerList.value?.forEach {
+            if (index == oldList?.indexOf(it)) {
+                val newHedgeList = arrayListOf<AccMgrTaaccountSonData>()
+                oldList.get(index).subacclist?.forEach { data ->
+                    if (sonIndex == oldList.get(index).subacclist?.indexOf(data)) {
+                        if (data.isSelect == 0) {
+                            newHedgeList.add(data.copy(isSelect = 1))
+                        } else {
+                            newHedgeList.add(data.copy(isSelect = 0))
+                        }
+                    } else {
+                        newHedgeList.add(data)
+                    }
+                }
+                datanewlist.add(it.copy(subacclist = newHedgeList))
+            } else {
+                datanewlist.add(it)
+            }
+        }
+        futureManagerList.postValue(datanewlist)
+    }
+
+
+
+    /**
+     * 账户管理-登录账户的item点击展开
      * @param index Int
      */
     fun setOnLoginAccountHedgeClick(index: Int){
@@ -49,4 +129,31 @@ class AccountManagerViewModel : BaseViewModel(){
     }
 
 
+    //账户管理-登录账户的item的子item展开隐藏点击事件
+    fun setOnLoginSonItemClick(index: Int, sonIndex: Int) {
+        val datanewlist = arrayListOf<AccMgrLoginUserData>()
+        val oldList = accountManagerList.value
+        accountManagerList.value?.forEach {
+            if (index == oldList?.indexOf(it)) {
+                val newHedgeList = arrayListOf<Userlist>()
+                oldList.get(index).userlist?.forEach { data ->
+                    if (sonIndex == oldList.get(index).userlist?.indexOf(data)) {
+                        if (data.isSelect == 0) {
+                            newHedgeList.add(data.copy(isSelect = 1))
+                        } else {
+                            newHedgeList.add(data.copy(isSelect = 0))
+                        }
+                    } else {
+                        newHedgeList.add(data)
+                    }
+                }
+                datanewlist.add(it.copy(userlist = newHedgeList))
+            } else {
+                datanewlist.add(it)
+            }
+        }
+        accountManagerList.postValue(datanewlist)
+    }
+
+
 }

+ 7 - 10
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/AccountUserViewHolder.kt

@@ -1,12 +1,11 @@
 package cn.muchinfo.rma.view.base.home.accountmanager.accountviewholder
 
-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.data.Userlist
-import cn.muchinfo.rma.global.isBlankString
 import cn.muchinfo.rma.global.loginstatus
 import cn.muchinfo.rma.lifecycle.bindOptional
 import cn.muchinfo.rma.view.autoWidget.autoSize
@@ -14,9 +13,7 @@ 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.base.home.accountmanager.AccountManagerViewModel
-import cn.muchinfo.rma.view.base.home.contract.AddContractActivity
 import cn.muchinfo.rma.view.base.home.contract.emptyView
-import com.blankj.utilcode.util.ActivityUtils
 import mtp.polymer.com.autowidget.adapter.BaseViewHolder
 import org.jetbrains.anko.*
 
@@ -47,7 +44,7 @@ class AccountUserViewHolder(
             }
 
             onThrottleFirstClick {
-
+                viewModel.setOnLoginSonItemClick(index = index,sonIndex = dataIndex)
             }
 
             linearLayout {
@@ -99,7 +96,7 @@ class AccountUserViewHolder(
                     text = "详情"
                     textColorInt = R.color.rma_item_click_color
                     textSizeAuto = 26
-                }.lparams(autoSize(120), autoSize(48)) {
+                }.lparams(autoSize(110), autoSize(48)) {
                     marginEnd = autoSize(24)
                 }
 
@@ -112,7 +109,7 @@ class AccountUserViewHolder(
                     text = "修改"
                     textColorInt = R.color.rma_item_click_color
                     textSizeAuto = 26
-                }.lparams(autoSize(120), autoSize(48)) {
+                }.lparams(autoSize(110), autoSize(48)) {
                     marginEnd = autoSize(24)
                 }
 
@@ -125,7 +122,7 @@ class AccountUserViewHolder(
                     text = "重置密码"
                     textColorInt = R.color.rma_item_click_color
                     textSizeAuto = 26
-                }.lparams(autoSize(156), autoSize(48)) {
+                }.lparams(autoSize(146), autoSize(48)) {
                     marginEnd = autoSize(24)
                 }
 
@@ -138,7 +135,7 @@ class AccountUserViewHolder(
                     text = "锁定"
                     textColorInt = R.color.rma_item_click_color
                     textSizeAuto = 26
-                }.lparams(autoSize(120), autoSize(48)) {
+                }.lparams(autoSize(110), autoSize(48)) {
                     marginEnd = autoSize(24)
                 }
 
@@ -151,7 +148,7 @@ class AccountUserViewHolder(
                     text = "注销"
                     textColorInt = R.color.rma_item_click_color
                     textSizeAuto = 26
-                }.lparams(autoSize(120), autoSize(48)) {
+                }.lparams(autoSize(110), autoSize(48)) {
                     marginEnd = autoSize(24)
                 }
 

+ 83 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/FutureManagerViewHolder.kt

@@ -0,0 +1,83 @@
+package cn.muchinfo.rma.view.base.home.accountmanager.accountviewholder
+
+import android.view.Gravity
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.data.AccMgrTaaccountData
+import cn.muchinfo.rma.global.data.AccMgrTaaccountSonData
+import cn.muchinfo.rma.global.data.Userlist
+import cn.muchinfo.rma.lifecycle.bindOptional
+import cn.muchinfo.rma.view.autoWidget.*
+import cn.muchinfo.rma.view.base.future.trade.itemView
+import cn.muchinfo.rma.view.base.home.accountmanager.AccountManagerViewModel
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import mtp.polymer.com.autowidget.adapter.BaseAdapter
+import mtp.polymer.com.autowidget.adapter.BaseViewHolder
+import org.jetbrains.anko.*
+
+/**
+ * 账户管理下的
+ * @property activity AppCompatActivity
+ * @property viewModel AccountManagerViewModel
+ * @property itemSize IntArray
+ * @constructor
+ */
+class FutureManagerViewHolder(private val activity : AppCompatActivity,private val viewModel: AccountManagerViewModel) : BaseViewHolder<AccMgrTaaccountData>(activity){
+    override val itemSize: IntArray = intArrayOf(matchParent, wrapContent)
+
+    //期货合约
+    private val futureUserAdapter: BaseAdapter<AccMgrTaaccountSonData, FutureUserViewHolder> =
+        BaseAdapter { _, _ -> FutureUserViewHolder(activity, viewModel,dataIndex) }
+
+    override fun _FrameLayout.createContentView() {
+        verticalLayout {
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                imageView {
+                    onThrottleFirstClick {
+                        viewModel.setOnFutureAccountClick(dataIndex)
+                    }
+                    imageResource = R.mipmap.second_list_floding
+                }.lparams(autoSize(43), autoSize(43))
+
+                textView {
+                    data.bindOptional(context) {
+                        text = it?.mainAcc?.accountname + "(" + it?.subacclist?.size + ")"
+                    }
+                    textSizeAuto = 31
+                    textColorInt = R.color.rma_black_33
+                }.lparams(wrapContent, wrapContent) {
+                    marginStart = autoSize(20)
+                }
+                emptyView()
+
+                imageView {
+                    onThrottleFirstClick {
+
+                    }
+                    imageResource = R.mipmap.rma_account_add
+                }.lparams(autoSize(43), autoSize(43)){
+                    marginEnd = autoSize(37)
+                }
+            }.lparams(matchParent, autoSize(108)) {
+                marginStart = autoSize(102)
+            }
+
+            itemView()
+
+            recyclerView {
+                data.bindOptional(context){
+                    if (it?.mainAcc?.isSelect == 0){
+                        visibility = View.GONE
+                    }else{
+                        visibility = View.VISIBLE
+                    }
+                }
+                background = resources.getDrawable(R.color.white)
+                adapter = futureUserAdapter
+            }.lparams(matchParent, wrapContent)
+        }.lparams(matchParent, wrapContent)
+    }
+
+}

+ 79 - 0
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/accountmanager/accountviewholder/FutureUserViewHolder.kt

@@ -0,0 +1,79 @@
+package cn.muchinfo.rma.view.base.home.accountmanager.accountviewholder
+
+import android.view.Gravity
+import androidx.appcompat.app.AppCompatActivity
+import cn.muchinfo.rma.R
+import cn.muchinfo.rma.global.data.AccMgrTaaccountSonData
+import cn.muchinfo.rma.global.loginstatus
+import cn.muchinfo.rma.global.tradestatus
+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.base.home.accountmanager.AccountManagerViewModel
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import mtp.polymer.com.autowidget.adapter.BaseViewHolder
+import org.jetbrains.anko.*
+
+/**
+ * 期货账户子item
+ * @property activity AppCompatActivity
+ * @property viewModel AccountManagerViewModel
+ * @property itemSize IntArray
+ * @constructor
+ */
+class FutureUserViewHolder(private val activity : AppCompatActivity,private val viewModel: AccountManagerViewModel,private val index : Int) : BaseViewHolder<AccMgrTaaccountSonData>(activity){
+    override val itemSize: IntArray = intArrayOf(matchParent, wrapContent)
+
+    override fun _FrameLayout.createContentView() {
+        verticalLayout {
+
+            data.bindOptional(context) {
+
+                if (it?.tradestatus == "1") {
+                    backgroundResource = R.drawable.rma_list_item_bg
+                } else if (it?.tradestatus == "2") {
+                    backgroundResource = R.drawable.rma_list_item_bg
+                } else {
+                    backgroundResource = R.drawable.rma_list_item_nouse_bg
+                }
+            }
+
+            onThrottleFirstClick {
+                viewModel.setOnFutureSonItemClick(index,dataIndex)
+            }
+
+            linearLayout {
+                gravity = Gravity.CENTER_VERTICAL
+                textView {
+                    data.bindOptional(context) {
+                        text = it?.accountname
+                    }
+                    textColorInt = R.color.rma_black_33
+                    textSizeAuto = 31
+                }.lparams(wrapContent, wrapContent) {
+                    marginStart = autoSize(31)
+                }
+
+                emptyView()
+                textView {
+                    data.bindOptional(context) {
+                        text = it?.tradestatus?.tradestatus()
+                        if (it?.tradestatus == "1") {
+                            textColorInt = R.color.rma_green_color
+                        } else if (it?.tradestatus == "2") {
+                            textColorInt = R.color.rma_red_color
+                        } else {
+                            textColorInt = R.color.rma_hint_text_color_ccc
+                        }
+                    }
+                    textSizeAuto = 31
+                }.lparams(wrapContent, wrapContent) {
+                    marginEnd = autoSize(31)
+                }
+            }.lparams(matchParent, autoSize(96))
+        }.lparams(matchParent, wrapContent)
+    }
+
+}

+ 309 - 7
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/AddRoleSetActivity.kt

@@ -1,16 +1,32 @@
 package cn.muchinfo.rma.view.base.home.rolemanagement
 
 import android.os.Bundle
+import android.view.Gravity
+import android.view.View
+import android.view.inputmethod.EditorInfo
+import android.widget.EditText
 import cn.muchinfo.rma.R
-import cn.muchinfo.rma.view.autoWidget.commonLeftButton
-import cn.muchinfo.rma.view.autoWidget.commonMenuButton
-import cn.muchinfo.rma.view.autoWidget.commonTitle
-import cn.muchinfo.rma.view.autoWidget.topBar
+import cn.muchinfo.rma.view.autoWidget.*
 import cn.muchinfo.rma.view.base.BaseActivity
-import org.jetbrains.anko.verticalLayout
+import cn.muchinfo.rma.view.base.future.trade.itemView
+import cn.muchinfo.rma.view.base.home.contract.emptyView
+import org.jetbrains.anko.*
 
+/**
+ * 设置里的新增角色/角色详情
+ */
 class AddRoleSetActivity : BaseActivity<RoleSetViewModel>(){
 
+    /**
+     * 1 新增 2修改 3 详情
+     */
+    val type by lazy { intent.getStringExtra("type") }
+
+    /**
+     * 输入的角色名称
+     */
+    lateinit var role_name_edittext : EditText
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         verticalLayout {
@@ -19,10 +35,296 @@ class AddRoleSetActivity : BaseActivity<RoleSetViewModel>(){
             topBar {
                 commonLeftButton()
                 commonTitle {
-                    text = "新增角色"
+                    if (type == "1"){
+                        text = "新增角色"
+                    }else if (type == "2"){
+                        text = "修改角色信息"
+                    }else {
+                        text = "详情"
+                    }
                 }
-
             }
+
+            frameLayout {
+                scrollView {
+                    verticalLayout {
+                        linearLayout {
+                            gravity = Gravity.CENTER_VERTICAL
+                            textView {
+                                text = "角色名称"
+                                textColorInt = R.color.rma_black_33
+                                textSizeAuto = 31
+                            }.lparams(wrapContent, wrapContent){
+                                marginStart = autoSize(37)
+                            }
+
+                            view {
+
+                            }.lparams(autoSize(100), autoSize(1))
+
+                            editText {
+                                role_name_edittext = this
+                                gravity = Gravity.RIGHT
+                                hint = "请填写角色名称"
+                                background = null
+                                inputType = EditorInfo.TYPE_CLASS_TEXT
+                                hintColorStr = "#CCCCCC"
+                                textSizeAuto = 31
+                                textColorStr = "#333333"
+                            }.lparams(matchParent, autoSize(104)) {
+                                marginEnd = autoSize(36)
+                            }
+                        }.lparams(matchParent, autoSize(104))
+                        view {
+                            background = resources.getDrawable(R.color.rma_hint_line_color_eee)
+                        }.lparams(matchParent, autoSize(1)){
+                            marginEnd = autoSize(36)
+                            marginStart = autoSize(36)
+                        }
+
+                        linearLayout {
+                            gravity = Gravity.CENTER_VERTICAL
+                            textView {
+                                text = "角色权限"
+                                textColorInt = R.color.rma_black_33
+                                textSizeAuto = 31
+                            }.lparams(wrapContent, wrapContent){
+                                marginStart = autoSize(37)
+                            }
+
+                            emptyView()
+
+                            textView {
+                                if (type == "3"){
+                                    visibility = View.GONE
+                                }else{
+                                    visibility = View.VISIBLE
+                                }
+                                text = "请勾选权限功能"
+                                textSizeAuto = 31
+                                textColorInt = R.color.rma_yellow_text_color
+                            }.lparams(wrapContent, wrapContent){
+                                marginEnd = autoSize(36)
+                            }
+                        }.lparams(matchParent, autoSize(104))
+
+                        verticalLayout {
+                            background = resources.getDrawable(R.color.add_role_bg_color)
+
+                            linearLayout {
+                                gravity = Gravity.CENTER_VERTICAL
+                                view {
+                                    background = resources.getDrawable(R.color.rma_blue_color)
+                                }.lparams(autoSize(6), autoSize(36)){
+                                    marginStart = autoSize(36)
+                                }
+
+                                textView {
+                                    text = "采购"
+                                    textSizeAuto = 36
+                                    textColorInt = R.color.rma_black_33
+                                }.lparams(wrapContent, wrapContent){
+                                    marginStart = autoSize(31)
+                                }
+
+                                emptyView()
+
+                                textView {
+                                    if (type == "3"){
+                                        visibility = View.GONE
+                                    }else{
+                                        visibility = View.VISIBLE
+                                    }
+                                    text = "全选"
+                                    textSizeAuto = 31
+                                    textColorInt = R.color.rma_blue_color
+                                }.lparams(wrapContent, wrapContent){
+                                    marginEnd = autoSize(36)
+                                }
+                            }.lparams(matchParent, autoSize(92))
+                            view {
+                                background = resources.getDrawable(R.color.line_hint_color)
+                            }.lparams(matchParent, autoSize(1)){
+                                marginEnd = autoSize(36)
+                                marginStart = autoSize(36)
+                            }
+
+                            /**
+                             * 采购选择的列表
+                             */
+                            recyclerView {
+                                background = resources.getDrawable(R.color.add_role_bg_color)
+
+                            }.lparams(matchParent, wrapContent)
+
+                            linearLayout {
+                                gravity = Gravity.CENTER_VERTICAL
+                                view {
+                                    background = resources.getDrawable(R.color.rma_blue_color)
+                                }.lparams(autoSize(6), autoSize(36)){
+                                    marginStart = autoSize(36)
+                                }
+
+                                textView {
+                                    text = "销售"
+                                    textSizeAuto = 36
+                                    textColorInt = R.color.rma_black_33
+                                }.lparams(wrapContent, wrapContent){
+                                    marginStart = autoSize(31)
+                                }
+
+                                emptyView()
+
+                                textView {
+                                    if (type == "3"){
+                                        visibility = View.GONE
+                                    }else{
+                                        visibility = View.VISIBLE
+                                    }
+                                    text = "全选"
+                                    textSizeAuto = 31
+                                    textColorInt = R.color.rma_blue_color
+                                }.lparams(wrapContent, wrapContent){
+                                    marginEnd = autoSize(36)
+                                }
+                            }.lparams(matchParent, autoSize(92))
+                            view {
+                                background = resources.getDrawable(R.color.line_hint_color)
+                            }.lparams(matchParent, autoSize(1)){
+                                marginEnd = autoSize(36)
+                                marginStart = autoSize(36)
+                            }
+
+                            /**
+                             * 销售选择的列表
+                             */
+                            recyclerView {
+                                background = resources.getDrawable(R.color.add_role_bg_color)
+
+                            }.lparams(matchParent, wrapContent)
+
+                            linearLayout {
+                                gravity = Gravity.CENTER_VERTICAL
+                                view {
+                                    background = resources.getDrawable(R.color.rma_blue_color)
+                                }.lparams(autoSize(6), autoSize(36)){
+                                    marginStart = autoSize(36)
+                                }
+
+                                textView {
+                                    text = "期货"
+                                    textSizeAuto = 36
+                                    textColorInt = R.color.rma_black_33
+                                }.lparams(wrapContent, wrapContent){
+                                    marginStart = autoSize(31)
+                                }
+
+                                emptyView()
+
+                                textView {
+                                    if (type == "3"){
+                                        visibility = View.GONE
+                                    }else{
+                                        visibility = View.VISIBLE
+                                    }
+                                    text = "全选"
+                                    textSizeAuto = 31
+                                    textColorInt = R.color.rma_blue_color
+                                }.lparams(wrapContent, wrapContent){
+                                    marginEnd = autoSize(36)
+                                }
+                            }.lparams(matchParent, autoSize(92))
+                            view {
+                                background = resources.getDrawable(R.color.line_hint_color)
+                            }.lparams(matchParent, autoSize(1)){
+                                marginEnd = autoSize(36)
+                                marginStart = autoSize(36)
+                            }
+
+                            /**
+                             * 期货选择的列表
+                             */
+                            recyclerView {
+                                background = resources.getDrawable(R.color.add_role_bg_color)
+
+                            }.lparams(matchParent, wrapContent)
+
+                            linearLayout {
+                                gravity = Gravity.CENTER_VERTICAL
+                                view {
+                                    background = resources.getDrawable(R.color.rma_blue_color)
+                                }.lparams(autoSize(6), autoSize(36)){
+                                    marginStart = autoSize(36)
+                                }
+
+                                textView {
+                                    text = "敞口"
+                                    textSizeAuto = 36
+                                    textColorInt = R.color.rma_black_33
+                                }.lparams(wrapContent, wrapContent){
+                                    marginStart = autoSize(31)
+                                }
+
+                                emptyView()
+
+                                textView {
+                                    if (type == "3"){
+                                        visibility = View.GONE
+                                    }else{
+                                        visibility = View.VISIBLE
+                                    }
+                                    text = "全选"
+                                    textSizeAuto = 31
+                                    textColorInt = R.color.rma_blue_color
+                                }.lparams(wrapContent, wrapContent){
+                                    marginEnd = autoSize(36)
+                                }
+                            }.lparams(matchParent, autoSize(92))
+                            view {
+                                background = resources.getDrawable(R.color.line_hint_color)
+                            }.lparams(matchParent, autoSize(1)){
+                                marginEnd = autoSize(36)
+                                marginStart = autoSize(36)
+                            }
+
+                            /**
+                             * 敞口选择的列表
+                             */
+                            recyclerView {
+                                background = resources.getDrawable(R.color.add_role_bg_color)
+
+                            }.lparams(matchParent, wrapContent)
+
+                        }.lparams(matchParent, wrapContent)
+                    }
+                }
+
+                linearLayout {
+                    background = resources.getDrawable(R.color.white)
+                    gravity = Gravity.CENTER_VERTICAL
+                    if (type == "3"){
+                        visibility = View.GONE
+                    }else{
+                        visibility = View.VISIBLE
+                    }
+
+                    textView {
+                        onThrottleFirstClick {
+
+                        }
+                        gravity = Gravity.CENTER
+                        backgroundResource = R.mipmap.rma_submit_bg
+                        text = "完成"
+                        textColorInt = R.color.white
+                        textSizeAuto = 38
+                    }.lparams(matchParent, autoSize(119)) {
+                        marginStart = autoSize(60)
+                        marginEnd = autoSize(60)
+                    }
+                }.lparams(matchParent, autoSize(144)) {
+                    gravity = Gravity.BOTTOM
+                }
+            }.lparams(matchParent, matchParent)
         }
     }
 

+ 29 - 5
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/RoleSetViewHolder.kt

@@ -5,6 +5,8 @@ import android.view.View
 import androidx.appcompat.app.AppCompatActivity
 import cn.muchinfo.rma.R
 import cn.muchinfo.rma.global.data.AccMgrRoleData
+import cn.muchinfo.rma.global.isBlankString
+import cn.muchinfo.rma.global.isShowTimeString
 import cn.muchinfo.rma.lifecycle.bindOptional
 import cn.muchinfo.rma.view.autoWidget.autoSize
 import cn.muchinfo.rma.view.autoWidget.onThrottleFirstClick
@@ -26,31 +28,53 @@ class RoleSetViewHolder(private val activity : AppCompatActivity,private val vie
 
     override fun _FrameLayout.createContentView() {
          verticalLayout {
+
+             onThrottleFirstClick {
+                 viewModel.setOnItemClick(dataIndex)
+             }
+
+             data.bindOptional(context) {
+                 if (it?.indexSelect == 0) {
+                     backgroundResource = R.color.white
+                 } else if (it?.indexSelect == 1) {
+                     backgroundResource = R.color.rma_list_select_color
+                 }
+             }
+
              linearLayout {
                  textView {
                      gravity = Gravity.CENTER
                      data.bindOptional(context){
-
+                        text = it?.rolename?.isBlankString()
                      }
-                     text = "角色名称"
                      textSizeAuto = 30
                      textColorInt = R.color.rma_hint_title_text_color
                  }.lparams(autoSize(200), autoSize(100))
                  textView {
                      gravity = Gravity.CENTER
-                     text = "创建人"
+                     data.bindOptional(context){
+                         text = it?.modifiername?.isBlankString()
+                     }
                      textSizeAuto = 30
                      textColorInt = R.color.rma_hint_title_text_color
                  }.lparams(autoSize(200), autoSize(100))
                  textView {
                      gravity = Gravity.CENTER
-                     text = "创建时间"
+                     data.bindOptional(context){
+                         text = it?.modifytime?.isShowTimeString("yyyyMMdd HH:mm")
+                     }
                      textSizeAuto = 30
                      textColorInt = R.color.rma_hint_title_text_color
                  }.lparams(autoSize(350), autoSize(100))
                  textView {
                      gravity = Gravity.CENTER
-                     text = "状态"
+                    data.bindOptional(context){
+                        if (it?.rolestatus == "1"){
+                            text = "正常"
+                        }else{
+                            text = "停用"
+                        }
+                    }
                      textSizeAuto = 30
                      textColorInt = R.color.rma_hint_title_text_color
                  }.lparams(autoSize(150), autoSize(100))

+ 25 - 1
RMA/app/src/main/java/cn/muchinfo/rma/view/base/home/rolemanagement/RoleSetViewModel.kt

@@ -3,6 +3,7 @@ package cn.muchinfo.rma.view.base.home.rolemanagement
 import androidx.lifecycle.MutableLiveData
 import cn.muchinfo.rma.global.GlobalDataCollection
 import cn.muchinfo.rma.global.data.AccMgrRoleData
+import cn.muchinfo.rma.global.data.AccMgrTaaccountData
 import cn.muchinfo.rma.view.MyApplication
 import cn.muchinfo.rma.view.base.BaseViewModel
 
@@ -12,10 +13,13 @@ import cn.muchinfo.rma.view.base.BaseViewModel
 class RoleSetViewModel : BaseViewModel(){
 
     /**
-     *
+     *  角色设置数据
      */
     val roleSetDataList : MutableLiveData<List<AccMgrRoleData>> = MutableLiveData()
 
+    /**
+     * 请求角色设置列表
+     */
     fun queryAccMgrRole(){
         val params = mutableMapOf<String, String>().apply {
             put("userid", GlobalDataCollection.instance?.loginRsp?.userID.toString())
@@ -27,4 +31,24 @@ class RoleSetViewModel : BaseViewModel(){
         }
     }
 
+    /**
+     * 账户管理-期货账户的item点击展开
+     * @param index Int
+     */
+    fun setOnItemClick(index: Int){
+        val datanewList = arrayListOf<AccMgrRoleData>()
+        roleSetDataList.value?.forEach {
+            if (index == roleSetDataList.value?.indexOf(it)) {
+                if (it.indexSelect == 0) {
+                    datanewList.add(it.copy(indexSelect = 1))
+                } else {
+                    datanewList.add(it.copy(indexSelect = 0))
+                }
+            } else {
+                datanewList.add(it)
+            }
+        }
+        roleSetDataList.postValue(datanewList)
+    }
+
 }

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

@@ -33,6 +33,7 @@ import com.blankj.utilcode.util.SPUtils
 import com.blankj.utilcode.util.ToastUtils
 import com.qmuiteam.qmui.kotlin.onClick
 import com.qmuiteam.qmui.util.QMUIStatusBarHelper
+import com.sfit.ctp.info.DeviceInfoManager
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.GlobalScope
 import kotlinx.coroutines.launch
@@ -390,9 +391,11 @@ class LoginActivity : BaseActivity<LoginViewModel>() , UserPopupWindow.OnClearAc
         viewModel.loadingDialogStatus.value = TaskUiModel.inFlight()
         SPUtils.getInstance().put("login", loginCodeEditText!!.text.toString().trim())
         SPUtils.getInstance().put("psw", loginPwdEditText!!.text.toString())
+        val collectInfo = DeviceInfoManager.getCollectInfo(this)
         viewModel.login(
             code = loginCodeEditText!!.text.toString().trim(),
-            password = loginPwdEditText!!.text.toString()
+            password = loginPwdEditText!!.text.toString(),
+            byteArray = collectInfo ?: byteArrayOf()
         ) { isCompleted, err ->
             GlobalScope.launch(Dispatchers.Main) {
                 if (!isCompleted) {

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

@@ -30,6 +30,7 @@ class LoginViewModel : BaseViewModel() {
     fun login(
         code: String,
         password: String,
+        byteArray: ByteArray,
         callback: (isCompleted: Boolean, err: Error?) -> Unit
     ) {
         val accountManager = MyApplication.getInstance()?.accountManager.guard {
@@ -60,6 +61,7 @@ class LoginViewModel : BaseViewModel() {
                     port = port,
                     loginID = loginID!!,
                     password = password,
+                    byteArray = byteArray,
                     callback = callback
                 )
             }

+ 8 - 0
RMA/app/src/main/res/drawable/rma_item_click_yellow_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
+    <stroke
+        android:color="#FE9344"
+        android:width="0.5dp" />
+    <solid android:color="@color/white"/>
+    <corners android:radius="3dp"/>
+</shape>

+ 2 - 0
RMA/app/src/main/res/values/colors.xml

@@ -40,6 +40,8 @@
     <color name="rma_account_name_bgcolor">#F38989</color>
     <color name="rma_red_color">#FF2F2C</color>
     <color name="rma_item_bg">#F6F6F8</color>
+    <color name="rma_item_yellow_color">#FE9344</color>
+    <color name="add_role_bg_color">#4A97E1</color>
 
 
     <color name="pickerview_timebtn_nor">#057dff</color>