优化列表的展示
This commit is contained in:
commit
284177f33e
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 |
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
13
src/assets/icons/ConfirmOrder.vue
Normal file
13
src/assets/icons/ConfirmOrder.vue
Normal 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>
|
||||||
13
src/assets/icons/CostSetup.vue
Normal file
13
src/assets/icons/CostSetup.vue
Normal 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>
|
||||||
13
src/assets/icons/JbDelete.vue
Normal file
13
src/assets/icons/JbDelete.vue
Normal 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>
|
||||||
13
src/assets/icons/K3Api.vue
Normal file
13
src/assets/icons/K3Api.vue
Normal 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>
|
||||||
13
src/assets/icons/MaintenanceSetup.vue
Normal file
13
src/assets/icons/MaintenanceSetup.vue
Normal 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>
|
||||||
13
src/assets/icons/MaterialSetup.vue
Normal file
13
src/assets/icons/MaterialSetup.vue
Normal 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>
|
||||||
17
src/assets/icons/RegularTime.vue
Normal file
17
src/assets/icons/RegularTime.vue
Normal 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>
|
||||||
@ -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'
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
16
src/directives/authSetup.js
Normal file
16
src/directives/authSetup.js
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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>-->
|
||||||
|
|||||||
@ -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'),
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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{
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/views/login/bindDingTalk.vue
Normal file
32
src/views/login/bindDingTalk.vue
Normal 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>
|
||||||
32
src/views/login/bindWechat.vue
Normal file
32
src/views/login/bindWechat.vue
Normal 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>
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
87
src/views/order/orderList/components/flow.vue
Normal file
87
src/views/order/orderList/components/flow.vue
Normal 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>
|
||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
234
src/views/order/orderPlan/confirmOrder.vue
Normal file
234
src/views/order/orderPlan/confirmOrder.vue
Normal 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>
|
||||||
@ -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);
|
||||||
},
|
},
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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');
|
||||||
|
|||||||
91
src/views/setting/advanced/components/addMaterial.vue
Normal file
91
src/views/setting/advanced/components/addMaterial.vue
Normal 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>
|
||||||
@ -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){
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
115
src/views/setting/advanced/setup/cost.vue
Normal file
115
src/views/setting/advanced/setup/cost.vue
Normal 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>
|
||||||
131
src/views/setting/advanced/setup/interface.vue
Normal file
131
src/views/setting/advanced/setup/interface.vue
Normal 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>
|
||||||
122
src/views/setting/advanced/setup/mail.vue
Normal file
122
src/views/setting/advanced/setup/mail.vue
Normal 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>
|
||||||
145
src/views/setting/advanced/setup/material.vue
Normal file
145
src/views/setting/advanced/setup/material.vue
Normal 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>
|
||||||
205
src/views/setting/advanced/setup/regularTime.vue
Normal file
205
src/views/setting/advanced/setup/regularTime.vue
Normal 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>
|
||||||
@ -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: {},
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
204
src/views/setting/role/dataPermissions.vue
Normal file
204
src/views/setting/role/dataPermissions.vue
Normal 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>
|
||||||
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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:{
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -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{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user