Merge pull request 'master' (#235) from master into prod

Reviewed-on: http://git.feashow.cn/clay/mosr-web/pulls/235
This commit is contained in:
2024-05-27 13:41:13 +00:00
13 changed files with 156 additions and 64 deletions

View File

@@ -39,7 +39,7 @@ const props = defineProps({
// 当前显示步骤
active: {
type: Number,
default: '0'
default:0
},
// 已完成的工作流步骤
stepSuccess: {
@@ -236,7 +236,6 @@ const getBaseInfo = async () => {
getBaseInfo()
watchEffect(() => {
console.log(props.active, 'props.active');
localActive.value = props.active
})
</script>

View File

@@ -1,5 +1,5 @@
import { defineStore } from "pinia";
import { defineAsyncComponent, ref } from "vue";
import { defineAsyncComponent, ref, toRaw } from "vue";
import { getRouters } from "@/api/system/menu";
import Layout from '@/layout/index.vue'
import ParentView from '@/components/ParentView.vue'
@@ -21,6 +21,8 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
}
}
])
// 二级页面路由list
const slRouters = ref([])
const setIsLoadRoutes = (status) => {
return isLoadRoutes.value = status
@@ -30,7 +32,9 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
if (res.code === 1000) {
const sRouter = JSON.parse(JSON.stringify(res.data))
const mData = JSON.parse(JSON.stringify(res.data))
asyncRouters.value = formatAsyncRouters(sRouter)
console.log(JSON.parse(JSON.stringify(sRouter)), 'sRouter');
const firstFormat = setRouterLevel(JSON.parse(JSON.stringify(sRouter)))
asyncRouters.value = formatAsyncRouters(JSON.parse(JSON.stringify(firstFormat)))
menuList.value = [...menuList.value, ...generateMenu(mData)]
addAsyncRouters(asyncRouters.value)
isLoadRoutes.value = false
@@ -41,6 +45,23 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
})
}
const setRouterLevel = (routers) => {
return routers.filter(item=>{
if(item.component === 'Layout') {
if(item.children) {
item.children.forEach(v=>{
if(v.children) {
slRouters.value = [...toRaw(slRouters.value), ...v.children]
delete v.children
}
})
item.children = [...item.children, ...toRaw(slRouters.value)]
}
}
return true
})
}
const formatAsyncRouters = (routers) => {
return routers.filter(route => {
if (route.component) {
@@ -48,8 +69,7 @@ export const usePermisstionStroe = defineStore('permisstion', () => {
route.component = Layout
} else if (route.component === 'ParentView') {
route.component = ParentView
}
else {
} else {
route.component = loadView(route.component)
}
}

View File

@@ -115,7 +115,7 @@ const tableConfig = reactive({
align: 'center',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
if(row.targetState!==null){
if(row.targetState!==null||row.targetState!==undefined){
return (<Tag dictType={'todo_type'} value={row.targetState}/>)
}else {
return '--'
@@ -153,15 +153,51 @@ const tableConfig = reactive({
params: {},
})
const handleView = (row) => {
console.log('row', row)
if(row.targetState=='00'&&row.targetId){
if (row.targetState == '00' && row.targetId) {
router.push({
name: 'Collection/detail',
name: 'Requirement/detail',
query: {
id: row.targetId
}
})
}
else if(row.targetState=='10'&&row.targetId){
router.push({
name: 'Summary/detail',
query: {
id: row.targetId,
projectId: row.projectId,
state: row.state
}
})
}else if(row.targetState=='20'&&row.targetId){
router.push({
name: 'Initiation/detail',
query: {
id: row.targetId,
projectId: row.projectId,
state: row.state
}
})
}else if(row.targetState=='40'&&row.targetId){
router.push({
name: 'Implementation/detail',
query: {
id: row.targetId,
projectId: row.projectId,
state: row.state
}
})
}else if(row.targetState=='50'&&row.targetId){
router.push({
name: 'Filing/detail',
query: {
id: row.targetId,
projectId: row.projectId,
state: row.state
}
})
}
}
</script>

View File

@@ -3,14 +3,14 @@
<baseTitle title="需求征集信息录入"></baseTitle>
<el-form :model="formData" inline class="query-form" ref="demandForm" :rules="rules">
<div class="left-info">
<el-form-item label="名称" prop="requirementName">
<el-form-item v-if="checkFormPrem('requirementName')" label="名称" prop="requirementName">
<el-input v-model="formData.requirementName" placeholder="请输入名称" clearable></el-input>
</el-form-item>
<el-form-item label="所属公司" prop="companyIds">
<el-form-item v-if="checkFormPrem('companyIds')" label="所属公司" prop="companyIds">
<el-tree-select v-model="formData.companyIds" :data="companyOption" style="width: 100%;"
filterable clearable :check-strictly="true" multiple/>
</el-form-item>
<el-form-item label="征集类型" prop="collectType">
<el-form-item v-if="checkFormPrem('collectType')" label="征集类型" prop="collectType">
<el-select v-model="formData.collectType" placeholder="征集类型" clearable filterable>
<el-option
v-for="item in typeOption"
@@ -20,7 +20,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="截止时间" prop="deadline">
<el-form-item v-if="checkFormPrem('deadline')" label="截止时间" prop="deadline">
<el-config-provider>
<el-date-picker
v-model="formData.deadline"
@@ -33,11 +33,12 @@
</div>
</el-form>
<baseTitle title="征集说明"></baseTitle>
<Tinymce image-url="/notice/file" file-url="/notice/file" v-model:value="formData.collectExplain" height="300"
v-if="showTinymce"/>
<Tinymce v-if="checkFormPrem('collectExplain') && showTinymce" image-url="/notice/file" file-url="/notice/file"
v-model:value="formData.collectExplain" height="300" />
<baseTitle title="申请文件"></baseTitle>
<file-upload @getFile="getFile"/>
<fvTable style="width: 100%;max-height: 200px" v-if="showTable" :tableConfig="tableConfig" :data="formData.fileList"
<file-upload v-if="checkFormPrem('fileList')" @getFile="getFile"/>
<fvTable style="width: 100%;max-height: 200px" v-if="showTable"
:tableConfig="tableConfig" :data="formData.fileList"
:isSettingCol="false" :pagination="false">
<template #empty>
<el-empty :image-size="90" description="暂无数据" style="padding: 0"/>
@@ -105,6 +106,7 @@ const loading = ref(false)
const showTable = ref(true)
const processStore = useProcessStore()
const processInstanceData = ref()
const formPermMap = ref(new Map());
const rules = reactive({
requirementName: [{required: true, message: '请输入名称', trigger: 'blur'}],
companyIds: [{required: true, message: '请选择所属公司', trigger: 'blur'}],
@@ -154,6 +156,16 @@ const tableConfig = reactive({
]
})
const checkFormPrem = (formKey) => {
if (formPermMap.value.hasOwnProperty(formKey)) {
let formItem = formPermMap.value[formKey];
return formItem.perm === 'EDIT'
} else {
return true;
}
}
const handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
@@ -164,10 +176,11 @@ const handleDownload = (row) => {
})
}
const compositeParam = (item) => {
console.log('router.currentRoute.value.path',router.currentRoute.value.path)
let tag = ''
if (!formData.value.collectType && router.currentRoute.value.name === 'Collection/add') {
tag = '需求征集'
}
// if (!formData.value.collectType && router.currentRoute.value.path === 'Requirement/add') {
// tag = ''
// }
return {
fileId: item.id,
size: item.size,
@@ -207,6 +220,9 @@ const init = async () => {
processStore.noTakeList.value = data.noTakeList;
processStore.refuseList.value = data.refuseList;
processStore.passList.value = data.passList;
formPermMap.value = data.formPermMap
// const entriesArray = Object.entries(data.formPermMap);// 使MapMap
// formPermMap.value = new Map(entriesArray);
nextTick(() => {
processDiagramViewer.value = true
})
@@ -242,7 +258,7 @@ const handleSubmit = async (instance) => {
ElMessage.success(res.msg)
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
await router.push({
name: 'Collection'
name: 'Requirement'
})
} else {
ElMessage.error(res.msg)
@@ -255,7 +271,7 @@ const handleResubmit = () => {
ElMessage.success(res.msg)
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Collection'
name: 'Requirement'
})
} else {
ElMessage.error(res.msg)

View File

@@ -3,28 +3,28 @@
<el-form :model="formData" ref="demandForm" label-width="auto" :rules="rules">
<baseTitle title="需求征集详情"></baseTitle>
<el-row>
<el-col :span="12">
<el-col :span="12" v-if="checkFormPrem('requirementName')">
<el-form-item label="名称">
<span>{{ formData.requirementName }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-if="checkFormPrem('companyIds')">
<el-form-item label="所属公司">
<span>{{ formData.companyIds }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-if="checkFormPrem('collectType')">
<el-form-item label="征集类型">
<span>{{ formData.collectType }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-col :span="12" v-if="checkFormPrem('deadline')">
<el-form-item label="截止时间">
<span>{{ formData.deadline }}</span>
</el-form-item>
</el-col>
<baseTitle title="征集说明"></baseTitle>
<el-col :span="24">
<el-col :span="24" v-if="checkFormPrem('collectExplain')">
<el-form-item>
<el-card style="width: 100%">
<div v-html="formData.collectExplain">
@@ -33,7 +33,7 @@
</el-form-item>
</el-col>
<baseTitle title="附件列表"></baseTitle>
<el-col :span="24">
<el-col :span="24" v-if="checkFormPrem('collectExplain')">
<el-form-item>
<fvTable style="width: 100%;max-height: 200px" v-if="showTable" :tableConfig="tableConfig"
:data="formData.fileList" :isSettingCol="false" :pagination="false">
@@ -77,7 +77,7 @@
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue'
import {useProcessStore} from '@/stores/processStore.js';
import {getInfo, agreeTask, rejectTask,downloadFile} from "@/api/project-demand/index.js";
import {getInfo, agreeTask, rejectTask, downloadFile} from "@/api/project-demand/index.js";
import {getSubCompOpt} from '@/api/user/user.js'
import {ElMessage} from "element-plus";
import {useTagsView} from '@/stores/tagsview.js'
@@ -91,6 +91,7 @@ const loading = ref(false)
const demandForm = ref()
const processStore = useProcessStore()
const companyOption = ref([])
const formPermMap = ref(new Map());
const processInstanceData = ref({})
const showTable = ref(false)
const processDiagramViewer = ref(false)
@@ -137,6 +138,22 @@ const tableConfig = reactive({
}
]
})
const checkFormPrem = (formKey) => {
if (formPermMap.value.hasOwnProperty(formKey)) {
let formItem = formPermMap.value[formKey];
return formItem.perm === 'READ'
} else {
return true;
}
}
const fromPrem = (formKey) => {
let formItem = formPermMap.value[formKey];
return formItem.perm
}
const handleSubmit = () => {
let approve = {
taskId: processInstanceData.value.taskId,
@@ -148,7 +165,7 @@ const handleSubmit = () => {
ElMessage.success(res.msg)
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Collection'
name: 'Requirement'
})
} else {
ElMessage.error(res.msg)
@@ -168,7 +185,7 @@ const handleReject = (instance) => {
ElMessage.success(res.msg)
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
router.push({
name: 'Collection'
name: 'Requirement'
})
} else {
ElMessage.error(res.msg)
@@ -184,7 +201,7 @@ const getCompanyOption = async () => {
const getDataSourceOptionItem = (val) => {
if (val !== undefined) {
val.forEach(item => {
matterTree(companyNameArray.value,companyOption.value, item)
matterTree(companyNameArray.value, companyOption.value, item)
})
}
return companyNameArray.value.join('');
@@ -194,7 +211,7 @@ const handleDownload = (row) => {
downloadFile(row.fileId).then(res => {
const blob = new Blob([res])
let a = document.createElement('a')
a.href=URL.createObjectURL(blob)
a.href = URL.createObjectURL(blob)
a.download = row.originalFileName
a.click()
})
@@ -203,7 +220,7 @@ const init = async () => {
if (!route.query.id) return;
await getCompanyOption()
getInfo(route.query.id).then(res => {
loading.value=false
loading.value = false
let data = res.data
formData.value = data.formData;
data.formData.companyIds = getDataSourceOptionItem(data.formData.companyIds)
@@ -221,7 +238,7 @@ const init = async () => {
})
}
onMounted(async () => {
loading.value=true
loading.value = true
await init()
})
</script>

View File

@@ -100,7 +100,7 @@ const tableConfig = reactive({
btn.push({label: '详情', prem: ['mosr:requirement:info'], func: () => handleDetail(row), type: 'primary'})
}
if (buttons.has("edit")) {
btn.push({label: '编辑',prem: ['mosr:requirement:resubmit'], func: () => handleEdit(row), type: 'primary'})
btn.push({label: '编辑', prem: ['mosr:requirement:resubmit'], func: () => handleEdit(row), type: 'primary'})
}
// if (buttons.has("delete")) {
// btn.push({label: '',prem: ['mosr:requirement:del'], func: () => handleDelete(row), type: 'primary'})
@@ -149,7 +149,7 @@ const search = (val) => {
const handleAdd = () => {
//
router.push({
name: 'Requirement/add',
name:'Requirement/add',
query: {
isAdd: 1
}
@@ -157,7 +157,7 @@ const handleAdd = () => {
}
const handleEdit = (row) => {
router.push({
name: 'Requirement/edit',
name:'Requirement/edit',
query: {
id: row.requirementId
}
@@ -175,7 +175,7 @@ const handleDelete = (row) => {
}
const handleDetail = (row) => {
router.push({
name: 'Requirement/detail',
name:'Requirement/detail',
query: {
id: row.requirementId
}
@@ -183,7 +183,7 @@ const handleDetail = (row) => {
}
const handleReport = (row) => {
router.push({
name: 'Summary/add',
name:'Summary/add',
query: {
id:row.requirementId
}

View File

@@ -1,5 +1,5 @@
<template>
<steps :active="'1'" @setDetail="setDetail" @stepChange="stepChange">
<steps :active="1" @setDetail="setDetail" @stepChange="stepChange">
<template #content>
<collection-detail v-show="showActive == '00'" :formData="summaryData.formData" :data="summaryData"
:processViewer="summaryProcessViewer" :companyOption="companyOption" :loading="loading"/>
@@ -49,6 +49,7 @@ const getInfo = async (state) => {
message: msg,
type: code === 1000 ? 'success' : 'error'
})
if(data===undefined)return;
if(code===1000){
summaryData.value = data;
loading.value = false

View File

@@ -175,7 +175,7 @@ const search = (val) => {
const handleAdd = (row) => {
router.push({
name: 'Summary/add',
name:'Summary/add',
query: {
id:row.requirementId
}
@@ -183,7 +183,7 @@ const handleAdd = (row) => {
}
const handleEdit = (row) => {
router.push({
name: 'Summary/edit',
name:'Summary/edit',
query: {
id:row.requirementId,
projectId:row.projectId
@@ -192,7 +192,7 @@ const handleEdit = (row) => {
}
const handleDetail = (row) => {
router.push({
name: 'Summary/detail',
name:'Summary/detail',
query: {
id:row.requirementId,
projectId: row.projectId,

View File

@@ -1,5 +1,5 @@
<template>
<steps :active="'4'" @setDetail="setDetail" @stepChange="stepChange">
<steps :active="4" @setDetail="setDetail" @stepChange="stepChange">
<template #content>
<collection-detail
:formData="commonForm.formData"
@@ -71,6 +71,7 @@ const getAllInfo = async (state) => {
if(code===1000){
loading.value = false
}
if(data===undefined)return;
commonForm.value = data
processStore.setDesign(data)
processStore.runningList.value = data.runningList;

View File

@@ -1,5 +1,5 @@
<template>
<steps :active="'3'" @setDetail="setDetail" @stepChange="stepChange">
<steps :active="3" @setDetail="setDetail" @stepChange="stepChange">
<template #content>
<collection-detail
:formData="commonForm.formData"
@@ -76,6 +76,7 @@ const getAllInfo = async (state) => {
if(code===1000){
loading.value = false
}
if(data===undefined)return;
commonForm.value = data
processStore.setDesign(data)
processStore.runningList.value = data.runningList;

View File

@@ -216,7 +216,7 @@ const search = (val) => {
const handleDetail = (row) => {
router.push({
name: 'Implementation/detail',
name:'Implementation/detail',
query: {
id: row.requirementId,
projectId: row.projectId,

View File

@@ -1,5 +1,5 @@
<template>
<steps :active="'2'" @setDetail="setDetail" @stepChange="stepChange">
<steps :active="2" @setDetail="setDetail" @stepChange="stepChange">
<template #content>
<collection-detail
:formData="commonForm.formData"
@@ -117,6 +117,7 @@ const getAllInfo = async (state) => {
loading.value = false
}
console.log(data, 'data--22');
if(data===undefined)return;
commonForm.value = data
processStore.setDesign(data)
processStore.runningList.value = data.runningList;

View File

@@ -31,7 +31,7 @@ export default defineConfig({
resolvers: [
// 自动注册图标组件
IconsResolver({
enabledCollections: ['ep'],
enabledRequirements: ['ep'],
}),
//自动导入组件
ElementPlusResolver()
@@ -68,20 +68,20 @@ export default defineConfig({
strictPort: false,
open: true,
proxy: {
'/api/workflow': {
// target: 'http://frp.feashow.cn:31800/',
target: 'http://clay.frp.feashow.cn/',
// target: 'http://192.168.31.175:8000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
},
'/api/admin': {
// target: 'http://frp.feashow.cn:31800/',
target: 'http://clay.frp.feashow.cn/',
// target: 'http://192.168.31.175:8000',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
},
// '/api/workflow': {
// // target: 'http://frp.feashow.cn:31800/',
// target: 'http://clay.frp.feashow.cn/',
// // target: 'http://192.168.31.175:8000',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '')
// },
// '/api/admin': {
// // target: 'http://frp.feashow.cn:31800/',
// target: 'http://clay.frp.feashow.cn/',
// // target: 'http://192.168.31.175:8000',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '')
// },
'/api': {
target: 'http://mosr.feashow.cn',
changeOrigin: true,