Merge pull request 'master' (#378) from master into prod
Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/378
This commit is contained in:
@@ -15,3 +15,17 @@ export const uploadFileList = (data) => {
|
|||||||
data: data
|
data: data
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
export const searchImplementationFileList = (params) => {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/mosr/attachment/implementation/list',
|
||||||
|
method: "get",
|
||||||
|
params: params
|
||||||
|
});
|
||||||
|
};
|
||||||
|
export const switchAttachmentState = (data) => {
|
||||||
|
return request({
|
||||||
|
url: '/workflow/mosr/project/filing/attachment/switch',
|
||||||
|
method: "post",
|
||||||
|
data
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<slot name="pre"></slot>
|
<slot name="pre"></slot>
|
||||||
<div class="user-audit">
|
<div class="user-audit">
|
||||||
<div class="circle-user">
|
<div class="circle-user">
|
||||||
<Tooltip :content="user.name" placement="bottom-start" width="45"/>
|
<Tooltip :content="user.name" placement="bottom-start" width="45px"/>
|
||||||
<div v-if="user.icon"
|
<div v-if="user.icon"
|
||||||
class="el-timeline-item__node" :style="{
|
class="el-timeline-item__node" :style="{
|
||||||
backgroundColor: user.color
|
backgroundColor: user.color
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ const props = defineProps({
|
|||||||
},
|
},
|
||||||
uploadState: {
|
uploadState: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: false
|
||||||
},
|
},
|
||||||
loading: {
|
loading: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
placement="bottom-start"
|
placement="bottom-start"
|
||||||
:disabled="isShow"
|
:disabled="isShow"
|
||||||
>
|
>
|
||||||
<div :class="lines?'content-lines':'content'" :style="{width: props.width+'px'}" @mouseover="isShowTooltip">
|
<div :class="lines?'content-lines':'content'" :style="{width: props.width}" @mouseover="isShowTooltip">
|
||||||
<span ref="contentRef">
|
<span ref="contentRef">
|
||||||
<slot name="content">{{ props.content }}</slot>
|
<slot name="content">{{ props.content }}</slot>
|
||||||
</span>
|
</span>
|
||||||
@@ -17,10 +17,12 @@ const props = defineProps({
|
|||||||
content: {
|
content: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: ''
|
||||||
}, width: {
|
},
|
||||||
|
width: {
|
||||||
type: String,
|
type: String,
|
||||||
default: ''
|
default: '100%'
|
||||||
}, lines: {
|
},
|
||||||
|
lines: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false
|
default: false
|
||||||
}
|
}
|
||||||
@@ -40,6 +42,7 @@ const isShowTooltip = () => {
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
.content-lines{
|
.content-lines{
|
||||||
|
word-break:break-all;
|
||||||
overflow:hidden;
|
overflow:hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
|
|||||||
@@ -17,7 +17,10 @@
|
|||||||
<ul>
|
<ul>
|
||||||
<li>主次账号切换</li>
|
<li>主次账号切换</li>
|
||||||
<li class="avatar-li" v-for="item in accountList" @click="accountChange(item.userId)">
|
<li class="avatar-li" v-for="item in accountList" @click="accountChange(item.userId)">
|
||||||
<el-avatar><span>{{ item.nickName }}</span></el-avatar>
|
<el-badge :value="item.taskCount" v-if="item.taskCount!==0">
|
||||||
|
<el-avatar>{{ item.nickName }}</el-avatar>
|
||||||
|
</el-badge>
|
||||||
|
<el-avatar v-else>{{ item.nickName }}</el-avatar>
|
||||||
<div class="right-li">
|
<div class="right-li">
|
||||||
<div class="name-line">
|
<div class="name-line">
|
||||||
<span v-if="item.accountType==='0'" class="zhu">主</span>
|
<span v-if="item.accountType==='0'" class="zhu">主</span>
|
||||||
@@ -66,6 +69,7 @@ import {useTagsView} from '@/stores/tagsview';
|
|||||||
import {getUserAccount} from "@/api/user/user";
|
import {getUserAccount} from "@/api/user/user";
|
||||||
import {switchAccount} from "@/api/login";
|
import {switchAccount} from "@/api/login";
|
||||||
import {setToken} from "../../utils/auth";
|
import {setToken} from "../../utils/auth";
|
||||||
|
import {ElNotification} from "element-plus";
|
||||||
|
|
||||||
const authStore = useAuthStore()
|
const authStore = useAuthStore()
|
||||||
const permisstionStore = usePermisstionStroe()
|
const permisstionStore = usePermisstionStroe()
|
||||||
@@ -89,7 +93,13 @@ const nullBlockClick = () => {
|
|||||||
}
|
}
|
||||||
const handleVisitedP = () => {
|
const handleVisitedP = () => {
|
||||||
getUserAccount().then(res => {
|
getUserAccount().then(res => {
|
||||||
console.log(res)
|
if (res.code !== 1000) {
|
||||||
|
ElNotification({
|
||||||
|
title: '提示',
|
||||||
|
message: res.msg,
|
||||||
|
type: res.code === 1000 ? 'success' : 'error'
|
||||||
|
})
|
||||||
|
}
|
||||||
accountList.value = res.data
|
accountList.value = res.data
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
visitedP.value = !visitedP.value
|
visitedP.value = !visitedP.value
|
||||||
@@ -129,13 +139,23 @@ const handleLogout = () => {
|
|||||||
:deep(.el-avatar--circle) {
|
:deep(.el-avatar--circle) {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
line-height: 40px;
|
line-height: 40px;
|
||||||
margin-right: 10px;
|
margin-right: 14px;
|
||||||
background-color: #8a7243;
|
background-color: #8a7243;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
:deep(.el-badge) {
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
:deep(.el-badge__content.is-fixed) {
|
||||||
|
position: absolute;
|
||||||
|
right: 26px;
|
||||||
|
top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.navbar {
|
.navbar {
|
||||||
height: 65px;
|
height: 65px;
|
||||||
padding: 0 15px 0 0;
|
padding: 0 15px 0 0;
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ const router = useRouter()
|
|||||||
const activeName = ref('50')
|
const activeName = ref('50')
|
||||||
const attachment = ref({})
|
const attachment = ref({})
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const uploadState = ref(true)
|
const uploadState = ref(false)
|
||||||
const fileList = ref([])
|
const fileList = ref([])
|
||||||
const projectId = ref(route.query.id)
|
const projectId = ref(route.query.id)
|
||||||
const requirementId = ref(route.query.requirementId)
|
const requirementId = ref(route.query.requirementId)
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
|
||||||
import {toThousands} from '@/utils/changePrice.js'
|
import {toThousands} from '@/utils/changePrice.js'
|
||||||
|
import {switchAttachmentState} from "@/api/project-manage/attachment";
|
||||||
|
import {ElMessageBox} from "element-plus";
|
||||||
|
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const shortcuts = [
|
const shortcuts = [
|
||||||
@@ -244,6 +246,12 @@ const tableConfig = reactive({
|
|||||||
if (buttons.has("edit")) {
|
if (buttons.has("edit")) {
|
||||||
btn.push({label: '编辑', prem: ['project:management:filing:conclusion'], func: () => handleEdit(row), type: 'primary'})
|
btn.push({label: '编辑', prem: ['project:management:filing:conclusion'], func: () => handleEdit(row), type: 'primary'})
|
||||||
}
|
}
|
||||||
|
if (buttons.has("openFileSwitch")) {
|
||||||
|
btn.push({label: '开启上传', prem: ['project:management:filing:conclusion'], func: () => handleOpenUpload(row,true), type: 'primary'})
|
||||||
|
}
|
||||||
|
if (buttons.has("closeFileSwitch")) {
|
||||||
|
btn.push({label: '关闭上传', prem: ['project:management:filing:conclusion'], func: () => handleOpenUpload(row,false), type: 'primary'})
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<div style={{width: '100%'}}>
|
<div style={{width: '100%'}}>
|
||||||
{
|
{
|
||||||
@@ -316,4 +324,19 @@ const handleEdit = (row) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
const handleOpenUpload=(row,flag)=>{
|
||||||
|
ElMessageBox.confirm(`是否确认${flag?'开启':'关闭'}上传文件?`, '提示', {
|
||||||
|
confirmButtonText: '确定',
|
||||||
|
cancelButtonText: '取消',
|
||||||
|
type: 'warning'
|
||||||
|
}).then(() => {
|
||||||
|
let params={
|
||||||
|
open: flag,
|
||||||
|
projectId: row.projectId
|
||||||
|
}
|
||||||
|
switchAttachmentState(params).then(res=>{
|
||||||
|
tableIns.value.refresh()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -29,15 +29,14 @@
|
|||||||
|
|
||||||
<script setup lang="jsx">
|
<script setup lang="jsx">
|
||||||
import {downloadFile} from "@/api/project-demand";
|
import {downloadFile} from "@/api/project-demand";
|
||||||
import {searchFileList} from "@/api/project-manage/attachment.js";
|
|
||||||
import {getTags} from "@/api/project-manage";
|
import {getTags} from "@/api/project-manage";
|
||||||
import {ElLoading, ElNotification} from "element-plus";
|
import {ElNotification} from "element-plus";
|
||||||
import {computed, ref} from "vue";
|
|
||||||
import {getBaseInfoApi} from "@/components/steps/api";
|
import {getBaseInfoApi} from "@/components/steps/api";
|
||||||
|
import {searchImplementationFileList} from "@/api/project-manage/attachment";
|
||||||
|
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
const uploadState = ref(true)
|
const uploadState = ref(false)
|
||||||
const attachment = reactive({
|
const attachment = reactive({
|
||||||
tag: ''
|
tag: ''
|
||||||
})
|
})
|
||||||
@@ -140,7 +139,7 @@ const handleSearch = () => {
|
|||||||
})
|
})
|
||||||
params.tag = attachment.tag
|
params.tag = attachment.tag
|
||||||
}
|
}
|
||||||
searchFileList(params).then(res => {
|
searchImplementationFileList(params).then(res => {
|
||||||
showTable.value = false
|
showTable.value = false
|
||||||
if (res.code === 1000) {
|
if (res.code === 1000) {
|
||||||
otherFileList.value = res.data.fileList
|
otherFileList.value = res.data.fileList
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ const getInfo = async () => {
|
|||||||
const {code, data, msg} = await getPhaseDetail(projectId)
|
const {code, data, msg} = await getPhaseDetail(projectId)
|
||||||
if (code === 1000) {
|
if (code === 1000) {
|
||||||
summaryData.value = data;
|
summaryData.value = data;
|
||||||
copyName.value= data.formData.userInfoList.map(item=>item.name).join(',')
|
copyName.value= data.formData.userInfoList?.map(item=>item.name).join(',')
|
||||||
loading.value = false
|
loading.value = false
|
||||||
processStore.setDesign(data)
|
processStore.setDesign(data)
|
||||||
processStore.runningList.value = data.runningList;
|
processStore.runningList.value = data.runningList;
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
size="large"
|
size="large"
|
||||||
placement="top">
|
placement="top">
|
||||||
<el-card>
|
<el-card>
|
||||||
|
<div>
|
||||||
|
当前节点: {{ operation.operationName }}
|
||||||
|
</div>
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div v-for="(user,index) in operation.userInfo" :key="index" class="avatar_name">
|
<div v-for="(user,index) in operation.userInfo" :key="index" class="avatar_name">
|
||||||
<div>
|
<div>
|
||||||
@@ -17,15 +20,15 @@
|
|||||||
<div>
|
<div>
|
||||||
<div class="remark">{{ operation.remark }}</div>
|
<div class="remark">{{ operation.remark }}</div>
|
||||||
<div>
|
<div>
|
||||||
<div>{{ operation.operationName }}:</div>
|
<div>审批人:</div>
|
||||||
<div>{{ user.name }}</div>
|
<div>{{ user.name }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="user.auditOpinion">
|
<div v-if="user.auditOpinion">
|
||||||
<div style="margin-bottom: 10px;color: #909399">{{ user.operationTime }}</div>
|
<div style="margin-bottom: 10px;color: #909399">{{ user.operationTime }}</div>
|
||||||
<Tooltip :content="user.auditOpinion" placement="bottom-start" width="140" :lines="true"/>
|
<el-text v-text="user.auditOpinion" style="word-break: break-all">
|
||||||
|
</el-text>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@@ -270,9 +273,10 @@ init()
|
|||||||
|
|
||||||
> div:first-child {
|
> div:first-child {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 200px;
|
|
||||||
|
|
||||||
> span {
|
> span {
|
||||||
|
width: 100px;
|
||||||
color: #2a99ff;
|
color: #2a99ff;
|
||||||
margin-left: 10px;
|
margin-left: 10px;
|
||||||
margin-right: 20px;
|
margin-right: 20px;
|
||||||
@@ -307,12 +311,13 @@ init()
|
|||||||
right: 1px;
|
right: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
//.username {
|
.username {
|
||||||
// //width: 90px;
|
//width: 90px;
|
||||||
// margin-top: 10px;
|
margin-top: 10px;
|
||||||
// background: #f5f5f5;
|
background: #f5f5f5;
|
||||||
// padding: 5px;
|
padding: 12px;
|
||||||
//
|
overflow: hidden;
|
||||||
|
|
||||||
//.el-tooltip__trigger {
|
//.el-tooltip__trigger {
|
||||||
// width: 90px;
|
// width: 90px;
|
||||||
// text-align: center;
|
// text-align: center;
|
||||||
@@ -322,5 +327,5 @@ init()
|
|||||||
// white-space: nowrap;
|
// white-space: nowrap;
|
||||||
// overflow: hidden
|
// overflow: hidden
|
||||||
//}
|
//}
|
||||||
//}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ export const APPROVAL_PROPS = {
|
|||||||
handler: "TO_PASS", //操作
|
handler: "TO_PASS", //操作
|
||||||
assignedUser: [] //审批人列表
|
assignedUser: [] //审批人列表
|
||||||
},
|
},
|
||||||
|
matrixApproval: true,
|
||||||
timeLimit: { //边界事件
|
timeLimit: { //边界事件
|
||||||
timeout: { //超时提醒时间
|
timeout: { //超时提醒时间
|
||||||
unit: "H",
|
unit: "H",
|
||||||
|
|||||||
@@ -191,17 +191,6 @@ const loadInitFrom = () => {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
const getRandomId = () => {
|
|
||||||
let d = new Date().getTime()
|
|
||||||
// x 是 0-9 或 a-f 范围内的一个32位十六进制数
|
|
||||||
let id = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
||||||
let r = (d + Math.random() * 16) % 16 | 0
|
|
||||||
d = Math.floor(d / 16)
|
|
||||||
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)
|
|
||||||
})
|
|
||||||
return id
|
|
||||||
}
|
|
||||||
|
|
||||||
const getProcessInfo = async () => {
|
const getProcessInfo = async () => {
|
||||||
getProcessDefinitionInfo(params.deploymentId).then(res => {
|
getProcessDefinitionInfo(params.deploymentId).then(res => {
|
||||||
ElNotification({
|
ElNotification({
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<div v-for="(user,index) in userInfo" :key="index" class="avatar_name">
|
<div v-for="(user,index) in userInfo" :key="index" class="avatar_name">
|
||||||
<div class="user">
|
<div class="user">
|
||||||
<div class="circle-user">
|
<div class="circle-user">
|
||||||
<Tooltip :content="user.name" placement="bottom-start" width="45">
|
<Tooltip :content="user.name" placement="bottom-start" width="45px">
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="user.icon && mode === 'preview'"
|
<div v-if="user.icon && mode === 'preview'"
|
||||||
|
|||||||
@@ -273,7 +273,6 @@ const props = defineProps({
|
|||||||
|
|
||||||
|
|
||||||
const nodeProps = computed(() => {
|
const nodeProps = computed(() => {
|
||||||
processStore.getSelectedNode().props.matrixApproval=true
|
|
||||||
return processStore.getSelectedNode().props;
|
return processStore.getSelectedNode().props;
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user