Handy_Cao 6 månader sedan
förälder
incheckning
d6f887d634

+ 6 - 0
public/locales/en-US.json

@@ -3503,10 +3503,16 @@
         "system_loginfailed": "Login Exception Query",
         "system_clientlog": "Terminal Login Log",
         "system_userblacklist": "Account Blacklist Management",
+        "system_userblacklist_add": "Add",
+        "system_userblacklist_modify": "Modify",
+        "system_userblacklist_delete": "Delete",
         "system_ipblacklist": "IP Blacklist Management",
         "system_ipblacklist_add": "Add",
         "system_ipblacklist_delete": "Delete",
         "system_exrate": "System Exchange Rate Management",
+        "system_exrate_add": "Add",
+        "system_exrate_modify": "Modify",
+        "system_exrate_delete": "Delete",
         "marketrun": "Market Operation Management",
         "marketrun_market": "Market Monitoring",
         "marketrun_exception": "Error Management",

+ 6 - 0
public/locales/th-TH.json

@@ -3503,10 +3503,16 @@
         "system_loginfailed": "การสืบค้นการเข้าสู่ระบบที่ผิดปกติ",
         "system_clientlog": "บันทึกการเข้าสู่ระบบของอุปกรณ์",
         "system_userblacklist": "การจัดการบัญชีแบล็คลิสต์",
+        "system_userblacklist_add": "เพิ่มใหม่",
+        "system_userblacklist_modify": "แก้ไข",
+        "system_userblacklist_delete": "ลบ",
         "system_ipblacklist": "การจัดการ IP แบล็คลิสต์",
         "system_ipblacklist_add": "เพิ่มใหม่",
         "system_ipblacklist_delete": "ลบ",
         "system_exrate": "การจัดการอัตราแลกเปลี่ยนของระบบ",
+        "system_exrate_add": "เพิ่มใหม่",
+        "system_exrate_modify": "แก้ไข",
+        "system_exrate_delete": "ลบ",
         "marketrun": "การจัดการการดำเนินงานของตลาด",
         "marketrun_market": "การตรวจสอบตลาด",
         "marketrun_exception": "การจัดการข้อผิดพลาด",

+ 6 - 0
public/locales/vi-VN.json

@@ -3503,10 +3503,16 @@
         "system_loginfailed": "Truy vấn đăng nhập bất thường",
         "system_clientlog": "Nhật ký đăng nhập thiết bị",
         "system_userblacklist": "Quản lý danh sách đen mở tài khoản",
+        "system_userblacklist_add": "Thêm mới",
+        "system_userblacklist_modify": "Sửa đổi",
+        "system_userblacklist_delete": "Xóa",
         "system_ipblacklist": "Quản lý danh sách đen mở IP",
         "system_ipblacklist_add": "Thêm mới",
         "system_ipblacklist_delete": "Xóa",
         "system_exrate": "Quản lý tỷ giá hệ thống",
+        "system_exrate_add": "Thêm mới",
+        "system_exrate_modify": "Sửa đổi",
+        "system_exrate_delete": "Xóa",
         "marketrun": "Quản lý vận hành thị trường",
         "marketrun_market": "Giám sát thị trường",
         "marketrun_exception": "Quản lý sai sót",

+ 6 - 0
public/locales/zh-CN.json

@@ -3503,10 +3503,16 @@
         "system_loginfailed": "登录异常流水查询",
         "system_clientlog": "终端登录日志",
         "system_userblacklist": "开户黑名单管理",
+        "system_userblacklist_add": "新增",
+        "system_userblacklist_modify": "修改",
+        "system_userblacklist_delete": "删除",
         "system_ipblacklist": "IP黑名单管理",
         "system_ipblacklist_add": "新增",
         "system_ipblacklist_delete": "删除",
         "system_exrate": "系统汇率管理",
+        "system_exrate_add": "新增",
+        "system_exrate_modify": "修改",
+        "system_exrate_delete": "删除",
         "marketrun": "市场运行管理",
         "marketrun_market": "市场监控",
         "marketrun_exception": "差错管理",

