16 Commits

Author SHA1 Message Date
17625a1cff feat: 🚀 完工 2025-11-10 15:35:59 +08:00
b0e729f9c0 fix: 🧩 修复金蝶仓库和子仓库options无法清空 2025-11-08 10:40:06 +08:00
caf79bae5a feat: 🚀 仓库关系查询-详情-更新 2025-11-08 09:48:16 +08:00
cad97ac4fd fix: 🧩 修复关闭标签对应的关联无法清空 2025-11-07 17:48:36 +08:00
1e80affb50 feat: 🚀 查询条件关联关系处理 2025-11-07 17:43:03 +08:00
107bd1a933 feat: 🚀 仓库关系 2025-11-07 09:46:06 +08:00
1208835216 feat: 🚀 店铺资料接口联调 2025-10-30 13:58:56 +08:00
da31b2d347 feat: 🚀 修复bug 2025-10-29 15:03:16 +08:00
d0d6853806 feat: 🚀 新增仓位找货优先级 2025-10-23 15:16:29 +08:00
f3bc8e6410 feat: 🚀 仓库关系和仓位找货优先级 2025-10-22 16:03:19 +08:00
173131d11c feat: 🚀 仓库关系 2025-10-22 14:44:08 +08:00
a90dab331c feat: 🚀 店铺资料 2025-10-22 14:24:26 +08:00
c0750ed493 feat: 🚀 入库单列表增加客户名称搜索条件 2025-10-21 16:33:31 +08:00
8a958c987e feat: 🚀 生产环境 2025-10-21 11:48:44 +08:00
0861dae12d fix: 🧩 修复bug 2025-10-20 11:50:38 +08:00
e8dc354c10 fix: 🧩 修复bug 2025-10-17 17:25:38 +08:00
80 changed files with 4042 additions and 1247 deletions

View File

@@ -1,10 +1,10 @@
ENV = 'production' ENV = 'production'
VITE_APP_API_VERSION = "" #版本号 VITE_APP_API_VERSION = "" #版本号
VITE_APP_API_BASEURL = https://opsscmapi.f2b211.com/api/ #请求地址 VITE_APP_API_BASEURL = https://newwms.api.f2b211.com/v1/admapi/ #请求地址
VITE_APP_SSO_LOGINURL = https://uc.v3.f2b211.com/uc/login VITE_APP_SSO_LOGINURL = https://uc.v3.f2b211.com/uc/login
VITE_APP_SSO_APPID = 100664627590856707 VITE_APP_SSO_APPID = 100664627590856709
VITE_REDIRECT_URL = https://wms.v2.f2b211.com/login #单点从定向地址 VITE_REDIRECT_URL = https://newwms.f2b211.com/login #单点从定向地址
VITE_SINGLE_URL = https://uc.v3.f2b211.com/ #单点登录通知 VITE_SINGLE_URL = https://uc.v3.f2b211.com/ #单点登录通知
# 线上环境 # 线上环境
VITE_USER_NODE_ENV = production VITE_USER_NODE_ENV = production

View File

@@ -1,25 +0,0 @@
import http from "@/api";
import { ResPage } from "@/api/interface/index";
/**
* @name 防伪码模块
*/
//防伪码记录列表
export const getListApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SecurityNumber/GetGenerateRecordList`, params);
};
//生成防伪码
export const getGenerateSecurityNumberApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SecurityNumber/Generate`, params);
};
//防伪码下载列表 getDownListApi
export const getDownListApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SecurityNumber/GetList`, params);
};
//下载
export const getDownAllApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SecurityNumber/Export`, params);
};
//选择下载
export const getDownApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SecurityNumber/Export`, params);
};

View File

@@ -1,110 +0,0 @@
import http from "@/api";
import { ResPage } from "@/api/interface/index";
/**
* @name 打印产品条码模块
*/
//产品条码生成记录列表
export const getListApi = (params: Record<string, any>) => {
// console.log(params);
// return {
// isSuccess: true,
// message: "Success",
// status: 200,
// totalCount: 1,
// data: [
// {
// id: 17372,
// specifications: "ORICO-H7013-U3-AD-EU-BK-BP",
// materialNumber: "G01-43-552867",
// materialName: "7口USB3.0集线器",
// barCode: "6936761881968",
// purchaseBillNo: "ceshi1224",
// generateComplete: "已完成",
// number: 300,
// printNumber: 0,
// downLoadNumber: 300,
// useNumber: 2,
// creator: "admin",
// createTime: "2024-12-24 10:27:04",
// generateCompleteTime: "2024-12-24 10:27:05",
// supplierOrOrg: "深圳市元创时代科技有限公司",
// isUpdateMaterial: false,
// isTwo: 2
// }
// ]
// };
return http.post<ResPage<any>>(`SerialNumber/GetGenerateRecordList`, params);
};
//产品条码列表
export const getCodeListApi = (params: Record<string, any>) => {
// console.log(params);
// return {
// totalCount: 300,
// data: [
// {
// materialNumber: "G01-43-552867",
// materialName: "7口USB3.0集线器",
// specifications: "ORICO-H7013-U3-AD-EU-BK-BP",
// old_Specifications: "",
// barCode: "6936761881968",
// serialNumber: "10FC-616M3R",
// twoSerialNumber: "10FC-616M3R-two",
// numberCode: "241224000417",
// id: 202593401,
// number: 300,
// isUse: false,
// isUseStr: "否",
// box: "",
// creator: "admin",
// createTime: "2024-12-24 10:27:05",
// printNumber: 0,
// downLoadNumber: 1,
// printTime: "",
// downLoadTime: "2025-01-08 16:11:39",
// isEnablePrint: true
// },
// {
// materialNumber: "G01-43-552867",
// materialName: "7口USB3.0集线器",
// specifications: "ORICO-H7013-U3-AD-EU-BK-BP",
// old_Specifications: "",
// barCode: "6936761881968",
// serialNumber: "10FC-616M3Q",
// twoSerialNumber: "10FC-616M3R-two",
// numberCode: "241224000416",
// id: 202593400,
// number: 300,
// isUse: false,
// isUseStr: "否",
// box: "",
// creator: "admin",
// createTime: "2024-12-24 10:27:05",
// printNumber: 0,
// downLoadNumber: 1,
// printTime: "",
// downLoadTime: "2025-01-08 16:11:39",
// isEnablePrint: true
// }
// ],
// isSuccess: true,
// status: 200,
// message: "Success"
// };
return http.post<ResPage<any>>(`SerialNumber/GetList`, params);
};
//转换规格型号 SerialNumber/UpdateMaterial
export const getUpdateMaterialApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SerialNumber/UpdateMaterial`, params);
};
//产品条码列表下载
export const getSerialNumberDownLoadApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SerialNumber/Export`, params);
};
//生成条码
export const generateBarCodeApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SerialNumber/Generate`, params);
};
//打印
export const getPrintListCodeApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`SerialNumber/Print`, params);
};

View File

@@ -1,48 +0,0 @@
import http from "@/api";
import { ResPage } from "@/api/interface/index";
//箱信息列表
export const getListApi = (params: any) => {
return http.post<ResPage<any>>(`Box/GetList`, params);
};
//生成箱碼
export const getBoxGenerateApi = (params: any) => {
return http.post<ResPage<any>>(`Box/Generate`, params);
};
//裝箱保存
export const getSaveBoxApi = (params: any) => {
return http.post<ResPage<any>>(`Box/Save`, params, { noLoading: false });
};
//打印
export const getPrintBoxApi = (params: any) => {
return http.post<ResPage<any>>(`Box/Print`, params);
};
//刪除 /
export const getDeleteBoxApi = (params: any) => {
return http.post<ResPage<any>>(`Box/Delete`, params);
};
//清空
export const getClearBoxApi = (params: any) => {
return http.get<ResPage<any>>(`Box/Clear`, params);
};
//根据箱号获取箱信息
export const getBoxByNoApi = (params: any) => {
return http.get<ResPage<any>>(`Box/GetBoxByNo`, params, {
noLoading: true
});
};
//根据序列号获取序列号信息
export const getSerialNumberApi = (params: any) => {
return http.get<ResPage<any>>(`SerialNumber/Get`, params);
};
//根据箱号去获取序列号
export const getSerialNumberByBoxIdApi = (params: any) => {
return http.post<ResPage<any>>(`SerialNumber/GetByBoxId`, params, { noLoading: true });
};
//重新装箱
export const getBoxRestartApi = (params: any) => {
return http.post<ResPage<any>>(`Box/Restart`, params);
};
//开始装箱时间接口 Box/BeginCarton
export const getBeginCartonApi = (params: any) => {
return http.get<ResPage<any>>(`Box/BeginCarton`, params);
};

View File

@@ -1,14 +0,0 @@
//箱唛
import http from "@/api";
import { ResPage } from "@/api/interface/index";
//箱唛列表
export const getBoxMarkListApi = (params: Record<string, any>) => {
return http.post<ResPage<any>>(`BoxMark/GetList`, params);
};
//生成箱唛
export const getMaterialListApi = (params: any) => {
console.log(params);
// return http.get<any>(`SysConfig/GetMaterialList?speci=${encodeURIComponent(speci)}`);
return [];
};

View File

@@ -1,6 +1,10 @@
import http from "@/api"; import http from "@/api";
// 导出列表 // 导出列表
export const getListApi = (params: Record<string, any>) => { export const getListApi = (params: Record<string, any>) => {
if (params?.status === "正在导出") {
params.status = 0;
}
return http.get<any>(`exports`, params); return http.get<any>(`exports`, params);
}; };
//状态 //状态

View File

@@ -26,6 +26,22 @@ export const getProductLinesApi = (params: any) => {
}; };
//仓库 //仓库
export const getWarehousesListApi = () => { export const getWarehousesListApi = (params?: any) => {
return http.get<any>(`basicinfo/warehouses`); return http.get<any>(`basicinfo/warehouses`, params);
};
//获取金蝶仓库
export const getWarehousesKingdeeListApi = (params: any) => {
return http.get<any>(`basicinfo/warehouses/kingdee`, params);
};
//获取金蝶子仓库
export const getSubwarehouseskingdeeListApi = (params?: any) => {
return http.get<any>(`basicinfo/subwarehouses/kingdee`, params);
};
//获取聚水潭仓库 /admapi/basicinfo/warehouses/jushuitan
export const getWarehousesJushuitanListApi = (params?: any) => {
return http.get<any>(`basicinfo/warehouses/jushuitan`, params);
};
export const getWarehousesLingXingListApi = (params?: any) => {
return http.get<any>(`basicinfo/warehouses/lingxing`, params);
}; };

View File

@@ -0,0 +1,26 @@
import http from "@/api";
//列表 /admapi/warehouse/pos_picking_priority
export const getGoodsListApi = (params: any) => {
return http.get<any>(`warehouse/pos_picking_priority`, params);
};
//新增 /admapi/warehouse/pos_picking_priority
export const getGoodsAddApi = (params: any) => {
return http.post<any>(`warehouse/pos_picking_priority`, params);
};
//更新
export const getGoodsUpApi = (id: any, params: any) => {
return http.post<any>(`warehouse/pos_picking_priority/${id}`, params);
};
//详情
export const getGoodsDetailsApi = (id: any) => {
return http.get<any>(`warehouse/pos_picking_priority/${id}`);
};
//预览
export const getGoodsPreviewApi = (id: any) => {
return http.get<any>(`warehouse/pos_picking_priority/preview/${id}`);
};
//验证 /admapi/warehouse/pos_picking_priority/check_exists
export const getGoodsCheckExistswApi = (params: any) => {
return http.get<any>(`warehouse/pos_picking_priority/check_exists`, params);
};

View File

@@ -0,0 +1,23 @@
import http from "@/api";
//列表
export const getSetWarehouseListApi = (params: any) => {
return http.get<any>(`warehouse/relationship`, params);
};
//删除
export const getWarehouseDelApi = (params: any) => {
return http.delete<any>(`warehouse/relationship/${params}`);
};
//新增 /admapi/warehouse/relationship
export const getWarehouseAddApi = (params: any) => {
return http.post<any>(`warehouse/relationship`, params);
};
//更新
export const getWarehouseUpApi = (id: any, params: any) => {
return http.post<any>(`warehouse/relationship/${id}`, params);
};
//详情
export const getWarehouseDetailsApi = (id: any) => {
return http.get<any>(`warehouse/relationship/${id}`);
};

30
src/api/modules/shop.ts Normal file
View File

@@ -0,0 +1,30 @@
import http from "@/api";
//店鋪資料列表
export const getShopListApi = (params: any) => {
return http.get<any>(`store`, params);
};
//獲取接入系統列表數據
export const getShopAccessSystemApi = () => {
return http.get<any>(`store/access_system`);
};
//删除
export const getShopDelApi = (params: any) => {
return http.delete<any>(`store/${params}`);
};
//新增
export const getShopAddApi = (params: any) => {
return http.post<any>(`store`, params);
};
//更新
export const getShopUpApi = (id: any, params: any) => {
return http.post<any>(`store/${id}`, params);
};
//详情
export const getShopDetailsApi = (id: any) => {
return http.get<any>(`store/${id}`);
};
//导出
export const getShopListExportApi = (params: any) => {
return http.get<any>(`store/export`, params);
};

