li.shaoyi пре 3 година
родитељ
комит
673b1b9219
77 измењених фајлова са 2430 додато и 320 уклоњено
  1. 1 0
      .eslintrc.js
  2. 236 0
      public/proto/gz.proto
  3. 170 5
      src/business/account/index.ts
  4. 0 1
      src/business/common/index.ts
  5. 63 0
      src/business/favorite/index.ts
  6. 46 7
      src/business/goods/index.ts
  7. 8 12
      src/business/notice/index.ts
  8. 3 3
      src/business/order/desting.ts
  9. 161 66
      src/business/order/list.ts
  10. 0 1
      src/business/order/listing.ts
  11. 24 3
      src/business/search/index.ts
  12. 39 6
      src/business/table/index.ts
  13. 11 0
      src/constants/bank.ts
  14. 1 1
      src/constants/certificate.ts
  15. 14 2
      src/constants/funcode.ts
  16. 1 1
      src/constants/index.ts
  17. 42 22
      src/hooks/datatable/index.ts
  18. 11 0
      src/hooks/datatable/interface.ts
  19. 90 20
      src/mock/router.ts
  20. 1 1
      src/packages/pc/assets/themes/default/default.less
  21. 1 1
      src/packages/pc/components/base/drawer/index.vue
  22. 58 2
      src/packages/pc/components/layouts/header/components/calculator/index.vue
  23. 18 2
      src/packages/pc/components/layouts/header/components/certificate/index.vue
  24. 16 1
      src/packages/pc/components/layouts/header/components/notice/index.vue
  25. 2 2
      src/packages/pc/components/layouts/header/index.vue
  26. 46 0
      src/packages/pc/views/bargain/buy/index.vue
  27. 0 0
      src/packages/pc/views/bargain/sell/index.vue
  28. 3 0
      src/packages/pc/views/boot/index.vue
  29. 42 0
      src/packages/pc/views/favorite/main/components/cancel/index.vue
  30. 23 1
      src/packages/pc/views/favorite/main/index.vue
  31. 0 0
      src/packages/pc/views/listing/bargain/components/cancel/index.vue
  32. 5 5
      src/packages/pc/views/listing/bargain/index.vue
  33. 0 8
      src/packages/pc/views/message/buy/index.vue
  34. 0 30
      src/packages/pc/views/mine/account/index.vue
  35. 59 0
      src/packages/pc/views/mine/bank/components/deposit/index.vue
  36. 59 0
      src/packages/pc/views/mine/bank/components/withdraw/index.vue
  37. 2 2
      src/packages/pc/views/mine/bank/index.vue
  38. 71 0
      src/packages/pc/views/mine/profile/components/account-password/index.vue
  39. 42 0
      src/packages/pc/views/mine/profile/components/rescind/index.vue
  40. 98 0
      src/packages/pc/views/mine/profile/components/sign/index.vue
  41. 75 0
      src/packages/pc/views/mine/profile/index.vue
  42. 0 9
      src/packages/pc/views/order/buy/index.vue
  43. 46 0
      src/packages/pc/views/order/main/index.vue
  44. 0 9
      src/packages/pc/views/order/sell/index.vue
  45. 18 0
      src/packages/pc/views/search/jewelry/index.less
  46. 17 3
      src/packages/pc/views/search/jewelry/index.vue
  47. 1 1
      src/packages/pc/views/warehousing/goods/components/buy/index.vue
  48. 42 0
      src/packages/pc/views/warehousing/goods/components/delete/index.vue
  49. 4 4
      src/packages/pc/views/warehousing/goods/components/details/index.vue
  50. 3 3
      src/packages/pc/views/warehousing/goods/components/favorite/index.vue
  51. 1 1
      src/packages/pc/views/warehousing/goods/components/inquiry/index.vue
  52. 43 0
      src/packages/pc/views/warehousing/goods/components/pull/index.vue
  53. 5 2
      src/packages/pc/views/warehousing/goods/index.vue
  54. 7 7
      src/services/api/account/index.ts
  55. 60 0
      src/services/api/bank/index.ts
  56. 7 0
      src/services/api/common/index.ts
  57. 9 0
      src/services/api/favorite/index.ts
  58. 8 1
      src/services/api/goods/index.ts
  59. 7 0
      src/services/api/order/index.ts
  60. 4 1
      src/services/socket/index.ts
  61. 3 2
      src/services/socket/trade/index.ts
  62. 1 1
      src/stores/modules/common.ts
  63. 29 2
      src/stores/modules/storage.ts
  64. 0 57
      src/types/ermcp/account.d.ts
  65. 155 0
      src/types/ermcp/bank.d.ts
  66. 15 0
      src/types/ermcp/common.d.ts
  67. 47 0
      src/types/ermcp/favorite.d.ts
  68. 10 5
      src/types/ermcp/goods.d.ts
  69. 69 4
      src/types/ermcp/order.d.ts
  70. 16 0
      src/types/proto/account.d.ts
  71. 179 0
      src/types/proto/bank.d.ts
  72. 47 0
      src/types/proto/goods.d.ts
  73. 1 1
      src/types/proto/order.d.ts
  74. 1 0
      src/types/store/globalStorage.d.ts
  75. 1 1
      src/utils/storage/index.ts
  76. 31 0
      src/utils/websocket/crypto.ts
  77. 1 1
      vue.config.js

+ 1 - 0
.eslintrc.js