+ 6 - 0
public/locales/zh-TW.json

@@ -3503,10 +3503,16 @@
         "system_loginfailed": "登錄異常流水查詢",
         "system_clientlog": "終端登錄日誌",
         "system_userblacklist": "開戶黑名單管理",
+        "system_userblacklist_add": "新增",
+        "system_userblacklist_modify": "修改",
+        "system_userblacklist_delete": "删除",
         "system_ipblacklist": "IP黑名單管理",
         "system_ipblacklist_add": "新增",
         "system_ipblacklist_delete": "刪除",
         "system_exrate": "系統匯率管理",
+        "system_exrate_add": "新增",
+        "system_exrate_modify": "修改",
+        "system_exrate_delete": "刪除",
         "marketrun": "市場運行管理",
         "marketrun_market": "市場監控",
         "marketrun_exception": "差錯管理",

+ 54 - 0
src/packages/pc/views/system/exrate/components/delete/index.vue

@@ -0,0 +1,54 @@
+<!-- 系统运行管理-系统汇率管理-删除 -->
+<template>
+    <app-drawer :title="t('common.alert')" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div class="g-text-message">确定删除吗?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onSubmit">{{ t('operation.confirm') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { dealRate } from '@/services/api/system'
+import { i18n } from '@/stores'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.RateRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    loading.value = true
+    // 删除
+    dealRate({
+        data: {
+            descurrencyid: props.record.descurrencyid,
+            oricurrencyid: props.record.oricurrencyid
+        }
+    }).then(() => {
+        ElMessage.success(t('common.tips5'))
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error(t('common.tips6') + err)
+        onCancel()
+    }).finally(() => {
+        loading.value = false
+    })
+}
+</script>

+ 99 - 0
src/packages/pc/views/system/exrate/components/edit/index.vue

@@ -0,0 +1,99 @@
+<!-- 系统运行管理-开户黑名单管理-新增/修改 -->
+<template>
+    <app-drawer title="编辑" width="500" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" label-width="80px" :model="formData" :rules="formRules" :show-message="false">
+            <el-form-item label="源币种" prop="oricurrencyid">
+                <app-enum code="currency" v-model="formData.oricurrencyid" />
+            </el-form-item>
+            <el-form-item label="目标币种" prop="descurrencyid">
+                {{ currencyEnum.getEnumTypeName(data?.descurrencyid ?? 1) }}
+            </el-form-item>
+            <el-form-item label="汇率值" prop="exchangerate">
+                <el-input v-model="formData.exchangerate" maxlength="50" :placeholder="t('common.pleaseenter')" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onSubmit">{{ t('operation.save') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, ref, PropType, onMounted } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { i18n } from '@/stores'
+import { dealRate, dealinit } from '@/services/api/system'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppEnum from '@pc/components/modules/enum/index.vue'
+import { useRequest } from '@/hooks/request'
+import { useEnum } from '@/hooks/enum'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.RateRsp>
+    }
+})
+
+const formData = ref<Partial<Model.DealRateReq>>({
+    flag: props.record ? 1 : 0
+})
+
+const { global: { t } } = i18n
+const formRef = ref<FormInstance>()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+
+const currencyEnum = useEnum('currency')
+
+// 表单验证规则
+const formRules: FormRules = {
+    cardtype: [{ required: true }],
+    cardnum: [{ required: true }]
+}
+
+const { data, loading }= useRequest(dealinit, {
+    onSuccess: (res) => {
+        const { descurrencyid } = res.data[0]
+        if (descurrencyid) {
+            formData.value.descurrencyid = descurrencyid
+        }
+    }
+})
+
+const onSubmit = () => {
+    // 目标币种
+    formData.value.descurrencyid = data.value?.descurrencyid
+    const rawData = { ...formData.value }
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            loading.value = true
+            dealRate({
+                data: rawData
+            }).then(() => {
+                ElMessage.success(t('common.tips3'))
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error(t('common.tips4') + err)
+            }).finally(() => {
+                loading.value = false
+            })
+        }
+    })
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+onMounted(() => {
+    const { descurrencyid, exchangerate, oricurrencyid } = props.record ?? {}
+    if (descurrencyid) {
+        formData.value.exchangerate = exchangerate
+        formData.value.oricurrencyid = oricurrencyid
+        formData.value.descurrencyid = descurrencyid
+    }
+})
+
+</script>

