Merge branch 'master' of http://gitea.zianxin.com/zianxin-tec/biz-pc-cloud
This commit is contained in:
commit
30716afea5
36 files changed
+1758
-260
No files matched your search
@@ -27,6 +27,7 @@
|
||||
"axios": "^1.3.3",
|
||||
"codemirror": "5.65.5",
|
||||
"crypto-js": "^3.1.9-1",
|
||||
"dayjs": "^1.11.13",
|
||||
"disable-devtool": "^0.3.8",
|
||||
"driver.js": "^0.9.8",
|
||||
"echarts": "^5.4.1",
|
||||
|
||||
+40
-40
@@ -8,79 +8,79 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="app">
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
|
||||
import { useThemeConfig } from '/@/stores/themeConfig';
|
||||
import other from '/@/utils/other';
|
||||
import { Local, Session } from '/@/utils/storage';
|
||||
import mittBus from '/@/utils/mitt';
|
||||
import setIntroduction from '/@/utils/setIconfont';
|
||||
import { useI18n } from "vue-i18n"
|
||||
import { useTagsViewRoutes } from "/@/stores/tagsViewRoutes"
|
||||
import { useThemeConfig } from "/@/stores/themeConfig"
|
||||
import other from "/@/utils/other"
|
||||
import { Local, Session } from "/@/utils/storage"
|
||||
import mittBus from "/@/utils/mitt"
|
||||
import setIntroduction from "/@/utils/setIconfont"
|
||||
|
||||
// 引入组件
|
||||
const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue'));
|
||||
const Setings = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/setings.vue'));
|
||||
const CloseFull = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/closeFull.vue'));
|
||||
const LockScreen = defineAsyncComponent(() => import("/@/layout/lockScreen/index.vue"))
|
||||
const Setings = defineAsyncComponent(() => import("/@/layout/navBars/breadcrumb/setings.vue"))
|
||||
const CloseFull = defineAsyncComponent(() => import("/@/layout/navBars/breadcrumb/closeFull.vue"))
|
||||
|
||||
// 定义变量内容
|
||||
const { messages, locale } = useI18n();
|
||||
const settingsRef = ref();
|
||||
const route = useRoute();
|
||||
const stores = useTagsViewRoutes();
|
||||
const storesThemeConfig = useThemeConfig();
|
||||
const { themeConfig } = storeToRefs(storesThemeConfig);
|
||||
const { messages, locale } = useI18n()
|
||||
const settingsRef = ref()
|
||||
const route = useRoute()
|
||||
const stores = useTagsViewRoutes()
|
||||
const storesThemeConfig = useThemeConfig()
|
||||
const { themeConfig } = storeToRefs(storesThemeConfig)
|
||||
|
||||
// 设置锁屏时组件显示隐藏
|
||||
const setLockScreen = computed(() => {
|
||||
// 防止锁屏后,刷新出现不相关界面
|
||||
// https://gitee.com/lyt-top/vue-next-admin/issues/I6AF8P
|
||||
return themeConfig.value.isLockScreen ? themeConfig.value.lockScreenTime > 1 : themeConfig.value.lockScreenTime >= 0;
|
||||
});
|
||||
return themeConfig.value.isLockScreen ? themeConfig.value.lockScreenTime > 1 : themeConfig.value.lockScreenTime >= 0
|
||||
})
|
||||
|
||||
// 获取全局组件大小
|
||||
const getGlobalComponentSize = computed(() => {
|
||||
return other.globalComponentSize();
|
||||
});
|
||||
return other.globalComponentSize()
|
||||
})
|
||||
// 获取全局 i18n
|
||||
const getGlobalI18n = computed(() => {
|
||||
return messages.value[locale.value];
|
||||
});
|
||||
return messages.value[locale.value]
|
||||
})
|
||||
// 设置初始化,防止刷新时恢复默认
|
||||
onBeforeMount(() => {
|
||||
// 设置批量第三方 icon 图标
|
||||
setIntroduction.cssCdn();
|
||||
setIntroduction.cssCdn()
|
||||
// 设置批量第三方 js
|
||||
setIntroduction.jsCdn();
|
||||
});
|
||||
setIntroduction.jsCdn()
|
||||
})
|
||||
// 页面加载时
|
||||
onMounted(() => {
|
||||
nextTick(() => {
|
||||
// 监听布局配'置弹窗点击打开
|
||||
mittBus.on('openSetingsDrawer', () => {
|
||||
settingsRef.value.openDrawer();
|
||||
});
|
||||
mittBus.on("openSetingsDrawer", () => {
|
||||
settingsRef.value.openDrawer()
|
||||
})
|
||||
// 获取缓存中的布局配置
|
||||
if (Local.get('themeConfig')) {
|
||||
storesThemeConfig.setThemeConfig({ themeConfig: Local.get('themeConfig') });
|
||||
document.documentElement.style.cssText = Local.get('themeConfigStyle');
|
||||
if (Local.get("themeConfig")) {
|
||||
storesThemeConfig.setThemeConfig({ themeConfig: Local.get("themeConfig") })
|
||||
document.documentElement.style.cssText = Local.get("themeConfigStyle")
|
||||
}
|
||||
// 获取缓存中的全屏配置
|
||||
if (Session.get('isTagsViewCurrenFull')) {
|
||||
stores.setCurrenFullscreen(Session.get('isTagsViewCurrenFull'));
|
||||
if (Session.get("isTagsViewCurrenFull")) {
|
||||
stores.setCurrenFullscreen(Session.get("isTagsViewCurrenFull"))
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
})
|
||||
// 页面销毁时,关闭监听布局配置/i18n监听
|
||||
onUnmounted(() => {
|
||||
mittBus.off('openSetingsDrawer', () => {});
|
||||
});
|
||||
mittBus.off("openSetingsDrawer", () => {})
|
||||
})
|
||||
// 监听路由的变化,设置网站标题
|
||||
watch(
|
||||
() => route.path,
|
||||
() => {
|
||||
other.useTitle();
|
||||
other.useTitle()
|
||||
},
|
||||
{
|
||||
deep: true,
|
||||
}
|
||||
);
|
||||
},
|
||||
)
|
||||
</script>
|
||||
@@ -1,49 +1,56 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function select(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-manager/select",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function pageJoin(query?: Object) {
|
||||
return request({
|
||||
url: '/hard/hard-manager/page-join',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager/page-join",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: '/hard/hard-manager/page',
|
||||
method: 'get',
|
||||
params: query
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager/page",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function addObj(obj?: Object) {
|
||||
return request({
|
||||
url: '/hard/hard-manager',
|
||||
method: 'post',
|
||||
data: obj
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function getObj(id?: string) {
|
||||
return request({
|
||||
url: '/hard/hard-manager/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager/" + id,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: '/hard/hard-manager',
|
||||
method: 'delete',
|
||||
data: ids
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: '/hard/hard-manager',
|
||||
method: 'put',
|
||||
data: obj
|
||||
})
|
||||
return request({
|
||||
url: "/hard/hard-manager",
|
||||
method: "put",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function select(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category/select",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category/page",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function pageJoin(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category/page-join",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function addObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function getObj(id?: string) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category/" + id,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-category",
|
||||
method: "put",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function select(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory/select",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory/page",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function addObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function getObj(id?: string) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory/" + id,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu-repertory",
|
||||
method: "put",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function select(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu/select",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function pageJoin(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu/page-join",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu/page",
|
||||
method: "get",
|
||||
params: query,
|
||||
})
|
||||
}
|
||||
|
||||
export function addObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function getObj(id?: string) {
|
||||
return request({
|
||||
url: "/hard/hard-spu/" + id,
|
||||
method: "get",
|
||||
})
|
||||
}
|
||||
|
||||
export function delObjs(ids?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu",
|
||||
method: "delete",
|
||||
data: ids,
|
||||
})
|
||||
}
|
||||
|
||||
export function putObj(obj?: Object) {
|
||||
return request({
|
||||
url: "/hard/hard-spu",
|
||||
method: "put",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
@@ -1,5 +1,13 @@
|
||||
import request from "/@/utils/request"
|
||||
|
||||
export function refund(params?: Object) {
|
||||
return request({
|
||||
url: "/wallet/wallet-rule-transaction/refund",
|
||||
method: "get",
|
||||
params,
|
||||
})
|
||||
}
|
||||
|
||||
export function fetchList(query?: Object) {
|
||||
return request({
|
||||
url: "/wallet/wallet-rule-transaction/page",
|
||||
@@ -8,11 +16,15 @@ export function fetchList(query?: Object) {
|
||||
})
|
||||
}
|
||||
|
||||
export function pageJoin(query?: Object) {
|
||||
export function pageJoin(data: any) {
|
||||
return request({
|
||||
url: "/wallet/wallet-rule-transaction/page-join",
|
||||
method: "get",
|
||||
params: query,
|
||||
method: "post",
|
||||
params: {
|
||||
current: data.current,
|
||||
size: data.size,
|
||||
},
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -46,3 +58,11 @@ export function putObj(obj?: Object) {
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
|
||||
export function transferAccounts(obj?: Object) {
|
||||
return request({
|
||||
url: "/wallet/wallet-rule-transaction/transfer-accounts",
|
||||
method: "post",
|
||||
data: obj,
|
||||
})
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<template>
|
||||
<el-select
|
||||
style="width: 100%"
|
||||
v-model="state.selectId"
|
||||
:placeholder="props.placeholder"
|
||||
:clearable="props.clearable"
|
||||
remote-show-suffix
|
||||
filterable
|
||||
remote
|
||||
:disabled="props.disabled"
|
||||
:remote-method="remoteSearch"
|
||||
:loading="state.loading"
|
||||
@visible-change="(e: boolean) => e && getOptions()"
|
||||
@change="change"
|
||||
>
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<dict-tag :options="state.hardType" :value="v.type" />
|
||||
</div>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="select-hard">
|
||||
import { reactive } from "vue"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import * as hardManager from "/@/api/hard/hard-manager"
|
||||
|
||||
const emit = defineEmits(["change"])
|
||||
|
||||
const selectId = defineModel()
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
placeholder?: string
|
||||
disabled?: boolean
|
||||
clearable?: boolean
|
||||
autoFirst?: boolean
|
||||
apiParams?: any
|
||||
}>(),
|
||||
{
|
||||
placeholder: "请选择",
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
autoFirst: false,
|
||||
apiParams: {},
|
||||
},
|
||||
)
|
||||
|
||||
const queryForm = reactive<any>({
|
||||
name: "",
|
||||
current: 1,
|
||||
size: 10,
|
||||
})
|
||||
|
||||
const state = reactive<any>({
|
||||
loading: true,
|
||||
selectId: selectId,
|
||||
options: [],
|
||||
hardType: [],
|
||||
})
|
||||
|
||||
watch(
|
||||
selectId,
|
||||
(newVal, oldValue) => {
|
||||
if (newVal == oldValue) return
|
||||
state.selectId = newVal
|
||||
getOptions()
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
async function getOptions() {
|
||||
try {
|
||||
state.loading = true
|
||||
const _pa = {
|
||||
...queryForm,
|
||||
...props.apiParams,
|
||||
}
|
||||
const { data } = await hardManager.select(_pa)
|
||||
state.options = data.records ?? []
|
||||
if (props.autoFirst && state.options.length != 0) {
|
||||
state.selectId = state.options[0].id
|
||||
emit("change", state.selectId)
|
||||
}
|
||||
const { hard_type } = useDict("hard_type")
|
||||
state.hardType = hard_type
|
||||
} finally {
|
||||
setTimeout(() => (state.loading = false), 500)
|
||||
}
|
||||
}
|
||||
|
||||
function remoteSearch(params: string) {
|
||||
if (params != queryForm.name) {
|
||||
queryForm.name = params
|
||||
getOptions()
|
||||
}
|
||||
}
|
||||
|
||||
function clear() {
|
||||
state.selectId = null
|
||||
getOptions()
|
||||
}
|
||||
|
||||
function change() {
|
||||
emit("change", selectId)
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
props.autoFirst && getOptions()
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,117 @@
|
||||
<template>
|
||||
<el-select
|
||||
style="width: 100%"
|
||||
v-model="state.selectId"
|
||||
:placeholder="props.placeholder"
|
||||
:clearable="props.clearable"
|
||||
remote-show-suffix
|
||||
filterable
|
||||
remote
|
||||
:disabled="props.disabled"
|
||||
:remote-method="remoteSearch"
|
||||
:loading="state.loading"
|
||||
@visible-change="(e: boolean) => e && getOptions()"
|
||||
@change="change"
|
||||
>
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<el-tag size="small"> {{ v.merchantName }} </el-tag>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="select-hard">
|
||||
import { reactive } from "vue"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import * as hardSpu from "/@/api/hard/hard-spu"
|
||||
|
||||
const emit = defineEmits(["change"])
|
||||
|
||||
const selectId = defineModel()
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
placeholder?: string
|
||||
disabled?: boolean
|
||||
clearable?: boolean
|
||||
autoFirst?: boolean
|
||||
apiParams?: any
|
||||
}>(),
|
||||
{
|
||||
placeholder: "请选择",
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
autoFirst: false,
|
||||
apiParams: {},
|
||||
},
|
||||
)
|
||||
|
||||
const queryForm = reactive<any>({
|
||||
name: "",
|
||||
current: 1,
|
||||
size: 10,
|
||||
})
|
||||
|
||||
const state = reactive<any>({
|
||||
loading: true,
|
||||
selectId: selectId,
|
||||
options: [],
|
||||
hardType: [],
|
||||
})
|
||||
|
||||
watch(
|
||||
selectId,
|
||||
(newVal, oldValue) => {
|
||||
if (newVal == oldValue) return
|
||||
state.selectId = newVal
|
||||
getOptions()
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
async function getOptions() {
|
||||
try {
|
||||
state.loading = true
|
||||
const _pa = {
|
||||
...queryForm,
|
||||
...props.apiParams,
|
||||
}
|
||||
const { data } = await hardSpu.select(_pa)
|
||||
state.options = data.records ?? []
|
||||
if (props.autoFirst && state.options.length != 0) {
|
||||
state.selectId = state.options[0].id
|
||||
emit("change", state.selectId)
|
||||
}
|
||||
const { hard_type } = useDict("hard_type")
|
||||
state.hardType = hard_type
|
||||
} finally {
|
||||
setTimeout(() => (state.loading = false), 500)
|
||||
}
|
||||
}
|
||||
|
||||
function remoteSearch(params: string) {
|
||||
if (params != queryForm.name) {
|
||||
queryForm.name = params
|
||||
getOptions()
|
||||
}
|
||||
}
|
||||
|
||||
function clear() {
|
||||
state.selectId = null
|
||||
getOptions()
|
||||
}
|
||||
|
||||
function change() {
|
||||
emit("change", selectId)
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
props.autoFirst && getOptions()
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,117 @@
|
||||
<template>
|
||||
<el-select
|
||||
style="width: 100%"
|
||||
v-model="state.selectId"
|
||||
:placeholder="props.placeholder"
|
||||
:clearable="props.clearable"
|
||||
remote-show-suffix
|
||||
filterable
|
||||
remote
|
||||
:disabled="props.disabled"
|
||||
:remote-method="remoteSearch"
|
||||
:loading="state.loading"
|
||||
@visible-change="(e: boolean) => e && getOptions()"
|
||||
@change="change"
|
||||
>
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<el-tag size="small"> {{ v.merchantName }} </el-tag>
|
||||
</div>
|
||||
</div>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="select-hard-spu-category">
|
||||
import { reactive } from "vue"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import * as hardSpuCategory from "/@/api/hard/hard-spu-category"
|
||||
|
||||
const emit = defineEmits(["change"])
|
||||
|
||||
const selectId = defineModel()
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
placeholder?: string
|
||||
disabled?: boolean
|
||||
clearable?: boolean
|
||||
autoFirst?: boolean
|
||||
apiParams?: any
|
||||
}>(),
|
||||
{
|
||||
placeholder: "请选择",
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
autoFirst: false,
|
||||
apiParams: {},
|
||||
},
|
||||
)
|
||||
|
||||
const queryForm = reactive<any>({
|
||||
name: "",
|
||||
current: 1,
|
||||
size: 10,
|
||||
})
|
||||
|
||||
const state = reactive<any>({
|
||||
loading: true,
|
||||
selectId: selectId,
|
||||
options: [],
|
||||
walletType: [],
|
||||
})
|
||||
|
||||
watch(
|
||||
selectId,
|
||||
(newVal, oldValue) => {
|
||||
console.log(newVal, "newVal")
|
||||
|
||||
if (newVal == oldValue) return
|
||||
state.selectId = newVal
|
||||
getOptions()
|
||||
},
|
||||
{ immediate: true },
|
||||
)
|
||||
|
||||
async function getOptions() {
|
||||
try {
|
||||
state.loading = true
|
||||
const _pa = {
|
||||
...queryForm,
|
||||
...props.apiParams,
|
||||
}
|
||||
const { data } = await hardSpuCategory.select(_pa)
|
||||
state.options = data.records ?? []
|
||||
if (props.autoFirst && state.options.length != 0) {
|
||||
state.selectId = state.options[0].id
|
||||
emit("change", state.selectId)
|
||||
}
|
||||
const { wallet_type } = useDict("wallet_type")
|
||||
state.walletType = wallet_type
|
||||
} finally {
|
||||
setTimeout(() => (state.loading = false), 500)
|
||||
}
|
||||
}
|
||||
|
||||
function remoteSearch(params: string) {
|
||||
if (params != queryForm.name) {
|
||||
queryForm.name = params
|
||||
getOptions()
|
||||
}
|
||||
}
|
||||
|
||||
function clear() {
|
||||
state.selectId = null
|
||||
getOptions()
|
||||
}
|
||||
|
||||
function change() {
|
||||
emit("change", selectId)
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
props.autoFirst && getOptions()
|
||||
})
|
||||
</script>
|
||||
@@ -15,7 +15,7 @@
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
<div class="flex items-center just ml5">
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<el-tag size="small">
|
||||
{{ v.deptName }}
|
||||
</el-tag>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
>
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="getDictById(v.rulePriceType, v)" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="flex items-center ml5">
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<dict-tag :options="state.walletRulePriceType" :value="v.rulePriceType" />
|
||||
<div class="ml-2">
|
||||
<span>超过</span>
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
<div class="flex items-center just ml5">
|
||||
<div class="flex items-center justify-center ml5">
|
||||
<el-tag size="small">
|
||||
{{ state.walletType.find((i: any) => i.value == v.uniqueCode)?.label }}
|
||||
</el-tag>
|
||||
@@ -68,8 +68,6 @@ const state = reactive<any>({
|
||||
watch(
|
||||
selectId,
|
||||
(newVal, oldValue) => {
|
||||
console.log(newVal, "newVal")
|
||||
|
||||
if (newVal == oldValue) return
|
||||
state.selectId = newVal
|
||||
getOptions()
|
||||
@@ -88,7 +86,7 @@ async function getOptions() {
|
||||
state.options = data.records ?? []
|
||||
if (props.autoFirst && state.options.length != 0) {
|
||||
state.selectId = state.options[0].id
|
||||
emit("change", state.selectId)
|
||||
emit("change", selectId)
|
||||
}
|
||||
const { wallet_type } = useDict("wallet_type")
|
||||
state.walletType = wallet_type
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
@visible-change="(e: boolean) => e && getOptions()"
|
||||
>
|
||||
<el-option v-for="v in state.options" :key="v.id" :label="`${v.name}`" :value="v.id">
|
||||
<div class="flex items-center">
|
||||
<div class="flex items-center justify-center">
|
||||
<div class="color-primary">{{ v.name }}</div>
|
||||
</div>
|
||||
</el-option>
|
||||
@@ -74,8 +74,8 @@ function remoteSearch(params: string) {
|
||||
}
|
||||
}
|
||||
|
||||
function clear() {
|
||||
state.selectId = null
|
||||
getOptions()
|
||||
}
|
||||
// function clear() {
|
||||
// state.selectId = null
|
||||
// getOptions()
|
||||
// }
|
||||
</script>
|
||||
@@ -14,6 +14,7 @@
|
||||
@node-click="handleNodeClick"
|
||||
@check="handleCheck"
|
||||
@visible-change="(e) => e && getOptions()"
|
||||
filterable
|
||||
clearable
|
||||
highlight-current
|
||||
default-expand-all
|
||||
|
||||
@@ -15,17 +15,21 @@ import PreviewImage from "/@/components/PreviewImage/index.vue"
|
||||
import DraggableDepTree from "/@/components/DraggableDepTree/index.vue"
|
||||
|
||||
// 业务组件
|
||||
import TreeMultipleSelect from "/@/components/TreeMultipleSelect/index.vue"
|
||||
|
||||
import SelectUser from "/@/components/Select/SelectUser.vue"
|
||||
import SelectWalletType from "/@/components/Select/SelectWalletType.vue"
|
||||
import SelectMch from "/@/components/Select/SelectMch.vue"
|
||||
import SelectDept from "/@/components/Select/SelectDept.vue"
|
||||
import SelectCtcg from "/@/components/Select/SelectCtcg.vue"
|
||||
import SelectCtcgol from "/@/components/Select/SelectCtcgol.vue"
|
||||
import SelectHardGroup from "/@/components/Select/selectHardGroup.vue"
|
||||
import SelectHandlerUser from "/@/components/Select/SelectHandlerUser.vue"
|
||||
import SelectSupplier from "/@/components/Select/SelectSupplier.vue"
|
||||
import SelectMchRule from "/@/components/Select/SelectMchRule.vue"
|
||||
import TreeMultipleSelect from "/@/components/TreeMultipleSelect/index.vue"
|
||||
import SelectHardSpuCategory from "/@/components/Select/SelectHardSpuCategory.vue"
|
||||
import SelectHard from "/@/components/Select/SelectHard.vue"
|
||||
import SelectHardSpu from "/@/components/Select/SelectHardSpu.vue"
|
||||
import SelectHardGroup from "/@/components/Select/selectHardGroup.vue"
|
||||
|
||||
// 第三方组件
|
||||
import ElementPlus from "element-plus"
|
||||
@@ -63,6 +67,9 @@ export default {
|
||||
app.component("PreviewImage", PreviewImage)
|
||||
app.component("DraggableDepTree", DraggableDepTree)
|
||||
app.component("TreeMultipleSelect", TreeMultipleSelect)
|
||||
app.component("SelectHard", SelectHard)
|
||||
app.component("SelectHardSpuCategory", SelectHardSpuCategory)
|
||||
app.component("SelectHardSpu", SelectHardSpu)
|
||||
|
||||
app.component("SelectUser", SelectUser)
|
||||
app.component("SelectWalletType", SelectWalletType)
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
<el-button plain v-auth="'sys_user_export'" class="ml10" icon="upload-filled" type="primary" @click="excelUploadRef.show()">
|
||||
导入
|
||||
</el-button>
|
||||
|
||||
<el-button
|
||||
plain
|
||||
v-auth="'sys_user_del'"
|
||||
@@ -47,7 +46,18 @@
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
|
||||
<el-button
|
||||
plain
|
||||
v-auth="'sys_user_del'"
|
||||
v-if="activeName == '1'"
|
||||
:disabled="multiple"
|
||||
class="ml10"
|
||||
icon="VideoPlay"
|
||||
type="primary"
|
||||
@click="doBatchDeal"
|
||||
>
|
||||
审批
|
||||
</el-button>
|
||||
<div class="flex justify-between items-center">
|
||||
<el-tabs class="flex-1" v-model="activeName" @tab-click="handleClickTabItem">
|
||||
<el-tab-pane v-for="v in tabItems" :key="v.id" :label="v.label" :name="v.value" />
|
||||
@@ -116,7 +126,7 @@
|
||||
v-auths="['sys_user_edit', 'userFace_sysUserFace_view', 'sys_user_del']"
|
||||
label="操作"
|
||||
min-width="300"
|
||||
width="400"
|
||||
width="300"
|
||||
fixed="right"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
@@ -149,7 +159,9 @@
|
||||
>
|
||||
人脸管理
|
||||
</el-button>
|
||||
<el-button type="primary" size="small" link icon="VideoPlay" @click="deal(row)"> 开始处理 </el-button>
|
||||
<el-button v-if="row.processStatus == 1" type="primary" size="small" link icon="VideoPlay" @click="deal(row)">
|
||||
开始处理
|
||||
</el-button>
|
||||
<!-- 删除用户 -->
|
||||
<el-tooltip content="admin 不允许被删除" :disabled="row.userId !== '1'" placement="top">
|
||||
<span style="margin-left: 12px">
|
||||
@@ -223,6 +235,7 @@ const multiple = ref(true)
|
||||
|
||||
// 定义表格查询、后台调用的API
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
dataList: [],
|
||||
queryForm: {
|
||||
deptId: "",
|
||||
username: "",
|
||||
@@ -268,6 +281,21 @@ const deal = (row: any) => {
|
||||
processDrawerRef.value.openProcessDrawer(row)
|
||||
}
|
||||
|
||||
// 批量开始处理
|
||||
const doBatchDeal = () => {
|
||||
if (!selectObjs.value.length) return useMessage().warning("流程id不存在")
|
||||
const processIds = []
|
||||
for (const i of selectObjs.value) {
|
||||
for (const j of state.dataList!) {
|
||||
if (i == j.id) {
|
||||
processIds.push(j.processId)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!processIds.length) return useMessage().warning("流程id不存在")
|
||||
}
|
||||
|
||||
// 审批提交事件
|
||||
const taskSubmitEvent = () => {
|
||||
getDataList()
|
||||
|
||||
@@ -17,6 +17,12 @@
|
||||
<el-form-item style="width: 200px" label="用餐时间段" prop="hourType">
|
||||
<dict-select v-model="state.queryForm.hourType" dict-code="daily_menu" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 250px" label="商户类型" prop="merchantType">
|
||||
<dict-select v-model="state.queryForm.merchantType" dict-code="merchant_type" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 250px" label="商户" prop="merchantId">
|
||||
<select-mch v-model="state.queryForm.merchantId" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 450px" label="创建时间" prop="payTimeList">
|
||||
<el-date-picker v-model="state.queryForm.payTimeList" value-format="YYYY-MM-DD HH:mm:ss" type="datetimerange" />
|
||||
</el-form-item>
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" width="30%" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商户" prop="mchId">
|
||||
<select-mch v-model="form.mchId" :apiParams="{ types: '2' }" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="分类名" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入分类名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<template #label>
|
||||
<span>排序</span>
|
||||
<tip content="越大越在前" />
|
||||
</template>
|
||||
<el-input-number :min="0" :step="1" v-model="form.sort" placeholder="" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="HardSpuCategoryDialog">
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { useMessage } from "/@/hooks/message"
|
||||
import * as hardSpuCategory from "/@/api/hard/hard-spu-category"
|
||||
const emit = defineEmits(["refresh"])
|
||||
|
||||
// 定义变量内容
|
||||
const dataFormRef = ref()
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
// 定义字典
|
||||
|
||||
// 提交表单数据
|
||||
const form = reactive({
|
||||
id: "",
|
||||
mchId: "",
|
||||
name: "",
|
||||
sort: 0,
|
||||
})
|
||||
|
||||
// 定义校验规则
|
||||
const dataRules = ref({
|
||||
mchId: [{ required: true, message: "请选择商户", trigger: "change" }],
|
||||
name: [{ required: true, message: "分类名不能为空", trigger: "blur" }],
|
||||
sort: [{ required: true, message: "商户不能为空", trigger: "blur" }],
|
||||
})
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true
|
||||
form.id = ""
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
})
|
||||
|
||||
// 获取hardSpuCategory信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
gethardSpuCategoryData(id)
|
||||
}
|
||||
}
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
if (!valid) return false
|
||||
|
||||
try {
|
||||
loading.value = true
|
||||
form.id ? await hardSpuCategory.putObj(form) : await hardSpuCategory.addObj(form)
|
||||
useMessage().success(form.id ? "修改成功" : "添加成功")
|
||||
visible.value = false
|
||||
emit("refresh")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化表单数据
|
||||
const gethardSpuCategoryData = (id: string) => {
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
hardSpuCategory
|
||||
.getObj(id)
|
||||
.then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
.finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 暴露变量
|
||||
defineExpose({
|
||||
openDialog,
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,147 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form v-if="showSearch" ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList">
|
||||
<el-row>
|
||||
<el-form-item style="width: 300px" label="分类" prop="name">
|
||||
<el-input v-model="state.queryForm.name" placeholder="请输入分类" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="getDataList">
|
||||
{{ $t("common.queryBtn") }}
|
||||
</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">{{ $t("common.resetBtn") }}</el-button>
|
||||
</el-form-item>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'hard_hardSpuCategory_add'">
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button
|
||||
plain
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
type="primary"
|
||||
v-auth="'hard_hardSpuCategory_del'"
|
||||
@click="handleDelete(selectObjs)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'hard_hardSpuCategory_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right"
|
||||
@queryTable="getDataList"
|
||||
></right-toolbar>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="name" label="分类名" show-overflow-tooltip />
|
||||
<el-table-column label="商户" show-overflow-tooltip>
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.merchantName }} </span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="sort" label="排序" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
icon="edit-pen"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'hard_hardSpuCategory_edit'"
|
||||
@click="formDialogRef.openDialog(scope.row.id)"
|
||||
>编辑</el-button
|
||||
>
|
||||
<el-button icon="delete" text type="primary" v-auth="'hard_hardSpuCategory_del'" @click="handleDelete([scope.row.id])"
|
||||
>删除</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 编辑、新增 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemHardSpuCategory">
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as hardSpuCategory from "/@/api/hard/hard-spu-category"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
// 定义查询字典
|
||||
|
||||
// 定义变量内容
|
||||
const formDialogRef = ref()
|
||||
// 搜索变量
|
||||
const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
// 多选变量
|
||||
const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
pageList: hardSpuCategory.pageJoin,
|
||||
})
|
||||
|
||||
// table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
|
||||
|
||||
// 清空搜索条件
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields()
|
||||
// 清空多选
|
||||
selectObjs.value = []
|
||||
getDataList()
|
||||
}
|
||||
|
||||
// 导出excel
|
||||
const exportExcel = () => {
|
||||
downBlobFile("/hard/hardSpuCategory/export", Object.assign(state.queryForm, { ids: selectObjs }), "hardSpuCategory.xlsx")
|
||||
}
|
||||
|
||||
// 多选事件
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id)
|
||||
multiple.value = !objs.length
|
||||
}
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm("此操作将永久删除")
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await hardSpuCategory.delObjs(ids)
|
||||
getDataList()
|
||||
useMessage().success("删除成功")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,105 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" width="40%" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="120px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品" prop="spuId">
|
||||
<select-hard-spu v-model="form.spuId" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="更新库存量" prop="count">
|
||||
<el-input-number style="width: 100%" :min="0" :step="1" v-model="form.count" placeholder="" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="HardSpuRepertoryDialog">
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { useMessage } from "/@/hooks/message"
|
||||
import { getObj, addObj, putObj } from "/@/api/hard/hard-spu-repertory"
|
||||
const emit = defineEmits(["refresh"])
|
||||
|
||||
// 定义变量内容
|
||||
const dataFormRef = ref()
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
// 定义字典
|
||||
|
||||
// 提交表单数据
|
||||
const form = reactive({
|
||||
id: "",
|
||||
userId: "",
|
||||
hardId: "",
|
||||
spuId: "",
|
||||
count: "",
|
||||
})
|
||||
|
||||
// 定义校验规则
|
||||
const dataRules = ref({
|
||||
spuId: [{ required: true, message: "请选择商品", trigger: "change" }],
|
||||
count: [{ required: true, message: "请输入库存量", trigger: "blur" }],
|
||||
})
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true
|
||||
form.id = ""
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
})
|
||||
|
||||
// 获取hardSpuRepertory信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
gethardSpuRepertoryData(id)
|
||||
}
|
||||
}
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
if (!valid) return false
|
||||
|
||||
try {
|
||||
loading.value = true
|
||||
form.id ? await putObj(form) : await addObj(form)
|
||||
useMessage().success(form.id ? "修改成功" : "添加成功")
|
||||
visible.value = false
|
||||
emit("refresh")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化表单数据
|
||||
const gethardSpuRepertoryData = (id: string) => {
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
getObj(id)
|
||||
.then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
.finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 暴露变量
|
||||
defineExpose({
|
||||
openDialog,
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,131 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'hard_hardSpuRepertory_add'">
|
||||
更新库存
|
||||
</el-button>
|
||||
<el-button
|
||||
plain
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
type="primary"
|
||||
v-auth="'hard_hardSpuRepertory_del'"
|
||||
@click="handleDelete(selectObjs)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'hard_hardSpuRepertory_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right"
|
||||
@queryTable="getDataList"
|
||||
></right-toolbar>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="userId" label="用户id" show-overflow-tooltip />
|
||||
<el-table-column prop="hardId" label="设备id" show-overflow-tooltip />
|
||||
<el-table-column prop="spuId" label="商品id" show-overflow-tooltip />
|
||||
<el-table-column prop="count" label="更新库存数量" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
icon="edit-pen"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'hard_hardSpuRepertory_edit'"
|
||||
@click="formDialogRef.openDialog(scope.row.id)"
|
||||
>编辑</el-button
|
||||
>
|
||||
<el-button icon="delete" text type="primary" v-auth="'hard_hardSpuRepertory_del'" @click="handleDelete([scope.row.id])"
|
||||
>删除</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 编辑、新增 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemHardSpuRepertory">
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import { fetchList, delObjs } from "/@/api/hard/hard-spu-repertory"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
// 定义查询字典
|
||||
|
||||
// 定义变量内容
|
||||
const formDialogRef = ref()
|
||||
// 搜索变量
|
||||
const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
// 多选变量
|
||||
const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
pageList: fetchList,
|
||||
})
|
||||
|
||||
// table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
|
||||
|
||||
// 清空搜索条件
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields()
|
||||
// 清空多选
|
||||
selectObjs.value = []
|
||||
getDataList()
|
||||
}
|
||||
|
||||
// 导出excel
|
||||
const exportExcel = () => {
|
||||
downBlobFile("/hard/hardSpuRepertory/export", Object.assign(state.queryForm, { ids: selectObjs }), "hardSpuRepertory.xlsx")
|
||||
}
|
||||
|
||||
// 多选事件
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id)
|
||||
multiple.value = !objs.length
|
||||
}
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm("此操作将永久删除")
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await delObjs(ids)
|
||||
getDataList()
|
||||
useMessage().success("删除成功")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,174 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" width="40%" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="100px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="设备" prop="hardId">
|
||||
<select-hard v-model="form.hardId" :apiParams="{ type: '4' }" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item prop="hardDoorNumber">
|
||||
<template #label>
|
||||
<span>商品层数</span>
|
||||
<tip content="商品在智能柜的层数,按层数放置会提高识别率" />
|
||||
</template>
|
||||
<el-input-number :min="0" :step="1" v-model="form.hardDoorNumber" placeholder="" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品名" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入商品名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="分类" prop="spuCategoryId">
|
||||
<select-hard-spu-category v-model="form.spuCategoryId" :apiParams="{ hardId: form.hardId }" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="商品图片" prop="pic">
|
||||
<upload-imgs v-model="form.pic" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="单价" prop="price">
|
||||
<el-input-number :precision="2" :min="0" :step="1" v-model="form.price" placeholder="" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<template #label>
|
||||
<span>排序</span>
|
||||
<tip content="越大越在前" />
|
||||
</template>
|
||||
<el-input-number :min="0" :step="1" v-model="form.sort" placeholder="" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" class="mb20">
|
||||
<el-form-item label="是否启用" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="v in yes_no_type" :key="v.value" :label="v.value" border>
|
||||
{{ v.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12" class="mb20">
|
||||
<el-form-item prop="isDefault">
|
||||
<template #label>
|
||||
<span>是否标品</span>
|
||||
<tip content="选择是,该商品将会根据商品图片建模" />
|
||||
</template>
|
||||
<el-radio-group v-model="form.isDefault">
|
||||
<el-radio v-for="v in yes_no_type" :key="v.value" :label="v.value" border>
|
||||
{{ v.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="HardSpuDialog">
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { useMessage } from "/@/hooks/message"
|
||||
import * as hardSpu from "/@/api/hard/hard-spu"
|
||||
const emit = defineEmits(["refresh"])
|
||||
|
||||
// 定义变量内容
|
||||
const dataFormRef = ref()
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
// 定义字典
|
||||
const { yes_no_type } = useDict("yes_no_type")
|
||||
// 提交表单数据
|
||||
const form = reactive({
|
||||
id: "",
|
||||
hardId: "",
|
||||
spuCategoryId: "",
|
||||
name: "",
|
||||
pic: "",
|
||||
price: 0,
|
||||
salesCount: 0,
|
||||
repertoryCount: 0,
|
||||
sort: 0,
|
||||
hardDoorNumber: "",
|
||||
status: "1",
|
||||
isDefault: "0",
|
||||
})
|
||||
|
||||
// 定义校验规则
|
||||
const dataRules = ref({
|
||||
name: [{ required: true, message: "请输入商品名", trigger: "blur" }],
|
||||
hardId: [{ required: true, message: "请选择设备", trigger: "blur" }],
|
||||
spuCategoryId: [{ required: true, message: "请选择分类", trigger: "change" }],
|
||||
pic: [{ required: true, message: "请选择图片", trigger: "change" }],
|
||||
price: [{ required: true, message: "请输入价格", trigger: "blur" }],
|
||||
sort: [{ required: true, message: "请输入排序", trigger: "blur" }],
|
||||
status: [{ required: true, message: "请选择是否启用", trigger: "change" }],
|
||||
isDefault: [{ required: true, message: "请选择是否标品", trigger: "change" }],
|
||||
})
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true
|
||||
form.id = ""
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
})
|
||||
|
||||
// 获取hardSpu信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
gethardSpuData(id)
|
||||
}
|
||||
}
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
if (!valid) return false
|
||||
|
||||
try {
|
||||
loading.value = true
|
||||
form.id ? await hardSpu.putObj(form) : await hardSpu.addObj(form)
|
||||
useMessage().success(form.id ? "修改成功" : "添加成功")
|
||||
visible.value = false
|
||||
emit("refresh")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化表单数据
|
||||
const gethardSpuData = (id: string) => {
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
hardSpu
|
||||
.getObj(id)
|
||||
.then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
.finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 暴露变量
|
||||
defineExpose({
|
||||
openDialog,
|
||||
})
|
||||
</script>
|
||||
@@ -0,0 +1,159 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'hard_hardSpu_add'">
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button plain :disabled="multiple" icon="Delete" type="primary" v-auth="'hard_hardSpu_del'" @click="handleDelete(selectObjs)">
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'hard_hardSpu_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right"
|
||||
@queryTable="getDataList"
|
||||
></right-toolbar>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column prop="name" width="120" label="商品名" />
|
||||
<el-table-column prop="pic" width="120" label="商品图片">
|
||||
<template #default="{ row }">
|
||||
<preview-image width="50px" height="50px" :src="row.pic" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="categoryName" width="120" label="分类" />
|
||||
<el-table-column width="150" label="商户">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.merchantName }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="150" label="设备名">
|
||||
<template #default="{ row }">
|
||||
<span>{{ row.hardName }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="price" label="单价">
|
||||
<template #default="{ row }">
|
||||
<span class="color-success">{{ displayPrice(row.price) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="salesCount" label="销量">
|
||||
<template #default="{ row }">
|
||||
<span class="color-primary">{{ row.salesCount }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="repertoryCount" label="库存">
|
||||
<template #default="{ row }">
|
||||
<span class="color-primary">{{ row.repertoryCount }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="sort" label="排序" />
|
||||
<el-table-column prop="status" label="是否启用">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :options="yes_no_type" :value="row.status" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isDefault" label="是否标品">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :options="yes_no_type" :value="row.isDefault" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="150">
|
||||
<template #default="scope">
|
||||
<el-button icon="edit-pen" text type="primary" v-auth="'hard_hardSpu_edit'" @click="formDialogRef.openDialog(scope.row.id)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button icon="delete" text type="primary" v-auth="'hard_hardSpu_del'" @click="handleDelete([scope.row.id])">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 编辑、新增 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemHardSpu">
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as hardSpu from "/@/api/hard/hard-spu"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
// 定义查询字典
|
||||
const { yes_no_type } = useDict("yes_no_type")
|
||||
// 定义变量内容
|
||||
const formDialogRef = ref()
|
||||
// 搜索变量
|
||||
const queryRef = ref()
|
||||
const showSearch = ref(true)
|
||||
// 多选变量
|
||||
const selectObjs = ref([]) as any
|
||||
const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
pageList: hardSpu.pageJoin,
|
||||
})
|
||||
|
||||
// table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state)
|
||||
|
||||
// 清空搜索条件
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields()
|
||||
// 清空多选
|
||||
selectObjs.value = []
|
||||
getDataList()
|
||||
}
|
||||
|
||||
// 导出excel
|
||||
const exportExcel = () => {
|
||||
downBlobFile("/hard/hardSpu/export", Object.assign(state.queryForm, { ids: selectObjs }), "hardSpu.xlsx")
|
||||
}
|
||||
|
||||
// 多选事件
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id)
|
||||
multiple.value = !objs.length
|
||||
}
|
||||
|
||||
// 删除操作
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm("此操作将永久删除")
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await hardSpu.delObjs(ids)
|
||||
getDataList()
|
||||
useMessage().success("删除成功")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -290,7 +290,7 @@ const svg = `<path class="path" d="
|
||||
const dataRules = ref({
|
||||
inventoryCode: [{ required: true, message: "出入库记录表编号不能为空", trigger: "blur" }],
|
||||
inventoryDate: [{ required: true, message: "出入库记录表单据日期不能为空", trigger: "blur" }],
|
||||
handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
// handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
supplierId: [{ required: true, message: "货商不能为空", trigger: "blur" }],
|
||||
})
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
<dict-tag :options="check_status" :value="scope.row.checkStatus" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="supplierId" label="货商" show-overflow-tooltip />
|
||||
<el-table-column prop="supplierName" label="货商" show-overflow-tooltip />
|
||||
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
||||
<el-table-column prop="totalAmount" label="入库总金额" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150">
|
||||
|
||||
@@ -28,20 +28,15 @@
|
||||
:disabled="disabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批状态" prop="checkStatus">
|
||||
<el-select v-model="baseDataForm.checkStatus" placeholder="请选择审批状态" style="width: 200px">
|
||||
<el-option :label="item.label" :value="item.value" v-for="(item, index) in check_status" :key="index" :disabled="disabled" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="货商" prop="supplierId">
|
||||
<select-supplier v-model="baseDataForm.supplierId" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model.trim="baseDataForm.remark" placeholder="请输入备注" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="会员卡号" prop="memberNumber">
|
||||
<el-input v-model.trim="baseDataForm.memberNumber" placeholder="请输入会员卡号" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="会员卡号" prop="memberNumber">-->
|
||||
<!-- <el-input v-model.trim="baseDataForm.memberNumber" placeholder="请输入会员卡号" style="width: 200px" :disabled="disabled" />-->
|
||||
<!-- </el-form-item>-->
|
||||
</div>
|
||||
</el-form>
|
||||
<div v-else ref="baseDataInfoRef">
|
||||
@@ -336,7 +331,7 @@ const receiveAmountForm = reactive<{ receiveAmount: number }>({
|
||||
const dataRules = ref({
|
||||
inventoryCode: [{ required: true, message: "出入库记录表编号不能为空", trigger: "blur" }],
|
||||
inventoryDate: [{ required: true, message: "出入库记录表单据日期不能为空", trigger: "blur" }],
|
||||
handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
// handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
supplierId: [{ required: true, message: "货商不能为空", trigger: "blur" }],
|
||||
})
|
||||
|
||||
|
||||
@@ -28,20 +28,15 @@
|
||||
:disabled="disabled"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="审批状态" prop="checkStatus">
|
||||
<el-select v-model="baseDataForm.checkStatus" placeholder="请选择审批状态" style="width: 200px">
|
||||
<el-option :label="item.label" :value="item.value" v-for="(item, index) in check_status" :key="index" :disabled="disabled" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="货商" prop="supplierId">
|
||||
<select-supplier v-model="baseDataForm.supplierId" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注" prop="remark">
|
||||
<el-input v-model.trim="baseDataForm.remark" placeholder="请输入备注" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<el-form-item label="会员卡号" prop="memberNumber">
|
||||
<el-input v-model.trim="baseDataForm.memberNumber" placeholder="请输入会员卡号" style="width: 200px" :disabled="disabled" />
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="会员卡号" prop="memberNumber">-->
|
||||
<!-- <el-input v-model.trim="baseDataForm.memberNumber" placeholder="请输入会员卡号" style="width: 200px" :disabled="disabled" />-->
|
||||
<!-- </el-form-item>-->
|
||||
</div>
|
||||
</el-form>
|
||||
<div v-else ref="baseDataInfoRef">
|
||||
@@ -326,7 +321,7 @@ const receiveAmountForm = reactive<{ receiveAmount: number }>({
|
||||
const dataRules = ref({
|
||||
inventoryCode: [{ required: true, message: "出入库记录表编号不能为空", trigger: "blur" }],
|
||||
inventoryDate: [{ required: true, message: "出入库记录表单据日期不能为空", trigger: "blur" }],
|
||||
handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
// handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||
supplierId: [{ required: true, message: "货商不能为空", trigger: "blur" }],
|
||||
})
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<el-row>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="总库存" prop="stock" class="flex w-full h-full">
|
||||
<el-form-item label="期初库存" prop="stock" class="flex w-full h-full">
|
||||
<el-input-number v-model="stock" :min="0" :precision="0" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
/>
|
||||
<el-button
|
||||
plain
|
||||
v-auth="'supermarket_supermarketSpu_export'"
|
||||
v-auth="'supermarket_supermarketSpu_import'"
|
||||
class="ml10"
|
||||
icon="upload-filled"
|
||||
type="primary"
|
||||
@@ -96,7 +96,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- <el-table-column prop="costPrice" label="成本单价" show-overflow-tooltip width="100" /> -->
|
||||
<el-table-column prop="stock" label="库存" show-overflow-tooltip />
|
||||
<el-table-column prop="stock" label="总库存" show-overflow-tooltip />
|
||||
<!-- <el-table-column prop="giveIntegral" label="赠送积分" show-overflow-tooltip /> -->
|
||||
<!-- <el-table-column prop="merchantId" label="商户编号" show-overflow-tooltip /> -->
|
||||
<!-- <el-table-column prop="specification" label="规格" show-overflow-tooltip /> -->
|
||||
|
||||
+3
-2
@@ -10,8 +10,8 @@
|
||||
</el-col>
|
||||
|
||||
<el-col :span="12" class="mb20">
|
||||
<el-form-item label="是否删除" prop="deleted">
|
||||
<el-input v-model="form.deleted" placeholder="请输入是否删除"/>
|
||||
<el-form-item label="请求参数" prop="requestParameter">
|
||||
<el-input v-model="form.requestParameter" placeholder="请输入请求参数"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
@@ -79,6 +79,7 @@ const form = reactive({
|
||||
responseBody: '',
|
||||
errorCode: '',
|
||||
errorMsg: '',
|
||||
requestParameter:'',
|
||||
});
|
||||
|
||||
// 定义校验规则
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="apiName" label="接口名称" show-overflow-tooltip/>
|
||||
<el-table-column prop="deleted" label="是否删除" show-overflow-tooltip/>
|
||||
<el-table-column prop="requestParameter" label="请求参数" show-overflow-tooltip/>
|
||||
<el-table-column prop="requestUrl" label="请求路径" show-overflow-tooltip/>
|
||||
<el-table-column prop="httpStatus" label="状态码" show-overflow-tooltip/>
|
||||
<el-table-column prop="errorCode" label="错误码(如-1)" show-overflow-tooltip/>
|
||||
|
||||
@@ -109,7 +109,11 @@
|
||||
label="操作"
|
||||
fixed="right"
|
||||
width="250"
|
||||
v-auths="['wallet_walletManage_edit', 'wallet_walletTransaction_update_balance']"
|
||||
v-auths="[
|
||||
'wallet_walletManage_edit',
|
||||
'wallet_walletTransaction_update_balance',
|
||||
'wallet_walletRuleTransaction_transfer_accounts',
|
||||
]"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
<div class="flex items-start">
|
||||
@@ -134,7 +138,7 @@
|
||||
icon="SwitchFilled"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'wallet_walletTransaction_update_balance'"
|
||||
v-auth="'wallet_walletRuleTransaction_transfer'"
|
||||
@click="doTransferAccounts(row)"
|
||||
>
|
||||
转账
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<el-dialog title="转账" v-model="visible" width="60%" :close-on-click-modal="false" draggable>
|
||||
<div>
|
||||
<el-alert title="错误" type="error">
|
||||
<el-alert v-if="errorMsg && errorMsg != ' '" title="错误" type="error">
|
||||
<span>{{ errorMsg }}</span>
|
||||
<span>请配置</span>
|
||||
</el-alert>
|
||||
@@ -14,18 +14,46 @@
|
||||
<span>{{ userConfigDetail.userMobile }}</span>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions :column="2" border title="钱包">
|
||||
<el-descriptions :column="2" border title="转账前">
|
||||
<el-descriptions-item :rowspan="1" label="源钱包: ">
|
||||
<span class="color-primary">{{ walletDetail.walletTypeName }}</span>
|
||||
<span class="color-primary">{{ userConfigDetail.sourceWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="源余额: ">
|
||||
<span class="color-success">{{ displayPrice(walletDetail.balance) }}</span>
|
||||
<el-descriptions-item :rowspan="1" label="源钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.sourceWalletBalance) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包: ">
|
||||
<span class="color-primary">{{ walletDetail.username }}</span>
|
||||
<span class="color-primary">{{ userConfigDetail.targetWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标余额: ">
|
||||
<span class="color-success">{{ walletDetail.username }}</span>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.targetWalletBalance) }}</span>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions :column="2" border title="转账后">
|
||||
<el-descriptions-item :rowspan="1" label="源钱包: ">
|
||||
<span class="color-primary">{{ userConfigDetail.sourceWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="源钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.sourceWalletBalance - form.balance * 100) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包: ">
|
||||
<span class="color-primary">{{ userConfigDetail.targetWalletTypeName }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包余额: ">
|
||||
<span class="color-success">{{ displayPrice(userConfigDetail.targetWalletBalance + form.balance * 100) }}</span>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<el-descriptions :column="2" border title="转账统计">
|
||||
<el-descriptions-item :rowspan="1" label="转账百分比: ">
|
||||
<span class="color-primary">{{ userConfigDetail.balanceMultiple }}%</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="源钱包充值总金额: ">
|
||||
<span class="color-primary">{{ displayPrice(userConfigDetail.totalTopUpBalance) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="源钱包支持最大转账金额: ">
|
||||
<span class="color-primary">{{ displayPrice(userConfigDetail.maxTransferBalance) }}</span>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item :rowspan="1" label="目标钱包已转账金额: "
|
||||
>{{ displayPrice(userConfigDetail.totalTransferBalance) }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
@@ -33,7 +61,7 @@
|
||||
<span>用户</span>
|
||||
<span class="color-primary">{{ walletDetail.username }}</span>
|
||||
<span>将</span>
|
||||
<el-input-number :disabled="errorMsg" class="mx-1" style="width: 200px" :min="1" :max="200" v-model="form.balance" placeholder="" />
|
||||
<el-input-number class="mx-1" style="width: 200px" :min="1" :max="5000" v-model="form.balance" placeholder="" />
|
||||
<span>元从</span>
|
||||
<span class="color-primary">{{ walletDetail.walletTypeName }}</span>
|
||||
<span>转到</span>
|
||||
@@ -61,7 +89,7 @@
|
||||
import { useMessage } from "/@/hooks/message"
|
||||
import * as walletApi from "/@/api/wallet/wallet-manage"
|
||||
import * as walletRuleJoin from "/@/api/wallet/wallet-rule-join"
|
||||
import * as walletTransactionApi from "/@/api/wallet/wallet-transaction"
|
||||
import * as walletRuleTransactionApi from "/@/api/wallet/wallet-rule-transaction"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
import { convertToInteger } from "/@/utils/convert"
|
||||
const emit = defineEmits(["refresh"])
|
||||
@@ -83,7 +111,7 @@ const walletDetail = reactive<any>({})
|
||||
|
||||
const userConfigDetail = reactive<any>({})
|
||||
|
||||
const errorMsg = ref<string>("")
|
||||
const errorMsg = ref<string>(" ")
|
||||
|
||||
/** 变动后的余额 */
|
||||
const balanceResult = computed(() => displayPrice(convertToInteger(form.balance) + convertToInteger(form.changeBalance) * form.changeType))
|
||||
@@ -108,28 +136,19 @@ const openDialog = (userId: string, id: string) => {
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
if (!valid) return false
|
||||
if (form.changeBalance <= 0) {
|
||||
useMessage().error("变动余额不能为零")
|
||||
return
|
||||
}
|
||||
if (convertToInteger(balanceResult.value) < 0) {
|
||||
useMessage().error("变动后的余额不能小于 0")
|
||||
if (form.balance <= 0) {
|
||||
useMessage().error("转账余额不能为0")
|
||||
return
|
||||
}
|
||||
try {
|
||||
loading.value = true
|
||||
const pa = {
|
||||
...form,
|
||||
userId: form.id,
|
||||
walletId: form.walletId,
|
||||
balance: form.changeBalance * 100,
|
||||
userId: userConfigDetail.userId,
|
||||
sourceWalletTypeId: userConfigDetail.sourceWalletTypeId,
|
||||
targetWalletTypeId: userConfigDetail.targetWalletTypeId,
|
||||
balance: Math.abs(form.balance * 100),
|
||||
}
|
||||
if (pa.changeType == -1) {
|
||||
pa.balance = -1 * pa.balance
|
||||
}
|
||||
await walletTransactionApi.updateBalance(pa)
|
||||
await walletRuleTransactionApi.transferAccounts(pa)
|
||||
useMessage().success("操作成功")
|
||||
visible.value = false
|
||||
emit("refresh")
|
||||
@@ -168,7 +187,8 @@ const getUserConfig = async (userId: any, sourceWalletId: any, targetWalletId: a
|
||||
try {
|
||||
const { data } = await walletRuleJoin.userConfig(_pa)
|
||||
if (!data) return
|
||||
Object.assign(data, userConfigDetail)
|
||||
Object.assign(userConfigDetail, data)
|
||||
errorMsg.value = ""
|
||||
} catch (e: any) {
|
||||
errorMsg.value = e.msg
|
||||
useMessage().error(e.msg)
|
||||
@@ -187,7 +207,7 @@ defineExpose({
|
||||
}
|
||||
|
||||
.el-descriptions__cell.is-bordered-label {
|
||||
width: 100px;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.el-descriptions__cell.is-bordered-content {
|
||||
|
||||
@@ -12,6 +12,18 @@
|
||||
:nodeClickable="false"
|
||||
>
|
||||
<el-form ref="queryRef" :inline="true" :model="state.queryForm" @keyup.enter="getDataList">
|
||||
<el-form-item style="width: 250px" label="用户" prop="userId">
|
||||
<select-user v-model="state.queryForm.userId" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 250px" label="是否退回" prop="isRefund">
|
||||
<dict-select v-model="state.queryForm.isRefund" dict-code="yes_no_type" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 350px" label="转账时间" prop="createTimeList">
|
||||
<el-date-picker v-model="state.queryForm.createTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<el-form-item style="width: 350px" label="退回时间" prop="refundTimeList">
|
||||
<el-date-picker v-model="state.queryForm.refundTimeList" value-format="YYYY-MM-DD" type="daterange" />
|
||||
</el-form-item>
|
||||
<el-row>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="getDataList">
|
||||
@@ -46,29 +58,75 @@
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="80" />
|
||||
<el-table-column label="用户">
|
||||
<el-table-column width="120" prop="username" label="姓名" />
|
||||
<el-table-column width="120" prop="userMobile" label="手机号" />
|
||||
<el-table-column width="120" prop="userDeptName" label="部门" />
|
||||
</el-table-column>
|
||||
<el-table-column label="源钱包">
|
||||
<el-table-column prop="sourceWalletId" label="源钱包" />
|
||||
<el-table-column prop="sourceWalletBalance" label="源钱包余额" />
|
||||
<el-table-column width="100" prop="sourceWalletId" label="源钱包">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div class="color-primary">{{ row.sourceWalletTypeName }}</div>
|
||||
<div class="flex items-center just ml5">
|
||||
<dict-tag :options="wallet_type" :value="row.sourceWalletTypeCode" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="100" prop="sourceWalletBalance" label="源钱包余额">
|
||||
<template #default="{ row }">
|
||||
<span class="color-primary">{{ displayPrice(row.sourceWalletBalance) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column label="目标钱包">
|
||||
<el-table-column prop="sourceWalletId" label="源钱包" />
|
||||
<el-table-column prop="sourceWalletBalance" label="源钱包余额" />
|
||||
<el-table-column width="110" label="目标钱包">
|
||||
<template #default="{ row }">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<div class="color-primary">{{ row.targetWalletTypeName }}</div>
|
||||
<div class="flex items-center just ml5">
|
||||
<dict-tag :options="wallet_type" :value="row.targetWalletTypeCode" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="110" prop="sourceWalletBalance" label="目标钱包余额">
|
||||
<template #default="{ row }">
|
||||
<span class="color-success">{{ displayPrice(row.targetWalletBalance) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column label="转换">
|
||||
<el-table-column prop="balance" label="转换金额" />
|
||||
<el-table-column prop="balanceMultiple" label="百分比" />
|
||||
<el-table-column prop="afterBalance" label="转换后的金额" />
|
||||
<el-table-column width="110" prop="balance" label="转换金额">
|
||||
<template #default="{ row }">
|
||||
<span class="color-primary">{{ displayPrice(row.balance) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="110" label="转换后的金额">
|
||||
<template #default="{ row }">
|
||||
<span class="color-success">{{ displayPrice(row.afterBalance) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="status" label="是否退回" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-table-column width="100" label="退回">
|
||||
<el-table-column width="100" label="是否退回">
|
||||
<template #default="{ row }">
|
||||
<dict-tag :options="yes_no_type" :value="row.isRefund" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="refundTime" width="170" label="退回时间" />
|
||||
</el-table-column>
|
||||
<el-table-column prop="createTime" width="170" label="创建时间" />
|
||||
<el-table-column label="操作" fixed="right" width="80" v-auths="['wallet_walletRuleTransaction_refund']">
|
||||
<template #default="{ row }">
|
||||
<el-button
|
||||
v-if="false"
|
||||
icon="edit-pen"
|
||||
v-if="row.isRefund == '0'"
|
||||
icon="RefreshRight"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'wallet_walletRuleTransaction_edit'"
|
||||
@click="formDialogRef.openDialog(scope.row.id)"
|
||||
v-auth="'wallet_walletRuleTransaction_refund'"
|
||||
@click="doRefund(row)"
|
||||
>
|
||||
退回
|
||||
</el-button>
|
||||
@@ -89,11 +147,12 @@ import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||
import * as walletRuleTransactionApi from "/@/api/wallet/wallet-rule-transaction"
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { displayPrice } from "/@/utils/formatMoney"
|
||||
|
||||
// 引入组件
|
||||
const FormDialog = defineAsyncComponent(() => import("./form.vue"))
|
||||
// 定义查询字典
|
||||
|
||||
const { wallet_type, yes_no_type } = useDict("wallet_type", "yes_no_type")
|
||||
// 定义变量内容
|
||||
const formDialogRef = ref()
|
||||
// 搜索变量
|
||||
@@ -106,7 +165,7 @@ const multiple = ref(true)
|
||||
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
pageList: walletRuleTransactionApi.fetchList,
|
||||
pageList: walletRuleTransactionApi.pageJoin,
|
||||
})
|
||||
|
||||
// table hook
|
||||
@@ -117,6 +176,22 @@ const exportExcel = () => {
|
||||
downBlobFile("/wallet/walletRuleTransaction/export", Object.assign(state.queryForm, { ids: selectObjs }), "walletRuleTransaction.xlsx")
|
||||
}
|
||||
|
||||
// 退款
|
||||
const doRefund = async (row: any) => {
|
||||
try {
|
||||
await useMessageBox().confirm(`是否退回用户从${row.sourceWalletTypeName}转到${row.targetWalletTypeName}的${displayPrice(row.balance)}`)
|
||||
} catch {
|
||||
return
|
||||
}
|
||||
try {
|
||||
await walletRuleTransactionApi.refund({ id: row.id })
|
||||
getDataList()
|
||||
useMessage().success("退回成功")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
}
|
||||
}
|
||||
|
||||
// 多选事件
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id)
|
||||
|
||||
@@ -1,130 +1,130 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" width="30%" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="套餐名" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入套餐名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" width="30%" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="套餐名" prop="name">
|
||||
<el-input v-model="form.name" placeholder="请输入套餐名" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="支付金额" prop="payPrice">
|
||||
<el-input-number v-model="form.payPrice" :min="0" :precision="2" :step="0.01" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="支付金额" prop="payPrice">
|
||||
<el-input-number v-model="form.payPrice" :min="0" :precision="2" :step="0.01" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="赠送金额" prop="bonusPrice">
|
||||
<el-input-number v-model="form.bonusPrice" :min="0" :precision="2" :step="0.01" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="赠送金额" prop="bonusPrice">
|
||||
<el-input-number v-model="form.bonusPrice" :min="0" :precision="2" :step="0.01" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="是否启用" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="v in yes_no_type" :key="v.value" :label="v.value">
|
||||
{{ v.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="是否启用" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio v-for="v in yes_no_type" :key="v.value" :label="v.value">
|
||||
{{ v.label }}
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="WalletRechargePackageDialog">
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { useMessage } from "/@/hooks/message";
|
||||
import { getObj, addObj, putObj } from "/@/api/wallet/wallet-recharge-package";
|
||||
import { rule } from '/@/utils/validate';
|
||||
import { useDict } from "/@/hooks/dict"
|
||||
import { useMessage } from "/@/hooks/message"
|
||||
import { getObj, addObj, putObj } from "/@/api/wallet/wallet-recharge-package"
|
||||
import { rule } from "/@/utils/validate"
|
||||
import { storePrice } from "/@/utils/formatMoney"
|
||||
const emit = defineEmits(['refresh']);
|
||||
const emit = defineEmits(["refresh"])
|
||||
|
||||
// 定义变量内容
|
||||
const dataFormRef = ref();
|
||||
const dataFormRef = ref()
|
||||
const visible = ref(false)
|
||||
const loading = ref(false)
|
||||
// 定义查询字典
|
||||
const { yes_no_type } = useDict('yes_no_type');
|
||||
const { yes_no_type } = useDict("yes_no_type")
|
||||
// 提交表单数据
|
||||
const form = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
payPrice: '',
|
||||
bonusPrice: '',
|
||||
status: "1",
|
||||
});
|
||||
id: "",
|
||||
name: "",
|
||||
payPrice: "",
|
||||
bonusPrice: "",
|
||||
status: "1",
|
||||
})
|
||||
|
||||
// 定义校验规则
|
||||
const dataRules = ref({
|
||||
name: [{ required: true, message: '套餐名不能为空', trigger: 'blur' }],
|
||||
payPrice: [{ required: true, message: '支付金额不能为空', trigger: 'blur' }],
|
||||
bonusPrice: [{ required: true, message: '赠送金额不能为空', trigger: 'blur' }],
|
||||
status: [{ required: true, message: '状态不能为空', trigger: 'blur' }]
|
||||
name: [{ required: true, message: "套餐名不能为空", trigger: "blur" }],
|
||||
payPrice: [{ required: true, message: "支付金额不能为空", trigger: "blur" }],
|
||||
bonusPrice: [{ required: true, message: "赠送金额不能为空", trigger: "blur" }],
|
||||
status: [{ required: true, message: "状态不能为空", trigger: "blur" }],
|
||||
})
|
||||
|
||||
// 打开弹窗
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true
|
||||
form.id = ''
|
||||
visible.value = true
|
||||
form.id = ""
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
});
|
||||
// 获取walletRechargePackage信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
getwalletRechargePackageData(id)
|
||||
}
|
||||
};
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
})
|
||||
// 获取walletRechargePackage信息
|
||||
if (id) {
|
||||
form.id = id
|
||||
getwalletRechargePackageData(id)
|
||||
}
|
||||
}
|
||||
|
||||
// 提交
|
||||
const onSubmit = async () => {
|
||||
const valid = await dataFormRef.value.validate().catch(() => { });
|
||||
if (!valid) return false;
|
||||
|
||||
try {
|
||||
loading.value = true;
|
||||
const pa = {
|
||||
...form,
|
||||
payPrice: storePrice(form.payPrice),
|
||||
bonusPrice: storePrice(form.bonusPrice),
|
||||
}
|
||||
form.id ? await putObj(pa) : await addObj(pa);
|
||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
||||
if (!valid) return false
|
||||
|
||||
try {
|
||||
loading.value = true
|
||||
const pa = {
|
||||
...form,
|
||||
payPrice: storePrice(form.payPrice),
|
||||
bonusPrice: storePrice(form.bonusPrice),
|
||||
}
|
||||
form.id ? await putObj(pa) : await addObj(pa)
|
||||
useMessage().success(form.id ? "修改成功" : "添加成功")
|
||||
visible.value = false
|
||||
emit("refresh")
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg)
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 初始化表单数据
|
||||
const getwalletRechargePackageData = (id: string) => {
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
getObj(id).then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
}).finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
};
|
||||
// 获取数据
|
||||
loading.value = true
|
||||
getObj(id)
|
||||
.then((res: any) => {
|
||||
Object.assign(form, res.data)
|
||||
})
|
||||
.finally(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
|
||||
// 暴露变量
|
||||
defineExpose({
|
||||
openDialog
|
||||
});
|
||||
</script>
|
||||
openDialog,
|
||||
})
|
||||
</script>
|
||||
Reference in new issue
Block a user