Jelajahi Sumber

Merge branch 'master' of http://47.101.159.18:3000/Muchinfo/MTP20_WEB_GLOBAL

li.shaoyi 2 tahun lalu
induk
melakukan
ae9e2a3442

+ 1 - 1
public/config/appconfig.json

@@ -1,6 +1,6 @@
 {
   "version": "1.0.0",
   "versionCode": "100000",
-  "apiUrl": "http://192.168.31.204:8080/cfg?key=test_204",
+  "apiUrl": "http://192.168.31.202:8080/cfg?key=test_202",
   "appName": "多元世纪"
 }

+ 29 - 1
src/business/user/account.ts

@@ -1,6 +1,6 @@
 import { shallowRef, reactive } from 'vue'
 import { useLoginStore, useAccountStore } from '@/stores'
-import { investorDel, modifyPassword, requestAddAuth, requestAddUser, requestCreateContractAndAddSigner, requestSignCompleted, requestWillFace } from '@/services/api/account'
+import { investorDel, modifyPassword, requestAddAuth, requestCheckCardNum, requestAddUser, requestCreateContractAndAddSigner, requestSignCompleted, requestWillFace } from '@/services/api/account'
 import cryptojs from 'crypto-js'
 
 const loginStore = useLoginStore()
@@ -195,4 +195,32 @@ export function useRequestWillFace() {
         willFaceFormData,
         willFace
     }
+}
+
+// 证件号重复校验
+export function useCheckCardNum() {
+    const loading = shallowRef(false)
+
+    const checkCardNumFormData = reactive<Model.CheckCardNumReq>({
+        userid: loginStore.userId
+    })
+
+    const checkCardNum = async () => {
+        try {
+            loading.value = true
+            return await requestCheckCardNum({
+                data: {
+                    ...checkCardNumFormData
+                }
+            })
+        } finally {
+            loading.value = false
+        }
+    }
+
+    return {
+        loading,
+        checkCardNumFormData,
+        checkCardNum,
+    }
 }

+ 2 - 2
src/packages/gstj/views/goods/detail/components/listing/Index.vue

