优化列表的展示

This commit is contained in:
龙运模 2024-09-05 18:36:09 +08:00
commit 284177f33e
56 changed files with 7500 additions and 5398 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -11,6 +11,13 @@ export default {
return await http.post(this.url, params); return await http.post(this.url, params);
}, },
}, },
emailDelete:{
url: `${config.API_URL}/mail.sync.delete`,
name: "邮件同步记录删除",
post: async function (params) {
return await http.post(this.url, params);
},
},
info:{ info:{
url: `${config.API_URL}/mail.sync.body.info`, url: `${config.API_URL}/mail.sync.body.info`,
name: "邮件正文", name: "邮件正文",
@ -83,6 +90,13 @@ export default {
return await http.post(this.url, params); return await http.post(this.url, params);
}, },
}, },
field:{
url: `${config.API_URL}/`,
name: "维修工单检索",
post: async function (params) {
return await http.post(this.url,params);
}
}
}, },
maintenance:{ maintenance:{
list:{ list:{
@ -168,6 +182,36 @@ export default {
post: async function (params) { post: async function (params) {
return await http.post(this.url,params); return await http.post(this.url,params);
} }
},
status:{
url: `${config.API_URL}/maintenance.order.business.status.list`,
name: "维保工单业务状态",
post: async function (params) {
return await http.post(this.url,params);
}
},
optionList:{
url: `${config.API_URL}/maintenance.repair.options.const.list`,
name: "维保工单常量下拉",
post: async function (params) {
return await http.post(this.url,params);
}
},
},
plan:{
list:{
url: `${config.API_URL}/maintenance.plan.list`,
name: "维保计划列表",
get: async function (params) {
return await http.post(this.url, params);
},
},
field:{
url: `${config.API_URL}/`,
name: "维保计划检索",
post: async function (params) {
return await http.post(this.url,params);
}
} }
}, },
sock: { sock: {
@ -177,6 +221,13 @@ export default {
get: async function (params) { get: async function (params) {
return await http.post(this.url, params); return await http.post(this.url, params);
}, },
},
field:{
url: `${config.API_URL}/inventory.field.list`,
name: "库存列表检索",
post: async function (params) {
return await http.post(this.url,params);
}
} }
}, },
out:{ out:{
@ -186,6 +237,13 @@ export default {
get: async function (params) { get: async function (params) {
return await http.post(this.url, params); return await http.post(this.url, params);
}, },
},
field:{
url: `${config.API_URL}/out.stock.field.list`,
name: "销售出库清单检索",
post: async function (params) {
return await http.post(this.url,params);
}
} }
} }
} }

View File

@ -6,16 +6,168 @@ export default {
add: { add: {
url: `${config.API_URL}/machine.room.add`, url: `${config.API_URL}/machine.room.add`,
name: "新增机房配置", name: "新增机房配置",
post: async function (data = {}) { post: async function (data) {
return await http.post(this.url, data); return await http.post(this.url, data);
}, },
}, },
list: { list: {
url: `${config.API_URL}/machine.room.list`, url: `${config.API_URL}/machine.room.list`,
name: "机房配置列表", name: "机房配置列表",
get: async function (data = {}) { get: async function (data) {
return await http.post(this.url, data); return await http.post(this.url, data);
}, },
}, },
},
mail:{
set:{
url: `${config.API_URL}/mail.config.set`,
name: "源邮件配置",
post: async function (data) {
return await http.post(this.url, data);
},
},
get:{
url: `${config.API_URL}/mail.config.get`,
name: "源邮件获取",
post: async function (data) {
return await http.post(this.url, data);
},
}
},
k3:{
set:{
url: `${config.API_URL}/k3.api.config.set`,
name: "金蝶ERP接口配置",
post: async function (data) {
return await http.post(this.url, data);
},
},
get:{
url: `${config.API_URL}/k3.api.config.get`,
name: "金蝶ERP接口配置获取",
post: async function (data) {
return await http.post(this.url, data);
},
}
},
cost:{
list:{
url: `${config.API_URL}/cost.config.const.list`,
name: "费用类别常量列表",
post: async function (data) {
return await http.post(this.url, data);
},
},
set:{
url: `${config.API_URL}/cost.category.add`,
name: "新增费用类别配置",
post: async function (data) {
return await http.post(this.url, data);
},
},
get:{
url: `${config.API_URL}/cost.category.list`,
name: "费用类别配置",
post: async function (data) {
return await http.post(this.url, data);
},
}
},
material:{
list:{
url: `${config.API_URL}/material.cost.list`,
name: "物料成本列表",
get: async function (data) {
return await http.post(this.url, data);
},
},
add:{
url: `${config.API_URL}/material.cost.add`,
name: "物料成本添加",
post: async function (data) {
return await http.post(this.url, data);
},
},
template:{
url: `${config.API_URL}/material.cost.import.template`,
name: "物料成本导入模版",
post: async function (params) {
return await http.get(this.url,params,{responseType: 'arraybuffer'});
}
},
import:{
url: `${config.API_URL}/material.cost.batch.import`,
name: "物料成本导入",
post: async function (params) {
return await http.post(this.url,params,{'Content-Type': 'multipart/form-data'});
}
},
},
crontab:{
configList:{
url: `${config.API_URL}/crontab.config.list`,
name: "定时系统配置列表",
get: async function (data) {
return await http.post(this.url, data);
},
},
list:{
url: `${config.API_URL}/crontab.list`,
name: "定时任务列表",
get: async function (data) {
return await http.post(this.url, data);
},
},
add:{
url: `${config.API_URL}/crontab.add`,
name: "添加配置",
post: async function (data) {
return await http.post(this.url, data);
},
},
status:{
url: `${config.API_URL}/crontab.status`,
name: "定时任务状态",
post: async function (data) {
return await http.post(this.url, data);
},
},
delete:{
url: `${config.API_URL}/crontab.delete`,
name: "删除配置",
post: async function (data) {
return await http.post(this.url, data);
},
},
describe:{
url: `${config.API_URL}/crontab.describe`,
name: "定时任务表达式转换",
post: async function (data) {
return await http.post(this.url, data);
},
}
},
bom:{
list:{
url: `${config.API_URL}/bom.list`,
name: "bom列表",
get: async function (data) {
return await http.post(this.url, data);
},
},
info:{
url: `${config.API_URL}/bom.detail`,
name: "bom详情",
post: async function (data) {
return await http.post(this.url, data);
},
},
refresh:{
url: `${config.API_URL}/bom.refresh`,
name: "重新拉取bom",
post: async function (data) {
return await http.post(this.url, data);
},
}
} }
}; };

View File

@ -113,6 +113,20 @@ export default {
return await http.post(this.url, params); return await http.post(this.url, params);
} }
}, },
dataMenu:{
url: `${config.API_URL}/auth.data.permission.checked`,
name: "数据权限",
post: async function (params) {
return await http.post(this.url, params);
}
},
dataAuth:{
url: `${config.API_URL}/auth.data.permission.add`,
name: "数据授权",
post: async function (params) {
return await http.post(this.url, params);
}
},
roleCode: { roleCode: {
url: `${config.API_URL}/authorize.role.codes`, url: `${config.API_URL}/authorize.role.codes`,
name: "角色对应CODE列表", name: "角色对应CODE列表",
@ -482,5 +496,5 @@ export default {
} }
} }
}, },
}; };

View File

