首页导航菜单响应式适配。超市erp的货商管理的新增货商类别改为下拉菜单。智慧超市的商品新增的分类和品牌改为下拉选择。

This commit is contained in:
ctw committed 2024-12-26 17:28:43 +08:00
1 parent cd30aecc5e
commit 8b863ccd96
11 files changed
+1042 -920

No files matched your search

+38 -25
View File
@@ -1,41 +1,54 @@
import request from "/@/utils/request" import request from '/@/utils/request';
export function fetchList(query?: Object) { export function fetchList(query?: Object) {
return request({ return request({
url: '/supermarket/supermarketSpu/page', url: '/supermarket/supermarketSpu/page',
method: 'get', method: 'get',
params: query params: query,
}) });
} }
export function addObj(obj?: Object) { export function addObj(obj?: Object) {
return request({ return request({
url: '/supermarket/supermarketSpu', url: '/supermarket/supermarketSpu',
method: 'post', method: 'post',
data: obj data: obj,
}) });
} }
export function getObj(id?: string) { export function getObj(id?: string) {
return request({ return request({
url: '/supermarket/supermarketSpu/' + id, url: '/supermarket/supermarketSpu/' + id,
method: 'get' method: 'get',
}) });
} }
export function delObjs(ids?: Object) { export function delObjs(ids?: Object) {
return request({ return request({
url: '/supermarket/supermarketSpu', url: '/supermarket/supermarketSpu',
method: 'delete', method: 'delete',
data: ids data: ids,
}) });
} }
export function putObj(obj?: Object) { export function putObj(obj?: Object) {
return request({ return request({
url: '/supermarket/supermarketSpu', url: '/supermarket/supermarketSpu',
method: 'put', method: 'put',
data: obj data: obj,
}) });
} }
export function getSupermarketCategory(): any {
return request({
url: '/supermarket/supermarketCategory/simpleAll',
method: 'get',
});
}
export function getSupermarketBrand(): any {
return request({
url: '/supermarket/supermarketBrand/simpleAll',
method: 'get',
});
}
+31 -25
View File
@@ -1,41 +1,47 @@
import request from "/@/utils/request" import request from '/@/utils/request';
export function fetchList(query?: Object) { export function fetchList(query?: Object) {
return request({ return request({
url: '/supermarketerp/smErpSupplier/page', url: '/supermarketerp/smErpSupplier/page',
method: 'get', method: 'get',
params: query params: query,
}) });
} }
export function addObj(obj?: Object) { export function addObj(obj?: Object) {
return request({ return request({
url: '/supermarketerp/smErpSupplier', url: '/supermarketerp/smErpSupplier',
method: 'post', method: 'post',
data: obj data: obj,
}) });
} }
export function getObj(id?: string) { export function getObj(id?: string) {
return request({ return request({
url: '/supermarketerp/smErpSupplier/' + id, url: '/supermarketerp/smErpSupplier/' + id,
method: 'get' method: 'get',
}) });
} }
export function delObjs(ids?: Object) { export function delObjs(ids?: Object) {
return request({ return request({
url: '/supermarketerp/smErpSupplier', url: '/supermarketerp/smErpSupplier',
method: 'delete', method: 'delete',
data: ids data: ids,
}) });
} }
export function putObj(obj?: Object) { export function putObj(obj?: Object) {
return request({ return request({
url: '/supermarketerp/smErpSupplier', url: '/supermarketerp/smErpSupplier',
method: 'put', method: 'put',
data: obj data: obj,
}) });
} }
export function getSupplierTypeOptions(): any {
return request({
url: '/supermarketerp/smErpSupplierType/simpleAll',
method: 'get',
});
}
+237 -210
View File
@@ -1,127 +1,138 @@
<template> <template>
<el-dialog <el-dialog
:title="state.ruleForm.menuId ? $t('common.editBtn') : $t('common.addBtn')" :title="state.ruleForm.menuId ? $t('common.editBtn') : $t('common.addBtn')"
v-model="visible" v-model="visible"
width="600" width="600"
:close-on-click-modal="false" :close-on-click-modal="false"
draggable draggable
> >
<el-form ref="menuDialogFormRef" :model="state.ruleForm" :rules="dataRules" label-width="100px" v-loading="loading"> <el-form ref="menuDialogFormRef" :model="state.ruleForm" :rules="dataRules" label-width="100px" v-loading="loading">
<el-form-item :label="$t('sysmenu.menuType')" prop="menuType"> <el-form-item :label="$t('sysmenu.menuType')" prop="menuType">
<el-radio-group v-model="state.ruleForm.menuType"> <el-radio-group v-model="state.ruleForm.menuType">
<el-radio border label="0">菜单</el-radio> <el-radio border label="0">菜单</el-radio>
<el-radio border label="1">按钮</el-radio> <el-radio border label="1">按钮</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item :label="$t('sysmenu.parentId')" prop="parentId"> <el-form-item :label="$t('sysmenu.parentId')" prop="parentId">
<el-tree-select <el-tree-select
v-model="state.ruleForm.parentId" v-model="state.ruleForm.parentId"
:data="state.parentData" :data="state.parentData"
:render-after-expand="false" :render-after-expand="false"
:props="{ value: 'id', label: 'name', children: 'children' }" :props="{ value: 'id', label: 'name', children: 'children' }"
class="w100" class="w100"
clearable clearable
check-strictly check-strictly
:placeholder="$t('sysmenu.inputParentIdTip')" :placeholder="$t('sysmenu.inputParentIdTip')"
> >
</el-tree-select> </el-tree-select>
</el-form-item> </el-form-item>
<el-form-item prop="name"> <el-form-item prop="name">
<template #label> <template #label>
{{ state.ruleForm.menuType === '0' ? t('sysmenu.name') : t('sysmenu.buttonName') }} {{ state.ruleForm.menuType === '0' ? t('sysmenu.name') : t('sysmenu.buttonName') }}
</template> </template>
<el-input v-model="state.ruleForm.name" clearable :placeholder="$t('sysmenu.inputNameTip')"></el-input> <el-input v-model="state.ruleForm.name" clearable :placeholder="$t('sysmenu.inputNameTip')"></el-input>
</el-form-item> </el-form-item>
<el-form-item :label="$t('sysmenu.path')" prop="path" v-if="state.ruleForm.menuType === '0'"> <el-form-item :label="$t('sysmenu.path')" prop="path" v-if="state.ruleForm.menuType === '0'">
<el-input v-model="state.ruleForm.path" :placeholder="$t('sysmenu.inputPathTip')"/> <el-input v-model="state.ruleForm.path" :placeholder="$t('sysmenu.inputPathTip')" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('sysmenu.permission')" prop="permission" v-if="state.ruleForm.menuType === '1'"> <el-form-item :label="$t('sysmenu.permission')" prop="permission" v-if="state.ruleForm.menuType === '1'">
<template #label> <template #label>
{{ t('sysmenu.permission') }} {{ t('sysmenu.permission') }}
<tip content="对应后台接口@PreAuthorize注解入参字符串"></tip> <tip content="对应后台接口@PreAuthorize注解入参字符串"></tip>
</template> </template>
<el-input v-model="state.ruleForm.permission" maxlength="30" :placeholder="$t('sysmenu.inputPermissionTip')"/> <el-input v-model="state.ruleForm.permission" maxlength="30" :placeholder="$t('sysmenu.inputPermissionTip')" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('sysmenu.sortOrder')" prop="sortOrder"> <el-form-item :label="$t('sysmenu.sortOrder')" prop="sortOrder">
<el-input-number v-model="state.ruleForm.sortOrder" :min="0" controls-position="right"/> <el-input-number v-model="state.ruleForm.sortOrder" :min="0" controls-position="right" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('sysmenu.icon')" prop="icon" v-if="state.ruleForm.menuType === '0'"> <el-form-item :label="$t('sysmenu.icon')" prop="icon" v-if="state.ruleForm.menuType === '0'">
<IconSelector :placeholder="$t('sysmenu.inputIconTip')" v-model="state.ruleForm.icon"/> <IconSelector :placeholder="$t('sysmenu.inputIconTip')" v-model="state.ruleForm.icon" />
</el-form-item> </el-form-item>
<el-row> <el-form-item :label="$t('sysmenu.homeIcon')" prop="homeIcon" v-if="state.ruleForm.menuType === '0'">
<el-col :span="12"> <upload-img v-model:imageUrl="state.ruleForm.menuPic" />
<el-form-item prop="keepAlive" v-if="state.ruleForm.menuType === '0'"> <!-- <IconSelector :placeholder="$t('sysmenu.inputIconTip')" v-model="state.ruleForm.icon"/> -->
<template #label> {{ $t('sysmenu.keepAlive') }} </el-form-item>
<tip content="组件保留状态,避免重新渲染"/> <el-row>
</template> <el-col :span="12">
<el-radio-group v-model="state.ruleForm.keepAlive"> <el-form-item prop="keepAlive" v-if="state.ruleForm.menuType === '0'">
<el-radio border label="0">否</el-radio> <template #label>
<el-radio border label="1">是</el-radio> {{ $t('sysmenu.keepAlive') }}
</el-radio-group> <tip content="组件保留状态,避免重新渲染" />
</el-form-item> </template>
</el-col> <el-radio-group v-model="state.ruleForm.keepAlive">
<el-col :span="12"> <el-radio border label="0">否</el-radio>
<el-form-item prop="visible" v-if="state.ruleForm.menuType === '0'"> <el-radio border label="1">是</el-radio>
<template #label> {{ $t('sysmenu.visible') }} </el-radio-group>
<tip content="左侧菜单树是否显示"/> </el-form-item>
</template> </el-col>
<el-radio-group v-model="state.ruleForm.visible"> <el-col :span="12">
<el-radio border label="0">否</el-radio> <el-form-item prop="visible" v-if="state.ruleForm.menuType === '0'">
<el-radio border label="1">是</el-radio> <template #label>
</el-radio-group> {{ $t('sysmenu.visible') }}
</el-form-item> <tip content="左侧菜单树是否显示" />
</el-col> </template>
</el-row> <el-radio-group v-model="state.ruleForm.visible">
<el-row class="mt-4"> <el-radio border label="0">否</el-radio>
<el-col :span="12"> <el-radio border label="1">是</el-radio>
<el-form-item prop="param" v-if="state.ruleForm.menuType === '0'"> </el-radio-group>
<template #label> {{ $t('sysmenu.param') }} </el-form-item>
<tip content="多个路径指向同一个组件"/> </el-col>
</template> </el-row>
<el-radio-group v-model="state.ruleForm.param"> <el-row class="mt-4">
<el-radio border label="0">否</el-radio> <el-col :span="12">
<el-radio border label="1">是</el-radio> <el-form-item prop="param" v-if="state.ruleForm.menuType === '0'">
</el-radio-group> <template #label>
</el-form-item> {{ $t('sysmenu.param') }}
</el-col> <tip content="多个路径指向同一个组件" />
<el-col :span="12"> </template>
<el-form-item prop="embedded" <el-radio-group v-model="state.ruleForm.param">
v-if="state.ruleForm.menuType === '0' && state.ruleForm.path?.startsWith('http')"> <el-radio border label="0">否</el-radio>
<template #label> {{ $t('sysmenu.embedded') }} <el-radio border label="1">是</el-radio>
<tip content="iframe嵌套还是打开独立的Tab"/> </el-radio-group>
</template> </el-form-item>
<el-radio-group v-model="state.ruleForm.embedded"> </el-col>
<el-radio border label="0">否</el-radio> <el-col :span="12">
<el-radio border label="1">是</el-radio> <el-form-item prop="embedded" v-if="state.ruleForm.menuType === '0' && state.ruleForm.path?.startsWith('http')">
</el-radio-group> <template #label>
</el-form-item> {{ $t('sysmenu.embedded') }}
</el-col> <tip content="iframe嵌套还是打开独立的Tab" />
</el-row> </template>
<el-radio-group v-model="state.ruleForm.embedded">
<el-radio border label="0">否</el-radio>
<el-radio border label="1">是</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item class="mt-4" :label="$t('sysmenu.component')" prop="component" v-if="state.ruleForm.menuType === '0' <el-form-item
&& state.ruleForm.param === '1'"> class="mt-4"
<el-input v-model="state.ruleForm.component" :placeholder="$t('sysmenu.inputComponentTip')"/> :label="$t('sysmenu.component')"
</el-form-item> prop="component"
</el-form> v-if="state.ruleForm.menuType === '0' && state.ruleForm.param === '1'"
<template #footer> >
<el-input v-model="state.ruleForm.component" :placeholder="$t('sysmenu.inputComponentTip')" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button> <el-button @click="visible = false">{{ $t('common.cancelButtonText') }}</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button> <el-button type="primary" @click="onSubmit" :disabled="loading">{{ $t('common.confirmButtonText') }}</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup lang="ts" name="systemMenuDialog"> <script setup lang="ts" name="systemMenuDialog">
import {useI18n} from 'vue-i18n'; import { useI18n } from 'vue-i18n';
import {getObj, pageList, putObj, addObj, validateExist} from '/@/api/admin/menu'; import { getObj, pageList, putObj, addObj, validateExist } from '/@/api/admin/menu';
import {useMessage} from '/@/hooks/message'; import { useMessage } from '/@/hooks/message';
import {rule, validateNull} from "/@/utils/validate"; import { rule, validateNull } from '/@/utils/validate';
import Tip from "/@/components/Tip/index.vue"; import Tip from '/@/components/Tip/index.vue';
// 定义子组件向父组件传值/事件 // 定义子组件向父组件传值/事件
const emit = defineEmits(['refresh']); const emit = defineEmits(['refresh']);
const {t} = useI18n(); const { t } = useI18n();
// 引入组件 // 引入组件
const IconSelector = defineAsyncComponent(() => import('/@/components/IconSelector/index.vue')); const IconSelector = defineAsyncComponent(() => import('/@/components/IconSelector/index.vue'));
@@ -131,130 +142,146 @@ const loading = ref(false);
const menuDialogFormRef = ref(); const menuDialogFormRef = ref();
// 定义需要的数据 // 定义需要的数据
const state = reactive({ const state = reactive({
ruleForm: { ruleForm: {
menuId: '', menuId: '',
name: '', name: '',
permission: '', permission: '',
parentId: '', parentId: '',
icon: '', icon: '',
path: '', menuPic: '',
param: '0', path: '',
component: '', param: '0',
sortOrder: 0, component: '',
menuType: '1', sortOrder: 0,
keepAlive: '0', menuType: '1',
visible: '1', keepAlive: '0',
embedded: '0', visible: '1',
}, embedded: '0',
parentData: [] as any[], // 上级菜单数据 },
parentData: [] as any[], // 上级菜单数据
}); });
// 表单校验规则 // 表单校验规则
const dataRules = reactive({ const dataRules = reactive({
menuType: [{required: true, message: '菜单类型不能为空', trigger: 'blur'}], menuType: [{ required: true, message: '菜单类型不能为空', trigger: 'blur' }],
parentId: [{required: true, message: '上级菜单不能为空', trigger: 'blur'}], parentId: [{ required: true, message: '上级菜单不能为空', trigger: 'blur' }],
name: [{validator: rule.overLength, trigger: 'blur'}, { name: [
required: true, { validator: rule.overLength, trigger: 'blur' },
message: '菜单不能为空', {
trigger: 'blur' required: true,
}, { message: '菜单不能为空',
validator: (rule: any, value: any, callback: any) => { trigger: 'blur',
validateExist(rule, value, callback, state.ruleForm.menuId !== '' || state.ruleForm.menuType === '1'); },
}, {
trigger: 'blur', validator: (rule: any, value: any, callback: any) => {
}], validateExist(rule, value, callback, state.ruleForm.menuId !== '' || state.ruleForm.menuType === '1');
path: [{validator: rule.overLength, trigger: 'blur'}, {required: true, message: '路径不能为空', trigger: 'blur'}], },
icon: [{validator: rule.overLength, trigger: 'blur'}, {required: true, message: '图标不能为空', trigger: 'blur'}], trigger: 'blur',
permission: [{validator: rule.overLength, trigger: 'blur'}, { },
required: true, ],
message: '权限代码不能为空', path: [
trigger: 'blur' { validator: rule.overLength, trigger: 'blur' },
}, { { required: true, message: '路径不能为空', trigger: 'blur' },
validator: (rule: any, value: any, callback: any) => { ],
validateExist(rule, value, callback, state.ruleForm.menuId !== ''); icon: [
}, { validator: rule.overLength, trigger: 'blur' },
trigger: 'blur', { required: true, message: '图标不能为空', trigger: 'blur' },
}], ],
sortOrder: [{required: true, message: '排序不能为空', trigger: 'blur'}], permission: [
component: [{min: 5, max: 255, message: '组件名称长度必须介于 5 和 255 之间', trigger: 'blur'}, { validator: rule.overLength, trigger: 'blur' },
{ {
validator: (rule: any, value: any, callback: any) => { required: true,
if (state.ruleForm.menuType === '0' && state.ruleForm.param === '1' && validateNull(state.ruleForm.component)) { message: '权限代码不能为空',
callback(new Error('请输入组件名称')); trigger: 'blur',
} else { },
return callback(); {
} validator: (rule: any, value: any, callback: any) => {
}, validateExist(rule, value, callback, state.ruleForm.menuId !== '');
trigger: 'blur', },
}], trigger: 'blur',
},
],
sortOrder: [{ required: true, message: '排序不能为空', trigger: 'blur' }],
component: [
{ min: 5, max: 255, message: '组件名称长度必须介于 5 和 255 之间', trigger: 'blur' },
{
validator: (rule: any, value: any, callback: any) => {
if (state.ruleForm.menuType === '0' && state.ruleForm.param === '1' && validateNull(state.ruleForm.component)) {
callback(new Error('请输入组件名称'));
} else {
return callback();
}
},
trigger: 'blur',
},
],
}); });
// 打开弹窗 // 打开弹窗
const openDialog = (type: string, row?: any) => { const openDialog = (type: string, row?: any) => {
state.ruleForm.menuId = ''; state.ruleForm.menuId = '';
visible.value = true; visible.value = true;
nextTick(() => { nextTick(() => {
menuDialogFormRef.value?.resetFields(); menuDialogFormRef.value?.resetFields();
state.ruleForm.parentId = row?.id || '-1'; state.ruleForm.parentId = row?.id || '-1';
}); });
if (row?.id && type === 'edit') { if (row?.id && type === 'edit') {
state.ruleForm.menuId = row.id; state.ruleForm.menuId = row.id;
// 获取当前节点菜单信息 // 获取当前节点菜单信息
getMenuDetail(row.id); getMenuDetail(row.id);
} }
// 渲染上级菜单列表树 // 渲染上级菜单列表树
getAllMenuData(); getAllMenuData();
}; };
// 获取菜单节点的详细信息 // 获取菜单节点的详细信息
const getMenuDetail = (id: string) => { const getMenuDetail = (id: string) => {
getObj({menuId: id}).then((res) => { getObj({ menuId: id }).then((res) => {
if (res.data[0].component) { if (res.data[0].component) {
state.ruleForm.param = '1' state.ruleForm.param = '1';
} }
Object.assign(state.ruleForm, res.data[0]); Object.assign(state.ruleForm, res.data[0]);
}); });
}; };
// 从后端获取菜单信息(含层级) // 从后端获取菜单信息(含层级)
const getAllMenuData = () => { const getAllMenuData = () => {
state.parentData = []; state.parentData = [];
pageList({ pageList({
type: '0', type: '0',
}).then((res) => { }).then((res) => {
let menu = { let menu = {
id: '-1', id: '-1',
name: '根菜单', name: '根菜单',
children: [], children: [],
}; };
menu.children = res.data; menu.children = res.data;
state.parentData.push(menu); state.parentData.push(menu);
}); });
}; };
// 保存数据 // 保存数据
const onSubmit = async () => { const onSubmit = async () => {
const valid = await menuDialogFormRef.value.validate().catch(() => { const valid = await menuDialogFormRef.value.validate().catch(() => {});
}); if (!valid) return false;
if (!valid) return false;
try { try {
loading.value = true; loading.value = true;
state.ruleForm.menuId ? await putObj(state.ruleForm) : await addObj(state.ruleForm); state.ruleForm.menuId ? await putObj(state.ruleForm) : await addObj(state.ruleForm);
useMessage().success(t(state.ruleForm.menuId ? 'common.editSuccessText' : 'common.addSuccessText')); useMessage().success(t(state.ruleForm.menuId ? 'common.editSuccessText' : 'common.addSuccessText'));
visible.value = false; visible.value = false;
emit('refresh'); emit('refresh');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg); useMessage().error(err.msg);
} finally { } finally {
loading.value = false; loading.value = false;
} }
}; };
// 暴露变量 只有暴漏出来的变量 父组件才能使用 // 暴露变量 只有暴漏出来的变量 父组件才能使用
defineExpose({ defineExpose({
openDialog, openDialog,
}); });
</script> </script>
+36 -35
View File
@@ -1,37 +1,38 @@
export default { export default {
sysmenu: { sysmenu: {
index: '#', index: '#',
name: 'menu name', name: 'menu name',
buttonName: 'button name', buttonName: 'button name',
sortOrder: 'sortOrder', sortOrder: 'sortOrder',
path: 'path', path: 'path',
menuType: 'menuType', menuType: 'menuType',
keepAlive: 'keepAlive', keepAlive: 'keepAlive',
permission: 'permission', permission: 'permission',
inputNameTip: 'input name', inputNameTip: 'input name',
parentId: 'parent menu', parentId: 'parent menu',
embedded: 'embedded', embedded: 'embedded',
param: 'param', param: 'param',
component: 'component', component: 'component',
visible: 'visible', visible: 'visible',
icon: 'icon', icon: 'icon',
inputMenuIdTip: 'input menuId', homeIcon: 'homeIcon',
inputPermissionTip: 'input permission', inputMenuIdTip: 'input menuId',
inputPathTip: 'input path', inputPermissionTip: 'input permission',
inputParentIdTip: 'input parentId', inputPathTip: 'input path',
inputIconTip: 'input icon', inputParentIdTip: 'input parentId',
inputVisibleTip: 'input visible', inputIconTip: 'input icon',
inputSortOrderTip: 'input sortOrder', inputVisibleTip: 'input visible',
inputKeepAliveTip: 'input keepAlive', inputSortOrderTip: 'input sortOrder',
inputMenuTypeTip: 'input menuType', inputKeepAliveTip: 'input keepAlive',
inputCreateByTip: 'input createBy', inputMenuTypeTip: 'input menuType',
inputCreateTimeTip: 'input createTime', inputCreateByTip: 'input createBy',
inputUpdateByTip: 'input updateBy', inputCreateTimeTip: 'input createTime',
inputUpdateTimeTip: 'input updateTime', inputUpdateByTip: 'input updateBy',
inputDelFlagTip: 'input delFlag', inputUpdateTimeTip: 'input updateTime',
inputTenantIdTip: 'input tenantId', inputDelFlagTip: 'input delFlag',
inputEmbeddedTip: 'input embedded', inputTenantIdTip: 'input tenantId',
inputComponentTip: 'input component', inputEmbeddedTip: 'input embedded',
deleteDisabledTip: 'menu inclusion subordinates cannot be deleted', inputComponentTip: 'input component',
}, deleteDisabledTip: 'menu inclusion subordinates cannot be deleted',
},
}; };
+30 -29
View File
@@ -1,31 +1,32 @@
export default { export default {
sysmenu: { sysmenu: {
index: '#', index: '#',
name: '菜单名称', name: '菜单名称',
buttonName: '按钮名称', buttonName: '按钮名称',
sortOrder: '排序', sortOrder: '排序',
path: '路由', path: '路由',
menuType: '类型', menuType: '类型',
keepAlive: '缓冲', keepAlive: '缓冲',
permission: '权限标识', permission: '权限标识',
inputNameTip: '请输入菜单名称', inputNameTip: '请输入菜单名称',
parentId: '上级菜单', parentId: '上级菜单',
embedded: '内嵌', embedded: '内嵌',
param: '带参', param: '带参',
component: '组件', component: '组件',
visible: '显示', visible: '显示',
icon: '图标', icon: '图标',
inputMenuIdTip: '', homeIcon: '首页图标',
inputPermissionTip: '请输入权限标识', inputMenuIdTip: '',
inputPathTip: '请输入路由路径', inputPermissionTip: '请输入权限标识',
inputParentIdTip: '请选择上级菜单', inputPathTip: '请输入路由路径',
inputIconTip: '请选择图标', inputParentIdTip: '请选择上级菜单',
inputVisibleTip: '请选择是否显示', inputIconTip: '请选择图标',
inputSortOrderTip: '请输入排序', inputVisibleTip: '请选择是否显示',
inputKeepAliveTip: '请选择是否缓冲', inputSortOrderTip: '请输入排序',
inputMenuTypeTip: '请选择菜单类型', inputKeepAliveTip: '请选择是否缓冲',
inputEmbeddedTip: '请选择是否内嵌', inputMenuTypeTip: '请选择菜单类型',
inputComponentTip: '请输入组件名称', inputEmbeddedTip: '请选择是否内嵌',
deleteDisabledTip: '菜单包含下级不能删除', inputComponentTip: '请输入组件名称',
}, deleteDisabledTip: '菜单包含下级不能删除',
},
}; };
+17 -14
View File
@@ -1,24 +1,27 @@
<template> <template>
<div> <div>
<div v-if="pageLoading"> <navMmenu />
<el-main> <div v-if="pageLoading">
<el-card shadow="never"> <el-main>
<el-skeleton :rows="1"></el-skeleton> <el-card shadow="never">
</el-card> <el-skeleton :rows="1"></el-skeleton>
<el-card shadow="never" style="margin-top: 15px;"> </el-card>
<el-skeleton></el-skeleton> <el-card shadow="never" style="margin-top: 15px">
</el-card> <el-skeleton></el-skeleton>
</el-main> </el-card>
</div> </el-main>
<widgets/> </div>
</div> <widgets />
</div>
</template> </template>
<script setup lang="ts" name="dashboard"> <script setup lang="ts" name="dashboard">
import navMmenu from './navMenu/index.vue';
const Widgets = defineAsyncComponent(() => import('./widgets/index.vue')); const Widgets = defineAsyncComponent(() => import('./widgets/index.vue'));
const pageLoading = ref(true); const pageLoading = ref(true);
onMounted(() => { onMounted(() => {
pageLoading.value = false; pageLoading.value = false;
}); });
</script> </script>
@@ -1,26 +1,18 @@
<script lang="ts">
export default {
title: '首页导航菜单',
icon: 'Postcard',
description: '首页导航菜单展示',
};
</script>
<template> <template>
<el-card class="box-card p-10" v-loading="loading"> <el-card class="box-card p-10" style="min-height: 40vw; background-image: linear-gradient(0deg, #ffffff 0%, #d3f9f1aa 100%)" v-loading="loading">
<el-row> <el-row>
<el-col :span="6" v-for="(item, index) in navMenuListTop" :key="index"> <el-col :span="4" v-for="(item, index) in navMenuListTop" :key="index">
<div :class="['nav-menu-item-top', item.id == currentActiveMenuId ? 'nav-menu-item-active' : '']" @click="currentActiveMenuId = item.id"> <div :class="['nav-menu-item-top', item.id == currentActiveMenuId ? 'nav-menu-item-active' : '']" @click="currentActiveMenuId = item.id">
<el-icon class="nav-menu-item-icon"><List /></el-icon> <el-image class="nav-menu-item-icon" :src="imageBaseUrl + item.menuPic" fit="cover" />
<div class="nav-menu-item-name">{{ item.name }}</div> <div class="nav-menu-item-name">{{ item.name }}</div>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
<br /> <br />
<el-row v-if="currentActiveMenuId" style="background-color: #eaf4fa; border-radius: 1rem; padding: 1rem"> <el-row v-if="currentActiveMenuId" style="background-color: #e2eff677; border-radius: 1rem; padding: 2rem 6rem">
<el-col :span="4" v-for="(item, index) in navMenuListBottom" :key="index"> <el-col :span="3" v-for="(item, index) in navMenuListBottom" :key="index">
<div class="nav-menu-item-bottom" @click="handleClickBottomMenu(item)"> <div class="nav-menu-item-bottom" @click="handleClickBottomMenu(item)">
<el-icon class="nav-menu-item-icon"><List /></el-icon> <el-image class="nav-menu-item-icon" :src="imageBaseUrl + item.menuPic" fit="cover" />
<div class="nav-menu-item-name">{{ item.name }}</div> <div class="nav-menu-item-name">{{ item.name }}</div>
</div> </div>
</el-col> </el-col>
@@ -38,6 +30,7 @@ const loading = ref(false);
const navMenuList = ref<any>([]); const navMenuList = ref<any>([]);
const navMenuListTop = ref<any>([]); const navMenuListTop = ref<any>([]);
const currentActiveMenuId = ref(''); const currentActiveMenuId = ref('');
const imageBaseUrl = import.meta.env.VITE_IMAGE_BASE_PATH;
// 获取菜单列表 // 获取菜单列表
const getNavMenuList = async () => { const getNavMenuList = async () => {
@@ -48,7 +41,7 @@ const getNavMenuList = async () => {
}); });
if (res.code == 0 && res.data.length > 0) { if (res.code == 0 && res.data.length > 0) {
navMenuList.value = res.data; navMenuList.value = res.data;
navMenuListTop.value = res.data.map((item: any) => ({ id: item.id, name: item.name, path: item.path })); navMenuListTop.value = res.data.map((item: any) => ({ id: item.id, name: item.name, path: item.path, menuPic: item.menuPic }));
} }
} catch (error) { } catch (error) {
navMenuList.value = []; navMenuList.value = [];
@@ -62,7 +55,7 @@ const navMenuListBottom = computed(() => {
if (navMenuList.value) { if (navMenuList.value) {
const currentMenuItem = navMenuList.value.find((item: any) => item.id == currentActiveMenuId.value); const currentMenuItem = navMenuList.value.find((item: any) => item.id == currentActiveMenuId.value);
if (currentMenuItem && currentMenuItem.children) { if (currentMenuItem && currentMenuItem.children) {
return currentMenuItem.children.map((item: any) => ({ id: item.id, name: item.name, path: item.path })); return currentMenuItem.children.map((item: any) => ({ id: item.id, name: item.name, path: item.path, menuPic: item.menuPic }));
} }
} else { } else {
return []; return [];
@@ -80,9 +73,9 @@ onMounted(async () => {
<style scoped lang="scss"> <style scoped lang="scss">
.nav-menu-item-top { .nav-menu-item-top {
height: 7rem; height: 6.5vw;
padding: 1rem; padding: 0.5vw;
margin: 0.5rem; margin: 0.5vw;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: start; align-items: start;
@@ -93,21 +86,24 @@ onMounted(async () => {
overflow: hidden; overflow: hidden;
.nav-menu-item-icon { .nav-menu-item-icon {
width: 2rem; width: 2.5vw;
height: 2rem; height: 2.5vw;
} }
.nav-menu-item-name { .nav-menu-item-name {
font-size: 1.5rem; font-size: 1.2vw;
font-weight: 600; font-weight: 600;
} }
} }
.nav-menu-item-top:hover {
color: #2e5cf6;
}
.nav-menu-item-active { .nav-menu-item-active {
background-color: #eaf4fa; background-color: #e2eff6;
} }
.nav-menu-item-bottom { .nav-menu-item-bottom {
width: 100%; min-height: 4vw;
height: 6rem; margin: 1vw;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
@@ -116,16 +112,40 @@ onMounted(async () => {
cursor: pointer; cursor: pointer;
.nav-menu-item-icon { .nav-menu-item-icon {
width: 2rem; width: 2.3vw;
height: 2rem; height: 2.3vw;
background-color: aquamarine;
} }
.nav-menu-item-name { .nav-menu-item-name {
font-size: 1rem; font-size: 1vw;
font-weight: 600; font-weight: 600;
} }
} }
.nav-menu-item-bottom:hover { .nav-menu-item-bottom:hover {
color: #2e5cf6; color: #2e5cf6;
} }
@media (max-width: 768px) {
.nav-menu-item-top {
height: 10vw;
padding: 1vw;
margin: 1vw;
.nav-menu-item-icon {
display: none;
}
.nav-menu-item-name {
font-size: 2vw;
}
}
.nav-menu-item-bottom {
height: 4vw;
.nav-menu-item-icon {
display: none;
}
.nav-menu-item-name {
font-size: 1.8vw;
}
}
}
</style> </style>
+3 -4
View File
@@ -150,7 +150,6 @@ const allCompsList = computed(() => {
const myCompsList = computed(() => { const myCompsList = computed(() => {
// 支持列表 // 支持列表
const myGrid = [ const myGrid = [
'nav-menu',
'calendar', 'calendar',
'current-user', 'current-user',
'news', 'news',
@@ -229,9 +228,9 @@ onMounted(() => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.custom_btn { .custom_btn {
position: absolute; position: fixed;
top: 7px; bottom: 5px;
right: 5px; right: 20px;
z-index: 9; z-index: 9;
color: white; color: white;
} }
+325 -307
View File
@@ -1,355 +1,372 @@
<template> <template>
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" <el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
:close-on-click-modal="false" draggable> <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading"> <el-row :gutter="24">
<el-row :gutter="24"> <el-col :span="12" class="mb20">
<el-col :span="12" class="mb20"> <el-form-item label="货号" prop="productCode">
<el-form-item label="货号" prop="productCode"> <el-input v-model="form.productCode" placeholder="请输入货号" />
<el-input v-model="form.productCode" placeholder="请输入货号"/> </el-form-item>
</el-form-item> </el-col>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="自编码/条码" prop="barcode"> <el-form-item label="自编码/条码" prop="barcode">
<el-input v-model="form.barcode" placeholder="请输入自编码/条码"/> <el-input v-model="form.barcode" placeholder="请输入自编码/条码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="商品名称" prop="productName"> <el-form-item label="商品名称" prop="productName">
<el-input v-model="form.productName" placeholder="请输入商品名称"/> <el-input v-model="form.productName" placeholder="请输入商品名称" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="单位" prop="unit"> <el-form-item label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位"/> <el-input v-model="form.unit" placeholder="请输入单位" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20">
<el-form-item label="商品分类" prop="categoryId">
<el-select v-model="form.categoryId" placeholder="请选择商品分类">
<el-option v-for="item in categoryOptions" :key="item.id" :label="item.typeName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="品牌" prop="brandId">
<el-select v-model="form.brandId" placeholder="请选择品牌">
<el-option v-for="item in brandOptions" :key="item.id" :label="item.typeName" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="商品封面图" prop="picUrl">
<upload-file v-model:imageUrl="form.picUrl"></upload-file>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="24" class="mb20">
<el-form-item label="商品分类" prop="categoryId"> <el-form-item label="商品轮播图" prop="sliderPicUrls">
<el-select v-model="form.categoryId" placeholder="请选择商品分类"> <upload-file v-model:imageUrl="form.sliderPicUrls"></upload-file>
<el-option label="请选择">0</el-option> </el-form-item>
</el-select> </el-col>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="品牌" prop="brandId">
<el-select v-model="form.brandId" placeholder="请选择品牌">
<el-option label="请选择">0</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20">
<el-form-item label="商品封面图" prop="picUrl">
<upload-file v-model:imageUrl="form.picUrl"></upload-file>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="商品轮播图" prop="sliderPicUrls"> <el-form-item label="排序字段" prop="sort">
<upload-file v-model:imageUrl="form.sliderPicUrls"></upload-file> <el-input-number :min="1" :max="1000" v-model="form.sort" placeholder="请输入排序字段"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="排序字段" prop="sort"> <el-form-item label="商品状态" prop="status">
<el-input-number :min="1" :max="1000" v-model="form.sort" placeholder="请输入排序字段"></el-input-number> <el-radio-group v-model="form.status">
</el-form-item> <el-radio :label="item.value" v-for="(item, index) in status" border :key="index">{{ item.label }} </el-radio>
</el-col> </el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="商品状态" prop="status"> <el-form-item label="成本单价" prop="costPrice">
<el-radio-group v-model="form.status"> <el-input-number v-model="form.costPrice" placeholder="请输入成本单价,单位: 分"></el-input-number>
<el-radio :label="item.value" v-for="(item, index) in status" border :key="index">{{ item.label }} </el-form-item>
</el-radio> </el-col>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="成本单价" prop="costPrice"> <el-form-item label="库存" prop="stock">
<el-input-number v-model="form.costPrice" placeholder="请输入成本单价,单位: 分"></el-input-number> <el-input-number v-model="form.stock" placeholder="请输入库存"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="库存" prop="stock"> <el-form-item label="赠送积分" prop="giveIntegral">
<el-input-number v-model="form.stock" placeholder="请输入库存"></el-input-number> <el-input-number v-model="form.giveIntegral" placeholder="请输入赠送积分"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="赠送积分" prop="giveIntegral"> <el-form-item label="商户编号" prop="merchantId">
<el-input-number v-model="form.giveIntegral" placeholder="请输入赠送积分"></el-input-number> <el-select v-model="form.merchantId" placeholder="请选择商户编号">
</el-form-item> <el-option label="请选择">0</el-option>
</el-col> </el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="商户编号" prop="merchantId"> <el-form-item label="规格" prop="specification">
<el-select v-model="form.merchantId" placeholder="请选择商户编号"> <el-input v-model="form.specification" placeholder="请输入规格" />
<el-option label="请选择">0</el-option> </el-form-item>
</el-select> </el-col>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="规格" prop="specification"> <el-form-item label="产地" prop="origin">
<el-input v-model="form.specification" placeholder="请输入规格"/> <el-input v-model="form.origin" placeholder="请输入产地" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="产地" prop="origin"> <el-form-item label="装数" prop="packingQuantity">
<el-input v-model="form.origin" placeholder="请输入产地"/> <el-input-number :min="1" v-model="form.packingQuantity" placeholder="请输入装数"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="装数" prop="packingQuantity"> <el-form-item label="零售价" prop="retailPrice">
<el-input-number :min="1" v-model="form.packingQuantity" placeholder="请输入装数"></el-input-number> <el-input-number v-model="form.retailPrice" placeholder="请输入零售价"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20">
<el-form-item label="进价" prop="purchasePrice">
<el-input-number v-model="form.purchasePrice" placeholder="请输入进价"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="零售价" prop="retailPrice"> <el-form-item label="货商" prop="supplierId">
<el-input-number v-model="form.retailPrice" placeholder="请输入零售价"></el-input-number> <el-select v-model="form.supplierId" placeholder="请选择货商">
</el-form-item> <el-option label="请选择">0</el-option>
</el-col> </el-select>
<el-col :span="12" class="mb20"> </el-form-item>
<el-form-item label="进价" prop="purchasePrice"> </el-col>
<el-input-number v-model="form.purchasePrice" placeholder="请输入进价"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="会员价1" prop="memberPrice1">
<el-input-number v-model="form.memberPrice1" placeholder="请输入会员价1"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="货商" prop="supplierId"> <el-form-item label="会员价2" prop="memberPrice2">
<el-select v-model="form.supplierId" placeholder="请选择货商"> <el-input-number v-model="form.memberPrice2" placeholder="请输入会员价2"></el-input-number>
<el-option label="请选择">0</el-option> </el-form-item>
</el-select> </el-col>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="会员价1" prop="memberPrice1"> <el-form-item label="会员价3" prop="memberPrice3">
<el-input-number v-model="form.memberPrice1" placeholder="请输入会员价1"></el-input-number> <el-input v-model="form.memberPrice3" placeholder="请输入会员价3"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="会员价2" prop="memberPrice2"> <el-form-item label="批发价1" prop="wholesalePrice1">
<el-input-number v-model="form.memberPrice2" placeholder="请输入会员价2"></el-input-number> <el-input-number v-model="form.wholesalePrice1" placeholder="请输入批发价1"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="会员价3" prop="memberPrice3"> <el-form-item label="批发价2" prop="wholesalePrice2">
<el-input v-model="form.memberPrice3" placeholder="请输入会员价3"></el-input> <el-input-number v-model="form.wholesalePrice2" placeholder="请输入批发价2"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="批发价1" prop="wholesalePrice1"> <el-form-item label="批发价3" prop="wholesalePrice3">
<el-input-number v-model="form.wholesalePrice1" placeholder="请输入批发价1"></el-input-number> <el-input-number v-model="form.wholesalePrice3" placeholder="请输入批发价3"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="批发价2" prop="wholesalePrice2"> <el-form-item label="促销价" prop="promotionPrice">
<el-input-number v-model="form.wholesalePrice2" placeholder="请输入批发价2"></el-input-number> <el-input-number v-model="form.promotionPrice" placeholder="请输入促销价"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="批发价3" prop="wholesalePrice3"> <el-form-item label="商品性质" prop="productNature">
<el-input-number v-model="form.wholesalePrice3" placeholder="请输入批发价3"></el-input-number> <el-select v-model="form.productNature" placeholder="请选择商品性质">
</el-form-item> <el-option :value="item.value" :label="item.label" v-for="(item, index) in supermarket_nature" :key="index"></el-option>
</el-col> </el-select>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="商品简介" prop="introduction">
<el-input type="textarea" v-model="form.introduction" placeholder="请输入商品简介" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="24" class="mb20">
<el-form-item label="促销价" prop="promotionPrice"> <el-form-item label="商品详情" prop="description">
<el-input-number v-model="form.promotionPrice" placeholder="请输入促销价"></el-input-number> <editor v-if="visible" v-model:get-html="form.description" placeholder="请输入商品详情"></editor>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- <el-col :span="12" class="mb20">-->
<!-- <el-form-item label="签名上锁" prop="archiverSignature">-->
<!-- <el-radio-group v-model="form.archiverSignature">-->
<!-- <el-radio label="签名上锁" border>签名上锁</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12" class="mb20"> <!-- <el-col :span="12" class="mb20">-->
<el-form-item label="商品性质" prop="productNature"> <!-- <el-form-item label="区管理库存" prop="inventoryArea">-->
<el-select v-model="form.productNature" placeholder="请选择商品性质"> <!-- <el-radio-group v-model="form.inventoryArea">-->
<el-option :value="item.value" :label="item.label" v-for="(item, index) in supermarket_nature" :key="index"></el-option> <!-- <el-radio label="区管理库存" border>区管理库存</el-radio>-->
</el-select> <!-- </el-radio-group>-->
</el-form-item> <!-- </el-form-item>-->
</el-col> <!-- </el-col>-->
<el-col :span="12" class="mb20">
<el-form-item label="商品简介" prop="introduction">
<el-input type="textarea" v-model="form.introduction" placeholder="请输入商品简介"/>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20"> <!-- <el-col :span="12" class="mb20">-->
<el-form-item label="商品详情" prop="description"> <!-- <el-form-item label="比例提成" prop="commissionRate">-->
<editor v-if="visible" v-model:get-html="form.description" placeholder="请输入商品详情"></editor> <!-- <el-select v-model="form.commissionRate" placeholder="请选择比例提成">-->
</el-form-item> <!-- <el-option label="请选择">0</el-option>-->
</el-col> <!-- </el-select>-->
<!-- <el-col :span="12" class="mb20">--> <!-- </el-form-item>-->
<!-- <el-form-item label="签名上锁" prop="archiverSignature">--> <!-- </el-col>-->
<!-- <el-radio-group v-model="form.archiverSignature">-->
<!-- <el-radio label="签名上锁" border>签名上锁</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12" class="mb20">--> <!-- <el-col :span="12" class="mb20">-->
<!-- <el-form-item label="区管理库存" prop="inventoryArea">--> <!-- <el-form-item label="联营扣率" prop="jointDeductionRate">-->
<!-- <el-radio-group v-model="form.inventoryArea">--> <!-- <el-input v-model="form.jointDeductionRate" placeholder="请输入联营扣率"/>-->
<!-- <el-radio label="区管理库存" border>区管理库存</el-radio>--> <!-- </el-form-item>-->
<!-- </el-radio-group>--> <!-- </el-col>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12" class="mb20">--> <el-col :span="12" class="mb20">
<!-- <el-form-item label="比例提成" prop="commissionRate">--> <el-form-item label="库存上限" prop="inventoryUpperLimit">
<!-- <el-select v-model="form.commissionRate" placeholder="请选择比例提成">--> <el-input-number v-model="form.inventoryUpperLimit" placeholder="请输入库存上限"></el-input-number>
<!-- <el-option label="请选择">0</el-option>--> </el-form-item>
<!-- </el-select>--> </el-col>
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12" class="mb20">-->
<!-- <el-form-item label="联营扣率" prop="jointDeductionRate">-->
<!-- <el-input v-model="form.jointDeductionRate" placeholder="请输入联营扣率"/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12" class="mb20">
<el-form-item label="库存上限" prop="inventoryUpperLimit">
<el-input-number v-model="form.inventoryUpperLimit" placeholder="请输入库存上限"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="库存下限" prop="inventoryLowerLimit">
<el-input-number v-model="form.inventoryLowerLimit" placeholder="请输入库存下限"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="毛利率" prop="grossMargin">
<el-input-number v-model="form.grossMargin" placeholder="请输入毛利率"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="库存下限" prop="inventoryLowerLimit">
<el-input-number v-model="form.inventoryLowerLimit" placeholder="请输入库存下限"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="毛利率" prop="grossMargin">
<el-input-number v-model="form.grossMargin" placeholder="请输入毛利率"></el-input-number>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="visible = false">取消</el-button> <el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button> <el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup lang="ts" name="SupermarketSpuDialog"> <script setup lang="ts" name="SupermarketSpuDialog">
import { useDict } from '/@/hooks/dict'; import { useDict } from '/@/hooks/dict';
import { useMessage } from "/@/hooks/message"; import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj } from '/@/api/supermarket/supermarketSpu' import { getObj, addObj, putObj, getSupermarketCategory, getSupermarketBrand } from '/@/api/supermarket/supermarketSpu';
import { rule } from '/@/utils/validate'; import { rule } from '/@/utils/validate';
const emit = defineEmits(['refresh']); const emit = defineEmits(['refresh']);
// 定义变量内容 // 定义变量内容
const dataFormRef = ref(); const dataFormRef = ref();
const visible = ref(false) const visible = ref(false);
const loading = ref(false) const loading = ref(false);
// 定义字典 // 定义字典
const { supermarket_nature,status } = useDict('supermarket_nature','status') const { supermarket_nature, status } = useDict('supermarket_nature', 'status');
const categoryOptions = ref<any>([]); // 商品分类的下拉选项
const brandOptions = ref<any>([]); // 超市品牌的下拉选项
// 提交表单数据 // 提交表单数据
const form = reactive({ const form = reactive({
id:'', id: '',
productCode: '', productCode: '',
barcode: '', barcode: '',
productName: '', productName: '',
unit: '', unit: '',
introduction: '', introduction: '',
description: '', description: '',
categoryId: '', categoryId: '',
picUrl: '', picUrl: '',
sliderPicUrls: '', sliderPicUrls: '',
sort: 0, sort: 0,
status: '', status: '',
costPrice: 0, costPrice: 0,
stock: 0, stock: 0,
giveIntegral: 0, giveIntegral: 0,
merchantId: '', merchantId: '',
deptId: '', deptId: '',
specification: '', specification: '',
origin: '', origin: '',
packingQuantity: 0, packingQuantity: 0,
purchasePrice: 0, purchasePrice: 0,
retailPrice: 0, retailPrice: 0,
memberPrice1: 0, memberPrice1: 0,
memberPrice2: 0, memberPrice2: 0,
memberPrice3: 0, memberPrice3: 0,
wholesalePrice1: 0, wholesalePrice1: 0,
wholesalePrice2: 0, wholesalePrice2: 0,
wholesalePrice3: 0, wholesalePrice3: 0,
promotionPrice: 0, promotionPrice: 0,
productNature: '', productNature: '',
archiverSignature: '', archiverSignature: '',
inventoryArea: '', inventoryArea: '',
commissionRate: '', commissionRate: '',
jointDeductionRate: '', jointDeductionRate: '',
inventoryUpperLimit: 0, inventoryUpperLimit: 0,
inventoryLowerLimit: 0, inventoryLowerLimit: 0,
grossMargin: 0, grossMargin: 0,
auxiliaryBarcodeId: '', auxiliaryBarcodeId: '',
brandId: '', brandId: '',
supplierId: '', supplierId: '',
}); });
// 定义校验规则 // 定义校验规则
const dataRules = ref({ const dataRules = ref({
productCode: [{required: true, message: '货号不能为空', trigger: 'blur'}], productCode: [{ required: true, message: '货号不能为空', trigger: 'blur' }],
barcode: [{required: true, message: '自编码/条码不能为空', trigger: 'blur'}], barcode: [{ required: true, message: '自编码/条码不能为空', trigger: 'blur' }],
productName: [{required: true, message: '商品名称不能为空', trigger: 'blur'}], productName: [{ required: true, message: '商品名称不能为空', trigger: 'blur' }],
unit: [{required: true, message: '单位不能为空', trigger: 'blur'}], unit: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
sort: [{ validator: rule.number, trigger: 'blur' }], sort: [{ validator: rule.number, trigger: 'blur' }],
costPrice: [{ validator: rule.number, trigger: 'blur' }], costPrice: [{ validator: rule.number, trigger: 'blur' }],
stock: [{required: true, message: '库存不能为空', trigger: 'blur'}, { validator: rule.number, trigger: 'blur' }], stock: [
giveIntegral: [{ validator: rule.number, trigger: 'blur' }], { required: true, message: '库存不能为空', trigger: 'blur' },
packingQuantity: [{ validator: rule.number, trigger: 'blur' }], { validator: rule.number, trigger: 'blur' },
purchasePrice: [{ validator: rule.number, trigger: 'blur' }], ],
retailPrice: [{ validator: rule.number, trigger: 'blur' }], giveIntegral: [{ validator: rule.number, trigger: 'blur' }],
memberPrice1: [{ validator: rule.number, trigger: 'blur' }], packingQuantity: [{ validator: rule.number, trigger: 'blur' }],
memberPrice2: [{ validator: rule.number, trigger: 'blur' }], purchasePrice: [{ validator: rule.number, trigger: 'blur' }],
memberPrice3: [{ validator: rule.number, trigger: 'blur' }], retailPrice: [{ validator: rule.number, trigger: 'blur' }],
wholesalePrice1: [{ validator: rule.number, trigger: 'blur' }], memberPrice1: [{ validator: rule.number, trigger: 'blur' }],
wholesalePrice2: [{ validator: rule.number, trigger: 'blur' }], memberPrice2: [{ validator: rule.number, trigger: 'blur' }],
wholesalePrice3: [{ validator: rule.number, trigger: 'blur' }], memberPrice3: [{ validator: rule.number, trigger: 'blur' }],
promotionPrice: [{ validator: rule.number, trigger: 'blur' }], wholesalePrice1: [{ validator: rule.number, trigger: 'blur' }],
inventoryUpperLimit: [{ validator: rule.number, trigger: 'blur' }], wholesalePrice2: [{ validator: rule.number, trigger: 'blur' }],
inventoryLowerLimit: [{ validator: rule.number, trigger: 'blur' }], wholesalePrice3: [{ validator: rule.number, trigger: 'blur' }],
}) promotionPrice: [{ validator: rule.number, trigger: 'blur' }],
inventoryUpperLimit: [{ validator: rule.number, trigger: 'blur' }],
inventoryLowerLimit: [{ validator: rule.number, trigger: 'blur' }],
});
// 打开弹窗 // 打开弹窗
const openDialog = (id: string) => { const openDialog = async (id: string) => {
visible.value = true visible.value = true;
form.id = '' form.id = '';
// 重置表单数据 // 重置表单数据
nextTick(() => { nextTick(() => {
dataFormRef.value?.resetFields(); dataFormRef.value?.resetFields();
}); });
// 获取supermarketSpu信息 // 获取supermarketSpu信息
if (id) { if (id) {
form.id = id form.id = id;
getsupermarketSpuData(id) getsupermarketSpuData(id);
} }
if (categoryOptions.value.length <= 0) {
try {
const res = await getSupermarketCategory();
categoryOptions.value = res.data;
} catch (error) {
categoryOptions.value = [];
}
}
if (brandOptions.value.length <= 0) {
try {
const res = await getSupermarketBrand();
brandOptions.value = res.data;
} catch (error) {
brandOptions.value = [];
}
}
}; };
// 提交 // 提交
@@ -358,7 +375,7 @@ const onSubmit = async () => {
if (!valid) return false; if (!valid) return false;
try { try {
loading.value = true; loading.value = true;
form.id ? await putObj(form) : await addObj(form); form.id ? await putObj(form) : await addObj(form);
useMessage().success(form.id ? '修改成功' : '添加成功'); useMessage().success(form.id ? '修改成功' : '添加成功');
visible.value = false; visible.value = false;
@@ -366,24 +383,25 @@ const onSubmit = async () => {
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg); useMessage().error(err.msg);
} finally { } finally {
loading.value = false; loading.value = false;
} }
}; };
// 初始化表单数据 // 初始化表单数据
const getsupermarketSpuData = (id: string) => { const getsupermarketSpuData = (id: string) => {
// 获取数据 // 获取数据
loading.value = true loading.value = true;
getObj(id).then((res: any) => { getObj(id)
Object.assign(form, res.data) .then((res: any) => {
}).finally(() => { Object.assign(form, res.data);
loading.value = false })
}) .finally(() => {
loading.value = false;
});
}; };
// 暴露变量 // 暴露变量
defineExpose({ defineExpose({
openDialog openDialog,
}); });
</script> </script>
+135 -129
View File
@@ -1,158 +1,163 @@
<template> <template>
<el-dialog :title="form.supplierId ? '编辑' : '新增'" v-model="visible" <el-dialog :title="form.supplierId ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
:close-on-click-modal="false" draggable> <el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading"> <el-row :gutter="24">
<el-row :gutter="24"> <el-col :span="12" class="mb20">
<el-col :span="12" class="mb20"> <el-form-item label="货商名称" prop="supplierName">
<el-form-item label="货商名称" prop="supplierName"> <el-input v-model="form.supplierName" placeholder="请输入货商名称" />
<el-input v-model="form.supplierName" placeholder="请输入货商名称"/> </el-form-item>
</el-form-item> </el-col>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="货商类别" prop="supplierType"> <el-form-item label="货商类别" prop="supplierType">
<el-input v-model="form.supplierType" placeholder="请输入货商类别"/> <el-select v-model="form.supplierType" placeholder="请输入货商类别">
</el-form-item> <el-option v-for="item in supplierTypeOptions" :key="item.id" :label="item.typeName" :value="item.id" />
</el-col> </el-select>
</el-form-item>
</el-col>
<el-col :span="24" class="mb20"> <el-col :span="24" class="mb20">
<el-form-item label="货商地址" prop="address"> <el-form-item label="货商地址" prop="address">
<el-input type="textarea" v-model="form.address" placeholder="请输入货商地址"/> <el-input type="textarea" v-model="form.address" placeholder="请输入货商地址" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="联系人" prop="linkName"> <el-form-item label="联系人" prop="linkName">
<el-input v-model="form.linkName" placeholder="请输入联系人"/> <el-input v-model="form.linkName" placeholder="请输入联系人" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="电话号码" prop="phone"> <el-form-item label="电话号码" prop="phone">
<el-input v-model="form.phone" placeholder="请输入电话号码"/> <el-input v-model="form.phone" placeholder="请输入电话号码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20">
<el-form-item label="开户行" prop="openName">
<el-input v-model="form.openName" placeholder="请输入开户行" />
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="开户行" prop="openName"> <el-form-item label="开户行账号" prop="openAccount">
<el-input v-model="form.openName" placeholder="请输入开户行"/> <el-input v-model="form.openAccount" placeholder="请输入开户行账号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="开户行账号" prop="openAccount"> <el-form-item label="税号" prop="tax">
<el-input v-model="form.openAccount" placeholder="请输入开户行账号"/> <el-input v-model="form.tax" placeholder="请输入税号" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="税号" prop="tax"> <el-form-item label="邮箱地址" prop="email">
<el-input v-model="form.tax" placeholder="请输入税号"/> <el-input v-model="form.email" placeholder="请输入邮箱地址" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="邮箱地址" prop="email"> <el-form-item label="货商地区" prop="supplierArea">
<el-input v-model="form.email" placeholder="请输入邮箱地址"/> <el-input v-model="form.supplierArea" placeholder="请输入货商地区" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20">
<el-form-item label="合同号" prop="contractNumber">
<el-input v-model="form.contractNumber" 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 :label="item.value" v-for="(item, index) in status" border :key="index">{{ item.label }} </el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20"> <el-col :span="12" class="mb20">
<el-form-item label="货商地区" prop="supplierArea"> <el-form-item label="拼音简码" prop="pinyinCod">
<el-input v-model="form.supplierArea" placeholder="请输入货商地区"/> <el-input v-model="form.pinyinCod" placeholder="请输入拼音简码" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12" class="mb20">
<el-form-item label="合同号" prop="contractNumber">
<el-input v-model="form.contractNumber" 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 :label="item.value" v-for="(item, index) in status" border :key="index">{{ item.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" class="mb20">
<el-form-item label="拼音简码" prop="pinyinCod">
<el-input v-model="form.pinyinCod" placeholder="请输入拼音简码"/>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
<el-button @click="visible = false">取消</el-button> <el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button> <el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<script setup lang="ts" name="SmErpSupplierDialog"> <script setup lang="ts" name="SmErpSupplierDialog">
import { useDict } from '/@/hooks/dict'; import { useDict } from '/@/hooks/dict';
import { useMessage } from "/@/hooks/message"; import { useMessage } from '/@/hooks/message';
import { getObj, addObj, putObj } from '/@/api/supermarketerp/smErpSupplier' import { getObj, addObj, putObj, getSupplierTypeOptions } from '/@/api/supermarketerp/smErpSupplier';
import { rule } from '/@/utils/validate'; import { rule } from '/@/utils/validate';
const emit = defineEmits(['refresh']); const emit = defineEmits(['refresh']);
// 定义变量内容 // 定义变量内容
const dataFormRef = ref(); const dataFormRef = ref();
const visible = ref(false) const visible = ref(false);
const loading = ref(false) const loading = ref(false);
// 定义字典 // 定义字典
const { status } = useDict('status') const { status } = useDict('status');
const supplierTypeOptions = ref<any>([]); // 货商类别管理下拉选项
// 提交表单数据 // 提交表单数据
const form = reactive({ const form = reactive({
supplierId:'', supplierId: '',
supplierName: '', supplierName: '',
address: '', address: '',
phone: '', phone: '',
tax: '', tax: '',
linkName: '', linkName: '',
openAccount: '', openAccount: '',
email: '', email: '',
deptId: '', deptId: '',
supplierType: '', supplierType: '',
supplierArea: '', supplierArea: '',
passwordModifyTime: '', passwordModifyTime: '',
openName: '', openName: '',
contractNumber: '', contractNumber: '',
status: '', status: '',
pinyinCod: '', pinyinCod: '',
}); });
// 定义校验规则 // 定义校验规则
const dataRules = ref({ const dataRules = ref({
supplierName: [{required: true, message: '货商名称不能为空', trigger: 'blur'}], supplierName: [{ required: true, message: '货商名称不能为空', trigger: 'blur' }],
}) });
// 打开弹窗 // 打开弹窗
const openDialog = (id: string) => { const openDialog = async (id: string) => {
visible.value = true visible.value = true;
form.supplierId = '' form.supplierId = '';
// 重置表单数据 // 重置表单数据
nextTick(() => { nextTick(() => {
dataFormRef.value?.resetFields(); dataFormRef.value?.resetFields();
}); });
// 获取smErpSupplier信息 // 获取smErpSupplier信息
if (id) { if (id) {
form.supplierId = id form.supplierId = id;
getsmErpSupplierData(id) getsmErpSupplierData(id);
} }
if (supplierTypeOptions.value.length <= 0) {
try {
const res = await getSupplierTypeOptions();
supplierTypeOptions.value = res.data;
} catch (error) {
supplierTypeOptions.value = [];
}
}
}; };
// 提交 // 提交
@@ -161,7 +166,7 @@ const onSubmit = async () => {
if (!valid) return false; if (!valid) return false;
try { try {
loading.value = true; loading.value = true;
form.supplierId ? await putObj(form) : await addObj(form); form.supplierId ? await putObj(form) : await addObj(form);
useMessage().success(form.supplierId ? '修改成功' : '添加成功'); useMessage().success(form.supplierId ? '修改成功' : '添加成功');
visible.value = false; visible.value = false;
@@ -169,24 +174,25 @@ const onSubmit = async () => {
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg); useMessage().error(err.msg);
} finally { } finally {
loading.value = false; loading.value = false;
} }
}; };
// 初始化表单数据 // 初始化表单数据
const getsmErpSupplierData = (id: string) => { const getsmErpSupplierData = (id: string) => {
// 获取数据 // 获取数据
loading.value = true loading.value = true;
getObj(id).then((res: any) => { getObj(id)
Object.assign(form, res.data) .then((res: any) => {
}).finally(() => { Object.assign(form, res.data);
loading.value = false })
}) .finally(() => {
loading.value = false;
});
}; };
// 暴露变量 // 暴露变量
defineExpose({ defineExpose({
openDialog openDialog,
}); });
</script> </script>
+141 -113
View File
@@ -1,148 +1,176 @@
<template> <template>
<div class="layout-padding"> <div class="layout-padding">
<div class="layout-padding-auto layout-padding-view"> <div class="layout-padding-auto layout-padding-view">
<el-row v-show="showSearch"> <el-row v-show="showSearch">
<el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList"> <el-form :model="state.queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataList">
<el-form-item label="货商名称" prop="supplierName" > <el-form-item label="货商名称" prop="supplierName">
<el-input placeholder="请输入货商名称" v-model="state.queryForm.supplierName" /> <el-input placeholder="请输入货商名称" v-model="state.queryForm.supplierName" />
</el-form-item> </el-form-item>
<el-form-item label="电话号码" prop="phone" > <el-form-item label="电话号码" prop="phone">
<el-input placeholder="请输入电话号码" v-model="state.queryForm.phone" /> <el-input placeholder="请输入电话号码" v-model="state.queryForm.phone" />
</el-form-item> </el-form-item>
<el-form-item label="联系人" prop="linkName" > <el-form-item label="联系人" prop="linkName">
<el-input placeholder="请输入联系人" v-model="state.queryForm.linkName" /> <el-input placeholder="请输入联系人" v-model="state.queryForm.linkName" />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button icon="search" type="primary" @click="getDataList"> <el-button icon="search" type="primary" @click="getDataList"> 查询 </el-button>
查询 <el-button icon="Refresh" @click="resetQuery">重置</el-button>
</el-button> </el-form-item>
<el-button icon="Refresh" @click="resetQuery">重置</el-button> </el-form>
</el-form-item> </el-row>
</el-form> <el-row>
</el-row> <div class="mb8" style="width: 100%">
<el-row> <el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'supermarketerp_smErpSupplier_add'">
<div class="mb8" style="width: 100%"> 新 增
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" </el-button>
v-auth="'supermarketerp_smErpSupplier_add'"> <el-button
新 增 plain
</el-button> :disabled="multiple"
<el-button plain :disabled="multiple" icon="Delete" type="primary" icon="Delete"
v-auth="'supermarketerp_smErpSupplier_del'" @click="handleDelete(selectObjs)"> type="primary"
删除 v-auth="'supermarketerp_smErpSupplier_del'"
</el-button> @click="handleDelete(selectObjs)"
<right-toolbar v-model:showSearch="showSearch" :export="'supermarketerp_smErpSupplier_export'" >
@exportExcel="exportExcel" class="ml10 mr20" style="float: right;" 删除
@queryTable="getDataList"></right-toolbar> </el-button>
</div> <right-toolbar
</el-row> v-model:showSearch="showSearch"
<el-table :data="state.dataList" v-loading="state.loading" border :export="'supermarketerp_smErpSupplier_export'"
:cell-style="tableStyle.cellStyle" :header-cell-style="tableStyle.headerCellStyle" @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" @selection-change="selectionChangHandle"
@sort-change="sortChangeHandle"> @sort-change="sortChangeHandle"
<el-table-column type="selection" width="40" align="center" /> >
<el-table-column type="index" label="#" width="40" /> <el-table-column type="selection" width="40" align="center" />
<el-table-column prop="supplierName" label="货商名称" show-overflow-tooltip/> <el-table-column type="index" label="#" width="40" />
<el-table-column prop="phone" label="电话号码" show-overflow-tooltip/> <el-table-column prop="supplierName" label="货商名称" show-overflow-tooltip />
<el-table-column prop="tax" label="税号" show-overflow-tooltip/> <el-table-column prop="phone" label="电话号码" show-overflow-tooltip />
<el-table-column prop="linkName" label="联系人" show-overflow-tooltip/> <el-table-column prop="tax" label="税号" show-overflow-tooltip />
<el-table-column prop="openAccount" label="开户行账号" show-overflow-tooltip/> <el-table-column prop="linkName" label="联系人" show-overflow-tooltip />
<el-table-column prop="supplierType" label="货商类别" show-overflow-tooltip/> <el-table-column prop="openAccount" label="开户行账号" show-overflow-tooltip />
<el-table-column prop="supplierArea" label="货商地区" show-overflow-tooltip/> <el-table-column prop="supplierType" label="货商类别" show-overflow-tooltip>
<el-table-column prop="openName" label="开户行" show-overflow-tooltip/> <template #default="scope">{{
<el-table-column prop="contractNumber" label="合同号" show-overflow-tooltip/> supplierType.length > 0 && supplierType.find((item: any) => item.id == scope.row.supplierType).typeName
<el-table-column prop="status" label="状态" show-overflow-tooltip> }}</template>
<template #default="scope"> </el-table-column>
<dict-tag :options="status" :value="scope.row.status"></dict-tag> <el-table-column prop="supplierArea" label="货商地区" show-overflow-tooltip />
</template> <el-table-column prop="openName" label="开户行" show-overflow-tooltip />
</el-table-column> <el-table-column prop="contractNumber" label="合同号" show-overflow-tooltip />
<el-table-column prop="pinyinCod" label="拼音简码" show-overflow-tooltip/> <el-table-column prop="status" label="状态" show-overflow-tooltip>
<el-table-column prop="createTime" label="创建时间" show-overflow-tooltip/> <template #default="scope">
<el-table-column label="操作" width="150"> <dict-tag :options="status" :value="scope.row.status"></dict-tag>
<template #default="scope"> </template>
<el-button icon="edit-pen" text type="primary" v-auth="'supermarketerp_smErpSupplier_edit'" </el-table-column>
@click="formDialogRef.openDialog(scope.row.supplierId)">编辑</el-button> <el-table-column prop="pinyinCod" label="拼音简码" show-overflow-tooltip />
<el-button icon="delete" text type="primary" v-auth="'supermarketerp_smErpSupplier_del'" @click="handleDelete([scope.row.supplierId])">删除</el-button> <el-table-column prop="createTime" label="创建时间" show-overflow-tooltip />
</template> <el-table-column label="操作" width="150">
</el-table-column> <template #default="scope">
</el-table> <el-button
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" /> icon="edit-pen"
</div> text
type="primary"
v-auth="'supermarketerp_smErpSupplier_edit'"
@click="formDialogRef.openDialog(scope.row.supplierId)"
>编辑</el-button
>
<el-button icon="delete" text type="primary" v-auth="'supermarketerp_smErpSupplier_del'" @click="handleDelete([scope.row.supplierId])"
>删除</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)" /> <form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
</div>
</div>
</template> </template>
<script setup lang="ts" name="systemSmErpSupplier"> <script setup lang="ts" name="systemSmErpSupplier">
import { BasicTableProps, useTable } from "/@/hooks/table"; import { BasicTableProps, useTable } from '/@/hooks/table';
import { fetchList, delObjs } from "/@/api/supermarketerp/smErpSupplier"; import { fetchList, delObjs, getSupplierTypeOptions } from '/@/api/supermarketerp/smErpSupplier';
import { useMessage, useMessageBox } from "/@/hooks/message"; import { useMessage, useMessageBox } from '/@/hooks/message';
import { useDict } from '/@/hooks/dict'; import { useDict } from '/@/hooks/dict';
// 引入组件 // 引入组件
const FormDialog = defineAsyncComponent(() => import('./form.vue')); const FormDialog = defineAsyncComponent(() => import('./form.vue'));
// 定义查询字典 // 定义查询字典
const { status } = useDict('status') const { status } = useDict('status');
// 定义变量内容 // 定义变量内容
const formDialogRef = ref() const formDialogRef = ref();
// 搜索变量 // 搜索变量
const queryRef = ref() const queryRef = ref();
const showSearch = ref(true) const showSearch = ref(true);
// 多选变量 // 多选变量
const selectObjs = ref([]) as any const selectObjs = ref([]) as any;
const multiple = ref(true) const multiple = ref(true);
const supplierType = ref<any>([]); // 货商类别
const state: BasicTableProps = reactive<BasicTableProps>({ const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: {}, queryForm: {},
pageList: fetchList pageList: fetchList,
}) });
// table hook // table hook
const { const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state);
getDataList,
currentChangeHandle, // 获取货商类别
sizeChangeHandle, onMounted(async () => {
sortChangeHandle, try {
downBlobFile, const res = await getSupplierTypeOptions();
tableStyle supplierType.value = res.data;
} = useTable(state) } catch (error) {
supplierType.value = [];
}
});
// 清空搜索条件 // 清空搜索条件
const resetQuery = () => { const resetQuery = () => {
// 清空搜索条件 // 清空搜索条件
queryRef.value?.resetFields() queryRef.value?.resetFields();
// 清空多选 // 清空多选
selectObjs.value = [] selectObjs.value = [];
getDataList() getDataList();
} };
// 导出excel // 导出excel
const exportExcel = () => { const exportExcel = () => {
downBlobFile('/supermarketerp/smErpSupplier/export', Object.assign(state.queryForm, { ids: selectObjs }), 'smErpSupplier.xlsx') downBlobFile('/supermarketerp/smErpSupplier/export', Object.assign(state.queryForm, { ids: selectObjs }), 'smErpSupplier.xlsx');
} };
// 多选事件 // 多选事件
const selectionChangHandle = (objs: { supplierId: string }[]) => { const selectionChangHandle = (objs: { supplierId: string }[]) => {
selectObjs.value = objs.map(({ supplierId }) => supplierId); selectObjs.value = objs.map(({ supplierId }) => supplierId);
multiple.value = !objs.length; multiple.value = !objs.length;
}; };
// 删除操作 // 删除操作
const handleDelete = async (ids: string[]) => { const handleDelete = async (ids: string[]) => {
try { try {
await useMessageBox().confirm('此操作将永久删除'); await useMessageBox().confirm('此操作将永久删除');
} catch { } catch {
return; return;
} }
try { try {
await delObjs(ids); await delObjs(ids);
getDataList(); getDataList();
useMessage().success('删除成功'); useMessage().success('删除成功');
} catch (err: any) { } catch (err: any) {
useMessage().error(err.msg); useMessage().error(err.msg);
} }
}; };
</script> </script>