@@ -136,10 +136,10 @@ const onRadioChange = (value: number) => {
 // 提交挂牌
 const onSubmit = () => {
     dialog({
-        message: '确认要提交吗?',
+        title: '确认要提交吗?',
+        message: '*若存在价格匹配的反方向委托订单,系统将会自动撤销',
         showCancelButton: true,
     }).then(() => {
-
         const { marketid = 0, goodsid = 0 } = quote.value ?? {}
         /// 获取对应的市场ID
         formData.MarketID = marketid

+ 2 - 2
src/packages/gstj/views/goods/trade/components/delisting/index.vue

@@ -127,12 +127,12 @@ const onRadioChange = (value: number) => {
 // 提交摘牌
 const onSubmit = () => {
     dialog({
-        message: '确认要提交吗?',
+        title: '确认要提交吗?',
+        message: '*若存在价格匹配的反方向委托订单,系统将会自动撤销',
         showCancelButton: true,
     }).then(() => {
         const { goodsid, orderid, orderprice, buyorsell } = props.selectedRow
         const { marketid = 0 } = quote.value ?? {}
-
         /// 获取对应的市场ID
         formData.MarketID = marketid
         formData.PriceMode = EPriceMode.PRICEMODE_LIMIT

+ 0 - 1
src/packages/mobile/views/goods/detail/components/listing/Index.vue

@@ -140,7 +140,6 @@ const onSubmit = () => {
         message: '*若存在价格匹配的反方向委托订单,系统将会自动撤销',
         showCancelButton: true,
     }).then(() => {
-
         const { marketid = 0, goodsid = 0 } = quote.value ?? {}
         /// 获取对应的市场ID
         formData.MarketID = marketid

+ 0 - 1
src/packages/mobile/views/goods/trade/components/delisting/index.vue

@@ -133,7 +133,6 @@ const onSubmit = () => {
     }).then(() => {
         const { goodsid, orderid, orderprice, buyorsell } = props.selectedRow
         const { marketid = 0 } = quote.value ?? {}
-
         /// 获取对应的市场ID
         formData.MarketID = marketid
         formData.PriceMode = EPriceMode.PRICEMODE_LIMIT

+ 72 - 0
src/packages/pc/components/layouts/header/components/avater/index.vue

@@ -0,0 +1,72 @@
+<!-- 系统公告 -->
+<template>
+    <app-drawer title="头像" :width="600" v-model:show="show" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--vertical" label-width="100px" :model="formData" :rules="formRules">
+            <el-form-item prop="cardbackphotourl" label="用户头像">
+                <app-upload :file-types="['image']" type-message="请选择正确的图片类型" @change="f_afterRead"
+                    :rules="formRules.cardbackphotourl" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">取消</el-button>
+            <el-button type="danger" @click="onSubmit">修改</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref, reactive } from 'vue'
+import type { FormInstance, FormRules } from 'element-plus'
+import { ElMessage } from 'element-plus'
+import { updateUserHeadUrl } from '@/services/api/user'
+import { useLoginStore, useUserStore } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppUpload from '@pc/components/base/upload/index.vue'
+
+const show = ref(true)
+const refresh = ref(false)
+const formRef = ref<FormInstance>()
+const loginStore = useLoginStore()
+const userStore = useUserStore()
+
+const formData = reactive<Model.UserHeadUrlReq>({
+    userid: loginStore.userId, // 用户ID
+    headurl: '', // 头像地址
+})
+
+const formRules: FormRules = {
+    headurl: [{
+        message: '请上传头像',
+        validator: () => {
+            return !!formData.headurl
+        }
+    }],
+}
+
+const f_afterRead = ({ filePath }: { filePath: string }) => {
+    formData.headurl = filePath
+    formRef.value?.validateField('headurl')
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            updateUserHeadUrl({
+                data: formData
+            }).then(() => {
+                userStore.getUserData()
+                ElMessage.success('提交成功')
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error('提交失败:' + err)
+            })
+        }
+    })
+}
+
+</script>

+ 47 - 0
src/packages/pc/components/layouts/header/components/cancel/index.vue

@@ -0,0 +1,47 @@
+<!-- 系统公告 -->
+<template>
+    <app-drawer title="注销服务" :width="600" v-model:show="show" :loading="loading" :refresh="refresh">
+        <h4>账户注销后不能再使用该系统,如果账户有余额需要人工审核才能注销,确定要注销账户吗?</h4>
+        <section class="logoff__details">
+            <h4>为保证您的账号安全,在提交注销申请时,需同时满足以下条件:</h4>
+            <dl>
+                <dt>1. 账号财产已结清。</dt>
+                <dd>没有资产、欠款、未结清的资金和现货。</dd>
+                <dt>2. 账号处于安全状态。</dt>
+                <dd>账号处于正常使用状态,无被盗风险。</dd>
+                <dt>3. 账号无任何纠纷。</dt>
+            </dl>
+        </section>
+        <template #footer>
+            <el-button type="info" @click="onCancel(false)">取消</el-button>
+            <el-button type="danger" @click="onSubmit">确认注销</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useAccountCancellation } from '@/business/user'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const { formSubmit, loading } = useAccountCancellation()
+
+const show = ref(true)
+const refresh = ref(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    formSubmit().then(() => {
+        ElMessage.success('提交成功,请等待审核。').then.then(() => {
+            close(true)
+        })
+    }).catch((err) => {
+        ElMessage.error('提交失败:' + err)
+    })
+}
+</script>

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

@@ -1,7 +1,7 @@
 <!-- 系统公告 -->
 <template>
-    <app-drawer class="app-notice" title="修改登录密码" :width="400" v-model:show="show" :loading="loading" :refresh="refresh">
-        <el-form ref="formRef" label-width="100px" :model="formData" :rules="formRules">
+    <app-drawer title="修改登录密码" :width="400" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" class="el-form--vertical" label-width="100px" :model="formData" :rules="formRules">
             <el-form-item label="原密码" prop="OldPwd">
                 <el-input placeholder="请输入原密码" show-password v-model="formData.OldPwd" />
             </el-form-item>
@@ -51,7 +51,7 @@ const formRules: FormRules = {
         {
             required: true,
             validator: (rule, value, callback) => {
-                if (value === formData.NewPwd) {
+                if (Confirmpassword.value === formData.NewPwd) {
                     callback()
                 } else {
                     callback(new Error('密码输入不一致!'))

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

@@ -21,8 +21,12 @@
                 </span>
                 <template #dropdown>
                     <el-dropdown-menu>
+                        <el-dropdown-item :icon="Avatar"
+                            @click="openComponent('avater')">修改头像</el-dropdown-item>
                         <el-dropdown-item :icon="Unlock"
                             @click="openComponent('modify')">修改密码</el-dropdown-item>
+                        <el-dropdown-item :icon="Delete"
+                            @click="openComponent('cancel')">注销账户</el-dropdown-item>
                         <el-dropdown-item :icon="SwitchButton"
                             @click="eventBus.$emit('LogoutNotify')">退出登录</el-dropdown-item>
                     </el-dropdown-menu>
@@ -35,7 +39,7 @@
 
 <script lang="ts" setup>
 import { ref, onMounted, computed, defineAsyncComponent } from 'vue'
-import { SwitchButton, Unlock } from '@element-plus/icons-vue'
+import { SwitchButton, Unlock, Delete, Avatar } from '@element-plus/icons-vue'
 import { getFileUrl } from '@/filters'
 import { useComponent } from '@/hooks/component'
 import { useUserStore, useGlobalStore, useNoticeStore } from '@/stores'
@@ -45,6 +49,8 @@ import AppIcon from '@pc/components/base/icon/index.vue'
 const componentMap = new Map<string, unknown>([
     ['notice', defineAsyncComponent(() => import('./components/notice/index.vue'))],
     ['modify', defineAsyncComponent(() => import('./components/modify/index.vue'))],
+    ['cancel', defineAsyncComponent(() => import('./components/cancel/index.vue'))],
+    ['avater', defineAsyncComponent(() => import('./components/avater/index.vue'))],
 ])
 
 const { componentId, openComponent, closeComponent } = useComponent()

+ 6 - 4
src/packages/pc/views/footer/capital/summary/withdraw/index.vue

@@ -5,8 +5,8 @@
             <el-form-item label="资金账号">
                 <span>{{ accountStore.currentAccountId }}</span>
             </el-form-item>
-            <el-form-item label="可用余额">
-                <span>{{ accountStore.currentAccount.avaiableMoney?.toFixed(2) }}</span>
+            <el-form-item label="可出资金">
+                <span>{{ fund.AvailableOutMoney?.toFixed(2) }}</span>
             </el-form-item>
             <el-form-item label="提现金额" prop="Amount">
                 <el-input-number placeholder="请输入提现金额" :precision="2" v-model="formData.Amount" />
@@ -28,7 +28,7 @@
 <script lang="ts" setup>
 import { ref } from 'vue'
 import { ElMessage, FormInstance, FormRules } from 'element-plus'
-import { useDoWithdraw } from '@/business/bank'
+import { useDoWithdraw, useAccountFundInfo } from '@/business/bank'
 import { useAccountStore } from '@/stores'
 import AppDrawer from '@pc/components/base/drawer/index.vue'
 
@@ -37,13 +37,15 @@ const accountStore = useAccountStore()
 const formRef = ref<FormInstance>()
 const show = ref(true)
 const refresh = ref(false)
+/// 资金账户信息
+const { fund } = useAccountFundInfo()
 
 const formRules: FormRules = {
     Amount: [{
         required: true,
         message: '请输入金额',
         validator: (rule, value, callback) => {
-            if (value <= (accountStore.currentAccount.avaiableMoney ?? 0.0)) {
+            if (value <= (fund.value.AvailableOutMoney ?? 0.0)) {
                 callback()
             } else {
                 callback(new Error('超出可出金额'))

+ 27 - 2
src/packages/qxst/views/account/certification/Index.vue

@@ -3,7 +3,7 @@
         <template #header>
             <app-navbar title="实名认证" />
         </template>
-        <Form ref="formRef" class="g-form__container" @submit="onSubmit" :loading="loading">
+        <Form ref="formRef" class="g-form__container" @submit="onCheckCardNum" :loading="loading">
             <CellGroup inset>
                 <Field v-model="formData.name" name="name" label="姓名" placeholder="请输入用户姓名"
                     :rules="formRules.name" />
@@ -48,7 +48,7 @@ import { fullloading, dialog } from '@/utils/vant';
 import { getAQCertificateTypeList } from "@/constants/account";
 import { useRequest } from '@/hooks/request'
 import { queryUserESignRecord } from '@/services/api/account';
-import { adddUserReq } from '@/business/user/account';
+import { adddUserReq, useCheckCardNum } from '@/business/user/account';
 import { validateRules } from '@/constants/regex';
 import { useComponent } from '@/hooks/component'
 import { useUserStore } from '@/stores'
@@ -66,6 +66,8 @@ const { componentRef, componentId, openComponent, closeComponent } = useComponen
 })
 const mobile2 = useUserStore().userInfo?.mobile2 ?? ''
 
+const { checkCardNumFormData, checkCardNum} = useCheckCardNum()
+
 const componentMap = new Map<string, unknown>([
     ['certification-next', defineAsyncComponent(() => import('./components/certification-next/Index.vue'))], // 爱签-实名认证第二步
 ])
@@ -90,6 +92,10 @@ const { loading  } = useRequest(queryUserESignRecord, {
                 openComponent('certification-next')
             } 
         }
+    }, onError: (err) => {
+        showFailToast(err)
+        /// 报错返回
+        router.back()
     }
 })
 
@@ -137,6 +143,25 @@ const formRules: { [key in keyof Model.AddUserReq]?: FieldRule[] } = {
     }],
 }
 
+const onCheckCardNum = () => {
+    fullloading((hideLoading) => {
+        /// 证件号码
+        checkCardNumFormData.cardnum = formData.idCard
+        /// 请求校验
+        checkCardNum().then((res) => {
+            hideLoading()
+            /// 提交
+            if (res.code === 0) {
+               onSubmit()
+            } else {
+                showFailToast(res.message ?? '未知错误')
+            }
+        }).catch((err) => {
+            showFailToast(err)
+        })
+    })
+}
+
 const onSubmit = () => {
     fullloading((hideLoading) => {
         /// 手机号码

+ 2 - 1
src/packages/qxst/views/goods/detail/components/listing/Index.vue

@@ -136,7 +136,8 @@ const onRadioChange = (value: number) => {
 // 提交挂牌
 const onSubmit = () => {
     dialog({
-        message: '确认要提交吗?',
+        title: '确认要提交吗?',
+        message: '*若存在价格匹配的反方向委托订单,系统将会自动撤销',
         showCancelButton: true,
     }).then(() => {
 

+ 2 - 1
src/packages/qxst/views/goods/trade/components/delisting/index.vue

@@ -127,7 +127,8 @@ const onRadioChange = (value: number) => {
 // 提交摘牌
 const onSubmit = () => {
     dialog({
-        message: '确认要提交吗?',
+        title: '确认要提交吗?',
+        message: '*若存在价格匹配的反方向委托订单,系统将会自动撤销',
         showCancelButton: true,
     }).then(() => {
         const { goodsid, orderid, orderprice, buyorsell } = props.selectedRow

+ 12 - 1
src/services/api/account/index.ts

@@ -160,7 +160,7 @@ export function queryUserESignRecord(config: RequestConfig<Model.UserESignRecord
     return http.goRequest<Model.UserESignRecordRsq[]>({
         method: 'get',
         url: '/Account/QueryUserESignRecord',
-        data: config.data,
+        params: config.data,
     })
 }
 
@@ -195,4 +195,15 @@ export function requestWillFace(config: RequestConfig<Model.WillFaceReq> = {}) {
         url: '/Account/WillFace',
         data: config.data,
     })
+}
+
+/**
+ * 证件号重复校验
+ */
+export function requestCheckCardNum(config: RequestConfig<Model.CheckCardNumReq> = {}) {
+    return http.request<Model.CheckCardNumRsp>({
+        method: 'get',
+        url: service.getConfig('openApiUrl') + '/onlineopen/userInfo/checkCardNum',
+        params: config.data
+    })
 }

+ 14 - 0
src/types/model/user.d.ts

@@ -53,4 +53,18 @@ declare namespace Model {
         username: string; // 户名(个人姓名或企业名称)
         email: string;
     }
+
+    /** 证件号重复校验 请求 */
+    interface CheckCardNumReq {
+        userid?: number; // 用户ID
+        cardnum?: string; // 证件号码
+    }
+
+    /** 证件号重复校验 响应 */
+    interface CheckCardNumRsp {
+        /// 返回码
+        code?: number
+        /// 返回信息
+        message?: string
+    }
 }