View File

@@ -12,5 +12,8 @@ export const getSubscribeResetListApi = (params: any) => {
return http.get<any>(`subscribe/wrr/reload`, params); return http.get<any>(`subscribe/wrr/reload`, params);
}; };
export const getSubscribeResetListExportApi = (params: any) => { export const getSubscribeResetListExportApi = (params: any) => {
if (params?.notif_ret_status === "空") {
params.notif_ret_status = 0;
}
return http.get<any>(`subscribe/wrr/export`, params); return http.get<any>(`subscribe/wrr/export`, params);
}; };

1
src/components.d.ts vendored
View File

@@ -19,6 +19,7 @@ declare module "vue" {
ElCheckbox: typeof import("element-plus/es")["ElCheckbox"]; ElCheckbox: typeof import("element-plus/es")["ElCheckbox"];
ElContainer: typeof import("element-plus/es")["ElContainer"]; ElContainer: typeof import("element-plus/es")["ElContainer"];
ElDatePicker: typeof import("element-plus/es")["ElDatePicker"]; ElDatePicker: typeof import("element-plus/es")["ElDatePicker"];
ElDialog: typeof import("element-plus/es")["ElDialog"];
ElDrawer: typeof import("element-plus/es")["ElDrawer"]; ElDrawer: typeof import("element-plus/es")["ElDrawer"];
ElDropdown: typeof import("element-plus/es")["ElDropdown"]; ElDropdown: typeof import("element-plus/es")["ElDropdown"];
ElDropdownItem: typeof import("element-plus/es")["ElDropdownItem"]; ElDropdownItem: typeof import("element-plus/es")["ElDropdownItem"];

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="search-box1" ref="searchRef"> <div :class="isSearch ? 'search-box' : 'search-box1'" ref="searchRef">
<el-form <el-form
ref="ruleFormRef" ref="ruleFormRef"
:model="_searchResult" :model="_searchResult"
@@ -37,6 +37,7 @@
:placeholder="item.placeholder" :placeholder="item.placeholder"
:disabled="item.disabled" :disabled="item.disabled"
type="textarea" type="textarea"
:maxlength="item.maxLength ? item.maxLength : 255"
> >
</el-input> </el-input>
</template> </template>
@@ -66,16 +67,33 @@
:placeholder="item.placeholder" :placeholder="item.placeholder"
clearable clearable
:disabled="item.disabled" :disabled="item.disabled"
@change="handleSelectChange(item)"
> >
<el-option <el-option
v-for="options in item.options" v-for="option in item.options"
:label="options.label" :label="option.label"
:value="options.value" :value="option.value"
:key="options.label" :key="option.label"
/>
</el-select>
</template>
<!-- 多选不带输入 -->
<template v-if="item.type === 'selectMultiples'">
<el-select
v-model="_searchResult[`${item.prop}`]"
:placeholder="item.placeholder"
multiple
:disabled="item.disabled"
style="max-height: 150px; overflow-y: auto"
>
<el-option
v-for="option in item.options"
:label="option.label"
:value="option.value"
:key="option.label"
/> />
</el-select> </el-select>
</template> </template>
<template v-if="item.type === 'date'"> <template v-if="item.type === 'date'">
<el-date-picker <el-date-picker
:disabled="item.disabled" :disabled="item.disabled"
@@ -136,10 +154,30 @@
></el-option> ></el-option>
</el-select> </el-select>
</template> </template>
<!-- 单选带模糊搜索 -->
<template v-if="item.type === 'selectMultipleD'">
<el-select
v-model="_searchResult[`${item.prop}`]"
filterable
:reserve-keyword="false"
:disabled="item.disabled"
:placeholder="item.placeholder"
clearable
@clear="handleSelectMultipleDClear(item)"
>
<!-- 循环渲染选项label 为显示文本value 为实际提交值 -->
<el-option
v-for="option in item.options"
:key="option.value"
:label="option.label"
:value="option.value"
></el-option>
</el-select>
</template>
<!-- 客户也是多选带模糊搜搜 -->
<template <template
v-if="item.type === 'selectMultipleRemoteCustomersNames' || item.type === 'selectProductLinesRemote'" v-if="item.type === 'selectMultipleRemoteCustomersNames' || item.type === 'selectProductLinesRemote'"
> >
<!-- // filterable -->
<el-select <el-select
v-model="_searchResult[`${item.prop}`]" v-model="_searchResult[`${item.prop}`]"
:placeholder="item.placeholder" :placeholder="item.placeholder"
@@ -178,11 +216,14 @@ const props = defineProps<{
labelWidth?: string; labelWidth?: string;
ruleForm: Record<string, any>; ruleForm: Record<string, any>;
style?: string; style?: string;
isSearch?: Boolean;
inline?: Boolean; inline?: Boolean;
getSearchValue?: () => void; getSearchValue?: () => void;
selectMultipleRemoveTag?: () => void; selectMultipleRemoveTag?: () => void;
selectMultipleRemoteTag1?: () => void; selectMultipleRemoteTag1?: () => void;
setRuleFormValue?: () => void; setRuleFormValue?: () => void;
selectMultipleDClear?: () => void;
selectChange?: () => void;
}>(); }>();
let _searchResult = computed(() => { let _searchResult = computed(() => {
@@ -195,8 +236,12 @@ const emits = defineEmits<{
(e: "setRuleFormValue", result: Record<string, any>): void; (e: "setRuleFormValue", result: Record<string, any>): void;
(e: "selectMultipleRemoveTag", result: Record<string, any>): void; (e: "selectMultipleRemoveTag", result: Record<string, any>): void;
(e: "selectMultipleRemoteTag1", result: Record<string, any>): void; (e: "selectMultipleRemoteTag1", result: Record<string, any>): void;
(e: "selectMultipleDClear", result: Record<string, any>): void;
(e: "selectChange", result: Record<string, any>): void;
}>(); }>();
const handleSelectChange = (item: any) => {
emits("selectChange", item);
};
const handleRomoveTag = (item: any) => { const handleRomoveTag = (item: any) => {
emits("selectMultipleRemoveTag", { item, org_number: _searchResult.value.org_number }); emits("selectMultipleRemoveTag", { item, org_number: _searchResult.value.org_number });
}; };
@@ -205,6 +250,7 @@ const handleTagRemove1 = (item: any) => {
item.options = []; item.options = [];
} }
}; };
//客戶 //客戶
const getCustomers = async (keywords: any, item: any) => { const getCustomers = async (keywords: any, item: any) => {
let org_number = _searchResult.value.org_number.join(","); let org_number = _searchResult.value.org_number.join(",");
@@ -268,6 +314,10 @@ const getUsers = async (keywords: any, item: any) => {
} }
}; };
const handleSelectMultipleDClear = (item: any) => {
emits("selectMultipleDClear", { item });
};
//远程搜索多选 //远程搜索多选
const handleSelectMultipleRemote = (query: any, item: any) => { const handleSelectMultipleRemote = (query: any, item: any) => {
if (!query) { if (!query) {
@@ -388,6 +438,60 @@ defineExpose({
margin-bottom: 8px !important; margin-bottom: 8px !important;
} }
} }
.search-box {
position: relative;
display: flex;
min-width: 600px;
padding: 16px;
background: #ffffff;
border-radius: 6px;
// 单据头用的样式
.form-box {
// width: 85%;
.form-item {
width: 392px !important;
// height: 32px;
// 原代码有 height: 32px !important; 这会导致子元素高度超出后被遮盖
height: auto !important; // 改为自动高度
min-height: 32px; // 保留最小高度,未选择时对齐
margin-bottom: 8px !important;
.el-form-item__label {
font-size: 12px !important;
}
.el-select {
width: 392px;
}
.el-form-item--default {
width: 392px;
}
}
.form-item1 {
width: 594px !important;
// height: 32px;
// 原代码有 height: 32px !important; 这会导致子元素高度超出后被遮盖
height: auto !important; // 改为自动高度
min-height: 32px; // 保留最小高度,未选择时对齐
margin-bottom: 8px !important;
.el-form-item__label {
font-size: 12px !important;
}
.el-select {
width: 594px;
}
.el-form-item--default {
width: 594px;
}
}
.form-item2 {
width: 494px !important;
}
margin-bottom: 8px !important;
}
}
.el-form-item--default .el-form-item__label { .el-form-item--default .el-form-item__label {
height: 32px; height: 32px;
margin-bottom: 8px; margin-bottom: 8px;

View File

@@ -147,7 +147,7 @@ const newValInitParams = toRef(props, "initParam");
const { selectionChange, selectedList, selectedListIds, isSelected } = useSelection(props.rowKey); const { selectionChange, selectedList, selectedListIds, isSelected } = useSelection(props.rowKey);
// 清空选中数据列表 // 清空选中数据列表
const clearSelection = () => tableRef.value!.clearSelection(); const clearSelection = () => tableRef?.value!.clearSelection();
// 表格操作 Hooks // 表格操作 Hooks
const { tableData, pageable, getTableList, handleSizeChange, handleCurrentChange } = useTable( const { tableData, pageable, getTableList, handleSizeChange, handleCurrentChange } = useTable(
routeName.value, routeName.value,

View File

@@ -86,8 +86,15 @@
/> />
</el-select> </el-select>
</template> </template>
<!-- getProductLinesApi -->
<template v-if="item.type === 'selectMultipleRemote' || item.type === 'selectProductLinesRemote'"> <template
v-if="
item.type === 'selectMultipleRemote' ||
item.type === 'selectProductLinesRemote' ||
item.type === 'selectRemoteKD' ||
item.type === 'selectRemoteKDSubwarehouse'
"
>
<el-select <el-select
v-model.trim="_searchParams[`${item.prop}`]" v-model.trim="_searchParams[`${item.prop}`]"
:placeholder="item.placeholder" :placeholder="item.placeholder"
@@ -96,7 +103,6 @@
filterable filterable
:reserve-keyword="false" :reserve-keyword="false"
@remove-tag="handleTagRemove(item)" @remove-tag="handleTagRemove(item)"
@clear="handleClear(item)"
:loading="loading" :loading="loading"
class="m-2 select" class="m-2 select"
remote-show-suffix remote-show-suffix
@@ -177,7 +183,15 @@
</template> </template>
<script setup lang="ts" name="SearchForm"> <script setup lang="ts" name="SearchForm">
import { verificationInput } from "./components/utils/verificationInput"; import { verificationInput } from "./components/utils/verificationInput";
import { getSupplierApi, getCustomersApi, getProductLinesApi } from "@/api/modules/global"; import {
getSupplierApi,
getCustomersApi,
getProductLinesApi,
getWarehousesKingdeeListApi,
getSubwarehouseskingdeeListApi
} from "@/api/modules/global";
// // getWarehousesKingdeeListApi getSubwarehouseskingdeeListApi getWarehousesJushuitanListApi getWarehousesLingXingListApi
// import { getWarehousesKingdeeListApi, getSubwarehouseskingdeeListApi } from "@/api/modules/setWarehouse";
const props = defineProps<{ const props = defineProps<{
formData: any[]; formData: any[];
searchParams: Record<string, any>; searchParams: Record<string, any>;
@@ -192,7 +206,7 @@ const emits = defineEmits<{
let loading = ref(false); let loading = ref(false);
const remoteRef = ref(null); const remoteRef = ref(null);
const _searchParams = computed(() => { const _searchParams: any = computed(() => {
return props.searchParams; return props.searchParams;
}); });
@@ -259,10 +273,59 @@ const getProductLines = async (keywords: any, item: any) => {
} }
} }
}; };
//金蝶仓库
const getSetWarehouseKingdeeList = async (keywords: any, item: any) => {
const useOrgNumber: any[] = _searchParams?.value?.use_org_number;
if (Array.isArray(useOrgNumber) && useOrgNumber?.length > 0) {
item.options = [];
let use_org_number = "";
use_org_number = _searchParams.value.use_org_number.join(",");
const result = await getWarehousesKingdeeListApi({
keywords: keywords,
use_org_number
});
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((it: any) => {
options.push({
label: it.warehouse_name,
value: it.warehouse_number,
use_org_number: it.use_org_number
});
});
item.options = options;
}
}
};
//获取金蝶子仓库
const getSetWarehouseSubwarehousesList = async (keywords: any, item: any) => {
const kdWarehouseNumber: any[] = _searchParams?.value?.kd_warehouse_number;
if (Array.isArray(kdWarehouseNumber) && kdWarehouseNumber?.length > 0) {
//先清空一下
item.options = [];
let kd_warehouse_number = "";
kd_warehouse_number = _searchParams.value.kd_warehouse_number.join(",");
const result = await getSubwarehouseskingdeeListApi({
keywords,
warehouse_number: kd_warehouse_number
});
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((it: any) => {
options.push({
label: it.sub_warehouse_name,
value: it.sub_warehouse_number,
warehouse_number: it.warehouse_number
});
});
item.options = options;
}
}
};
//多选远程搜索 //多选远程搜索
const handleSelectMultipleRemote = async (query: any, item: any) => { const handleSelectMultipleRemote = async (query: any, item: any) => {
console.log(remoteRef.value, "==========remoteRef=========");
loading.value = true; loading.value = true;
if (!query) { if (!query) {
loading.value = false; loading.value = false;
@@ -281,8 +344,11 @@ const handleSelectMultipleRemote = async (query: any, item: any) => {
getCustomers(valClone, item); getCustomers(valClone, item);
} else if (item.type === "selectProductLinesRemote") { } else if (item.type === "selectProductLinesRemote") {
//品线 //品线
getProductLines(valClone, item); getProductLines(valClone, item);
} else if (item.type === "selectRemoteKD") {
getSetWarehouseKingdeeList(valClone, item);
} else if (item.type === "selectRemoteKDSubwarehouse") {
getSetWarehouseSubwarehousesList(valClone, item);
} }
loading.value = false; loading.value = false;
}; };
@@ -290,9 +356,15 @@ const handleTagRemove = (item: any) => {
if (!_searchParams.value[item.prop].length) { if (!_searchParams.value[item.prop].length) {
item.options = []; item.options = [];
} }
const { prop } = item;
if (prop === "kd_warehouse_number" || prop === "kd_subwarehouse_number") {
emits("selectMultipleRemoveTag", { item, org_number: _searchParams.value[prop] });
}
}; };
const handleTagRemove1 = (item: any) => { const handleTagRemove1 = (item: any) => {
emits("selectMultipleRemoveTag", { item, org_number: _searchParams.value.org_number }); const { prop } = item;
console.log(prop);
emits("selectMultipleRemoveTag", { item, org_number: _searchParams.value[prop] });
}; };
//单选远程搜索(供应商) //单选远程搜索(供应商)
const remoteMethod = async (query: any, item: any) => { const remoteMethod = async (query: any, item: any) => {

View File

@@ -63,14 +63,22 @@ export const useTable = (
state.totalParam.subscriber_name = state.totalParam?.subscriber_name.replace(/[,]/g, ","); state.totalParam.subscriber_name = state.totalParam?.subscriber_name.replace(/[,]/g, ",");
} }
} }
if (routeName === "foundationSetWarehouse") {
//组织
if (Array.isArray(state.totalParam?.use_org_number) && state.totalParam?.use_org_number?.length) {
state.totalParam.use_org_number = state.totalParam.use_org_number.join(",");
}
//金蝶仓库
if (Array.isArray(state.totalParam?.kd_warehouse_number) && state.totalParam?.kd_warehouse_number?.length) {
state.totalParam.kd_warehouse_number = state.totalParam.kd_warehouse_number.join(",");
}
//金蝶子仓库
if (Array.isArray(state.totalParam?.kd_subwarehouse_number) && state.totalParam?.kd_subwarehouse_number?.length) {
state.totalParam.kd_subwarehouse_number = state.totalParam.kd_subwarehouse_number.join(",");
}
}
}; };
// //其他數據處理
// const initData = () => {
// if (state.totalParam?.warehouse_number) {
// state.totalParam.warehouse_number = state.totalParam?.warehouse_number.split("_")[0];
// }
// };
//删除临时参数和空值参数 //删除临时参数和空值参数
const deleteParams = () => { const deleteParams = () => {
const KEY = ["Time", "customer_number1", "customer_numbers"]; const KEY = ["Time", "customer_number1", "customer_numbers"];
@@ -86,7 +94,6 @@ export const useTable = (
*/ */
const getTableList = async () => { const getTableList = async () => {
if (!api) return; if (!api) return;
try { try {
await initSubscribeData(); await initSubscribeData();
await deleteParams(); await deleteParams();
@@ -95,9 +102,7 @@ export const useTable = (
...state.totalParam, ...state.totalParam,
...pageParam.value ...pageParam.value
}; };
const { data } = await api(params); const { data } = await api(params);
state.tableData = Array.isArray(data.data) && data.data.length ? data.data : []; state.tableData = Array.isArray(data.data) && data.data.length ? data.data : [];
clearSelection && clearSelection(); clearSelection && clearSelection();
if (isPageable && data.total_size !== undefined) { if (isPageable && data.total_size !== undefined) {

View File

@@ -7,7 +7,7 @@
<!-- <el-icon v-show="item.meta.icon && globalStore.breadcrumbIcon" class="breadcrumb-icon"> <!-- <el-icon v-show="item.meta.icon && globalStore.breadcrumbIcon" class="breadcrumb-icon">
<component :is="item.meta.icon"></component> <component :is="item.meta.icon"></component>
</el-icon> --> </el-icon> -->
<!-- {{ breadcrumbList }} -->
<span class="breadcrumb-title">{{ item.meta.title }}</span> <span class="breadcrumb-title">{{ item.meta.title }}</span>
</div> </div>
</el-breadcrumb-item> </el-breadcrumb-item>
@@ -28,13 +28,28 @@ const route = useRoute();
const router = useRouter(); const router = useRouter();
const authStore = useAuthStore(); const authStore = useAuthStore();
const globalStore = useGlobalStore(); const globalStore = useGlobalStore();
// const routeName: any = ref(router.currentRoute.value.name);
const breadcrumbList = computed(() => { const breadcrumbList = computed(() => {
let breadcrumbData = authStore.breadcrumbListGet[route.matched[route.matched.length - 1].path] ?? []; let breadcrumbData = authStore.breadcrumbListGet[route.matched[route.matched.length - 1].path] ?? [];
// 🙅‍♀️不需要首页面包屑可删除以下判断 // 🙅‍♀️不需要首页面包屑可删除以下判断
if (breadcrumbData[0].path !== HOME_URL) { if (breadcrumbData[0].path !== HOME_URL) {
breadcrumbData = [{ path: HOME_URL, meta: { icon: "HomeFilled", title: "首页" } }, ...breadcrumbData]; breadcrumbData = [{ path: HOME_URL, meta: { icon: "HomeFilled", title: "首页" } }, ...breadcrumbData];
} }
if (route.query.title === "新增订阅" || "编辑订阅") {
breadcrumbData.forEach((item: any) => {
if (item.name === "foundationSubscribeListAdd") {
item.meta.title = route.query.title;
}
});
}
if (route.query.title === "新增仓位找货优先级" || "编辑仓位找货优先级") {
breadcrumbData.forEach((item: any) => {
if (item.name === "foundationSetGoodsAdd") {
item.meta.title = route.query.title;
}
});
}
return breadcrumbData; return breadcrumbData;
}); });

View File

@@ -55,6 +55,7 @@ watch(
() => { () => {
if (route.meta.isFull) return; if (route.meta.isFull) return;
tabsMenuValue.value = route.fullPath; tabsMenuValue.value = route.fullPath;
let title: any = route.query.title ? route.query.title : route.meta.title; let title: any = route.query.title ? route.query.title : route.meta.title;
const tabsParams = { const tabsParams = {

View File

@@ -41,7 +41,8 @@ router.beforeEach(async (to, from, next) => {
const currentPath = window.location.pathname; const currentPath = window.location.pathname;
// 2.动态设置标题 // 2.动态设置标题
const title = import.meta.env.VITE_GLOB_APP_TITLE; const title = import.meta.env.VITE_GLOB_APP_TITLE;
document.title = to.meta.title ? `${to.meta.title} - ${title}` : title; // to.meta.title ? `${to.meta.title} - ${title}` :
document.title = title;
// 3.判断是访问登陆页,有 Token 就在当前页面,没有 Token 重置路由到登陆页 // 3.判断是访问登陆页,有 Token 就在当前页面,没有 Token 重置路由到登陆页
if (to.path.toLocaleLowerCase() === LOGIN_URL) { if (to.path.toLocaleLowerCase() === LOGIN_URL) {
if (userStore.newUserToken) return next(from.fullPath); if (userStore.newUserToken) return next(from.fullPath);

View File

@@ -10,4 +10,5 @@ export interface TabsMenuProps {
/* TabsState */ /* TabsState */
export interface TabsState { export interface TabsState {
tabsMenuList: TabsMenuProps[]; tabsMenuList: TabsMenuProps[];
isSubscribeAdd: Boolean;
} }

View File

@@ -65,23 +65,26 @@ export const useAuthStore = defineStore({
// 获取权限菜单列表并处理按钮权限 // 获取权限菜单列表并处理按钮权限
async getAuthMenuList() { async getAuthMenuList() {
const { data } = await getAuthMenuListApi(); const { data } = await getAuthMenuListApi();
let dataClone = data; let dataClone =
Array.isArray(data) && data.length
? data
: [
{
path: "/index",
name: "home",
component: "/home/index",
hidden: true,
children: [],
meta: {
icon: "",
title: "首页",
isKeepAlive: true
}
}
];
// 如果没有路由数据,设置默认首页 // 如果没有路由数据,设置默认首页
this.authMenuList = dataClone || [ this.authMenuList = dataClone;
{
path: "/index",
name: "home",
component: "/home/index",
hidden: true,
children: [],
meta: {
icon: "",
title: "首页",
isKeepAlive: true
}
}
];
// 提取按钮权限 // 提取按钮权限
this.buttonPermissions = extractButtonPermissions(this.authMenuList); this.buttonPermissions = extractButtonPermissions(this.authMenuList);
@@ -92,7 +95,6 @@ export const useAuthStore = defineStore({
// 构建页面与按钮的映射关系 // 构建页面与按钮的映射关系
buildPageButtonMap() { buildPageButtonMap() {
const pageButtonMap: PageButtonMap = {}; const pageButtonMap: PageButtonMap = {};
// 递归处理路由,建立页面与按钮的关联 // 递归处理路由,建立页面与按钮的关联
const processRoutes = (routes: any[], parentPageName?: string) => { const processRoutes = (routes: any[], parentPageName?: string) => {
routes.forEach((route: any) => { routes.forEach((route: any) => {
@@ -102,7 +104,6 @@ export const useAuthStore = defineStore({
if (!pageButtonMap[route.name]) { if (!pageButtonMap[route.name]) {
pageButtonMap[route.name] = []; pageButtonMap[route.name] = [];
} }
// 处理子节点中的按钮权限 // 处理子节点中的按钮权限
if (route.children && route.children.length > 0) { if (route.children && route.children.length > 0) {
route.children.forEach((child: any) => { route.children.forEach((child: any) => {
@@ -123,7 +124,6 @@ export const useAuthStore = defineStore({
} }
}); });
}; };
processRoutes(this.authMenuList); processRoutes(this.authMenuList);
this.pageButtonMap = pageButtonMap; this.pageButtonMap = pageButtonMap;
}, },

View File

@@ -6,6 +6,7 @@ import piniaPersistConfig from "@/config/piniaPersist";
export const useTabsStore = defineStore({ export const useTabsStore = defineStore({
id: "wms-tabs", id: "wms-tabs",
state: (): TabsState => ({ state: (): TabsState => ({
isSubscribeAdd: false,
tabsMenuList: [ tabsMenuList: [
{ {
icon: "", // 首页的icon按实际路由meta.icon填写如"Home" icon: "", // 首页的icon按实际路由meta.icon填写如"Home"
@@ -133,6 +134,10 @@ export const useTabsStore = defineStore({
this.tabsMenuList.forEach(item => { this.tabsMenuList.forEach(item => {
if (item.path == nowFullPath) item.title = title; if (item.path == nowFullPath) item.title = title;
}); });
},
async setSIsSubscribeAdd(is: any) {
console.log(is, "==========is========");
this.isSubscribeAdd = is;
} }
}, },
persist: piniaPersistConfig("wms-tabs") persist: piniaPersistConfig("wms-tabs")

View File

@@ -268,3 +268,6 @@
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.el-message {
z-index: 888;
}

View File

@@ -28,7 +28,7 @@ export const FORM_DATA: any[] = [
label: "导出失败" label: "导出失败"
}, },
{ {
value: 0, value: "正在导出",
label: "正在导出" label: "正在导出"
}, },
{ {

View File

@@ -2,13 +2,20 @@
<template> <template>
<div class="table-box"> <div class="table-box">
<ProTable <ProTable
ref="proTable" ref="proTableRef"
:formData="dataStore.formData" :formData="dataStore.formData"
:columns="dataStore.columns" :columns="dataStore.columns"
:request-api="getListApi" :request-api="getListApi"
:init-param="dataStore.initParam" :init-param="dataStore.initParam"
:orgCode="dataStore.ruleForm.orgCode"
> >
<template v-slot:search>
<SearchForm
@search="handleSearch"
@reset="handleReset"
:searchParams="dataStore.initParam"
:formData="dataStore.formData"
/>
</template>
<!-- 导出状态 --> <!-- 导出状态 -->
<template #status_text="scope"> <template #status_text="scope">
<span v-if="scope.row.status_text === '导出成功'" style="color: #3ad6ac"> <span v-if="scope.row.status_text === '导出成功'" style="color: #3ad6ac">
@@ -47,7 +54,7 @@ import { getListApi, getExportTypesApi } from "@/api/modules/exportList";
import { RULE_FORM, FORM_DATA, COLUMNS } from "./constant/list/index"; import { RULE_FORM, FORM_DATA, COLUMNS } from "./constant/list/index";
import { cloneDeep } from "lodash-es"; import { cloneDeep } from "lodash-es";
const proTable = ref<any>(); const proTableRef = ref<any>();
// 数据源 // 数据源
const dataStore: any = reactive({ const dataStore: any = reactive({
columns: COLUMNS, //列表配置项 columns: COLUMNS, //列表配置项
@@ -74,6 +81,24 @@ const getExportTypes = async () => {
} }
}; };
getExportTypes(); getExportTypes();
// 搜索
const handleSearch = async (params: any) => {
dataStore.initParam = cloneDeep(params);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
// 重置
const handleReset = () => {
dataStore.initParam = cloneDeep(RULE_FORM);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
</script> </script>
<style scope lang="scss"> <style scope lang="scss">
.main-container { .main-container {

View File

@@ -1,7 +0,0 @@
export const BUTTON = [
{
text: "导出",
permission: "reportManagementInstantBtnExport",
type: "export"
}
];

View File

@@ -1,80 +0,0 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "securityNumbers",
placeholder: "请输入来源单号",
type: "input",
isArray: true,
label: "来源单号: "
},
{
prop: "lotNumbers",
placeholder: "请选择供应商",
type: "select",
isArray: true,
label: "供应商: ",
options: []
},
{
prop: "securityNumbers",
placeholder: "请输入质检人",
type: "input",
isArray: true,
label: "质检人: "
},
{
prop: "Time",
type: "daterange",
options: [],
startPlaceholder: "质检开始日期",
endPlaceholder: "质检结束日期",
startDate: "createBeginDate",
endDate: "createEndDate",
label: "质检时间: "
},
{
prop: "lotNumbers",
placeholder: "请选择组织",
type: "select",
isArray: true,
label: "组织: "
},
{
prop: "materialNumber",
placeholder: "请输入規格型号",
type: "selectRemote1",
isArray: true,
options: [],
label: "物料编码: "
},
{
prop: "lotNumbers",
placeholder: "请选择质检状态",
type: "select",
isArray: true,
label: "质检状态: "
}
];
export const RULE_FORM = {
page: 1,
size: 50,
orgCode: 0
};

View File

@@ -1,107 +0,0 @@
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "质检单",
prop: "securityNumber",
width: 200
},
{
align: "left",
label: "质检状态",
prop: "id",
width: 160
},
{
align: "left",
label: "销售订单号",
prop: "specifications",
width: 200
},
{
align: "left",
label: "来源单号",
prop: "createTime",
width: 200
},
{
align: "left",
label: "下载次数",
prop: "downLoadNumber",
width: 80
},
{
align: "left",
label: "质检类型",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "供应商",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "组织",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "规格型号",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料编码",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料名称",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "应质检数量",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "良品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "次品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检人",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检时间",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "创建时间",
prop: "downLoadTime",
width: 200
}
];

View File

@@ -1,102 +0,0 @@
<!-- 质检单 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<ProTable
ref="proTable"
:formData="dataStore.formData"
:columns="dataStore.columns"
:request-api="getMaterialListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
:orgCode="dataStore.ruleForm.orgCode"
/>
</div>
</template>
<script setup lang="ts" name="foundationSetData">
import ProTable from "@/components/ProTable/index.vue";
// import { useMsg } from "@/hooks/useMsg";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { getMaterialListApi } from "@/api/modules/foundationMaterial";
// import { useAuthStore } from "@/stores/modules/auth";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
//表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
import { useUserStore } from "@/stores/modules/user";
import { btnClick } from "./init";
//深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTable = ref<ProTableInstance>();
// 获取用户信息(组织id)
const userStore = useUserStore();
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
ruleForm: cloneDeep(RULE_FORM), // 搜索条件
formData: FORM_DATA, //搜索配置项
buttons: cloneDeep(BUTTON),
options: [], //规格型号
selectionList: [], //选中表格的行
loading: false
});
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
const handleButtonClickCallback = (item: any) => {
const { type } = item;
btnClick[type](item);
};
// // 规格型号
// const remoteMethod1 = async (query: any) => {
// datas.loading = true;
// if (!query) {
// datas.loading = false;
// return;
// }
// let valClone = query.replace(/^\s*|\s*$/g, "");
// if (!valClone.length) {
// datas.loading = false;
// return;
// }
// const result = await getMaterialListApi(valClone);
// if (result.status === 200) {
// const { data } = result;
// datas.options = data;
// }
// datas.loading = false;
// };
watch(
() => userStore.orgCode,
newVal => {
dataStore.ruleForm.orgCode = newVal;
dataStore.initParam.orgCode = newVal;
},
{
immediate: true,
deep: true
}
);
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
</style>

View File

@@ -1,13 +0,0 @@
// 直接导出函数,无需额外包装对象
export const handleExport = (item: any) => {
console.log("导出操作", item);
};
export const handleRefresh = (item: any) => {
console.log("刷新操作", item);
};
export const btnClick: any = {
export: handleExport,
refresh: handleRefresh
};

View File

@@ -1,2 +0,0 @@
import { btnClick } from "./btnClick";
export { btnClick };

View File

@@ -0,0 +1,164 @@
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<div class="card table-main">
<DetailsSearch
:formData="dataStore.formData"
:ruleForm="dataStore.ruleForm"
:labelWidth="dataStore.labelWidth"
:inline="true"
ref="detailsRef"
@selectChange="handleChange"
/>
</div>
</div>
</template>
<script setup lang="ts" name="foundationSetGoodsAdd">
import { BUTTON } from "./constant/list/addButton";
import { cloneDeep } from "lodash-es";
import { DETAILS_FORM_DATA, DETAILS_RULE_FORM } from "./constant/list/add";
import DetailsSearch from "@/components/DetailsSearch/index.vue";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { useUserStore } from "@/stores/modules/user";
import $Bus from "@/utils/mittBus";
import { getGoodsAddApi, getGoodsUpApi, getGoodsDetailsApi, getGoodsCheckExistswApi } from "@/api/modules/setGoods";
import { getWarehousesListApi } from "@/api/modules/global";
import { useMsg } from "@/hooks/useMsg";
const userStore = useUserStore();
const route = useRoute();
const $router = useRouter();
// 数据源
const dataStore = reactive<any>({
buttons: cloneDeep(BUTTON),
labelWidth: "120px",
formData: cloneDeep(DETAILS_FORM_DATA),
ruleForm: cloneDeep(DETAILS_RULE_FORM),
id: null,
title: ""
});
// 详情表单实例
const detailsRef = ref(null);
//初始化组织数据
const init = () => {
if (userStore.orgIdArr.length) {
dataStore.formData[0].options = userStore?.orgIdArr;
}
};
init();
//新增
const handleAdd = async () => {
const result = await getGoodsAddApi(dataStore.ruleForm);
if (result?.code === 0) {
useMsg("success", "新增成功 ");
dataStore.id = result?.data?.id;
$Bus.emit("setGoodsResetList");
}
};
//更新
const getGoodsUp = async () => {
const result = await getGoodsUpApi(dataStore.id, dataStore.ruleForm);
if (result?.code === 0) {
useMsg("success", "更新成功 ");
$Bus.emit("setGoodsResetList");
}
};
//详情
const getGoodsDetails = async () => {
dataStore.id = route.query.id;
if (!dataStore.id) {
return;
}
//getGoodsDetailsApi
const result = await getGoodsDetailsApi(dataStore.id);
if (result?.code === 0) {
dataStore.ruleForm = result?.data;
}
};
getGoodsDetails();
//验证
const getGoodsCheckExistsw = async () => {
const result = await getGoodsCheckExistswApi({
use_org_number: dataStore.ruleForm.use_org_number,
warehouse_number: dataStore.ruleForm.warehouse_number
});
if (result?.code === 0 && result?.data?.exists) {
useMsg("error", "仓库已存在数据, 无需再次新增 ");
}
};
// 按钮点击事件
const handleButtonClickCallback = (item: any) => {
const { type } = item;
dataStore.title = route.query.title;
if (type === "save") {
if (!dataStore.ruleForm.use_org_number) {
return useMsg("warning", "组织不能为空 !");
}
if (!dataStore.ruleForm.warehouse_number) {
return useMsg("warning", "仓库不能为空 !");
}
if (!dataStore.ruleForm.pos_picking_priority) {
return useMsg("warning", "仓位不能为空 !");
}
dataStore.title === "新增仓位找货优先级" ? handleAdd() : getGoodsUp();
}
if (type === "preview") {
if (!dataStore.id) {
useMsg("warning", "请先保存数据 !");
}
$router.push({
path: "/foundation/set/goods/preview",
query: { id: dataStore.id, name: dataStore.title }
});
}
if (type === "return") {
$router.push({
path: "/foundation/set/goods/index"
});
}
};
//仓库列表 /foundation/set/goods/preview
const getWarehousesList = async () => {
const result = await getWarehousesListApi({ use_org_number: dataStore.ruleForm.use_org_number });
if (result?.code === 0) {
const { data } = result;
if (data?.length) {
let options: any = [];
data.forEach((item: any) => {
options.push({
id: item.id,
value: item.warehouse_number,
label: item.warehouse_name
});
});
dataStore.formData[1].options = options;
}
}
};
const handleChange = (item: any) => {
console.log(item);
getGoodsCheckExistsw();
};
//监听当前组织
watch(
() => dataStore.ruleForm.use_org_number,
(newVal: any) => {
if (newVal) {
getWarehousesList();
}
},
{
deep: true,
immediate: true
}
);
</script>
<style scoped></style>

View File

@@ -0,0 +1,33 @@
export const DETAILS_FORM_DATA: any[] = [
{
prop: "use_org_number",
placeholder: "请选择",
type: "select",
label: "组织:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "warehouse_number",
placeholder: "请选择",
type: "select",
label: "仓库:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "pos_picking_priority",
placeholder: "请输入",
type: "textarea",
label: "仓位:",
disabled: false,
required: true,
class: "form-item1",
maxLength: 5000
}
];
export const DETAILS_RULE_FORM: any = {
use_org_number: "101"
};

View File

@@ -0,0 +1,20 @@
export const BUTTON = [
{
text: "保存",
permission: "foundationSetGoodsAddBtnSave",
type: "save",
props: {
type: "primary"
}
},
{
text: "预览(请先保存)",
permission: "foundationSetGoodsAddBtnPreview",
type: "preview"
},
{
text: "返回",
permission: "foundationSetGoodsAddBtnRreturn",
type: "return"
}
];

View File

@@ -0,0 +1,10 @@
export const BUTTON = [
{
text: "新增",
permission: "foundationSetGoodsBtnAdd",
type: "add",
props: {
type: "primary"
}
}
];

View File

@@ -0,0 +1,31 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "warehouse_number",
placeholder: "请输入仓库",
type: "select",
label: "仓库: ",
options: []
}
];
export const RULE_FORM = {
page: 1,
size: 50
};

View File

@@ -0,0 +1,33 @@
// import { RenderScope } from "@/components/ProTable/interface";
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "仓库名称",
prop: "warehouse_name"
},
{
align: "left",
fixed: true,
label: "组织",
prop: "use_org_name"
},
{
align: "left",
label: "仓库优先级",
prop: "pos_picking_priority"
},
{
align: "left",
label: "更新人",
prop: "operator_name"
},
{
align: "left",
label: "更新时间",
prop: "updated_at"
}
];

View File

@@ -0,0 +1,123 @@
<!-- 仓位找货优先级 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<ProTable
ref="proTableRef"
:columns="dataStore.columns"
:request-api="getGoodsListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
>
<template v-slot:search>
<SearchForm
@search="handleSearch"
@reset="handleReset"
:searchParams="dataStore.initParam"
:formData="dataStore.formData"
/>
</template>
<template #warehouse_name="scope">
<a @click="handleOpen(scope.row)" class="break-word to-details">
{{ scope.row.warehouse_name }}
</a>
</template>
</ProTable>
</div>
</template>
<script setup lang="ts" name="foundationSetGoods">
import ProTable from "@/components/ProTable/index.vue";
import SearchForm from "@/components/SearchForm/index.vue";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { getGoodsListApi } from "@/api/modules/setGoods";
import { useUserStore } from "@/stores/modules/user";
import $Bus from "@/utils/mittBus";
// import { useMsg } from "@/hooks/useMsg";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
// 表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
// 深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTableRef = ref<ProTableInstance>();
const $router = useRouter();
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
formData: FORM_DATA, //搜索配置项
buttons: cloneDeep(BUTTON),
labelWidth: "120px",
dialogVisible: false, //弹窗
selectionList: [] //选中表格的行
});
const userStore = useUserStore();
const router = useRouter();
const init = () => {
//仓库赋值
dataStore.formData[0].options = userStore.warehouse;
};
init();
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
// 顶部按钮点击事件
const handleButtonClickCallback = (item: any) => {
console.log(item);
$router.push({ path: "/foundation/set/goods/add", query: { title: "新增仓位找货优先级" } });
};
//跳转详情
const handleOpen = (row: any) => {
router.push({
path: "/foundation/set/goods/add",
query: { id: row.id, title: "编辑仓位找货优先级" }
});
};
// 搜索
const handleSearch = async (params: any) => {
dataStore.initParam = cloneDeep(params);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
// 重置
const handleReset = () => {
dataStore.initParam = cloneDeep(RULE_FORM);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
onMounted(() => {
$Bus.on("setGoodsResetList", () => {
nextTick(() => {
proTableRef?.value!.getTableList();
});
});
});
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
.el-dialog .el-dialog__header {
padding: 8px 0;
font-weight: bold;
}
</style>

View File

@@ -0,0 +1,47 @@
<template>
<div class="table-box">
<div>
<div style="padding-bottom: 16px">
<el-button type="primary" @click="handleBlack">返回</el-button>
</div>
</div>
<div class="table-box card">
<div style="display: flex">
<el-table :data="dataStore.tableData" border style="width: 70%">
<el-table-column type="index" :index="indexMethod" label="序号" width="100" />
<el-table-column prop="position" label="仓位" />
<el-table-column prop="priority_item" label="匹配项" />
</el-table>
</div>
</div>
</div>
</template>
<script setup lang="ts" name="foundationSetGoodsPreview">
import { getGoodsPreviewApi } from "@/api/modules/setGoods";
const $router = useRouter();
const route = useRoute();
const dataStore = reactive<any>({
tableData: []
});
const indexMethod = (index: number) => {
return index + 1;
};
//预览
const getGoodsPreview = async () => {
const result = await getGoodsPreviewApi(route.query.id);
if (result?.code === 0) {
dataStore.tableData = result?.data ? result?.data : [];
console.log(result?.data);
}
};
getGoodsPreview();
const handleBlack = () => {
$router.push({
path: "/foundation/set/goods/add",
query: { id: route.query.id, title: route.query.name }
});
};
</script>
<style scoped></style>

View File

@@ -1,4 +1,4 @@
<!-- 质检单 --> <!-- 物料列表 -->
<template> <template>
<div class="table-box"> <div class="table-box">
<div style="padding-bottom: 16px"> <div style="padding-bottom: 16px">
@@ -66,7 +66,6 @@ const selectionChange = (selection: any) => {
}; };
const handleButtonClickCallback = (item: any) => { const handleButtonClickCallback = (item: any) => {
const { type } = item; const { type } = item;
btnClick[type]({ btnClick[type]({
selectionList: dataStore.selectionList, selectionList: dataStore.selectionList,
proTableRef, proTableRef,

View File

@@ -6,7 +6,7 @@ export const handleExport = async (params: any) => {
const { initParam } = params; const { initParam } = params;
const result = await getMaterialListExportApi(initParam); const result = await getMaterialListExportApi(initParam);
if (result?.code === 0) { if (result?.code === 0) {
useMsg("success", "导出成功 "); useMsg("success", "导出成功请前往导出列表中进行下载");
} }
}; };
//刷新 //刷新

View File

@@ -1,7 +0,0 @@
export const BUTTON = [
{
text: "导出",
permission: "reportManagementBoxInventoryBtnExport",
type: "export"
}
];

View File

@@ -1,80 +0,0 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "securityNumbers",
placeholder: "请输入来源单号",
type: "input",
isArray: true,
label: "来源单号: "
},
{
prop: "lotNumbers",
placeholder: "请选择供应商",
type: "select",
isArray: true,
label: "供应商: ",
options: []
},
{
prop: "securityNumbers",
placeholder: "请输入质检人",
type: "input",
isArray: true,
label: "质检人: "
},
{
prop: "Time",
type: "daterange",
options: [],
startPlaceholder: "质检开始日期",
endPlaceholder: "质检结束日期",
startDate: "createBeginDate",
endDate: "createEndDate",
label: "质检时间: "
},
{
prop: "lotNumbers",
placeholder: "请选择组织",
type: "select",
isArray: true,
label: "组织: "
},
{
prop: "materialNumber",
placeholder: "请输入規格型号",
type: "selectRemote1",
isArray: true,
options: [],
label: "物料编码: "
},
{
prop: "lotNumbers",
placeholder: "请选择质检状态",
type: "select",
isArray: true,
label: "质检状态: "
}
];
export const RULE_FORM = {
page: 1,
size: 50,
orgCode: 0
};

View File

@@ -1,107 +0,0 @@
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "质检单",
prop: "securityNumber",
width: 200
},
{
align: "left",
label: "质检状态",
prop: "id",
width: 160
},
{
align: "left",
label: "销售订单号",
prop: "specifications",
width: 200
},
{
align: "left",
label: "来源单号",
prop: "createTime",
width: 200
},
{
align: "left",
label: "下载次数",
prop: "downLoadNumber",
width: 80
},
{
align: "left",
label: "质检类型",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "供应商",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "组织",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "规格型号",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料编码",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料名称",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "应质检数量",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "良品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "次品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检人",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检时间",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "创建时间",
prop: "downLoadTime",
width: 200
}
];

View File

@@ -1,102 +0,0 @@
<!-- 质检单 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<ProTable
ref="proTable"
:formData="dataStore.formData"
:columns="dataStore.columns"
:request-api="getMaterialListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
:orgCode="dataStore.ruleForm.orgCode"
/>
</div>
</template>
<script setup lang="ts" name="foundationSetPriority">
import ProTable from "@/components/ProTable/index.vue";
// import { useMsg } from "@/hooks/useMsg";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { getMaterialListApi } from "@/api/modules/foundationMaterial";
// import { useAuthStore } from "@/stores/modules/auth";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
//表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
import { useUserStore } from "@/stores/modules/user";
import { btnClick } from "./init";
//深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTable = ref<ProTableInstance>();
// 获取用户信息(组织id)
const userStore = useUserStore();
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
ruleForm: cloneDeep(RULE_FORM), // 搜索条件
formData: FORM_DATA, //搜索配置项
buttons: cloneDeep(BUTTON),
options: [], //规格型号
selectionList: [], //选中表格的行
loading: false
});
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
const handleButtonClickCallback = (item: any) => {
const { type } = item;
btnClick[type](item);
};
// // 规格型号
// const remoteMethod1 = async (query: any) => {
// datas.loading = true;
// if (!query) {
// datas.loading = false;
// return;
// }
// let valClone = query.replace(/^\s*|\s*$/g, "");
// if (!valClone.length) {
// datas.loading = false;
// return;
// }
// const result = await getMaterialListApi(valClone);
// if (result.status === 200) {
// const { data } = result;
// datas.options = data;
// }
// datas.loading = false;
// };
watch(
() => userStore.orgCode,
newVal => {
dataStore.ruleForm.orgCode = newVal;
dataStore.initParam.orgCode = newVal;
},
{
immediate: true,
deep: true
}
);
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
</style>

View File

@@ -1,13 +0,0 @@
// 直接导出函数,无需额外包装对象
export const handleExport = (item: any) => {
console.log("导出操作", item);
};
export const handleRefresh = (item: any) => {
console.log("刷新操作", item);
};
export const btnClick: any = {
export: handleExport,
refresh: handleRefresh
};

View File

@@ -1,2 +0,0 @@
import { btnClick } from "./btnClick";
export { btnClick };

View File

@@ -1,7 +0,0 @@
export const BUTTON = [
{
text: "导出",
permission: "reportManagementMaterialBtnExport",
type: "export"
}
];

View File

@@ -1,80 +0,0 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "securityNumbers",
placeholder: "请输入来源单号",
type: "input",
isArray: true,
label: "来源单号: "
},
{
prop: "lotNumbers",
placeholder: "请选择供应商",
type: "select",
isArray: true,
label: "供应商: ",
options: []
},
{
prop: "securityNumbers",
placeholder: "请输入质检人",
type: "input",
isArray: true,
label: "质检人: "
},
{
prop: "Time",
type: "daterange",
options: [],
startPlaceholder: "质检开始日期",
endPlaceholder: "质检结束日期",
startDate: "createBeginDate",
endDate: "createEndDate",
label: "质检时间: "
},
{
prop: "lotNumbers",
placeholder: "请选择组织",
type: "select",
isArray: true,
label: "组织: "
},
{
prop: "materialNumber",
placeholder: "请输入規格型号",
type: "selectRemote1",
isArray: true,
options: [],
label: "物料编码: "
},
{
prop: "lotNumbers",
placeholder: "请选择质检状态",
type: "select",
isArray: true,
label: "质检状态: "
}
];
export const RULE_FORM = {
page: 1,
size: 50,
orgCode: 0
};

View File

@@ -1,107 +0,0 @@
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "质检单",
prop: "securityNumber",
width: 200
},
{
align: "left",
label: "质检状态",
prop: "id",
width: 160
},
{
align: "left",
label: "销售订单号",
prop: "specifications",
width: 200
},
{
align: "left",
label: "来源单号",
prop: "createTime",
width: 200
},
{
align: "left",
label: "下载次数",
prop: "downLoadNumber",
width: 80
},
{
align: "left",
label: "质检类型",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "供应商",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "组织",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "规格型号",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料编码",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "物料名称",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "应质检数量",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "良品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "次品数",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检人",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "质检时间",
prop: "downLoadTime",
width: 200
},
{
align: "left",
label: "创建时间",
prop: "downLoadTime",
width: 200
}
];

View File

@@ -1,102 +0,0 @@
<!-- 质检单 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<ProTable
ref="proTable"
:formData="dataStore.formData"
:columns="dataStore.columns"
:request-api="getMaterialListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
:orgCode="dataStore.ruleForm.orgCode"
/>
</div>
</template>
<script setup lang="ts" name="foundationSetRelationship">
import ProTable from "@/components/ProTable/index.vue";
// import { useMsg } from "@/hooks/useMsg";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { getMaterialListApi } from "@/api/modules/foundationMaterial";
// import { useAuthStore } from "@/stores/modules/auth";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
//表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
import { useUserStore } from "@/stores/modules/user";
import { btnClick } from "./init";
//深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTable = ref<ProTableInstance>();
// 获取用户信息(组织id)
const userStore = useUserStore();
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
ruleForm: cloneDeep(RULE_FORM), // 搜索条件
formData: FORM_DATA, //搜索配置项
buttons: cloneDeep(BUTTON),
options: [], //规格型号
selectionList: [], //选中表格的行
loading: false
});
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
const handleButtonClickCallback = (item: any) => {
const { type } = item;
btnClick[type](item);
};
// // 规格型号
// const remoteMethod1 = async (query: any) => {
// datas.loading = true;
// if (!query) {
// datas.loading = false;
// return;
// }
// let valClone = query.replace(/^\s*|\s*$/g, "");
// if (!valClone.length) {
// datas.loading = false;
// return;
// }
// const result = await getMaterialListApi(valClone);
// if (result.status === 200) {
// const { data } = result;
// datas.options = data;
// }
// datas.loading = false;
// };
watch(
() => userStore.orgCode,
newVal => {
dataStore.ruleForm.orgCode = newVal;
dataStore.initParam.orgCode = newVal;
},
{
immediate: true,
deep: true
}
);
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
</style>

View File

@@ -1,13 +0,0 @@
// 直接导出函数,无需额外包装对象
export const handleExport = (item: any) => {
console.log("导出操作", item);
};
export const handleRefresh = (item: any) => {
console.log("刷新操作", item);
};
export const btnClick: any = {
export: handleExport,
refresh: handleRefresh
};

View File

@@ -1,2 +0,0 @@
import { btnClick } from "./btnClick";
export { btnClick };

View File

@@ -0,0 +1,23 @@
export const BUTTON = [
{
text: "新增",
permission: "foundationSetShopBtnAdd",
type: "add",
props: {
type: "primary"
}
},
{
text: "导出",
permission: "foundationSetShopBtnExport",
type: "export"
// props: {
// type: "primary"
// }
},
{
text: "删除",
permission: "foundationSetShopBtnDel",
type: "del"
}
];

View File

@@ -0,0 +1,173 @@
export const DETAILS_FORM_DATA: any[] = [
{
prop: "platform_name",
placeholder: "请输入",
type: "input",
label: "平台:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "platform_store_name",
placeholder: "请输入",
type: "input",
label: "平台店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "access_system",
placeholder: "请选择",
type: "select",
label: "订单接入系统:",
disabled: false,
required: true,
options: [],
class: "form-item1"
},
{
prop: "kingdee_store_name",
placeholder: "请输入",
type: "input",
label: "金蝶店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "kingdee_store_number",
placeholder: "请输入",
type: "input",
label: "金蝶店铺编码:",
disabled: false,
required: true,
class: "form-item1"
}
];
export const DETAILS_FORM_DATA1: any[] = [
{
prop: "platform_name",
placeholder: "请输入",
type: "input",
label: "平台:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "platform_store_name",
placeholder: "请输入",
type: "input",
label: "平台店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "access_system",
placeholder: "请输入",
type: "select",
label: "订单接入系统:",
disabled: false,
required: true,
options: [],
class: "form-item1"
},
{
prop: "kingdee_store_name",
placeholder: "请输入",
type: "input",
label: "金蝶店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "kingdee_store_number",
placeholder: "请输入",
type: "input",
label: "金蝶店铺编码:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "jushuitan_store_name",
placeholder: "请输入",
type: "input",
label: "聚水潭店铺名称:",
disabled: false,
required: true,
class: "form-item1"
}
];
export const DETAILS_FORM_DATA2: any[] = [
{
prop: "platform_name",
placeholder: "请输入",
type: "input",
label: "平台:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "platform_store_name",
placeholder: "请输入",
type: "input",
label: "平台店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "access_system",
placeholder: "请输入",
type: "select",
label: "订单接入系统:",
disabled: false,
required: true,
options: [],
class: "form-item1"
},
{
prop: "kingdee_store_name",
placeholder: "请输入",
type: "input",
label: "金蝶店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "kingdee_store_number",
placeholder: "请输入",
type: "input",
label: "金蝶店铺编码:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "lingxing_store_name",
placeholder: "请输入",
type: "input",
label: "领星店铺名称:",
disabled: false,
required: true,
class: "form-item1"
},
{
prop: "lingxing_store_number",
placeholder: "请输入",
type: "input",
label: "领星店铺SellerID:",
disabled: false,
required: true,
class: "form-item1"
}
];
export const DETAILS_RULE_FORM: any = {};

View File

@@ -0,0 +1,70 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "platform_name",
placeholder: "请输入平台",
type: "input",
label: "平台: "
},
{
prop: "platform_store_name",
placeholder: "请输入平台店铺名称",
type: "input",
label: "平台店铺名称: "
},
{
prop: "kingdee_store_name",
placeholder: "请输入金蝶店铺名称",
type: "input",
label: "金蝶店铺名称: "
},
{
prop: "jushuitan_store_name",
placeholder: "请输入聚水潭店铺名称",
type: "input",
label: "聚水潭店铺名称: "
},
{
prop: "lingxing_store_name",
placeholder: "请输入领星店铺名称",
type: "input",
label: "领星店铺名称: "
},
{
prop: "operator_name",
placeholder: "请输入更新人",
type: "input",
label: "更新人: "
},
{
prop: "Time",
type: "daterange",
options: [],
startPlaceholder: "更新开始日期",
endPlaceholder: "更新结束日期",
startDate: "update_time",
// endDate: "createEndDate",
label: "更新时间: "
}
];
export const RULE_FORM = {
page: 1,
size: 50
};

View File

@@ -0,0 +1,59 @@
// import { RenderScope } from "@/components/ProTable/interface";
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "平台店铺名称",
prop: "platform_store_name",
width: 200
},
{
align: "left",
label: "平台",
prop: "platform_name",
fixed: true
},
{
align: "left",
label: "订单接入系统",
prop: "access_system_name"
},
{
align: "left",
label: "聚水潭店铺名称",
prop: "jushuitan_store_name"
},
{
align: "left",
label: "领星店铺名称",
prop: "lingxing_store_name"
},
{
align: "left",
label: "领星店铺SellerID",
prop: "lingxing_store_number"
},
{
align: "left",
label: "金蝶店铺名称",
prop: "kingdee_store_name"
},
{
align: "left",
label: "金蝶店铺编码",
prop: "kingdee_store_number"
},
{
align: "left",
label: "更新人",
prop: "operator"
},
{
align: "left",
label: "更新时间",
prop: "updated_at"
}
];

View File

@@ -0,0 +1,291 @@
<!-- 店铺资料 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<el-dialog v-model="dataStore.dialogVisible" width="660" :before-close="handleClose" :title="dataStore.title">
<DetailsSearch
:formData="dataStore.detailsFormData"
:ruleForm="dataStore.detailsRuleForm"
:labelWidth="dataStore.labelWidth"
:inline="true"
:isSearch="true"
ref="detailsRef"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleCommit"> 确认 </el-button>
</div>
</template>
</el-dialog>
<ProTable
ref="proTableRef"
:columns="dataStore.columns"
:request-api="getShopListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
>
<template v-slot:search>
<SearchForm
@search="handleSearch"
@reset="handleReset"
:searchParams="dataStore.initParam"
:formData="dataStore.formData"
/>
</template>
<template #platform_store_name="scope">
<a @click="handleOpen(scope.row)" class="break-word to-details">
{{ scope.row.platform_store_name }}
</a>
</template>
</ProTable>
</div>
</template>
<script setup lang="ts" name="foundationSetShop">
import ProTable from "@/components/ProTable/index.vue";
import SearchForm from "@/components/SearchForm/index.vue";
import PermissionButton from "@/components/PermissionButton/index.vue";
import {
getShopListApi,
getShopDelApi,
getShopAccessSystemApi,
getShopAddApi,
getShopUpApi,
getShopDetailsApi,
getShopListExportApi
} from "@/api/modules/shop";
import { useMsg } from "@/hooks/useMsg";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
import { DETAILS_RULE_FORM, DETAILS_FORM_DATA, DETAILS_FORM_DATA1, DETAILS_FORM_DATA2 } from "./constant/list/details";
// 表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
// 深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTableRef = ref<ProTableInstance>();
const detailsRef = ref<any>(null);
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
formData: FORM_DATA, // 搜索配置项
buttons: cloneDeep(BUTTON),
labelWidth: "120px",
title: "新增店铺",
detailsFormData: cloneDeep(DETAILS_FORM_DATA),
detailsRuleForm: cloneDeep(DETAILS_RULE_FORM),
dialogVisible: false, // 弹窗
accessSystemOptions: [], // 接入系統列表
selectionList: [] // 列表选中数据
});
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
// 删除
const handleDel = () => {
if (!dataStore.selectionList.length) {
useMsg("warning", "请选择数据 ");
return;
} else {
ElMessageBox.confirm("您确定进行删除操作吗?", "温馨提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(async () => {
let ids: any = [];
dataStore.selectionList?.forEach((item: any) => {
ids.push(item.id);
});
const result = await getShopDelApi(ids.join(","));
if (result?.code === 0) {
proTableRef?.value!.getTableList();
useMsg("success", "删除成功 ");
}
})
.catch(() => {});
}
};
// 新增
const getShopAdd = async () => {
const result = await getShopAddApi(dataStore.detailsRuleForm);
if (result?.code === 0) {
useMsg("success", "新增成功 ");
setTimeout(() => {
dataStore.dialogVisible = false;
proTableRef?.value!.getTableList();
}, 600);
}
};
// 更新
const getShopUp = async () => {
const result = await getShopUpApi(dataStore.rowId, dataStore.detailsRuleForm);
if (result?.code === 0) {
useMsg("success", "更新成功 ");
setTimeout(() => {
dataStore.dialogVisible = false;
proTableRef?.value!.getTableList();
}, 600);
}
};
// 详情
const getShopDetails = async (id: any) => {
const result = await getShopDetailsApi(id);
if (result?.code === 0) {
dataStore.dialogVisible = true;
dataStore.title = "编辑店铺";
setAccessSystem(result?.data?.access_system);
dataStore.detailsRuleForm = result?.data;
}
};
// 表格row点击事件
const handleOpen = (row: any) => {
dataStore.rowId = row.id;
getShopDetails(row.id);
};
// 獲取接入系統列表數據
const getShopAccessSystem = async () => {
const result = await getShopAccessSystemApi();
if (result?.code === 0) {
let data = cloneDeep(result?.data);
let options: any = [];
data?.length &&
data.forEach((item: any) => {
options.push({ value: item.id, label: item.name, is_default: item.is_default });
});
dataStore.accessSystemOptions = options;
dataStore.detailsFormData[2].options = options;
}
};
getShopAccessSystem();
// 导出
const handleExport = async () => {
const result = await getShopListExportApi(dataStore.initParam);
if (result?.code === 0) {
useMsg("success", "导出成功请前往导出列表中进行下载 ");
}
};
// 顶部按钮点击事件
const handleButtonClickCallback = (item: any) => {
const { type } = item;
if (type === "del") {
return handleDel();
}
if (type === "export") {
return handleExport();
}
if (type === "add") {
dataStore.title = "新增店铺";
dataStore.dialogVisible = true;
}
};
// 弹窗取消
const handleClose = () => {
dataStore.detailsRuleForm = cloneDeep(DETAILS_RULE_FORM);
detailsRef?.value?.formElement?.resetFields();
dataStore.dialogVisible = false;
};
// 弹窗确认
const handleCommit = () => {
if (!dataStore.detailsRuleForm.platform_name) {
useMsg("warning", "平台不能为空 !");
return false;
}
if (!dataStore.detailsRuleForm.platform_store_name) {
useMsg("warning", "平台店铺名称不能为空 !");
return false;
}
if (!dataStore.detailsRuleForm.access_system) {
useMsg("warning", "订单接入系统不能为空 !");
return false;
}
if (!dataStore.detailsRuleForm.kingdee_store_name) {
useMsg("warning", "金蝶店铺名称不能为空 !");
return false;
}
if (!dataStore.detailsRuleForm.kingdee_store_number) {
useMsg("warning", "金蝶店铺编码不能为空 !");
return false;
}
if (dataStore.detailsRuleForm.access_system === 2 && !dataStore.detailsRuleForm.jushuitan_store_name) {
useMsg("warning", "聚水潭店铺名称不能为空 !");
return false;
}
if (dataStore.detailsRuleForm.access_system === 3 && !dataStore.detailsRuleForm.lingxing_store_name) {
useMsg("warning", "领星店铺名称不能为空 !");
return false;
}
if (dataStore.detailsRuleForm.access_system === 3 && !dataStore.detailsRuleForm.lingxing_store_number) {
useMsg("warning", "领星店铺SellerID不能为空 !");
return false;
}
if (dataStore.title === "新增店铺") {
getShopAdd();
} else {
getShopUp();
}
};
// 搜索
const handleSearch = async (params: any) => {
console.log(params, "==============>");
dataStore.initParam = cloneDeep(params);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
// 重置
const handleReset = () => {
dataStore.initParam = cloneDeep(RULE_FORM);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
// 接入系统切换
const setAccessSystem = (val: any) => {
if (val === 2) {
dataStore.detailsFormData = cloneDeep(DETAILS_FORM_DATA1);
dataStore.detailsFormData[2].options = cloneDeep(dataStore.accessSystemOptions);
dataStore.detailsRuleForm.lingxing_store_name = "";
dataStore.lingxing_store_number = "";
}
if (val === 3) {
dataStore.detailsFormData = cloneDeep(DETAILS_FORM_DATA2);
dataStore.detailsFormData[2].options = cloneDeep(dataStore.accessSystemOptions);
dataStore.detailsRuleForm.jushuitan_store_name = "";
}
};
watch(
() => dataStore.detailsRuleForm.access_system,
(newVal: any) => {
setAccessSystem(newVal);
}
);
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
.el-dialog .el-dialog__header {
padding: 8px 0;
font-weight: bold;
}
</style>

View File

@@ -0,0 +1,16 @@
export const BUTTON = [
{
text: "新增",
permission: "foundationSetWarehouseBtnAdd",
type: "add",
props: {
type: "primary"
}
},
{
text: "删除",
permission: "foundationSetWarehouseBtnDel",
type: "del"
}
];

View File

@@ -0,0 +1,63 @@
export const DETAILS_FORM_DATA: any[] = [
{
prop: "use_org_number",
placeholder: "请输入",
type: "selectMultipleD",
label: "组织:",
disabled: false,
required: true,
class: "form-item1",
options: []
},
{
prop: "kd_warehouse_number",
placeholder: "请选择",
type: "selectMultipleD",
label: "金蝶仓库:",
disabled: false,
required: true,
class: "form-item1",
options: []
},
{
prop: "kd_subwarehouse_number",
placeholder: "请选择",
type: "selectMultiples",
label: "金蝶子仓库:",
disabled: false,
class: "form-item1",
options: []
},
{
prop: "jst_warehouse_number",
placeholder: "请选择",
type: "select",
label: "对应聚水潭仓库:",
disabled: false,
class: "form-item1",
options: []
},
{
prop: "lx_warehouse_number",
placeholder: "请选择",
type: "select",
label: "对应领星仓库:",
disabled: false,
class: "form-item1",
options: []
},
{
//textarea
prop: "remark",
placeholder: "请输入",
type: "textarea",
label: "备注:",
disabled: false,
maxLength: 5000,
class: "form-item1"
}
];
export const DETAILS_RULE_FORM: any = {
use_org_number: "101"
};

View File

@@ -0,0 +1,64 @@
interface FormItem {
prop: string;
label?: string;
placeholder?: string;
type: string;
isCopy?: boolean;
optionProps?: any;
startPlaceholder?: string;
endPlaceholder?: string;
options?: any;
isArray?: boolean;
startDate?: string; //开始时间(传入后台需要的参数)
endDate?: string; //结束时间(传入后台需要的参数)
startProp?: string;
endProp?: string;
isInteger?: boolean;
}
export const FORM_DATA: FormItem[] = [
{
prop: "use_org_number",
placeholder: "请选择组织",
type: "selectMultiple",
label: "组织: ",
options: []
},
{
prop: "kd_warehouse_number",
placeholder: "请输入金蝶仓库",
type: "selectRemoteKD",
label: "金蝶仓库: ",
options: []
},
{
prop: "kd_subwarehouse_number",
placeholder: "请输入金蝶子仓库",
type: "selectRemoteKDSubwarehouse",
label: "金蝶子仓库: ",
options: []
},
{
prop: "operator",
placeholder: "请输入更新人",
type: "input",
label: "更新人: "
},
{
prop: "Time",
type: "daterange",
options: [],
startPlaceholder: "更新开始日期",
endPlaceholder: "更新结束日期",
startDate: "update_time",
// endDate: "createEndDate",
label: "更新时间: "
}
];
export const RULE_FORM = {
page: 1,
size: 50,
use_org_number: ["101"]
};

View File

@@ -0,0 +1,64 @@
import { RenderScope } from "@/components/ProTable/interface";
export const COLUMNS = [
{ type: "selection", fixed: "left", width: 40 },
{
align: "left",
fixed: true,
label: "金蝶仓库",
prop: "kd_warehouse_name",
width: 200
},
{
align: "left",
fixed: true,
label: "组织",
prop: "use_org_name",
width: 200
},
{
align: "left",
label: "金蝶子仓库",
prop: "kd_subwarehouse_number",
width: 400,
fixed: true,
render: (scope: RenderScope<any>): VNode | string | any => {
let arr: any = [];
if (Array.isArray(scope.row.kd_subwarehouse) && scope.row.kd_subwarehouse.length) {
scope.row.kd_subwarehouse?.forEach((item: any) => {
arr.push(item.subwarehouse_name);
});
}
return Array.isArray(arr) && arr.length ? arr.join(",") : "--";
}
},
{
align: "left",
label: "对应聚水潭仓库",
prop: "jst_warehouse_name",
width: 200
},
{
align: "left",
label: "对应领星仓库",
prop: "lx_warehouse_name",
width: 200
},
{
align: "left",
label: "备注",
prop: "remark",
width: 200
},
{
align: "left",
label: "更新人",
prop: "operator"
},
{
align: "left",
label: "更新时间",
prop: "updated_at",
width: 200
}
];

View File

@@ -0,0 +1,451 @@
<!-- 店铺资料 -->
<template>
<div class="table-box">
<div style="padding-bottom: 16px">
<PermissionButton
:buttons="dataStore.buttons"
@handleButtonClickCallback="handleButtonClickCallback"
></PermissionButton>
</div>
<el-dialog v-model="dataStore.dialogVisible" width="660" :before-close="handleClose" :title="dataStore.title">
<DetailsSearch
:formData="dataStore.detailsFormData"
:ruleForm="dataStore.detailsRuleForm"
:labelWidth="dataStore.labelWidth"
:inline="true"
:isSearch="true"
@selectMultipleDClear="handleSelectMultipleDClear"
ref="detailsRef"
/>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" @click="handleCommit"> 确认 </el-button>
</div>
</template>
</el-dialog>
<ProTable
ref="proTableRef"
:columns="dataStore.columns"
:request-api="getSetWarehouseListApi"
:init-param="dataStore.initParam"
@selectionChange="selectionChange"
>
<template v-slot:search>
<SearchForm
@search="handleSearch"
@reset="handleReset"
:searchParams="dataStore.initParam"
:formData="dataStore.formData"
@selectMultipleRemoveTag="handleSelectMultipleRemoveTag"
/>
</template>
<template #kd_warehouse_name="scope">
<a @click="handleOpen(scope.row)" class="break-word to-details">
{{ scope.row.kd_warehouse_name }}
</a>
</template>
</ProTable>
</div>
</template>
<script setup lang="ts" name="foundationSetWarehouse">
import ProTable from "@/components/ProTable/index.vue";
import SearchForm from "@/components/SearchForm/index.vue";
import PermissionButton from "@/components/PermissionButton/index.vue";
import { useUserStore } from "@/stores/modules/user";
import {
getSetWarehouseListApi,
getWarehouseDelApi,
getWarehouseAddApi,
getWarehouseUpApi,
getWarehouseDetailsApi
} from "@/api/modules/setWarehouse";
import {
getWarehousesKingdeeListApi,
getSubwarehouseskingdeeListApi,
getWarehousesJushuitanListApi,
getWarehousesLingXingListApi
} from "@/api/modules/global";
import { useMsg } from "@/hooks/useMsg";
import { RULE_FORM, FORM_DATA, COLUMNS, BUTTON } from "./constant/list/index";
import { DETAILS_RULE_FORM, DETAILS_FORM_DATA } from "./constant/list/details";
// 表格TS
import { ProTableInstance } from "@/components/ProTable/interface";
// 深拷贝方法
import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTableRef = ref<ProTableInstance>();
const detailsRef = ref<any>(null);
// 数据源
const dataStore = reactive<any>({
columns: COLUMNS, //列表配置项
initParam: cloneDeep(RULE_FORM), // 初始化搜索条件|重置搜索条件
formData: FORM_DATA, // 搜索配置项
buttons: cloneDeep(BUTTON),
labelWidth: "120px",
title: "新增金蝶子仓与各系统仓库关系",
detailsFormData: cloneDeep(DETAILS_FORM_DATA),
detailsRuleForm: cloneDeep(DETAILS_RULE_FORM),
dialogVisible: false, // 弹窗
selectionList: [] // 列表选中数据
});
const userStore = useUserStore();
//初始化组织数据
const init = () => {
if (userStore.orgIdArr.length) {
dataStore.formData[0].options = userStore?.orgIdArr;
dataStore.detailsFormData[0].options = userStore?.orgIdArr;
}
};
init();
// 表格选择事件
const selectionChange = (selection: any) => {
dataStore.selectionList = selection;
};
// 删除
const handleDel = () => {
if (!dataStore.selectionList.length) {
useMsg("warning", "请选择数据 ");
return;
} else {
ElMessageBox.confirm("您确定进行删除操作吗?", "温馨提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(async () => {
let ids: any = [];
dataStore.selectionList?.forEach((item: any) => {
ids.push(item.id);
});
const result = await getWarehouseDelApi(ids.join(","));
if (result?.code === 0) {
proTableRef?.value!.getTableList();
useMsg("success", "删除成功 ");
}
})
.catch(() => {});
}
};
// 新增
const getWarehouseAdd = async (params: any) => {
const result = await getWarehouseAddApi(params);
if (result?.code === 0) {
useMsg("success", "新增成功 ");
setTimeout(() => {
dataStore.dialogVisible = false;
proTableRef?.value!.getTableList();
}, 600);
}
};
// 更新
const getWarehouseUp = async (params: any) => {
const result = await getWarehouseUpApi(dataStore.rowId, params);
if (result?.code === 0) {
useMsg("success", "更新成功 ");
setTimeout(() => {
dataStore.dialogVisible = false;
proTableRef?.value!.getTableList();
}, 600);
}
};
// 详情
const getWarehouseDetails = async (id: any) => {
const result = await getWarehouseDetailsApi(id);
if (result?.code === 0) {
dataStore.dialogVisible = true;
dataStore.title = "编辑金蝶子仓与各系统仓库关系";
dataStore.detailsRuleForm = result?.data;
//临时变量存储金蝶和金蝶子仓库
let kd_warehouse_number = dataStore?.detailsRuleForm?.kd_warehouse_number;
let kd_subwarehouse = dataStore?.detailsRuleForm?.kd_subwarehouse;
//判断金蝶仓库和金蝶子仓库是否存在
if (kd_warehouse_number && Array.isArray(kd_subwarehouse) && kd_subwarehouse.length) {
let kd_subwarehouse_number: any[] = [];
dataStore?.detailsRuleForm?.kd_subwarehouse?.forEach((item: any) => {
kd_subwarehouse_number.push(item.subwarehouse_number);
});
nextTick(() => {
dataStore.detailsRuleForm.kd_subwarehouse_number = kd_subwarehouse_number;
});
}
}
};
//获取金蝶仓库
const getSetWarehouseKingdeeList = async () => {
dataStore.detailsFormData[1].options = [];
const result = await getWarehousesKingdeeListApi({ use_org_number: dataStore.detailsRuleForm.use_org_number });
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((item: any) => {
options.push({
label: item.warehouse_name,
value: item.warehouse_number
});
});
dataStore.detailsFormData[1].options = options;
}
};
//获取金蝶子仓库
const getSetWarehouseSubwarehousesList = async () => {
//先清空一下
dataStore.detailsFormData[2].options = [];
const result = await getSubwarehouseskingdeeListApi({
warehouse_number: dataStore.detailsRuleForm.kd_warehouse_number
});
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((item: any) => {
options.push({
label: item.sub_warehouse_name,
value: item.sub_warehouse_number
});
});
dataStore.detailsFormData[2].options = options;
}
};
//获取领星仓库
const getSetWarehouseSubwarehousesLingXingList = async () => {
const result = await getWarehousesLingXingListApi();
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((item: any) => {
options.push({
label: item.warehouse_name,
value: item.warehouse_number + ""
});
});
dataStore.detailsFormData[4].options = options;
}
};
//获取聚水潭仓库
const getSetWarehouseSubwarehousesJushuitanList = async () => {
const result = await getWarehousesJushuitanListApi();
if (result?.code === 0) {
let options: any = [];
result?.data?.forEach((item: any) => {
options.push({
label: item.warehouse_name,
value: item.warehouse_number + ""
});
});
dataStore.detailsFormData[3].options = options;
}
};
// 表格row点击事件
const handleOpen = (row: any) => {
dataStore.rowId = row.id;
getWarehouseDetails(row.id);
};
// 顶部按钮点击事件
const handleButtonClickCallback = (item: any) => {
const { type } = item;
if (type === "del") {
handleDel();
}
// if (type === "export") {
// handleExport();
// }
if (type === "add") {
dataStore.title = "新增金蝶子仓与各系统仓库关系";
dataStore.dialogVisible = true;
}
};
// 弹窗取消
const handleClose = () => {
dataStore.detailsRuleForm = cloneDeep(DETAILS_RULE_FORM);
detailsRef?.value?.formElement?.resetFields();
dataStore.dialogVisible = false;
};
// 弹窗确认
const handleCommit = () => {
let params = cloneDeep(dataStore.detailsRuleForm);
if (!params.use_org_number) {
return useMsg("warning", "组织不能为空 !");
}
if (!params.kd_warehouse_number) {
return useMsg("warning", "金蝶仓库不能为空 !");
}
//将金蝶子仓库转换为字符串
let kd_subwarehouse_number = params.kd_subwarehouse_number;
if (Array.isArray(kd_subwarehouse_number) && kd_subwarehouse_number.length) {
params.kd_subwarehouse_number = kd_subwarehouse_number.join(",");
} else {
delete params.kd_subwarehouse_number;
}
if (dataStore.title === "新增金蝶子仓与各系统仓库关系") {
getWarehouseAdd(params);
} else {
getWarehouseUp(params);
}
};
// 搜索
const handleSearch = async (params: any) => {
dataStore.initParam = cloneDeep(params);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
// 重置
const handleReset = () => {
dataStore.initParam = cloneDeep(RULE_FORM);
//这里需要等到表格刷新以后才去请求
nextTick(() => {
proTableRef?.value!.getTableList();
});
};
//监听组织和金蝶仓库清空按钮(会触发下面的watch)
const handleSelectMultipleDClear = (params: any) => {
const {
item: { prop }
} = params;
dataStore.detailsRuleForm[prop] = "";
};
/**
* 监听查询条件标签关闭统一处理组织、仓库、子仓库联动修复split类型错误
* @param params { item: { prop: string } } - 关闭标签的相关参数包含字段标识prop
*/
const handleSelectMultipleRemoveTag = (params: any) => {
const { item } = params;
const { prop } = item;
const paramValue = dataStore.initParam[prop]; // 获取当前参数值
// 根据字段标识分发处理逻辑
switch (prop) {
case "use_org_number":
handleOrgTagRemove(paramValue);
break;
case "kd_warehouse_number":
handleKdWarehouseTagRemove(paramValue);
break;
case "kd_subwarehouse_number":
handleKdSubWarehouseTagRemove(paramValue);
break;
default:
break;
}
};
/**
* 组织标签关闭处理(联动仓库、子仓库)
* @param remainingOrgValues 关闭后剩余的组织value数组["101"]、["101","115"]
*/
const handleOrgTagRemove = (remainingOrgValues: any[]) => {
// 2. 筛选仓库:基于原始金蝶仓库数据,聚合所有剩余组织对应的仓库(去重)
let filteredWarehouses: any = [];
if (remainingOrgValues.length > 0) {
filteredWarehouses = dataStore.formData[1].options.filter((warehouse: any) =>
remainingOrgValues.includes(warehouse.use_org_number)
);
// 去重:避免同一仓库被多个组织关联导致重复
filteredWarehouses = Array.from(new Map(filteredWarehouses.map((item: any) => [item.value, item])).values());
}
// 3. 重置仓库状态(清空已选+更新选项)
dataStore.initParam.kd_warehouse_number = "";
dataStore.formData[1].options = [];
dataStore.formData[1].options = filteredWarehouses;
// 4. 重置子仓库状态(仓库变化后必须清空)
dataStore.initParam.kd_subwarehouse_number = "";
dataStore.formData[2].options = [];
};
/**
* 金蝶仓库标签关闭处理(联动子仓库)
* @param remainingWarehouseValues 关闭后剩余的仓库value数组["AD"]、["AD","CK001"]
*/
const handleKdWarehouseTagRemove = (remainingWarehouseValues: any[]) => {
// 2. 筛选子仓库:基于原始金蝶子仓库数据,聚合所有剩余仓库对应的子仓库
let filteredSubWarehouses = [];
if (remainingWarehouseValues.length > 0) {
filteredSubWarehouses = dataStore.formData[2].options.filter((subWarehouse: any) =>
remainingWarehouseValues.includes(subWarehouse.warehouse_number)
);
} else {
// 仓库全部关闭:显示所有原始子仓库数据
filteredSubWarehouses = [...dataStore.formData[2].options];
}
// 3. 重置子仓库状态(清空已选+更新选项)
dataStore.initParam.kd_subwarehouse_number = "";
dataStore.formData[2].options = [];
dataStore.formData[2].options = filteredSubWarehouses;
};
/**
* 金蝶子仓库标签关闭处理(仅更新自身,不联动上级)
* @param remainingSubWarehouseValues 关闭后剩余的子仓库value数组
*/
const handleKdSubWarehouseTagRemove = (remainingSubWarehouseValues: any[]) => {
// 同步表单已选值
dataStore.formData[2].options = remainingSubWarehouseValues;
};
// //监听弹窗开启
watch(
() => dataStore.dialogVisible,
(newVal: any) => {
if (newVal) {
//金蝶倉庫
getSetWarehouseKingdeeList();
//领星仓库
getSetWarehouseSubwarehousesLingXingList();
//聚水潭仓库
getSetWarehouseSubwarehousesJushuitanList();
}
},
{
deep: true
}
);
//监听组织值改变(值改变关联关系需重置)
watch(
() => dataStore.detailsRuleForm.use_org_number,
(newVal: any) => {
if (newVal) {
dataStore.detailsRuleForm.kd_warehouse_number = "";
dataStore.detailsRuleForm.kd_subwarehouse_number = "";
getSetWarehouseKingdeeList();
} else {
dataStore.detailsRuleForm.kd_warehouse_number = "";
dataStore.detailsRuleForm.kd_subwarehouse_number = "";
dataStore.detailsFormData[1].options = [];
dataStore.detailsFormData[2].options = [];
}
}
);
//监听金蝶仓库值改变(值改变关联关系需重置)
watch(
() => dataStore.detailsRuleForm.kd_warehouse_number,
(newVal: any) => {
if (newVal) {
dataStore.detailsRuleForm.kd_subwarehouse_number = "";
getSetWarehouseSubwarehousesList();
} else {
dataStore.detailsRuleForm.kd_subwarehouse_number = "";
dataStore.detailsFormData[2].options = [];
}
}
);
</script>
<style scope lang="scss">
.down-dialog-box {
.el-dialog__body {
padding: 0 16px 40px;
}
}
.el-dialog .el-dialog__header {
padding: 8px 0;
font-weight: bold;
}
</style>

View File

@@ -31,6 +31,8 @@ import { BUTTON } from "./constant/add/button";
import { useUserStore } from "@/stores/modules/user"; import { useUserStore } from "@/stores/modules/user";
import { cloneDeep } from "lodash-es"; import { cloneDeep } from "lodash-es";
import $Bus from "@/utils/mittBus"; import $Bus from "@/utils/mittBus";
// import { useTabsStore } from "@/stores/modules/tabs";
// const tabStore = useTabsStore();
const dataStore = reactive({ const dataStore = reactive({
formData: cloneDeep(FORM_DATA), formData: cloneDeep(FORM_DATA),
ruleForm: cloneDeep(RULE_FORM), ruleForm: cloneDeep(RULE_FORM),
@@ -53,28 +55,37 @@ const init = () => {
init(); init();
//新增 //新增
const handleAdd = () => { const handleAdd = () => {
if ( if ($route.query.title === "编辑订阅") {
dataStore.ruleForm?.customer_number?.length || $router.replace({
dataStore.ruleForm?.org_number || path: "/foundation/subscribe/list/add",
dataStore.ruleForm?.product_lines || query: {
dataStore.ruleForm?.subscriber_dduid title: "新增订阅"
) { }
ElMessageBox.confirm("当前数据未提交, 确认放弃新增数据?", "温馨提示", { });
confirmButtonText: "确定", }
cancelButtonText: "取消", if ($route.query.title === "新增订阅") {
type: "warning" if (
}) dataStore.ruleForm?.customer_number?.length ||
.then(async () => { dataStore.ruleForm?.org_number ||
dataStore.ruleForm = cloneDeep(RULE_FORM); dataStore.ruleForm?.product_lines ||
dataStore.ruleForm.org_number = ["101"]; dataStore.ruleForm?.subscriber_dduid
dataStore.isAdd = true; ) {
detailsRef?.value?.formElement?.resetFields(); ElMessageBox.confirm("当前数据未提交, 确认放弃新增数据?", "温馨提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}) })
.catch(() => {}); .then(async () => {
dataStore.ruleForm = cloneDeep(RULE_FORM);
dataStore.ruleForm.org_number = ["101"];
dataStore.isAdd = true;
detailsRef?.value?.formElement?.resetFields();
})
.catch(() => {});
}
} }
}; };
const handleGoList = () => { const handleGoList = () => {
detailsRef?.value?.formElement?.resetFields();
setTimeout(() => { setTimeout(() => {
$router.replace({ path: "/foundation/subscribe/list/index" }); $router.replace({ path: "/foundation/subscribe/list/index" });
$Bus.emit("setResetList"); $Bus.emit("setResetList");
@@ -88,6 +99,8 @@ const getSubscribeAdd = async (params: any) => {
useMsg("success", "新增成功 "); useMsg("success", "新增成功 ");
dataStore.ruleForm = cloneDeep(RULE_FORM); dataStore.ruleForm = cloneDeep(RULE_FORM);
dataStore.ruleForm.org_number = ["101"]; dataStore.ruleForm.org_number = ["101"];
detailsRef?.value?.formElement?.resetFields();
handleGoList();
} }
}; };
//更新 //更新

View File

@@ -1,4 +1,4 @@
<!-- 质检单 --> <!-- 订阅人列表 -->
<template> <template>
<div class="table-box"> <div class="table-box">
<div style="padding-bottom: 16px"> <div style="padding-bottom: 16px">
@@ -53,6 +53,7 @@ import { cloneDeep } from "lodash-es";
// 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数) // 获取 ProTable 元素,调用其获取刷新数据方法(还能获取到当前查询参数,方便导出携带参数)
const proTableRef = ref<ProTableInstance>(); const proTableRef = ref<ProTableInstance>();
const router = useRouter(); const router = useRouter();
const userStore = useUserStore(); const userStore = useUserStore();
// 数据源 // 数据源

View File

@@ -81,7 +81,12 @@ export const FORM_DATA: FormItem[] = [
type: "input", type: "input",
label: "子仓库: " label: "子仓库: "
}, },
{
prop: "customer_name",
placeholder: "请输入客户名称",
type: "input",
label: "客户名称: "
},
{ {
prop: "Time", prop: "Time",
type: "daterange", type: "daterange",

View File

@@ -11,13 +11,15 @@ export const COLUMNS = [
align: "left", align: "left",
label: "来源单号", label: "来源单号",
prop: "src_bill_no", prop: "src_bill_no",
width: 140 width: 140,
fixed: true
}, },
{ {
align: "left", align: "left",
label: "订单单号", label: "订单单号",
prop: "order_no", prop: "order_no",
width: 140 width: 140,
fixed: true
}, },
{ {
align: "left", align: "left",
@@ -25,18 +27,18 @@ export const COLUMNS = [
prop: "customer_name", prop: "customer_name",
width: 140 width: 140
}, },
{ {
align: "left", align: "left",
label: "入库组织", label: "入库时间",
prop: "warehousing_org_name", prop: "storage_time",
width: 200 width: 160
}, },
{ {
align: "left", align: "left",
label: "单据类型", label: "单据类型",
prop: "bill_type_name", prop: "bill_type_name",
width: 140 width: 80
}, },
{ {
align: "left", align: "left",
@@ -60,7 +62,7 @@ export const COLUMNS = [
align: "left", align: "left",
label: "出厂价", label: "出厂价",
prop: "factory_price", prop: "factory_price",
width: 140 width: 66
}, },
{ {
align: "left", align: "left",
@@ -78,7 +80,7 @@ export const COLUMNS = [
align: "left", align: "left",
label: "入库数量", label: "入库数量",
prop: "real_qty", prop: "real_qty",
width: 140 width: 76
}, },
{ {
align: "left", align: "left",
@@ -90,13 +92,13 @@ export const COLUMNS = [
align: "left", align: "left",
label: "单位", label: "单位",
prop: "unit_name", prop: "unit_name",
width: 120 width: 50
}, },
{ {
align: "left", align: "left",
label: "入库时间", label: "入库组织",
prop: "storage_time", prop: "warehousing_org_name",
width: 160 width: 200
}, },
{ {
align: "left", align: "left",

View File

@@ -1,4 +1,4 @@
<!-- 入库单 --> <!-- 入库单列表 -->
<template> <template>
<div class="table-box"> <div class="table-box">
<div style="padding-bottom: 16px"> <div style="padding-bottom: 16px">

View File

@@ -9,7 +9,7 @@ export const handleExport = async (data: any) => {
Array.isArray(params?.org_number) && params?.org_number?.length ? params.org_number.join(",") : params.org_number; Array.isArray(params?.org_number) && params?.org_number?.length ? params.org_number.join(",") : params.org_number;
const result = await getSubscribeResetListExportApi(params); const result = await getSubscribeResetListExportApi(params);
if (result?.code === 0) { if (result?.code === 0) {
useMsg("success", "导出成功 "); useMsg("success", "导出成功请前往导出列表中进行下载 ");
} }
}; };
// proTable: any // proTable: any

View File

@@ -6,11 +6,11 @@
<script setup lang="ts" name="home"> <script setup lang="ts" name="home">
//登录请求接口 //登录请求接口
// import { getOrgsApi, getWarehousesListApi } from "@/api/modules/global"; import { getWarehousesListApi } from "@/api/modules/global";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
//用户信息存储 //用户信息存储
// import { useUserStore } from "@/stores/modules/user"; import { useUserStore } from "@/stores/modules/user";
// const userStore = useUserStore(); const userStore = useUserStore();
//路由; //路由;
const $route = useRoute(); const $route = useRoute();
const $router = useRouter(); const $router = useRouter();
@@ -33,24 +33,24 @@ const $router = useRouter();
// } // }
// }; // };
// getOrgs(); // getOrgs();
// const getWarehousesList = async () => { const getWarehousesList = async () => {
// const result = await getWarehousesListApi(); const result = await getWarehousesListApi();
// if (result?.code === 0) { if (result?.code === 0) {
// const { data } = result; const { data } = result;
// if (data?.length) { if (data?.length) {
// let options: any = []; let options: any = [];
// data.forEach((item: any) => { data.forEach((item: any) => {
// options.push({ options.push({
// id: item.id, id: item.id,
// value: item.warehouse_name, value: item.warehouse_number,
// label: item.warehouse_name label: item.warehouse_name
// }); });
// }); });
// userStore.setWarehouse(options); userStore.setWarehouse(options);
// } }
// } }
// }; };
// getWarehousesList(); getWarehousesList();
const init = () => { const init = () => {
let redirect_path: any = $route.query.redirect_path; let redirect_path: any = $route.query.redirect_path;

View File

@@ -39,7 +39,7 @@ const getOrgs = async () => {
}; };
const getWarehousesList = async () => { const getWarehousesList = async () => {
const result = await getWarehousesListApi(); const result = await getWarehousesListApi({});
if (result?.code === 0) { if (result?.code === 0) {
const { data } = result; const { data } = result;
if (data?.length) { if (data?.length) {

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long