Merge branch 'develop' of https://e.coding.net/ctcdevteam/hberp/hberp into develop

This commit is contained in:
caoqianming 2022-04-27 15:37:12 +08:00
commit 50dda78a92
10 changed files with 120 additions and 73 deletions

View File

@ -66,12 +66,10 @@ export default {
let hasToken = getToken(); let hasToken = getToken();
if (hasToken) { if (hasToken) {
this.refreshCountData(); this.refreshCountData();
this.refreshtoken();
this.$store.dispatch("user/getCount", {}); this.$store.dispatch("user/getCount", {});
}else{ }else{
this.$router.push({name:'login'}) this.$router.push({name:'login'})
} }
// console.log('$store.state.user.refresh:'+this.$store.state.user.refresh);
}, },
methods: { methods: {
refreshCountData(){ refreshCountData(){
@ -84,18 +82,6 @@ export default {
},0) },0)
},50000) },50000)
}, },
refreshtoken(){
let refresh = getRefresh();
/* debugger;
console.log('refresh:'+refresh);
debugger;*/
// let refresh = this.$store.state.user.refresh;
this.timer = window.setInterval(() => {
if (refresh) {
this.$store.dispatch("user/refreshToken", refresh);
}
},3540000)
},
handleClickOutside() { handleClickOutside() {
this.$store.dispatch('app/closeSideBar', { withoutAnimation: false }) this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
}, },

View File

