fix: 0.1.1 修正问题如下:
1. 修正了部分开发页面以及开源时的展示问题。 2. 修正了成品入库单模块出货功能行选择框缓存没清除的问题。 3. 修正了角色管理级联选中问题。 4. 修正了表格行按钮的宽度不够展示不全的问题。 5. 对 Excel 解析进行了兼容。
This commit is contained in:
21
LICENSE
21
LICENSE
@@ -1,21 +0,0 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2023 Brian Liu
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,10 +1,9 @@
|
||||
{
|
||||
"name": "erp-frontend",
|
||||
"version": "2.0.0",
|
||||
"version": "0.1.1",
|
||||
"private": true,
|
||||
"description": "牛安后台管理系统",
|
||||
"author": "Teeker <2456019588@qq.com>",
|
||||
"license": "MIT",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite --mode development",
|
||||
|
||||
@@ -40,7 +40,7 @@ export const useStatus = () => {
|
||||
};
|
||||
|
||||
const finishedProductReceiptStatusKeyMap: Record<number, string> = {
|
||||
1: "_base_info.finished_product_receipt_status.pending_outstock",
|
||||
0: "_base_info.finished_product_receipt_status.pending_outstock",
|
||||
3: "_base_info.finished_product_receipt_status.outstocking",
|
||||
4: "_base_info.finished_product_receipt_status.completed",
|
||||
};
|
||||
|
||||
@@ -8,6 +8,9 @@ import { get } from "@/common/http/request";
|
||||
interface Emits {
|
||||
(e: "data-loaded", data: any[]): void;
|
||||
(e: "expand-change", row: any, expandedRows: any[]): void;
|
||||
(e: "select", selection: any[], row: any): void;
|
||||
(e: "select-all", selection: any[]): void;
|
||||
(e: "selection-change", selection: any[]): void;
|
||||
}
|
||||
|
||||
const props = defineProps({
|
||||
@@ -18,6 +21,16 @@ const props = defineProps({
|
||||
parse: Function,
|
||||
expandRowKeys: Array as PropType<(string | number)[]>,
|
||||
rowKey: { type: String, default: "id" },
|
||||
// 树形数据配置
|
||||
treeProps: {
|
||||
type: Object as PropType<{ children: string; hasChildren?: string }>,
|
||||
default: () => ({ children: "children" }),
|
||||
},
|
||||
// 是否显示为树形表格
|
||||
isTreeTable: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
});
|
||||
const emit = defineEmits<Emits>();
|
||||
const tableMainRef = ref<InstanceType<typeof TableMain> | null>(null);
|
||||
@@ -67,6 +80,18 @@ const handleExpandChange = (row: any, expandedRows: any[]) => {
|
||||
emit("expand-change", row, expandedRows);
|
||||
};
|
||||
|
||||
const handleSelect = (selection: any[], row: any) => {
|
||||
emit("select", selection, row);
|
||||
};
|
||||
|
||||
const handleSelectAll = (selection: any[]) => {
|
||||
emit("select-all", selection);
|
||||
};
|
||||
|
||||
const handleSelectionChange = (selection: any[]) => {
|
||||
emit("selection-change", selection);
|
||||
};
|
||||
|
||||
const recomputeTableHeight = () => {
|
||||
if (!tableMainHostEl.value) return;
|
||||
const top = tableMainHostEl.value.getBoundingClientRect().top;
|
||||
@@ -85,6 +110,11 @@ defineExpose({
|
||||
sort: (field: string, order: string) => {
|
||||
tableMainRef.value?.tableRef?.sort(field, order);
|
||||
},
|
||||
toggleRowSelection: (row: any, selected?: boolean) => {
|
||||
tableMainRef.value?.toggleRowSelection(row, selected);
|
||||
},
|
||||
getSelectionRows: () => tableMainRef.value?.getSelectionRows() || [],
|
||||
clearSelection: () => tableMainRef.value?.tableRef?.clearSelection(),
|
||||
});
|
||||
|
||||
onMounted(async () => {
|
||||
@@ -135,7 +165,12 @@ onMounted(async () => {
|
||||
v-model:page-size="pageSize"
|
||||
:expand-row-keys="expandRowKeys"
|
||||
:row-key="rowKey"
|
||||
:tree-props="treeProps"
|
||||
:is-tree-table="isTreeTable"
|
||||
@expand-change="handleExpandChange"
|
||||
@select="handleSelect"
|
||||
@select-all="handleSelectAll"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<template #columns><slot name="columns"></slot></template>
|
||||
</TableMain>
|
||||
|
||||
@@ -94,6 +94,8 @@ watch(
|
||||
if (!val) {
|
||||
// 关闭时清空选中
|
||||
selectedRows.value = [];
|
||||
// 清空表格内部的选择状态,避免下次打开时残留
|
||||
tableRef.value?.clearSelection();
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -129,7 +131,7 @@ defineExpose({
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-dialog v-model="visible" :title="title" :close-on-click-modal="false" width="80%">
|
||||
<el-dialog v-model="visible" :title="title" :close-on-click-modal="false" :lock-scroll="false" width="80%">
|
||||
<!-- 1. 顶部筛选区域 (Slot) -->
|
||||
<div class="dialog-filter-area">
|
||||
<slot name="filter" :refresh="() => emit('filter-refresh')" :selected-rows="selectedRows">
|
||||
@@ -151,7 +153,7 @@ defineExpose({
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<!-- 勾选列 -->
|
||||
<el-table-column type="selection" width="55" :reserve-selection="true" v-if="selectable" />
|
||||
<el-table-column type="selection" width="55" v-if="selectable" />
|
||||
|
||||
<!-- 父组件自定义列 -->
|
||||
<slot name="table-columns"></slot>
|
||||
@@ -253,6 +255,11 @@ defineExpose({
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
:deep(.el-dialog__body) {
|
||||
overflow-y: auto;
|
||||
scrollbar-gutter: stable;
|
||||
}
|
||||
|
||||
:deep(.el-dialog__header) {
|
||||
padding: 16px 20px;
|
||||
margin-right: 0;
|
||||
|
||||
@@ -9,6 +9,8 @@ const props = defineProps({
|
||||
param: URLSearchParams,
|
||||
selectUrl: String,
|
||||
showCheckbox: { default: false },
|
||||
// 是否启用级联选择:勾选父节点自动勾选子节点,部分勾选子节点时父节点显示半选状态
|
||||
cascade: { type: Boolean, default: false },
|
||||
});
|
||||
const treeCheck = defineModel<number[]>();
|
||||
const treeSelect = defineModel("current-node");
|
||||
@@ -79,7 +81,7 @@ defineExpose({
|
||||
highlight-current
|
||||
:show-checkbox="showCheckbox"
|
||||
:default-checked-keys="treeCheck"
|
||||
check-strictly
|
||||
:check-strictly="!cascade"
|
||||
@check="checkHandle"
|
||||
@node-click="clickHandle"
|
||||
/>
|
||||
|
||||
@@ -57,7 +57,7 @@ const authShowFunc = (row: any, button: globalThis.ButtonProp) => {
|
||||
<style scoped>
|
||||
.operate-buttons {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
@@ -101,19 +101,14 @@ const resetForm = () => {
|
||||
<template>
|
||||
<el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" size="large" :class="ns.b()">
|
||||
<el-form-item prop="username">
|
||||
<el-input
|
||||
v-model="loginForm.username"
|
||||
placeholder="用户名(任意)"
|
||||
:prefix-icon="User"
|
||||
@keydown.enter="login"
|
||||
></el-input>
|
||||
<el-input v-model="loginForm.username" placeholder="用户名" :prefix-icon="User" @keydown.enter="login"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item prop="password">
|
||||
<el-input
|
||||
type="password"
|
||||
v-model="loginForm.password"
|
||||
placeholder="密码(任意)"
|
||||
placeholder="密码"
|
||||
show-password
|
||||
autocomplete="new-password"
|
||||
:prefix-icon="Lock"
|
||||
|
||||
@@ -191,7 +191,7 @@ const mappingConfig: FieldMappingConfig = {
|
||||
},
|
||||
},
|
||||
createDate: {
|
||||
sourceKey: ["生产日期", "createDate"],
|
||||
sourceKey: ["生产日期", "时间", "createDate"],
|
||||
header: $t("_prop.production.finishedproductreceipt.createDate"),
|
||||
width: 15,
|
||||
defaultValue: "",
|
||||
@@ -234,7 +234,7 @@ const remove = (row: any) => {
|
||||
// 成品入库状态标签类型映射
|
||||
const getFinishedProductReceiptStatusTagType = (code: number | null): string => {
|
||||
const tagTypeMap: Record<number, string> = {
|
||||
1: "warning", // 待出货
|
||||
0: "warning", // 未出货
|
||||
3: "primary", // 出货中
|
||||
4: "success", // 已完成
|
||||
};
|
||||
@@ -242,9 +242,9 @@ const getFinishedProductReceiptStatusTagType = (code: number | null): string =>
|
||||
};
|
||||
|
||||
const outstock = async (row: any) => {
|
||||
// 检查单据状态,只有待出货和出货中状态才能出货
|
||||
if (row.formStatus !== 1 && row.formStatus !== 3) {
|
||||
ElMessage.warning($t("_message.production.finishedproductreceipt.only_pending_outstocking_can_outstock"));
|
||||
// 检查单据状态,已完成状态不能出货(0=未出货, 3=出货中, 4=已完成)
|
||||
if (row.formStatus === 4) {
|
||||
ElMessage.warning($t("_message.production.finishedproductreceipt.completed_cannot_outstock"));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -253,9 +253,10 @@ const outstock = async (row: any) => {
|
||||
|
||||
try {
|
||||
const outstockData = await get(getOutstockDataUrl, { id: row.id }).then(res => res.data);
|
||||
outstockTableData.value = outstockData.map((item: any) => ({
|
||||
outstockTableData.value = outstockData.map((item: any, index: number) => ({
|
||||
...item,
|
||||
selected: false,
|
||||
rowId: item.id || `${item.productSn}_${index}`,
|
||||
}));
|
||||
|
||||
// 重置出货表单
|
||||
@@ -363,8 +364,15 @@ const operateButtonClick = (eventName: string, row: any) => {
|
||||
};
|
||||
|
||||
const authShowFunc = (row: any, button: globalThis.ButtonProp) => {
|
||||
// 只有已完成的入库单不能出货(formStatus === 4)
|
||||
if (row.formStatus === 4 && button.eventName === "outstock") return false;
|
||||
// 已完成状态不能出货
|
||||
if (button.eventName === "outstock") {
|
||||
return row.formStatus !== 4;
|
||||
}
|
||||
|
||||
// 只有未出货状态才能编辑和删除
|
||||
if (row.formStatus !== 0 && (button.eventName === "edit" || button.eventName === "remove")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 其他按钮根据业务需求显示
|
||||
return true;
|
||||
@@ -641,6 +649,7 @@ const handleReset = () => {
|
||||
:tableData="outstockTableData"
|
||||
:selectable="true"
|
||||
:useAuth="false"
|
||||
rowKey="rowId"
|
||||
@selection-change="handleOutstockSelectionChange"
|
||||
>
|
||||
<template #filter>
|
||||
|
||||
@@ -65,13 +65,13 @@ const outStockTypeOptions = [
|
||||
|
||||
const mappingConfig: FieldMappingConfig = {
|
||||
partNumber: {
|
||||
sourceKey: ["物料编号", "partNumber"],
|
||||
sourceKey: ["物料编号", "商品编号", "partNumber"],
|
||||
header: $t("_prop.production.finishedproductshipment.partNumber"),
|
||||
width: 20,
|
||||
defaultValue: "",
|
||||
},
|
||||
productSpecs: {
|
||||
sourceKey: ["型号", "物料型号", "productSpecs", "productSpec"],
|
||||
sourceKey: ["型号", "物料型号", "商品型号", "规格", "productSpecs", "productSpec"],
|
||||
header: $t("_prop.production.finishedproductshipment.productSpecs"),
|
||||
width: 20,
|
||||
defaultValue: "",
|
||||
|
||||
@@ -119,11 +119,11 @@ const mappingConfig: FieldMappingConfig = {
|
||||
defaultValue: "",
|
||||
},
|
||||
productSpecs: {
|
||||
sourceKey: "物料型号",
|
||||
sourceKey: ["物料型号", "商品型号", "型号", "规格"],
|
||||
defaultValue: "",
|
||||
},
|
||||
purchaseCount: {
|
||||
sourceKey: "采购数量",
|
||||
sourceKey: ["采购数量", "数量"],
|
||||
defaultValue: 0,
|
||||
transform: (val: any) => {
|
||||
const num = Number(val);
|
||||
|
||||
@@ -366,7 +366,7 @@ const generatePurchaseOrder = async () => {
|
||||
|
||||
const mappingConfig: FieldMappingConfig = {
|
||||
partNumber: {
|
||||
sourceKey: "物料编号",
|
||||
sourceKey: ["物料编号", "商品编号"],
|
||||
defaultValue: "",
|
||||
},
|
||||
|
||||
|
||||
@@ -239,7 +239,7 @@ const mappingConfig: FieldMappingConfig = {
|
||||
defaultValue: "",
|
||||
},
|
||||
productSpecs: {
|
||||
sourceKey: ["物料型号", "productSpecs"],
|
||||
sourceKey: ["物料型号", "productSpecs", "型号", "规格"],
|
||||
header: $t("_prop.sale.saleorder.productSpecs"),
|
||||
width: 20,
|
||||
defaultValue: "",
|
||||
|
||||
@@ -137,7 +137,7 @@ const getCommonStatusTagType = (code: number | null): string => {
|
||||
</el-row>
|
||||
<br />
|
||||
<el-form-item style="max-height: 400px; overflow: auto">
|
||||
<BaseTree ref="treeRef" :url="treeUrl" :show-checkbox="true" v-model="form.permissionIds" />
|
||||
<BaseTree ref="treeRef" :url="treeUrl" :show-checkbox="true" :cascade="true" v-model="form.permissionIds" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
</BaseForm>
|
||||
|
||||
@@ -135,11 +135,11 @@ const operateButtonClick = (eventName: string, row: any) => {
|
||||
// Excel导入配置
|
||||
const mappingConfig: FieldMappingConfig = {
|
||||
partNumber: {
|
||||
sourceKey: "物料编号",
|
||||
sourceKey: ["物料编号", "商品编号"],
|
||||
defaultValue: "",
|
||||
},
|
||||
productSpec: {
|
||||
sourceKey: "物料型号",
|
||||
sourceKey: ["物料型号", "商品型号", "型号", "规格"],
|
||||
defaultValue: "",
|
||||
},
|
||||
productCount: {
|
||||
|
||||
@@ -128,12 +128,12 @@ const itemArrayName = "transferOrderItems";
|
||||
|
||||
const mappingConfig: FieldMappingConfig = {
|
||||
partNumber: {
|
||||
sourceKey: "物料编号",
|
||||
sourceKey: ["物料编号", "商品编号"],
|
||||
defaultValue: "",
|
||||
},
|
||||
|
||||
productCount: {
|
||||
sourceKey: "调拨数量",
|
||||
sourceKey: ["调拨数量", "数量"],
|
||||
defaultValue: 0,
|
||||
transform: (val: any) => {
|
||||
const num = Number(val);
|
||||
|
||||
@@ -1,53 +1,3 @@
|
||||
<script setup lang="ts" name="Home"></script>
|
||||
|
||||
<template>
|
||||
<div class="tk-card-minimal">
|
||||
<el-descriptions class="margin-top" :column="1" border>
|
||||
<el-descriptions-item label="完整版 GitHub 地址">
|
||||
<el-link type="primary" href="https://github.com/Kele-Bingtang/teek-design-vue3" target="_blank">
|
||||
https://github.com/Kele-Bingtang/teek-design-vue3
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="精简版 GitHub 地址">
|
||||
<el-link type="primary" href="https://github.com/Kele-Bingtang/teek-design-vue3-template" target="_blank">
|
||||
https://github.com/Kele-Bingtang/teek-design-vue3-template
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="精简版 monorepo 架构 GitHub 地址(v1.5.1)">
|
||||
<el-link
|
||||
type="primary"
|
||||
href="https://github.com/Kele-Bingtang/teek-design-vue3-template/tree/monorepo"
|
||||
target="_blank"
|
||||
>
|
||||
https://github.com/Kele-Bingtang/teek-design-vue3-template/tree/monorepo
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="使用文档">
|
||||
<el-link type="primary" href="https://vue3-design-docs.teek.top/" target="_blank">
|
||||
https://vue3-design-docs.teek.top/
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="效果预览地址">
|
||||
<el-link type="primary" href="https://vue3-design.teek.top/" target="_blank">
|
||||
https://vue3-design.teek.top/
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="Vue2 完整版 Github 地址">
|
||||
<el-link type="primary" href="https://github.com/Kele-Bingtang/teek-design-vue2" target="_blank">
|
||||
https://github.com/Kele-Bingtang/teek-design-vue2
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="Vue2 精简版 Github 地址">
|
||||
<el-link type="primary" href="https://github.com/Kele-Bingtang/teek-design-vue2-template" target="_blank">
|
||||
https://github.com/Kele-Bingtang/teek-design-vue3-template
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="Vue2 效果预览地址">
|
||||
<el-link type="primary" href="https://vue2-design.teek.top/" target="_blank">
|
||||
https://vue2-design.teek.top/
|
||||
</el-link>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</template>
|
||||
<template></template>
|
||||
|
||||
Reference in New Issue
Block a user