@ -0,0 +1,13 @@
<template>
<svg t="1725178306887" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4680" width="200" height="200"><path d="M114.232889 1024a38.912 38.912 0 0 1-38.684445-38.741333V199.054222a38.968889 38.968889 0 0 1 38.684445-38.798222h103.992889v-21.276444a23.495111 23.495111 0 0 1 23.779555-22.471112H364.657778c6.257778-27.136 20.138667-51.939556 40.106666-71.338666a149.447111 149.447111 0 0 1 214.072889 0c19.911111 19.456 33.735111 44.202667 39.936 71.338666h123.904a22.471111 22.471111 0 0 1 22.641778 22.471112v21.276444h105.073778a37.205333 37.205333 0 0 1 37.603555 38.798222v786.204445a38.115556 38.115556 0 0 1-37.603555 38.684444L114.232889 1024z m37.603555-78.791111h721.066667V236.600889h-67.584v21.390222a22.528 22.528 0 0 1-22.584889 22.471111H242.005333a22.755556 22.755556 0 0 1-23.779555-22.471111v-21.390222H151.893333v708.608zM277.105778 223.971556h470.584889v-49.948445H277.105778v49.948445z m172.657778-135.054223c-11.264 11.264-7.566222 12.515556-13.653334 27.591111h151.324445c-4.949333-15.075556-2.446222-17.578667-12.515556-27.591111a77.027556 77.027556 0 0 0-62.577778-31.288889 80.611556 80.611556 0 0 0-62.577777 31.288889z m-31.687112 677.546667l-141.482666-141.482667a42.097778 42.097778 0 0 1 29.866666-72.021333c11.207111 0 21.959111 4.437333 29.923556 12.344889l111.388444 111.445333 216.064-216.177778A42.325333 42.325333 0 0 1 723.626667 520.533333l-245.987556 245.987556a42.097778 42.097778 0 0 1-59.676444 0z" p-id="4681"></path></svg>
</template>
<script>
export default {
name: "ConfirmOrder"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1725001028284" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4537" width="200" height="200"><path d="M844.17422199 56.888889A130.048 130.048 0 0 1 974.22222199 186.936889v650.126222l-0.056889 1.649778L974.22222199 512h-65.024V186.936889a64.967111 64.967111 0 0 0-65.024-65.024H194.04799999A65.024 65.024 0 0 0 129.42222199 179.313778l-0.455111 7.623111v650.126222a65.024 65.024 0 0 0 57.400889 64.568889l7.623111 0.455111h325.006222L519.11111099 967.111111H194.04799999A130.048 130.048 0 0 1 63.99999999 837.063111V186.936889A130.048 130.048 0 0 1 194.04799999 56.888889h650.126222z" p-id="4538"></path><path d="M777.72799999 577.024a278.755556 278.755556 0 0 1 39.594667 2.844444 14.961778 14.961778 0 0 1 11.150222 10.581334c4.721778 18.602667 17.123556 34.588444 34.417778 44.259555 10.695111 6.371556 23.04 9.728 35.612444 9.614223 7.111111 0 14.279111-1.080889 21.219556-2.958223a6.371556 6.371556 0 0 1 4.096-0.910222 10.126222 10.126222 0 0 1 10.183111 5.688889c8.305778 9.329778 15.758222 19.342222 22.300444 29.809778 6.428444 10.752 11.889778 22.016 16.213334 33.621333a14.904889 14.904889 0 0 1-4.096 14.449778c-14.165333 13.084444-22.186667 31.118222-22.300445 50.005333 0 19.057778 8.476444 37.148444 23.324445 49.891556a13.312 13.312 0 0 1 4.039111 14.449778 196.266667 196.266667 0 0 1-38.513778 63.374222l-4.039111 2.844444a19.512889 19.512889 0 0 1-7.168 1.991111l-3.982222-0.967111a77.368889 77.368889 0 0 0-56.888889 5.802667 64.113778 64.113778 0 0 0-33.393778 43.235555 12.743111 12.743111 0 0 1-11.207111 9.614223c-12.344889 1.934222-24.917333 2.844444-37.489778 2.844444a275.057778 275.057778 0 0 1-39.537778-3.925333 12.743111 12.743111 0 0 1-11.150222-9.557334 70.542222 70.542222 0 0 0-34.474667-44.202666 67.982222 67.982222 0 0 0-35.555555-9.557334c-7.168 0-14.336 0.967111-21.276445 2.844445a6.371556 6.371556 0 0 1-4.096 1.024 16.497778 16.497778 0 0 1-10.126222-4.835556 210.204444 210.204444 0 0 1-22.528-29.752889 207.416889 207.416889 0 0 1-16.213333-33.678222 15.473778 15.473778 0 0 1 4.096-14.392889c14.222222-13.084444 22.186667-31.118222 22.300444-50.005333 0-19.057778-8.476444-37.262222-23.324444-49.891556a13.312 13.312 0 0 1-4.096-14.449777 205.937778 205.937778 0 0 1 38.570666-63.374223 22.983111 22.983111 0 0 1 12.174223-4.835555c0.967111 0 3.072 0.967111 3.982222 0.967111 19.000889 5.404444 39.367111 3.356444 56.888889-5.802667a64.284444 64.284444 0 0 0 33.450666-43.235555 15.303111 15.303111 0 0 1 4.039112-6.712889c1.024-0.910222 1.024-1.934222 1.991111-1.934222a16.782222 16.782222 0 0 1 8.135111-2.844445c11.207111-0.967111 22.300444-1.934222 33.507555-1.934222h0.170667z m0.682667 65.024c-6.599111 0.056889-13.084444 0.796444-19.512889 2.218667a74.581333 74.581333 0 0 1-35.100445 40.277333 89.713778 89.713778 0 0 1-39.367111 9.671111 117.76 117.76 0 0 1-16.042666-1.536 128.796444 128.796444 0 0 0-19.228445 31.288889c12.856889 13.312 19.911111 30.549333 20.081778 48.469333a70.371556 70.371556 0 0 1-20.081778 48.469334c2.446222 5.688889 5.404444 11.093333 8.817778 16.384 3.413333 5.12 7.168 10.069333 11.207111 14.961777a112.071111 112.071111 0 0 1 16.042667-1.592888c13.824-0.113778 27.420444 3.242667 39.310222 9.784888 16.668444 8.817778 29.297778 23.096889 35.384889 40.163556 6.656 0.853333 13.312 1.365333 20.024889 1.479111 6.485333-0.113778 12.856889-0.625778 19.342222-1.479111 6.087111-17.066667 18.659556-31.345778 35.271111-40.277333 12.231111-6.144 25.656889-9.443556 39.367111-9.671111 5.347556 0.113778 10.695111 0.682667 16.042667 1.479111 8.078222-9.386667 14.563556-19.911111 19.228444-31.288889a68.721778 68.721778 0 0 1-20.081778-48.355556c0.113778-17.976889 7.224889-35.214222 20.081778-48.469333a163.384889 163.384889 0 0 0-8.817778-16.384 113.777778 113.777778 0 0 0-11.264-15.701333 130.844444 130.844444 0 0 1-16.042666 1.536 80.554667 80.554667 0 0 1-39.367111-9.784889 74.638222 74.638222 0 0 1-35.271111-40.163556 179.996444 179.996444 0 0 0-20.024889-1.479111z m0.739555 65.024a64.796444 64.796444 0 0 1 65.024 64.967111 65.024 65.024 0 1 1-65.024-64.967111z m0 32.483556a32.426667 32.426667 0 0 0-27.022222 50.574222 32.483556 32.483556 0 1 0 27.022222-50.574222zM490.95111099 276.878222a32.483556 32.483556 0 1 1 56.32 32.540445l-41.870222 72.533333h46.193778a32.483556 32.483556 0 0 1 0 65.024H454.08711099V512h97.507556a32.483556 32.483556 0 0 1 0 65.024H454.08711099v97.507556a32.483556 32.483556 0 0 1-65.024 0v-97.507556H291.55555599A32.540444 32.540444 0 0 1 291.55555599 512h97.507555V446.976H291.55555599a32.483556 32.483556 0 0 1 0-65.024h46.136888L295.93599999 309.475556a32.483556 32.483556 0 1 1 56.32-32.540445l60.643556 105.073778h17.351111l60.700444-105.073778z" p-id="4539"></path></svg>
</template>
<script>
export default {
name: "CostSetup"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1724942175957" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9740" width="200" height="200"><path d="M629.264 634.784H344.48h284.784l-64.216-64.208s-17.8-21.984 2.792-40.48c0 0 20.24-22.68 47.464 8.376l55.84 55.832 65.616-65.608s24.432-18.144 41.88 6.976c0 0 13.264 15.352-2.792 36.288l-64.216 62.816h210.8v-554.16L344.48 634.784h284.784H344.48l-242.912 231.712 777.592 1.392s36.992-7.328 43.28-43.272v-189.84h-210.8l65.616 65.608s16.752 21.288-2.792 40.48c0 0-17.104 17.096-37.696 0l-65.616-64.208-67.008 65.608s-21.64 16.752-39.088-4.184c0 0-15.008-13.96-2.792-33.504l67-69.792z" fill="#E01F19" p-id="9741"></path></svg>
</template>
<script>
export default {
name: "JbDelete"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1725000939626" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4823" width="200" height="200"><path d="M147.911111 222.833778h142.734222v42.325333c0 30.492444 24.746667 55.296 55.182223 55.296H469.902222a55.296 55.296 0 0 0 55.296-55.296v-42.325333H989.866667a34.133333 34.133333 0 1 0 0-68.266667H525.084444V112.071111A55.239111 55.239111 0 0 0 469.902222 56.888889H345.884444a55.296 55.296 0 0 0-55.239111 55.182222v42.496H147.911111a34.133333 34.133333 0 1 0 0 68.266667zM358.912 125.155556H456.817778v127.032888H358.912V125.155556z m630.897778 335.530666h-142.677334v-42.382222a55.352889 55.352889 0 0 0-55.296-55.296h-124.017777a55.352889 55.352889 0 0 0-55.239111 55.296V460.8H147.911111a34.133333 34.133333 0 0 0 0 68.266667h464.668445v42.382222c0 30.435556 24.803556 55.239111 55.239111 55.239111h124.074666a55.352889 55.352889 0 0 0 55.239111-55.182222v-42.439111H989.866667a34.133333 34.133333 0 1 0 0-68.323556z m-210.944 97.678222H680.96V431.217778h97.962667v127.089778z m210.944 208.440889H525.141333v-42.382222a55.296 55.296 0 0 0-55.239111-55.239111H345.884444a55.352889 55.352889 0 0 0-55.239111 55.182222v42.439111H147.911111a34.133333 34.133333 0 1 0 0 68.266667h142.734222v42.439111c0 30.492444 24.746667 55.296 55.182223 55.296H469.902222a55.352889 55.352889 0 0 0 55.296-55.296v-42.439111H989.866667a34.133333 34.133333 0 1 0 0-68.266667z m-532.935111 97.678223H358.912v-127.032889H456.817778v127.032889z" p-id="4824"></path></svg>
</template>
<script>
export default {
name: "K3Api"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1725173617858" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4537" width="200" height="200"><path d="M258.56 76.8c-28.16 0-53.76 5.12-79.36 17.92-15.36 7.68-20.48 28.16-7.68 40.96l87.04 87.04-30.72 30.72-87.04-87.04a23.267556 23.267556 0 0 0-17.92-7.68c-10.24 0-17.92 5.12-23.04 15.36a180.053333 180.053333 0 0 0 33.28 207.36c35.84 35.84 79.36 51.2 125.44 51.2 20.48 0 40.96-2.56 58.88-10.24l284.16 284.16c-23.04 64-7.68 135.68 40.96 186.88 35.84 35.84 79.36 51.2 125.44 51.2 28.16 0 53.76-5.12 79.36-17.92 15.36-7.68 20.48-28.16 7.68-40.96l-87.04-87.04 30.72-30.72 87.04 87.04c5.12 5.12 10.24 7.68 17.92 7.68 10.24 0 17.92-5.12 23.04-15.36a180.053333 180.053333 0 0 0-33.28-207.36c-35.84-35.84-79.36-51.2-125.44-51.2-20.48 0-40.96 2.56-61.44 10.24L422.4 314.88c23.04-64 7.68-135.68-40.96-186.88a172.373333 172.373333 0 0 0-122.88-51.2zM225.28 307.2c12.8 0 25.6-5.12 35.84-15.36l30.72-30.72a49.493333 49.493333 0 0 0 0-71.68L232.96 130.56c7.68 0 15.36-2.56 23.04-2.56 33.28 0 66.56 12.8 89.6 38.4 35.84 35.84 46.08 87.04 30.72 133.12-7.68 17.92-2.56 38.4 12.8 53.76l284.16 284.16c10.24 10.24 23.04 15.36 35.84 15.36 5.12 0 12.8 0 17.92-2.56 12.8-5.12 28.16-7.68 43.52-7.68 33.28 0 66.56 12.8 89.6 38.4 30.72 30.72 43.52 71.68 35.84 112.64l-58.88-58.88a50.517333 50.517333 0 0 0-35.84-15.36c-12.8 0-25.6 5.12-35.84 15.36l-30.72 30.72a50.517333 50.517333 0 0 0-15.36 35.84c0 12.8 5.12 25.6 15.36 35.84l58.88 58.88c-7.68 0-15.36 2.56-23.04 2.56-33.28 0-66.56-12.8-89.6-38.4-35.84-35.84-46.08-87.04-30.72-133.12 7.68-17.92 2.56-38.4-12.8-53.76L353.28 389.12a50.517333 50.517333 0 0 0-35.84-15.36c-5.12 0-10.24 0-17.92 2.56-12.8 5.12-28.16 7.68-43.52 7.68-33.28 0-66.56-12.8-89.6-38.4-30.72-30.72-43.52-71.68-35.84-112.64L189.44 291.84c10.24 10.24 23.04 15.36 35.84 15.36z" p-id="4538"></path><path d="M337.92 563.2c-12.743111 0-25.6 5.12-35.84 15.36l-184.32 184.32a49.493333 49.493333 0 0 0 0 71.68l71.68 71.68c10.24 10.24 23.096889 15.36 35.84 15.36 12.856889 0 25.6-5.12 35.84-15.36l184.32-184.32a49.493333 49.493333 0 0 0 0-71.68l-71.68-71.68c-7.623111-10.24-20.48-15.36-35.84-15.36z m-110.023111 307.2l-71.68-71.68 184.32-184.32 71.68 71.68-184.32 184.32zM849.92 138.24l35.84 35.84-89.6 89.6-17.92-17.92-17.92-17.92L849.92 138.24z m0-61.44a23.267556 23.267556 0 0 0-17.92 7.68L706.56 209.92c-10.24 10.24-10.24 25.6 0 35.84l17.92 17.92L599.04 389.12c-10.24 10.24-10.24 25.6 0 35.84 5.12 5.12 12.8 7.68 17.92 7.68s12.8-2.56 17.92-7.68l125.44-125.44 17.92 17.92c5.12 5.12 12.8 7.68 17.92 7.68s12.8-2.56 17.92-7.68l125.44-125.44c10.24-10.24 10.24-25.6 0-35.84l-71.68-71.68c-2.56-5.12-10.24-7.68-17.92-7.68z" p-id="4539"></path></svg>
</template>
<script>
export default {
name: "MaintenanceSetup"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,13 @@
<template>
<svg t="1725259400280" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4567" width="200" height="200"><path d="M604.672 259.584L476.558222 387.584 348.387556 259.527111l-47.729778 47.729778 108.657778 108.657778H352.142222V483.555556h90.624v39.025777H352.142222v67.584h90.624v114.005334h67.584v-114.005334h90.624V522.581333H510.293333V483.555556h90.624V415.971556H543.744L652.515556 307.2l-47.786667-47.672889z" p-id="4568"></path><path d="M510.293333 842.524444a35.100444 35.100444 0 0 0-35.043555-31.630222h-0.398222A337.009778 337.009778 0 0 1 138.24 474.282667 337.009778 337.009778 0 0 1 474.851556 137.671111a337.123556 337.123556 0 0 1 328.590222 263.168 35.043556 35.043556 0 0 0 68.266666-15.473778 406.528 406.528 0 0 0-396.8-317.724444 405.731556 405.731556 0 0 0-287.516444 119.125333 405.731556 405.731556 0 0 0-119.068444 287.516445 405.617778 405.617778 0 0 0 119.125333 287.516444 405.731556 405.731556 0 0 0 287.459555 119.068445h0.796445c20.48 0 36.522667-17.806222 34.645333-38.286223z" p-id="4569"></path><path d="M947.882667 772.778667l-11.491556-20.024889a0.910222 0.910222 0 0 1 0-0.967111l11.491556-20.024889c9.329778-15.985778 10.808889-35.214222 4.096-52.508445a200.305778 200.305778 0 0 0-31.800889-55.011555 60.871111 60.871111 0 0 0-47.388445-22.584889h-22.983111a1.024 1.024 0 0 1-0.910222-0.512l-11.491556-19.968a60.871111 60.871111 0 0 0-43.292444-29.809778 204.288 204.288 0 0 0-63.431111 0c-18.261333 2.844444-34.133333 13.653333-43.235556 29.809778l-11.548444 19.968a1.080889 1.080889 0 0 1-0.910222 0.568889h-22.983111c-18.488889 0-35.84 8.135111-47.388445 22.528a200.192 200.192 0 0 0-31.857778 55.011555c-6.656 17.294222-5.12 36.408889 4.152889 52.508445l11.491556 20.024889a0.910222 0.910222 0 0 1 0 0.967111l-11.491556 20.024889c-9.329778 15.985778-10.808889 35.214222-4.096 52.508444 7.566222 19.911111 18.261333 38.4 31.800889 54.954667 11.605333 14.336 28.899556 22.641778 47.388445 22.641778h22.983111c0.398222 0 0.682667 0.170667 0.910222 0.455111l11.491555 20.024889c9.329778 15.985778 25.088 26.908444 43.292445 29.809777a197.233778 197.233778 0 0 0 63.374222 0c18.375111-2.901333 34.133333-13.710222 43.349333-29.809777l11.491556-20.024889a1.080889 1.080889 0 0 1 0.910222-0.455111h22.983111c18.488889 0 35.84-8.248889 47.388445-22.641778 13.539556-16.554667 24.234667-35.100444 31.857778-54.954667 6.542222-17.294222 5.063111-36.522667-4.152889-52.508444z m-51.882667 30.890666a142.791111 142.791111 0 0 1-22.414222 38.684445c-0.170667 0.227556-0.455111 0.398222-0.796445 0.398222h-22.983111c-21.731556 0-41.984 11.719111-52.792889 30.492444l-11.491555 20.024889c-0.227556 0.284444-0.398222 0.512-0.739556 0.512-14.677333 2.275556-30.094222 2.275556-44.771555 0-0.284444 0-0.512-0.227556-0.682667-0.568889l-11.548444-19.911111a61.212444 61.212444 0 0 0-52.792889-30.549333h-22.983111a0.910222 0.910222 0 0 1-0.796445-0.398222 142.677333 142.677333 0 0 1-22.414222-38.684445 0.967111 0.967111 0 0 1 0.113778-0.910222l11.491555-20.024889c10.922667-18.773333 10.922667-42.154667 0-60.984889l-11.491555-19.968a0.967111 0.967111 0 0 1-0.113778-0.910222c5.404444-13.994667 12.913778-27.022222 22.414222-38.684444 0.170667-0.227556 0.512-0.398222 0.796445-0.398223h22.983111c21.731556 0 42.040889-11.719111 52.792889-30.549333l11.548444-19.968c0.170667-0.284444 0.341333-0.512 0.682667-0.512 14.677333-2.275556 30.094222-2.275556 44.771555 0 0.341333 0 0.568889 0.227556 0.739556 0.512l11.491555 19.968c10.865778 18.773333 31.061333 30.549333 52.792889 30.549333h22.983111c0.284444 0 0.568889 0.056889 0.796445 0.398223 9.500444 11.662222 17.066667 24.689778 22.414222 38.684444a0.967111 0.967111 0 0 1-0.113778 0.910222l-11.491555 19.968c-10.865778 18.773333-10.865778 42.211556 0 60.984889l11.491555 20.024889c0.227556 0.284444 0.227556 0.568889 0.113778 0.910222z" p-id="4570"></path><path d="M703.772444 752.298667a58.481778 58.481778 0 1 0 117.020445 0 58.481778 58.481778 0 0 0-117.020445 0z" p-id="4571"></path></svg>
</template>
<script>
export default {
name: "MaterialSetup"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,17 @@
<template>
<svg t="1725431248829" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4597" width="200" height="200">
<path d="M448.284444 901.688889H186.823111a64.967111 64.967111 0 0 1-65.024-64.967111V186.88c0-35.896889 29.127111-65.024 65.024-65.024h584.817778c35.953778 0 65.024 29.127111 65.024 65.024v222.378667c23.381333 10.24 44.771556 23.779556 64.967111 39.025777V186.88A129.991111 129.991111 0 0 0 771.754667 56.888889H186.88A129.991111 129.991111 0 0 0 56.888889 186.88v649.841778a129.991111 129.991111 0 0 0 129.991111 129.991111h326.656A327.509333 327.509333 0 0 1 448.284444 901.688889z" p-id="4598"></path>
<path d="M721.806222 484.408889a245.304889 245.304889 0 1 0 0 490.666667 245.304889 245.304889 0 0 0 0-490.666667z m0 429.169778a183.921778 183.921778 0 1 1 0-367.786667 183.921778 183.921778 0 0 1 0 367.786667z" p-id="4599"></path>
<path d="M824.945778 707.413333h-69.688889v-34.872889a34.872889 34.872889 0 1 0-69.745778 0v69.688889c0 19.285333 15.644444 34.872889 34.872889 34.872889h104.561778a34.872889 34.872889 0 0 0 0-69.688889zM466.488889 218.396444a34.702222 34.702222 0 0 0-48.981333 0L301.340444 334.506667l-46.478222-46.478223a33.450667 33.450667 0 1 0-47.331555 47.331556l64.910222 64.853333c1.479111 2.56 2.616889 5.12 4.835555 7.281778a34.702222 34.702222 0 0 0 26.055112 9.898667 33.564444 33.564444 0 0 0 23.779555-9.841778c0.739556-0.739556 1.137778-1.706667 1.706667-2.616889L466.488889 267.320889a34.588444 34.588444 0 0 0 0-48.924445z m114.517333 59.676445a34.872889 34.872889 0 1 0 0 69.688889h209.066667a34.816 34.816 0 1 0 0-69.688889h-209.066667z m-163.498666 184.32l-116.167112 116.053333-46.478222-46.478222a33.450667 33.450667 0 0 0-47.331555 47.331556l64.910222 64.853333c1.479111 2.56 2.616889 5.12 4.835555 7.281778 7.224889 7.168 16.725333 10.24 26.055112 9.898666a33.450667 33.450667 0 0 0 23.779555-9.784889c0.739556-0.796444 1.137778-1.763556 1.706667-2.673777L466.488889 511.260444a34.702222 34.702222 0 0 0-48.981333-48.924444z" p-id="4600"></path>
</svg>
</template>
<script>
export default {
name: "RegularTime"
}
</script>
<style scoped>
</style>

View File

@ -26,6 +26,12 @@ export { default as Finish } from './Finish.vue'
export { default as FormXls } from './FormXls.vue' export { default as FormXls } from './FormXls.vue'
export { default as AgentMaintenance } from './AgentMaintenance.vue' export { default as AgentMaintenance } from './AgentMaintenance.vue'
export { default as CostAllocation } from './CostAllocation.vue' export { default as CostAllocation } from './CostAllocation.vue'
export { default as K3Api } from './K3Api.vue'
export { default as RegularTime } from './RegularTime.vue'
export { default as CostSetup } from './CostSetup.vue'
export { default as MaterialSetup } from './MaterialSetup.vue'
export { default as MaintenanceSetup } from './MaintenanceSetup.vue'
export { default as ConfirmOrder } from './ConfirmOrder.vue'
export { default as DataSource } from './DataSource.vue' export { default as DataSource } from './DataSource.vue'
export { default as MachineRoom } from './MachineRoom.vue' export { default as MachineRoom } from './MachineRoom.vue'
export { default as CreateFolder } from './CreateFolder.vue' export { default as CreateFolder } from './CreateFolder.vue'
@ -54,6 +60,7 @@ export { default as FileDwg } from './file/Dwg.vue'
export { default as FileTar } from './file/Tar.vue' export { default as FileTar } from './file/Tar.vue'
// 列表按钮 // 列表按钮
export { default as JbDelete } from './JbDelete.vue'
export { default as Delete } from './Delete.vue' export { default as Delete } from './Delete.vue'
export { default as Edit } from './Edit.vue' export { default as Edit } from './Edit.vue'
export { default as Review } from './Review.vue' export { default as Review } from './Review.vue'

View File

@ -65,7 +65,6 @@
</template> </template>
<script> <script>
// import {inject} from "vue";
import {eventBus} from "@/utils/eventBus" import {eventBus} from "@/utils/eventBus"
export default { export default {
@ -109,7 +108,7 @@ export default {
}, },
methods:{ methods:{
getWsResult(res){ getWsResult(res){
if(res.data && (res.data.type == 4 || res.data.type == 5 || res.data.type == 10)){ if(res.data && (res.data.type == 4 || res.data.type == 5 || res.data.type == 10 || res.data.type == 17)){
this.importInfo = res.data; this.importInfo = res.data;
this.progressShow = true; this.progressShow = true;
if(res.data.status == 0){ if(res.data.status == 0){
@ -188,7 +187,7 @@ export default {
.upload .el-icon--upload{ .upload .el-icon--upload{
width: 54px;height: 54px; width: 54px;height: 54px;
} }
.upload :deep(.el-upload__text){ .upload ::v-deep .el-upload__text{
.trueIcon{ .trueIcon{
position: relative; position: relative;
border: 1px solid var(--el-border-color); border: 1px solid var(--el-border-color);
@ -218,7 +217,7 @@ export default {
} }
} }
.upload :deep(.el-upload__tip){ .upload ::v-deep .el-upload__tip{
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -235,7 +234,7 @@ export default {
margin: 15px 0; margin: 15px 0;
border-radius: 4px; border-radius: 4px;
.name{margin-bottom: 8px;font-size: 13px;} .name{margin-bottom: 8px;font-size: 13px;}
.exportPopover :deep(.el-progress-bar__innerText){ .exportPopover ::v-deep .el-progress-bar__innerText{
height: 100%; height: 100%;
display: flex;align-items: center;justify-content: flex-end; display: flex;align-items: center;justify-content: flex-end;
font-size: 10px; font-size: 10px;

View File

@ -0,0 +1,16 @@
import { permissionAll } from '@/utils/permission'
import tool from '@/utils/tool';
/**
* 用户权限指令
* @directive 单个权限验证v-auth="xxx"
*/
export default {
mounted (el, binding) {
if(permissionAll()){
return
}
let permissions = tool.data.get("PERMISSIONS");
if (!permissions.auth.some((v) => v === binding.value)) el.parentNode.removeChild(el);
}
}

View File

@ -56,7 +56,7 @@
<div class="adminui-header-left"> <div class="adminui-header-left">
<div :class="menuIsCollapse?'logo-bar isCollapse':'logo-bar'"> <div :class="menuIsCollapse?'logo-bar isCollapse':'logo-bar'">
<span v-if="menuIsCollapse"> <span v-if="menuIsCollapse">
<img class="logo" src="https://dm-wh.oss-cn-shanghai.aliyuncs.com/wh/mobilePhoto/4d6e70dbcb2f27d00da51c5232dea6fb1c87ba63.jpg" alt=""> <img class="logo" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/logo.png" alt="">
</span> </span>
<img v-else class="logo" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/login_logo.png"> <img v-else class="logo" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/login_logo.png">
<!-- <span v-else>{{ $CONFIG.APP_NAME }}</span>--> <!-- <span v-else>{{ $CONFIG.APP_NAME }}</span>-->

View File

@ -16,6 +16,20 @@ const routes = [
title: "登录" title: "登录"
} }
}, },
{
path:"/bind_wechat",
component:()=>import(/* webpackChunkName: "bindWechat" */ '@/views/login/bindWechat'),
meta:{
title:'绑定微信'
}
},
{
path:"/bind_dingtalk",
component:()=>import(/* webpackChunkName: "bindDingTalk" */ '@/views/login/bindDingTalk'),
meta:{
title:'绑定钉钉'
}
},
{ {
path: "/user_register", path: "/user_register",
component: () => import(/* webpackChunkName: "userRegister" */ '@/views/login/userRegister'), component: () => import(/* webpackChunkName: "userRegister" */ '@/views/login/userRegister'),

View File

@ -33,6 +33,7 @@ import scImport from "./components/scImport";
import scStatusIndicator from './components/scMini/scStatusIndicator' import scStatusIndicator from './components/scMini/scStatusIndicator'
import scTrend from './components/scMini/scTrend' import scTrend from './components/scMini/scTrend'
import authSetup from './directives/authSetup'
import auth from './directives/auth' import auth from './directives/auth'
import auths from './directives/auths' import auths from './directives/auths'
import authsAll from './directives/authsAll' import authsAll from './directives/authsAll'
@ -86,6 +87,7 @@ export default {
app.component('scImport', scImport); app.component('scImport', scImport);
//注册全局指令 //注册全局指令
app.directive('authSetup', authSetup)
app.directive('auth', auth) app.directive('auth', auth)
app.directive('auths', auths) app.directive('auths', auths)
app.directive('auths-all', authsAll) app.directive('auths-all', authsAll)

View File

@ -30,6 +30,12 @@
--el-menu-item-height:50px; --el-menu-item-height:50px;
--el-component-size-small:28px; --el-component-size-small:28px;
--el-order-color-1:#E8641B;
--el-order-color-2:#3072FF;
--el-order-color-3:#0DA525;
--el-order-color-4:#FFB103;
--el-order-color-5:#E81B1B;
} }
.el-table{ .el-table{

View File

@ -1,7 +1,8 @@
.orderMain{ .orderMain{
background: none; //background: none;
padding: 0; padding: 0;
.cardBox{ .cardBox{
.headerView{ .headerView{
border-bottom: 1px solid #e8e8e8; border-bottom: 1px solid #e8e8e8;
display: flex;justify-content: space-between;align-items: center; display: flex;justify-content: space-between;align-items: center;
@ -38,8 +39,9 @@
} }
} }
.footerCard{ .footerCard{
min-height: 800px; border-top: 10px solid #f6f8f9;
margin-top: 10px; border-top-left-radius: 0;
border-top-right-radius: 0;
.cardItem{ .cardItem{
margin-bottom: 12px; margin-bottom: 12px;
border-bottom: 1px solid #e9e9e9; border-bottom: 1px solid #e9e9e9;

View File

@ -139,24 +139,24 @@ function webSocketOnMessage(msg) {
global_callback(result); global_callback(result);
} }
} }
if (result.type == -1 || result.type == 8 || result.type == 9) { if (result.data && (result.data.type == -1 || result.data.type == 0 || result.data.type == 9 || result.data.type == 13)) {
// if(result.type == -1){ if(result.data.type == -1 || result.data.type == 0){
// if(result.data && result.data.token){ if(result.data && result.data.data && result.data.data.token){
// tool.cookie.set("TOKEN", result.data.token); let reToken = result.data.data.token.replace(/Bearer /g, "");
// } tool.cookie.set("TOKEN", reToken);
// }else{ }
}else{
showNot = ElNotification.error({ showNot = ElNotification.error({
title: '系统退出', title: '系统退出',
message: result.msg, message: result.data.msg,
duration:0 duration:0
}); });
handleError('系统退出', result.msg); handleError('系统退出', result.msg);
// } }
} }
eventBus.$emit('sockBack',result); eventBus.$emit('sockBack',result);
if(result.data && result.data.type == 1){
if(result.type == 'init'){
if(showNot && showNot.close){ if(showNot && showNot.close){
showNot.close(); showNot.close();
} }

View File

@ -0,0 +1,32 @@
<template>
<div>
</div>
</template>
<script>
export default {
name: "bindDingTalk",
data(){
return{
}
},
created(){
let code = this.$TOOL.getParameterByName('code',window.location.href);
let state = this.$TOOL.getParameterByName('state',window.location.href);
this.$TOOL.addStorageEvent(1,"DINGTALK_LOGIN_MESSAGE",JSON.stringify({code:code,state:state}));
window.close();
},
mounted() {
},
methods:{
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -0,0 +1,32 @@
<template>
<div>
</div>
</template>
<script>
export default {
name: "bindWechat",
data(){
return{
}
},
created(){
let code = this.$TOOL.getParameterByName('code',window.location.href);
let state = this.$TOOL.getParameterByName('state',window.location.href);
this.$TOOL.addStorageEvent(1,"WECHAT_LOGIN_MESSAGE",JSON.stringify({code:code,state:state}));
window.close();
},
mounted() {
},
methods:{
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -26,11 +26,11 @@
<div class="thirdParty"> <div class="thirdParty">
<el-divider class="dividerBox">{{ $t('login.signInOther') }}</el-divider> <el-divider class="dividerBox">{{ $t('login.signInOther') }}</el-divider>
<div class="login-oauth"> <div class="login-oauth">
<div class="btnBox wechat" @click="wechatLogin"> <div class="btnBox wechat" @click="bindWechat">
<el-icon><sc-icon-wechat /></el-icon> <el-icon><sc-icon-wechat /></el-icon>
<span class="text">微信登录</span> <span class="text">微信登录</span>
</div> </div>
<div class="btnBox dingTalk"> <div class="btnBox dingTalk" @click="bindDingTalk">
<el-icon><sc-icon-DingTalk /></el-icon> <el-icon><sc-icon-DingTalk /></el-icon>
<span class="text">钉钉登录</span> <span class="text">钉钉登录</span>
</div> </div>
@ -103,31 +103,154 @@
} }
}, },
created: function () { created: function () {
// addEventListener
window.addEventListener('storage',this.storageChange);
this.$TOOL.cookie.remove("TOKEN") this.$TOOL.cookie.remove("TOKEN")
this.$TOOL.data.remove("USER_INFO") this.$TOOL.data.remove("USER_INFO")
this.$TOOL.data.remove("MENU") this.$TOOL.data.remove("MENU")
this.$TOOL.data.remove("USER_INFO")
this.$TOOL.data.remove("PERMISSIONS") this.$TOOL.data.remove("PERMISSIONS")
this.$TOOL.data.remove("DASHBOARDGRID") this.$TOOL.data.remove("DASHBOARDGRID")
this.$TOOL.data.remove("grid") this.$TOOL.data.remove("grid")
this.$store.commit("clearViewTags") this.$store.commit("clearViewTags")
this.$store.commit("clearKeepLive") this.$store.commit("clearKeepLive")
this.$store.commit("clearIframeList") this.$store.commit("clearIframeList")
localStorage.removeItem('bindDingTalk');
localStorage.removeItem('bindWechat');
},
unmounted() {
window.removeEventListener('storage', this.storageChange);
}, },
methods: { methods: {
configDark() {
this.config.dark = this.config.dark ? false : true
},
configLang(command) { configLang(command) {
this.config.lang = command.value this.config.lang = command.value
}, },
wechatLogin() {
this.showWechatLogin = true storageChange(e){
this.WechatLoginCode = "SCUI-823677237287236-" + new Date().getTime() let dingTalk = localStorage.getItem('bindDingTalk');
this.isWechatLoginResult = false let wechat = localStorage.getItem('bindWechat');
setTimeout(() => { if(e.key == 'DINGTALK_LOGIN_MESSAGE'){
this.isWechatLoginResult = true if(dingTalk == 1 && typeof e.newValue =="string" && e.newValue!=''){
}, 3000) this.dingTalkLogin(e.newValue)
} }
localStorage.removeItem("DINGTALK_LOGIN_MESSAGE");
}
if(e.key == 'WECHAT_LOGIN_MESSAGE'){
if(wechat == 1 && typeof e.newValue =="string" && e.newValue!=''){
this.wechatLogin(e.newValue);
}
localStorage.removeItem("WECHAT_LOGIN_MESSAGE");
}
},
//
async bindWechat(){
const res = await this.$API.auth.wechatCode.post();
if(res.code == 200){
const url = JSON.parse(JSON.stringify(res.data.redirect));
localStorage.setItem('bindWechat','1');
window.open(url);
}
},
//
async bindDingTalk(){
const res = await this.$API.auth.dingTalkCode.post();
if(res.code == 200){
const url = JSON.parse(JSON.stringify(res.data.redirect));
localStorage.setItem('bindDingTalk','1');
window.open(url);
}
},
//
async dingTalkLogin(e){
let em = JSON.parse(e);
let params = {code:em.code};
const user = await this.$API.auth.dingTalkLogin.post(params);
if(user.code == 200){
await this.setLoginData(user);
}else{
return false;
}
},
async setLoginData(user) {
this.$TOOL.cookie.set("TOKEN", user.data.token, {
expires: 0
})
this.$TOOL.data.set("USER_INFO", user.data.user)
if(user.data.user.avatar!=''){
this.$store.commit("SET_LOGIN_AVATAR", user.data.user.avatar);
}
this.$store.commit("SET_LOGIN_NAME", user.data.user.name);
//
let menu = null;
menu = await this.$API.system.menu.myMenus.get()
if (menu.code === 200) {
if (menu.data.menu.length === 0) {
this.islogin = false
await this.$alert("当前用户无任何菜单权限,请联系系统管理员", "无权限访问", {
type: 'error',
center: true
})
return false
}
this.$TOOL.data.set("MENU", menu.data.menu)
const data_auth = this.$TOOL.objCopy(menu.data.permissions);
data_auth.auth = this.$TOOL.authPermissions(data_auth.data_permissions);
this.$TOOL.data.set("PERMISSIONS", data_auth)
this.$TOOL.data.set("DASHBOARDGRID", menu.data.dashboardGrid)
} else {
this.$message.warning(menu.msg)
return false
}
this.$router.replace({
path: '/'
})
},
// passKey
async passKeyLogin(){
const res = await this.$API.system.user.generateAuthentication.post();
if(res.code == 200){
const publicKeyConfigForLogin = {
challenge: Uint8Array.from(res.data.challenge),
timeout: res.data.timeout,
rpId:res.data.rpId,
userVerification: res.data.userVerification
};
try {
const assertion = await navigator.credentials.get({ publicKey:publicKeyConfigForLogin });
await this.passKeyVerify(assertion);
}catch(err){
console.log(err,'您已取消');
}
}
},
async passKeyVerify(assertion) {
let params = {
id: assertion.id,
rawId: this.bufferToBase64URL(assertion.rawId),
type: assertion.type,
response: {
authenticatorData: this.bufferToBase64URL(assertion.response.authenticatorData),
clientDataJSON: this.bufferToBase64URL(assertion.response.clientDataJSON),
signature: this.bufferToBase64URL(assertion.response.signature),
userHandle:this.bufferToBase64URL(assertion.response.userHandle),
}
}
const user = await this.$API.system.user.verifyAuthentication.post(params);
if(user.code == 200){
await this.setLoginData(user);
}
},
bufferToBase64URL(buffer) {
return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)))
.replace(/\+/g, "-")
.replace(/\//g, "_")
.replace(/=/g, "");
},
} }
} }
</script> </script>
@ -159,7 +282,7 @@
h2{ h2{
height: 36px; height: 36px;
display: flex; display: flex;
align-items: baseline; align-items: flex-start;
font-size: 24px; font-size: 24px;
position: relative; position: relative;
padding-left: 18px; padding-left: 18px;
@ -167,7 +290,7 @@
font-weight: 500; font-weight: 500;
.origin{ .origin{
position: absolute; position: absolute;
left: 0; left: 4px;
top: 12px; top: 12px;
display: inline-block; display: inline-block;
width: 8px; width: 8px;

View File

@ -2,7 +2,7 @@
<el-container> <el-container>
<el-main> <el-main>
<el-scrollbar> <el-scrollbar>
<el-form ref="form" :size="size" label-width="100px" :model="form"> <el-form ref="form" :size="size" label-width="90px" :model="form">
<div class="boxMain"> <div class="boxMain">
<div class="title">工作时间</div> <div class="title">工作时间</div>
<div class="boxCom"> <div class="boxCom">
@ -29,14 +29,9 @@
<div class="title">维保单号</div> <div class="title">维保单号</div>
<div class="boxCom"> <div class="boxCom">
<el-row> <el-row>
<!-- <el-col :span="8" :lg="6">-->
<!-- <el-form-item label="维修单ID">-->
<!-- <el-input class="input" type="text" placeholder="请输入维修单ID"></el-input>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="维修单号"> <el-form-item label="维修单号" prop="repair_order_no">
<el-input class="input" type="text" placeholder="请输入维修单号"></el-input> <el-input class="input" type="text" v-model="form.repair_order_no" disabled placeholder="请输入维修单号"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -47,36 +42,35 @@
<div class="boxCom"> <div class="boxCom">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="维修单等级" prop="maintenance_level"> <el-form-item label="维修单等级" prop="maintenance_grade">
<el-input class="input" v-model="form.maintenance_level" type="text" placeholder="请输入维修等级"></el-input> <el-input class="input" v-model="form.maintenance_grade" type="text" placeholder="请输入维修等级"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="故障类型" prop="fault_type"> <el-form-item label="维修分类" prop="maintenance_level">
<el-select class="input" v-model="form.fault_type" placeholder="请选择故障类型"> <el-select class="input" v-model="form.maintenance_level" @visible-change="getSelect('maintenance_level',2)" placeholder="请选择维修分类">
<el-option></el-option> <el-option v-for="(item,index) in setMap['maintenance_level']" :key="index" :value="item.id" :label="item.item_name"></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="12">
<el-form-item label="故障内容" prop="fault_description"> <el-form-item label="故障内容" prop="fault_description">
<el-input class="input" v-model="form.fault_description" type="text" placeholder="请输入维修单号"></el-input> <el-input class="input" v-model="form.fault_description" type="text" placeholder="请输入维修单号"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<!-- <el-col :span="8" :lg="6">--> <el-col :span="8" :lg="6">
<!-- <el-form-item label="当前状态">--> <el-form-item label="故障类型" prop="fault_type">
<!-- <el-select class="input" placeholder="请选择当前状态">--> <el-select class="input" v-model="form.fault_type" @visible-change="getSelect('fault_type',1)" placeholder="请选择故障类型">
<!-- <el-option></el-option>--> <el-option v-for="(item,index) in setMap['fault_type']" :key="index" :value="item.id" :label="item.item_name"></el-option>
<!-- </el-select>--> </el-select>
<!-- </el-form-item>--> </el-form-item>
<!-- </el-col>--> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="维保等级" prop="maintenance_plan"> <el-form-item label="维保等级" prop="maintenance_plan">
<el-select class="input" v-model="form.maintenance_plan" placeholder="请选择维保等级"> <el-input class="input" v-model="form.maintenance_plan" placeholder="维保等级">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
@ -88,33 +82,25 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="boxMain">
<div class="title">维保工单信息</div>
<div class="boxCom">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="机房城市" prop="city"> <el-form-item label="机房城市" prop="city">
<el-select class="input" v-model="form.city" placeholder="请选择机房城市"> <el-input class="input" v-model="form.city" placeholder="机房城市">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="园区" prop="park_name"> <el-form-item label="园区" prop="park_name">
<el-select class="input" v-model="form.park_name" placeholder="请选择园区"> <el-input class="input" v-model="form.park_name" placeholder="园区">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="机房/IDC" prop="data_center_name"> <el-form-item label="机房/IDC" prop="data_center_name">
<el-select class="input" v-model="form.data_center_name" placeholder="请选择机房/IDC"> <el-input class="input" v-model="form.data_center_name" placeholder="机房/IDC">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
@ -126,9 +112,8 @@
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="整机SN/Se" prop="device_sn"> <el-form-item label="整机SN/Se" prop="device_sn">
<el-select class="input" v-model="form.device_sn" placeholder="请选择整机SN/Se"> <el-input class="input" v-model="form.device_sn" placeholder="整机SN/Se">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
@ -142,12 +127,16 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="boxMain">
<div class="title">维保工单信息</div>
<div class="boxCom">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<el-form-item label="部件SN/Sp" prop="component_serial_no"> <el-form-item label="部件SN/Sp" prop="component_serial_no">
<el-select class="input" v-model="form.component_serial_no" placeholder="请选择部件SN/Se"> <el-input class="input" v-model="form.component_serial_no" placeholder="部件SN/Se">
<el-option></el-option> </el-input>
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
@ -181,7 +170,7 @@
</div> </div>
</div> </div>
<div class="btnBox"> <div class="btnBox">
<el-button type="primary" @click="save" :loading="isSave"> </el-button> <el-button type="primary" :size="size" @click="save" :loading="isSave">确认保存</el-button>
</div> </div>
</el-form> </el-form>
</el-scrollbar> </el-scrollbar>
@ -196,26 +185,32 @@ export default {
return{ return{
size:"small", size:"small",
isSave:false, isSave:false,
setMap:{
maintenance_level:[],
fault_type:[],
},
form:{ form:{
maintenance_level: "234", // repair_order_no:"",
fault_type: "234", // maintenance_grade:"", //
fault_description: "234", // maintenance_level: "", //
requires_shutdown: "234", // fault_type: "", //
city: "234", // fault_description: "", //
park_name: "234", // requires_shutdown: "", //
data_center_name: "234", // /IDC city: "", //
rack_position: "234", // park_name: "", //
device_sn: "234", // SN data_center_name: "", // /IDC
device_manufacturer: "234", // rack_position: "", //
device_model: "234", // device_sn: "", // SN
component_serial_no: "234", // device_manufacturer: "", //
component_manufacturer: "234", // device_model: "", //
component_model: "234", // component_serial_no: "", //
component_pn: "234", // PN component_manufacturer: "", //
sla_expiration: "2024-08-21", // SLA component_model: "", //
bd_backup_count: "234", // BD component_pn: "", // PN
pe_confirmation_time: "2024-08-21", // PE sla_expiration: "", // SLA
warranty_end_date: "2024-08-21", // bd_backup_count: "", // BD
pe_confirmation_time: "", // PE
warranty_end_date: "", //
maintenance_plan: '' // 1- maintenance_plan: '' // 1-
} }
} }
@ -224,6 +219,12 @@ export default {
}, },
methods:{ methods:{
async getSelect(name,num) {
const res = await this.$API.orders.order.maintenance.optionList.post({const_type:num});
if(res.code == 200){
this.setMap[name] = res.data;
}
},
save(){ save(){
this.$refs.form.validate(async (valid) => { this.$refs.form.validate(async (valid) => {
if (valid) { if (valid) {
@ -260,7 +261,7 @@ export default {
} }
.btnBox{ .btnBox{
margin-top: 15px; margin-top: 15px;
text-align: right; text-align: left;
padding: 0 10px; padding: 0 10px;
} }
</style> </style>

View File

@ -10,7 +10,7 @@
<span class="item part">部分确认</span> <span class="item part">部分确认</span>
</span> </span>
<emailSync @updateSync="refreshDom" :show="refreshShow" :text="syncText"> <emailSync @updateSync="refreshDom" :show="refreshShow" :text="syncText">
<span class="refreshEmail" @click="manualClick"><el-icon size="16px" :class="refreshShow?'refreshEmailIcon':''"><sc-icon-Refresh/></el-icon></span> <span class="refreshEmail" v-auth="'mailSyncManual'" @click="manualClick"><el-icon size="16px" :class="refreshShow?'refreshEmailIcon':''"><sc-icon-Refresh/></el-icon></span>
</emailSync> </emailSync>
</el-header> </el-header>
<el-main class="nopadding" v-loading="listLoading" element-loading-text="加载中..."> <el-main class="nopadding" v-loading="listLoading" element-loading-text="加载中...">
@ -24,6 +24,7 @@
<div class="total"> <div class="total">
<el-badge class="badgeItem" :value="item.total_count" :max="99" color="#eeeeee"></el-badge> <el-badge class="badgeItem" :value="item.total_count" :max="99" color="#eeeeee"></el-badge>
</div> </div>
<div class="deleteBtn" v-auth="'mailDataDelete'" @click.stop="deleteEmail(item)"><el-icon style="font-size: 32px"><sc-icon-JbDelete/></el-icon></div>
</div> </div>
</div> </div>
</el-scrollbar> </el-scrollbar>
@ -43,9 +44,10 @@
<div class="rightBtnMain"> <div class="rightBtnMain">
<div class="date">{{emailParams.sent_at}}</div> <div class="date">{{emailParams.sent_at}}</div>
<div class="btnItem"> <div class="btnItem">
<el-button type="primary" plain :size="size" @click="seeEmail">查看原邮件</el-button> <el-button type="danger" v-auth="'repairDelete'" :disabled="selection.length>0?false:true" plain icon="el-icon-delete" :size="size" @click="deleteEmailDetail"></el-button>
<el-button type="primary" v-auth="'mailBodyInfo'" plain :size="size" @click="seeEmail">查看原邮件</el-button>
<el-dropdown placement="bottom-start"> <el-dropdown placement="bottom-start">
<el-button type="primary" :size="size" >确认维保 <el-icon class="el-icon--right"><el-icon-ArrowDown/></el-icon></el-button> <el-button type="primary" v-auth="'repairConfirm'" :size="size">确认维保 <el-icon class="el-icon--right"><el-icon-ArrowDown/></el-icon></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="allDefend('all')">全部入保</el-dropdown-item> <el-dropdown-item @click="allDefend('all')">全部入保</el-dropdown-item>
@ -281,6 +283,7 @@ export default {
async getData() { async getData() {
this.listLoading = true; this.listLoading = true;
const res = await this.$API.orders.order.mail.list.get(this.listParams); const res = await this.$API.orders.order.mail.list.get(this.listParams);
this.listLoading = false;
if(res.code == 200){ if(res.code == 200){
if(res.data.rows && res.data.rows.length>0){ if(res.data.rows && res.data.rows.length>0){
res.data.rows.forEach(item=>{ res.data.rows.forEach(item=>{
@ -299,13 +302,23 @@ export default {
this.confirmList = this.confirmList.concat(res.data.rows); this.confirmList = this.confirmList.concat(res.data.rows);
} }
} }
this.listLoading = false;
}, },
stripHtmlTags(html) { stripHtmlTags(html) {
const div = document.createElement('div'); const div = document.createElement('div');
div.innerHTML = html; div.innerHTML = html;
return div.textContent || div.innerText || ''; return div.textContent || div.innerText || '';
}, },
//
async deleteEmail(item) {
let params = {
ids:[item.id]
}
const res = await this.$API.orders.order.mail.emailDelete.post(params);
if(res.code == 200){
this.emailId = "";
await this.getData();
}
},
// //
onScroll(event){ onScroll(event){
this.$nextTick(()=>{ this.$nextTick(()=>{
@ -346,8 +359,10 @@ export default {
this.total = res.data.total; this.total = res.data.total;
this.emailData = res.data; this.emailData = res.data;
this.userColumn = res.data.columnConfig; this.userColumn = res.data.columnConfig;
res.data.mail_info[0].text = this.stripHtmlTags(res.data.mail_info[0].summary) if(res.data.mail_info && res.data.mail_info.length>0){
this.emailParams = res.data.mail_info[0]; res.data.mail_info[0].text = this.stripHtmlTags(res.data.mail_info[0].summary)
this.emailParams = res.data.mail_info[0];
}
if(res.data.tableConfig && res.data.tableConfig.size){ if(res.data.tableConfig && res.data.tableConfig.size){
this.config = res.data.tableConfig; this.config = res.data.tableConfig;
@ -409,6 +424,17 @@ export default {
} }
} }
}, },
//
async deleteEmailDetail() {
let params = {
mail_data_id:this.emailId,
ids:this.selection.map(em=> em.id)
};
const res = await this.$API.orders.order.mail.delete.post(params);
if(res.code == 200){
await this.getData();
}
},
seeEmail(){ seeEmail(){
eventBus.$emit('tagClose','/order/view-mail',{id:this.emailId}); eventBus.$emit('tagClose','/order/view-mail',{id:this.emailId});
}, },
@ -594,7 +620,7 @@ export default {
padding: 5px 0; padding: 5px 0;
.itemBox{ .itemBox{
position: relative; position: relative;
padding: 12px 0 12px 10px; padding: 12px 0 12px 15px;
cursor: pointer; cursor: pointer;
.text{text-overflow: ellipsis;white-space: nowrap;overflow: hidden;width: calc(100% - 10px);} .text{text-overflow: ellipsis;white-space: nowrap;overflow: hidden;width: calc(100% - 10px);}
.name{margin-bottom: 10px;font-size: 14px;font-weight: 600;color: var(--el-color-dark);} .name{margin-bottom: 10px;font-size: 14px;font-weight: 600;color: var(--el-color-dark);}
@ -614,12 +640,31 @@ export default {
color: #555555; color: #555555;
} }
} }
.deleteBtn{
position: absolute;
bottom: -4px;
right: 0;
align-items: flex-end;
justify-content: center;
display: none;
}
}
.itemBox:hover{
padding-right: 10px;
cursor: pointer;
}
.itemBox:hover .total{
right: 20px;
}
.itemBox:hover .deleteBtn{
display: flex;
cursor: pointer;
} }
.itemBox:after{ .itemBox:after{
content: ""; content: "";
position: absolute; position: absolute;
top: 16px; top: 16px;
left: 0; left: 2px;
z-index: 20; z-index: 20;
width: 4px; width: 4px;
height: calc(100% - 32px); height: calc(100% - 32px);

View File

@ -1,25 +1,7 @@
<template> <template>
<el-container class="mainBox mainHeaderNoBorderPadding"> <el-container class="mainBox mainBoxHeaderNoBorder">
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button v-auth="'organizationImport'" type="primary" :size="size" plain @click="importFile">批量导入</el-button>
</template>
<template #download>
<div v-auth="'companyImportTemplate'" @click="importTemplate">下载导入模版</div>
</template>
</scImport>
</div>
<div class="right-panel">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11">
<el-button :size="size" icon="sc-icon-Download" @click="exportData">下载</el-button>
</scExport>
</div>
</el-header>
<el-main class="nopadding"> <el-main class="nopadding">
<div class="searchMain searchMainNoTop"> <div class="searchMain">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch> <scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
<div class="searchItem searchBtn"> <div class="searchItem searchBtn">
@ -87,16 +69,20 @@ export default {
exportShow:false, exportShow:false,
searchShow:false, searchShow:false,
searchList:[ searchList:[
{name:'生产日期',type:'date',code:'activation_date',show:true}, {name:'仓库编码',type:'text',code:['f_stock_id'],placeholder:"请输入仓库编码",isOpen:true,show:true},
{name:'反厂日期',type:'date',code:'activation_date',show:true}, {name:'计划跟踪号',type:'text',code:['f_mto_no'],placeholder:"请输入计划跟踪号",isOpen:true,show:false},
{name:'处理时间',type:'date',code:'activation_date',show:true}, {name:'生产日期',type:'date',code:'f_produce_date',show:true},
{name:'客户名称',type:'multiple',code:'id', data:[], placeholder:"请选择公司名称",show:false}, {name:'库存量(基本单位)',type:'text',code:['f_base_qty'],placeholder:"请输入库存量(基本单位)",isOpen:true,show:false},
{name:'状态',type:'select',code:'active_status', data:[], placeholder:"请选择状态",show:false}, {name:'预留量(基本单位)',type:'text',code:['f_base_lock_qty'],placeholder:"请输入预留量(基本单位)",isOpen:true,show:false},
{name:'工单号',type:'text',code:['mobile'],placeholder:"请输入手机号",isOpen:true,show:false}, {name:'库存量(库存辅单位)',type:'select',code:'f_sec_qty', data:[], placeholder:"请选择库存量(库存辅单位)",isOpen:true,show:false},
{name:'邮件地址',type:'text',code:['email'],placeholder:"请输入邮箱地址",isOpen:true,show:false}, {name:'预留量(辅单位)',type:'select',code:'f_sec_lock_qty', data:[], placeholder:"请选择预留量(辅单位)",isOpen:true,show:false},
{name:'公司地址',type:'text',code:['address'],placeholder:"请输入公司地址",isOpen:true,show:false}, {name:'库存主单位编码',type:'text',code:['f_stock_unit_id'],placeholder:"请输入库存主单位编码",isOpen:true,show:false},
{name:'负责人',type:'text',code:['owner'],placeholder:"请输入负责人",isOpen:true,show:false}, {name:'编码',type:'text',code:['f_material_id'],placeholder:"请输入编码",isOpen:true,show:false},
{name:'关键字',type:'text',code:['domain','name'],keyword:true,show:true}, {name:'可用量(基本单位)',type:'text',code:['f_base_avb_qty'],placeholder:"请输入可用量(基本单位)",isOpen:true,show:false},
{name:'实体主键',type:'text',code:['f_id'],placeholder:"请输入实体主键",isOpen:true,show:false},
{name:'BOM版本编码',type:'text',code:['f_bom_id'],placeholder:"请输入BOM版本编码",isOpen:true,show:false},
{name:'创建日期',type:'date',code:'created_at',show:true},
{name:'关键字',type:'text',code:['name'],keyword:true,show:true},
], ],
params: {}, params: {},
} }
@ -110,39 +96,30 @@ export default {
} }
}) })
}, },
getSelectData(item){ async getSelectData(item) {
let {data,params} = item; let {data, params} = item;
this.params = params; this.params = params;
if(data.code == "id"){ let searchParams = this.$TOOL.objCopy(params);
this.getCompanyList(data,params) searchParams.field = ""
}else if(data.code == "active_status"){ if (typeof data.code === 'string') {
this.getStatusList(data,params); searchParams.field = data.code;
} else {
searchParams.field = data.code[0];
} }
}, if (data.type == 'select') {
const res = await this.$API.orders.order.sock.field.post(searchParams);
async getCompanyList(data,params) { if (res.code == 200) {
const res = await this.$API.system.company.select.post(params); if (res.data && res.data.length > 0) {
if(res.data && res.data.length>0){ res.data.forEach(item => {
res.data.forEach(item=>{ item.label = item[data.code];
item.label = item.full_name; })
})
}
if(res.code == 200){
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
} }
}) this.searchList.forEach(item => {
} if (item.code == data.code) {
}, item.data = res.data;
async getStatusList(data,params) { }
const res = await this.$API.oss.status.post(params); })
if(res.code == 200){ }
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
}
})
} }
}, },

View File

@ -0,0 +1,87 @@
<template>
<div class="flowView">
<div class="item" :class="{'noMarginRight':!item.right,'jtLeft':item.left}" v-for="(item,index) in list" :key="index">
<span class="seq">{{index+1}}</span>
<span class="name">{{item.name}}</span>
</div>
</div>
</template>
<script>
export default {
name: "flow",
props:{
list:{
type:Array
}
},
data(){
return{
}
},
mounted() {
},
methods:{
}
}
</script>
<style scoped lang="scss">
.flowView{
display: flex;
align-items: center;
justify-content: space-between;
overflow: hidden;
.item{
background: #F2F8FF;
width: 100%;
flex: 1;
margin: 0 30px 10px 0;
padding: 8px 10px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
.seq{
width: 20px;height: 20px;
text-align: center;
line-height: 20px;
display: inline-block;
border-radius: 50%;
background: var(--el-color-primary);
color: var(--el-color-white);
margin-right: 20px;
}
}
.item:after{
content: "";
position: absolute;
top: 50%;
left: 100%;
transform: translateY(-50%);
border-style: solid;
border-width: 19px 0 19px 20px; /* 上下左右的边框宽度 */
border-color: transparent transparent transparent #F2F8FF; /* 上下右左的颜色 */
}
.jtLeft:before{
content: "";
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
border-style: solid;
border-width: 19px 0 19px 20px; /* 上下左右的边框宽度 */
border-color: transparent transparent transparent #fff; /* 上下右左的颜色 */
}
.noMarginRight{
margin-right: 0;
}
.noMarginRight:after{
border-width: 0;
}
}
</style>

View File

@ -4,7 +4,12 @@
<div class="title">工单时间</div> <div class="title">工单时间</div>
<div class="status"> <div class="status">
<span class="name">当前状态</span> <span class="name">当前状态</span>
<span class="text">{{info.business_status}}</span> <span class="text">
<span v-for="(item,ind) in statusList" :key="ind">
<span :style="{color:item.value==1?`var(--el-order-color-1)`:item.value==2?`var(--el-order-color-2)`:item.value==3?`var(--el-order-color-3)`:item.value==4?`var(--el-order-color-4)`:`var(--el-order-color-5)`}"
v-if="item.value == info.business_status">{{item.label}}</span>
</span>
</span>
</div> </div>
</div> </div>
<div class="cardBody"> <div class="cardBody">
@ -53,15 +58,19 @@
<span class="text">{{info.maintenance_plan}}</span> <span class="text">{{info.maintenance_plan}}</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">故障类型</span> <span class="label">维修分类</span>
<span class="text">{{info.fault_type}}</span> <span class="text">{{info.maintenance_level}}</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="12">
<span class="label">故障内容</span> <span class="label">故障内容</span>
<span class="text">{{info.fault_description}}</span> <span class="text">{{info.fault_description}}</span>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8" :lg="6">
<span class="label">故障类型</span>
<span class="text">{{info.fault_type}}</span>
</el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">维保等级</span> <span class="label">维保等级</span>
<span class="text">{{info.maintenance_plan}}</span> <span class="text">{{info.maintenance_plan}}</span>
@ -71,11 +80,6 @@
<span class="text">{{info.requires_shutdown}}</span> <span class="text">{{info.requires_shutdown}}</span>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">机房城市</span> <span class="label">机房城市</span>
@ -110,6 +114,11 @@
<span class="text">{{info.device_model}}</span> <span class="text">{{info.device_model}}</span>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">部件SN/Sp</span> <span class="label">部件SN/Sp</span>
@ -159,14 +168,20 @@ export default {
}, },
data(){ data(){
return{ return{
info:{} info:{},
statusList:[]
} }
}, },
mounted() { mounted() {
this.getStatusList();
}, },
methods:{ methods:{
async getStatusList() {
const res = await this.$API.orders.order.maintenance.status.post();
if (res.code == 200) {
this.statusList = res.data;
}
},
} }
} }
</script> </script>

View File

@ -1,28 +1,31 @@
<template> <template>
<el-container class="mainBox mainHeaderNoBorderPadding"> <el-container class="mainBox mainHeaderNoBorderPadding">
<el-header> <el-header class="header">
<div class="left-panel"> <div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button> <el-button type="primary" v-auth="'maintenanceOrderAdd'" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button>
<el-button type="success" :size="size" icon="sc-icon-OrderReview" :disabled="selection.length==0" @click="batch_review">批量审核</el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="save_maintenance">提交维保</el-button>
<el-button type="primary" plain :size="size" :disabled="selection.length==0" @click="issued_maintenance">下发维保</el-button>
<el-button type="danger" plain :size="size" icon="el-icon-Delete" :disabled="selection.length==0" @click="batch_del"></el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess"> <scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header> <template #header>
<el-button v-auth="'organizationImport'" type="primary" :size="size" plain @click="importFile">批量导入</el-button> <el-button v-auth="'maintenanceOrderImport'" type="primary" :size="size" plain @click="importFile" style="margin-right: 12px;">批量导入</el-button>
</template> </template>
<template #download> <template #download>
<div v-auth="'companyImportTemplate'" @click="importTemplate">下载导入模版</div> <div v-auth="'maintenanceOrderImport'" @click="importTemplate">下载导入模版</div>
</template> </template>
</scImport> </scImport>
<el-button type="primary" v-auth="'maintenanceOrderSubmit'" plain :size="size" :disabled="selection.length==0" @click="save_maintenance">提交维保</el-button>
<el-button type="success" v-auth="'maintenanceOrderApproval'" :size="size" icon="sc-icon-OrderReview" :disabled="selection.length==0" @click="batch_review">批量审核</el-button>
<el-button type="primary" v-auth="'maintenanceOrderSend'" plain :size="size" :disabled="selection.length==0" @click="issued_maintenance">下发维保</el-button>
<el-button type="danger" v-auth="'maintenanceOrderDelete'" plain :size="size" icon="el-icon-Delete" :disabled="selection.length==0" @click="batch_del"></el-button>
</div> </div>
<div class="right-panel"> <div class="right-panel">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11"> <scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11">
<el-button :size="size" icon="sc-icon-Download" @click="exportData">下载</el-button> <el-button :size="size" v-auth="'maintenanceOrderExport'" icon="sc-icon-Download" @click="exportData">下载</el-button>
</scExport> </scExport>
</div> </div>
</el-header> </el-header>
<el-main class="nopadding"> <el-main class="nopadding">
<div class="flowPath">
<flow :list="flowList"/>
</div>
<div class="searchMain searchMainNoTop"> <div class="searchMain searchMainNoTop">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch> <scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
@ -32,20 +35,14 @@
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button> <el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
</div> </div>
</div> </div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange"> <scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" highlightCurrentRow @selection-change="selectionChange">
<el-table-column type="selection" align="center" width="40"></el-table-column> <el-table-column type="selection" align="center" width="40"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column> <sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #logo="scope"> <template #business_status="scope">
<el-image class="logoCell" :src="scope.row.logo" preview-teleported :preview-src-list="[scope.row.logo]" fit="contain"> <span v-for="(item,ind) in statusList" :key="ind">
<template #error> <span :style="{color:item.value==1?`var(--el-order-color-1)`:item.value==2?`var(--el-order-color-2)`:item.value==3?`var(--el-order-color-3)`:item.value==4?`var(--el-order-color-4)`:`var(--el-order-color-5)`}"
<div class="image-slot" style="text-align: center;font-size: 20px;"> v-if="item.value == scope.row.business_status">{{item.label}}</span>
<el-icon><el-icon-Picture /></el-icon> </span>
</div>
</template>
</el-image>
</template>
<template #active_status="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
</template> </template>
<el-table-column label="操作" fixed="right" align="center" width="150"> <el-table-column label="操作" fixed="right" align="center" width="150">
<template #default="scope"> <template #default="scope">
@ -53,13 +50,27 @@
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button> <el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="table_edit(scope.row)" icon="sc-icon-Edit">编辑工单</el-dropdown-item> <div v-auth="'maintenanceOrderAdd'">
<el-dropdown-item @click="table_del(scope.row)" icon="sc-icon-Delete">删除工单</el-dropdown-item> <el-dropdown-item @click="table_edit(scope.row)" icon="sc-icon-Edit">编辑工单</el-dropdown-item>
<el-dropdown-item @click="table_review(scope.row)" icon="sc-icon-OrderReview" divided>审核工单</el-dropdown-item> </div>
<el-dropdown-item @click="table_show(scope.row)" icon="sc-icon-See">工单详情</el-dropdown-item> <div v-auth="'maintenanceOrderDelete'">
<el-dropdown-item icon="sc-icon-SaveMaintenance" @click="table_submit(scope.row)" divided>提交维保</el-dropdown-item> <el-dropdown-item @click="table_del(scope.row)" icon="sc-icon-Delete">删除工单</el-dropdown-item>
<el-dropdown-item icon="sc-icon-OrderMaintenance" @click="table_send(scope.row)">下发维保</el-dropdown-item> </div>
<el-dropdown-item icon="sc-icon-OrderLog" @click="table_logs(scope.row)" divided>工单日志</el-dropdown-item> <div v-auth="'maintenanceOrderApproval'">
<el-dropdown-item @click="table_review(scope.row)" icon="sc-icon-OrderReview" divided>审核工单</el-dropdown-item>
</div>
<div v-auth="'maintenanceOrderDetail'">
<el-dropdown-item @click="table_show(scope.row)" icon="sc-icon-See">工单详情</el-dropdown-item>
</div>
<div v-auth="'maintenanceOrderSubmit'">
<el-dropdown-item icon="sc-icon-SaveMaintenance" @click="table_submit(scope.row)" divided>提交维保</el-dropdown-item>
</div>
<div v-auth="'maintenanceOrderSend'">
<el-dropdown-item icon="sc-icon-OrderMaintenance" @click="table_send(scope.row)">下发维保</el-dropdown-item>
</div>
<div v-auth="'orderLogsList'">
<el-dropdown-item icon="sc-icon-OrderLog" @click="table_logs(scope.row)" divided>工单日志</el-dropdown-item>
</div>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -74,14 +85,20 @@
<script> <script>
import {eventBus} from "@/utils/eventBus"; import {eventBus} from "@/utils/eventBus";
import flow from "./components/flow"
export default { export default {
components: { components: {
flow
}, },
data() { data() {
return { return {
size:'small', size:'small',
flowList:[
{name:'新建/导入/同步邮件',left:false,right:true},
{name:'提交维保',left:true,right:true},
{name:'审核',left:true,right:true},
{name:'下发维保',left:true,right:false},
],
dialog: { dialog: {
save: false, save: false,
show: false, show: false,
@ -118,8 +135,12 @@ export default {
{name:'关键字',type:'text',code:['fault_description'],keyword:true,show:true}, {name:'关键字',type:'text',code:['fault_description'],keyword:true,show:true},
], ],
params: {}, params: {},
statusList:[],
} }
}, },
mounted() {
this.getStatusList();
},
methods: { methods: {
searchShowClick(){ searchShowClick(){
this.searchShow = !this.searchShow; this.searchShow = !this.searchShow;
@ -330,11 +351,30 @@ export default {
handleSaveSuccess(){ handleSaveSuccess(){
this.$refs.table.refresh(); this.$refs.table.refresh();
}, },
async getStatusList() {
const res = await this.$API.orders.order.maintenance.status.post();
if (res.code == 200) {
this.statusList = res.data;
}
},
} }
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mainBox{
padding: 0;
.header{
padding: 0 10px;
}
.searchMain{
margin-left: 10px;
margin-right: 10px;
}
.scTable{
padding: 0 10px;
}
}
.logoCell{ .logoCell{
display: flex; display: flex;
align-items: center; align-items: center;

View File

@ -0,0 +1,234 @@
<template>
<el-dialog :title="titleMap[mode]" v-model="visible" :width="800" draggable destroy-on-close @closed="$emit('closed')">
<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="120px" label-position="right">
<div class="boxHeader">
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="费用类型" prop="login_name">
<el-select v-model="form.login_name" placeholder="请填写登录账号" clearable style="width: 100%;">
<el-option></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="快递单号" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写快递单号" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="11" :sm="11">
<el-form-item label="快递发货日期" prop="login_name">
<el-date-picker v-model="form.login_name" type="date" placeholder="请选择发货日期" clearable value-format="YYYY-MM-DD"></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="发货地址" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写发货地址" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="调拨地址" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写调拨地址" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
<div class="boxFooter">
<div class="title">费用项</div>
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="运费" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写运费" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="备件数量" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写备件数量" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="税费" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写税费" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="备件数量" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写备件数量" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="4" justify="space-between">
<el-col :span="11">
<el-form-item label="仓储费" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写仓储费" clearable></el-input>
</el-form-item>
</el-col>
<el-col :span="11">
<el-form-item label="备件数量" prop="login_name">
<el-input v-model="form.login_name" placeholder="请填写备件数量" clearable></el-input>
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<template #footer>
<el-button @click="visible=false" > </el-button>
<el-button v-if="mode!='show'" type="primary" :loading="isSave" @click="submit()"> </el-button>
</template>
</el-dialog>
</template>
<script>
export default {
emits: ['success', 'closed'],
data() {
return {
mode: "confirm",
titleMap: {
confirm: '数据确认费用',
},
visible: false,
isSave: false,
//
form: {
id:"",
login_name: "",
name:"",
emp_id:"",
mobile:"",
email:"",
avatar: "",
password:"",
dept_id: "",
role_ids: []
},
//
rules: {
avatar:[
{required: true, message: '请上传头像'}
],
login_name: [
{required: true, message: '请输入登录账号'}
],
name: [
{required: true, message: '请输入真实姓名'}
],
emp_id:[
{required: true, message: '请输入工号'}
],
mobile: [
{required: true, message: '请输入联系方式'}
],
email: [
{required: true, message: '请输入邮箱地址'}
],
password: [
{required: true, message: '请输入登录密码'},
{validator: (rule, value, callback) => {
if (this.form.password2 !== '') {
this.$refs.dialogForm.validateField('password2');
}
callback();
}}
],
password_cnf: [
{required: true, message: '请再次输入密码'},
{validator: (rule, value, callback) => {
if (value !== this.form.password) {
callback(new Error('两次输入密码不一致!'));
}else{
callback();
}
}}
],
dept_id: [
{required: true, message: '请选择所属部门'}
],
role_ids: [
{required: true, message: '请选择所属角色', trigger: 'change'}
]
},
//
groups: [],
groupsProps: {
value: "id",
multiple: true,
checkStrictly: true
},
depts: [],
deptsProps: {
value: "id",
checkStrictly: false,
emitPath:false
}
}
},
mounted() {
this.getGroup()
this.getDept()
},
methods: {
//
open(mode='confirm'){
this.mode = mode;
this.visible = true;
return this
},
//
async getGroup(){
const res = await this.$API.system.role.list.get();
if(res.code == 200){
this.groups = res.data.rows;
}
},
async getDept(){
const res = await this.$API.system.dept.active.post();
if(res.code == 200){
this.depts = res.data;
}
},
parentParams(item){
this.form.avatar = item;
},
//
submit(){
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
this.isSave = true;
const res = await this.$API.system.user.add.post(this.form);
this.isSave = false;
if(res.code == 200){
this.$emit('success', this.form, this.mode)
this.visible = false;
this.$message.success("操作成功")
}
}else{
return false;
}
})
},
//
setData(data){
this.form.id = data.id
this.form.login_name = data.login_name
this.form.name = data.name
this.form.emp_id = data.emp_id
this.form.mobile = data.mobile
this.form.email = data.email
this.form.avatar = data.avatar
this.form.dept_id = data.dept_id
this.form.group = data.group
this.form.role_ids = data.user_roles && data.user_roles.role_ids?data.user_roles.role_ids:[]
}
}
}
</script>
<style>
</style>

View File

@ -1,25 +1,7 @@
<template> <template>
<el-container class="mainBox mainHeaderNoBorderPadding"> <el-container class="mainBox mainBoxHeaderNoBorder">
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button v-auth="'organizationImport'" type="primary" :size="size" plain @click="importFile">批量导入</el-button>
</template>
<template #download>
<div v-auth="'companyImportTemplate'" @click="importTemplate">下载导入模版</div>
</template>
</scImport>
</div>
<div class="right-panel">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11">
<el-button :size="size" icon="sc-icon-Download" @click="exportData">下载</el-button>
</scExport>
</div>
</el-header>
<el-main class="nopadding"> <el-main class="nopadding">
<div class="searchMain searchMainNoTop"> <div class="searchMain">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch> <scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
<div class="searchItem searchBtn"> <div class="searchItem searchBtn">
@ -31,17 +13,11 @@
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange"> <scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange">
<el-table-column type="selection" align="center" width="40"></el-table-column> <el-table-column type="selection" align="center" width="40"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column> <sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #logo="scope"> <template #business_status="scope">
<el-image class="logoCell" :src="scope.row.logo" preview-teleported :preview-src-list="[scope.row.logo]" fit="contain"> <span v-for="(item,ind) in statusList" :key="ind">
<template #error> <span :style="{color:item.value==1?`var(--el-order-color-1)`:item.value==2?`var(--el-order-color-2)`:item.value==3?`var(--el-order-color-3)`:item.value==4?`var(--el-order-color-4)`:`var(--el-order-color-5)`}"
<div class="image-slot" style="text-align: center;font-size: 20px;"> v-if="item.value == scope.row.business_status">{{item.label}}</span>
<el-icon><el-icon-Picture /></el-icon> </span>
</div>
</template>
</el-image>
</template>
<template #active_status="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
</template> </template>
<el-table-column label="操作" fixed="right" align="center" width="150"> <el-table-column label="操作" fixed="right" align="center" width="150">
<template #default="scope"> <template #default="scope">
@ -49,12 +25,8 @@
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button> <el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">查看详情</el-dropdown-item> <el-dropdown-item icon="sc-icon-ConfirmOrder" @click="confirmOrderClick">确认工单</el-dropdown-item>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑公司</el-dropdown-item> <el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">工单详情</el-dropdown-item>
<el-dropdown-item icon="sc-icon-AbilityAuthorization" @click="table_empower(scope.row)" divided>功能授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-DataAuthorization">数据授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-UserList" @click="table_user_ist(scope.row)" divided>用户列表</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除公司</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -64,47 +36,44 @@
</el-main> </el-main>
</el-container> </el-container>
<!-- <save-dialog v-if="dialog.save" ref="saveDialog" @success="handleSaveSuccess" @closed="dialog.save=false"></save-dialog>--> <confirm-dialog v-if="dialog.confirm" ref="confirmDialog" @success="handleSaveSuccess" @closed="dialog.confirm=false"></confirm-dialog>
<!-- <see-dialog v-if="dialog.show" ref="showDialog" @closed="dialog.show=false"></see-dialog>--> <!-- <see-dialog v-if="dialog.show" ref="showDialog" @closed="dialog.show=false"></see-dialog>-->
</template> </template>
<script> <script>
// import saveDialog from './save' import confirmDialog from './confirmOrder'
// import seeDialog from './see' // import seeDialog from './see'
export default { export default {
components: { components: {
// saveDialog, confirmDialog,
// seeDialog, // seeDialog,
}, },
data() { data() {
return { return {
size:'small', size:'small',
dialog: { dialog: {
save: false, confirm: false,
show: false, show: false,
}, },
list: { list: {
apiObj: {}, apiObj: this.$API.orders.order.plan.list,
column: [], column: [],
}, },
selection: [], selection: [],
exportShow:false, exportShow:false,
searchShow:false, searchShow:false,
searchList:[ searchList:[
{name:'生产日期',type:'date',code:'activation_date'}, {name:'维修单号',type:'text',code:'repair_order_no', data:[], placeholder:"请输入维修单号",show:true},
{name:'反厂日期',type:'date',code:'activation_date'}, {name:'故障类型',type:'select',code:'fault_type', data:[], placeholder:"请选择故障类型",show:true},
{name:'处理时间',type:'date',code:'activation_date'}, {name:'整机型号',type:'select',code:'repair_status', data:[], placeholder:"请选择整机型号",isOpen:true,show:true},
{name:'客户名称',type:'multiple',code:'id', data:[], placeholder:"请选择公司名称",show:false}, {name:'园区名称',type:'select',code:'repair_status', data:[], placeholder:"请选择园区名称",isOpen:true,show:false},
{name:'状态',type:'select',code:'active_status', data:[], placeholder:"请选择状态",show:false}, {name:'故障描述',type:'text',code:['fault_description'],placeholder:"请输故障描述",isOpen:true,show:false},
{name:'工单号',type:'text',code:['mobile'],placeholder:"请输入手机号",isOpen:true,show:false}, {name:'关键字',type:'text',code:['fault_description','device_sn'],keyword:true,show:true},
{name:'邮件地址',type:'text',code:['email'],placeholder:"请输入邮箱地址",isOpen:true,show:false},
{name:'公司地址',type:'text',code:['address'],placeholder:"请输入公司地址",isOpen:true,show:false},
{name:'负责人',type:'text',code:['owner'],placeholder:"请输入负责人",isOpen:true,show:false},
{name:'关键字',type:'text',code:['domain','name'],keyword:true,show:true},
], ],
params: {}, params: {},
statusList:[],
} }
}, },
methods: { methods: {
@ -116,79 +85,41 @@ export default {
} }
}) })
}, },
getSelectData(item){ async getSelectData(item) {
let {data,params} = item; let {data, params} = item;
this.params = params; this.params = params;
if(data.code == "id"){ let searchParams = this.$TOOL.objCopy(params);
this.getCompanyList(data,params) searchParams.field = ""
}else if(data.code == "active_status"){ if (typeof data.code === 'string') {
this.getStatusList(data,params); searchParams.field = data.code;
} else {
searchParams.field = data.code[0];
}
if (data.type == 'select') {
const res = await this.$API.orders.order.maintenance.field.post(searchParams);
if (res.code == 200) {
if (res.data && res.data.length > 0) {
res.data.forEach(item => {
item.label = item[data.code];
})
}
this.searchList.forEach(item => {
if (item.code == data.code) {
item.data = res.data;
}
})
}
} }
}, },
async getCompanyList(data,params) { //
const res = await this.$API.system.company.select.post(params); confirmOrderClick(){
if(res.data && res.data.length>0){ this.dialog.confirm = true;
res.data.forEach(item=>{
item.label = item.full_name;
})
}
if(res.code == 200){
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
}
})
}
},
async getStatusList(data,params) {
const res = await this.$API.oss.status.post(params);
if(res.code == 200){
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
}
})
}
},
//
add(){
this.dialog.save = true;
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.saveDialog.open() this.$refs.confirmDialog.open()
}) })
}, },
//
importFile(){
this.$nextTick(()=>{
this.$refs.scImport.importFile();
})
},
async importTemplate() {
const res = await this.$API.orders.order.maintenance.template.post();
const blob = new Blob([res]);
const text = new Date().getTime();
const eLink = document.createElement('a');
eLink.download = "维保导入模版_"+text+'.xlsx';
eLink.style.display = 'none';
eLink.href = URL.createObjectURL(blob);
document.body.appendChild(eLink);
eLink.click();
URL.revokeObjectURL(eLink.href);
document.body.removeChild(eLink);
},
async importUpload(params) {
const res = await this.$API.orders.order.maintenance.import.post(params);
if(res.code == 200){
this.$message.success('上传成功,开始导入数据');
}
},
importSuccess(){
this.$refs.table.refresh()
},
// //
table_edit(row){ table_edit(row){
this.dialog.save = true this.dialog.save = true
@ -242,35 +173,6 @@ export default {
selectionChange(selection){ selectionChange(selection){
this.selection = selection; this.selection = selection;
}, },
//
changeSwitch(val, row) {
row.$switch_yx = true;
setTimeout(async () => {
let params = {
id: row.id,
status: row.active_status,
};
const res = await this.$API.system.company.status.post(params);
if(res.code !=200){
row.active_status = !row.active_status;
}
delete row.$switch_status;
delete row.$switch_yx;
}, 500);
},
//
exportChangeShow(params){
if(params.type == 11){
this.exportShow = params.status==0?true:false
}
},
async exportData() {
if(this.exportShow) return
const res = await this.$API.orders.order.maintenance.export.post(this.params);
if(res.code == 200){
this.$message.success('开始导出');
}
},
upSearch(){ upSearch(){
this.$refs.table.upData(this.params); this.$refs.table.upData(this.params);
}, },

View File

@ -99,6 +99,6 @@ export default {
<style scoped lang="scss"> <style scoped lang="scss">
.btnView{ .btnView{
margin-top: 15px; margin-top: 15px;
display: flex;justify-content: flex-end; display: flex;justify-content: flex-start;
} }
</style> </style>

View File

@ -1,24 +1,9 @@
<template> <template>
<el-container class="mainBox mainHeaderNoBorderPadding"> <el-container class="mainBox mainHeaderNoBorderPadding">
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button v-auth="'organizationImport'" type="primary" :size="size" plain @click="importFile">批量导入</el-button>
</template>
<template #download>
<div v-auth="'companyImportTemplate'" @click="importTemplate">下载导入模版</div>
</template>
</scImport>
</div>
<div class="right-panel">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11">
<el-button :size="size" icon="sc-icon-Download" @click="exportData">下载</el-button>
</scExport>
</div>
</el-header>
<el-main class="nopadding"> <el-main class="nopadding">
<div class="flowPath">
<flow :list="flowList"/>
</div>
<div class="searchMain searchMainNoTop"> <div class="searchMain searchMainNoTop">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch> <scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
@ -31,17 +16,11 @@
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange"> <scTable ref="table" :apiObj="list.apiObj" :column="list.column" row-key="id" stripe :size="size" @selection-change="selectionChange">
<el-table-column type="selection" align="center" width="40"></el-table-column> <el-table-column type="selection" align="center" width="40"></el-table-column>
<sc-table-column label="序号" align="center" type="index"></sc-table-column> <sc-table-column label="序号" align="center" type="index"></sc-table-column>
<template #logo="scope">
<el-image class="logoCell" :src="scope.row.logo" preview-teleported :preview-src-list="[scope.row.logo]" fit="contain">
<template #error>
<div class="image-slot" style="text-align: center;font-size: 20px;">
<el-icon><el-icon-Picture /></el-icon>
</div>
</template>
</el-image>
</template>
<template #repair_status="scope"> <template #repair_status="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch> <span v-for="(item,ind) in statusList" :key="ind">
<span :style="{color:item.value==1?`var(--el-order-color-1)`:item.value==2?`var(--el-order-color-2)`:item.value==3?`var(--el-order-color-3)`:item.value==4?`var(--el-order-color-4)`:`var(--el-order-color-5)`}"
v-if="item.value == scope.row.repair_status">{{item.label}}</span>
</span>
</template> </template>
<el-table-column label="操作" fixed="right" align="center" width="150"> <el-table-column label="操作" fixed="right" align="center" width="150">
<template #default="scope"> <template #default="scope">
@ -49,12 +28,8 @@
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button> <el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">查看详情</el-dropdown-item> <el-dropdown-item icon="sc-icon-MaintenanceSetup">执行维修</el-dropdown-item>
<el-dropdown-item @click="table_edit(scope.row, 'edit')" icon="sc-icon-Edit">编辑公司</el-dropdown-item> <el-dropdown-item @click="table_show(scope.row, 'see')" icon="sc-icon-See">工单详情</el-dropdown-item>
<el-dropdown-item icon="sc-icon-AbilityAuthorization" @click="table_empower(scope.row)" divided>功能授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-DataAuthorization">数据授权</el-dropdown-item>
<el-dropdown-item icon="sc-icon-UserList" @click="table_user_ist(scope.row)" divided>用户列表</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除公司</el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -72,15 +47,22 @@
<script> <script>
// import saveDialog from './save' // import saveDialog from './save'
// import seeDialog from './see' // import seeDialog from './see'
import flow from '../orderList/components/flow'
export default { export default {
components: { components: {
flow,
// saveDialog, // saveDialog,
// seeDialog, // seeDialog,
}, },
data() { data() {
return { return {
size:'small', size:'small',
flowList:[
{name:'维修确认',left:false,right:true},
{name:'维修中',left:true,right:true},
{name:'维修完成',left:true,right:false},
],
dialog: { dialog: {
save: false, save: false,
show: false, show: false,
@ -93,18 +75,28 @@ export default {
exportShow:false, exportShow:false,
searchShow:false, searchShow:false,
searchList:[ searchList:[
{name:'创建日期',type:'date',code:'activation_date'}, {name:'创建日期',type:'date',code:'activation_date',show:true},
{name:'维修单号',type:'text',code:'repair_order_no', data:[], placeholder:"请输入维修单号",show:true}, {name:'维修单号',type:'text',code:'repair_order_no', data:[], placeholder:"请输入维修单号",show:true},
{name:'故障类型',type:'select',code:'fault_type', data:[], placeholder:"请选择故障类型",show:true}, {name:'故障类型',type:'select',code:'fault_type', data:[], placeholder:"请选择故障类型",show:true},
{name:'状态',type:'select',code:'repair_status', data:[], placeholder:"请选择状态",show:true}, {name:'状态',type:'select',code:'repair_status', data:[], placeholder:"请选择状态",isOpen:true,show:false},
{name:'故障描述',type:'text',code:['fault_description'],placeholder:"请输故障描述",isOpen:true,show:false}, {name:'故障描述',type:'text',code:['fault_description'],placeholder:"请输故障描述",isOpen:true,show:false},
{name:'整机SN',type:'text',code:['device_sn'],placeholder:"请输入整机SN",isOpen:true,show:false},
{name:'关键字',type:'text',code:['fault_description','device_sn'],keyword:true,show:true}, {name:'关键字',type:'text',code:['fault_description','device_sn'],keyword:true,show:true},
], ],
params: {}, params: {},
statusList:[],
} }
}, },
mounted() {
this.getStatusList();
},
methods: { methods: {
async getStatusList() {
const res = await this.$API.orders.order.maintenance.status.post();
if (res.code == 200) {
this.statusList = res.data;
}
},
searchShowClick(){ searchShowClick(){
this.searchShow = !this.searchShow; this.searchShow = !this.searchShow;
this.searchList.forEach(item=>{ this.searchList.forEach(item=>{
@ -138,16 +130,6 @@ export default {
}) })
} }
}, },
async getStatusList(data,params) {
const res = await this.$API.oss.status.post(params);
if(res.code == 200){
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
}
})
}
},
// //
add(){ add(){
@ -157,35 +139,6 @@ export default {
}) })
}, },
//
importFile(){
this.$nextTick(()=>{
this.$refs.scImport.importFile();
})
},
async importTemplate() {
const res = await this.$API.orders.order.maintenance.template.post();
const blob = new Blob([res]);
const text = new Date().getTime();
const eLink = document.createElement('a');
eLink.download = "维保导入模版_"+text+'.xlsx';
eLink.style.display = 'none';
eLink.href = URL.createObjectURL(blob);
document.body.appendChild(eLink);
eLink.click();
URL.revokeObjectURL(eLink.href);
document.body.removeChild(eLink);
},
async importUpload(params) {
const res = await this.$API.orders.order.maintenance.import.post(params);
if(res.code == 200){
this.$message.success('上传成功,开始导入数据');
}
},
importSuccess(){
this.$refs.table.refresh()
},
// //
table_edit(row){ table_edit(row){
this.dialog.save = true this.dialog.save = true
@ -200,7 +153,7 @@ export default {
this.$refs.showDialog.open('show').setData(row); this.$refs.showDialog.open('show').setData(row);
}) })
}, },
// //
async table_del(row){ async table_del(row){
this.$confirm(`确定删除 ${row.name} 吗?`, '提示', { this.$confirm(`确定删除 ${row.name} 吗?`, '提示', {
type: 'warning' type: 'warning'
@ -215,59 +168,12 @@ export default {
} }
}).catch(()=>{}) }).catch(()=>{})
}, },
//
table_empower(row){
this.$router.push({
path: '/setting/company/add-permission',
query: {
id: row.id,
name:row.name
}
})
},
//
table_user_ist(row){
this.$router.push({
path: '/setting/user/company-user-list',
query: {
id: row.id,
name:row.name
}
})
},
// //
selectionChange(selection){ selectionChange(selection){
this.selection = selection; this.selection = selection;
}, },
//
changeSwitch(val, row) {
row.$switch_yx = true;
setTimeout(async () => {
let params = {
id: row.id,
status: row.active_status,
};
const res = await this.$API.system.company.status.post(params);
if(res.code !=200){
row.active_status = !row.active_status;
}
delete row.$switch_status;
delete row.$switch_yx;
}, 500);
},
//
exportChangeShow(params){
if(params.type == 11){
this.exportShow = params.status==0?true:false
}
},
async exportData() {
if(this.exportShow) return
const res = await this.$API.orders.order.maintenance.export.post(this.params);
if(res.code == 200){
this.$message.success('开始导出');
}
},
upSearch(){ upSearch(){
this.$refs.table.upData(this.params); this.$refs.table.upData(this.params);
}, },
@ -284,6 +190,16 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.mainBox{
padding:10px 0 0 0;
.searchMain{
margin-left: 10px;
margin-right: 10px;
}
.scTable{
padding: 0 10px;
}
}
.logoCell{ .logoCell{
display: flex; display: flex;
align-items: center; align-items: center;

View File

@ -7,7 +7,12 @@
<div class="title">工单时间</div> <div class="title">工单时间</div>
<div class="status"> <div class="status">
<span class="name">当前状态</span> <span class="name">当前状态</span>
<span class="text">{{info.business_status}}</span> <span class="text">
<span v-for="(item,ind) in statusList" :key="ind">
<span :style="{color:item.value==1?`var(--el-order-color-1)`:item.value==2?`var(--el-order-color-2)`:item.value==3?`var(--el-order-color-3)`:item.value==4?`var(--el-order-color-4)`:`var(--el-order-color-5)`}"
v-if="item.value == info.business_status">{{item.label}}</span>
</span>
</span>
</div> </div>
</div> </div>
<div class="cardBody"> <div class="cardBody">
@ -56,15 +61,19 @@
<span class="text">{{info.maintenance_plan}}</span> <span class="text">{{info.maintenance_plan}}</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">故障类型</span> <span class="label">维修分类</span>
<span class="text">{{info.fault_type}}</span> <span class="text">{{info.maintenance_level}}</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="12">
<span class="label">故障内容</span> <span class="label">故障内容</span>
<span class="text">{{info.fault_description}}</span> <span class="text">{{info.fault_description}}</span>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8" :lg="6">
<span class="label">故障类型</span>
<span class="text">{{info.fault_type}}</span>
</el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label">维保等级</span> <span class="label">维保等级</span>
<span class="text">{{info.maintenance_plan}}</span> <span class="text">{{info.maintenance_plan}}</span>
@ -74,59 +83,45 @@
<span class="text">{{info.requires_shutdown}}</span> <span class="text">{{info.requires_shutdown}}</span>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">机房城市</span> <span class="label labelText">机房城市</span>
<span class="text"> <span class="text">{{info.city}}</span>
<el-input :size="size" v-model="info.city" placeholder="机房城市"></el-input>
</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">园区</span> <span class="label labelText">园区</span>
<span class="text"> <span class="text">{{info.park_name}}</span>
<el-input :size="size" v-model="info.park_name" placeholder="园区"></el-input>
</span>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">机房</span> <span class="label labelText">机房</span>
<span class="text"> <span class="text">{{info.data_center_name}}</span>
<el-input :size="size" v-model="info.data_center_name" placeholder="机房"></el-input>
</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">机架位</span> <span class="label labelText">机架位</span>
<span class="text"> <span class="text">{{info.rack_position}}</span>
<el-input :size="size" v-model="info.rack_position" placeholder="机架位"></el-input>
</span>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">整机SN</span> <span class="label labelText">整机SN</span>
<span class="text"> <span class="text">{{info.device_sn}}</span>
<el-input :size="size" v-model="info.device_sn" placeholder="整机SN"></el-input>
</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">整机厂商</span> <span class="label labelText">整机厂商</span>
<span class="text"> <span class="text">{{info.device_manufacturer}}</span>
<el-input :size="size" v-model="info.device_manufacturer" placeholder="整机厂商"></el-input>
</span>
</el-col> </el-col>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">整机型号</span> <span class="label labelText">整机型号</span>
<span class="text"> <span class="text">{{info.device_model}}</span>
<el-input :size="size" v-model="info.device_model" placeholder="整机型号"></el-input>
</span>
</el-col> </el-col>
</el-row> </el-row>
</div>
</div>
<div class="cardItem">
<div class="title">部件信息</div>
<div class="cardBody">
<el-row> <el-row>
<el-col :span="8" :lg="6"> <el-col :span="8" :lg="6">
<span class="label labelText">部件SN/Sp</span> <span class="label labelText">部件SN/Sp</span>
@ -189,11 +184,13 @@ export default {
params:{ params:{
order_id:Number(this.$route.query.id) order_id:Number(this.$route.query.id)
}, },
info:{} info:{},
statusList:[]
} }
}, },
mounted() { mounted() {
this.getData(); this.getData();
this.getStatusList();
}, },
methods:{ methods:{
async getData() { async getData() {
@ -236,12 +233,18 @@ export default {
} }
this.saveLoading = false; this.saveLoading = false;
}, },
async getStatusList() {
const res = await this.$API.orders.order.maintenance.status.post();
if (res.code == 200) {
this.statusList = res.data;
}
},
} }
} }
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.btnView{ .btnView{
text-align: right; text-align: left;
} }
</style> </style>

View File

@ -1,5 +1,5 @@
<template> <template>
<el-container class="mainHeaderNoBorderPadding" v-loading="loading" element-loading-text="加载中..."> <el-container class="mainHeaderNoBorderPadding" v-loading="listLoading" element-loading-text="加载中...">
<el-main class="nopadding emailMiddle"> <el-main class="nopadding emailMiddle">
<div class="emailContent"> <div class="emailContent">
<div class="title">邮件名称{{emailParams.subject}}</div> <div class="title">邮件名称{{emailParams.subject}}</div>
@ -26,7 +26,7 @@
<div class="leftBox"> <div class="leftBox">
<el-icon style="font-size: 26px;"><sc-icon-Excel/></el-icon> <el-icon style="font-size: 26px;"><sc-icon-Excel/></el-icon>
</div> </div>
<div class="rightBox" @click="downFile(emailParams)"> <div class="rightBox" v-auth="'mailAttachmentDownload'" @click="downFile(emailParams)">
<div class="name">{{emailParams.file_name && emailParams.file_name.file}}</div> <div class="name">{{emailParams.file_name && emailParams.file_name.file}}</div>
<div class="size"> <div class="size">
{{emailParams.file_name && emailParams.file_name.size}} {{emailParams.file_name && emailParams.file_name.size}}
@ -52,6 +52,7 @@ export default {
params:{ params:{
id: this.$route.query.id, id: this.$route.query.id,
}, },
listLoading:false,
emailParams:[] emailParams:[]
} }
}, },
@ -65,6 +66,7 @@ export default {
async getData() { async getData() {
this.listLoading = true; this.listLoading = true;
const res = await this.$API.orders.order.mail.info.post(this.params); const res = await this.$API.orders.order.mail.info.post(this.params);
this.listLoading = false;
if(res.code == 200){ if(res.code == 200){
if(res.data && res.data.length>0){ if(res.data && res.data.length>0){
res.data.forEach(item=>{ res.data.forEach(item=>{
@ -73,7 +75,7 @@ export default {
} }
this.emailParams = res.data[0]; this.emailParams = res.data[0];
} }
this.listLoading = false;
}, },
stripHtmlTags(html) { stripHtmlTags(html) {
const div = document.createElement('div'); const div = document.createElement('div');

View File

@ -0,0 +1,91 @@
<template>
<el-dialog :title="titleMap[mode]" v-model="visible" :width="500" destroy-on-close @closed="$emit('closed')">
<el-form :model="form" :rules="rules" :disabled="mode=='show'" ref="dialogForm" label-width="100px">
<el-form-item label="物料MPN" prop="m_mpn">
<el-input v-model="form.m_mpn" placeholder="请输入物料MPN" clearable></el-input>
</el-form-item>
<el-form-item label="物料名称" prop="m_name">
<el-input v-model="form.m_name" placeholder="请输入物料名称" clearable></el-input>
</el-form-item>
<el-form-item label="物料成本价" prop="m_price">
<el-input v-model="form.m_price" placeholder="请输入物料成本价" clearable></el-input>
</el-form-item>
<el-form-item label="ERP实体ID" prop="f_id">
<el-input v-model="form.f_id" placeholder="请输入ERP实体ID" clearable></el-input>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible=false" > </el-button>
<el-button v-if="mode!='show'" type="primary" :loading="isSave" @click="submit()"> </el-button>
</template>
</el-dialog>
</template>
<script>
export default {
emits: ['success', 'closed'],
data() {
return {
mode: "add",
titleMap: {
add: '新增',
},
visible: false,
isSave: false,
//
form: {
m_mpn: "",
m_name:"",
m_price: "",
f_id: ""
},
//
rules: {
m_mpn: [
{required: true, message: '请输入物料MPN'}
],
m_name: [
{required: true, message: '请输入物料名称'}
],
m_price: [
{required: true, message: '请输入物料成本价'}
],
f_id: [
{required: true, message: '请输入ERP实体ID'}
],
},
}
},
mounted() {
},
methods: {
//
open(mode='add'){
this.mode = mode;
this.visible = true;
return this
},
//
submit(){
this.$refs.dialogForm.validate(async (valid) => {
if (valid) {
this.isSave = true;
const res = await this.$API.setup.material.add.post(this.form);
this.isSave = false;
if(res.code == 200){
this.$emit('success', this.form, this.mode)
this.visible = false;
this.$message.success("操作成功")
}
}
})
},
}
}
</script>
<style lang="scss" scoped>
</style>

View File

@ -4,14 +4,18 @@
<el-container> <el-container>
<el-main class="nopadding"> <el-main class="nopadding">
<el-menu class="menu mainMenu" :default-active="page"> <el-menu class="menu mainMenu" :default-active="page">
<el-menu-item-group v-for="group in menu" :key="group.groupName" :title="group.groupName"> <div v-for="group in menu" :key="group.groupName">
<el-menu-item v-for="item in group.list" :key="item.component" :index="item.component" @click="openPage"> <el-menu-item-group v-if="group.show" :title="group.groupName">
<el-icon v-if="item.icon"><component :is="item.icon"/></el-icon> <div v-for="item in group.list" :key="item.component">
<template #title> <el-menu-item v-authSetup="item.actions" :index="item.component" @click="openPage">
<span>{{item.title}}</span> <el-icon v-if="item.icon"><component :is="item.icon"/></el-icon>
</template> <template #title>
</el-menu-item> <span>{{item.title}}</span>
</el-menu-item-group> </template>
</el-menu-item>
</div>
</el-menu-item-group>
</div>
</el-menu> </el-menu>
</el-main> </el-main>
</el-container> </el-container>
@ -19,7 +23,7 @@
<el-main class="userMain userMainPadding_0"> <el-main class="userMain userMainPadding_0">
<Suspense> <Suspense>
<template #default> <template #default>
<component :is="page"/> <component :is="page" />
</template> </template>
<template #fallback> <template #fallback>
<el-skeleton :rows="3" /> <el-skeleton :rows="3" />
@ -34,46 +38,71 @@ import { defineAsyncComponent } from 'vue'
export default { export default {
components: { components: {
account: defineAsyncComponent(() => import('./setup/computerRoom')),
seting: defineAsyncComponent(() => import('./setup/computerRoom')),
pushSettings: defineAsyncComponent(() => import('./setup/computerRoom')), pushSettings: defineAsyncComponent(() => import('./setup/computerRoom')),
password: defineAsyncComponent(() => import('./setup/computerRoom')),
space: defineAsyncComponent(() => import('./setup/computerRoom')),
logs: defineAsyncComponent(() => import('./setup/computerRoom')),
upToEnterprise: defineAsyncComponent(() => import('./setup/computerRoom')), upToEnterprise: defineAsyncComponent(() => import('./setup/computerRoom')),
bind: defineAsyncComponent(() => import('./setup/computerRoom')), password: defineAsyncComponent(() => import('./setup/computerRoom')),
regularTime: defineAsyncComponent(() => import('./setup/regularTime')),
account: defineAsyncComponent(() => import('./setup/computerRoom')),
mail: defineAsyncComponent(() => import('./setup/mail')),
interface: defineAsyncComponent(() => import('./setup/interface')),
cost: defineAsyncComponent(() => import('./setup/cost')),
material: defineAsyncComponent(() => import('./setup/material')),
}, },
data() { data() {
return { return {
menu: [ menu: [
{ {
groupName: "账号设置", groupName: "数据类配置",
show:true,
list: [ list: [
{ {
icon: "sc-icon-MachineRoom", icon: "sc-icon-MachineRoom",
title: "机房配置", title: "机房配置",
component: "account" component: "account",
actions:'roomConfig',
}, },
{ {
icon: "sc-icon-CostAllocation", icon: "sc-icon-CostAllocation",
title: "费用配置", title: "费用配置",
component: "password" component: "password",
actions:'costConfig'
}, },
{ {
icon: "sc-icon-AgentMaintenance", icon: "sc-icon-CostSetup",
title: "维保代理商维护", title: "费用类别配置",
component: "pushSettings" component: "cost",
actions:'costCategoryAdd'
},
{
icon: "sc-icon-MaterialSetup",
title: "物料成本配置",
component: "material",
actions:'materialCostAdd'
},
{
icon: "sc-icon-RegularTime",
title: "系统定时任务维护",
component: "regularTime",
actions:'crontabAdd'
}, },
] ]
}, },
{ {
groupName: "数据管理", groupName: "接口类配置",
show:true,
list: [ list: [
{ {
icon: "sc-icon-DataSource", icon: "sc-icon-DataSource",
title: "数据源邮件设置", title: "数据源邮件设置",
component: "logs" component: "mail",
} actions:'mailConfigSet'
},
{
icon: "sc-icon-K3Api",
title: "K3接口配置",
component: "interface",
actions:'k3ApiConfigSet'
},
] ]
}, },
], ],
@ -103,6 +132,17 @@ export default {
created() { created() {
const userInfo = this.$TOOL.data.get('USER_INFO'); const userInfo = this.$TOOL.data.get('USER_INFO');
this.user.role = userInfo.user_roles && userInfo.user_roles.role_names.length>0?userInfo.user_roles.role_names[0]:''; this.user.role = userInfo.user_roles && userInfo.user_roles.role_names.length>0?userInfo.user_roles.role_names[0]:'';
const permissions = this.$TOOL.data.get("PERMISSIONS");
this.menu.forEach(item=>{
item.show = false;
item.list.forEach(em=>{
if(permissions.auth.indexOf(em.actions)!=-1){
item.show = true;
}
})
})
let pageView = this.menu.find(item=> item.show === true).list.find(em=> permissions.auth.indexOf(em.actions)!=-1);
this.page = pageView.component;
}, },
methods: { methods: {
openPage(item){ openPage(item){

View File

@ -1,5 +1,5 @@
<template> <template>
<el-container> <el-container class="mainBox">
<el-main class="nopadding"> <el-main class="nopadding">
<div class="searchMain"> <div class="searchMain">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch> <scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>

View File

@ -0,0 +1,115 @@
<template>
<el-container class="mainBox">
<el-main class="nopadding" v-loading="listLoading" element-loading-text="加载中...">
<div class="mailView">
<div class="headerBox ">
<div class="title">费用类别配置</div>
<div class="item" v-for="(item,index) in list" :key="index">
<span class="name">{{item.label}}</span>
<span class="inputView" v-if="item.cost">
<div class="inputItem" v-for="(em,ind) in item.cost" :key="ind">
<el-input type="text" v-model="em.price" :size="size" placeholder="费用"></el-input>
<el-input type="text" v-model="em.description" :size="size" placeholder="描述"></el-input>
</div>
</span>
</div>
</div>
<div class="btnView">
<el-button type="primary" :size="size" @click="save" :loading="loading">保存配置</el-button>
</div>
</div>
</el-main>
</el-container>
</template>
<script>
export default {
name: "cost",
data(){
return{
size:'small',
listLoading:false,
loading:false,
list:[],
}
},
mounted() {
this.getCost();
},
methods:{
async getCost() {
this.listLoading = true;
const res = await this.$API.setup.cost.list.post();
this.listLoading = false;
if(res.code == 200){
if(res.data && res.data.length>0){
res.data.forEach(item=>{
if(item.cost && item.cost.length ===0){
item.cost = [
{code:item.value,description:'',price:''}
]
}
})
}
this.list = res.data;
}
},
setList(){
let arr = new Array();
this.list.forEach(item=>{
item.cost.forEach(em=>{
if(em.price!=''){
arr.push({code:em.code,price:em.price,description:em.description})
}
})
})
return arr
},
async save() {
this.loading = true;
let params = {
cost:this.setList()
}
const res = await this.$API.setup.cost.set.post(params);
this.loading = false;
if (res.code == 200) {
this.$message.success('保存成功');
}
}
}
}
</script>
<style scoped lang="scss">
.mailView{
.headerBox{
border-bottom: 1px solid #e8e8e8;
.title{
font-weight: 500;
padding: 10px 0;
}
.item{
margin-bottom: 10px;
display: flex;
align-items: flex-start;
.name{
width: 90px;
display: inline-block;
text-align: left;
margin-right: 10px;
}
.inputItem{
margin-bottom: 5px;
}
}
}
.btnView{
padding: 15px 0;
}
::v-deep .el-input{
width: 280px;
margin-right: 20px;
margin-bottom: 5px;
}
}
</style>

View File

@ -0,0 +1,131 @@
<template>
<el-container class="mainBox">
<el-main class="nopadding" v-loading="listLoading" element-loading-text="加载中...">
<div class="mailView">
<div class="headerBox">
<div class="title">K3接口配置</div>
<div class="item">
<span class="name">账号ID</span>
<el-input type="text" v-model="inter.account_id" :size="size" placeholder="账号ID"></el-input>
</div>
<div class="item">
<span class="name">账户名称</span>
<el-input type="text" v-model="inter.account_name" :size="size" placeholder="账户名称"></el-input>
</div>
<div class="item">
<span class="name">语言</span>
<el-input type="text" v-model="inter.language" :size="size" placeholder="语言"></el-input>
</div>
<div class="item">
<span class="name">接口地址</span>
<el-input type="text" v-model="inter.api_url" :size="size" placeholder="接口地址"></el-input>
</div>
<div class="item">
<span class="name">APP_ID</span>
<el-input type="text" v-model="inter.app_id" :size="size" placeholder="APP_ID"></el-input>
</div>
<div class="item">
<span class="name">APP_SECRET</span>
<el-input type="text" v-model="inter.app_secret" :size="size" placeholder="APP_SECRET"></el-input>
</div>
</div>
<div class="headerBox mailMain">
<div class="title">接口同步</div>
<div class="item">
<el-switch v-model="inter.active_status" :size="size"></el-switch>
</div>
</div>
<div class="btnView">
<el-button type="primary" :size="size" @click="save" :loading="loading">保存配置</el-button>
</div>
</div>
</el-main>
</el-container>
</template>
<script>
export default {
name: "interface",
data(){
return{
size:'small',
loading:false,
listLoading:false,
inter:{
active_status:false,
account_id:'',
account_name:'',
app_id:'',
app_secret:'',
language:'',
api_url:'',
}
}
},
mounted() {
this.getMail();
},
methods:{
async getMail() {
this.listLoading = true;
const res = await this.$API.setup.k3.get.post();
this.listLoading = false;
if(res.code == 200){
if(res.data && res.data.account_id){
this.inter = res.data;
}
}
},
async save() {
this.loading = true;
const res = await this.$API.setup.k3.set.post(this.inter);
this.loading = false;
if (res.code == 200) {
this.$message.success('保存成功');
}
}
}
}
</script>
<style scoped lang="scss">
.mailView{
.headerBox{
.title{
font-weight: 500;
padding: 10px 0;
}
.item{
margin-bottom: 15px;
.name{
width: 90px;
display: inline-block;
text-align: left;
margin-right: 10px;
}
}
}
.mailMain{
border-top: 1px solid #e8e8e8;
padding: 5px 0;
display: flex;align-items: center;
.title{
font-weight: 500;
padding: 10px 0;
width: 100px;
}
.item{
margin-bottom: 0;
.name{
width: 100px;
display: inline-block;
text-align: left;
margin-right: 10px;
}
}
}
::v-deep .el-input{
width: 480px;
}
}
</style>

View File

@ -0,0 +1,122 @@
<template>
<el-container class="mainBox">
<el-main class="nopadding" v-loading="listLoading" element-loading-text="加载中...">
<div class="mailView">
<div class="headerBox">
<div class="title">自动维修邮件同步</div>
<div class="item">
<el-switch v-model="mail.active_status" :size="size"></el-switch>
</div>
</div>
<div class="mailMain">
<div class="title">获取数据源邮件地址</div>
<div class="item">
<span class="name">邮件别名</span>
<el-input type="text" v-model="mail.alias" :size="size" placeholder="邮件别名"></el-input>
</div>
<div class="item">
<span class="name">邮件地址</span>
<el-input type="text" v-model="mail.email" :size="size" placeholder="邮件地址"></el-input>
</div>
</div>
<div class="mailMain">
<div class="title">企业邮箱接口调用密钥</div>
<div class="item">
<span class="name">CLIENT_ID</span>
<el-input type="text" v-model="mail.client_id" :size="size" placeholder="请输入CLIENT_ID"></el-input>
</div>
<div class="item">
<span class="name">CLIENT_SECRET</span>
<el-input type="text" v-model="mail.client_secret" :size="size" placeholder="请输入CLIENT_SECRET"></el-input>
</div>
</div>
<div class="btnView">
<el-button type="primary" :size="size" @click="save" :loading="loading">保存配置</el-button>
</div>
</div>
</el-main>
</el-container>
</template>
<script>
export default {
name: "mail",
data(){
return{
size:'small',
listLoading:false,
loading:false,
mail:{
active_status:false,
alias:'',
email:'',
client_id:'',
client_secret:'',
}
}
},
mounted() {
this.getMail();
},
methods:{
async getMail() {
this.listLoading = true;
const res = await this.$API.setup.mail.get.post();
this.listLoading = false;
if(res.code == 200){
if(res.data && res.data.alias){
this.mail = res.data;
}
}
},
async save() {
this.loading = true;
const res = await this.$API.setup.mail.set.post(this.mail);
this.loading = false;
if (res.code == 200) {
this.$message.success('保存成功');
}
}
}
}
</script>
<style scoped lang="scss">
.mailView{
.headerBox{
.title{
font-weight: 500;
padding: 10px 0;
}
.item{
margin-bottom: 15px;
.name{
width: 50px;
display: inline-block;
text-align: left;
margin-right: 10px;
}
}
}
.mailMain{
border-top: 1px solid #e8e8e8;
padding: 5px 0;
.title{
font-weight: 500;
padding: 10px 0;
}
.item{
margin-bottom: 15px;
.name{
width: 100px;
display: inline-block;
text-align: left;
margin-right: 10px;
}
}
}
::v-deep .el-input{
width: 480px;
}
}
</style>

View File

@ -0,0 +1,145 @@
<template>
<el-container class="mainBox mainBoxHeaderNoBorder">
<el-main class="nopadding">
<el-header>
<div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增</el-button>
<scImport ref="scImport" :size="size" title="批量导入物料成本" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button type="primary" :size="size" plain @click="importFile">批量导入</el-button>
</template>
<template #download>
<div @click="importTemplate">下载导入模版</div>
</template>
</scImport>
</div>
<div class="right-panel">
</div>
</el-header>
<div class="searchMain">
<scSearch ref="scSearch" :searchList="searchList" @fetchSelectData="getSelectData"></scSearch>
<div class="searchItem searchBtn">
<el-button :size="size" type="primary" icon="el-icon-search" @click="upSearch">查询</el-button>
<el-button :size="size" type="info" icon="el-icon-RefreshRight" @click="reset">重置</el-button>
</div>
</div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" stripe :size="size" highlightCurrentRow>
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<el-table-column label="操作" fixed="right" align="center" width="160">
<template #default="scope">
<el-dropdown>
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="table_see(scope.row, 'see')" icon="sc-icon-See">查看</el-dropdown-item>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除配置</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-table-column>
</scTable>
</el-main>
</el-container>
<add-material v-if="dialog.save" ref="saveDialog" @success="handleSuccess" @closed="dialog.save=false"></add-material>
</template>
<script>
import addMaterial from "../components/addMaterial";
export default {
name: "material",
components:{
addMaterial
},
data(){
return{
size:'small',
dialog:{
show:false,
},
list:{
apiObj: this.$API.setup.material.list,
column:[]
},
params: {},
searchList:[
{name:'操作时间',type:'date',code:'created_at',show:true},
{name:'物料MPN',type:'text',code:['m_mpn'], placeholder:"请输入物料MPN",show:true},
{name:'物料名称',type:'text',code:['m_name'], placeholder:"请输入物料名称",show:true},
],
}
},
mounted() {
},
methods:{
getSelectData(item){
let {params} = item;
this.params = params;
},
//
importFile(){
this.$nextTick(()=>{
this.$refs.scImport.importFile();
})
},
async importTemplate() {
const res = await this.$API.setup.material.template.post();
const blob = new Blob([res]);
const text = new Date().getTime();
const eLink = document.createElement('a');
eLink.download = "物料导入模版_"+text+'.xlsx';
eLink.style.display = 'none';
eLink.href = URL.createObjectURL(blob);
document.body.appendChild(eLink);
eLink.click();
URL.revokeObjectURL(eLink.href);
document.body.removeChild(eLink);
},
async importUpload(params) {
const res = await this.$API.setup.material.import.post(params);
if(res.code == 200){
this.$message.success('上传成功,开始导入数据');
}
},
importSuccess(){
this.$refs.table.refresh()
},
add(){
this.dialog.save = true
this.$nextTick(() => {
this.$refs.saveDialog.open()
})
},
//
handleSuccess(){
this.$refs.table.refresh();
},
table_see(){
},
table_del(){
},
upSearch(){
this.$refs.table.upData(this.params);
},
reset(){
this.params = {};
this.$refs.scSearch.reload();
this.$refs.table.reload();
},
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,205 @@
<template>
<el-container class="mainBox">
<el-main class="nopadding">
<div class="searchMain">
<div class="title">任务信息</div>
<div class="formRow">
<el-form ref="form" :size="size" :model="form" label-width="100px">
<el-form-item label="任务名称" prop="name">
<el-select type="text" v-model="form.name" placeholder="请选择任务名称" style="width: 100%;" @visible-change="getNameList" @change="nameChange">
<el-option v-for="(item,index) in setMap.nameList" :key="index" :value="item.name" :label="item.name">
<span style="float: left">{{ item.name }}</span>
<span style="float: right;color: var(--el-text-color-secondary);">{{ item.memo }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="任务描述" prop="memo">
<el-input type="text" v-model="form.memo" placeholder="请输入任务描述" disabled></el-input>
</el-form-item>
<el-form-item label="定时任务表达式" prop="cron_expression">
<el-input type="text" v-model="form.cron_expression" @input="cronExpressionInput" placeholder="请输入定时任务表达式"></el-input>
</el-form-item>
<el-form-item label="表达式描述" prop="cron_expression_desc">
<el-input type="text" v-model="form.cron_expression_desc" placeholder="请输入表达式描述" disabled></el-input>
</el-form-item>
<el-form-item label="">
<el-button :size="size" type="primary" @click="save" :loading="isSave">保存配置</el-button>
</el-form-item>
</el-form>
<el-image class="img" src="https://dm-auto.oss-cn-shanghai.aliyuncs.com/xw_cloud/image/mingling.png" fit="contain"></el-image>
</div>
<div class="title">配置列表
<span class="tip">注意此配置由专业IT管理员操作无配置时以系统默认定时任务配置为准</span>
</div>
</div>
<scTable ref="table" :apiObj="list.apiObj" :column="list.column" stripe :size="size" highlightCurrentRow :hideDo="true" :hidePagination="true">
<sc-table-column label="序号" align="center" type="index"></sc-table-column>
<el-table-column width="200" label="任务名称" prop="name"></el-table-column>
<el-table-column width="200" label="任务描述" prop="memo"></el-table-column>
<el-table-column width="200" label="任务表达式" prop="cron_expression"></el-table-column>
<el-table-column label="表达式描述" prop="cron_expression_desc" show-overflow-tooltip></el-table-column>
<el-table-column width="100" label="状态" fixed="right" align="center">
<template #default="scope">
<el-switch :size="size" v-model="scope.row.active_status" @change="changeSwitch($event, scope.row)" :loading="scope.row.$switch_status" :active-value="true" :inactive-value="false"></el-switch>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" width="160">
<template #default="scope">
<el-dropdown>
<el-button class="noBorderBtn" icon="el-icon-more" :size="size"></el-button>
<template #dropdown>
<div v-auth="'crontabDelete'">
<el-dropdown-menu>
<el-dropdown-item @click="table_del(scope.row, 'delete')" icon="sc-icon-Delete">删除配置</el-dropdown-item>
</el-dropdown-menu>
</div>
</template>
</el-dropdown>
</template>
</el-table-column>
</scTable>
</el-main>
</el-container>
</template>
<script>
export default {
name: "regularTime",
data(){
return{
size:'small',
isSave:false,
setMap:{
nameList:[]
},
form:{
memo:"",
name:"",
cron_expression:"",
cron_expression_desc:"",
callback:{
command:""
},
type:""
},
list:{
apiObj:this.$API.setup.crontab.list,
column:[]
}
}
},
mounted() {
},
methods:{
async getNameList() {
const res = await this.$API.setup.crontab.configList.get()
if(res.code == 200){
this.setMap.nameList = res.data;
}
},
nameChange(e){
this.setMap.nameList.forEach(item=>{
if(item.name == e){
this.form.memo = item.memo;
this.form.cron_expression = item.cron_expression;
this.form.cron_expression_desc = item.cron_expression_desc;
this.form.callback = item.callback;
this.form.task_type = item.type;
this.setDescribe();
}
})
},
cronExpressionInput(){
this.setDescribe();
},
//
async setDescribe() {
let params = {
cron_expression: this.form.cron_expression
}
const res = await this.$API.setup.crontab.describe.post(params);
if(res.code == 200){
this.form.cron_expression_desc = res.data.cron_expression;
}
},
save(){
this.$refs.form.validate(async (valid) => {
if (valid) {
this.isSave = true;
const res = await this.$API.setup.crontab.add.post(this.form);
this.isSave = false;
if(res.code == 200){
this.$refs.table.reload();
this.visible = false;
this.$message.success("操作成功")
}
}
})
},
table_del(row){
this.$confirm(`确定删除 ${row.name} 吗?`, '提示', {
type: 'warning'
}).then(async () => {
const reqData = {id: row.id};
const res = await this.$API.setup.crontab.delete.post(reqData);
if(res.code == 200){
this.$refs.table.refresh()
this.$message.success("删除成功")
}
}).catch(()=>{})
},
//
changeSwitch(val, row) {
row.$switch_yx = true;
setTimeout(async () => {
let params = {
id: row.id,
status: row.active_status,
};
const res = await this.$API.setup.crontab.status.post(params);
if(res.code !=200){
row.active_status = !row.active_status;
}
delete row.$switch_status;
delete row.$switch_yx;
}, 500);
},
}
}
</script>
<style scoped lang="scss">
.el-main.nopadding .searchMain{
align-items: flex-start;
.title{
font-weight: 500;
padding: 0 0 5px 0;
font-size: 13px;
display: flex;
align-items: center;
.tip{
margin-left: 10px;
color: var(--el-color-warning);
font-weight: 400;
font-size: 12px;
}
}
}
.searchMain{
flex-direction: column;
justify-content: flex-start;
.el-input{
width: 400px;
}
}
.formRow{
display: flex;
.img{
margin-left: 30px;
height: 165px;
border-radius: 8px;
}
}
</style>

View File

@ -2,20 +2,7 @@
<el-container class="mainBox mainHeaderNoBorderPadding"> <el-container class="mainBox mainHeaderNoBorderPadding">
<el-header> <el-header>
<div class="left-panel"> <div class="left-panel">
<el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增工单</el-button> <el-button type="primary" :size="size" icon="el-icon-plus" @click="add">新增BOM</el-button>
<scImport ref="scImport" :size="size" title="批量导入维保工单" @parentParams="importUpload" @importSuccess="importSuccess">
<template #header>
<el-button v-auth="'organizationImport'" type="primary" :size="size" plain @click="importFile">批量导入</el-button>
</template>
<template #download>
<div v-auth="'companyImportTemplate'" @click="importTemplate">下载导入模版</div>
</template>
</scImport>
</div>
<div class="right-panel">
<scExport :size="size" @exportData="exportData" @updateShow="exportChangeShow" :show="exportShow" type="11">
<el-button :size="size" icon="sc-icon-Download" @click="exportData">下载</el-button>
</scExport>
</div> </div>
</el-header> </el-header>
<el-main class="nopadding"> <el-main class="nopadding">
@ -80,23 +67,36 @@ export default {
show: false, show: false,
}, },
list: { list: {
apiObj: {}, apiObj: this.$API.setup.bom.list,
column: [], column: [],
}, },
selection: [], selection: [],
exportShow:false, exportShow:false,
searchShow:false, searchShow:false,
searchList:[ searchList:[
{name:'生产日期',type:'date',code:'activation_date'}, {name:'创建时间',type:'date',code:'created_at',show: true},
{name:'反厂日期',type:'date',code:'activation_date'}, {name:'更新时间',type:'date',code:'updated_at',show: true},
{name:'处理时间',type:'date',code:'activation_date'}, {name:'BOM版本',type:'text',code:'bom_version',placeholder:"请输入BOM版本",show:true},
{name:'客户名称',type:'multiple',code:'id', data:[], placeholder:"请选择公司名称",show:false}, {name:'BOM简称',type:'text',code:'bom_abbreviation',placeholder:"请输入BOM简称",show:false},
{name:'状态',type:'select',code:'active_status', data:[], placeholder:"请选择状态",show:false}, {name:'BOM分类',type:'text',code:['bom_classification'],placeholder:"请输入BOM分类",isOpen:true,show:false},
{name:'工单号',type:'text',code:['mobile'],placeholder:"请输入手机号",isOpen:true,show:false}, {name:'BOM用途',type:'text',code:['bom_purpose'],placeholder:"请输入BOM用途",isOpen:true,show:false},
{name:'邮件地址',type:'text',code:['email'],placeholder:"请输入邮箱地址",isOpen:true,show:false}, {name:'父项物料编码',type:'text',code:['parent_material_code'],placeholder:"请输入父项物料编码",isOpen:true,show:false},
{name:'公司地址',type:'text',code:['address'],placeholder:"请输入公司地址",isOpen:true,show:false}, {name:'父项物料名称',type:'text',code:['parent_material_name'],placeholder:"请输入父项物料名称",isOpen:true,show:false},
{name:'负责人',type:'text',code:['owner'],placeholder:"请输入负责人",isOpen:true,show:false}, {name:'父项物料单位',type:'text',code:['parent_material_unit'],placeholder:"请输入父项物料单位",isOpen:true,show:false},
{name:'关键字',type:'text',code:['domain','name'],keyword:true,show:true}, {name:'子项物料编码',type:'text',code:['child_material_code'],placeholder:"请输入子项物料编码",isOpen:true,show:false},
{name:'子项物料名称',type:'text',code:['child_material_name'],placeholder:"请输入子项物料名称",isOpen:true,show:false},
{name:'子项物料单位',type:'text',code:['child_material_unit'],placeholder:"请输入子项物料单位",isOpen:true,show:false},
{name:'次项',type:'text',code:['item_sequence'],placeholder:"请输入次项",isOpen:true,show:false},
{name:'子项类型',type:'text',code:['child_material_type'],placeholder:"请输入子项类型",isOpen:true,show:false},
{name:'用量分母',type:'text',code:['usage_numerator'],placeholder:"请输入用量分母",isOpen:true,show:false},
{name:'用量分子',type:'text',code:['usage_denominator'],placeholder:"请输入用量分子",isOpen:true,show:false},
{name:'创建组织编码',type:'text',code:['create_org_code'],placeholder:"请输入创建组织编码",isOpen:true,show:false},
{name:'创建组织名称',type:'text',code:['create_org_name'],placeholder:"请输入创建组织名称",isOpen:true,show:false},
{name:'使用组织编码',type:'text',code:['use_org_code'],placeholder:"请输入使用组织编码",isOpen:true,show:false},
{name:'使用组织名称',type:'text',code:['use_org_name'],placeholder:"请输入使用组织名称",isOpen:true,show:false},
{name:'单据状态',type:'text',code:['document_status'],placeholder:"请输入单据状态",isOpen:true,show:false},
{name:'禁用状态',type:'text',code:['disable_status'],placeholder:"请输入禁用状态",isOpen:true,show:false},
{name:'关键字',type:'text',code:['bom_abbreviation'],keyword:true,show:true},
], ],
params: {}, params: {},
} }

View File

@ -85,7 +85,7 @@ export default {
res.data.forEach(item=>{ res.data.forEach(item=>{
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
let check = em.meta.data_permission.filter((li)=>li.checked).length; let check = em.meta.data_permission.filter((li)=>li.checked).length;
let ed = em.meta.data_permission.length; let ed = em.meta.data_permission.length;
em.isCheck = check>0 && check != ed?true:false; em.isCheck = check>0 && check != ed?true:false;
@ -109,7 +109,7 @@ export default {
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
em.checked = e; em.checked = e;
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
em.meta.data_permission.forEach((li)=>{ em.meta.data_permission.forEach((li)=>{
li.checked = e; li.checked = e;
}) })
@ -130,7 +130,7 @@ export default {
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
em.checked = e.checked; em.checked = e.checked;
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
em.meta.data_permission.forEach((li)=>{ em.meta.data_permission.forEach((li)=>{
li.checked = e.checked; li.checked = e.checked;
}) })
@ -152,7 +152,7 @@ export default {
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
if(em.id == e.id){ if(em.id == e.id){
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
em.meta.data_permission.forEach((li)=>{ em.meta.data_permission.forEach((li)=>{
li.checked = e.checked; li.checked = e.checked;
}) })
@ -197,7 +197,7 @@ export default {
const res = await this.$API.system.company.moduleAdd.post(params); const res = await this.$API.system.company.moduleAdd.post(params);
if(res.code == 200){ if(res.code == 200){
this.$message.success("授权成功"); this.$message.success("授权成功");
this.getPermission(); await this.getPermission();
} }
}, },
setList(){ setList(){
@ -215,7 +215,7 @@ export default {
if(em.checked || em.isCheck){ if(em.checked || em.isCheck){
obj.menu_permission.push(em.meta.code); obj.menu_permission.push(em.meta.code);
} }
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{ let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{
let obj = { let obj = {
actions:u.actions, actions:u.actions,
@ -227,6 +227,13 @@ export default {
obj.data_permission.push({[em.meta.code]:list}) obj.data_permission.push({[em.meta.code]:list})
} }
} }
if(em.children && em.children.length>0){
em.children.forEach(daList=>{
if(em.checked || em.isCheck && daList.meta.hidden){
obj.menu_permission.push(daList.meta.code);
}
})
}
}) })
} }
}) })

View File

@ -0,0 +1,204 @@
<template>
<!-- 自定义表格 -->
<el-scrollbar height="100%">
<div class="customTable">
<div class="tableBody" v-for="(item,index) in list" :key="index">
<div class="trTitle">
<div class="name">
{{item.category_name}}
</div>
</div>
<div class="childView">
<div class="tr" v-for="(em,ind) in item.set_info" :key="ind">
<div class="td module">
<div class="textName">敏感数据权限</div>
<div class="viewBox">
<el-checkbox v-model="em.is_view" :size="size">{{em.resource_name}}</el-checkbox>
</div>
</div>
<div class="td module">
<div class="textName">操作权限</div>
<div class="viewBox viewBtn">
<el-checkbox v-model="em.action.view" :size="size"><span class="checkName">查看</span></el-checkbox>
<el-checkbox v-model="em.action.edit" :size="size"><span class="checkName">编辑</span></el-checkbox>
</div>
</div>
</div>
</div>
</div>
</div>
</el-scrollbar>
</template>
<script>
export default {
data() {
return {
size: "default",
list:[]
};
},
props:{
data:{
type:Array
}
},
watch:{
data(val){
if(val && val.length>0){
this.list = JSON.parse(JSON.stringify(val));
}
}
},
computed:{
},
methods:{
}
};
</script>
<style lang="scss" scoped>
.module {
display: flex;
align-items: center;
justify-content: flex-start;
}
.check {
flex-basis: 60px;
display: flex;
align-items: center;
justify-content: center;
}
.menu {
flex: 1;
}
.authority {
flex-basis: 80px;
text-align: center;
}
.customTable {
border: 1px solid var(--el-border-color-light);
border-bottom: 0;
}
.tableBodyNull {
border-top: 1px solid var(--el-border-color-light);
}
.tableBody {
display: flex;
}
.childView{
display: flex;
flex-direction: column;
flex: 1;
}
.tableBody .trTitle {
background: #f5f7fa;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 10px;
border-bottom: 1px solid var(--el-border-color-light);
border-right: 1px solid var(--el-border-color-light);
flex-basis: 140px;
.name {
flex: 1;
}
.coseBtn {
flex-basis: 40px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
.coseBtnIcon {
width: 14px;
color: var(--el-color-primary);
}
}
}
.tableBody .tr {
border-bottom: 1px solid var(--el-border-color-light);
.td {
padding: 0 10px;
border-bottom: 1px solid var(--el-border-color-light);
display: flex;
align-items: stretch;
.textName{
flex-basis: 110px;
display: flex;
align-items: center;
border-right: 1px solid var(--el-border-color-light);
}
.viewBox{
padding: 0 0 0 10px;
}
.viewBtn{
.checkName{
width: 60px;
display: inline-block;
}
}
.nextTd {
border-bottom: 1px solid var(--el-border-color-light);
flex: 1;
}
.nextTd:last-child {
border-bottom: 0;
}
}
.td:first-child {
border-left: 0;
}
.td:last-child{
border-bottom: 0;
}
.tdChild {
flex: 1;
padding: 0;
border-left: 1px solid var(--el-border-color-light);
.tdName:first-child {
border-left: 0;
}
.tdName {
border-left: 1px solid var(--el-border-color-light);
padding: 0 10px;
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-wrap: wrap;
.boxName {
display: flex;
align-items: center;
margin-right: 20px;
width: 120px;
.name {
width: 100px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
display: block;
text-align: left;
}
}
}
}
}
</style>

View File

@ -52,29 +52,31 @@ export default {
}, },
watch:{ watch:{
data(val){ data(val){
val.forEach(item=>{ if(val && val.length>0){
item.show = true; val.forEach(item=>{
if(item.children){ item.show = true;
item.children.forEach(em=>{ if(item.children){
if(em.meta.data_permission){ item.children.forEach(em=>{
let check = em.meta.data_permission.filter((li)=>li.checked).length; if(em.meta.data_permission && em.meta.data_permission.length>0){
let ed = em.meta.data_permission.length; let check = em.meta.data_permission.filter((li)=>li.checked).length;
em.isCheck = check>0 && check != ed?true:false; let ed = em.meta.data_permission.length;
if(ed>0){ em.isCheck = check>0 && check != ed?true:false;
em.checked = check>0 && check== ed?true:false; if(ed>0){
em.checked = check>0 && check== ed?true:false;
}
} }
} })
}) let check = item.children.filter((em)=>em.checked).length;
let check = item.children.filter((em)=>em.checked).length; let isCheck = item.children.filter((em)=>em.isCheck).length;
let isCheck = item.children.filter((em)=>em.isCheck).length; let ed = item.children.length;
let ed = item.children.length;
item.isCheck = (check>0 && check != ed) || (isCheck>0 && check != ed)?true:false; item.isCheck = (check>0 && check != ed) || (isCheck>0 && check != ed)?true:false;
item.checked = check>0 && check== ed?true:false; item.checked = check>0 && check== ed?true:false;
} }
}) })
this.list = JSON.parse(JSON.stringify(val)); this.list = JSON.parse(JSON.stringify(val));
}
} }
}, },
computed:{ computed:{
@ -87,7 +89,7 @@ export default {
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
em.checked = e.checked; em.checked = e.checked;
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
em.meta.data_permission.forEach((li)=>{ em.meta.data_permission.forEach((li)=>{
li.checked = e.checked; li.checked = e.checked;
}) })
@ -109,7 +111,7 @@ export default {
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
if(em.id == e.id){ if(em.id == e.id){
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
em.meta.data_permission.forEach((li)=>{ em.meta.data_permission.forEach((li)=>{
li.checked = e.checked; li.checked = e.checked;
}) })
@ -181,7 +183,7 @@ export default {
border-top:1px solid var(--el-border-color-light); border-top:1px solid var(--el-border-color-light);
} }
.tableBody .trTitle{ .tableBody .trTitle{
background: var(--el-bg-color-overlay); background: #f5f7fa;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;

View File

@ -17,7 +17,8 @@
<el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input> <el-input placeholder="输入关键字进行过滤" :size="size" v-model="groupFilterText" clearable></el-input>
</el-header> </el-header>
<el-main class="treeMain nopadding"> <el-main class="treeMain nopadding">
<el-tree ref="group" class="menu" node-key="id" :data="group" :default-checked-keys="roleCheckList" :current-node-key="role_id" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @check-change="groupChange" @node-click="groupClick"> <!-- :default-checked-keys="roleCheckList" @check-change="groupChange"-->
<el-tree ref="group" class="menu" node-key="id" :data="group" :current-node-key="role_id" :highlight-current="true" :expand-on-click-node="false" :filter-node-method="groupFilterNode" @node-click="groupClick">
<template #default="{ node, data }"> <template #default="{ node, data }">
<span class="custom-tree-node"> <span class="custom-tree-node">
<span>{{ node.label }}</span> <span>{{ node.label }}</span>
@ -36,19 +37,22 @@
<div class="btnPot" v-if="activeNum==0"> <div class="btnPot" v-if="activeNum==0">
<el-button type="primary" v-auth="'addRoleAuth'" plain :size="size" :loading="isSave" @click="submit">保存权限</el-button> <el-button type="primary" v-auth="'addRoleAuth'" plain :size="size" :loading="isSave" @click="submit">保存权限</el-button>
</div> </div>
<div class="btnPot" v-if="activeNum==1">
<el-button type="primary" v-auth="'addDataPermission'" plain :size="size" :loading="isDataSave" @click="submitPermissions">保存权限</el-button>
</div>
<div class="btnPot" v-if="activeNum==2"> <div class="btnPot" v-if="activeNum==2">
<el-button type="danger" v-auth="'roleRemovedUsers'" plain :size="size" @click="deleteMember">移除成员</el-button> <el-button type="danger" v-auth="'roleRemovedUsers'" plain :size="size" @click="deleteMember">移除成员</el-button>
<el-button type="primary" v-auth="'roleAddedUsers'" plain :size="size" @click="getDeptTree">添加成员</el-button> <el-button type="primary" v-auth="'roleAddedUsers'" plain :size="size" @click="getDeptTree">添加成员</el-button>
</div> </div>
<el-tabs class="role_tabs" tab-position="top" @tab-change="activeClick"> <el-tabs class="role_tabs" tab-position="top" @tab-change="activeClick">
<el-tab-pane label="功能权限"> <el-tab-pane label="功能权限">
<dataTree ref="dataTree" :data="menu.list"/> <dataTree ref="dataTree" v-loading="dataTreeLoading" element-loading-text="加载中..." :data="menu.list"/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="数据权限"> <el-tab-pane label="数据权限">
<dataPermissions ref="dataPermissions" v-loading="dataPermissionsLoading" element-loading-text="加载中..." :data="dataPermissions.list"/>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="角色成员"> <el-tab-pane label="角色成员">
<members ref="members" :data="roleUser.list" /> <members ref="members" v-loading="roleUserLoading" element-loading-text="加载中..." :data="roleUser.list" />
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-main> </el-main>
@ -105,15 +109,16 @@
import saveDialog from './save'; import saveDialog from './save';
import permissionDialog from './permission'; import permissionDialog from './permission';
import dataTree from "./dataTree"; import dataTree from "./dataTree";
import dataPermissions from "./dataPermissions";
import members from "./members"; import members from "./members";
import treeUser from "./tree" import treeUser from "./tree"
export default { export default {
name: 'role',
components: { components: {
saveDialog, saveDialog,
permissionDialog, permissionDialog,
dataTree, dataTree,
dataPermissions,
members, members,
treeUser treeUser
}, },
@ -140,12 +145,19 @@
}, },
isSave:false, isSave:false,
isDataSave:false,
activeNum:0, activeNum:0,
roleCheckList:[], roleCheckList:[],
role_id:"", role_id:0,
dataTreeLoading:false,
menu: { menu: {
list: [], list: [],
}, },
dataPermissionsLoading:false,
dataPermissions:{
list:[],
},
roleUserLoading:false,
roleUser:{ roleUser:{
list:[] list:[]
}, },
@ -161,18 +173,21 @@
this.getGroup(true); this.getGroup(true);
}, },
methods: { methods: {
async getGroup(flag = false){ async getGroup(flag = true){
this.showGroupLoading = true; this.showGroupLoading = true;
const res = await this.$API.system.role.list.get(); const res = await this.$API.system.role.list.get();
this.showGroupLoading = false;
if(res.code == 200){ if(res.code == 200){
this.group = res.data.rows; this.group = res.data.rows;
this.role_id = res.data.rows && res.data.rows.length>0?res.data.rows[0].id:""; if(res.data.rows && res.data.rows.length>0){
if(flag){ this.role_id = res.data.rows[0].id
await this.getMenu(); if(flag){
await this.getRoleList(); await this.getMenu(res.data.rows[0].id);
await this.getRoleList(res.data.rows[0].id);
await this.getDataList(res.data.rows[0].id);
}
} }
} }
this.showGroupLoading = false;
}, },
// //
add(){ add(){
@ -268,19 +283,20 @@
return data.label.indexOf(value) !== -1; return data.label.indexOf(value) !== -1;
}, },
// //
groupChange(data,isCheck){ // groupChange(data,isCheck){
let list = JSON.parse(JSON.stringify(this.roleCheckList)); // let list = JSON.parse(JSON.stringify(this.roleCheckList));
if(isCheck){ // if(isCheck){
this.roleCheckList.push(data.id); // this.roleCheckList.push(data.id);
}else{ // }else{
this.roleCheckList = list.filter(em=>em != data.id); // this.roleCheckList = list.filter(em=>em != data.id);
} // }
}, // },
// //
groupClick(data){ groupClick(data){
this.role_id = data.id; this.role_id = data.id;
this.getMenu(); this.getMenu();
this.getRoleList(); this.getRoleList();
this.getDataList();
}, },
// //
@ -311,7 +327,7 @@
if(em.checked || em.isCheck){ if(em.checked || em.isCheck){
obj.menu_permission.push(em.meta.code); obj.menu_permission.push(em.meta.code);
} }
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{ let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{
let obj = { let obj = {
actions:u.actions, actions:u.actions,
@ -323,6 +339,41 @@
obj.data_permission.push({[em.meta.code]:list}) obj.data_permission.push({[em.meta.code]:list})
} }
} }
if(em.children && em.children.length>0){
em.children.forEach(daList=>{
if(em.checked || em.isCheck && daList.meta.hidden){
obj.menu_permission.push(daList.meta.code);
}
})
}
})
}
})
return obj
},
//
submitPermissions(){
this.isDataSave = true;
const params = this.setDataList(this.$refs.dataPermissions.list);
setTimeout(async ()=>{
const res = await this.$API.system.role.dataAuth.post(params);
if(res.code === 200){
this.$message.success("授权成功");
await this.getDataList();
}
this.isDataSave = false;
})
},
setDataList(list){
let obj = {
role_id:this.role_id,
resource_info:[],
}
list.forEach(item=>{
if(item.set_info && item.set_info.length>0){
item.set_info.forEach(em=>{
obj.resource_info.push(em)
}) })
} }
}) })
@ -336,23 +387,44 @@
activeClick(e){ activeClick(e){
this.activeNum = e; this.activeNum = e;
}, },
async getMenu() { async getMenu(id) {
let params = { if(this.role_id!="" || id){
role_id: this.role_id, let params = {
}; role_id:id?id:this.role_id,
const res = await this.$API.system.role.roleMenu.post(params); };
this.menu.list = res.data; this.dataTreeLoading = true;
}, const res = await this.$API.system.role.roleMenu.post(params);
async getRoleList() { this.dataTreeLoading = false;
let params = { this.menu.list = res.data;
role_id: this.role_id, }
};
const res = await this.$API.system.role.roleUser.post(params);
this.roleUser.list = res.data;
this.userCheckList = res.data;
this.userIds = res.data.map(item=>item.id);
}, },
async getDataList(id) {
if (this.role_id != "" || id) {
let params = {
role_id:id?id:this.role_id,
};
this.dataPermissionsLoading = true;
const res = await this.$API.system.role.dataMenu.post(params);
this.dataPermissionsLoading = false;
this.dataPermissions.list = res.data;
}
},
async getRoleList(id) {
if(this.role_id!="" || id){
let params = {
role_id:id?id:this.role_id,
};
this.roleUserLoading = true;
const res = await this.$API.system.role.roleUser.post(params);
this.roleUserLoading = false;
this.roleUser.list = res.data;
this.userCheckList = res.data;
if(res.data && res.data.length>0){
this.userIds = res.data.map(item=>item.id);
}
}
},
async getDeptTree() { async getDeptTree() {
this.memberShow = true; this.memberShow = true;
const res = await this.$API.system.role.tree.post(); const res = await this.$API.system.role.tree.post();

View File

@ -45,10 +45,12 @@ export default {
}, },
watch:{ watch:{
data(val){ data(val){
val.forEach(item=>{ if(val){
item.checked = false; val.forEach(item=>{
}) item.checked = false;
this.list = JSON.parse(JSON.stringify(val)); })
this.list = JSON.parse(JSON.stringify(val));
}
}, },
}, },
computed:{ computed:{

View File

@ -143,7 +143,7 @@ export default {
if(em.checked || em.isCheck){ if(em.checked || em.isCheck){
obj.menu_permission.push(em.meta.code); obj.menu_permission.push(em.meta.code);
} }
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{ let list = em.meta.data_permission.filter(e=>e.checked).map(u=>{
let obj = { let obj = {
actions:u.actions, actions:u.actions,
@ -177,7 +177,9 @@ export default {
const res = await this.$API.system.role.roleUser.post(params); const res = await this.$API.system.role.roleUser.post(params);
this.roleUser.list = res.data; this.roleUser.list = res.data;
this.userCheckList = res.data; this.userCheckList = res.data;
this.userIds = res.data.map(item=>item.id); if(res.data && res.data.length>0){
this.userIds = res.data.map(item=>item.id);
}
}, },
async getDeptTree() { async getDeptTree() {
this.memberShow = true; this.memberShow = true;

View File

@ -87,7 +87,6 @@
</el-dropdown> </el-dropdown>
</template> </template>
</el-table-column> </el-table-column>
</scTable> </scTable>
</el-main> </el-main>
</el-container> </el-container>

View File

@ -96,7 +96,7 @@ export default {
res.data.menu.forEach(item=>{ res.data.menu.forEach(item=>{
if(item.children){ if(item.children){
item.children.forEach(em=>{ item.children.forEach(em=>{
if(em.meta.data_permission){ if(em.meta.data_permission && em.meta.data_permission.length>0){
let check = em.meta.data_permission.filter((li)=>li.checked).length; let check = em.meta.data_permission.filter((li)=>li.checked).length;
let ed = em.meta.data_permission.length; let ed = em.meta.data_permission.length;
em.isCheck = check>0 && check != ed?true:false; em.isCheck = check>0 && check != ed?true:false;

View File

@ -69,16 +69,16 @@ export default {
exportShow:false, exportShow:false,
searchShow:false, searchShow:false,
searchList:[ searchList:[
{name:'生产日期',type:'date',code:'activation_date',show:true}, {name:'实体主键',type:'text',code:['f_id'],placeholder:"请输入实体主键",isOpen:true,show:false},
{name:'反厂日期',type:'date',code:'activation_date',show:true}, {name:'单据编号',type:'text',code:['f_bill_no'],placeholder:"请输入单据编号",isOpen:true,show:false},
{name:'处理时间',type:'date',code:'activation_date',show:true}, {name:'日期',type:'date',code:'f_date',show:true},
{name:'客户名称',type:'multiple',code:'id', data:[], placeholder:"请选择公司名称",show:false}, {name:'收货方地址',type:'text',code:['f_receive_address'],placeholder:"请输入收货方地址",isOpen:true,show:false},
{name:'状态',type:'select',code:'active_status', data:[], placeholder:"请选择状态",show:false}, {name:'客户名称',type:'select',code:['f_customer_id'],data:[],placeholder:"请选择客户名称",isOpen:true,show:false},
{name:'工单号',type:'text',code:['mobile'],placeholder:"请输入手机号",isOpen:true,show:false}, {name:'物料编码',type:'text',code:['f_material_id'],placeholder:"请输入物料编码",isOpen:true,show:false},
{name:'邮件地址',type:'text',code:['email'],placeholder:"请输入邮箱地址",isOpen:true,show:false}, {name:'实发数量',type:'text',code:['f_real_qty'],placeholder:"请输入实发数量",isOpen:true,show:false},
{name:'公司地址',type:'text',code:['address'],placeholder:"请输入公司地址",isOpen:true,show:false}, {name:'应发数量',type:'text',code:['f_must_qty'],placeholder:"请输入应发数量",isOpen:true,show:false},
{name:'负责人',type:'text',code:['owner'],placeholder:"请输入负责人",isOpen:true,show:false}, {name:'创建日期',type:'date',code:'created_at',show:true},
{name:'关键字',type:'text',code:['domain','name'],keyword:true,show:true}, {name:'关键字',type:'text',code:['name'],keyword:true,show:true},
], ],
params: {}, params: {},
} }
@ -92,39 +92,30 @@ export default {
} }
}) })
}, },
getSelectData(item){ async getSelectData(item) {
let {data,params} = item; let {data, params} = item;
this.params = params; this.params = params;
if(data.code == "id"){ let searchParams = this.$TOOL.objCopy(params);
this.getCompanyList(data,params) searchParams.field = ""
}else if(data.code == "active_status"){ if (typeof data.code === 'string') {
this.getStatusList(data,params); searchParams.field = data.code;
} else {
searchParams.field = data.code[0];
} }
}, if (data.type == 'select') {
const res = await this.$API.orders.order.out.field.post(searchParams);
async getCompanyList(data,params) { if (res.code == 200) {
const res = await this.$API.system.company.select.post(params); if (res.data && res.data.length > 0) {
if(res.data && res.data.length>0){ res.data.forEach(item => {
res.data.forEach(item=>{ item.label = item[data.code];
item.label = item.full_name; })
})
}
if(res.code == 200){
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
} }
}) this.searchList.forEach(item => {
} if (item.code == data.code) {
}, item.data = res.data;
async getStatusList(data,params) { }
const res = await this.$API.oss.status.post(params); })
if(res.code == 200){ }
this.searchList.forEach(item=>{
if(item.code == data.code){
item.data = res.data;
}
})
} }
}, },

View File

@ -69,20 +69,26 @@
</div> </div>
</div> </div>
<div class="title">使用Passkey</div> <div class="title">使用Passkey</div>
<div class="boxView boxViewCenter"> <div class="boxView passKeyView boxViewCenter">
<div class="nameBox passkeyView"> <div class="nameBox passkeyView">
<el-button type="primary" :size="size" @click="createPasskey">添加passKey</el-button> <!-- <el-button type="primary" :size="size" @click="createPasskey">添加passKey</el-button>-->
<div class="msg">借助 Passkey你可以使用自己的指纹面孔屏锁设置或实体安全密钥登录你的账号请仅在你自有的设备上设置 Passkey</div> <div class="msg">借助 Passkey你可以使用自己的指纹面孔屏锁设置或实体安全密钥登录你的账号请仅在你自有的设备上设置 Passkey</div>
</div> </div>
</div> </div>
<div class="boxView boxViewCenter"> <div class="boxView passKeyView boxViewCenter">
<div class="itemMain"> <div class="itemMain">
<div class="boxCom" v-for="item in passKeyList" :key="item"> <div class="boxCom" v-for="item in passKeyList" :key="item">
<i class="icon"><sc-icon-Fingerprint /></i> <i class="icon"><sc-icon-Fingerprint /></i>
<span class="name"> <span class="name">
<el-input v-model="item.alias" @change="passKeyAlias(item)" placeholder="请输入"></el-input> <el-input class="nameInput" v-model="item.alias" @change="passKeyAlias(item)" placeholder="请输入"></el-input>
</span> </span>
</div> </div>
<div class="boxCom" @click="createPasskey">
<span class="iconBack">
<i class="icon"><el-icon-Plus/></i>
</span>
<span class="name">添加</span>
</div>
</div> </div>
</div> </div>
</div> </div>
@ -339,8 +345,9 @@ export default {
authenticatorAttachment: credential.authenticatorAttachment, authenticatorAttachment: credential.authenticatorAttachment,
} }
const res = await this.$API.system.user.verifyResponse.post(params); const res = await this.$API.system.user.verifyResponse.post(params);
console.log(res,55) if(res.code == 200){
// this.$message.success(''); await this.getPassKeyList();
}
}, },
bufferToBase64URL(buffer) { bufferToBase64URL(buffer) {
return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer))) return btoa(String.fromCharCode.apply(null, new Uint8Array(buffer)))
@ -395,6 +402,71 @@ export default {
} }
} }
} }
.passKeyView{
width: 100%;
.itemMain{
width: 100%;
display: flex;
flex-direction: row;
align-items: flex-start;
margin-top: 10px;
.boxCom{
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width: 80px;
cursor: pointer;
.icon{
text-align: center;
width: 40px;
height: 40px;
}
.iconBack{
width: 40px;
height: 40px;
border-radius: 50%;
background: #E9E9E9;
font-size: 14px;
display: flow;
align-items: center;
justify-content: center;
padding: 10px;
.icon{
width: 14px;height: 14px;font-size: 12px;
}
}
.name{
height: 30px;
display: flex;
align-items: center;
justify-content: center;
font-size: 14px;
color: var(--el-input-text-color);
}
.nameInput{
text-align: center;
}
.el-input{
text-align: center;
border: 0;
::v-deep .el-input__wrapper{
border: 0;
padding: 0;
box-shadow:none;
}
::v-deep .el-input__inner{
text-align: center;
}
}
.el-input:hover ::v-deep .el-input__wrapper{
//border-bottom: 1px solid var(--el-input-border-color);
border-radius: 0;
}
}
}
}
.boxViewCenter{ .boxViewCenter{
align-items: center; align-items: center;
.leftBox{ .leftBox{

9546
yarn.lock

File diff suppressed because it is too large Load Diff