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:
2024-06-21 10:36:16 +00:00
14 changed files with 193 additions and 140 deletions

View File

@@ -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
});
};

View File

@@ -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

View File

@@ -52,7 +52,7 @@ const props = defineProps({
}, },
uploadState: { uploadState: {
type: Boolean, type: Boolean,
default: true default: false
}, },
loading: { loading: {
type: Boolean, type: Boolean,

View File

@@ -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;

View File

@@ -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;

View File

@@ -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)

View File

@@ -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>

View File

@@ -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

View File

@@ -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;

View File

@@ -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>

View File

@@ -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",

View File

@@ -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({

View File

@@ -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'"

View File

@@ -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;
}) })