@@ -15,6 +15,7 @@ module.exports = {
   rules: {
     '@typescript-eslint/no-var-requires': 0,
     '@typescript-eslint/explicit-module-boundary-types': 'off',
+    '@typescript-eslint/no-non-null-assertion': 'off',
     'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
     'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
     'vue/multi-word-component-names': 0,

+ 236 - 0
public/proto/gz.proto

@@ -93,6 +93,22 @@ message TokenCheckRsp {
 		optional uint64 SystemTime = 10; // 返回服务器最新时间
 }
 
+// 修改账户密码请求
+message ModifyPwdReq {
+	optional MessageHead Header = 1;
+		optional uint32 ModifyPwdType = 2; // 修改密码类型1:登陆密码2:资金账户密码
+		optional uint64 ModifyPwdID = 3; // 被修改的ID(ModifyType=1:LoginIDModifyType=2:AccountID)
+		optional string OldPwd = 4; // 旧资金密码
+		optional string NewPwd = 5; // 新资金密码
+}
+
+// 修改账户密码应答
+message ModifyPwdRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+}
+
 // 登录查询请求
 message LoginQueryReq {
 	optional MessageHead Header = 1;
@@ -268,6 +284,188 @@ message DelUserReceiptInfoRsp {
 	optional string RetDesc = 3; // 描述信息
 }
 
+// 签约请求
+message t2bBankSignReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		optional string TradeDate = 4; // 交易所业务日期
+		optional string ExchTicket = 5; // 交易所流水号
+		required string AccountCode = 6; // 账户
+		required string AccountName = 7; // 客户名称
+		required string CusBankID = 8; // 托管银行编号
+		required int32 OperateType = 9; // 变更类型[1-增加;2-修改;4-绑卡;
+		required int32 IsForce = 10; // 是否强制[0-否;1-是]强制,只更新中心签约信息,不发送银行。用于银行信息不一致的情况
+		optional string Currency = 11; // 币种
+		optional int32 AccountType = 12; // 账户类型[1-对私;2-对公]
+		required string OpenBankAccId = 13; // 银行卡行号
+		optional string ForceSignBankAccountNo = 14; // 银行账户[强制签约时填写]
+		optional string ForceSignBankAccountName = 15; // 银行账户名称[强制签约时填写]
+		required string BankAccountNo = 16; // 银行账户
+		optional string BankAccountName = 17; // 银行账户名称
+		required string ExBankName = 18; // 开户行名称
+		optional string OpenBankNo = 19; // 开户支行编号
+		optional string OpenBankName = 20; // 开户支行名称
+		required string CertType = 21; // 证件类型
+		required string CertID = 22; // 证件号码
+		optional string BankAccountPWD = 23; // 银行账户密码
+		optional string AgentName = 24; // 授权代理人姓名
+		optional int32 AgentCertType = 25; // 授权代理人证件类型
+		optional string AgentCertID = 26; // 授权代理人证件号
+		optional int32 BankAccountType = 27; // 银行账户类型
+		optional string BankProvince = 28; // 开户银行所在省份
+		optional string BankCity = 29; // 开户银行所在市
+		optional int32 BankCardType = 30; // 银行卡类型
+		optional string MobilePhone = 31; // 移动电话
+		optional string IdentifyCode = 32; // 验证码
+		optional string email = 33; // 电子邮箱
+		optional string extend_info = 34; // 扩展信息(JSON串,参考配置要求进行填充)
+}
+
+// 签约应答
+message t2bBankSignRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional string AccountCode = 5; // 账户
+		optional string NetAddr = 6; // 网络地址(当这里有网址时,应自动跳转网页)
+		optional int32 Status = 7; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 8; // 交易所流水号
+		optional string ExchId = 9; // 交易所编号
+		optional string TradeDate = 10; // 交易所业务日期
+		optional string CenterTicket = 11; // 中心流水号
+		optional string CenterErrCode = 12; // 返回码
+		optional string CenterErrMsg = 13; // 返回结果说明
+		optional string bankChildAcc = 14; // 银行账号
+		optional string bankChildAccName = 15; // 银行账户名
+		optional string BankId = 16; // 银行卡行号
+		optional string BankAccNum = 17; // 银行卡号
+		optional string BankAccName = 18; // 银行卡户名
+}
+
+// 解约请求
+message t2bBankCancelSignReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		required string AccountCode = 4; // 账户
+		required string CusBankID = 5; // 托管银行编号
+		required int32 IsForce = 6; // 是否强制
+		optional string Currency = 7; // 币种
+		optional string TradeDate = 8; // 交易所业务日期
+		optional string ExchTicket = 9; // 交易所流水号
+		optional string BankChildAcc = 10; // 银行子账号
+		optional string BankChildAccName = 11; // 银行子账号名
+}
+
+// 解约应答
+message t2bBankCancelSignRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional string AccountCode = 5; // 账户
+		optional string NetAddr = 6; // 网络地址(当这里有网址时,应自动跳转网页)
+		optional int32 Status = 7; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 8; // 交易所流水号
+		optional string ExchId = 9; // 交易所编号
+		optional string TradeDate = 10; // 交易所业务日期
+		optional string CenterTicket = 11; // 中心流水号
+		optional string CenterErrCode = 12; // 返回码
+		optional string CenterErrMsg = 13; // 返回结果说明
+}
+
+// 出金请求
+message t2bBankWithdrawReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		optional string ExchId = 3; // 交易所编号
+		required string AccountCode = 4; // 资金账户
+		required string CusBankID = 5; // 托管银行编号
+		required string Currency = 6; // 币种
+		optional int32 AccountType = 7; // 账户类型
+		optional string BankChildAccount = 8; // 银行子账号
+		optional string BankChildAccountName = 9; // 银行子账号名
+		optional string OpenCardBankId = 10; // 银行卡行号
+		optional string BankAccoutNum = 11; // 银行卡号
+		optional string BankAccoutName = 12; // 银行卡户名
+		required double Amount = 13; // 出金金额
+		optional string AppDateTime = 14; // 申请日期和时间
+		optional string OldTaPWD = 15; // 资金密码
+		optional string Desc = 16; // 备注
+		optional string IdentifyCode = 17; // 验证码
+		optional string BranchBankName = 18; // 收款支行名称
+		optional string extend_info = 19; // 扩展信息(JSON串,参考配置要求进行填充)
+		optional string Remark = 20; // 备注
+		optional string ExchTicket = 21; // 交易所流水号
+}
+
+// 出金应答
+message t2bBankWithdrawRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional int32 Status = 5; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 6; // 交易所流水号
+		optional string ExchId = 7; // 交易所编号
+		optional string TradeDate = 8; // 交易日
+		optional string CenterTicket = 9; // 中心流水号
+		optional string CenterErrCode = 10; // 中心返回码
+		optional string CenterErrMsg = 11; // 中心返回结果说明
+		optional string CerterCheckDate = 12; // 中心对账日期
+		optional string NetAddr = 13; // 网络地址(当这里有网址时,应自动跳转网页)
+}
+
+// 入金请求
+message t2bBankDepositReq {
+	optional MessageHead Header = 1;
+		required uint64 ExtOperatorID = 2; // 外部操作流水号
+		required string CusBankID = 3; // 托管银行编号
+		optional string ExchId = 4; // 交易所编号
+		optional string TradeDate = 5; // 交易日
+		optional string ExchTicket = 6; // 交易所流水号
+		required string AccountCode = 7; // 资金账户
+		optional string BusinessNo = 8; // 银行业务编号
+		optional string BankChildAccount = 9; // 银行子账号
+		optional string BankChildAccountName = 10; // 银行子账号名
+		optional string OldTaPWD = 11; // 资金密码
+		required double Amount = 12; // 金额
+		required string Currency = 13; // 币种
+		optional string Remark = 14; // 备注
+		optional string OpenCardBankId = 15; // 银行卡行号
+		optional string BankAccoutNum = 16; // 银行卡号
+		optional string BankAccoutName = 17; // 银行卡户名
+		optional string extend_info = 18; // 扩展信息(JSON串,参考配置要求进行填充)
+}
+
+// 入金应答
+message t2bBankDepositRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional uint64 ExtOperatorID = 4; // 外部操作流水号
+		optional int32 Status = 5; // 状态(0成功,其他数值参考银行服务的错误码)
+		required string ExchTicket = 6; // 交易所流水号
+		optional string ExchId = 7; // 交易所编号
+		optional string TradeDate = 8; // 交易日
+		optional string CenterTicket = 9; // 中心流水号
+		optional string CenterErrCode = 10; // 中心返回码
+		optional string CenterErrMsg = 11; // 中心返回结果说明
+		optional string CerterCheckDate = 12; // 中心对账日期
+		optional string NetAddr = 13; // 网络地址(当这里有网址时,应自动跳转网页)
+}
+
+// 仓单服务公共协议结构
+message WRCommon {
+	optional uint64 UserID = 1; // 用户ID
+	optional uint64 RelatedOrderID = 2; // 关联ID
+	optional uint64 BusinessID = 3; // 业务ID
+	optional uint64 TradeID = 4; // 成交ID
+	optional uint64 AccountID = 5; // 账号ID
+}
+
 // 仓库申请请求 0 29 141
 message WarehouseApplyReq {
 	optional MessageHead Header = 1; // MessageHead
@@ -637,4 +835,42 @@ message WRListingCancelOrderRsp {
 		optional uint64 CancelQty = 8; // 撤单数量
 		optional string OrderTime = 9; // 接受撤单的时间
 		optional string ClientSerialNo = 10; // 客户端流水号
+}
+
+// 钻石出库申请接口请求
+message ReceiptZSOutApplyReq {
+	optional MessageHead Header = 1;
+		optional WRCommon Common = 2; // 
+		optional uint64 UserID = 3; // 用户ID,必填
+		optional uint64 AccountID = 4; // 用户帐户ID
+			optional uint64 WRStandardID = 5; // 现货品种ID
+		optional uint32 WarehouseID = 6; // 仓库ID
+		optional string Mobile = 7; // 申请人手机号
+		optional string AppointmentDate = 8; // 预约日期
+		optional int32 AppointmentModel = 9; // 预约方式:1-物流3-自提
+		optional uint64 CountryID = 10; // 国家
+		optional uint64 ProvinceID = 11; // 省
+		optional uint64 DistrictID = 12; // 区
+		optional uint64 CityID = 13; // 市
+		optional string Address = 14; // 详细地址
+		optional string ContactName = 15; // 收货人提货人
+		optional string ContactNum = 16; // 收货人提货人手机
+		optional string AppointmentRemark = 17; // 预约备注
+		optional uint64 LadingBillID = 18; // 提单ID,必填
+		optional uint32 SubNum = 19; // 提单子单号,必填
+		optional double Qty = 20; // 出库数量,两位小数,必填
+		optional string Remark = 21; // 备注
+		optional uint32 ApplyType = 22; // 申请类型1:会员申请2:平台申请
+		optional uint32 ClientType = 23; // 终端类型
+		optional string ClientTicket = 24; // 客户端流水号
+}
+
+// 钻石出库申请接口响应
+message ReceiptZSOutApplyRsp {
+	optional MessageHead Header = 1; // 消息头
+	optional int32 RetCode = 2; // 返回码
+	optional string RetDesc = 3; // 描述信息
+		optional WRCommon Common = 4; // 
+		optional uint64 ApplyID = 5; // 申请ID
+		optional string ClientTicket = 6; // 客户端流水号
 }

+ 170 - 5
src/business/account/index.ts

@@ -1,19 +1,107 @@
-import { shallowRef, computed } from 'vue'
+import { shallowRef, reactive } from 'vue'
+import { decryptAES } from '@/utils/websocket/crypto'
 import { useDataTable } from '@/hooks/datatable'
 import { commonStore, accountStore, sessionData } from '@/stores'
-import { queryAccountInOutApply } from '@/services/api/account'
+import { queryCusBankSignBank, queryAccountInOutApply, t2bBankSign, t2bBankCancelSign, queryBankAccountSign, t2bBankDeposit, t2bBankWithdraw } from '@/services/api/bank'
 import { getTableColumns } from '../table'
+import { SignStatus } from '@/constants/bank'
 
 export function useAccount() {
     const { getLoginDataInfo } = commonStore
-    const { accountList } = accountStore
-
-    const accountInfo = computed(() => accountList.value[0])
+    const { accountInfo } = accountStore
+    const loginInfo = getLoginDataInfo('loginAccount')
     const userInfo = getLoginDataInfo('userInfo')
+    const bankInfo = shallowRef<Ermcp.BankAccountSignRsp>()
+    const loading = shallowRef(false)
+
+    // 获取签约信息
+    const getBankAccountSign = () => {
+        loading.value = true
+        queryBankAccountSign({
+            data: {
+                userid: userInfo.userid
+            },
+            success: (res) => {
+                if (res.data.length) {
+                    bankInfo.value = res.data[0]
+                }
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
 
     return {
+        loading,
+        loginInfo,
         userInfo,
         accountInfo,
+        bankInfo,
+        getBankAccountSign,
+    }
+}
+
+// 银行签约相关
+export function useBank() {
+    const { getLoginDataInfo } = commonStore
+    const { accountId } = accountStore
+    const userInfo = getLoginDataInfo('userInfo')
+    const loading = shallowRef(false)
+    const custodianBanks = shallowRef<Ermcp.CusBankSignBankRsp[]>([]) // 托管银行列表
+    const selectedCustodianBank = shallowRef<Ermcp.CusBankSignBankRsp>() // 已选中的托管银行
+    const selectedDepositBank = shallowRef<Ermcp.BankInfoRsp>() // 已选中的开户银行
+
+    const formData = reactive<Partial<Proto.t2bBankSignReq>>({
+        ExtOperatorID: new Date().getTime(), // 外部操作流水号
+        AccountCode: accountId.value.toString(), // 账户
+        AccountName: userInfo.customername, // 客户名称
+        OperateType: 1, // 变更类型[1-增加;2-修改;4-绑卡;
+        IsForce: 0, // 是否强制[0-否;1-是]强制,只更新中心签约信息,不发送银行。用于银行信息不一致的情况
+        AccountType: 1, // 账户类型[1-对私;2-对公]
+        CertType: userInfo.cardtypeid.toString(), // 证件类型
+        CertID: decryptAES(userInfo.cardnum), // 证件号码
+    })
+
+    const formSubmit = () => {
+        loading.value = true
+        // 已选的托管银行
+        if (selectedCustodianBank.value) {
+            ({
+                cusbankid: formData.CusBankID,
+                currency: formData.Currency,
+                tradedate: formData.TradeDate,
+            } = selectedCustodianBank.value)
+        }
+        // 已选中的开户银行
+        if (selectedDepositBank.value) {
+            ({
+                bankid: formData.OpenBankAccId,
+                bankname: formData.ExBankName,
+            } = selectedDepositBank.value)
+        }
+        return t2bBankSign({
+            data: formData,
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    // 获取托管银行
+    queryCusBankSignBank({
+        success: (res) => {
+            custodianBanks.value = res.data
+        }
+    })
+
+    return {
+        loading,
+        custodianBanks,
+        selectedCustodianBank,
+        selectedDepositBank,
+        formData,
+        formSubmit,
     }
 }
 
@@ -68,4 +156,81 @@ export function useAccountInOut() {
         columns,
         getAccountInOutApply,
     }
+}
+
+// 入金
+export function useDeposit() {
+    const { getLoginDataInfo } = commonStore
+    const { accountInfo } = accountStore
+    const userInfo = getLoginDataInfo('userInfo')
+    const loading = shallowRef(false)
+
+    const formData = reactive<Partial<Proto.t2bBankDepositReq>>({
+        CusBankID: '', // 托管银行编号
+        AccountCode: '', // 资金账户
+        Currency: '', // 币种
+    })
+
+    const formSubmit = async () => {
+        loading.value = true
+        return new Promise<void>((resolve, reject) => {
+            queryBankAccountSign({
+                data: {
+                    userid: userInfo.userid
+                },
+                success: (res) => {
+                    const bankInfo = res.data[0]
+                    if (bankInfo?.signstatus === SignStatus.Signed) {
+                        ({
+                            cusbankid: formData.CusBankID,
+                            accountcode: formData.AccountCode,
+                            currency: formData.Currency,
+                            bankaccountname2: formData.BankAccoutName,
+                            bankaccountno2: formData.BankAccoutNum,
+                        } = bankInfo)
+
+                        t2bBankDeposit({
+                            data: {
+                                ...formData,
+                                ExtOperatorID: new Date().getTime()
+                            },
+                            success: () => {
+                                resolve()
+                            },
+                            fail: (err) => {
+                                reject(err)
+                            },
+                            complete: () => {
+                                loading.value = false
+                            }
+                        })
+                    } else {
+                        loading.value = false
+                        reject('请先签约银行!')
+                    }
+                },
+                fail: (err) => {
+                    loading.value = false
+                    reject(err)
+                }
+            })
+        })
+    }
+
+    return {
+        loading,
+        userInfo,
+        accountInfo,
+        formData,
+        formSubmit,
+    }
+}
+
+// 出金
+export function useWithdraw() {
+    const loading = shallowRef(false)
+
+    return {
+        loading,
+    }
 }

+ 0 - 1
src/business/common/index.ts

@@ -27,7 +27,6 @@ export async function initBaseData(callback?: () => void) {
             commonStore.getLoginData(),
             futuresStore.getGoodsList(),
             sessionData.getUserMenuList(),
-            sessionData.getAllEnumList(),
             //sessionData.getTableColumnList(),
         ]
 

+ 63 - 0
src/business/favorite/index.ts

@@ -0,0 +1,63 @@
+import { shallowRef } from 'vue'
+import { useDataTable } from '@/hooks/datatable'
+import { getTableColumns } from '@/business/table'
+import { queryMyFavorite } from '@/services/api/favorite'
+import { Category } from '@/constants/diamond'
+import { sessionData } from '@/stores'
+
+export function useFavorite() {
+    const { dataList, total, pageIndex, pageSize, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.MyFavoriteRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef(getTableColumns('favorite'))
+
+    selectList.value = [
+        {
+            label: '商品分类',
+            key: 'zscategorydisplay',
+            options: [
+                { label: '单颗裸钻', value: Category.Diamond.toString() },
+                { label: '单颗彩钻', value: Category.Fancy.toString() }
+            ],
+        },
+    ]
+
+    filterMethod.onReset = () => {
+        getFavoriteList()
+    }
+
+    filterMethod.onSearch = () => {
+        getFavoriteList()
+    }
+
+    const getFavoriteList = () => {
+        const param = getQueryParam()
+        loading.value = true
+        return queryMyFavorite({
+            data: {
+                page: pageIndex.value,
+                pagesize: pageSize.value,
+                userid: sessionData.getLoginInfo('UserID'),
+                zscategorys: param.zscategorydisplay,
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        columns,
+        total,
+        pageIndex,
+        pageSize,
+        selectList,
+        buttonList,
+        getFavoriteList,
+    }
+}

+ 46 - 7
src/business/goods/index.ts

@@ -6,7 +6,7 @@ import { formatDecimal } from '@/filters'
 import { ClientType } from '@/constants/client'
 import { Market } from '@/constants/market'
 import { queryWarehouseInfo } from '@/services/api/warehouse'
-import { addZSGoods, queryDiamondList, queryDiamondDetails, goodsFavoriteOperate } from '@/services/api/goods'
+import { addDiamond, queryDiamondList, queryDiamondDetails, goodsFavoriteOperate, receiptZSOutApply } from '@/services/api/goods'
 import { sessionData } from '@/stores'
 import {
     Category,
@@ -249,7 +249,7 @@ export function useDiamondForm(category: Category) {
 
     const addOrUpdate = () => {
         loading.value = true
-        return addZSGoods({
+        return addDiamond({
             data: {
                 UserID,
                 AccountID: AccountIDs[0],
@@ -294,18 +294,18 @@ export function useDiamondForm(category: Category) {
 }
 
 // 钻石收藏相关
-export function useDiamondFavorite(selectedRow: Ermcp.SellOrderRsp) {
+export function useDiamondFavorite(selectedRow: Ermcp.MyWRPositionRsp | Ermcp.SellOrderRsp) {
     const { UserID } = sessionData.getValue('loginInfo')
     const loading = shallowRef(false)
 
-    // 钻石收藏
-    const diamondFavorite = () => {
+    // 钻石收藏操作
+    const formSubmit = (operateType: number) => {
         loading.value = true
         return goodsFavoriteOperate({
             data: {
                 UserID, // 用户ID,必填
                 WRTradeOrderID: Long.fromString(selectedRow.wrtradeorderid), // 委托单ID,必填
-                OperateType: 1, // 操作类型,1:添加2:删除,必填
+                OperateType: operateType, // 操作类型,1:添加2:删除,必填
                 ClientType: ClientType.Web, // 终端类型
                 MarketID: Market.GZ, // 市场ID,必填
                 ClientSerialNo: v4() // 客户端流水号
@@ -318,6 +318,45 @@ export function useDiamondFavorite(selectedRow: Ermcp.SellOrderRsp) {
 
     return {
         loading,
-        diamondFavorite
+        formSubmit
+    }
+}
+
+// 钻石删除相关
+export function useDiamondDelete(selectedRow: Ermcp.MyWRPositionRsp) {
+    const { UserID, AccountIDs } = sessionData.getValue('loginInfo')
+    const loading = shallowRef(false)
+
+    const formSubmit = () => {
+        loading.value = true
+        return receiptZSOutApply({
+            data: {
+                Header: {
+                    AccountID: AccountIDs[0],
+                },
+                Common: {
+                    UserID,
+                    AccountID: AccountIDs[0],
+                    RelatedOrderID: new Date().getTime(),
+                    TradeID: new Date().getTime(),
+                },
+                UserID,
+                AccountID: AccountIDs[0],
+                LadingBillID: Long.fromString(selectedRow.ladingbillid),
+                SubNum: selectedRow.subnum,
+                Qty: selectedRow.weight,
+                ApplyType: 1,
+                ClientType: ClientType.Web, // 终端类型
+                ClientTicket: v4() // 客户端流水号
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        formSubmit
     }
 }

+ 8 - 12
src/business/notice/index.ts

@@ -5,7 +5,7 @@ import { sessionData } from '@/stores'
 
 export function useNotice() {
     const { LoginID } = sessionData.getValue('loginInfo')
-    const dataList = shallowRef<Ermcp.NoticeRsp[]>()
+    const dataList = shallowRef<Ermcp.NoticeRsp[]>([])
     const loading = shallowRef(false)
 
     // 未读列表
@@ -34,18 +34,14 @@ export function useNotice() {
         })
     }
 
-    const updateNoticeReaded = () => {
-        const asyncTask: Promise<void>[] = []
-        unreadList.value.forEach((e) => {
-            const task = postNoticeReaded({
-                data: {
-                    loginID: LoginID,
-                    noticeID: e.autoid,
-                }
-            })
-            asyncTask.push(task)
+    // 更新已读
+    const updateNoticeReaded = (id: number) => {
+        return postNoticeReaded({
+            data: {
+                loginID: Number(LoginID),
+                noticeID: id,
+            },
         })
-        Promise.all(asyncTask).then(() => getNoticeList())
     }
 
     return {

+ 3 - 3
src/business/order/desting.ts

@@ -13,7 +13,7 @@ import Long from 'long'
  * 钻石买摘牌(立即购买)
  * @returns 
  */
-export function useBuyOrderDesting(selectedRow: Ermcp.SellOrderRsp) {
+export function useBuyOrderDesting(selectedRow: Ermcp.DiamondDetailsRsp) {
     const { UserID, AccountIDs } = sessionData.getValue('loginInfo')
     const loading = shallowRef(false)
 
@@ -51,7 +51,7 @@ export function useBuyOrderDesting(selectedRow: Ermcp.SellOrderRsp) {
  * 钻石买摘牌(买询价)
  * @returns 
  */
-export function useBuyOrderInquiry(selectedRow: Ermcp.SellOrderRsp) {
+export function useBuyOrderInquiry(selectedRow: Ermcp.DiamondDetailsRsp) {
     const { UserID, AccountIDs } = sessionData.getValue('loginInfo')
     const loading = shallowRef(false)
 
@@ -208,7 +208,7 @@ export function useInquiryOperate(selectedRow: Ermcp.MyBargainApplyRsp | Ermcp.M
                     },
                     UserID, // 用户ID,必填
                     AccountID: AccountIDs[0], // 资金账号,必填
-                    SellDelistingApplyID: selectedRow.selldelistingapplyid, // 卖摘牌申请ID,必填
+                    SellDelistingApplyID: Long.fromString(selectedRow.selldelistingapplyid), // 卖摘牌申请ID,必填
                     OperateType: 1, // 操作类型,1:撤销2:拒绝
                     MarketID: Market.GZ, // 市场ID,必填
                     ClientType: ClientType.Web, // 终端类型

+ 161 - 66
src/business/order/list.ts

@@ -2,7 +2,7 @@ import { shallowRef, reactive } from 'vue'
 import { useDataTable } from '@/hooks/datatable'
 import { FilterSelect, FilterButton } from '@/hooks/datatable/interface'
 import { getTableColumns } from '@/business/table'
-import { queryBuyOrder, querySellOrder, queryMyBuyOrder, queryMySellOrder, queryMyDeListing, queryMyBargainApply, queryMyDelistingApply } from '@/services/api/order'
+import { queryBuyOrder, querySellOrder, queryMyBuyOrder, queryMySellOrder, queryMyDeListing, queryMyBargainApply, queryMyDelistingApply, queryMyPerformance } from '@/services/api/order'
 import { sessionData } from '@/stores'
 import { getBuyOrSellList, BuyOrSell } from '@/constants/order'
 import { Category } from '@/constants/diamond'
@@ -17,7 +17,7 @@ const categoryList = [
  * @returns 
  */
 export function useBuyOrder() {
-    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, getQueryParam, resetFilter } = useDataTable<Ermcp.BuyOrderRsp>()
+    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.BuyOrderRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_buyorder'))
 
@@ -35,6 +35,14 @@ export function useBuyOrder() {
         { label: '商品', keys: ['zstabledisplay'] },
     ]
 
+    filterMethod.onReset = () => {
+        getBuyOrderList()
+    }
+
+    filterMethod.onSearch = () => {
+        getBuyOrderList()
+    }
+
     // 获取求购大厅委托单
     const getBuyOrderList = () => {
         const param = getQueryParam()
@@ -58,16 +66,6 @@ export function useBuyOrder() {
         })
     }
 
-    const [reset, search] = buttonList.value
-    reset.onClick = () => {
-        resetFilter()
-        getBuyOrderList()
-    }
-    search.onClick = () => {
-        pageIndex.value = 1
-        getBuyOrderList()
-    }
-
     return {
         loading,
         dataList,
@@ -87,7 +85,7 @@ export function useBuyOrder() {
  * @returns 
  */
 export function useSellOrder() {
-    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, getQueryParam, resetFilter } = useDataTable<Ermcp.SellOrderRsp>()
+    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.SellOrderRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_sellorder'))
 
@@ -105,6 +103,14 @@ export function useSellOrder() {
         { label: '商品', keys: ['goodsno'] },
     ]
 
+    filterMethod.onReset = () => {
+        getSellOrderList()
+    }
+
+    filterMethod.onSearch = () => {
+        getSellOrderList()
+    }
+
     // 获取出售大厅委托单
     const getSellOrderList = () => {
         const param = getQueryParam()
@@ -128,16 +134,6 @@ export function useSellOrder() {
         })
     }
 
-    const [reset, search] = buttonList.value
-    reset.onClick = () => {
-        resetFilter()
-        getSellOrderList()
-    }
-    search.onClick = () => {
-        pageIndex.value = 1
-        getSellOrderList()
-    }
-
     return {
         loading,
         dataList,
@@ -156,7 +152,7 @@ export function useSellOrder() {
  * 我的出售
  */
 export function useSaleOrder() {
-    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, getQueryParam, resetFilter } = useDataTable<Ermcp.MySellOrderRsp>()
+    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.MySellOrderRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_saleorder'))
 
@@ -173,6 +169,14 @@ export function useSaleOrder() {
         { label: '商品', keys: ['goodsno'] },
     ]
 
+    filterMethod.onReset = () => {
+        getSaleOrderList()
+    }
+
+    filterMethod.onSearch = () => {
+        getSaleOrderList()
+    }
+
     // 获取我的出售列表
     const getSaleOrderList = () => {
         const param = getQueryParam()
@@ -196,16 +200,6 @@ export function useSaleOrder() {
         })
     }
 
-    const [reset, search] = buttonList.value
-    reset.onClick = () => {
-        resetFilter()
-        getSaleOrderList()
-    }
-    search.onClick = () => {
-        pageIndex.value = 1
-        getSaleOrderList()
-    }
-
     return {
         loading,
         dataList,
@@ -224,7 +218,7 @@ export function useSaleOrder() {
  * 我的求购
  */
 export function usePurchaseOrder() {
-    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, getQueryParam, resetFilter } = useDataTable<Ermcp.MyBuyOrderRsp>()
+    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.MyBuyOrderRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_purchaseorder'))
 
@@ -241,6 +235,14 @@ export function usePurchaseOrder() {
         { label: '商品', keys: ['zstabledisplay'] },
     ]
 
+    filterMethod.onReset = () => {
+        getPurchaseOrderList()
+    }
+
+    filterMethod.onSearch = () => {
+        getPurchaseOrderList()
+    }
+
     // 获取我的求购列表
     const getPurchaseOrderList = () => {
         const param = getQueryParam()
@@ -264,16 +266,6 @@ export function usePurchaseOrder() {
         })
     }
 
-    const [reset, search] = buttonList.value
-    reset.onClick = () => {
-        resetFilter()
-        getPurchaseOrderList()
-    }
-    search.onClick = () => {
-        pageIndex.value = 1
-        getPurchaseOrderList()
-    }
-
     return {
         loading,
         dataList,
@@ -292,7 +284,7 @@ export function usePurchaseOrder() {
  * 我的摘牌
  */
 export function useDelistingOrder() {
-    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, getQueryParam } = useDataTable<Ermcp.MyDeListingRsp>()
+    const { dataList, total, pageIndex, pageSize, inputList, selectList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.MyDeListingRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_delisting'))
 
@@ -301,12 +293,14 @@ export function useDelistingOrder() {
             label: '商品分类',
             key: 'zscategory',
             selectedValue: Category.Diamond,
+            noClear: true,
             options: categoryList,
         },
         {
             label: '方向',
             key: 'buyorsell',
             selectedValue: BuyOrSell.Buy,
+            noClear: true,
             options: getBuyOrSellList(),
         },
     ]
@@ -316,6 +310,14 @@ export function useDelistingOrder() {
         { label: '商品', keys: ['goodsno'] },
     ]
 
+    filterMethod.onReset = () => {
+        getDelistingOrderList()
+    }
+
+    filterMethod.onSearch = () => {
+        getDelistingOrderList()
+    }
+
     // 获取我的摘牌列表
     const getDelistingOrderList = () => {
         const param = getQueryParam()
@@ -340,17 +342,6 @@ export function useDelistingOrder() {
         })
     }
 
-    const [reset, search] = buttonList.value
-    reset.onClick = () => {
-        pageIndex.value = 1
-        inputList.value.forEach((e) => e.value = undefined)
-        getDelistingOrderList()
-    }
-    search.onClick = () => {
-        pageIndex.value = 1
-        getDelistingOrderList()
-    }
-
     return {
         loading,
         dataList,
@@ -366,21 +357,73 @@ export function useDelistingOrder() {
 }
 
 /**
+ * 我的询价-求购
+ */
+export function useBargainBuyOrder(type: 0 | 1) {
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.MyBargainApplyRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef(getTableColumns('listing_bargain_buy'))
+
+    const selectList = reactive<FilterSelect<{ buyorsell: number, status: number }>[]>([
+        {
+            label: '状态',
+            key: 'status',
+            selectedValue: 1,
+            options: [
+                { label: '全部', value: 0 },
+                { label: '待确认', value: 1 }
+            ],
+        },
+    ])
+
+    const buttonList: FilterButton[] = [
+        {
+            lable: '查询',
+            className: 'el-button--primary',
+            onClick: () => {
+                getBargainOrderList()
+            }
+        },
+    ]
+
+    // 获取我的询价列表
+    const getBargainOrderList = () => {
+        loading.value = true
+        return queryMyBargainApply({
+            data: {
+                type,
+                page: pageIndex.value,
+                pagesize: pageSize.value,
+                userid: sessionData.getLoginInfo('UserID'),
+                applystatus: selectList[0].selectedValue,
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+}
+
+/**
  * 我的询价
  */
-export function useInquireOrder() {
+export function useBargainOrder(type: 0 | 1) {
     const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.MyBargainApplyRsp | Ermcp.MyDelistingApplyRsp>()
     const loading = shallowRef(false)
     const columns = shallowRef<Ermcp.TableColumn[]>([])
 
     const selectList = reactive<FilterSelect<{ buyorsell: number, status: number }>[]>([
         {
-            label: '方向',
+            label: '询价',
             key: 'buyorsell',
             selectedValue: BuyOrSell.Buy,
             options: [
-                { label: '求购', value: BuyOrSell.Buy },
-                { label: '出售', value: BuyOrSell.Sell }
+                { label: '我的求购', value: BuyOrSell.Buy },
+                { label: '我的出售', value: BuyOrSell.Sell }
             ],
         },
         {
@@ -399,18 +442,19 @@ export function useInquireOrder() {
             lable: '查询',
             className: 'el-button--primary',
             onClick: () => {
-                getInquireOrderList()
+                getBargainOrderList()
             }
         },
     ]
 
     // 获取我的询价列表
-    const getInquireOrderList = () => {
+    const getBargainOrderList = () => {
         loading.value = true
         dataList.value = []
 
         const [buyOrSell, applyStatus] = selectList
         const param: Ermcp.MyBargainApplyReq | Ermcp.MyDelistingApplyReq = {
+            type,
             page: pageIndex.value,
             pagesize: pageSize.value,
             userid: sessionData.getLoginInfo('UserID'),
@@ -419,7 +463,7 @@ export function useInquireOrder() {
 
         switch (buyOrSell.selectedValue) {
             case BuyOrSell.Buy: {
-                columns.value = getTableColumns('listing_inquire_buy')
+                columns.value = getTableColumns('listing_bargain_buy')
                 return queryMyBargainApply({
                     data: param,
                     success: (res) => {
@@ -432,7 +476,7 @@ export function useInquireOrder() {
                 })
             }
             case BuyOrSell.Sell: {
-                columns.value = getTableColumns('listing_inquire_sell')
+                columns.value = getTableColumns('listing_bargain_sell')
                 return queryMyDelistingApply({
                     data: param,
                     success: (res) => {
@@ -459,6 +503,57 @@ export function useInquireOrder() {
         columns,
         selectList,
         buttonList,
-        getInquireOrderList,
+        getBargainOrderList,
+    }
+}
+
+export function usePerformance(buyorsell?: BuyOrSell) {
+    const { dataList, total, pageIndex, pageSize, inputList, buttonList, filterMethod, getQueryParam } = useDataTable<Ermcp.MyPerformancRsp>()
+    const loading = shallowRef(false)
+    const columns = shallowRef(getTableColumns('order'))
+
+    inputList.value = [
+        { label: '商品', keys: ['goodsno'] },
+    ]
+
+    filterMethod.onReset = () => {
+        getPerformanceList()
+    }
+
+    filterMethod.onSearch = () => {
+        getPerformanceList()
+    }
+
+    const getPerformanceList = () => {
+        const param = getQueryParam()
+        loading.value = true
+        return queryMyPerformance({
+            data: {
+                userid: sessionData.getLoginInfo('UserID'),
+                page: pageIndex.value,
+                pagesize: pageSize.value,
+                buyorsell,
+                zsallproperties: param.goodsno,
+            },
+            success: (res) => {
+                total.value = res.total
+                dataList.value = res.data
+            },
+            complete: () => {
+                loading.value = false
+            }
+        })
+    }
+
+    return {
+        loading,
+        dataList,
+        total,
+        pageIndex,
+        pageSize,
+        columns,
+        inputList,
+        buttonList,
+        getPerformanceList,
     }
 }

+ 0 - 1
src/business/order/listing.ts

@@ -8,7 +8,6 @@ import { zsBuyOrderListing, zsSellOrderListing, wrListingCancelOrder } from '@/s
 import { sessionData } from '@/stores'
 import {
     Category,
-    getCategoryList,
     getCurrencyTypeList,
     getShapeTypeList,
     getColorTypeList,

+ 24 - 3
src/business/search/index.ts

@@ -1,4 +1,4 @@
-import { ref, shallowRef } from 'vue'
+import { ref, shallowRef, computed } from 'vue'
 import { useDataTable } from '@/hooks/datatable'
 import { getTableColumns } from '@/business/table'
 import { sessionData } from '@/stores'
@@ -19,7 +19,7 @@ import {
 } from '@/constants/diamond'
 
 export function useSearch(category: Category) {
-    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.SellOrderRsp>()
+    const { dataList, total, pageIndex, pageSize } = useDataTable<Ermcp.SellOrderRsp & { checked: boolean }>()
     const loading = shallowRef(false)
     const columns = shallowRef(getTableColumns('listing_sellorder'))
     const warehouseList = shallowRef<Ermcp.WarehouseInfoRsp[]>([]) // 仓库列表
@@ -49,6 +49,25 @@ export function useSearch(category: Category) {
         styleTypeList: getStyleTypeList(),
     }
 
+    // 记录上次选中的列表项索引
+    let prevIndex = -1
+
+    // 选中的列表项
+    const checkedItems = computed(() => dataList.value.filter((e) => e.checked))
+    // 选择列表项
+    const selectItem = (index: number) => {
+        const selection = checkedItems.value
+        if (selection.length) {
+            // 最多只能选择4项
+            if (selection.length > 4) {
+                dataList.value[prevIndex].checked = false
+            }
+            prevIndex = index
+        } else {
+            prevIndex = -1
+        }
+    }
+
     // 获取出售大厅委托单
     const getSellOrderList = () => {
         const { zsshapetype, zscurrencytype, zscerttype, warehouseid, zsstyletype, ...param } = formData.value
@@ -66,7 +85,7 @@ export function useSearch(category: Category) {
             },
             success: (res) => {
                 total.value = res.total
-                dataList.value = res.data
+                dataList.value = res.data.map((e) => ({ ...e, checked: false }))
             },
             complete: () => {
                 loading.value = false
@@ -105,10 +124,12 @@ export function useSearch(category: Category) {
         formData,
         enums,
         dataList,
+        checkedItems,
         columns,
         total,
         pageIndex,
         pageSize,
+        selectItem,
         getSellOrderList,
         onSearch,
         onReset,

+ 39 - 6
src/business/table/index.ts

@@ -2,7 +2,7 @@ import { shallowRef } from 'vue'
 import { sessionData } from '@/stores'
 
 type TableColumnKey = typeof tableColumnKeys[number]
-const tableColumnKeys = ['system_menu', 'system_role', 'warehousing_diamond', 'warehousing_warehouse', 'mine_capital', 'listing_sellorder', 'listing_buyorder', 'listing_saleorder', 'listing_purchaseorder', 'listing_delisting', 'listing_inquire_buy', 'listing_inquire_sell', 'mine_address', 'mine_invoice'] as const
+const tableColumnKeys = ['system_menu', 'system_role', 'warehousing_diamond', 'warehousing_warehouse', 'mine_capital', 'listing_sellorder', 'listing_buyorder', 'listing_saleorder', 'listing_purchaseorder', 'listing_delisting', 'listing_bargain_buy', 'listing_bargain_sell', 'mine_address', 'mine_invoice', 'favorite', 'order'] as const
 
 /**
  * PC端表格列
@@ -26,7 +26,7 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
     ]],
     // 我的仓储-我的库存
     ['warehousing_diamond', [
-        { prop: 'warehouseid', label: '仓库' },
+        { prop: 'warehousenamedisplay', label: '仓库' },
         { prop: 'zsshapetypedisplay', label: '形状', width: 200 },
         { prop: 'zscolortype1display', label: '颜色' },
         { prop: 'zsclaritytype1display', label: '净度' },
@@ -38,7 +38,7 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'price', label: '价格' },
         { prop: 'weight', label: '克拉重量' },
         { prop: 'priceper', label: '克拉单价' },
-        { prop: 'zsclaritytype', label: '是否上架' },
+        { prop: 'marketflag', label: '是否上架' },
         { prop: 'operate', label: '操作', width: 240 }
     ]],
     // 我的仓储-我的仓库
@@ -129,7 +129,7 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'operate', label: '操作' }
     ]],
     // 挂牌大厅-我的询价-求购
-    ['listing_inquire_buy', [
+    ['listing_bargain_buy', [
         { prop: 'sellusername', label: '卖方' },
         { prop: 'warehousenamedisplay', label: '仓库' },
         { prop: 'zsshapetypedisplay', label: '形状', width: 200 },
@@ -142,14 +142,14 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'sizedisplay', label: '尺寸' },
         { prop: 'price', label: '价格' },
         { prop: 'qty', label: '克拉重量' },
-        { prop: 'exchangerate', label: '克拉单价' },
+        { prop: 'priceper', label: '克拉单价' },
         { prop: 'applyprice', label: '我的出价' },
         { prop: 'applystatus', label: '申请状态' },
         { prop: 'applytime', label: '申请时间', width: 200 },
         { prop: 'operate', label: '操作', width: 180 }
     ]],
     // 挂牌大厅-我的询价-出售
-    ['listing_inquire_sell', [
+    ['listing_bargain_sell', [
         { prop: 'buyusername', label: '买方' },
         { prop: 'zsshapetypedisplay', label: '形状', width: 200 },
         { prop: 'zscolortypedisplay', label: '颜色' },
@@ -196,6 +196,39 @@ const pcTableColumnMap = new Map<TableColumnKey, Ermcp.TableColumn[]>([
         { prop: 'information', label: '企业信息' },
         { prop: 'operate', label: '操作' }
     ]],
+    // 我的收藏
+    ['favorite', [
+        { prop: 'warehousenamedisplay', label: '仓库' },
+        { prop: 'zsshapetypedisplay', label: '形状' },
+        { prop: 'zscolortype1display', label: '颜色' },
+        { prop: 'zsclaritytype1display', label: '净度' },
+        { prop: 'zscuttype1display', label: '切工' },
+        { prop: 'zspolishtype1display', label: '抛光' },
+        { prop: 'zssymmetrytype1display', label: '对称' },
+        { prop: 'zsfluorescencetype1display', label: '荧光' },
+        { prop: 'sizedisplay', label: '尺寸' },
+        { prop: 'price', label: '价格' },
+        { prop: 'weight', label: '克拉重量' },
+        { prop: 'priceper', label: '克拉单价' },
+        { prop: 'operate', label: '操作', width: 180 }
+    ]],
+    // 订单管理
+    ['order', [
+        { prop: 'zscategorydisplay', label: '商品分类' },
+        { prop: 'goodsno', label: '商品编号' },
+        { prop: 'zsshapetypedisplay', label: '形状' },
+        { prop: 'zscolortype1display', label: '颜色' },
+        { prop: 'sizedisplay', label: '尺寸' },
+        { prop: 'zspolishtype1display', label: '重量' },
+        { prop: 'price', label: '价格' },
+        { prop: 'matchusername', label: '对手方' },
+        { prop: 'paidamount', label: '已付金额' },
+        { prop: 'freezeamountremain', label: '履约剩余冻结' },
+        { prop: 'performancestatus', label: '履约状态' },
+        { prop: 'curstepid', label: '当前步骤' },
+        { prop: 'remaindays', label: '剩余天数' },
+        { prop: 'operate', label: '操作', width: 180 }
+    ]],
 ])
 
 /**

+ 11 - 0
src/constants/bank.ts

@@ -0,0 +1,11 @@
+/**
+ * 签约状态
+ */
+export enum SignStatus {
+    Unsigned = 1,  // 未签约
+    Audit = 2,  // 签约待审核
+    Signing = 3,  // 签约中
+    Signed = 4,  // 已签约
+    Rescinded = 7,  // 已解约
+    Refuse = 10, // 审核拒绝
+}

+ 1 - 1
src/constants/certificate.ts

@@ -15,6 +15,6 @@ export function getCertificateTypeList() {
  * 获取证件类型名称
  * @returns 
  */
-export function getCertificateTypeName(value: number) {
+export function getCertificateTypeName(value?: number) {
     return getEnumTypeName(getCertificateTypeList(), value)
 }

+ 14 - 2
src/constants/funcode.ts

@@ -12,18 +12,27 @@ export enum FunCode {
     QueryQuoteReq = 34, // 盘面查询请求
     QueryQuoteRsp = 35, // 盘面查询应答
 
-    // --------  账户操作相关接口 -----------
     LoginReq = 65537, // 用户登录请求
     LoginRsp = 65538, // 用户登录应答
     LogoutReq = 65539, // 用户登出请求
     LogoutRsp = 65540, // 用户登出应答
     TokenCheckReq = 65541, // 用户令牌校验请求
     TokenCheckRsp = 65542, // 用户令牌校验应答
+    ModifyPwdReq = 65543, // 修改账户密码请求
+    ModifyPwdRsp = 65544, // 修改账户密码应答
+
+    t2bBankSignReq = 589825, // 签约请求
+    t2bBankSignRsp = 589826, // 签约应答
+    t2bBankCancelSignReq = 589827, // 解约请求
+    t2bBankCancelSignRsp = 589828, // 解约应答
+    t2bBankWithdrawReq = 589837, // 出金请求
+    t2bBankWithdrawRsp = 589838, // 出金应答
+    t2bBankDepositReq = 589843, // 入金请求
+    t2bBankDepositRsp = 589844, //入金应答
 
     AddZSGoodsReq = 1441827, // 新增钻石商品接口请求
     AddZSGoodsRsp = 1441828, // 新增钻石商品接口响应
 
-    // 仓库信息
     WarehouseApplyReq = 1900685,     /// 仓库申请请求
     WarehouseApplyRsp = 1900686,    /// 仓库申请响应
 
@@ -44,6 +53,9 @@ export enum FunCode {
     WRListingCancelOrderReq = 1441796, // 挂牌撤单请求(钻石挂牌撤单请求)
     WRListingCancelOrderRsp = 1441797, // 挂牌撤单应答(钻石挂牌撤单应答)
 
+    ReceiptZSOutApplyReq = 1376463, // 钻石出库申请接口请求
+    ReceiptZSOutApplyRsp = 1376464, // 钻石出库申请接口响应
+
     GoodsFavoriteOperateReq = 1441843, // 商品收藏操作接口请求
     GoodsFavoriteOperateRsp = 1441844, // 商品收藏操作接口应答
 

+ 1 - 1
src/constants/index.ts

@@ -60,7 +60,7 @@ export function getEnumTypeList(enums?: Ermcp.EnumRsp[]): EnumType[] {
  * @param value 
  * @returns 
  */
-export function getEnumTypeName(enums: EnumType[], value: number): string {
+export function getEnumTypeName(enums: EnumType[], value?: number): string {
     const item = enums.find((e) => e.value === value)
     if (item) {
         return item.label

+ 42 - 22
src/hooks/datatable/index.ts

@@ -1,9 +1,9 @@
-import { reactive, shallowRef, toRefs, computed } from 'vue'
-import { FilterValue, FilterSelect, FilterInput, FilterButton } from './interface'
+import { reactive, ref, shallowRef, toRefs, computed, UnwrapRef } from 'vue'
+import { FilterValue, FilterOptions } from './interface'
 
 export function useDataTable<T>() {
     // 数据源
-    const dataSource = shallowRef<T[]>([])
+    const dataSource = ref<T[]>([])
     // 总记录条数
     const total = shallowRef(0)
     // 当前页码
@@ -13,17 +13,50 @@ export function useDataTable<T>() {
     // 过滤筛选值
     const filters = shallowRef<FilterValue<T>[]>([])
     // 过滤选项
-    const filterOptons: { selectList: FilterSelect<T>[], inputList: FilterInput<T>[], buttonList: FilterButton[] } = reactive({
+    const filterOptons: FilterOptions<T> = reactive({
         selectList: [],
         inputList: [],
         buttonList: [
-            { lable: '重置', onClick: () => resetFilter() },
-            { lable: '查询', className: 'el-button--primary', onClick: () => onFilter() }, // 这里 className 不应该使用框架样式,以后再解决
+            {
+                lable: '重置',
+                onClick: () => {
+                    filterOptons.selectList.forEach((e) => {
+                        if (!e.noClear) {
+                            e.selectedValue = undefined
+                        }
+                    })
+                    filterOptons.inputList.forEach((e) => {
+                        if (!e.noClear) {
+                            e.value = undefined
+                        }
+                    })
+                    pageIndex.value = 1
+                    filterMethod.onReset()
+                }
+            },
+            {
+                lable: '查询',
+                className: 'el-button--primary', // 这里 className 不应该使用框架样式,以后再解决
+                onClick: () => {
+                    pageIndex.value = 1
+                    filterMethod.onSearch()
+                }
+            },
         ]
     })
 
+    // 数据过滤方法
+    const filterMethod = {
+        onReset: () => {
+            filters.value = []
+        },
+        onSearch: () => {
+            filters.value = getFilterParam()
+        }
+    }
+
     // 数据列表
-    const dataList = computed<T[]>({
+    const dataList = computed<UnwrapRef<T[]>>({
         get() {
             return dataSource.value.filter((row) => {
                 // 过滤所有查询条件
@@ -31,7 +64,7 @@ export function useDataTable<T>() {
                     return e.keys.some((key) => {
                         const value = row[key]
                         if (typeof value === 'number') {
-                            return e.filteredValue.includes(value)
+                            return e.filteredValue.includes(value as T[keyof T])
                         }
                         return e.filteredValue.some((text) => {
                             return String(value).toLowerCase().indexOf(String(text)) >= 0
@@ -45,10 +78,6 @@ export function useDataTable<T>() {
         }
     })
 
-    const onFilter = () => {
-        filters.value = getFilterParam()
-    }
-
     // 获取过滤参数,支持多条件查询
     const getFilterParam = () => {
         const options: FilterValue<T>[] = []
@@ -91,22 +120,13 @@ export function useDataTable<T>() {
         return params
     }
 
-    // 重置过滤项
-    const resetFilter = () => {
-        pageIndex.value = 1
-        filters.value = []
-        filterOptons.selectList.forEach((e) => e.selectedValue = undefined)
-        filterOptons.inputList.forEach((e) => e.value = undefined)
-    }
-
     return {
         dataList,
         total,
         pageIndex,
         pageSize,
-        getFilterParam,
+        filterMethod,
         getQueryParam,
-        resetFilter,
         ...toRefs(filterOptons),
     }
 }

+ 11 - 0
src/hooks/datatable/interface.ts

@@ -6,6 +6,15 @@ export interface FilterValue<T> {
     filteredValue: (T[keyof T])[], // 多选过滤或模糊查询
 }
 
+/**
+ * 过滤选项
+ */
+export interface FilterOptions<T> {
+    selectList: FilterSelect<T>[],
+    inputList: FilterInput<T>[],
+    buttonList: FilterButton[]
+}
+
 /** 
  * 过滤选择框
  */
@@ -13,6 +22,7 @@ export interface FilterSelect<T> {
     key: keyof T,
     label?: string,
     selectedValue?: T[keyof T],
+    noClear?: boolean, // 重置时是否阻止清空当前值
     placeholder?: string,
     options: {
         label: string,
@@ -28,6 +38,7 @@ export interface FilterInput<T> {
     keys: (keyof T)[],
     label?: string,
     value?: T[keyof T],
+    noClear?: boolean, // 重置时是否阻止清空当前值
     type?: 'text' | 'number',
     placeholder?: string
 }

+ 90 - 20
src/mock/router.ts

@@ -215,24 +215,24 @@ const appmenu = {
                         authType: 1,
                         sort: 1,
                         title: '我的询价',
-                        code: 'listing_inquire',
-                        url: 'inquire',
+                        code: 'listing_bargain',
+                        url: 'bargain',
                         urlType: 1,
-                        component: 'views/listing/inquire/index.vue',
+                        component: 'views/listing/bargain/index.vue',
                         children: [
                             {
                                 authType: 3,
                                 title: '详情',
-                                code: 'listing_inquire_details',
-                                component: 'views/listing/inquire/components/details/index.vue',
+                                code: 'listing_bargain_details',
+                                component: 'views/listing/bargain/components/details/index.vue',
                                 buttonName: 'details',
                                 buttonType: 'primary',
                             },
                             {
                                 authType: 3,
                                 title: '撤销',
-                                code: 'listing_inquire_cancel',
-                                component: 'views/listing/inquire/components/cancel/index.vue',
+                                code: 'listing_bargain_cancel',
+                                component: 'views/listing/bargain/components/cancel/index.vue',
                                 buttonName: 'cancel',
                                 buttonType: 'primary',
                             },
@@ -249,6 +249,24 @@ const appmenu = {
                 urlType: 1,
                 component: 'views/favorite/main/index.vue',
                 icon: 'List',
+                children: [
+                    {
+                        authType: 3,
+                        title: '详情',
+                        code: 'favorite_details',
+                        component: 'views/warehousing/goods/components/details/index.vue',
+                        buttonName: 'details',
+                        buttonType: 'primary',
+                    },
+                    {
+                        authType: 3,
+                        title: '取消',
+                        code: 'favorite_cancel',
+                        component: 'views/favorite/main/components/cancel/index.vue',
+                        buttonName: 'cancel',
+                        buttonType: 'primary',
+                    },
+                ]
             },
             {
                 authType: 1,
@@ -267,7 +285,7 @@ const appmenu = {
                         code: 'order_buy',
                         url: '',
                         urlType: 1,
-                        component: 'views/order/buy/index.vue',
+                        component: 'views/order/main/index.vue',
                     },
                     {
                         authType: 1,
@@ -276,7 +294,7 @@ const appmenu = {
                         code: 'order_sell',
                         url: 'sell',
                         urlType: 1,
-                        component: 'views/order/sell/index.vue'
+                        component: 'views/order/main/index.vue'
                     },
                 ]
             },
@@ -392,19 +410,71 @@ const appmenu = {
                         authType: 1,
                         sort: 1,
                         title: '会员信息',
-                        code: 'mine_account',
+                        code: 'mine_profile',
                         url: '',
                         urlType: 1,
-                        component: 'views/mine/account/index.vue',
+                        component: 'views/mine/profile/index.vue',
+                        children: [
+                            {
+                                authType: 3,
+                                title: '签约',
+                                code: 'mine_profile_sign',
+                                component: 'views/mine/profile/components/sign/index.vue',
+                                buttonName: 'sign',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '解约',
+                                code: 'mine_profile_rescind',
+                                component: 'views/mine/profile/components/rescind/index.vue',
+                                buttonName: 'rescind',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '修改登录密码',
+                                code: 'mine_profile_loginpassword',
+                                component: 'views/mine/profile/components/login-password/index.vue',
+                                buttonName: 'loginPassword',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '修改资金密码',
+                                code: 'mine_profile_accountpassword',
+                                component: 'views/mine/profile/components/account-password/index.vue',
+                                buttonName: 'accountPassword',
+                                buttonType: 'primary',
+                            }
+                        ]
                     },
                     {
                         authType: 1,
                         sort: 2,
                         title: '我的出入金',
-                        code: 'mine_capital',
-                        url: 'capital',
+                        code: 'mine_bank',
+                        url: 'bank',
                         urlType: 1,
-                        component: 'views/mine/capital/index.vue',
+                        component: 'views/mine/bank/index.vue',
+                        children: [
+                            {
+                                authType: 3,
+                                title: '入金申请',
+                                code: 'bank_deposit',
+                                component: 'views/mine/bank/components/deposit/index.vue',
+                                buttonName: 'deposit',
+                                buttonType: 'primary',
+                            },
+                            {
+                                authType: 3,
+                                title: '出金申请',
+                                code: 'bank_withdraw',
+                                component: 'views/mine/bank/components/withdraw/index.vue',
+                                buttonName: 'withdraw',
+                                buttonType: 'primary',
+                            }
+                        ]
                     },
                     {
                         authType: 1,
@@ -492,8 +562,8 @@ const appmenu = {
                 authType: 1,
                 sort: 1,
                 title: '询价消息',
-                code: 'message',
-                url: '/message',
+                code: 'bargain',
+                url: '/bargain',
                 urlType: 1,
                 component: 'Main',
                 icon: 'ChatDotRound',
@@ -503,19 +573,19 @@ const appmenu = {
                         authType: 1,
                         sort: 1,
                         title: '买方询价',
-                        code: 'message_buy',
+                        code: 'bargain_buy',
                         url: '',
                         urlType: 1,
-                        component: 'views/message/buy/index.vue',
+                        component: 'views/bargain/buy/index.vue',
                     },
                     {
                         authType: 1,
                         sort: 1,
                         title: '卖方询价',
-                        code: 'message_sell',
+                        code: 'bargain_sell',
                         url: 'sell',
                         urlType: 1,
-                        component: 'views/message/sell/index.vue',
+                        component: 'views/bargain/sell/index.vue',
                     }
                 ]
             },

+ 1 - 1
src/packages/pc/assets/themes/default/default.less

@@ -55,7 +55,7 @@
 
                 &__content {
                     align-items  : flex-start;
-                    padding-right: 60px;
+                    padding-right: 48px;
                 }
 
                 &--row {

+ 1 - 1
src/packages/pc/components/base/drawer/index.vue

@@ -1,7 +1,7 @@
 <!-- 抽屉弹框组件 -->
 <template>
   <app-modal class="app-drawer" :show="show" :close-on-click-mask="false" @mask="close">
-    <div class="app-drawer__wrapper" v-loading="loading">
+    <div class="app-drawer__wrapper" v-loading="loading" element-loading-background="rgba(255, 255, 255, .35)">
       <div class="app-drawer__header">
         <slot name="header">
           <h1>{{ title }}</h1>

+ 58 - 2
src/packages/pc/components/layouts/header/components/calculator/index.vue

@@ -1,13 +1,69 @@
 <!-- 钻石计算器 -->
 <template>
-    <app-drawer title="计算器" v-model:show="show">
-        钻石计算器
+    <app-drawer title="计算器" :width="860" v-model:show="show">
+        <el-form ref="formRef" label-width="70px">
+            <el-form-item label="形状">
+                <el-radio-group>
+                    <el-radio :label="1">圆形</el-radio>
+                    <el-radio :label="2">异形</el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="颜色">
+                <el-radio-group>
+                    <el-radio :label="item" v-for="(item, index) in colors" :key="index">
+                        {{ item }}
+                    </el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="净度">
+                <el-radio-group>
+                    <el-radio :label="item" v-for="(item, index) in claritys" :key="index">
+                        {{ item }}
+                    </el-radio>
+                </el-radio-group>
+            </el-form-item>
+            <el-form-item label="重量" style="width:50%">
+                <el-input type="number" placeholder="请输入">
+                    <template #append>(克拉)</template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="汇率" style="width:50%">
+                <el-input type="number" placeholder="请输入" />
+            </el-form-item>
+            <el-form-item label="折扣(%)" style="width:50%">
+                <el-input type="number" placeholder="请输入">
+                    <template #prepend>
+                        <el-select style="width: 90px">
+                            <el-option label="+" value="1" />
+                            <el-option label="-" value="2" />
+                        </el-select>
+                    </template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="美元">
+                <span>100</span>
+            </el-form-item>
+            <el-form-item label="人民币">
+                <span>100</span>
+            </el-form-item>
+            <el-form-item label="日期">
+                <span>2022-07-29</span>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="primary">计算</el-button>
+                <el-button>取消</el-button>
+            </el-form-item>
+        </el-form>
     </app-drawer>
 </template>
 
 <script lang="ts" setup>
 import { shallowRef } from 'vue'
+import type { FormInstance } from 'element-plus'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const show = shallowRef(true)
+const colors = ['D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N']
+const claritys = ['IF', 'VVS1', 'VVS2', 'VS1', 'VS2', 'SI1', 'SI2', 'SI3', 'I1', 'I2', 'I3']
+const formRef = shallowRef<FormInstance>()
 </script>

+ 18 - 2
src/packages/pc/components/layouts/header/components/certificate/index.vue

@@ -1,7 +1,23 @@
 <!-- 证书查询 -->
 <template>
-    <app-drawer title="证书查询" v-model:show="show">
-        证书查询
+    <app-drawer title="证书查询" :width="600" v-model:show="show">
+        <el-tabs>
+            <el-tab-pane label="国内" name="first">User</el-tab-pane>
+            <el-tab-pane label="国际" name="second">Config</el-tab-pane>
+        </el-tabs>
+        <ul>
+            <li>
+                <label>National Gemological Training Centre</label>
+                <el-input placeholder="请输入证书号" />
+            </li>
+            <li>
+                <label>国家珠宝玉石质量监督检验中心</label>
+                <el-input placeholder="请输入防伪码" />
+            </li>
+            <li>
+                <el-button type="primary">查询</el-button>
+            </li>
+        </ul>
     </app-drawer>
 </template>
 

+ 16 - 1
src/packages/pc/components/layouts/header/components/notice/index.vue

@@ -17,7 +17,7 @@
                 </el-timeline-item>
             </template>
         </el-timeline> -->
-        <el-collapse v-model="selectedItem" accordion v-if="tableList.length">
+        <el-collapse v-model="selectedItem" accordion v-if="tableList.length" @change="collapseChange">
             <template v-for="(item,index) in tableList" :key="index">
                 <el-collapse-item :name="index">
                     <template #title>
@@ -39,6 +39,7 @@
 
 <script lang="ts" setup>
 import { shallowRef, PropType, computed } from 'vue'
+import { useNotice } from '@/business/notice'
 import moment from 'moment'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
@@ -49,6 +50,7 @@ const props = defineProps({
     }
 })
 
+const { updateNoticeReaded } = useNotice()
 const show = shallowRef(true)
 const selectedTab = shallowRef('notice')
 const selectedItem = shallowRef(0)
@@ -66,4 +68,17 @@ const tableList = computed(() => {
         }
     }
 })
+
+const collapseChange = (index: number) => {
+    if (tableList.value.length && index.toString()) {
+        const item = tableList.value[index]
+        if (!item.readed) {
+            updateNoticeReaded(item.autoid).then(() => {
+                //item.readed = true
+            })
+        }
+    }
+}
+
+collapseChange(selectedItem.value)
 </script>

+ 2 - 2
src/packages/pc/components/layouts/header/index.vue

@@ -17,7 +17,7 @@
                 <el-badge type="danger" :is-dot="unreadList.length > 0">
                     <app-icon icon="g-icon--notice" @click="openComponent('notice')" />
                 </el-badge>
-                <app-icon icon="ChatDotRound" @click="routerTo('message_buy')" />
+                <app-icon icon="ChatDotRound" @click="routerTo('bargain_buy')" />
                 <app-icon icon="SetUp" @click="openComponent('calculator')" />
                 <app-icon icon="Collection" @click="openComponent('certificate')" />
                 <app-icon icon="g-icon--minimize" @click="exitFullSreen" v-if="fullScreen" />
@@ -31,7 +31,7 @@
                 </span>
                 <template #dropdown>
                     <el-dropdown-menu>
-                        <el-dropdown-item icon="Key">修改密码</el-dropdown-item>
+                        <!-- <el-dropdown-item icon="Key">修改密码</el-dropdown-item> -->
                         <el-dropdown-item icon="SwitchButton" @click="signOut()">退出登录</el-dropdown-item>
                     </el-dropdown-menu>
                 </template>

+ 46 - 0
src/packages/pc/views/bargain/buy/index.vue

@@ -0,0 +1,46 @@
+<!-- 询价消息-买方询价 -->
+<template>
+    <app-view>
+        <template #header>
+            <app-filter v-bind="{ selectList,  buttonList }" :loading="loading" />
+        </template>
+        <!-- 表格数据 -->
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <!-- 申请状态 -->
+            <template #applystatus="{ value }">
+                {{ getApplyStatusName(value) }}
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :menus="handleTableButtons(row)" :options="{ selectedRow: row }"
+                    @closed="getBargainOrderList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getBargainOrderList" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { ElMessage } from 'element-plus'
+import { useBargainOrder } from '@/business/order/list'
+import { getApplyStatusName, ApplyStatus } from '@/constants/order'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const { loading, dataList, total, pageIndex, pageSize, columns, selectList, buttonList, getBargainOrderList } = useBargainOrder(1)
+
+// “待确认”状态 有撤销按钮
+const handleTableButtons = (row: Ermcp.MyBargainApplyRsp | Ermcp.MyDelistingApplyRsp) => {
+    if (row.applystatus === ApplyStatus.Pending) {
+        return ['details', 'cancel']
+    }
+    return ['details']
+}
+
+getBargainOrderList().catch((err) => ElMessage.error(err))
+</script>

+ 0 - 0
src/packages/pc/views/message/sell/index.vue → src/packages/pc/views/bargain/sell/index.vue


+ 3 - 0
src/packages/pc/views/boot/index.vue

@@ -28,6 +28,9 @@ const initService = async () => {
     loading.value = false
   })
 
+  await sessionData.getAllEnumList()
+  await sessionData.getErrorInfoList()
+
   if (sessionData.getLoginInfo('Token')) {
     // 等待连接交易服务
     await socket.connectTrade().catch((err) => {

+ 42 - 0
src/packages/pc/views/favorite/main/components/cancel/index.vue

@@ -0,0 +1,42 @@
+<!-- 我的收藏-取消 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否删除该收藏?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useDiamondFavorite } from '@/business/goods'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.SellOrderRsp>,
+        default: () => ({})
+    },
+})
+
+const { loading, formSubmit } = useDiamondFavorite(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formSubmit(2).then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 23 - 1
src/packages/pc/views/favorite/main/index.vue

@@ -1,9 +1,31 @@
 <!-- 我的收藏 -->
 <template>
     <app-view>
-        我的收藏
+        <template #header>
+            <app-filter v-bind="{ selectList,  buttonList }" :loading="loading" />
+        </template>
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :options="{ selectedRow: row }" @closed="getFavoriteList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getFavoriteList" />
+            </template>
+        </app-table>
     </app-view>
 </template>
 
 <script lang="ts" setup>
+import { ElMessage } from 'element-plus'
+import { useFavorite } from '@/business/favorite'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const { loading, dataList, columns, total, pageIndex, pageSize, selectList, buttonList, getFavoriteList } = useFavorite()
+
+getFavoriteList().catch((err) => ElMessage.error(err))
 </script>

+ 0 - 0
src/packages/pc/views/listing/inquire/components/cancel/index.vue → src/packages/pc/views/listing/bargain/components/cancel/index.vue


+ 5 - 5
src/packages/pc/views/listing/inquire/index.vue → src/packages/pc/views/listing/bargain/index.vue

@@ -13,11 +13,11 @@
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation :menus="handleTableButtons(row)" :options="{ selectedRow: row }"
-                    @closed="getInquireOrderList" />
+                    @closed="getBargainOrderList" />
             </template>
             <template #footer>
                 <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
-                    @change="getInquireOrderList" />
+                    @change="getBargainOrderList" />
             </template>
         </app-table>
     </app-view>
@@ -25,14 +25,14 @@
 
 <script lang="ts" setup>
 import { ElMessage } from 'element-plus'
-import { useInquireOrder } from '@/business/order/list'
+import { useBargainOrder } from '@/business/order/list'
 import { getApplyStatusName, ApplyStatus } from '@/constants/order'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppPagination from '@pc/components/base/pagination/index.vue'
 import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
 import AppFilter from '@pc/components/base/table-filter/index.vue'
 
-const { loading, dataList, total, pageIndex, pageSize, columns, selectList, buttonList, getInquireOrderList } = useInquireOrder()
+const { loading, dataList, total, pageIndex, pageSize, columns, selectList, buttonList, getBargainOrderList } = useBargainOrder(0)
 
 // “待确认”状态 有撤销按钮
 const handleTableButtons = (row: Ermcp.MyBargainApplyRsp | Ermcp.MyDelistingApplyRsp) => {
@@ -42,5 +42,5 @@ const handleTableButtons = (row: Ermcp.MyBargainApplyRsp | Ermcp.MyDelistingAppl
     return ['details']
 }
 
-getInquireOrderList().catch((err) => ElMessage.error(err))
+getBargainOrderList().catch((err) => ElMessage.error(err))
 </script>

+ 0 - 8
src/packages/pc/views/message/buy/index.vue

@@ -1,8 +0,0 @@
-<template>
-    <app-view>
-        买方询价
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-</script>

+ 0 - 30
src/packages/pc/views/mine/account/index.vue

@@ -1,30 +0,0 @@
-<template>
-    <app-view>
-        <el-descriptions title="会员信息" :column="2" style="padding:20px" v-if="userInfo">
-            <el-descriptions-item label="登录代码">{{ userInfo.postalcode }}</el-descriptions-item>
-            <el-descriptions-item label="企业名称">{{ userInfo.customername }}</el-descriptions-item>
-            <el-descriptions-item label="登录账号">{{ userInfo.customername }}</el-descriptions-item>
-            <el-descriptions-item label="手机号">{{ userInfo.mobile2 }}</el-descriptions-item>
-            <el-descriptions-item label="机构代码"></el-descriptions-item>
-            <el-descriptions-item label="法人姓名"></el-descriptions-item>
-            <el-descriptions-item label="证件类型"></el-descriptions-item>
-            <el-descriptions-item label="企业地址"></el-descriptions-item>
-            <el-descriptions-item label="证件号码"></el-descriptions-item>
-            <el-descriptions-item label="联系人"></el-descriptions-item>
-            <el-descriptions-item label="联系电话"></el-descriptions-item>
-        </el-descriptions>
-        <el-divider />
-        <el-descriptions title="签约信息" :column="2" style="padding:20px" v-if="accountInfo">
-            <el-descriptions-item label="资金账号">{{ accountInfo.accountid }}</el-descriptions-item>
-            <el-descriptions-item label="余额">{{ accountInfo.balance }}</el-descriptions-item>
-            <el-descriptions-item label="冻结资金">{{ accountInfo.freezemargin }}</el-descriptions-item>
-            <el-descriptions-item label="可用资金">{{ accountInfo.usedmargin }}</el-descriptions-item>
-        </el-descriptions>
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-import { useAccount } from '@/business/account'
-
-const { accountInfo, userInfo } = useAccount()
-</script>

+ 59 - 0
src/packages/pc/views/mine/bank/components/deposit/index.vue

@@ -0,0 +1,59 @@
+<!-- 会员中心-我的出入金-入金申请 -->
+<template>
+    <app-drawer title="入金申请" :width="800" v-model:show="show" :loading="loading">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item label="资金账号">
+                <span>{{ accountInfo?.accountid }}</span>
+            </el-form-item>
+            <el-form-item label="账户余额">
+                <span>{{ accountInfo?.balance }}</span>
+            </el-form-item>
+            <el-form-item label="入金金额" prop="Amount">
+                <el-input type="number" placeholder="请输入" v-model.number="formData.Amount" />
+            </el-form-item>
+            <el-form-item label="金额大写">
+                <span>壹万元</span>
+            </el-form-item>
+            <el-form-item class="el-form-item--row" label="备注" prop="Remark">
+                <el-input type="textarea" :rows="3" v-model="formData.Remark" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance, FormRules } from 'element-plus'
+import { useDeposit } from '@/business/account'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const { loading, accountInfo, formData, formSubmit } = useDeposit()
+const formRef = ref<FormInstance>()
+const show = ref(true)
+
+const formRules: FormRules = {
+    Amount: [{ required: true, message: '请输入金额', trigger: 'blur' }],
+}
+
+const onCancel = () => {
+    show.value = false
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            formSubmit().then(() => {
+                ElMessage.success('提交成功')
+                onCancel()
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 59 - 0
src/packages/pc/views/mine/bank/components/withdraw/index.vue

@@ -0,0 +1,59 @@
+<!-- 会员中心-我的出入金-出金申请 -->
+<template>
+    <app-drawer title="出金申请" :width="800" v-model:show="show" :loading="loading">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item label="资金账号">
+                <span>{{ accountInfo.accountid }}</span>
+            </el-form-item>
+            <el-form-item label="账户余额">
+                <span>{{ accountInfo.balance }}</span>
+            </el-form-item>
+            <el-form-item label="入金金额" prop="Amount">
+                <el-input type="number" placeholder="请输入" v-model.number="formData.Amount" />
+            </el-form-item>
+            <el-form-item label="金额大写">
+                <span>壹万元</span>
+            </el-form-item>
+            <el-form-item class="el-form-item--row" label="备注" prop="Remark">
+                <el-input type="textarea" :rows="3" v-model="formData.Remark" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance, FormRules } from 'element-plus'
+import { useDeposit } from '@/business/account'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const { loading, accountInfo, formData, formSubmit } = useDeposit()
+const formRef = ref<FormInstance>()
+const show = ref(true)
+
+const formRules: FormRules = {
+    Amount: [{ required: true, message: '请输入金额', trigger: 'blur' }],
+}
+
+const onCancel = () => {
+    show.value = false
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            formSubmit().then(() => {
+                ElMessage.success('提交成功')
+                onCancel()
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 2 - 2
src/packages/pc/views/mine/capital/index.vue → src/packages/pc/views/mine/bank/index.vue

@@ -5,8 +5,7 @@
         </template>
         <app-table :data="dataList" v-model:columns="columns" :loading="loading">
             <template #header>
-                <el-button type="primary">入金申请</el-button>
-                <el-button type="primary">出金申请</el-button>
+                <app-auth-operation :menus="['deposit', 'withdraw']" @closed="getAccountInOutApply" />
             </template>
         </app-table>
     </app-view>
@@ -17,6 +16,7 @@ import { ElMessage } from 'element-plus'
 import { useAccountInOut } from '@/business/account'
 import AppTable from '@pc/components/base/table/index.vue'
 import AppFilter from '@pc/components/base/table-filter/index.vue'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
 
 const { dataList, columns, selectList, buttonList, loading, getAccountInOutApply } = useAccountInOut()
 

+ 71 - 0
src/packages/pc/views/mine/profile/components/account-password/index.vue

@@ -0,0 +1,71 @@
+<!-- 会员中心-会员信息-修改密码 -->
+<template>
+    <app-drawer title="修改密码" :width="460" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" label-width="80px" :model="formData" :rules="formRules">
+            <el-form-item label="登录代码">
+                <span>2000000</span>
+            </el-form-item>
+            <el-form-item label="原密码" prop="UserName">
+                <el-input placeholder="请输入" v-model="formData.UserName" />
+            </el-form-item>
+            <el-form-item label="新密码" prop="UserName">
+                <el-input placeholder="请输入" v-model="formData.UserName" />
+            </el-form-item>
+            <el-form-item label="确认密码" prop="UserName">
+                <el-input placeholder="请输入" v-model="formData.UserName" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance, FormRules } from 'element-plus'
+import { useInvoiceForm } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.WrUserReceiptInfoRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, formData, addOrUpdate } = useInvoiceForm(props.selectedRow)
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+
+const formRules: FormRules = {
+    ReceiptType: [{ required: true, message: '请选择发票类型' }],
+    UserName: [{ required: true, message: '请输入发票抬头', trigger: 'blur' }],
+    TaxpayerID: [{ required: true, message: '请输入税号', trigger: 'blur' }],
+    ReceiptBank: [{ required: true, message: '请输入开户银行', trigger: 'blur' }],
+    ReceiptAccount: [{ required: true, message: '请输入银行账号', trigger: 'blur' }],
+    Address: [{ required: true, message: '请输入企业地址', trigger: 'blur' }],
+    ContactInfo: [{ required: true, message: '请输入企业电话', trigger: 'blur' }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            addOrUpdate().then(() => {
+                ElMessage.success('提交成功')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 42 - 0
src/packages/pc/views/mine/profile/components/rescind/index.vue

@@ -0,0 +1,42 @@
+<!-- 会员中心-会员信息-解约 -->
+<template>
+    <app-drawer title="解约" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否解约银行?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useDiamondFavorite } from '@/business/goods'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.MyWRPositionRsp | Ermcp.SellOrderRsp>,
+        default: () => ({})
+    },
+})
+
+const { loading, formSubmit } = useDiamondFavorite(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formSubmit(1).then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 98 - 0
src/packages/pc/views/mine/profile/components/sign/index.vue

@@ -0,0 +1,98 @@
+<!-- 会员中心-会员信息-签约 -->
+<template>
+    <app-drawer title="签约" :width="800" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--horizontal" label-width="110px" :model="formData" :rules="formRules">
+            <el-form-item label="资金账号">
+                <span>{{ formData.AccountCode }}</span>
+            </el-form-item>
+            <el-form-item label="托管银行" prop="CustodianBank">
+                <el-select value-key="cusbankid" v-model="selectedCustodianBank">
+                    <el-option :label="item.cusbankname" :value="item" v-for="(item, index) in custodianBanks"
+                        :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="账户类型">
+                <span>对公</span>
+            </el-form-item>
+            <el-form-item label="开户银行" prop="DepositBank">
+                <el-select value-key="bankid" v-model="selectedDepositBank" filterable>
+                    <el-option :label="item.bankname" :value="item"
+                        v-for="(item, index) in selectedCustodianBank?.Banklst ?? []" :key="index" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="证件类型">
+                <span>{{ getCertificateTypeName(Number(formData.CertType)) }}</span>
+            </el-form-item>
+            <el-form-item label="银行卡号" prop="BankAccountNo">
+                <el-input type="number" placeholder="请输入" v-model.number="formData.BankAccountNo" />
+            </el-form-item>
+            <el-form-item label="证件号码">
+                <span>{{ formData.CertID }}</span>
+            </el-form-item>
+            <el-form-item label="银行卡户名" prop="BankAccountName">
+                <el-input placeholder="请输入" v-model="formData.BankAccountName" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">提交</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import type { FormInstance, FormRules } from 'element-plus'
+import { getCertificateTypeName } from '@/constants/certificate'
+import { useBank } from '@/business/account'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const { loading, custodianBanks, selectedCustodianBank, selectedDepositBank, formData, formSubmit } = useBank()
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+
+const formRules: FormRules = {
+    BankAccountNo: [{ required: true, message: '请输入银行卡号', trigger: 'blur' }],
+    BankAccountName: [{ required: true, message: '请输入银行卡户名', trigger: 'blur' }],
+    CustodianBank: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (selectedCustodianBank.value) {
+                callback()
+            } else {
+                callback(new Error('请选择托管银行'))
+            }
+        }
+    }],
+    DepositBank: [{
+        required: true,
+        validator: (rule, value, callback) => {
+            if (selectedDepositBank.value) {
+                callback()
+            } else {
+                callback(new Error('请选择开户银行'))
+            }
+        }
+    }],
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            formSubmit().then(() => {
+                ElMessage.success('您的申请已提交,请稍后查询结果!')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+</script>

+ 75 - 0
src/packages/pc/views/mine/profile/index.vue

@@ -0,0 +1,75 @@
+<template>
+    <app-view>
+        <el-descriptions title="会员信息" :column="2" style="padding:20px">
+            <el-descriptions-item label="登录代码">{{ loginInfo.logincode }}</el-descriptions-item>
+            <el-descriptions-item label="企业名称">{{ handleNoneValue(userInfo.customername) }}</el-descriptions-item>
+            <el-descriptions-item label="登录账号">{{ loginInfo.loginid }}</el-descriptions-item>
+            <el-descriptions-item label="手机号">{{ handleNoneValue(userInfo.mobile2) }}</el-descriptions-item>
+            <el-descriptions-item label="机构代码">{{ userInfo.userid }}</el-descriptions-item>
+            <el-descriptions-item label="法人姓名">{{ handleNoneValue(userInfo.legalpersonname) }}</el-descriptions-item>
+            <el-descriptions-item label="证件类型">{{ getCertificateTypeName(userInfo.cardtypeid) }}</el-descriptions-item>
+            <el-descriptions-item label="企业地址">{{ handleNoneValue(userInfo.address) }}</el-descriptions-item>
+            <el-descriptions-item label="证件号码">{{ handleNoneValue(decryptAES(userInfo.cardnum)) }}
+            </el-descriptions-item>
+            <el-descriptions-item label="联系人">{{ handleNoneValue(userInfo.contactname) }}</el-descriptions-item>
+            <el-descriptions-item label="联系电话">{{ handleNoneValue(userInfo.telphone) }}</el-descriptions-item>
+        </el-descriptions>
+        <el-divider />
+        <el-descriptions title="签约信息" :column="2" style="padding:20px" v-if="accountInfo">
+            <el-descriptions-item label="资金账号">{{ accountInfo.accountid }}</el-descriptions-item>
+            <el-descriptions-item label="余额">{{ accountInfo.balance }}</el-descriptions-item>
+            <el-descriptions-item label="冻结资金">{{ accountInfo.freezemargin }}</el-descriptions-item>
+            <el-descriptions-item label="可用资金">{{ accountInfo.usedmargin }}</el-descriptions-item>
+            <template v-if="bankInfo?.signstatus === SignStatus.Signed">
+                <el-descriptions-item label="托管银行">{{ bankInfo.cusbankid }}</el-descriptions-item>
+                <el-descriptions-item label="开户银行">{{ bankInfo.bankname }}</el-descriptions-item>
+                <el-descriptions-item label="证件类型">{{ bankInfo.cardtype ?
+                getCertificateTypeName(Number(bankInfo.cardtype)) : handleNoneValue('') }}
+                </el-descriptions-item>
+                <el-descriptions-item label="银行卡户名">{{ bankInfo.bankaccountname }}</el-descriptions-item>
+                <el-descriptions-item label="证件号码">{{ handleNoneValue(bankInfo.cardno) }}</el-descriptions-item>
+                <el-descriptions-item label="银行子账号">{{ handleNoneValue(bankInfo.bankchildaccount) }}
+                </el-descriptions-item>
+                <el-descriptions-item label="手机号">{{ handleNoneValue(bankInfo.mobilephone) }}</el-descriptions-item>
+            </template>
+        </el-descriptions>
+        <app-auth-operation :menus="handleTableButtons" @closed="getBankAccountSign" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { computed } from 'vue'
+import { useAccount } from '@/business/account'
+import { decryptAES } from '@/utils/websocket/crypto'
+import { handleNoneValue } from '@/filters'
+import { getCertificateTypeName } from '@/constants/certificate'
+import { SignStatus } from '@/constants/bank'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
+
+const { loading, loginInfo, userInfo, accountInfo, bankInfo, getBankAccountSign } = useAccount()
+
+const handleTableButtons = computed(() => {
+    const buttons = ['loginPassword', 'accountPassword']
+    if (!loading.value) {
+        if (bankInfo.value) {
+            switch (bankInfo.value.signstatus) {
+                case SignStatus.Signed: {
+                    buttons.push('rescind')
+                    break
+                }
+                case SignStatus.Unsigned:
+                case SignStatus.Rescinded:
+                case SignStatus.Refuse: {
+                    buttons.push('sign')
+                    break
+                }
+            }
+        } else {
+            buttons.push('sign')
+        }
+    }
+    return buttons
+})
+
+getBankAccountSign()
+</script>

+ 0 - 9
src/packages/pc/views/order/buy/index.vue

@@ -1,9 +0,0 @@
-<!-- 订单管理-我的买履约 -->
-<template>
-    <app-view>
-        我的买履约
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-</script>

+ 46 - 0
src/packages/pc/views/order/main/index.vue

@@ -0,0 +1,46 @@
+<!-- 订单管理-我的买履约 -->
+<template>
+    <app-view>
+        <template #header>
+            <app-filter v-bind="{ inputList, buttonList }" :loading="loading" />
+        </template>
+        <app-table :data="dataList" v-model:columns="columns" :loading="loading">
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-auth-operation :options="{ selectedRow: row }" @closed="getPerformanceList" />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex"
+                    @change="getPerformanceList" />
+            </template>
+        </app-table>
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { ElMessage } from 'element-plus'
+import { useRoute } from 'vue-router'
+import { BuyOrSell } from '@/constants/order'
+import { usePerformance } from '@/business/order/list'
+import AppAuthOperation from '@pc/components/modules/auth-operation/index.vue'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppFilter from '@pc/components/base/table-filter/index.vue'
+
+const route = useRoute()
+
+const buyorsell = (() => {
+    switch (route.name) {
+        case 'order_buy': {
+            return BuyOrSell.Buy
+        }
+        case 'order_sell': {
+            return BuyOrSell.Sell
+        }
+    }
+})()
+
+const { loading, dataList, columns, total, pageIndex, pageSize, inputList, buttonList, getPerformanceList } = usePerformance(buyorsell)
+
+getPerformanceList().catch((err) => ElMessage.error(err))
+</script>

+ 0 - 9
src/packages/pc/views/order/sell/index.vue

@@ -1,9 +0,0 @@
-<!-- 订单管理-我的卖履约 -->
-<template>
-    <app-view>
-        我的卖履约
-    </app-view>
-</template>
-
-<script lang="ts" setup>
-</script>

+ 18 - 0
src/packages/pc/views/search/jewelry/index.less

@@ -9,4 +9,22 @@
             cursor: pointer;
         }
     }
+
+    &__comparebar {
+        margin-top: 24px;
+
+        ul {
+            display: flex;
+            border : 1px solid #eee;
+
+            li {
+                display       : flex;
+                flex-direction: column;
+
+                &:not(:first-child) {
+                    margin-left: 20px;
+                }
+            }
+        }
+    }
 }

+ 17 - 3
src/packages/pc/views/search/jewelry/index.vue

@@ -36,12 +36,26 @@
         </template>
         <div class="search-jewelry__list" v-if="dataList.length">
             <template v-for="(item,index) in dataList" :key="index">
-                <el-card shadow="hover" @click="openComponent('details')">
-                    <h4>{{item.goodsno}}</h4>
+                <el-card shadow="hover">
+                    <h4 @click="openComponent('details')">{{item.goodsno}}</h4>
                     <p>{{item.zsstyletypedisplay}}</p>
+                    <el-checkbox v-model="item.checked" label="对比" @change="selectItem(index)" />
                 </el-card>
             </template>
         </div>
+        <div class="search-jewelry__comparebar" v-if="checkedItems.length">
+            <div>对比栏</div>
+            <ul>
+                <li v-for="(item,index) in checkedItems" :key="index">
+                    <span>{{ index + 1 }}</span>
+                    <span>{{item.goodsno}}</span>
+                    <span>{{item.zsstyletypedisplay}}</span>
+                </li>
+                <li>
+                    <el-button>对比</el-button>
+                </li>
+            </ul>
+        </div>
     </app-view>
 </template>
 
@@ -53,7 +67,7 @@ import { useSearch } from '@/business/search'
 import { Category } from '@/constants/diamond'
 import AppMultiple from '@pc/components/base/multiple/index.vue'
 
-const { loading, dataList, formData, enums, getSellOrderList, onSearch, onReset } = useSearch(Category.Jewelry)
+const { loading, dataList, checkedItems, formData, enums, selectItem, getSellOrderList, onSearch, onReset } = useSearch(Category.Jewelry)
 const formRef = ref<FormInstance>()
 const formRules: FormRules = {}
 const componentId = ref<string>()

+ 1 - 1
src/packages/pc/views/warehousing/goods/components/buy/index.vue

@@ -17,7 +17,7 @@ import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Ermcp.SellOrderRsp>,
+        type: Object as PropType<Ermcp.MyWRPositionRsp>,
         default: () => ({})
     }
 })

+ 42 - 0
src/packages/pc/views/warehousing/goods/components/delete/index.vue

@@ -0,0 +1,42 @@
+<!-- 我的仓储-我的库存-删除 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否删除该商品?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useDiamondDelete } from '@/business/goods'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.MyWRPositionRsp>,
+        default: () => ({})
+    },
+})
+
+const { loading, formSubmit } = useDiamondDelete(props.selectedRow)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formSubmit().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 4 - 4
src/packages/pc/views/warehousing/goods/components/details/index.vue

@@ -3,9 +3,9 @@
     <teleport :to="teleport">
         <app-view class="app-details" v-bind="$attrs">
             <template #header>
-                <div>
+                <div v-if="details">
                     <el-button @click="$emit('closed')">返回</el-button>
-                    <template v-if="showButton && selectedRow.wrtradeorderid">
+                    <template v-if="showButton && details.wrtradeorderid">
                         <el-button type="primary" @click="openComponent('favorite')">收藏</el-button>
                         <el-button type="primary" @click="openComponent('buy')">立即购买</el-button>
                         <el-button type="primary" @click="openComponent('inquiry')">询价申请</el-button>
@@ -109,7 +109,7 @@
                 </div>
             </template>
         </app-view>
-        <component :is="componentMap.get(componentId)" v-bind="{ selectedRow }" @closed="closeComponent"
+        <component :is="componentMap.get(componentId)" v-bind="{ selectedRow: details }" @closed="closeComponent"
             v-if="componentId" />
     </teleport>
 </template>
@@ -132,7 +132,7 @@ const props = defineProps({
         default: '#appPageTeleport'
     },
     selectedRow: {
-        type: Object as PropType<Ermcp.SellOrderRsp & Ermcp.MyWRPositionRsp>,
+        type: Object as PropType<{ goodsno: string }>,
         default: () => ({})
     },
 })

+ 3 - 3
src/packages/pc/views/warehousing/goods/components/favorite/index.vue

@@ -16,12 +16,12 @@ import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Ermcp.SellOrderRsp>,
+        type: Object as PropType<Ermcp.MyWRPositionRsp | Ermcp.SellOrderRsp>,
         default: () => ({})
     },
 })
 
-const { loading, diamondFavorite } = useDiamondFavorite(props.selectedRow)
+const { loading, formSubmit } = useDiamondFavorite(props.selectedRow)
 const show = shallowRef(true)
 const refresh = shallowRef(false)
 
@@ -31,7 +31,7 @@ const onCancel = (isRefresh = false) => {
 }
 
 const onSubmit = () => {
-    diamondFavorite().then(() => {
+    formSubmit(1).then(() => {
         ElMessage.success('提交成功')
         onCancel(true)
     }).catch((err) => {

+ 1 - 1
src/packages/pc/views/warehousing/goods/components/inquiry/index.vue

@@ -28,7 +28,7 @@ import AppDrawer from '@pc/components/base/drawer/index.vue'
 
 const props = defineProps({
     selectedRow: {
-        type: Object as PropType<Ermcp.SellOrderRsp>,
+        type: Object as PropType<Ermcp.MyWRPositionRsp>,
         default: () => ({})
     }
 })

+ 43 - 0
src/packages/pc/views/warehousing/goods/components/pull/index.vue

@@ -0,0 +1,43 @@
+<!-- 我的仓储-我的库存-下架 -->
+<template>
+    <app-drawer title="提示" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div style="font-size:16px;text-align:center">是否下架该商品?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)" plain>取消</el-button>
+            <el-button type="primary" @click="onSubmit">确认</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { BuyOrSell } from '@/constants/order'
+import { useListingCancel } from '@/business/order/listing'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    selectedRow: {
+        type: Object as PropType<Ermcp.MyWRPositionRsp>,
+        default: () => ({})
+    }
+})
+
+const { loading, formSubmit } = useListingCancel(props.selectedRow.wrtradeorderid, BuyOrSell.Sell)
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formSubmit().then(() => {
+        ElMessage.success('提交成功')
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

+ 5 - 2
src/packages/pc/views/warehousing/goods/index.vue

@@ -17,6 +17,10 @@
             <template #zsclaritytype="{ row }">
                 {{ [row.zsclaritytype1display, row.zsclaritytype2display].join('-') }}
             </template>
+            <!-- 是否下架 -->
+            <template #marketflag="{ value }">
+                {{ value === 1 ? '是' : '否' }}
+            </template>
             <!-- 操作 -->
             <template #operate="{ row }">
                 <app-auth-operation :menus="handleTableButtons(row)" :options="{ selectedRow: row }"
@@ -42,9 +46,8 @@ const { loading, dataList, total, pageIndex, pageSize, columns, selectList, inpu
 const headerButtons = ['add', 'sell']
 const tableButtons = ['details', 'put', 'pull', 'delete']
 
-// 冻结数量 > 0则为已上架
 const handleTableButtons = (row: Ermcp.MyWRPositionRsp) => {
-    if (row.ffreezeqty > 0) {
+    if (row.marketflag === 1) {
         return tableButtons.filter((code) => code !== 'put')
     }
     return tableButtons.filter((code) => code !== 'pull')

+ 7 - 7
src/services/api/account/index.ts

@@ -18,6 +18,13 @@ export function tokenCheck(params: TradeRequest<Proto.TokenCheckReq, Proto.Token
 }
 
 /**
+ * 修改密码
+ */
+export function modifyPwd(params: TradeRequest<Proto.ModifyPwdReq, Proto.ModifyPwdRsp>) {
+    return tradeServerRequest('ModifyPwdReq', 'ModifyPwdRsp', params);
+}
+
+/**
  * 查询用户菜单
  */
 export function queryAccountMenu(params: HttpRequest<{ rsp: Ermcp.UserMenu[] }>) {
@@ -50,11 +57,4 @@ export function queryTaAccounts(params: HttpRequest<{ req: Ermcp.TaAccountsReq,
  */
 export function queryAccountRole(params: HttpRequest<{ rsp: Ermcp.UserRole[] }>) {
     return httpRequest('/account/role', 'get', params);
-}
-
-/**
- * 查询充值提现
- */
-export function queryAccountInOutApply(params: HttpRequest<{ req: Ermcp.AccountInOutApplyReq, rsp: Ermcp.AccountOutInApplyRsp[] }>) {
-    return httpRequest('/Qhj/QueryAccountInOutApply', 'get', params);
 }

+ 60 - 0
src/services/api/bank/index.ts

@@ -0,0 +1,60 @@
+import { httpRequest } from '@/services/http'
+import { HttpRequest } from '@/services/http/interface'
+import { tradeServerRequest } from '@/services/socket/trade'
+import { TradeRequest } from '@/services/socket/trade/interface'
+
+/**
+ * 签约
+ */
+export function t2bBankSign(params: TradeRequest<Partial<Proto.t2bBankSignReq>, Proto.t2bBankSignRsp>) {
+    return tradeServerRequest('t2bBankSignReq', 't2bBankSignRsp', params);
+}
+
+/**
+ * 解约
+ */
+export function t2bBankCancelSign(params: TradeRequest<Proto.t2bBankCancelSignReq, Proto.t2bBankCancelSignRsp>) {
+    return tradeServerRequest('t2bBankCancelSignReq', 't2bBankCancelSignRsp', params);
+}
+
+/**
+ * 出金申请
+ */
+export function t2bBankWithdraw(params: TradeRequest<Proto.t2bBankWithdrawReq, Proto.t2bBankWithdrawRsp>) {
+    return tradeServerRequest('t2bBankWithdrawReq', 't2bBankWithdrawRsp', params);
+}
+
+/**
+ * 入金申请
+ */
+export function t2bBankDeposit(params: TradeRequest<Partial<Proto.t2bBankDepositReq>, Proto.t2bBankDepositRsp>) {
+    return tradeServerRequest('t2bBankDepositReq', 't2bBankDepositRsp', params);
+}
+
+/**
+ * 查询托管银行
+ */
+export function queryCusBankSignBank(params: HttpRequest<{ rsp: Ermcp.CusBankSignBankRsp[] }>) {
+    return httpRequest('/Qhj/QueryCusBankSignBank', 'get', params);
+}
+
+/**
+ * 查询开户行
+ */
+export function queryBankInfo(params: HttpRequest<{ rsp: Ermcp.BankInfoRsp[] }>) {
+    return httpRequest('/Qhj/QueryBankInfo', 'get', params);
+}
+
+/**
+ * 查询签约银行信息(提现账户管理)
+ */
+export function queryBankAccountSign(params: HttpRequest<{ req: Ermcp.BankAccountSignReq, rsp: Ermcp.BankAccountSignRsp[] }>) {
+    return httpRequest('/Qhj/QueryBankAccountSign', 'get', params);
+}
+
+/**
+ * 查询充值提现
+ */
+export function queryAccountInOutApply(params: HttpRequest<{ req: Ermcp.AccountInOutApplyReq, rsp: Ermcp.AccountOutInApplyRsp[] }>) {
+    return httpRequest('/Qhj/QueryAccountInOutApply', 'get', params);
+}

+ 7 - 0
src/services/api/common/index.ts

@@ -69,4 +69,11 @@ export function queryNotice(params: HttpRequest<{ req: Ermcp.NoticeReq, rsp: Erm
  */
 export function postNoticeReaded(params: HttpRequest<{ req: Ermcp.NoticeReadedReq }>) {
     return httpRequest('/Common/NoticeReaded', 'post', params);
+}
+
+/**
+ * 获取数据库错误信息
+ */
+export function queryErrorInfos(params: HttpRequest<{ req: Ermcp.ErrorInfosReq, rsp: Ermcp.ErrorInfosRsp[] }>) {
+    return httpRequest('/Common/QueryErrorInfos', 'get', params);
 }

+ 9 - 0
src/services/api/favorite/index.ts

@@ -0,0 +1,9 @@
+import { httpRequest } from '@/services/http'
+import { HttpRequest } from '@/services/http/interface'
+
+/**
+ * 查询我的收藏
+ */
+export function queryMyFavorite(params: HttpRequest<{ req: Ermcp.MyFavoriteReq, rsp: Ermcp.MyFavoriteRsp[] }>) {
+    return httpRequest('/Guangzuan/QueryMyFavorite', 'get', params);
+}

+ 8 - 1
src/services/api/goods/index.ts

@@ -28,11 +28,18 @@ export function queryDiamondDetails(params: HttpRequest<{ req: Ermcp.DiamondDeta
 /**
  * 新增钻石商品
  */
-export function addZSGoods(params: TradeRequest<Proto.AddZSGoodsReq, Proto.AddZSGoodsRsp>) {
+export function addDiamond(params: TradeRequest<Proto.AddZSGoodsReq, Proto.AddZSGoodsRsp>) {
     return tradeServerRequest('AddZSGoodsReq', 'AddZSGoodsRsp', params, Market.GZ);
 }
 
 /**
+ * 钻石出库申请
+ */
+export function receiptZSOutApply(params: TradeRequest<Proto.ReceiptZSOutApplyReq, Proto.ReceiptZSOutApplyRsp>) {
+    return tradeServerRequest('ReceiptZSOutApplyReq', 'ReceiptZSOutApplyRsp', params, 4);
+}
+
+/**
  * 商品收藏操作
  */
 export function goodsFavoriteOperate(params: TradeRequest<Proto.GoodsFavoriteOperateReq, Proto.GoodsFavoriteOperateRsp>) {

+ 7 - 0
src/services/api/order/index.ts

@@ -114,4 +114,11 @@ export function queryMyBargainApply(params: HttpRequest<{ req: Ermcp.MyBargainAp
  */
 export function queryMyDelistingApply(params: HttpRequest<{ req: Ermcp.MyDelistingApplyReq, rsp: Ermcp.MyDelistingApplyRsp[] }>) {
     return httpRequest('/Guangzuan/QueryMyDelistingApply', 'get', params);
+}
+
+/**
+ * 查询我的履约
+ */
+export function queryMyPerformance(params: HttpRequest<{ req: Ermcp.MyPerformancReq, rsp: Ermcp.MyPerformancRsp[] }>) {
+    return httpRequest('/Guangzuan/QueryMyPerformanc', 'get', params);
 }

+ 4 - 1
src/services/socket/index.ts

@@ -6,6 +6,7 @@ import { FunCode } from '@/constants/funcode'
 import { parseReceivePush } from './quote/build/decode'
 import protobuf from './trade/protobuf'
 import { checkToken, stopCheckToken, checkTokenLoop } from '@/business/common'
+import { sessionData } from '@/stores'
 import service from '@/services'
 import eventBus from '@/services/bus'
 
@@ -48,7 +49,9 @@ export default new (class {
                 case FunCode.LogoutRsp: {
                     // 通知上层 用户登出
                     protobuf.responseDecode<Proto.LogoutRsp>(FunCode[funCode], content).then(({ RetCode, RetDesc }) => {
-                        eventBus.$emit('LogoutNotify', (RetDesc || RetCode)?.toString());
+                        const msg = sessionData.getErrorInfoByCode(RetCode)
+                        const error = (RetDesc || RetCode).toString();
+                        eventBus.$emit('LogoutNotify', msg ?? error);
                     })
                     break;
                 }

+ 3 - 2
src/services/socket/trade/index.ts

@@ -94,8 +94,9 @@ export async function tradeServerRequest<Req, Rsp>(reqKey: keyof typeof FunCode,
                 return Promise.reject(res.RetDesc);
             }
             default: {
-                const msg = (RetDesc || RetCode).toString();
-                return Promise.reject(msg);
+                const msg = sessionData.getErrorInfoByCode(RetCode)
+                const error = (RetDesc || RetCode).toString();
+                return Promise.reject(msg ?? error);
             }
         }
     }).catch((err) => {

+ 1 - 1
src/stores/modules/common.ts

@@ -40,7 +40,7 @@ export default new (class {
      * @returns 
      */
     getLoginDataInfo = <K extends keyof Ermcp.LoginQueryRsp>(key: K) => {
-        return this.loginData.value[key]
+        return this.loginData.value[key]!
     }
 
     /**

+ 29 - 2
src/stores/modules/storage.ts

@@ -1,4 +1,4 @@
-import { queryAllEnums, queryNewFuncmenu, queryTableDefine } from '@/services/api/common'
+import { queryAllEnums, queryNewFuncmenu, queryTableDefine, queryErrorInfos } from '@/services/api/common'
 import { queryAccountMenu } from '@/services/api/account'
 import { AppTheme } from '@/constants/theme'
 import { Language } from '@/constants/language'
@@ -25,6 +25,7 @@ const initData: Store.GlobalStorage = {
     userMenus: [],
     allEnums: [],
     tableColumns: [],
+    errorInfos: []
 }
 
 /**
@@ -115,12 +116,38 @@ export const sessionData = new (class extends WebStorage<Store.GlobalStorage>{
     }
 
     /**
+     * 获取系统错误信息
+     * @returns 
+     */
+    getErrorInfoList = () => {
+        if (this.getValue('errorInfos').length) {
+            return Promise.resolve()
+        }
+        return queryErrorInfos({
+            success: (res) => {
+                this.setValue('errorInfos', res.data)
+            }
+        })
+    }
+
+    /**
+     * 根据 code 获取错误信息
+     * @param code 
+     * @returns 
+     */
+    getErrorInfoByCode = (code: number) => {
+        const errorInfos = this.getValue('errorInfos')
+        const error = errorInfos.find((e) => e.errorid === code)
+        return error?.description
+    }
+
+    /**
      * 获取用户菜单列表
      */
     getUserMenuList = () => {
         return queryAccountMenu({
             success: (res) => {
-                sessionData.setValue('userMenus', res.data)
+                this.setValue('userMenus', res.data)
             }
         })
         return queryNewFuncmenu({

+ 0 - 57
src/types/ermcp/account.d.ts

@@ -350,62 +350,5 @@ declare global {
             usedmargin: number; // 占用保证金
             userid: number; // 用户ID
         }
-
-        /** 查询充值提现请求 */
-        interface AccountInOutApplyReq {
-            userid: number;  // 用户ID
-            begindate?: string;  //   申请起始日期(格式yyyymmdd)
-            enddate?: string;    //   申请截止日期(格式yyyymmdd)
-            likename?: string;   //   模糊搜索名称
-        }
-
-        /** 查询充值提现返回 */
-        interface AccountOutInApplyRsp {
-            accountcode: string;//资金账号
-            accountname: string;//用户名称(名称)
-            accountpwd: string;//资金密码
-            accountticket: string;//最新账户服务流水号
-            amount: number;//金额
-            applyremark: string;//申请备注
-            applystatus: number;//申请状态 - 1:待审核 2:待复审 3:初审拒绝 4:交易冻结中 5:交易解冻中 6:交易解冻扣款中 7:交易入金中 8:交易冻结/解冻/扣款中(银行发起出金时用) 9:银行出金中 1number;
-            //:银行入金中 11:成功 12:失败 13:银行审核中 14:账户服务入金失败; 15:账户服务解冻失败; 16:账户服务解冻扣款失败; 17:账户服务出金失败 18:复审通过 19:复审拒绝 2number;
-            //:提交审核,账户冻结中 21:审核拒绝,账户解冻中;22: 待审核,账户服务解冻回滚中; 23:待复审,账户服务解冻回滚中; 24: 审核通过,账户冻结金额检查中;25: 复审通过,账户冻结金额检查中;
-            auditid: number;//审核人
-            audittime: string;//审核时间
-            bank_apply_ticket: string;//银行申请流水
-            bankaccountname: string;//银行账户名
-            bankaccountno: string;//银行卡号
-            bankid: string;//银行编号
-            bankticket: string;//银行流水
-            bankname: string; // 银行名称
-            branchbankid: string;//银行支行号
-            branchbankname: string;//银行支行名称
-            capamountout: number;//出金(劣后本金) - 外部子账户
-            certificatephotourl: string;//凭证地址
-            charge: number;//手续费
-            checkerrorflag: number;//对账差错标志 - 1:为单边账;其它为正常出入金
-            currency: string;//币种
-            cusbankid: string;//托管银行编号
-            exchticket: string;//银行服务流水号
-            executetype: number;//申请类型 - 1:出金 2:入金 3: 单边账调整:入金; 4:单边账调整:出金 5:外部母账户调整:入金 6:外部母账户调整:出金 7:外部子账户:入金 8:外部子账户:出金
-            extendinfo: string;//扩展信息
-            extoperateid: number;//交易服务流水号
-            infamount: number;//劣后金额(自有)
-            logincode: string;//登录账号(账号)
-            netaddr: string;//调转网址
-            priamount: number;//优先金额(授信)
-            reauditid: number;//复审人
-            reauditremark: string;//复审备注
-            reaudittime: string;//复审时间
-            relatedorderid: string;//三方关联ID
-            remark: string;//备注
-            remark2: string;//备注(失败原因)
-            soucreamount: number;//原始出入金金额
-            soucrecurrencyid: number;//原始出入金币种
-            tradedate: string;//交易日(yyyyMMdd)
-            updatetime: string;//更新时间(申请时间)
-            userid: number;//用户id
-            userinfotype: number;//账户类型 1-个人 2-企业
-        }
     }
 }

+ 155 - 0
src/types/ermcp/bank.d.ts

@@ -0,0 +1,155 @@
+import { AuthType, UrlType } from '@/constants/menu'
+
+declare global {
+    /** 企业风管 */
+    namespace Ermcp {
+        /** 查询托管银行 响应 */
+        interface CusBankSignBankRsp {
+            Banklst: BankInfoRsp[]; // 银行列表
+            canallot: number; // 是否支持跨行调拨 - 0:不支持 1:支持
+            canallotquery: number; // 是否支持跨行调拨查询 - 0:不支持 1:支持
+            canbindcard: number; // 是否可绑卡与解卡 - 0:不可 1:可以
+            caninamount: number; // 是否可入金 - 0:不可 1:可以
+            caninamount2: number; // 是否可入金(网银端) - 0:不可 1:可以
+            canmodifybankcard: number; // 是否可修改银行卡号 - 0:不可 1:可以
+            canmodifyphone: number; // 是否可修改手机号 - 0:不可 1:可以
+            canmodifysigninfo: number; // 是否可修改签约信息 - 0:不可 1:可以
+            canoutamount: number; // 是否可出金 - 0:不可 1:可以
+            canoutamount2: number; // 是否可出金(网银端) - 0:不可 1:可以
+            canrelease: number; // 是否可解约 - 0:不可 1:可以
+            canrelease2: number; // 是否可解约(网银端) - 0:不可 1:可以
+            cansign: number; // 是否可签约 - 0:不可 1:可以
+            cansign2: number; // 是否可签约(网银端) - 0:不可 1:可以
+            currency: string; // 币种
+            cusbankid: string; // 托管银行编号(对应清算中心TRAN_NO)
+            cusbankname: string; // 银行业务名称
+            cusbankshortname: string; // 银行业务简称
+            exchbankid: string; // 交易所开户银行ID
+            exchpaybankaccname: string; // 交易所支出结算账户户名
+            exchpaybankaccno: string; // 交易所支出结算账户
+            isneedcheck: number; // 是否需要对账 - 0:需要 1:不需要 [不需要界面配置]
+            isneedclear: number; // 是否需要清算 - 0:不需要 1:需要
+            lastcheckstatus: number; // 最后对账状态 - 对账状态 - 1:未对账 2:对账成功 3:对账失败
+            lastchecktime: string; // 最后对账时间
+            lastclearstatus: number; // 最后清算状态 - 1:未清算 2:清算成功 3:清算失败 4:清算部分成功
+            lastcleartime: string; // 最后清算时间
+            lastsignintime: string; // 最后签到时间
+            lastsignouttime: string; // 最后签退时间
+            riskinfo: string; // 签约风险提示书
+            signstatus: number; // 当前签到/签退状态 - 1:签到 2:签退
+            tradedate: string; // 交易日(yyyyMMdd)
+            updatetime: string; // 当前签到/签退更新时间
+        }
+
+        /** 查询开户行 响应 */
+        interface BankInfoRsp {
+            bankid: string; // 银行ID
+            bankname: string; // 银行名称
+            clearbankno: string; // 清算系统银行编号
+            orderindex: number; // 排序顺序
+            status: number; // 状态 - 0:正常 1:注销
+        }
+
+        /** 查询签约银行信息(提现账户管理) 请求 */
+        interface BankAccountSignReq {
+            userid: number;  // 用户ID
+        }
+
+        /** 查询签约银行信息(提现账户管理) 响应 */
+        interface BankAccountSignRsp {
+            accountcode: string;//资金账号
+            accountname: string;//资金账号对应的账号名(UserName)
+            accountname2: string;//资金账号对应的账号名(UserName) - 密文
+            accounttype: number;//账户类型(UserType)
+            applicationtime: string;//最后一次更新的时间
+            applyexchticket: string;//申请流水
+            auditid: number;//审核人
+            audittime: string;//审核时间
+            bankaccountname: string;//签约银行卡账号名
+            bankaccountname2: string;//签约银行卡账号名 - 密文
+            bankaccountno: string;//银行卡号
+            bankaccountno2: string;//银行卡号 - 密文
+            bankaccounttype: number;//银行账户类型 - 1-对私; 2-对公
+            bankcardtype: number;//银行卡类型
+            bankchildaccount: string;//银行子账号(签约成功后,很多银行会返回对应的这个虚拟账号)
+            bankcity: string;//开户行城市
+            bankid: string;//签约银行ID
+            bankname: string;//签约银行名称
+            bankprovince: string;//开户行省份
+            branchbankid: string;//签约银行支行号
+            branchbankname: string;//签约银行支行名称
+            cardno: string;//证件号码
+            cardno2: string;//证件号码 - 密文
+            cardtype: string;//证件类型
+            currency: string;//币种
+            cusbankid: string;//托管银行编号
+            direct: number;//方向(可以判断那方先发起的签约)
+            exchticket: string;//最后一次签约成功的流水号
+            extendinfo: string;//扩展信息(JSON字符串)
+            mobilephone: string;//手机号
+            mobilephone2: string;//手机号 - 密文
+            netaddr: string;//调转网址
+            relateduserid: number;//关联使用者userid
+            signstatus: number;//签约状态 - 1:未签约 2:签约待审核 3:签约中 4:已签约 5:解约待审核 6:解约中 7:已解约 8:已解绑 9:绑卡中 1number;
+            //:审核拒绝 11:换签待审核
+            updatetime: string;//更新时间(签解约更新时间)
+        }
+
+        /** 查询充值提现 请求 */
+        interface AccountInOutApplyReq {
+            userid: number;  // 用户ID
+            begindate?: string;  //   申请起始日期(格式yyyymmdd)
+            enddate?: string;    //   申请截止日期(格式yyyymmdd)
+            likename?: string;   //   模糊搜索名称
+        }
+
+        /** 查询充值提现 响应 */
+        interface AccountOutInApplyRsp {
+            accountcode: string;//资金账号
+            accountname: string;//用户名称(名称)
+            accountpwd: string;//资金密码
+            accountticket: string;//最新账户服务流水号
+            amount: number;//金额
+            applyremark: string;//申请备注
+            applystatus: number;//申请状态 - 1:待审核 2:待复审 3:初审拒绝 4:交易冻结中 5:交易解冻中 6:交易解冻扣款中 7:交易入金中 8:交易冻结/解冻/扣款中(银行发起出金时用) 9:银行出金中 1number;
+            //:银行入金中 11:成功 12:失败 13:银行审核中 14:账户服务入金失败; 15:账户服务解冻失败; 16:账户服务解冻扣款失败; 17:账户服务出金失败 18:复审通过 19:复审拒绝 2number;
+            //:提交审核,账户冻结中 21:审核拒绝,账户解冻中;22: 待审核,账户服务解冻回滚中; 23:待复审,账户服务解冻回滚中; 24: 审核通过,账户冻结金额检查中;25: 复审通过,账户冻结金额检查中;
+            auditid: number;//审核人
+            audittime: string;//审核时间
+            bank_apply_ticket: string;//银行申请流水
+            bankaccountname: string;//银行账户名
+            bankaccountno: string;//银行卡号
+            bankid: string;//银行编号
+            bankticket: string;//银行流水
+            bankname: string; // 银行名称
+            branchbankid: string;//银行支行号
+            branchbankname: string;//银行支行名称
+            capamountout: number;//出金(劣后本金) - 外部子账户
+            certificatephotourl: string;//凭证地址
+            charge: number;//手续费
+            checkerrorflag: number;//对账差错标志 - 1:为单边账;其它为正常出入金
+            currency: string;//币种
+            cusbankid: string;//托管银行编号
+            exchticket: string;//银行服务流水号
+            executetype: number;//申请类型 - 1:出金 2:入金 3: 单边账调整:入金; 4:单边账调整:出金 5:外部母账户调整:入金 6:外部母账户调整:出金 7:外部子账户:入金 8:外部子账户:出金
+            extendinfo: string;//扩展信息
+            extoperateid: number;//交易服务流水号
+            infamount: number;//劣后金额(自有)
+            logincode: string;//登录账号(账号)
+            netaddr: string;//调转网址
+            priamount: number;//优先金额(授信)
+            reauditid: number;//复审人
+            reauditremark: string;//复审备注
+            reaudittime: string;//复审时间
+            relatedorderid: string;//三方关联ID
+            remark: string;//备注
+            remark2: string;//备注(失败原因)
+            soucreamount: number;//原始出入金金额
+            soucrecurrencyid: number;//原始出入金币种
+            tradedate: string;//交易日(yyyyMMdd)
+            updatetime: string;//更新时间(申请时间)
+            userid: number;//用户id
+            userinfotype: number;//账户类型 1-个人 2-企业
+        }
+    }
+}

+ 15 - 0
src/types/ermcp/common.d.ts

@@ -53,4 +53,19 @@ declare namespace Ermcp {
         loginID: number; // 登录账号
         noticeID: number; // 通知公告ID
     }
+
+    /** 获取数据库错误信息 请求 */
+    interface ErrorInfosReq {
+        rowNumber?: string; // 起始行号前索引
+    }
+
+    /** 获取数据库错误信息 响应 */
+    interface ErrorInfosRsp {
+        description: string; // 异常描述
+        errorcode: string; // 异常代码
+        errorid: number; // 异常ID
+        modulecode: string; // 所属模块
+        operatecode: string; // 所属操作
+        rownumber: string; // 行号
+    }
 }

+ 47 - 0
src/types/ermcp/favorite.d.ts

@@ -0,0 +1,47 @@
+/** 企业风管 */
+declare namespace Ermcp {
+    /** 查询我的收藏 请求 */
+    interface MyFavoriteReq {
+        userid: number; // 用户ID
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+        zscategorys?: string; // 钻石分类, 格式:1,2,3
+    }
+
+    /** 查询我的收藏 响应 */
+    interface MyFavoriteRsp {
+        buyorsell: number; // 买卖 - 0:买 1:卖
+        favoritestatus: number; // 收藏状态 - 1:正常 2:失效
+        marketid: number; // 市场ID
+        price: number; // 价格
+        priceper: string; // 克拉单价
+        sizedisplay: string; // 尺寸
+        userid: number; // 用户ID
+        warehousenamedisplay: string;
+        wrfactortypeid: string; // 仓单要素类型ID/商品ID(77)
+        wrstandardid: number; // 现货商品ID(自增 SEQ_GOODS 确保不重复)
+        wrtradeorderid: string; // 仓单贸易委托单ID(320+Unix秒时间戳(10位)+xxxxxx)
+        zscategorydisplay: string;
+        zscerttypedisplay: string;
+        zsclaritytype1display: string;
+        zsclaritytype2display: string;
+        zscolortype1display: string;
+        zscolortype2display: string;
+        zscrystaltypedisplay: string;
+        zscurrencytypedisplay: string;
+        zscurrencytypedisplayunit: string;
+        zscuttype1display: string;
+        zscuttype2display: string;
+        zsczcolor1typedisplay: string;
+        zsczcolor2typedisplay: string;
+        zsczcolor3typedisplay: string;
+        zsfluorescencetype1display: string;
+        zsfluorescencetype2display: string;
+        zspolishtype1display: string;
+        zspolishtype2display: string;
+        zsshapetypedisplay: string;
+        zsstyletypedisplay: string;
+        zssymmetrytype1display: string;
+        zssymmetrytype2display: string;
+    }
+}

+ 10 - 5
src/types/ermcp/goods.d.ts

@@ -16,20 +16,22 @@ declare namespace Ermcp {
         zsallproperties?: string; // 商品(查询字段-模糊查询)
         zscategorys?: string; // 钻石分类, 格式:1,2,3
         warehouseid?: number; // 仓库ID
+        marketflag?: number; // 是否上架,0-全部 1-是 2-否
     }
 
     /** 查询我的库存响应 */
     interface MyWRPositionRsp {
         cerno: string; // 证书编号 - 类型:2,4,5
         cpcertno: string; // 金伯利证书编号 - 类型:3
-        ffreezeqty: number; // 冻结数量
-        ftotalqty: number; // 库存数量
+        ffreezeqty: number; // 冻结数量:WRPosition表:FREEZEQTY/100 , 保留两位小数
+        ftotalqty: number; // 库存数量:WRPosition表:TOTALQTY /100 , 保留两位小数
         goodsno: string; // 商品编号
         imagepath: string; // 商品照片(相对地址)
         isvalid: number; // 是否有效 - 0:无效 1:有效
         kppath: string; // 金伯利证书图片(相对地址) - 类型:3
         kpweight: string; // 金伯利证书重量 - 类型:3
         ladingbillid: string; // 提单ID(208+Unix秒时间戳(10位)+xxxxxx)
+        marketflag: number; // 是否上架,0-全部 1-是 2-否
         marketprice: string; // 市场价
         origin: string; // 原产地 - 类型:3
         price: number; // 总价(价格) - 类型:1,2,3,4,5
@@ -46,10 +48,11 @@ declare namespace Ermcp {
         userid: number; // 用户ID
         warehouseid: number; // 仓库ID
         warehousenamedisplay: string;
-        weight: number;  //总重量(克拉重量) - 类型:1,2,3,4,5
+        weight: number; // 总重量(克拉重量) - 类型:1,2,3,4,5
         weightavg: number; // 平均单颗重量 - 类型:1,3
         wrpath: string; // 仓单扫描件(相对地址)
         wrstandardid: number; // 现货商品ID
+        wrtradeorderid: string; // 仓单贸易委托单ID(320+Unix秒时间戳(10位)+xxxxxx)
         wruserid: number; // 登录用户ID
         zscategory: number; // 钻石分类 - 枚举”ZSCategory“
         zscategorydisplay: string;
@@ -86,14 +89,14 @@ declare namespace Ermcp {
         zspolishtype1display: string;
         zspolishtype2: number; // 抛光度2 - 枚举”ZSPolishType“ - 类型:1
         zspolishtype2display: string;
-        zsshapetype: string; // 形状 - 枚举”ZSShapeType“ - 类型:1,2,4,5 ;(1为多个,逗号分隔)
+        zsshapetype: number; // 形状 - 枚举”ZSShapeType“ - 类型:1,2,4,5 ;(1为多个,逗号分隔)
         zsshapetypedisplay: string;
         zsstyletype: number; // 款式 - 类型:4
         zsstyletypedisplay: string;
         zssymmetrytype1: number; // 对称度1 - 枚举”ZSSymmetryType“ - 类型:1,2,4,5
         zssymmetrytype1display: string;
         zssymmetrytype2: number; // 对称度2 - 枚举”ZSSymmetryType“ - 类型:1
-        zssymmetrytype2display: string;
+        zssymmetrytype2display: number;
     }
 
     /** 获取钻石详情请求 */
@@ -115,6 +118,7 @@ declare namespace Ermcp {
         origin: string; // 原产地 - 类型:3
         price: number; // 总价(价格) - 类型:1,2,3,4,5
         priceper: string; // 克拉单价 - 类型:1,2,3,5
+        remainqty: number; // 剩余重量
         remark: string; // 备注
         sellusername: string; // 账户名称(机构名称)
         settingmaterial: string; // 镶嵌材料 - 类型:4
@@ -129,6 +133,7 @@ declare namespace Ermcp {
         weightavg: number; // 平均单颗重量 - 类型:1,3
         wrpath: string; // 仓单扫描件(相对地址)
         wrstandardid: number; // 现货商品ID
+        wrtradeorderid: string; // 仓单贸易委托单ID(320+Unix秒时间戳(10位)+xxxxxx)
         zscategory: number; // 钻石分类 - 枚举”ZSCategory“
         zscategorydisplay: string;
         zscerttype: number; // 证书类型 - 枚举”ZSCertType“ - 类型:2,4,5

+ 69 - 4
src/types/ermcp/order.d.ts

@@ -419,6 +419,7 @@ declare namespace Ermcp {
         page?: number; // 页码
         pagesize?: number; // 每页条数
         applystatus?: number; // 申请状态(不传查全部) - 1:待确认 2:已确认 3:已拒绝 4:已撤销 5:系统撤销 6:处理失败 7:确认中
+        type?: number; // 查询类型 - 0:我的询价 1:我订单的询价
     }
 
     /** 查询我的询价-求购 响应 */
@@ -440,6 +441,7 @@ declare namespace Ermcp {
         matchaccountid: number; // 挂牌方资金账号
         matchuserid: number; // 挂牌方用户ID
         price: number; // 价格
+        priceper: string; // 克拉单价
         qty: number; // 申请数量
         refprice: string; // 参考价格
         retcode: number; // 委托返回代码
@@ -480,6 +482,7 @@ declare namespace Ermcp {
         page?: number; // 页码
         pagesize?: number; // 每页条数
         applystatus?: number; // 申请状态(不传查全部) - 1:待确认 2:已确认 3:已拒绝 4:已撤销 5:系统撤销 6:处理失败 7:确认中
+        type?: number; // 查询类型 - 0:我的询价 1:我订单的询价
     }
 
     /** 查询我的询价-出售 响应 */
@@ -493,19 +496,19 @@ declare namespace Ermcp {
         audittime: string; // 确认时间
         buyuserid: number; // 买方用户ID
         buyusername: string;
-        buywrtradeorderid: number; // 买委托单ID
+        buywrtradeorderid: string; // 买委托单ID
         goodsno: string; // – view_GZ_WRStandard_Ex_Query –
-        ladingbillid: number; // 卖方提单ID
+        ladingbillid: string; // 卖方提单ID
         marketid: number; // 市场ID
         price: number; // 价格
         sellaccountid: number; // 卖方账户ID
-        selldelistingapplyid: number; // [询价单号]卖摘牌申请ID(916+Unix秒时间戳(10位)+xxxxxx)
+        selldelistingapplyid: string; // [询价单号]卖摘牌申请ID(916+Unix秒时间戳(10位)+xxxxxx)
         selltradeorderid: number; // 卖方委托ID(买方确认成交后更新)
         selluserid: number; // 卖方用户ID
         subnum: number; // 卖方提单子单号
         warehouseinfosdisplay: string;
         weight: number; // 克拉重量
-        wrfactortypeid: number; // 仓单要素类型ID
+        wrfactortypeid: string; // 仓单要素类型ID
         wrstandardid: number; // 现货商品ID
         zsallproperties: string; // – VIEW_GZ_BUYORDERDETAIL_QUERY
         zscategorydisplay: string;
@@ -525,4 +528,66 @@ declare namespace Ermcp {
         zssymmetrytypedisplay: string;
         zstabledisplay: string;
     }
+
+    /** 查询我的履约 请求 */
+    interface MyPerformancReq {
+        userid: number; // 用户ID
+        page?: number; // 页码
+        pagesize?: number; // 每页条数
+        zsallproperties?: string; // 商品(查询字段-模糊查询)
+        buyorsell?: number; // 方向,0-买 1-卖
+        ishis?: boolean; // 是否历史查询
+        begindate?: string; // 开始交易日(yyyymmdd)
+        enddate?: string; // 结束交易日(yyyymmdd)
+    }
+
+    /** 查询我的履约 响应 */
+    interface MyPerformancRsp {
+        accountname: string; // useraccount
+        amount: number; // 履约金额
+        buyerfreezeamount: number; // 买方履约前冻结资金
+        buyerfreezeamountremain: number; // 买方履约前冻结资金剩余
+        buyerinfo: string; // 买方联系信息 - 存JSON字符串, 根据枚举‘BuyerContactInfo’,显示\隐藏字段,若数据不为JSON,则直接显示{ "ContactInfo": "xxxxxxxx", "ReceiveInfo": "xxxxxxxxx", "ReceiptInfo": "xxxxxxxxxxxx"}
+        buyorsell: number; // 方向 - 0:买 1:卖
+        buypaidamount: number; // 买方已冻/已扣金额
+        curstepid: string; // 当前步骤ID
+        goodsno: string; // 商品编号
+        overshortamount: number; // 溢短金额
+        paymenttype: number; // 买方支付方式 - 1:冻结 2:扣款
+        performanceplanid: string; // PerformancePlan
+        performancestatus: number; // 履约状态 - 1:待激活 2:正常 3:处理错误 4:违约待处理 5:违约处理中 6:完成 7.违约已完成 8:释放冻结失败 9:超时待处理 10:超时关闭
+        price: number; // 价格
+        priceper: string; // 克拉单价
+        relatedorderid: string; // 关联单号(履约类型的关联单号)
+        remaindays: number; // 剩余天数
+        sellerfreezeamount: number; // 卖方履约前冻结资金
+        sellerfreezeamountremain: number; // 卖方履约前冻结资金剩余
+        sellerinfo: string; // 卖方联系信息 - 存JSON字符串, 根据枚举‘SellerContactInfo’,显示\隐藏字段,若数据不为JSON,则直接显示{ "ContactInfo": "xxxxxxxx"}
+        sellreceivedamount: number; // 卖方已收金额
+        sizedisplay: string; // 尺寸
+        steptypeid: number; // PerformanceStep
+        warehousenamedisplay: string;
+        zscategorydisplay: string;
+        zscerttypedisplay: string;
+        zsclaritytype1display: string;
+        zsclaritytype2display: string;
+        zscolortype1display: string;
+        zscolortype2display: string;
+        zscrystaltypedisplay: string;
+        zscurrencytypedisplay: string;
+        zscurrencytypedisplayunit: string;
+        zscuttype1display: string;
+        zscuttype2display: string;
+        zsczcolor1typedisplay: string;
+        zsczcolor2typedisplay: string;
+        zsczcolor3typedisplay: string;
+        zsfluorescencetype1display: string;
+        zsfluorescencetype2display: string;
+        zspolishtype1display: string;
+        zspolishtype2display: string;
+        zsshapetypedisplay: string;
+        zsstyletypedisplay: string;
+        zssymmetrytype1display: string;
+        zssymmetrytype2display: string;
+    }
 }

+ 16 - 0
src/types/proto/account.d.ts

@@ -72,5 +72,21 @@ declare global {
             RetCode: number; // 返回码
             RetDesc?: string; // 描述信息
         }
+
+        // 修改账户密码请求
+        interface ModifyPwdReq {
+            Header?: IMessageHead; // 消息头
+            ModifyPwdType: number; // 修改密码类型1:登陆密码2:资金账户密码
+            ModifyPwdID: number; // 被修改的ID(ModifyType=1:LoginIDModifyType=2:AccountID)
+            OldPwd: string; // 旧资金密码
+            NewPwd: string; // 新资金密码
+        }
+
+        // 修改账户密码应答
+        interface ModifyPwdRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+        }
     }
 }

+ 179 - 0
src/types/proto/bank.d.ts

@@ -0,0 +1,179 @@
+import { IMessageHead } from '@/services/socket/trade/protobuf/proto'
+import Long from 'long'
+
+declare global {
+    namespace Proto {
+        /** 签约请求 */
+        interface t2bBankSignReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            ExchTicket: string; // 交易所流水号
+            AccountCode: string; // 账户
+            AccountName: string; // 客户名称
+            CusBankID: string; // 托管银行编号
+            OperateType: number; // 变更类型[1-增加;2-修改;4-绑卡;
+            IsForce: number; // 是否强制[0-否;1-是]强制,只更新中心签约信息,不发送银行。用于银行信息不一致的情况
+            Currency: string; // 币种
+            AccountType: number; // 账户类型[1-对私;2-对公]
+            OpenBankAccId: string; // 银行卡行号
+            ForceSignBankAccountNo: string; // 银行账户[强制签约时填写]
+            ForceSignBankAccountName: string; // 银行账户名称[强制签约时填写]
+            BankAccountNo: string; // 银行账户
+            BankAccountName: string; // 银行账户名称
+            ExBankName: string; // 开户行名称
+            OpenBankNo: string; // 开户支行编号
+            OpenBankName: string; // 开户支行名称
+            CertType: string; // 证件类型
+            CertID: string; // 证件号码
+            BankAccountPWD: string; // 银行账户密码
+            AgentName: string; // 授权代理人姓名
+            AgentCertType: number; // 授权代理人证件类型
+            AgentCertID: string; // 授权代理人证件号
+            BankAccountType: number; // 银行账户类型
+            BankProvince: string; // 开户银行所在省份
+            BankCity: string; // 开户银行所在市
+            BankCardType: number; // 银行卡类型
+            MobilePhone: string; // 移动电话
+            IdentifyCode: string; // 验证码
+            email: string; // 电子邮箱
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+        }
+
+        /** 签约应答 */
+        interface t2bBankSignRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            AccountCode: string; // 账户
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 返回码
+            CenterErrMsg: string; // 返回结果说明
+            bankChildAcc: string; // 银行账号
+            bankChildAccName: string; // 银行账户名
+            BankId: string; // 银行卡行号
+            BankAccNum: string; // 银行卡号
+            BankAccName: string; // 银行卡户名
+        }
+
+        /** 解约请求 */
+        interface t2bBankCancelSignReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId: string; // 交易所编号
+            AccountCode: string; // 账户
+            CusBankID: string; // 托管银行编号
+            IsForce: number; // 是否强制
+            Currency: string; // 币种
+            TradeDate: string; // 交易所业务日期
+            ExchTicket: string; // 交易所流水号
+            BankChildAcc: string; // 银行子账号
+            BankChildAccName: string; // 银行子账号名
+        }
+
+        /** 解约应答 */
+        interface t2bBankCancelSignRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            AccountCode: string; // 账户
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易所业务日期
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 返回码
+            CenterErrMsg: string; // 返回结果说明
+        }
+
+        /** 出金请求 */
+        interface t2bBankWithdrawReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            ExchId: string; // 交易所编号
+            AccountCode: string; // 资金账户
+            CusBankID: string; // 托管银行编号
+            Currency: string; // 币种
+            AccountType: number; // 账户类型
+            BankChildAccount: string; // 银行子账号
+            BankChildAccountName: string; // 银行子账号名
+            OpenCardBankId: string; // 银行卡行号
+            BankAccoutNum: string; // 银行卡号
+            BankAccoutName: string; // 银行卡户名
+            Amount: number; // 出金金额
+            AppDateTime: string; // 申请日期和时间
+            OldTaPWD: string; // 资金密码
+            Desc: string; // 备注
+            IdentifyCode: string; // 验证码
+            BranchBankName: string; // 收款支行名称
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+            Remark: string; // 备注
+            ExchTicket: string; // 交易所流水号
+        }
+
+        /** 出金应答 */
+        interface t2bBankWithdrawRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 中心返回码
+            CenterErrMsg: string; // 中心返回结果说明
+            CerterCheckDate: string; // 中心对账日期
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+        }
+
+        /** 入金请求 */
+        interface t2bBankDepositReq {
+            Header?: IMessageHead;
+            ExtOperatorID: number; // 外部操作流水号
+            CusBankID: string; // 托管银行编号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            ExchTicket: string; // 交易所流水号
+            AccountCode: string; // 资金账户
+            BusinessNo: string; // 银行业务编号
+            BankChildAccount: string; // 银行子账号
+            BankChildAccountName: string; // 银行子账号名
+            OldTaPWD: string; // 资金密码
+            Amount: number; // 金额
+            Currency: string; // 币种
+            Remark: string; // 备注
+            OpenCardBankId: string; // 银行卡行号
+            BankAccoutNum: string; // 银行卡号
+            BankAccoutName: string; // 银行卡户名
+            extend_info: string; // 扩展信息(JSON串,参考配置要求进行填充)
+        }
+
+        /** 入金应答 */
+        interface t2bBankDepositRsp {
+            Header?: IMessageHead;
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            ExtOperatorID: number; // 外部操作流水号
+            Status: number; // 状态(0成功,其他数值参考银行服务的错误码)
+            ExchTicket: string; // 交易所流水号
+            ExchId: string; // 交易所编号
+            TradeDate: string; // 交易日
+            CenterTicket: string; // 中心流水号
+            CenterErrCode: string; // 中心返回码
+            CenterErrMsg: string; // 中心返回结果说明
+            CerterCheckDate: string; // 中心对账日期
+            NetAddr: string; // 网络地址(当这里有网址时,应自动跳转网页)
+        }
+    }
+}

+ 47 - 0
src/types/proto/goods.d.ts

@@ -95,5 +95,52 @@ declare global {
             WRTradeOrderID: number; // 委托单ID
             ClientSerialNo: string; // 客户端流水号
         }
+
+        // 仓单服务公共协议结构
+        interface WRCommon {
+            UserID: number; // 用户ID
+            RelatedOrderID: number; // 关联ID
+            BusinessID?: number; // 业务ID
+            TradeID: number; // 成交ID
+            AccountID: number; // 账号ID
+        }
+
+        // 钻石出库申请接口请求
+        interface ReceiptZSOutApplyReq {
+            Header?: IMessageHead; // 消息头
+            Common?: WRCommon; // 
+            UserID: number; // 用户ID,必填
+            AccountID: number; // 用户帐户ID
+            WRStandardID?: number; // 现货品种ID
+            WarehouseID?: number; // 仓库ID
+            Mobile?: string; // 申请人手机号
+            AppointmentDate?: string; // 预约日期
+            AppointmentModel?: number; // 预约方式:1-物流3-自提
+            CountryID?: number; // 国家
+            ProvinceID?: number; // 省
+            DistrictID?: number; // 区
+            CityID?: number; // 市
+            Address?: string; // 详细地址
+            ContactName?: string; // 收货人提货人
+            ContactNum?: string; // 收货人提货人手机
+            AppointmentRemark?: string; // 预约备注
+            LadingBillID: Long; // 提单ID,必填
+            SubNum: number; // 提单子单号,必填
+            Qty: number; // 出库数量,两位小数,必填
+            Remark?: string; // 备注
+            ApplyType: number; // 申请类型1:会员申请2:平台申请
+            ClientType: number; // 终端类型
+            ClientTicket: string; // 客户端流水号
+        }
+
+        // 钻石出库申请接口响应
+        interface ReceiptZSOutApplyRsp {
+            Header?: IMessageHead; // 消息头
+            RetCode: number; // 返回码
+            RetDesc: string; // 描述信息
+            Common: WRCommon; // 
+            ApplyID: number; // 申请ID
+            ClientTicket: string; // 客户端流水号
+        }
     }
 }

+ 1 - 1
src/types/proto/order.d.ts

@@ -204,7 +204,7 @@ declare global {
             Header?: IMessageHead; // 消息头
             UserID: number; // 用户ID,必填
             AccountID: number; // 资金账号
-            SellDelistingApplyID: number; // 卖摘牌申请ID,必填
+            SellDelistingApplyID: Long; // 卖摘牌申请ID,必填
             AuditRemark?: string; // 备注
             OperateType: number; // 操作类型,1:撤销2:拒绝
             MarketID: number; // 市场ID,必填

+ 1 - 0
src/types/store/globalStorage.d.ts

@@ -11,6 +11,7 @@ declare global {
             userMenus: Ermcp.UserMenu[];
             allEnums: Ermcp.EnumRsp[]; // 所有枚举
             tableColumns: Ermcp.TableDefineRsp[];
+            errorInfos: Ermcp.ErrorInfosRsp[];
         }
     }
 }

+ 1 - 1
src/utils/storage/index.ts

@@ -74,7 +74,7 @@ export default class <T extends object> {
         if (value === undefined || value === null) {
             this.clear(key)
         } else {
-            const strValue = JSON.stringify(value)
+            const strValue = JSON.stringify(value) // 注意数值长度过长会被自动转换为 String 类型
             this.storage.setItem(key.toString(), strValue)
             this.state[key] = value
         }

+ 31 - 0
src/utils/websocket/crypto.ts

@@ -6,6 +6,8 @@ const aeskey: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse('F7A72DE7D6264530
 const macKeyLeft: CryptoJS.lib.WordArray = CryptoJS.enc.Hex.parse('B0FB83E39A5EBFAA'); // 这里要用CryptoJS.enc.Hex.parse,CryptoJS.enc.Utf8.parse返回是16位的
 /** MAC检验码右8字节 */
 const macKeyRight: CryptoJS.lib.WordArray = CryptoJS.enc.Hex.parse('BE471362A58393FF');
+/** Phone AES密钥 */
+const phoneaeskey = '0d299ce2d4105282f7471074cb0f9f9d';
 /** MAC检验向量 */
 const iv = new Uint8Array([0xd9, 0x51, 0xdb, 0xe0, 0x37, 0xc8, 0x23, 0x25]);
 
@@ -150,3 +152,32 @@ export const decrypt50 = (encryptData: Uint8Array, size: number): Uint8Array | n
 
     return a.subarray(0, size);
 };
+
+/**
+ * AES数据解密方法
+ * @param encryptData 密文
+ * @param size 明文长度
+ */
+export const decryptAES = (value: string): string | undefined => {
+    const ciphertext = hexStringToUint8Array(value);
+    const key = hexStringToUint8Array(phoneaeskey);
+
+    const cipherParams = CryptoJS.lib.CipherParams.create({
+        ciphertext: uint8ArrayToWordArray(ciphertext),
+    });
+
+    const decrytped = CryptoJS.AES.decrypt(cipherParams, uint8ArrayToWordArray(key), aesOption);
+    const h = wordArrayToUint8Array(decrytped).subarray(0, decrytped.sigBytes);
+    const result = new TextDecoder().decode(h);
+    return result;
+}
+
+/**
+ * 十六进制字符串转Uint8Array
+ * @param hex 
+ * @returns 
+ */
+function hexStringToUint8Array(hex: string) {
+    const buffer = hex.match(/.{1,2}/g)?.map((byte) => parseInt(byte, 16));
+    return new Uint8Array(buffer ?? []);
+}

+ 1 - 1
vue.config.js

@@ -15,7 +15,7 @@ module.exports = defineConfig({
       filename: 'index.html',
       title: process.env.VUE_APP_TITLE,
       meta: {
-        revised: moment(new Date()).format('v3.0.YYYYMMDDHHmmss')  // 打包生成版本号
+        revised: moment(new Date()).format('YYYYMMDDHHmmss')  // 打包生成版本号
       }
     }
   },