VistarStarDataIntegration/admin.net.pro/Web/src/views/materialManagement/projectManagement/index.vue
2024-09-26 00:21:59 +08:00

353 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="projectManagement-container">
<el-card shadow="hover"
:body-style="{ padding: '20px 20px 16px 10px', display: 'flex', width: '100%', height: '100%', alignItems: 'start' }">
<el-form :model="state.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true"
label-width="auto" style="flex: 1 1 0%" @submit.prevent="handleQuery">
<el-row :gutter="10">
<el-col :xs="24" :sm="12" :md="8" :lg="5" :xl="6" class="mb5">
<el-form-item label="项目编号" prop="_System_objNBS">
<el-input v-model="state.queryParams._System_objNBS" placeholder="项目编号" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="5" :xl="6" class="mb5">
<el-form-item label="项目描述" prop="fld004502">
<el-input v-model="state.queryParams.fld004502" placeholder="项目描述" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="5" :xl="6" class="mb5">
<el-form-item label="创建时间" prop="fld004683">
<el-date-picker type="daterange" v-model="state.queryParams.fld004683Range"
value-format="YYYY-MM-DD HH:mm:ss" start-placeholder="开始日期" end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]" unlink-panels />
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="6" class="mb5">
<el-button type="primary" icon="ele-Search" @click="handleQuery"
v-auth="'projectManagement/page'" :loading="options.loading"> 查询 </el-button>
<el-button icon="ele-Refresh" @click="resetQuery" :loading="options.loading"> 重置 </el-button>
</el-col>
</el-row>
</el-form>
</el-card>
<el-card class="full-table" shadow="hover" style="margin-top: 5px">
<vxe-grid ref="xGrid" class="xGrid-style" v-bind="options" v-on="gridEvents">
<template #toolbar_tools>
<el-button style="position: absolute; left: 0" icon="ele-Promotion" size="small" text=""
type="success" @click="batchSyncToSAP" v-auth="'projectManagement/batchSyncToSAP'"> 批量同步到SAP
</el-button>
</template>
<template #row_buttons="{ row }">
<el-tooltip content="同步BOM" placement="top">
<el-button icon="ele-MessageBox" size="small" text="" type="primary" @click="getBOM(row)"
v-auth="'projectManagement/getBOM'" v-if="row.fld004514=='A'||row.fld004514=='M'">
同步BOM </el-button>
</el-tooltip>
<el-tooltip content="工艺路线" placement="top">
<el-button icon="ele-MessageBox" size="small" text="" type="primary" @click=""
v-if="row.fld004320 != 'N'">
工艺路线 </el-button>
</el-tooltip>
<el-tooltip content="同步到ERP" placement="top">
<el-button icon="ele-Promotion" size="small" text="" type="success" @click="syncToSAP(row)"
v-auth="'projectManagement/syncToSAP'" v-if="row.fld004510=='A'||row.fld004510=='M'"> 同步到SAP </el-button>
</el-tooltip>
</template>
</vxe-grid>
</el-card>
<!-- 添加 drawer 抽屉 -->
<el-drawer v-model="showBom" title="BOM 详情" :direction="'rtl'" :visible.sync="false" size="50%">
<!-- 这里可以放置 BOM 的具体内容 -->
<el-card class="full-table" shadow="hover" style="margin-top: 5px;height: 100%;">
<el-form :model="stateBom.queryParams" ref="queryForm" :show-message="false" :inlineMessage="true"
label-width="auto" style="flex: 1 1 0%" @submit.prevent="handleQueryBom">
<el-input v-model="stateBom.queryParams.ParentGuid" placeholder="父GUID" @click="handleQueryBom" />
</el-form>
<vxe-grid ref="bomxGrid" v-bind="bomOptions" v-on="gridEvents">
<template #toolbar_tools>
<el-button style="position: absolute; left: 0" icon="ele-Promotion" size="small" text=""
type="success" @click="syncToSAPBom" v-auth="'projectManagement/syncToSAPBom'"> BOM同步到SAP
</el-button>
</template>
</vxe-grid>
</el-card>
</el-drawer>
</div>
</template>
<script lang="ts" setup name="projectManagement">
import { onMounted, reactive, ref } from 'vue';
import { ElMessageBox, ElMessage } from "element-plus";
import { auth } from '/@/utils/authFunction';
import { VxeGridInstance, VxeGridListeners, VxeGridPropTypes } from 'vxe-table';
import { useVxeTable } from '/@/hooks/useVxeTableOptionsHook';
import { Local } from '/@/utils/storage';
import { formatDate } from '/@/utils/formatTime';
import { PageProjectManagement, SyncToSAPProjectManagement, GetBOMProjectManagement, BatchSyncToSAPProjectManagement, SyncToSAPBomProjectManagement } from '/@/api/materialManagement/projectManagement';
import { disable } from 'ol/rotationconstraint';
// 子窗口对象
const xGrid = ref<VxeGridInstance>();
const editDialogRef = ref();
let bomTypeList: any;
// 变量
const state = reactive({
showAdvanceQueryUI: false,
queryParams: {
searchKey: undefined,
_System_objNBS: undefined,
fld004502: undefined,
fld004683: undefined,
fld004683Range: undefined,
},
localPageParam: {
pageSize: 50 as number,
defaultSort: { field: 'createTime', order: 'asc', descStr: 'desc' },
},
visible: false,
title: '',
});
// 重置操作
const resetQuery = async () => {
state.queryParams.searchKey = undefined,
state.queryParams._System_objNBS = undefined,
state.queryParams.fld004502 = undefined,
state.queryParams.fld004683 = undefined,
await xGrid.value?.commitProxy('reload');
};
// 表格事件
const gridEvents: VxeGridListeners = {
// 只对 pager-config 配置时有效,分页发生改变时会触发该事件
async pageChange({ pageSize }) {
state.localPageParam.pageSize = pageSize;
Local.set(localPageParamKey, state.localPageParam);
},
// 当排序条件发生变化时会触发该事件
async sortChange({ field, order }) {
state.localPageParam.defaultSort = { field: field, order: order!, descStr: 'desc' };
Local.set(localPageParamKey, state.localPageParam);
},
};
// 本地存储参数
const localPageParamKey = 'localPageParam:projectManagement';
// 表格参数配置
const options = useVxeTable(
{
id: 'projectManagement',
name: '产品管理',
columns: [
{ type: 'checkbox', title: '', width: 60},
{ type: 'seq', title: '序号', width: 60 },
{ field: '_System_objNBS', title: '项目编号', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: '_System_ObjDescription', title: '项目名称', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004683', title: '创建时间', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004509', title: '物料同步状态', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004508', title: '物料同步时间', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004510', title: '物料同步标识', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004507', title: '物料同步信息', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004511', title: 'BOM同步状态', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004513', title: 'BOM同步时间', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004514', title: 'BOM同步标识', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004512', title: 'BOM同步信息', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004515', title: '工艺同步状态', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004518', title: '工艺同步时间', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004517', title: '工艺同步标识', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'fld004516', title: '工艺同步信息', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ title: '操作', fixed: 'right', width: 300, showOverflow: true, slots: { default: 'row_buttons' } },
],
},
// vxeGrid配置参数(此处可覆写任何参数)参考vxe-table官方文档
{
// 代理配置
proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleQueryApi(page, sort) } },
// 排序配置
sortConfig: { defaultSort: Local.get(localPageParamKey)?.defaultSort || state.localPageParam.defaultSort },
// 分页配置
pagerConfig: { pageSize: Local.get(localPageParamKey)?.pageSize || state.localPageParam.pageSize },
// 工具栏配置
toolbarConfig: { export: false },
// 行设置
// rowConfig: { height: 80 },
}
);
// 页面初始化
onMounted(() => {
});
// 查询api
const handleQueryApi = async (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
const params = Object.assign(state.queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' });
var data = PageProjectManagement(params)
return data;
};
// 查询操作
const handleQuery = async (reset = false) => {
options.loading = true;
await xGrid.value?.commitProxy('query');
options.loading = false;
};
// 同步到SAP
const syncToSAP = async (row: any) => {
options.loading = true;
ElMessageBox.confirm(`确定要同步物料吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
var data = await SyncToSAPProjectManagement(row);
await handleQuery();
if (data.data.result.code == "成功") {
ElMessage.success("同步成功");
} else {
ElMessage.error("同步失败");
}
})
.catch(() => { });
options.loading = false;
};
//物料批量同步到SAP
const batchSyncToSAP = async () => {
options.loading = true;
var data = xGrid.value?.getCheckboxRecords();
ElMessageBox.confirm(`确定要批量同步物料吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
var output = await BatchSyncToSAPProjectManagement(data);
await handleQuery();
var succeed = 0;
var error = 0;
for (let i = 0; i < output.data.result.length; i++) {
var code = output.data.result[i].code
if (code == "成功") {
succeed++
} else {
error++
}
}
ElMessageBox.alert("同步成功:" + succeed + "" + "同步失败:" + error, '批量同步结果', {
// 如果你想禁用它的自动对焦
// autofocus: false,
confirmButtonText: 'OK'
})
})
.catch(() => { });
options.loading = false;
}
// 变量
const stateBom = reactive({
showAdvanceQueryUI: false,
queryParams: {
PartNumber: undefined,
Description: undefined,
ParentGuid: undefined
},
localPageParam: {
pageSize: 50 as number,
defaultSort: { field: 'createTime', order: 'asc', descStr: 'desc' },
},
visible: false,
title: '',
});
const showBom = ref(false);
// 查看BOM
const getBOM = async (row: any) => {
stateBom.queryParams.ParentGuid = row.recordGuid;
showBom.value = true;
await handleQueryBom();
};
// 本地存储参数
const localPageParamKeyBom = 'localPageParam:productManagementBom';
// 表格参数配置
const bomOptions = useVxeTable(
{
id: 'productManagementBom',
name: '产品管理',
columns: [
{ type: 'seq', title: '序号', width: 60 },
{ field: 'partNumber', title: '物料编码', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'description', title: '物料描述', minWidth: 100, showOverflow: 'tooltip', sortable: false },
{ field: 'quantity', title: '数量', minWidth: 100, showOverflow: 'tooltip', sortable: false },
],
},
// vxeGrid配置参数(此处可覆写任何参数)参考vxe-table官方文档
{
// 代理配置
proxyConfig: { autoLoad: true, ajax: { query: ({ page, sort }) => handleBOMQueryApi(page, sort) } },
// 排序配置
sortConfig: { defaultSort: Local.get(localPageParamKeyBom)?.defaultSort || stateBom.localPageParam.defaultSort },
// 分页配置
pagerConfig: { pageSize: Local.get(localPageParamKeyBom)?.pageSize || stateBom.localPageParam.pageSize },
// 工具栏配置
toolbarConfig: { export: false },
// 行设置
// rowConfig: { height: 80 },
}
);
// BOM 查询 API
const handleBOMQueryApi = async (page: VxeGridPropTypes.ProxyAjaxQueryPageParams, sort: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams) => {
const params = Object.assign(stateBom.queryParams, { page: page.currentPage, pageSize: page.pageSize, field: sort.field, order: sort.order, descStr: 'desc' });
var data = GetBOMProjectManagement(params);
return data;
};
const bomxGrid = ref<VxeGridInstance>();
const handleQueryBom = async (reset = false) => {
bomOptions.loading = true;
await bomxGrid.value?.commitProxy('query');
bomOptions.loading = false;
};
//Bom同步到sap
const syncToSAPBom = async () => {
options.loading = true;
var data = bomxGrid.value?.getTableData().fullData;
ElMessageBox.confirm(`确定要同步BOM吗`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(async () => {
var output = await SyncToSAPBomProjectManagement(data);
await handleQuery();
if (output.data.result.code == "成功") {
ElMessage.success("同步成功");
} else {
ElMessage.error("同步失败");
}
})
.catch(() => { });
options.loading = false;
}
</script>