@ -1,14 +1,14 @@
import { login, logout, getInfo } from '@/api/user' import { login, logout, getInfo } from '@/api/user'
import { getCount } from '@/api/workflow' import { getCount } from '@/api/workflow'
import { refreshToken } from '@/api/user' import { refreshToken } from '@/api/user'
import { getToken, setToken, removeToken,getRefresh, setRefresh } from '@/utils/auth' import { getToken, setToken, removeToken} from '@/utils/auth'
import { resetRouter } from '@/router' import { resetRouter } from '@/router'
const getDefaultState = () => { const getDefaultState = () => {
return { return {
token: getToken(), token: getToken(),
name: '', name: '',
refresh: getRefresh(), refresh: '',
avatar: '', avatar: '',
count: {}, count: {},
perms: [] perms: []
@ -50,8 +50,8 @@ const actions = {
const { data } = response; const { data } = response;
commit('SET_TOKEN', data.access); commit('SET_TOKEN', data.access);
commit('SET_REFRESH', data.refresh); commit('SET_REFRESH', data.refresh);
sessionStorage.setItem('refresh',data.refresh);
setToken(data.access); setToken(data.access);
setRefresh(data.refresh);
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)
@ -69,14 +69,11 @@ const actions = {
this.$router.push({name:'login',params:{}}); this.$router.push({name:'login',params:{}});
reject('验证失败,重新登陆.'); reject('验证失败,重新登陆.');
} }
const { perms, name, avatar } = data; const { perms, name, avatar } = data;
// perms must be a non-empty array // perms must be a non-empty array
if (!perms || perms.length <= 0) { if (!perms || perms.length <= 0) {
reject('没有任何权限!') reject('没有任何权限!')
} }
commit('SET_PERMS', perms); commit('SET_PERMS', perms);
commit('SET_NAME', name); commit('SET_NAME', name);
commit('SET_AVATAR', avatar); commit('SET_AVATAR', avatar);
@ -129,10 +126,9 @@ const actions = {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
refreshToken({refresh:ref}).then((res) => { refreshToken({refresh:ref}).then((res) => {
const { data } = res; const { data } = res;
removeToken();
commit('SET_TOKEN', data.access); commit('SET_TOKEN', data.access);
// commit('SET_REFRESH', data.refresh);
setToken(data.access); setToken(data.access);
// setRefresh(data.refresh);
resolve() resolve()
}).catch(error => { }).catch(error => {
reject(error) reject(error)

View File

@ -1,7 +1,6 @@
import Cookies from 'js-cookie' import Cookies from 'js-cookie'
const TokenKey = 'token'; const TokenKey = 'token';
const refreshKey = 'refresh';
export function getToken() { export function getToken() {
return Cookies.get(TokenKey) return Cookies.get(TokenKey)
@ -14,15 +13,4 @@ export function setToken(token) {
export function removeToken() { export function removeToken() {
return Cookies.remove(TokenKey) return Cookies.remove(TokenKey)
} }
export function getRefresh() {
return Cookies.get(refreshKey)
}
export function setRefresh(refresh) {
return Cookies.set(refreshKey, refresh)
}
export function removeRefresh() {
return Cookies.remove(refreshKey)
}

View File

@ -1,8 +1,11 @@
import axios from 'axios' import axios from 'axios'
import { MessageBox, Message } from 'element-ui' import { MessageBox, Message } from 'element-ui'
import store from '@/store' import store from '@/store'
import { getToken } from '@/utils/auth' import { refreshToken } from '@/api/user'
import { getToken,setToken,removeToken } from '@/utils/auth'
let isRefreshing = false;
//重试队列
let requests = [];
// create an axios instance // create an axios instance
const service = axios.create({ const service = axios.create({
baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
@ -56,7 +59,7 @@ service.interceptors.response.use(
* You can also judge the status by HTTP Status Code * You can also judge the status by HTTP Status Code
*/ */
response => { response => {
const res = response.data const res = response.data;
if(res.code>=200 && res.code<400){ if(res.code>=200 && res.code<400){
return res return res
} }
@ -68,7 +71,40 @@ service.interceptors.response.use(
duration: 3 * 1000 duration: 3 * 1000
}) })
}else{ }else{
MessageBox.confirm('认证失败,请重新登陆.', '确认退出', { if (!isRefreshing) {
isRefreshing = true;
//调用刷新token的接口
return refreshToken({refresh: sessionStorage.getItem('refresh')}).then(res => {
const token = res.data.access;
// 替换token
removeToken();
setToken(token);
response.headers.Authorization = 'Bearer ' + token;
// token 刷新后将数组的方法重新执行
requests.forEach((cb) => cb(token));
requests = []; // 重新请求完清空
return service(response.config)
}).catch(err => {
//跳到登录页
removeToken();
store.dispatch('user/logout').then(() => {
location.reload()
});
return Promise.reject(err)
}).finally(() => {
isRefreshing = false
})
}else {
// 返回未执行 resolve 的 Promise
return new Promise(resolve => {
// 用函数形式将 resolve 存入,等待刷新后再执行
requests.push(token => {
response.headers.Authorization = 'Bearer ' + token;
resolve(service(response.config))
})
})
}
/* MessageBox.confirm(',.', '退', {
confirmButtonText: '重新登陆', confirmButtonText: '重新登陆',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'
@ -76,9 +112,8 @@ service.interceptors.response.use(
store.dispatch('user/logout').then(() => { store.dispatch('user/logout').then(() => {
location.reload() location.reload()
}) })
}) })*/
} }
} else if (res.code >= 400) { } else if (res.code >= 400) {
if(res.msg.indexOf('请调整位置')>-1){ if(res.msg.indexOf('请调整位置')>-1){
return; return;

View File

@ -78,13 +78,13 @@
width="120px" width="120px"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<el-link <!--<el-link
v-if="checkPermission(['echeckrecord_update'])" v-if="checkPermission(['echeckrecord_update'])"
type="primary" type="primary"
@click="handleEdit(scope)" @click="handleEdit(scope)"
> >
编辑 编辑
</el-link> </el-link>-->
<el-link <el-link
v-if="checkPermission(['echeckrecord_delete'])" v-if="checkPermission(['echeckrecord_delete'])"
type="danger" type="danger"

View File

@ -99,7 +99,7 @@
</el-link> </el-link>
<el-link <el-link
v-if=" v-if="
checkPermission(['fifo_hear']) && scope.row.is_audited == false checkPermission(['fifo_audit']) && scope.row.is_audited == false
" "
type="primary" type="primary"
@click="handleAudit(scope)" @click="handleAudit(scope)"

View File

@ -133,7 +133,6 @@
<el-form-item label="规格型号"> <el-form-item label="规格型号">
<el-input v-model="material.specification" placeholder="规格型号"/> <el-input v-model="material.specification" placeholder="规格型号"/>
</el-form-item> </el-form-item>
<el-form-item label="计量单位"> <el-form-item label="计量单位">
<el-select style="width: 100%" v-model="material.unit" placeholder="请选择"> <el-select style="width: 100%" v-model="material.unit" placeholder="请选择">
<el-option <el-option
@ -145,7 +144,6 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="物料类别"> <el-form-item label="物料类别">
<el-select style="width: 100%" v-model="material.type" placeholder="请选择物料类别"> <el-select style="width: 100%" v-model="material.type" placeholder="请选择物料类别">
<el-option <el-option
@ -166,6 +164,21 @@
<el-form-item label="排序"> <el-form-item label="排序">
<el-input-number style="width: 100%;" v-model="material.sort_str" :step="1" :min="0" step-strictly placeholder="排序"></el-input-number> <el-input-number style="width: 100%;" v-model="material.sort_str" :step="1" :min="0" step-strictly placeholder="排序"></el-input-number>
</el-form-item> </el-form-item>
<el-form-item label="详情文件">
<el-upload
ref="upload"
:action="upUrl"
:on-preview="handlePreview"
:on-success="handleUpSuccess"
:on-remove="handleRemove"
:headers="upHeaders"
:file-list="fileList"
:limit="1"
accept=".pdf"
>
<el-button size="small" type="primary">上传文件</el-button>
</el-upload>
</el-form-item>
</el-form> </el-form>
<div style="text-align: right"> <div style="text-align: right">
<el-button type="danger" @click="dialogVisible = false">取消</el-button> <el-button type="danger" @click="dialogVisible = false">取消</el-button>
@ -184,9 +197,8 @@
getProcessList getProcessList
} from "@/api/mtm"; } from "@/api/mtm";
import checkPermission from "@/utils/permission"; import checkPermission from "@/utils/permission";
import {genTree} from "@/utils"; import {genTree} from "@/utils";
import {upUrl, upHeaders} from "@/api/file";
import Pagination from "@/components/Pagination"; // secondary package based on el-pagination import Pagination from "@/components/Pagination"; // secondary package based on el-pagination
const defaultmaterial = { const defaultmaterial = {
name: null, name: null,
@ -198,6 +210,7 @@
sort_str: null, sort_str: null,
count_safe: 0, count_safe: 0,
processes: [], processes: [],
file:null,
}; };
export default { export default {
components: {Pagination}, components: {Pagination},
@ -207,6 +220,9 @@
materialList: { materialList: {
count: 0, count: 0,
}, },
upHeaders: upHeaders(),
upUrl: upUrl(),
fileList: [],
processOptions: [], processOptions: [],
options_: { options_: {
// "1": '成品', // "1": '成品',
@ -281,6 +297,19 @@
}, },
methods: { methods: {
checkPermission, checkPermission,
handlePreview(file) {
if ("url" in file) {
window.open(file.url);
} else {
window.open(file.response.data.path);
}
},
handleUpSuccess(res, file, filelist) {
this.material.file = res.data.id;
},
handleRemove(file, filelist) {
this.material.file = null;
},
//物料详情 //物料详情
handledetail(scope){ handledetail(scope){
this.$router.push({name: "MaterialDetail", params: { id: scope.row.id,type: scope.row.type }, }) this.$router.push({name: "MaterialDetail", params: { id: scope.row.id,type: scope.row.type }, })
@ -331,14 +360,31 @@
this.material = Object.assign({}, defaultmaterial); this.material = Object.assign({}, defaultmaterial);
this.dialogType = "new"; this.dialogType = "new";
this.dialogVisible = true; this.dialogVisible = true;
if (this.material.file) {
this.fileList = [
{
name: this.process.instruction_.name,
url: this.process.instruction_.path,
},
];
}
this.$nextTick(() => { this.$nextTick(() => {
this.$refs["Form"].clearValidate(); this.$refs["Form"].clearValidate();
}); });
}, },
handleEdit(scope) { handleEdit(scope) {
this.fileList = [];
this.material = Object.assign({}, scope.row); // copy obj this.material = Object.assign({}, scope.row); // copy obj
this.dialogType = "edit"; this.dialogType = "edit";
this.dialogVisible = true; this.dialogVisible = true;
if (this.material.file) {
this.fileList = [
{
name: this.material.file_.name,
url: this.material.file_.path,
},
];
}
this.$nextTick(() => { this.$nextTick(() => {
this.$refs["Form"].clearValidate(); this.$refs["Form"].clearValidate();
}); });
@ -367,6 +413,7 @@
if (res.code >= 200) { if (res.code >= 200) {
this.getList(); this.getList();
this.dialogVisible = false; this.dialogVisible = false;
this.fileList = [];
this.$message.success("成功"); this.$message.success("成功");
} }
}); });
@ -375,6 +422,7 @@
if (res.code >= 200) { if (res.code >= 200) {
this.getList(); this.getList();
this.dialogVisible = false; this.dialogVisible = false;
this.fileList = [];
this.$message.success("成功"); this.$message.success("成功");
} }
}); });

View File

@ -9,23 +9,25 @@
border border
> >
<el-descriptions-item label="物料编号"> <el-descriptions-item label="物料编号">
{{ materialdetail.number }}</el-descriptions-item {{ materialdetail.number }}
> </el-descriptions-item>
<el-descriptions-item label="物料名称"> <el-descriptions-item label="物料名称">
{{ materialdetail.name }}</el-descriptions-item {{ materialdetail.name }}
> </el-descriptions-item>
<el-descriptions-item label="规格型号" :span="2"> <el-descriptions-item label="规格型号" :span="2">
{{ materialdetail.specification }}</el-descriptions-item {{ materialdetail.specification }}
> </el-descriptions-item>
<el-descriptions-item label="计量单位"> <el-descriptions-item label="计量单位">
{{ materialdetail.unit }} {{ materialdetail.unit }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="数量"> <el-descriptions-item label="数量">
{{ materialdetail.count }}</el-descriptions-item {{ materialdetail.count }}
> </el-descriptions-item>
<el-descriptions-item label="文件">
<el-link :href="materialdetail.file_.path">{{materialdetail.file_.name}}</el-link>
</el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-card> </el-card>
<el-tabs v-model="activeName" type="card"> <el-tabs v-model="activeName" type="card">
<el-tab-pane <el-tab-pane
label="供应商" label="供应商"
@ -47,30 +49,19 @@
<template slot-scope="scope">{{ scope.row.batch }}</template> <template slot-scope="scope">{{ scope.row.batch }}</template>
</el-table-column> </el-table-column>
<el-table-column label="物料名称"> <el-table-column label="物料名称">
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.material_.name}}</template>
scope.row.material_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="规格型号"> <el-table-column label="规格型号">
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.material_.specification}}</template>
scope.row.material_.specification
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="物料编号"> <el-table-column label="物料编号">
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.material_.number}}</template>
scope.row.material_.number
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="仓库名称"> <el-table-column label="仓库名称">
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.warehouse_.name}}</template>
scope.row.warehouse_.name
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="仓库编号"> <el-table-column label="仓库编号">
<template slot-scope="scope">{{ <template slot-scope="scope">{{scope.row.warehouse_.number}}</template>
scope.row.warehouse_.number
}}</template>
</el-table-column> </el-table-column>
<el-table-column label="物料总存量"> <el-table-column label="物料总存量">
<template slot-scope="scope">{{ scope.row.count }}</template> <template slot-scope="scope">{{ scope.row.count }}</template>

View File

@ -175,6 +175,9 @@
<el-table-column label="计量单位" min-width="100"> <el-table-column label="计量单位" min-width="100">
<template slot-scope="scope">{{ scope.row.material_.unit }}</template> <template slot-scope="scope">{{ scope.row.material_.unit }}</template>
</el-table-column> </el-table-column>
<el-table-column label="规格" min-width="100">
<template slot-scope="scope">{{ scope.row.material_.specification }}</template>
</el-table-column>
<el-table-column label="单位消耗量" min-width="100"> <el-table-column label="单位消耗量" min-width="100">
<template slot-scope="scope">{{ scope.row.count }}</template> <template slot-scope="scope">{{ scope.row.count }}</template>
</el-table-column> </el-table-column>

View File

@ -72,7 +72,7 @@
订单项 订单项
</el-link> </el-link>
<el-link <el-link
v-if="checkPermission(['puorder_hear']) &&scope.row.is_audited == false" v-if="checkPermission(['puorder_audit']) &&scope.row.is_audited == false"
type="primary" type="primary"
@click="handleAudit(scope)" @click="handleAudit(scope)"
> >