+ 54 - 1
src/packages/pc/views/system/exrate/index.vue

@@ -1,7 +1,60 @@
 <!-- 系统运行管理-系统汇率管理 -->
 <template>
-    <app-view></app-view>
+    <app-view>
+        <app-table :data="dataList" showIndex :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['system_exrate_add'])"
+                    @click="openComponent" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['system_exrate_modify', 'system_exrate_delete'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
 </template>
 
 <script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { queryrate } from '@/services/api/system'
+import { i18n } from '@/stores'
+import { useEnum } from '@/hooks/enum'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+
+const { global: { t } } = i18n
+// 状态
+const currencyEnum = useEnum('currency')
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.RateRsp>({
+    onClose: () => run()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryrate, {
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = ref<Model.TableColumn[]>([
+    { field: 'oricurrencyid', label: '源币种', formatValue: (val) => currencyEnum.getEnumTypeName(val) },
+    { field: 'descurrencyid', label: '目标币种', formatValue: (val) => currencyEnum.getEnumTypeName(val) },
+    { field: 'exchangerate', label: '汇率值' },
+    { field: 'operate', label: 'common.operate', fixed: 'right' }
+])
+
 </script>

+ 0 - 7
src/packages/pc/views/system/user_blacklist/index.vue

@@ -1,7 +0,0 @@
-<!-- 系统运行管理-开户黑名单管理 -->
-<template>
-    <app-view></app-view>
-</template>
-
-<script lang="ts" setup>
-</script>

+ 55 - 0
src/packages/pc/views/system/userblacklist/components/delete/index.vue

@@ -0,0 +1,55 @@
+<!-- 系统运行管理-开户黑名单管理-删除 -->
+<template>
+    <app-drawer :title="t('common.alert')" v-model:show="show" :loading="loading" :refresh="refresh">
+        <div class="g-text-message">确定删除该黑名单吗?</div>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onSubmit">{{ t('operation.confirm') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, PropType } from 'vue'
+import { ElMessage } from 'element-plus'
+import { dealBlackList } from '@/services/api/system'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import { i18n } from '@/stores'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.BlackListRsp>,
+        required: true
+    }
+})
+
+const { global: { t } } = i18n
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+const onSubmit = () => {
+    loading.value = true
+    // 删除
+    dealBlackList({
+        data: {
+            autoid: props.record.autoid,
+            cardtype: props.record.cardtype,
+            cardnum:  props.record.cardnum
+        }
+    }).then(() => {
+        ElMessage.success(t('common.tips5'))
+        onCancel(true)
+    }).catch((err) => {
+        ElMessage.error(t('common.tips6') + err)
+        onCancel()
+    }).finally(() => {
+        loading.value = false
+    })
+}
+</script>

+ 80 - 0
src/packages/pc/views/system/userblacklist/components/edit/index.vue

@@ -0,0 +1,80 @@
+<!-- 系统运行管理-开户黑名单管理-新增/修改 -->
+<template>
+    <app-drawer title="编辑" width="500" v-model:show="show" :loading="loading" :refresh="refresh">
+        <el-form ref="formRef" label-width="80px" :model="formData" :rules="formRules" :show-message="false">
+            <el-form-item label="证件类型" prop="cardtype">
+                <app-enum code="userinfotype" v-model="formData.cardtype" />
+            </el-form-item>
+            <el-form-item label="证件号码" prop="cardnum">
+                <el-input v-model="formData. cardnum" maxlength="50" :placeholder="t('common.pleaseenter')" />
+            </el-form-item>
+        </el-form>
+        <template #footer>
+            <el-button @click="onCancel(false)">{{ t('operation.cancel') }}</el-button>
+            <el-button type="primary" @click="onSubmit">{{ t('operation.save') }}</el-button>
+        </template>
+    </app-drawer>
+</template>
+
+<script lang="ts" setup>
+import { shallowRef, ref, PropType, onMounted } from 'vue'
+import { ElMessage, FormInstance, FormRules } from 'element-plus'
+import { i18n } from '@/stores'
+import { dealBlackList } from '@/services/api/system'
+import AppDrawer from '@pc/components/base/drawer/index.vue'
+import AppEnum from '@pc/components/modules/enum/index.vue'
+
+const props = defineProps({
+    record: {
+        type: Object as PropType<Model.BlackListRsp>
+    }
+})
+
+const formData = ref<Partial<Model.DealBlackListReq>>({})
+
+const { global: { t } } = i18n
+const formRef = ref<FormInstance>()
+const show = shallowRef(true)
+const refresh = shallowRef(false)
+const loading = shallowRef(false)
+
+// 表单验证规则
+const formRules: FormRules = {
+    cardtype: [{ required: true }],
+    cardnum: [{ required: true }]
+}
+
+const onSubmit = () => {
+    const rawData = { ...formData.value }
+    formRef.value?.validate((valid) => {
+        if (valid) {
+            loading.value = true
+            dealBlackList({
+                data: rawData
+            }).then(() => {
+                ElMessage.success(t('common.tips3'))
+                onCancel(true)
+            }).catch((err) => {
+                ElMessage.error(t('common.tips4') + err)
+            }).finally(() => {
+                loading.value = false
+            })
+        }
+    })
+}
+
+const onCancel = (isRefresh = false) => {
+    show.value = false
+    refresh.value = isRefresh
+}
+
+onMounted(() => {
+    const { autoid, cardtype, cardnum } = props.record ?? {}
+    if (autoid) {
+        formData.value.autoid = autoid
+        formData.value.cardtype = cardtype
+        formData.value.cardnum = cardnum
+    }
+})
+
+</script>

+ 61 - 0
src/packages/pc/views/system/userblacklist/index.vue

@@ -0,0 +1,61 @@
+<!-- 系统运行管理-开户黑名单管理 -->
+<template>
+    <app-view>
+        <app-table :data="dataList" showIndex :columns="tableColumns" :loading="loading">
+            <template #headerLeft>
+                <app-operation :data-list="getActionButtons(['system_userblacklist_add'])"
+                    @click="openComponent" />
+            </template>
+            <!-- 操作 -->
+            <template #operate="{ row }">
+                <app-operation size="small" :data-list="getActionButtons(['system_userblacklist_modify', 'system_userblacklist_delete'])"
+                    @click="(code: string) => openComponent(code, row)" circle />
+            </template>
+            <template #footer>
+                <app-pagination :total="total" v-model:page-size="pageSize" v-model:page-index="pageIndex" @change="run" />
+            </template>
+        </app-table>
+        <component :is="componentMap.get(componentId)" v-bind="{ record }" @closed="closeComponent"
+            v-if="componentId" />
+    </app-view>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue'
+import { ElMessage } from 'element-plus'
+import { useRequest } from '@/hooks/request'
+import { useOperation } from '@/hooks/operation'
+import { queryBlackList } from '@/services/api/system'
+import { i18n } from '@/stores'
+import { useEnum } from '@/hooks/enum'
+import AppTable from '@pc/components/base/table/index.vue'
+import AppPagination from '@pc/components/base/pagination/index.vue'
+import AppOperation from '@pc/components/base/operation/index.vue'
+import { formatDate } from '@/filters'
+
+const { global: { t } } = i18n
+// 状态
+const cardtypeEnum = useEnum('cardtype')
+
+const { componentMap, componentId, record, openComponent, closeComponent, getActionButtons } = useOperation<Model.BlackListRsp>({
+    onClose: () => run()
+})
+
+const { dataList, total, pageSize, pageIndex, loading, run } = useRequest(queryBlackList, {
+    params: {
+        pageNum: 1,
+        pageSize: 20
+    },
+    onError: (err) => {
+        ElMessage.error(err)
+    }
+})
+
+const tableColumns = ref<Model.TableColumn[]>([
+    { field: 'cardtype', label: '证件类型', formatValue: (val) => cardtypeEnum.getEnumTypeName(val) },
+    { field: 'cardnum', label: '证件号码' },
+    { field: 'createtime', label: '创建时间', formatValue: (val) => formatDate(val) },
+    { field: 'operate', label: 'common.operate', fixed: 'right' }
+])
+
+</script>

+ 29 - 0
src/services/api/system/index.ts

@@ -99,4 +99,33 @@ export function view(options: CommonFetchOptions<{ request: Model.ViewReq; respo
     return httpClient.commonRequest('/operation/view', 'get', options)
 }
 
+/**
+ * 系统运行管理-->管理员操作日志-->详情
+ */
+export function queryrate(options: CommonFetchOptions<{ response: Model.RateRsp[]}>) {
+    return httpClient.commonRequest('/operation/queryrate', 'get', options)
+}
+
+/**
+ * 系统运行管理-->系统汇率管理-->删除
+ */
+export function deleteRate(options: CommonFetchOptions<{ request: Model.DeleteRateReq}>) {
+    return httpClient.commonRequest('/operation/deleteRate', 'get', options)
+}
+
+/**
+ * 系统运行管理-->系统汇率管理-->新增/修改 flag==0 新增 flag==1 修改
+ */
+export function dealRate(options: CommonFetchOptions<{ request: Model.DealRateReq}>) {
+    return httpClient.commonRequest('/operation/dealRate', 'get', options)
+}
+
+/**
+ * 
+系统运行管理-->系统汇率管理-->新增/修改初始化
+ */
+export function dealinit(options: CommonFetchOptions<{ request: Model.DeleteRateReq, response: Model.DealInitRsp[] }>) {
+    return httpClient.commonRequest('/operation/dealinit', 'get', options)
+}
+
 

+ 60 - 1
src/types/model/system.d.ts

@@ -64,7 +64,7 @@ declare namespace Model {
 
     /** 系统运行管理-->开户黑名单管理-->新增/修改 请求 */
     interface DealBlackListReq {
-        autoid: number  // autoid
+        autoid?: number  // autoid
         cardnum?: string  // 证件号码   
         cardtype?: number  // 证件类型
     }
@@ -251,4 +251,63 @@ declare namespace Model {
         // 用户姓名
         username: string
     }
+
+    /** 系统运行管理-->系统汇率管理-->获取列表 回应 */
+    interface  RateRsp {
+        // 目标币种ID
+        descurrencyid: number
+        // 汇率
+        exchangerate: number
+        // 源币种ID
+        oricurrencyid: number
+        // 备注
+        remark: string
+        // 更新人
+        updateby: number
+        // 更新时间
+        updatetime: string
+    }
+
+    /** 系统运行管理-->系统汇率管理-->删除 请求 */
+    interface DeleteRateReq {
+        // descurrencyid
+        descurrencyid?: number  
+        // oricurrencyid
+        oricurrencyid?: number  
+    }
+
+    /** 系统运行管理-->系统汇率管理-->新增/修改 flag==0 新增 flag==1 修改 请求 */
+    interface DealRateReq {
+        // descurrencyid
+        descurrencyid?: number  
+        // oricurrencyid
+        oricurrencyid?: number  
+        // exchangerate
+        exchangerate?: number
+        // flag
+        flag?: number
+    }
+
+    /** 系统运行管理-->系统汇率管理-->新增/修改初始化 回应 */
+    interface DealInitRsp {
+        // 系统汇率管理
+        currencyMap: {}
+        descurrencyid: number
+        // 汇率配置表
+        exchangerateconfig: {
+            // 目标币种ID
+            descurrencyid: number
+            // 汇率
+            exchangerate: number
+            // 源币种ID
+            oricurrencyid: number
+            // 备注
+            remark: string
+            // 更新人
+            updateby: number
+            // 更新时间
+            updatetime: string
+
+        }[]
+    }
 }