diff --git a/src/api/base/store/sysStoreApi.js b/src/api/base/store/sysStoreApi.js new file mode 100644 index 0000000..90e25ab --- /dev/null +++ b/src/api/base/store/sysStoreApi.js @@ -0,0 +1,28 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/base/store/` + url, ...arg) + +/** + * 仓库Api接口管理器 + * + * @author Luck + * @date 2024/07/25 13:42 + **/ +export default { + // 获取仓库分页 + page(data) { + return request('page', data, 'get') + }, + // 提交仓库表单 edit为true时为编辑,默认为新增 + sysStoreSubmitForm(data, edit = false) { + return request(edit ? 'edit' : 'add', data) + }, + // 删除仓库 + sysStoreDelete(data) { + return request('delete', data) + }, + // 获取仓库详情 + sysStoreDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/src/api/base/unit/unitApi.js b/src/api/base/unit/unitApi.js new file mode 100644 index 0000000..9275952 --- /dev/null +++ b/src/api/base/unit/unitApi.js @@ -0,0 +1,28 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/base/sysunit/` + url, ...arg) + +/** + * 单位Api接口管理器 + * + * @author Luck + * @date 2024/07/23 11:36 + **/ +export default { + // 获取单位分页 + sysUnitPage(data) { + return request('page', data, 'get') + }, + // 提交单位表单 edit为true时为编辑,默认为新增 + sysUnitSubmitForm(data, edit = false) { + return request(edit ? 'edit' : 'add', data) + }, + // 删除单位 + sysUnitDelete(data) { + return request('delete', data) + }, + // 获取单位详情 + sysUnitDetail(data) { + return request('detail', data, 'get') + } +} diff --git a/src/api/base/unit/unitGroupsApi.js b/src/api/base/unit/unitGroupsApi.js new file mode 100644 index 0000000..753c0ef --- /dev/null +++ b/src/api/base/unit/unitGroupsApi.js @@ -0,0 +1,32 @@ +import { baseRequest } from '@/utils/request' + +const request = (url, ...arg) => baseRequest(`/base/sysunitgroup/` + url, ...arg) + +/** + * 单位组Api接口管理器 + * + * @author Luck + * @date 2024/07/26 10:46 + **/ +export default { + // 获取单位组分页 + sysUnitGroupPage(data) { + return request('page', data, 'get') + }, + // 提交单位组表单 edit为true时为编辑,默认为新增 + sysUnitGroupSubmitForm(data, edit = false) { + return request(edit ? 'edit' : 'add', data) + }, + // 删除单位组 + sysUnitGroupDelete(data) { + return request('delete', data) + }, + // 获取单位组详情 + sysUnitGroupDetail(data) { + return request('detail', data, 'get') + }, + // 单位组列表 + sysUnitGroupList(data) { + return request('list', data, 'get') + }, +} diff --git a/src/components/CardTitle/index.vue b/src/components/CardTitle/index.vue new file mode 100644 index 0000000..8902be5 --- /dev/null +++ b/src/components/CardTitle/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/FounderForm/index.vue b/src/components/FounderForm/index.vue new file mode 100644 index 0000000..c6338c3 --- /dev/null +++ b/src/components/FounderForm/index.vue @@ -0,0 +1,7 @@ + + + + + diff --git a/src/hook/useFormHandler.js b/src/hook/useFormHandler.js new file mode 100644 index 0000000..9d3511f --- /dev/null +++ b/src/hook/useFormHandler.js @@ -0,0 +1,75 @@ +import { useRoute, useRouter } from 'vue-router' +import { cloneDeep } from 'lodash-es' +import useTabs from '@/utils/useTabs' + +export default function useFormHandler(formItems, api) { + const state = reactive({ + PAGE_TYPE: '' + }) + + let formData = reactive({}) + const submitLoading = ref(false) + const formRefs = ref([]) + const route = useRoute() + const router = useRouter() + + const initializeFormData = (formItems, formData) => { + formItems.forEach((item) => { + formData[item.name] = item.defaultValue || '' + }) + } + + const onSubmit = async (params) => { + Promise.all(formRefs.value.map((form) => form.validate())) + .then(() => { + submitLoading.value = true + let formDataParam = params.isDeep ? cloneDeep(params) : cloneDeep(formData) + + if (route.query.id) { + formDataParam = { ...formDataParam, id: route.query.id } + } + api + .submitForm(formDataParam, route.query.id) + .then(() => { + router.go(-1) + useTabs.close() + }) + .finally(() => { + submitLoading.value = false + }) + }) + .catch((error) => { + console.error('Validation error:', error) + }) + } + + const handleBack = () => { + router.replace('/basicData/publicAccount') + useTabs.close() + } + + const fetchData = async (pageType) => { + initializeFormData(formItems, formData) + if (pageType && pageType !== 'ADD') { + try { + const res = await api.getDetail({ id: route.query.id }) + for (let key in formData) { + if (res[key] !== undefined) { + formData[key] = res[key] + } + } + } catch (error) { + console.error('API request failed:', error) + } + } + } + + return { + formData, + submitLoading, + formRefs, + onSubmit, + handleBack, + fetchData + } +} diff --git a/src/hook/useNavigation.js b/src/hook/useNavigation.js new file mode 100644 index 0000000..994d522 --- /dev/null +++ b/src/hook/useNavigation.js @@ -0,0 +1,25 @@ +import { useRouter } from 'vue-router' + +/** + * 封装路由跳转的 Hook + */ +export function useNavigation() { + // 创建 router 实例 + const router = useRouter() + + /** + * 跳转到指定的路由 + * @param {string|object} to - 目标路由的路径或路由对象 + * @param {object} params - 跳转所需的参数 + */ + const navigateTo = (to, params) => { + router.push({ + path: to, + query: params + }) + } + + return { + navigateTo + } +} diff --git a/src/hook/useTableManagement.js b/src/hook/useTableManagement.js new file mode 100644 index 0000000..b628b21 --- /dev/null +++ b/src/hook/useTableManagement.js @@ -0,0 +1,112 @@ +import { cloneDeep } from 'lodash-es' +import { hasPerm } from '@/utils/permission' +import { useRouter } from 'vue-router' +import useTabs from '@/utils/useTabs' + +/** + * 列表页面表格信息 hook 封装(数据操作) + * @param apiModule 调用接口 + * @param tableColumns 表格头部信息 + * @returns {{searchFormRef: Ref>, toolConfig: {columnSetting: boolean, striped: boolean, refresh: boolean, height: boolean}, searchFormState: Ref>, tableRef: Ref>, selectedRowKeys: Ref>, columns: Ref>, options: {rowSelection: {onChange: options.rowSelection.onChange}, alert: {show: boolean, clear: options.alert.clear}}, reset: reset, loadData: (function(*): *), deleteBatchRecords: deleteBatchRecords, deleteRecord: deleteRecord}} + */ +export function useTableManagement(apiModule = {}, tableColumns, hasPermData) { + const searchFormState = ref({}) + const searchFormRef = ref({}) + const tableRef = ref(null) + const selectedRowKeys = ref([]) + const router = useRouter() + + // 动态列配置 + const columns = ref(tableColumns) + + const toolConfig = { refresh: true, height: true, columnSetting: true, striped: false } + + // 根据权限添加操作列 + if (hasPerm(hasPermData)) { + // 判断columns 是否有操作 + const columnsFilter = columns.value.filter((item) => item.dataIndex === 'action') + if (columnsFilter.length === 0) + columns.value.push({ + title: '操作', + dataIndex: 'action', + align: 'center', + width: 200, + fixed: 'right', + max_width: 100 + }) + } + + // 加载数据 + const loadData = (parameter) => { + const searchFormParam = cloneDeep(searchFormState.value) + return apiModule.page(Object.assign(parameter, searchFormParam)).then((data) => { + return data + }) + } + + // 重置 + const reset = () => { + if (tableRef.value) { + tableRef.value.resetFields() + tableRef.value.refresh(true) + } + } + + // 删除 + const deleteRecord = (record) => { + let params = [{ id: record.id }] + apiModule.delete(params).then(() => { + if (tableRef.value) { + tableRef.value.refresh(true) + } + }) + } + + // 批量删除 + const deleteBatchRecords = (params) => { + apiModule.delete(params).then(() => { + if (tableRef.value) { + tableRef.value.clearRefreshSelected() + } + }) + } + + // 选择配置 + const options = { + alert: { + show: true, + clear: () => { + selectedRowKeys.value = [] + } + }, + rowSelection: { + onChange: (selectedRowKey, selectedRows) => { + selectedRowKeys.value = selectedRowKey + } + } + } + + // 页面跳转 + const navigateTo = (to, params) => { + router.push({ + path: to, + query: params + }) + } + + // 返回Hook的值 + return { + searchFormState, + searchFormRef, + tableRef, + selectedRowKeys, + columns, + loadData, + reset, + deleteRecord, + deleteBatchRecords, + options, + toolConfig, + navigateTo + } +} diff --git a/src/views/basicData/brand/detail/index.vue b/src/views/basicData/brand/detail/index.vue new file mode 100644 index 0000000..f0327f2 --- /dev/null +++ b/src/views/basicData/brand/detail/index.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/views/basicData/brand/index.vue b/src/views/basicData/brand/index.vue new file mode 100644 index 0000000..382a0dd --- /dev/null +++ b/src/views/basicData/brand/index.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/views/basicData/client/detail/index.vue b/src/views/basicData/client/detail/index.vue new file mode 100644 index 0000000..a9be07b --- /dev/null +++ b/src/views/basicData/client/detail/index.vue @@ -0,0 +1,5 @@ + + + + + diff --git a/src/views/basicData/client/index.vue b/src/views/basicData/client/index.vue new file mode 100644 index 0000000..138dc0b --- /dev/null +++ b/src/views/basicData/client/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/views/basicData/employee/detail/index.vue b/src/views/basicData/employee/detail/index.vue new file mode 100644 index 0000000..a9be07b --- /dev/null +++ b/src/views/basicData/employee/detail/index.vue @@ -0,0 +1,5 @@ + + + + + diff --git a/src/views/basicData/employee/index.vue b/src/views/basicData/employee/index.vue new file mode 100644 index 0000000..d3044ac --- /dev/null +++ b/src/views/basicData/employee/index.vue @@ -0,0 +1,187 @@ + + + diff --git a/src/views/basicData/materiel/detail/index.vue b/src/views/basicData/materiel/detail/index.vue new file mode 100644 index 0000000..a9be07b --- /dev/null +++ b/src/views/basicData/materiel/detail/index.vue @@ -0,0 +1,5 @@ + + + + + diff --git a/src/views/basicData/materiel/index.vue b/src/views/basicData/materiel/index.vue new file mode 100644 index 0000000..3d1f5b6 --- /dev/null +++ b/src/views/basicData/materiel/index.vue @@ -0,0 +1,341 @@ + + + diff --git a/src/views/basicData/publicAccount/detail/index.vue b/src/views/basicData/publicAccount/detail/index.vue new file mode 100644 index 0000000..007da15 --- /dev/null +++ b/src/views/basicData/publicAccount/detail/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/src/views/basicData/publicAccount/index.vue b/src/views/basicData/publicAccount/index.vue new file mode 100644 index 0000000..0459fe1 --- /dev/null +++ b/src/views/basicData/publicAccount/index.vue @@ -0,0 +1,171 @@ + + + diff --git a/src/views/basicData/stash/detail/index.vue b/src/views/basicData/stash/detail/index.vue new file mode 100644 index 0000000..ebd2d0d --- /dev/null +++ b/src/views/basicData/stash/detail/index.vue @@ -0,0 +1,200 @@ + + + diff --git a/src/views/basicData/stash/index.vue b/src/views/basicData/stash/index.vue new file mode 100644 index 0000000..801bc9f --- /dev/null +++ b/src/views/basicData/stash/index.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/views/basicData/unit/columns/unitColumns.js b/src/views/basicData/unit/columns/unitColumns.js new file mode 100644 index 0000000..6c62a3c --- /dev/null +++ b/src/views/basicData/unit/columns/unitColumns.js @@ -0,0 +1,54 @@ +export const unitColumns = [ + { + title: '编码', + dataIndex: 'number', + width: 150, + resizable: true, + align: 'center' + }, + { + title: '名称', + dataIndex: 'name', + width: 150, + resizable: true, + align: 'center' + }, + { + title: '可用状态', + dataIndex: 'enabledState', + width: 150, + resizable: true, + align: 'center' + }, + { + title: '换算率', + dataIndex: 'rate', + width: 200, + resizable: true, + align: 'center' + }, + { + title: '是否基本单位', + dataIndex: 'isBase', + width: 80, + resizable: true, + align: 'center' + } +] + +export const unitGroupColumns = [ + { + title: '名称', + dataIndex: 'name', + width: 180, + resizable: true, + align: 'center' + }, + { + title: '状态', + dataIndex: 'enabledState', + width: 80, + resizable: true, + align: 'center' + } +] diff --git a/src/views/basicData/unit/detail/UnitGroupForm.vue b/src/views/basicData/unit/detail/UnitGroupForm.vue new file mode 100644 index 0000000..3579cb5 --- /dev/null +++ b/src/views/basicData/unit/detail/UnitGroupForm.vue @@ -0,0 +1,91 @@ + + +