MES优化
This commit is contained in:
parent
73b66c04f7
commit
fa69689738
|
|
@ -22,6 +22,7 @@
|
|||
"core-js": "^3.6.5",
|
||||
"date-fns": "^2.14.0",
|
||||
"enquire.js": "^2.1.6",
|
||||
"file-saver": "^2.0.5",
|
||||
"hevue-img-preview": "^6.1.0",
|
||||
"highlight.js": "^10.2.1",
|
||||
"js-cookie": "^2.2.1",
|
||||
|
|
|
|||
|
|
@ -2,14 +2,18 @@
|
|||
<div class="page-body">
|
||||
|
||||
<vxe-form :data="options.formOptions.data" ref="xForm" :title-width="options.formOptions.titleWidth"
|
||||
:title-align="options.formOptions.titleAlign" :rules="options.formOptions.rules" :items="options.formOptions.items" titleColon>
|
||||
:title-align="options.formOptions.titleAlign" :rules="options.formOptions.rules" :items="options.formOptions.items"
|
||||
titleColon>
|
||||
</vxe-form>
|
||||
|
||||
<div class="footerbar">
|
||||
<a-button type="primary" @click="ok">确定</a-button>
|
||||
<a-button type="primary" @click="save">确定</a-button>
|
||||
<a-button @click="cancel">取消</a-button>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
|
@ -33,7 +37,8 @@ export default {
|
|||
data() {
|
||||
|
||||
return {
|
||||
isEdit:false
|
||||
isEdit: false,
|
||||
defaultFormData: {}
|
||||
|
||||
};
|
||||
},
|
||||
|
|
@ -44,7 +49,7 @@ export default {
|
|||
|
||||
created() {
|
||||
|
||||
|
||||
this.defaultFormData = JSON.parse(JSON.stringify(this.options.formOptions.data || {}))
|
||||
|
||||
},
|
||||
// 函数
|
||||
|
|
@ -69,8 +74,10 @@ export default {
|
|||
},
|
||||
|
||||
// 保存
|
||||
ok() {
|
||||
save({ afterSave }) {
|
||||
|
||||
|
||||
let _this = this;
|
||||
let save = () => {
|
||||
|
||||
this.isEdit = this.options.isEdit;
|
||||
|
|
@ -96,10 +103,34 @@ export default {
|
|||
data: postdata,
|
||||
useBigInt: true,
|
||||
}).then(() => { // 成功回调
|
||||
if (afterSave) {
|
||||
afterSave();
|
||||
} else {
|
||||
this.$mk.success("保存成功");
|
||||
|
||||
this.$emit("afterSave", { data: postdata });
|
||||
if (!this.isEdit) { // 如果是新增模式,关闭当前页面
|
||||
|
||||
if (this.options.action_afterSave == "confirm") {
|
||||
this.$confirm({
|
||||
title: '提示',
|
||||
content: '新增成功,是否继续',
|
||||
okText: '确认',
|
||||
cancelText: '返回',
|
||||
onOk() {
|
||||
_this.options.formOptions.data = _this.defaultFormData;
|
||||
},
|
||||
onCancel() {
|
||||
_this.back();
|
||||
},
|
||||
});
|
||||
} else {
|
||||
this.back();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}).catch((a) => { // 失败回调
|
||||
this.$mk.error(a.data.msg); // 显示错误信息
|
||||
});
|
||||
|
|
|
|||
|
|
@ -22,6 +22,12 @@
|
|||
<vxe-toolbar ref="xToolbar" custom>
|
||||
<template #buttons>
|
||||
<a-button type="primary" icon="delete" @click="pageDelete()">批量删除</a-button>
|
||||
<a-button type="primary" style="margin-left: 5px;" icon="export" v-if="options.enabledExport"
|
||||
@click="pageExport()">导出</a-button>
|
||||
<a-button type="primary" style="margin-left: 5px;" icon="import" v-if="options.enabledImport"
|
||||
@click="pageImport()">导入</a-button>
|
||||
<a-button type="default" style="margin-left: 5px;" v-if="options.enabledImportTemplate"
|
||||
@click="pageImportTemplate()">下载导入模板</a-button>
|
||||
</template>
|
||||
</vxe-toolbar>
|
||||
<!-- 表格区 -->
|
||||
|
|
@ -38,11 +44,26 @@
|
|||
</div>
|
||||
|
||||
|
||||
<vxe-modal v-model="showSheetNameSelector" width="500" height="400" title="选择表名">
|
||||
<template #default>
|
||||
<div>
|
||||
<vxe-select v-model="excelSheetName" placeholder="选择表名" style="width:100%">
|
||||
<vxe-option v-for="n in excelSheetNames" :key="n" :value="n" :label="n"></vxe-option>
|
||||
</vxe-select>
|
||||
</div>
|
||||
<div style="margin-top:10px;">
|
||||
<vxe-button status="primary" content="确定" @click="importOk"></vxe-button>
|
||||
</div>
|
||||
</template>
|
||||
</vxe-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import FileSaver from 'file-saver'
|
||||
import * as XLSX from 'xlsx'
|
||||
import { read, utils } from "xlsx"; // 注意处理方法引入方式
|
||||
|
||||
|
||||
export default {
|
||||
|
|
@ -55,7 +76,7 @@ export default {
|
|||
data() {
|
||||
|
||||
return {
|
||||
|
||||
showSheetNameSelector: false, excelSheetName: '', excelSheetNames: [],
|
||||
bindSearchData: null
|
||||
};
|
||||
|
||||
|
|
@ -117,11 +138,120 @@ export default {
|
|||
// 动作
|
||||
methods: {
|
||||
|
||||
pageExport() {
|
||||
let jsonRows = [];
|
||||
let headerCells = [];
|
||||
|
||||
// =============================== 基于status进行开关 自动生成 Start ===============================
|
||||
for (let i = 0; i < this.options.exportColumns.length; i++) {
|
||||
let item = this.options.exportColumns[i];
|
||||
headerCells.push(item.title);
|
||||
}
|
||||
|
||||
// =============================== 基于status进行开关 自动生成 End ===============================
|
||||
|
||||
let details = JSON.parse(JSON.stringify(this.$refs.xGrid.getTableData().fullData));
|
||||
|
||||
|
||||
details.forEach(row => {
|
||||
let jsonRow = {
|
||||
};
|
||||
for (let i = 0; i < this.options.exportColumns.length; i++) {
|
||||
let item = this.options.exportColumns[i];
|
||||
jsonRow[item.title] = row[item.field] || '';
|
||||
}
|
||||
jsonRows.push(jsonRow);
|
||||
});
|
||||
var worksheet = XLSX.utils.json_to_sheet(jsonRows, { header: headerCells, skipHeader: false });
|
||||
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
|
||||
|
||||
/* get binary string as output */
|
||||
var wbout = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'array' })
|
||||
try {
|
||||
FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), (this.options.exportFileTitle || '导出数据' )+ '.xlsx')
|
||||
} catch (e) {
|
||||
if (typeof console !== 'undefined') {
|
||||
console.log(e, wbout)
|
||||
}
|
||||
}
|
||||
},
|
||||
pageImportTemplate() {
|
||||
let jsonRows = [];
|
||||
let headerCells = [];
|
||||
|
||||
for (let i = 0; i < this.options.exportColumns.length; i++) {
|
||||
let item = this.options.exportColumns[i];
|
||||
headerCells.push(item.title);
|
||||
}
|
||||
var worksheet = XLSX.utils.json_to_sheet(jsonRows, { header: headerCells, skipHeader: false });
|
||||
|
||||
const workbook = XLSX.utils.book_new();
|
||||
XLSX.utils.book_append_sheet(workbook, worksheet, "Sheet1");
|
||||
/* get binary string as output */
|
||||
var wbout = XLSX.write(workbook, { bookType: 'xlsx', bookSST: true, type: 'array' })
|
||||
try {
|
||||
FileSaver.saveAs(new Blob([wbout], { type: 'application/octet-stream' }), '导入模板.xlsx')
|
||||
} catch (e) {
|
||||
if (typeof console !== 'undefined') {
|
||||
console.log(e, wbout)
|
||||
}
|
||||
}
|
||||
},
|
||||
pageImport() {
|
||||
let fileForm = document.createElement('form');
|
||||
let fileInput = document.createElement('input');
|
||||
fileForm.className = 'vxe-table--file-form';
|
||||
fileInput.name = 'file';
|
||||
fileInput.type = 'file';
|
||||
fileForm.appendChild(fileInput);
|
||||
document.body.appendChild(fileForm);
|
||||
|
||||
fileInput.multiple = false;
|
||||
fileInput.accept = '';
|
||||
|
||||
fileInput.onchange = (evnt) => {
|
||||
var files = evnt.target.files;
|
||||
var file = files[0];
|
||||
this.readExcel(file)
|
||||
};
|
||||
|
||||
fileForm.reset();
|
||||
fileInput.click();
|
||||
},
|
||||
readExcel(file) {
|
||||
const fileReader = new FileReader();
|
||||
this.$mk.loading("读取中...");
|
||||
fileReader.onload = ev => {
|
||||
try {
|
||||
const data = ev.target.result;
|
||||
const workbook = read(data, { type: "binary" });
|
||||
this.workbook = workbook;
|
||||
this.excelSheetNames = workbook.SheetNames;
|
||||
this.showSheetNameSelector = true;
|
||||
this.$mk.hideLoading();
|
||||
|
||||
|
||||
|
||||
} catch (e) {
|
||||
console.log("error:" + e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
fileReader.readAsBinaryString(file);
|
||||
},
|
||||
|
||||
importOk() {
|
||||
this.showSheetNameSelector = false;
|
||||
|
||||
const { workbook, excelSheetName } = this;
|
||||
if (!excelSheetName) {
|
||||
return;
|
||||
}
|
||||
let tableData = utils.sheet_to_json(workbook.Sheets[excelSheetName]);
|
||||
|
||||
this.$emit("importData", { data: tableData });
|
||||
|
||||
},
|
||||
// 修改日期
|
||||
onDateChange(date) { // 日期选择器事件
|
||||
if (date && date.length) { // 如果有值
|
||||
|
|
@ -149,6 +279,9 @@ export default {
|
|||
if (mode == "like") { // 如果是模糊搜索
|
||||
value = "%" + value + "%"; // 如果是模糊搜索就在两边加上%
|
||||
}
|
||||
if(typeof(value) == "object" && value.id){
|
||||
value = value.id;
|
||||
}
|
||||
rules.push({ // 添加搜索参数
|
||||
column: key, // 字段名
|
||||
mode: mode, // 搜索模式
|
||||
|
|
@ -204,13 +337,103 @@ export default {
|
|||
}
|
||||
},
|
||||
|
||||
getPageList() {
|
||||
|
||||
let target = [];
|
||||
|
||||
let find = (component) => {
|
||||
|
||||
if (component && component.pageList) {
|
||||
target = component.pageList;
|
||||
}
|
||||
if (component.$parent) {
|
||||
find(component.$parent)
|
||||
}
|
||||
}
|
||||
|
||||
find(this.$parent);
|
||||
|
||||
|
||||
return target;
|
||||
},
|
||||
isEditPageOpen() {
|
||||
let pageList = this.getPageList();
|
||||
if (pageList.filter(a => a.keyPath && a.keyPath.indexOf(this.options.editPageUrl) == 0).length) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
getTabsViewPageComponent() {
|
||||
|
||||
let target = null;
|
||||
|
||||
let find = (component) => {
|
||||
|
||||
if (component && component.pageList) {
|
||||
target = component;
|
||||
}
|
||||
if (component.$parent) {
|
||||
find(component.$parent)
|
||||
}
|
||||
}
|
||||
|
||||
find(this.$parent);
|
||||
|
||||
|
||||
return target;
|
||||
},
|
||||
//找到定义了beforeTabClose方法 的页面组件
|
||||
findEditPageComponent(key) {
|
||||
if (!key) {
|
||||
return null;
|
||||
}
|
||||
let target = null;
|
||||
|
||||
|
||||
let find = (children) => {
|
||||
children.forEach(item => {
|
||||
if (item.beforeTabClose && item.pageKeys && item.pageKeys.filter(a => key.indexOf(a) == 0).length) {
|
||||
target = item;
|
||||
return;
|
||||
}
|
||||
if (item.$children && item.$children.length) {
|
||||
find(item.$children)
|
||||
}
|
||||
})
|
||||
}
|
||||
let tabsview = this.getTabsViewPageComponent();
|
||||
if (tabsview == null) {
|
||||
return null;
|
||||
}
|
||||
find(tabsview.$children);
|
||||
|
||||
|
||||
return target;
|
||||
},
|
||||
// 编辑
|
||||
pageEdit(row) {
|
||||
if (!row) { // 如果没有选中行
|
||||
this.$mk.msg("请选择行"); // 提示
|
||||
return; // 返回
|
||||
}
|
||||
if (this.isEditPageOpen()) {
|
||||
let editPage = this.findEditPageComponent(this.options.editPageUrl);
|
||||
if (editPage != null) {
|
||||
editPage.beforeTabClose().then(() => {
|
||||
this.$closePage(this.options.editPageUrl);
|
||||
this.$openPage(this.options.editPageUrl + row[this.options.keyName]); // 打开页面
|
||||
});
|
||||
} else {
|
||||
this.$openPage(this.options.editPageUrl + row[this.options.keyName]); // 打开页面
|
||||
}
|
||||
|
||||
} else {
|
||||
this.$openPage(this.options.editPageUrl + row[this.options.keyName]); // 打开页面
|
||||
}
|
||||
|
||||
|
||||
|
||||
},
|
||||
|
||||
// 删除
|
||||
|
|
|
|||
|
|
@ -88,7 +88,11 @@ VXETable.formats.mixin({
|
|||
},
|
||||
formatRef({ cellValue,column }) { // 格式化参照
|
||||
|
||||
if(column && column.params && column.params.dataType == "object" && column.params.textField && typeof(cellValue) == "object"){
|
||||
if(column && column.params
|
||||
&& column.params.dataType == "object"
|
||||
&& column.params.textField && typeof(cellValue) == "object"
|
||||
|
||||
){
|
||||
return cellValue[column.params.textField];
|
||||
}
|
||||
return cellValue && cellValue[1] ? cellValue[1] : ''
|
||||
|
|
|
|||
|
|
@ -3,7 +3,13 @@ export default {
|
|||
// 格式化表单数据
|
||||
formatFormData: function ({ data, rules }) { // 格式化表单数据
|
||||
|
||||
|
||||
let feachRules = (rules)=>{
|
||||
|
||||
rules.forEach(rule => { // 循环规则
|
||||
if(rule.children && rule.children.length){
|
||||
feachRules(rule.children);
|
||||
}
|
||||
if (!rule.dataRule){
|
||||
return;
|
||||
}
|
||||
|
|
@ -41,6 +47,9 @@ export default {
|
|||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
feachRules(rules);
|
||||
|
||||
|
||||
},
|
||||
|
||||
|
|
|
|||
|
|
@ -1,15 +1,8 @@
|
|||
<template>
|
||||
<admin-layout>
|
||||
<contextmenu :itemList="menuItemList" :visible.sync="menuVisible" @select="onMenuSelect" />
|
||||
<tabs-head
|
||||
v-if="multiPage"
|
||||
:active="activePage"
|
||||
:page-list="pageList"
|
||||
@change="changePage"
|
||||
@close="remove"
|
||||
@refresh="refresh"
|
||||
@contextmenu="onContextmenu"
|
||||
/>
|
||||
<tabs-head v-if="multiPage" :active="activePage" :page-list="pageList" @change="changePage" @close="remove"
|
||||
@refresh="refresh" @contextmenu="onContextmenu" />
|
||||
<div :class="['tabs-view-content', layout, pageWidth]" :style="`margin-top: ${multiPage ? -24 : 0}px`">
|
||||
<page-toggle-transition :disabled="animate.disabled" :animate="animate.name" :direction="animate.direction">
|
||||
<a-keep-alive :exclude-keys="excludeKeys" v-if="multiPage && cachePage" v-model="clearCaches">
|
||||
|
|
@ -121,10 +114,37 @@ export default {
|
|||
const page = this.pageList.find(item => item.path === key) // 获取页签
|
||||
this.$router.push(page.fullPath) // 跳转到页签的fullPath
|
||||
},
|
||||
remove (key, next) { // 移除页签
|
||||
|
||||
//找到定义了beforeTabClose方法 的页面组件
|
||||
findPageComponent(component , key ) {
|
||||
if(!key){
|
||||
return null;
|
||||
}
|
||||
let target = null;
|
||||
|
||||
let find = (children) => {
|
||||
children.forEach(item => {
|
||||
if (item.beforeTabClose && item.pageKeys && item.pageKeys.filter(a=> key.indexOf(a) == 0).length) {
|
||||
target = item;
|
||||
return;
|
||||
}
|
||||
if (item.$children && item.$children.length) {
|
||||
find(item.$children)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
find(component.$children);
|
||||
|
||||
|
||||
return target;
|
||||
},
|
||||
|
||||
remove(key, next,noCheck) { // 移除页签
|
||||
if (this.pageList.length === 1) { // 如果页签列表长度为1 只有一个页签
|
||||
return this.$message.warning(this.$t('warn')) // 提示警告 不能关闭最后一个页签
|
||||
}
|
||||
let doRemove = () => {
|
||||
//清除缓存
|
||||
let index = this.pageList.findIndex(item => item.path === key) // 获取页签索引
|
||||
this.clearCaches = this.pageList.splice(index, 1).map(page => page.cachedKey) // 清除缓存为页签的cachedKey
|
||||
|
|
@ -135,6 +155,24 @@ export default {
|
|||
this.activePage = this.pageList[index].path // 激活页签为页签列表索引的path
|
||||
this.$router.push(this.activePage) // 跳转到激活页签
|
||||
}
|
||||
};
|
||||
if(noCheck){
|
||||
doRemove();
|
||||
return;
|
||||
}
|
||||
let pageComponent = this.findPageComponent(this,key);
|
||||
|
||||
if (pageComponent) {
|
||||
|
||||
pageComponent.beforeTabClose().then(()=>{
|
||||
doRemove(); //通过了才调用关闭
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
doRemove();
|
||||
|
||||
|
||||
},
|
||||
refresh(key, page) { // 刷新页签
|
||||
page = page || this.pageList.find(item => item.path === key) // 获取页签
|
||||
|
|
@ -249,10 +287,14 @@ export default {
|
|||
*/
|
||||
closePageListener(event) { // 页签关闭事件监听 event为页签关闭事件
|
||||
const { closeRoute, nextRoute } = event.detail // 页签关闭路由为页签关闭事件的detail的closeRoute,下一个路由为页签关闭事件的detail的nextRoute
|
||||
const closePath = typeof closeRoute === 'string' ? closeRoute : closeRoute.path
|
||||
const closePath = typeof closeRoute === 'string' ? closeRoute : (closeRoute.path || closeRoute.closeRoute)
|
||||
|
||||
|
||||
|
||||
// 页签关闭路径为页签关闭路由为字符串时为页签关闭路由,否则为页签关闭路由的path
|
||||
const path = closePath && closePath.split('?')[0] // 路径等于为页签关闭路径并且以?分割的第一个
|
||||
this.remove(path, nextRoute) // 移出页签
|
||||
|
||||
this.remove(path, nextRoute, true) // 移出页签
|
||||
},
|
||||
/**
|
||||
* 页面刷新事件监听
|
||||
|
|
@ -331,12 +373,15 @@ export default {
|
|||
<style scoped lang="less">
|
||||
.tabs-view {
|
||||
margin: -16px auto 8px;
|
||||
|
||||
&.head.fixed {
|
||||
max-width: 1400px;
|
||||
}
|
||||
}
|
||||
|
||||
.tabs-view-content {
|
||||
position: relative;
|
||||
|
||||
&.head.fixed {
|
||||
width: 1400px;
|
||||
margin: 0 auto;
|
||||
|
|
|
|||
|
|
@ -87,7 +87,6 @@ export default {
|
|||
{ title: '操作', slots: { default: 'op' }, width: 120 },
|
||||
|
||||
{ field: 'code', sortable: true, title: '编码', width: 250 }, // 编码
|
||||
// { field: 'title', sortable: true, title: '部门名称', width: 250 }, // 部门名称
|
||||
{ field: 'name', sortable: true, title: '部门名称', width: 250 }, // 部门英文名称
|
||||
{ field: 'create_time', formatter: 'formatDate', width: 160, sortable: true, title: '创建时间', showHeaderOverflow: true }, // 创建时间
|
||||
{ field: 'update_time', formatter: 'formatDate', width: 160, sortable: true, title: '更新时间', showHeaderOverflow: true }, // 更新时间
|
||||
|
|
|
|||
|
|
@ -57,14 +57,29 @@ export default {
|
|||
},
|
||||
// 搜索区配置
|
||||
searchRules: [
|
||||
{ key: "title", mode: "like" },
|
||||
{ key: "desc", mode: "like" }
|
||||
{ key: "title", mode: "equal" },
|
||||
{ key: "version", mode: "like" }
|
||||
],
|
||||
//搜索区
|
||||
searchFormItems: [ // 子项
|
||||
{ field: 'title', title: '标题', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入标题' } } },
|
||||
{ field: 'desc', title: '描述', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入描述' } } },
|
||||
{ span: 8, slots: { default: 'date' } }, // 自定义列
|
||||
|
||||
{
|
||||
title: '父件', span: 6,
|
||||
field: 'material_id',
|
||||
itemRender: {
|
||||
name: 'MkFormDataSelector', props: {
|
||||
params: {
|
||||
dataType: "object",
|
||||
valueField: "id",
|
||||
textField: "name",
|
||||
listdataFieldName: 'MesMaterials',
|
||||
dataUrl: `${BASE_URL.BASE_URL}/MesMaterials/v1/mes/materials/list`
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{ field: 'version', title: '版本号', span: 6, itemRender: { name: '$input', props: { placeholder: '请输入版本号' } } },
|
||||
|
||||
{
|
||||
align: 'right', span: 4, itemRender: { // 按钮列
|
||||
name: '$buttons', children: [{ props: { type: 'submit', content: '搜索', status: 'primary' } }, // 搜索按钮
|
||||
|
|
@ -87,9 +102,9 @@ export default {
|
|||
|
||||
{ title: '操作', slots: { default: 'op' }, width: 120 },
|
||||
|
||||
// =============================== 表格列 自动生成 Start ===============================
|
||||
{ field: 'mes_materials', formatter: 'formatRef', params: { dataType: "object", textField: "name" }, title: '父件', width: 250 },
|
||||
|
||||
{ field: 'version', sortable: true, title: 'BOM版本', width: 250 }, // BOM姓名
|
||||
{ field: 'version', sortable: true, title: 'BOM版本', width: 250 },
|
||||
|
||||
{ field: 'create_time', formatter: 'formatDate', width: 160, sortable: true, title: '创建时间', showHeaderOverflow: true }, // 创建时间
|
||||
{ field: 'update_time', formatter: 'formatDate', width: 160, sortable: true, title: '更新时间', showHeaderOverflow: true }, // 更新时间
|
||||
|
|
|
|||
|
|
@ -349,10 +349,16 @@ export default {
|
|||
|
||||
let save = () => {
|
||||
|
||||
|
||||
|
||||
if (!this.selectedKey || this.selectedKey == "root") {
|
||||
this.$mk.error("请先选择枚举分类");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
this.$refs.xTable.clearEdit();
|
||||
|
||||
let node = this.findTreeNode(this.selectedKey);
|
||||
|
||||
let ds = JSON.parse(JSON.stringify(this.detailsData));
|
||||
|
|
|
|||
|
|
@ -2,9 +2,8 @@
|
|||
<div class="page-body">
|
||||
|
||||
|
||||
<a-row type="flex">
|
||||
<a-col flex="200px">
|
||||
|
||||
<div class="wrapper">
|
||||
<div class="left">
|
||||
<div class="treepanel" :style="'height:' + tableHeight + 'px'">
|
||||
<div class="treepanel-header">
|
||||
<a @click.stop="treeAdd(row)" title="新增">
|
||||
|
|
@ -24,15 +23,22 @@
|
|||
</a-tree>
|
||||
</div>
|
||||
</div>
|
||||
</a-col>
|
||||
<a-col flex="auto">
|
||||
|
||||
</div>
|
||||
<div class="right">
|
||||
|
||||
<basic-page-list ref="listPage" :options="pageOptions"></basic-page-list>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</a-col>
|
||||
</a-row>
|
||||
|
||||
|
||||
|
||||
|
|
@ -505,9 +511,23 @@ export default {
|
|||
padding: 8px;
|
||||
}
|
||||
|
||||
/* 左侧固定宽度 200px,右侧自适应 */
|
||||
.wrapper {
|
||||
display: flex;
|
||||
}
|
||||
.left {
|
||||
width: 200px;
|
||||
height: 100%;
|
||||
}
|
||||
.right {
|
||||
flex-grow: 1;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.treepanel {
|
||||
width: calc(100% - 10px);
|
||||
|
||||
background: white;
|
||||
margin-right: 10px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
<template>
|
||||
<basic-page-edit :desc="desc" :dataId="getDataId()" :options="pageOptions"></basic-page-edit>
|
||||
<basic-page-edit :desc="desc" :dataId="getDataId()" ref="editpage" @afterSave="afterSave"
|
||||
:options="pageOptions"></basic-page-edit>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
|
@ -23,7 +24,11 @@ export default {
|
|||
data() {
|
||||
|
||||
return {
|
||||
pageOptions: {}
|
||||
|
||||
pageKeys: ['/MesProcesses/MesProcessesUpdate/', '/MesProcesses/MesProcessesAdd'],
|
||||
preventTabClose: true,
|
||||
pageOptions: {},
|
||||
lastFormDataJson: ""
|
||||
};
|
||||
},
|
||||
|
||||
|
|
@ -39,6 +44,10 @@ export default {
|
|||
this.optionsInit();
|
||||
this.dataInit();
|
||||
|
||||
setTimeout(() => {
|
||||
console.log(this)
|
||||
}, 1000);
|
||||
|
||||
},
|
||||
// 函数
|
||||
methods: {
|
||||
|
|
@ -53,6 +62,9 @@ export default {
|
|||
// 当前项目ID
|
||||
currentBeid: 0,
|
||||
|
||||
//保存后提示
|
||||
action_afterSave: "confirm",
|
||||
|
||||
addPageUrl: "/MesProcesses/MesProcessesAdd",
|
||||
editPageUrl: "/MesProcesses/MesProcessesUpdate/",
|
||||
listPageUrl: "/MesProcesses/MesProcessesList",
|
||||
|
|
@ -118,7 +130,7 @@ export default {
|
|||
is_quality_inspection: 0,
|
||||
quality_inspection_scheme_id: 0,
|
||||
raw_material_type_id: 0,
|
||||
status: 0,
|
||||
status: 1,
|
||||
create_uid: 0,
|
||||
update_uid: 0,
|
||||
create_time: new Date(2100, 1, 1).getTime() / 10000,
|
||||
|
|
@ -198,7 +210,7 @@ export default {
|
|||
}
|
||||
|
||||
this.pageOptions.formOptions.data = a.data[detailDataFieldName];
|
||||
|
||||
this.lastFormDataJson = JSON.stringify(this.pageOptions.formOptions.data);
|
||||
this.$forceUpdate()
|
||||
}).catch((a) => {
|
||||
this.$mk.error(a.data.msg);
|
||||
|
|
@ -213,6 +225,8 @@ export default {
|
|||
this.pageOptions.formOptions.items.push(item);
|
||||
})
|
||||
|
||||
this.lastFormDataJson = JSON.stringify(this.pageOptions.formOptions.data);
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
|
|
@ -226,7 +240,48 @@ export default {
|
|||
dataId = 0;
|
||||
}
|
||||
return dataId;
|
||||
},
|
||||
|
||||
afterSave({ data }) {
|
||||
|
||||
this.lastFormDataJson = JSON.stringify(data);
|
||||
},
|
||||
isDataChanged() {
|
||||
|
||||
return this.lastFormDataJson != JSON.stringify(this.pageOptions.formOptions.data);
|
||||
},
|
||||
beforeTabClose() {
|
||||
|
||||
let _this = this;
|
||||
return new Promise((resolve) => {
|
||||
|
||||
if (_this.isDataChanged()) {
|
||||
_this.$confirm({
|
||||
title: '提示',
|
||||
content: '当前内容未保存,是否保存',
|
||||
okText: '保存',
|
||||
cancelText: '取消',
|
||||
onOk() {
|
||||
_this.$refs.editpage.save({
|
||||
afterSave: () => {
|
||||
|
||||
resolve();
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
onCancel() {
|
||||
resolve();
|
||||
},
|
||||
});
|
||||
} else {
|
||||
resolve();
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
},
|
||||
// 监听属性
|
||||
watch: {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
<template>
|
||||
<basic-page-list :desc="desc" :options="pageOptions"></basic-page-list>
|
||||
<basic-page-list :desc="desc" @importData="pageImport" :options="pageOptions"></basic-page-list>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
|
@ -33,6 +33,44 @@ export default {
|
|||
// 动作
|
||||
methods: {
|
||||
|
||||
pageImport({ data }) {
|
||||
let rows = [];
|
||||
data.forEach(item => {
|
||||
let row = {};
|
||||
this.pageOptions.exportColumns.forEach(col => {
|
||||
|
||||
if (col.title in item) {
|
||||
let v = item[col.title];
|
||||
if(col.options){
|
||||
col.options.forEach(op=>{
|
||||
if(op.label == v){
|
||||
row[col.field] = op.value;
|
||||
}
|
||||
})
|
||||
}else{
|
||||
row[col.field] = v;
|
||||
}
|
||||
}
|
||||
})
|
||||
rows.push(row);
|
||||
});
|
||||
|
||||
this.$mk.post({
|
||||
url: `${BASE_URL.BASE_URL}/MesProcesses/v1/mes/processes/batchCreate`,
|
||||
loading: "导入中...",
|
||||
data: {
|
||||
"list": rows
|
||||
},
|
||||
useBigInt: true
|
||||
}).then((a) => { // 成功
|
||||
|
||||
this.$mk.success(a.data.msg || "导入成功"); // 提示成功
|
||||
this.$refs.xGrid.commitProxy('query') // 提交搜索
|
||||
|
||||
}).catch((a) => { // 失败
|
||||
this.$mk.error(a.data.msg); // 提示错误信息
|
||||
});
|
||||
},
|
||||
optionsInit() {
|
||||
// 页面数据
|
||||
var pageData = { // 页面数据变量
|
||||
|
|
@ -40,6 +78,16 @@ export default {
|
|||
keyName: 'id', // 主键字段名
|
||||
listFieldName: 'MesProcesses',
|
||||
|
||||
exportFileTitle :"工序",
|
||||
enabledExport: true,
|
||||
enabledImport: true,
|
||||
enabledImportTemplate: true,
|
||||
exportColumns: [
|
||||
{ title: '编码',field:"code" },
|
||||
{ title: '工序名称',field:"name" },
|
||||
{ title: '工序描述',field:"desc" },
|
||||
{ title: '计工方式',field:"work_type",options:settings.options_work_type }
|
||||
],
|
||||
addPageUrl: "/MesProcesses/MesProcessesAdd",
|
||||
editPageUrl: "/MesProcesses/MesProcessesUpdate/",
|
||||
|
||||
|
|
@ -93,13 +141,13 @@ export default {
|
|||
},
|
||||
// 搜索区配置
|
||||
searchRules: [
|
||||
{ key: "title", mode: "like" },
|
||||
{ key: "desc", mode: "like" }
|
||||
{ key: "name", mode: "like" },
|
||||
{ key: "code", mode: "like" }
|
||||
],
|
||||
//搜索区
|
||||
searchFormItems: [ // 子项
|
||||
{ field: 'title', title: '标题', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入标题' } } },
|
||||
{ field: 'desc', title: '描述', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入描述' } } },
|
||||
{ field: 'name', title: '工序名称', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入工序名称' } } },
|
||||
{ field: 'code', title: '编码', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入编码' } } },
|
||||
{ span: 8, slots: { default: 'date' } }, // 自定义列
|
||||
{
|
||||
align: 'right', span: 4, itemRender: { // 按钮列
|
||||
|
|
|
|||
|
|
@ -45,6 +45,13 @@ export default {
|
|||
|
||||
|
||||
optionsInit() {
|
||||
|
||||
|
||||
let date = new Date();
|
||||
let year = date.getFullYear();
|
||||
let month = (date.getMonth() + 1).toString().padStart(2, '0');
|
||||
let day = date.getDate().toString().padStart(2, '0');
|
||||
let dateString = `${year}-${month}-${day}`;
|
||||
// 页面数据变量
|
||||
var pageData = {
|
||||
// 当前项目名称
|
||||
|
|
@ -130,11 +137,11 @@ export default {
|
|||
department_id: 0,
|
||||
process_id: 0,
|
||||
process_scheme_id: 0,
|
||||
entry_date: new Date(2100, 1, 1).getTime() / 10000,
|
||||
departure_date: new Date(2100, 1, 1).getTime() / 10000,
|
||||
entry_date: dateString,
|
||||
departure_date: "",
|
||||
is_piecework: 0,
|
||||
remark: "",
|
||||
status: 0,
|
||||
status: 1,
|
||||
create_uid: 0,
|
||||
update_uid: 0,
|
||||
create_time: new Date(2100, 1, 1).getTime() / 10000,
|
||||
|
|
@ -167,6 +174,26 @@ export default {
|
|||
children: [
|
||||
{ field: 'name', title: '员工姓名', span: 12, itemRender: { name: '$input' } },
|
||||
{ field: 'code', title: '员工工号', span: 12, itemRender: { name: '$input' } },
|
||||
|
||||
{
|
||||
title: '部门', span: 12,
|
||||
field: 'base_department',
|
||||
dataRule: {
|
||||
fromField: "id",
|
||||
saveField: "department_id" // 如果表单项存储的是对象,将从fromField中取得值保存到saveField
|
||||
},
|
||||
itemRender: {
|
||||
name: 'MkFormDataSelector', props: {
|
||||
params: {
|
||||
dataType: "object",
|
||||
valueField: "id",
|
||||
textField: "name",
|
||||
listdataFieldName: 'BaseDepartment',
|
||||
dataUrl: `${BASE_URL.BASE_URL}/BaseDepartment/v1/base/department/list`
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{ field: 'phone', title: '员工电话', span: 12, itemRender: { name: '$input' } },
|
||||
{ field: 'email', title: '员工邮箱', span: 12, itemRender: { name: '$input' } },
|
||||
//{ field: 'password', title: '员工密码', span: 12, itemRender: { name: '$input' } },
|
||||
|
|
@ -233,16 +260,16 @@ export default {
|
|||
|
||||
let detailDataFieldName = this.pageOptions.detailDataFieldName;
|
||||
|
||||
if (a.data[detailDataFieldName].entry_date) {
|
||||
if (a.data[detailDataFieldName].entry_date > 0) {
|
||||
a.data[detailDataFieldName].entry_date = new Date(a.data[detailDataFieldName].entry_date * 1000);
|
||||
}
|
||||
if (a.data[detailDataFieldName].departure_date) {
|
||||
if (a.data[detailDataFieldName].departure_date > 0) {
|
||||
a.data[detailDataFieldName].departure_date = new Date(a.data[detailDataFieldName].departure_date * 1000);
|
||||
}
|
||||
if (a.data[detailDataFieldName].create_time) {
|
||||
if (a.data[detailDataFieldName].create_time > 0) {
|
||||
a.data[detailDataFieldName].create_time = new Date(a.data[detailDataFieldName].create_time * 1000);
|
||||
}
|
||||
if (a.data[detailDataFieldName].update_time) {
|
||||
if (a.data[detailDataFieldName].update_time > 0) {
|
||||
a.data[detailDataFieldName].update_time = new Date(a.data[detailDataFieldName].update_time * 1000);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -109,6 +109,8 @@ export default {
|
|||
searchFormItems: [ // 子项
|
||||
{ field: 'title', title: '标题', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入标题' } } },
|
||||
{ field: 'desc', title: '描述', span: 5, itemRender: { name: '$input', props: { placeholder: '请输入描述' } } },
|
||||
|
||||
|
||||
{ span: 8, slots: { default: 'date' } }, // 自定义列
|
||||
{
|
||||
align: 'right', span: 4, itemRender: { // 按钮列
|
||||
|
|
@ -136,6 +138,7 @@ export default {
|
|||
|
||||
{ field: 'name', sortable: true, title: '员工姓名', width: 250 }, // 员工姓名
|
||||
{ field: 'code', sortable: true, title: '员工工号', width: 250 }, // 员工工号
|
||||
{ field: 'base_department', formatter: 'formatRef', params: { dataType: "object", textField: "name" }, title: '部门', width: 250 },
|
||||
{ field: 'phone', sortable: true, title: '员工电话', width: 250 }, // 员工电话
|
||||
{ field: 'email', sortable: true, title: '员工邮箱', width: 250 }, // 员工邮箱
|
||||
//{ field: 'password', sortable: true, title: '员工密码', width: 250 }, // 员工密码
|
||||
|
|
|
|||
|
|
@ -4883,6 +4883,11 @@
|
|||
"loader-utils" "^1.0.2"
|
||||
"schema-utils" "^1.0.0"
|
||||
|
||||
"file-saver@^2.0.5":
|
||||
"integrity" "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
|
||||
"resolved" "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz"
|
||||
"version" "2.0.5"
|
||||
|
||||
"file-uri-to-path@2":
|
||||
"integrity" "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg=="
|
||||
"resolved" "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz"
|
||||
|
|
|
|||
Loading…
Reference in New Issue