Merge remote-tracking branch 'origin/master'

This commit is contained in:
zhangkaihuai
2024-07-06 17:40:24 +08:00
16 changed files with 667 additions and 211 deletions

View File

@@ -1,4 +1,6 @@
import request from '@/utils/request.js'
import axios from "axios";
import {getToken} from "@/utils/auth";
export const addAllocation = (data) => {
return request({
@@ -65,3 +67,15 @@ export const deleteAllocation = (id) => {
method: "delete"
});
};
export const shareExportExcel = (allocationId) => {
return axios.get(
`${import.meta.env.VITE_BASE_URL}/workflow/mosr/cost/allocation/collect/${allocationId}`,
{
responseType: 'blob',
headers: {
Authorization: getToken()
}
}
);
};

View File

@@ -54,3 +54,37 @@ export const uploadCollectAttachment= (data) => {
data: data
});
};
// 年度计划
export const addPlan= (data) => {
return request({
url: '/workflow/annual/plan',
method: "post",
data: data
});
};
export const editPlan= (data) => {
return request({
url: '/workflow/annual/plan',
method: "put",
data: data
});
};
export const getPlan= (annualPlanId) => {
return request({
url: `/workflow/annual/plan/info/${annualPlanId}`,
method: "get"
});
};
export const deletePlan= (annualPlanId) => {
return request({
url: `/workflow/annual/plan/${annualPlanId}`,
method: "delete"
});
};
export const approvePlan= (data) => {
return request({
url: '/workflow/annual/plan/approve',
method: "post",
data: data
});
};

View File

@@ -1,5 +1,5 @@
<template>
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportExcelHandler">导出</el-button>
<el-table ref="table" :data="tableData" style="width: 100%;height: 479px" :show-summary="true" border
:summary-method="getSummaries" v-loading="loading" :header-cell-style="{background:'#f5f7fa'}">
<el-table-column type="index" label="序号" align="center" width="60"/>
@@ -34,8 +34,8 @@
</template>
<script setup>
import {exportExcel} from "@/utils/export-excel";
import {getAllocationSummaryDetails} from "@/api/expense-manage";
import {shareExportExcel} from "@/api/expense-manage";
const tableData = ref([{
id: '12987122',
@@ -80,13 +80,28 @@ const getSummaries = (param) => {
})
return sums
}
const exportTable = () => {
const $e = table.value.$el
let $table = $e.querySelector('.el-table__fixed')
if (!$table) {
$table = $e
}
exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
// const exportTable = () => {
// const $e = table.value.$el
// let $table = $e.querySelector('.el-table__fixed')
// if (!$table) {
// $table = $e
// }
// exportExcel($table, (5 + (Object.keys(tableData.value[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目费用分摊表", 2)
// }
const exportExcelHandler = () => {
shareExportExcel(route.query.id).then(res => {
console.log(res)
let reg = /filename=([^&]+)/;
let contentDisposition = decodeURI(res.headers['content-disposition'])
let result = reg.exec(contentDisposition)
let fileName = result[1]
fileName = fileName.replace(/\"/g, '')
const blob = new Blob([res.data])
let a = document.createElement('a')
a.href = URL.createObjectURL(blob)
a.download = fileName
a.click()
})
}
const init = () => {
loading.value = true

View File

@@ -2,46 +2,45 @@
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
<el-table ref="reportTable" :data="tableData" style="width: 100%;height: 479px"
:span-method="objectSpanMethod" v-loading="loading">
<!-- <el-table-column label="四川省国有资产经营投资管理有限责任公司-->
<!-- 科技创新项目人工成本分摊明细表" align="center">-->
<el-table-column v-for="column in columnInfo" :prop="column.prop" :label="column.label" align="center"
:fixed="(!column.children) ? ((column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 'right' : 'left') : false"
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
<template #default="scope">
<template v-if="column.children">
<el-table-column v-for="childColumn in column.children"
:prop="column.prop + '.'+ childColumn.prop"
:label="childColumn.label"
:width="childColumn.prop === 'subtotal' ? 160 : 130">
<template #default="columnScope">
<template v-if="(tableData.length -1) !== columnScope.$index">
{{
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
}}
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目人工成本分摊明细表" align="center">
<el-table-column v-for="column in columnInfo" :prop="column.prop" :label="column.label" align="center"
:fixed="(!column.children) ? ((column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 'right' : 'left') : false"
:width="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') ? 160:130">
<template #default="scope">
<template v-if="column.children">
<el-table-column v-for="childColumn in column.children"
:prop="column.prop + '.'+ childColumn.prop"
:label="childColumn.label"
:width="childColumn.prop === 'subtotal' ? 160 : 130">
<template #default="columnScope">
<template v-if="(tableData.length -1) !== columnScope.$index">
{{
columnScope.row[column.prop][childColumn.prop] ? columnScope.row[column.prop][childColumn.prop] : '/'
}}
</template>
<template v-else>
{{ columnScope.row[column.prop][childColumn.prop] }}
</template>
</template>
<template v-else>
{{ columnScope.row[column.prop][childColumn.prop] }}
</template>
</template>
</el-table-column>
</template>
<template v-else>
<!--分摊金额合计与分摊金额总计计算-->
<template
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
{{ getTotalSeparation(scope.row, column.prop) }}
</template>
<template
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
{{ getTotalSummary(scope.row, column.prop) }}
</el-table-column>
</template>
<template v-else>
{{ scope.row[column.prop] }}
<!--分摊金额合计与分摊金额总计计算-->
<template
v-if="(column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost') && (tableData.length -1) !== scope.$index">
{{ getTotalSeparation(scope.row, column.prop) }}
</template>
<template
v-else-if="(tableData.length -1) === scope.$index && (column.prop === 'totalSeparation' || column.prop === 'totalSeparationCost')">
{{ getTotalSummary(scope.row, column.prop) }}
</template>
<template v-else>
{{ scope.row[column.prop] }}
</template>
</template>
</template>
</template>
</el-table-column>
</el-table-column>
<!-- </el-table-column>-->
</el-table>
</template>
@@ -160,7 +159,7 @@ const concatColumn = (columnIndex, length, rowIndex) => {
const init = () => {
loading.value = true
getAllocationDetails(route.query.id).then(res => {
if(res.code!==1000){
if (res.code !== 1000) {
ElNotification({
title: '提示',
message: res.msg,

View File

@@ -148,7 +148,7 @@
:file-list-show="fileListShow"/>
</el-col>
<el-col :span="24">
<div v-if="data.taskId">
<div v-if="data.taskId||data.state==='5'">
<baseTitle title="审核意见"></baseTitle>
<el-form-item prop="_value">
<el-input
@@ -180,6 +180,11 @@
</div>
</div>
</el-form>
<div class="oper-page-btn" v-if="data.state==='5'">
<el-button type="danger" @click="handleRejectPlan">驳回年度计划</el-button>
<el-button color="#DED0B2" @click="handleAgreePlan">通过年度计划</el-button>
</div>
</div>
</template>
@@ -193,6 +198,8 @@ import {getFundOption} from "@/api/special-fund";
import {useCacheStore} from '@/stores/cache.js'
import {getSubCompOpt} from "@/api/user/user";
import FileComponent from "./FileComponent.vue";
import {ElNotification} from "element-plus";
import {approvePlan} from "@/api/project-demand/summary";
const emit = defineEmits(['update:value'])
const tagsViewStore = useTagsView()
@@ -225,6 +232,7 @@ const props = defineProps({
})
const changeDiagram = ref(false)
const localFormData = ref({})
const route = useRoute()
const router = useRouter()
const fundOption = ref([])
const companyOption = ref([])
@@ -240,6 +248,46 @@ const _value = computed({
emit("update:value", val);
}
})
const handleRejectPlan = async () => {
// const values = form.value.getValues()
console.log('route',route.query.projectId)
if (!_value.value) {
ElNotification({
title: '提示',
message: '请填写审核意见',
type: 'warning'
})
return
}
const params = {
auditOpinion:_value.value,
projectId:parseInt(route.query.projectId),
state:false
}
console.log('params', params)
const res = await approvePlan(params)
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
}
const handleAgreePlan = async () => {
const params = {
auditOpinion:_value.value,
projectId:parseInt(route.query.projectId),
state:true
}
console.log('params', params)
const res = await approvePlan(params)
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
tagsViewStore.delVisitedViews(router.currentRoute.value.path)
}
const filterDict = (data, value) => {
if (data === undefined || value === undefined) return;
let label = ''

View File

@@ -8,20 +8,34 @@ import XLSX from "xlsx-style-vite";
* @param columnLength 列长度
* @param excelName 导出文件名称
* @param bigWidthIndex 更宽列的索引
* @param bigWidthArray 更宽列数组索引
*/
export function exportExcel($table, columnLength, excelName, bigWidthIndex) {
export function exportExcel($table, columnLength, excelName, bigWidthIndex,bigWidthArray) {
//从el-table表生成工作簿对象
//使用原始的格式,保留表格中的格式如%、小数末尾的0等
let workbook = utils.table_to_book($table, {
raw: true
});
//列宽需要导出的表格有多少列这里的i就小于多少
for (let i = 1; i < columnLength; i++) {
if (i === bigWidthIndex) {
workbook.Sheets.Sheet1["!cols"].push({wpx: 300});
// if(bigWidthArray&&bigWidthArray.length>0){
// for (let i = 1; i < columnLength; i++) {
// for (let j = 0; j < bigWidthArray.length; j++) {
// console.log('bigWidthArray[j]',bigWidthArray[j])
// if (i === bigWidthArray[j]) {
// workbook.Sheets.Sheet1["!cols"].push({wpx: 300});
// }
// }
// workbook.Sheets.Sheet1["!cols"].push({wpx: 100});
// }
// }else {
for (let i = 1; i < columnLength; i++) {
if (i === bigWidthIndex) {
workbook.Sheets.Sheet1["!cols"].push({wpx: 300});
}
workbook.Sheets.Sheet1["!cols"].push({wpx: 100});
}
workbook.Sheets.Sheet1["!cols"].push({wpx: 100});
}
// }
//设置单元格样式
for (const key in workbook.Sheets.Sheet1) {
if (

View File

@@ -14,12 +14,12 @@
</el-row>
</el-form>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="分摊明细" name="first">
<expense-detail/>
</el-tab-pane>
<el-tab-pane label="分摊汇总" name="second" v-loading="loading">
<el-tab-pane label="分摊汇总" name="first" v-loading="loading">
<allocation-summary-detail/>
</el-tab-pane>
<el-tab-pane label="分摊明细" name="second">
<expense-detail/>
</el-tab-pane>
</el-tabs>
<div v-if="shareData.taskId">
<baseTitle title="审核意见"></baseTitle>

191
src/views/plan/detail.vue Normal file
View File

@@ -0,0 +1,191 @@
<template>
<div v-loading="loading">
<el-form :model="formData" class="query-form">
<el-row>
<el-col :span="8">
<el-form-item label="年度计划名称" prop="annualPlanName">
<!-- <el-input v-model="formData.annualPlanName" placeholder="请输入年度计划名称" clearable>-->
<!-- </el-input>-->
<span>{{ formData.annualPlanName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="创建时间" prop="createTime">
<span>{{ formData.createTime }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="query-btn">
<el-button color="#DED0B2" style="float: right;margin: 0 10px 10px 0" @click="exportTable">导出</el-button>
</div>
<el-table ref="table" :data="formData.projectList" border :header-cell-style="{background:'#f5f7fa'}">
<el-table-column label="四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表" align="center">
<template #default="scope">
<el-table-column type="index" label="序号" align="center" width="60"/>
<el-table-column prop="projectName" label="项目名称" align="center"/>
<el-table-column prop="time" label="起始时间" align="center" min-width="120px">
<template #default="scope">
{{ scope.row.startTime + ' 至 ' + scope.row.endTime }}
</template>
</el-table-column>
<el-table-column prop="projectType" label="项目类型" align="center">
<template #default="scope">
<div v-if="scope.row.projectType !== null">
<Tag dictType="project_type" :value="scope.row.projectType"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="departmentName" label="承办部门" align="center"/>
<el-table-column prop="investmentType" label="出资类型" align="center">
<template #default="scope">
<div v-if="scope.row.investmentType !== null">
<Tag dictType="invest_type" :value="scope.row.investmentType"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="projectImpact" label="项目影响" align="center">
<template #default="scope">
<div v-if="scope.row.projectImpact !== null">
<Tag dictType="project_impact" :value="scope.row.projectImpact"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="businessSegment" label="所属业务板块" align="center">
<template #default="scope">
<div v-if="scope.row.businessSegment !== null">
<Tag dictType="business_segment" :value="scope.row.businessSegment"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="resultForm" label="预期成果形式" align="center" min-width="100px">
<template #default="scope">
<div v-if="scope.row.resultForm !== null">
<el-tag effect="plain">{{
filterDict(cacheStore.getDict('result_form'), scope.row.resultForm)
}}
</el-tag>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="technicalStandard" label="预期技术标准制定" align="center">
<template #default="scope">
<div v-if="scope.row.technicalStandard !== null">
<Tag dictType="technical_standard" :value="scope.row.technicalStandard"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="industryUniversityResearch" label="产学研联合" align="center">
<template #default="scope">
<div v-if="scope.row.industryUniversityResearch !== null">
<Tag dictType="industry_university" :value="scope.row.industryUniversityResearch"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="governmentDeclaration" label="开展政府申报" align="center">
<template #default="scope">
<div v-if="scope.row.governmentDeclaration !== null">
<Tag dictType="government_declaration" :value="scope.row.governmentDeclaration"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="intellectualProperty" label="知识产权状况" align="center">
<template #default="scope">
<div v-if="scope.row.intellectualProperty !== null">
<Tag dictType="intellectual_property" :value="scope.row.intellectualProperty"/>
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="intellectualProperty" label="经济概算(元)" align="center">
<template #default="scope">
<span>{{ toThousands(scope.row.economicEstimate) }}</span>
</template>
</el-table-column>
<el-table-column prop="specialFundAmount" label="专项资金(元)" align="center">
<template #default="scope">
<span>{{ toThousands(scope.row.specialFundAmount) }}</span>
</template>
</el-table-column>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script setup>
import {toThousands} from '@/utils/changePrice.js'
import {ElNotification} from "element-plus";
import {getPlan} from "@/api/project-demand/summary";
import {useCacheStore} from '@/stores/cache.js'
import {exportExcel} from "@/utils/export-excel";
const cacheStore = useCacheStore()
const loading = ref(false)
const formData = ref({})
const table = ref()
const route = useRoute()
const exportTable = () => {
const $e = table.value.$el
let $table = $e.querySelector('.el-table__fixed')
if (!$table) {
$table = $e
}
exportExcel($table, (5 + (Object.keys(formData.value.projectList[0]).length - 5) * 5), "四川省国有资产经营投资管理有限责任公司科技创新项目年度计划表", 2)
}
const filterDict = (data, value) => {
if (data === undefined || value === undefined) return;
let label = ''
let result = []
if (JSON.parse(value) instanceof Array) {
JSON.parse(value).forEach(item1 => {
data.find(item => {
if (item.value == item1) {
result.push(item.label)
}
})
})
label = result.map(item => item).join('')
} else {
if (data instanceof Array) {
data.find(item => {
if (item.value == value) {
label = item.label
}
})
}
}
return label
}
const getDetailInfo = () => {
loading.value = true
getPlan(route.query.annualPlanId).then(res => {
ElNotification({
title: '提示',
message: res.msg,
type: res.code === 1000 ? 'success' : 'error'
})
if (res.code === 1000) {
formData.value = res.data
loading.value = false
}
})
}
onMounted(() => {
if (route.query.annualPlanId) {
getDetailInfo()
}
})
</script>
<style scoped>
</style>

76
src/views/plan/index.vue Normal file
View File

@@ -0,0 +1,76 @@
<template>
<!-- <fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>-->
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable>
</template>
<script setup lang="jsx">
const tableIns = ref()
const router = useRouter()
const route = useRoute()
const tableConfig = reactive({
columns: [
// {
// type: 'selection',
// prop: 'selection'
// },
{
prop: 'annualPlanName',
label: '年度计划名称',
align: 'center'
},
{
prop: 'createTime',
label: '创建时间',
align: 'center'
},
{
prop: 'oper',
label: '操作',
align: 'center',
fixed: 'right',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
btn.push({label: '详情', func: () => handleDetail(row), type: 'primary'})
return (
<div style={{width: '100%'}}>
{
btn.map(item => (
<el-button
type={item.type}
// v-perm={item.prem}
onClick={() => item.func()}
link
>
{item.label}
</el-button>
))
}
</div>
)
}
}
],
api: '/workflow/annual/plan/list',
params: {},
})
const headBtnClick = (key) => {
switch (key) {
case 'add':
handleAdd()
break;
}
}
const handleDetail=(row)=>{
router.push({
name: 'Plan/detail',
query: {
annualPlanId: row.annualPlanId,
}
})
}
</script>
<style scoped lang="scss">
</style>

View File

@@ -62,8 +62,10 @@ const getInfo = async (state) => {
processStore.passList.value = data.passList;
nextTick(() => {
summaryProcessViewer.value = true
if (data.formPermMap["fileList"]) {
fileListShow.value = data.formPermMap["fileList"].perm
if(data.formPermMap!=null){
if (data.formPermMap["fileList"]) {
fileListShow.value = data.formPermMap["fileList"].perm
}
}
})
loading.close()

View File

@@ -1,13 +1,16 @@
<template>
<fvSearchForm :searchConfig="searchConfig" @search="search"></fvSearchForm>
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"></fvTable>
<fvTable ref="tableIns" :tableConfig="tableConfig" @headBtnClick="headBtnClick"
@selectionChange="selectionChange"></fvTable>
</template>
<script setup lang="jsx">
import fvSelect from '@/fvcomponents/fvSelect/index.vue'
import {addPlan} from "@/api/project-demand/summary";
const tableIns = ref()
const router = useRouter()
const projectSelectList = ref([])
const shortcuts = [
{
text: '上周',
@@ -104,7 +107,7 @@ const searchConfig = reactive([
props: {
placeholder: '请选择状态',
clearable: true,
cacheKey: 'project_initiation'
cacheKey: 'demand_summary'
}
},
// {
@@ -146,10 +149,13 @@ const auths = {
}
const tableConfig = reactive({
columns: [
// {
// type: 'selection',
// prop: 'selection'
// },
{
type: 'selection',
prop: 'selection',
selectable: (row, index) => {
return row.state === '4';
}
},
{
prop: 'requirementName',
label: '征集名称',
@@ -229,7 +235,7 @@ const tableConfig = reactive({
prop: 'oper',
label: '操作',
align: 'center',
fixed:'right',
fixed: 'right',
showOverflowTooltip: false,
currentRender: ({row, index}) => {
let btn = []
@@ -254,12 +260,6 @@ const tableConfig = reactive({
</el-button>
))
}
{
buttons.has("delete") ?
<popover-delete name={row.requirementName} type={'需求'} btnType={'danger'}
perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
: ''
}
</div>
)
}
@@ -268,19 +268,52 @@ const tableConfig = reactive({
api: '/workflow/mosr/requirement/collect',
params: {},
btns: [
{name: '新增上报', key: 'add', color: '#DED0B2', auth:auths.report},
// {name: '年度计划导出', key: '_export', auth: ''},
{name: '新增上报', key: 'add', color: '#DED0B2', auth: auths.report},
{name: '创建年度计划', key: 'export', color: '#DED0B2', auth: ''},
// {name: '经费预算生成', key: 'preMonty', auth: ''},
]
})
// {
// buttons.has("delete") ?
// <popover-delete name={row.requirementName} type={'需求'} btnType={'danger'}
// perm={['mosr:collect:del']} onDelete={() => handleDelete(row)}/>
// : ''
// }
const headBtnClick = (key) => {
switch (key) {
case 'add':
handleAdd()
break;
case 'export':
handleExport()
break;
}
}
const selectionChange = (data) => {
console.log('data', data, tableIns.value.tableInstance)
data.forEach(item => {
// toggleRowSelection
})
projectSelectList.value = data
}
const handleExport = () => {
console.log('projectSelectList.value', projectSelectList.value)
let projectIds = []
projectSelectList.value.map(item => {
projectIds.push(item.projectId)
})
if (projectSelectList.value.length > 0) {
let params = {
projectIds: projectIds
}
addPlan(params).then(res => {
if (res.code === 1000) {
}
})
}
}
const search = (val) => {
let obj = {...val}
if (obj.dateValue) {
@@ -313,7 +346,7 @@ const handleDetail = (row) => {
router.push({
name: 'Summary/detail',
query: {
id: row.requirementId==null?'-1':row.requirementId,
id: row.requirementId == null ? '-1' : row.requirementId,
projectId: row.projectId,
state: row.state
}

View File

@@ -9,10 +9,10 @@
</el-col>
<el-col :span="24">
<el-form-item prop="projectChargePerson" label="项目负责人">
{{ tableForm.projectChargePersonName }}
<el-button color="#DED0B2" @click="showPersonnelPicker" style="margin-left: 10px">
<el-button color="#DED0B2" @click="showPersonnelPicker" style="margin-right: 10px">
{{ tableForm.projectChargePersonName ? '更改' : '请选择项目负责人' }}
</el-button>
{{ tableForm.projectChargePersonName }}
</el-form-item>
</el-col>
<el-col :span="12">

View File

@@ -12,11 +12,18 @@
当前节点: {{ operation.operationName }}
</div>
<div class="card">
<div v-for="(user,index) in operation.userInfo" :key="index" class="avatar_name" :style="{'flex-direction': isColumn?'column':'row'}">
<div v-for="(user,index) in operation.userInfo" :key="index" class="avatar_name"
:style="{'flex-direction': isColumn?'column':'row'}">
<div class="avatar-block" :style="{'margin-bottom': isColumn?'10px':'0'}">
<name-circle :user="user"/>
<div class="name">
<span>{{ user.name }}</span>
<div style="display: flex;align-items: center">
<el-icon :color="user.accountType==='0'?'#95d475':user.accountType==null?'#95d475':'#409eff'"
style="margin-right: 5px;">
<UserFilled/>
</el-icon>
<span class="name-style">{{ user.name }}</span>
</div>
<span>{{ user.jobActivityDesc }}</span>
</div>
</div>
@@ -67,7 +74,7 @@ const props = defineProps({
},
isColumn: {
type: Boolean,
default:false
default: false
}
})
@@ -82,6 +89,13 @@ const init = () => {
context: '审批进行中'
}
break
case '5':
timeline.value = {
color: '#f78f5f',
icon: 'MoreFilled',
context: '年度计划审批中'
}
break
case '2':
timeline.value = {
color: '#0bbd87',
@@ -103,6 +117,13 @@ const init = () => {
context: '审批通过'
}
break
case '6':
timeline.value = {
color: '#0bbd87',
icon: 'CircleCheckFilled',
context: '年度计划审批通过'
}
break
default:
break
}
@@ -281,20 +302,21 @@ init()
border-bottom: none;
}
.avatar-block {
.avatar-block {
display: flex;
.name {
width:130px;
.name {
width: 130px;
display: flex;
flex-direction: column;
margin-left: 10px;
margin-right: 20px;
margin-right: 20px;
> span:first-child {
.name-style{
color: #2a99ff;
}
>span:last-child{
> span:last-child {
margin-top: 5px;
color: #909399;
}

View File

@@ -9,6 +9,7 @@ export const APPROVAL_PROPS = {
assignedUser: [] //审批人列表
},
matrixApproval: true,
skipSelf: true,
timeLimit: { //边界事件
timeout: { //超时提醒时间
unit: "H",

View File

@@ -7,12 +7,12 @@
</el-icon>
<span>审批人</span>
</div>
<div @click="addCcNode">
<el-icon style="color:rgb(50, 150, 250);">
<Promotion/>
</el-icon>
<span>抄送人</span>
</div>
<!-- <div @click="addCcNode">-->
<!-- <el-icon style="color:rgb(50, 150, 250);">-->
<!-- <Promotion/>-->
<!-- </el-icon>-->
<!-- <span>抄送人</span>-->
<!-- </div>-->
<div @click="addConditionsNode">
<el-icon style="color:rgb(21, 188, 131);">
<Share/>
@@ -25,12 +25,12 @@
</el-icon>
<span>并行分支</span>
</div>
<div @click="addDelayNode">
<el-icon style="color:#f25643;">
<Clock/>
</el-icon>
<span>延迟等待</span>
</div>
<!-- <div @click="addDelayNode">-->
<!-- <el-icon style="color:#f25643;">-->
<!-- <Clock/>-->
<!-- </el-icon>-->
<!-- <span>延迟等待</span>-->
<!-- </div>-->
<!-- <div @click="addTriggerNode">-->
<!-- <el-icon style="color:#15BC83;">-->
<!-- <SetUp/>-->

View File

@@ -5,16 +5,17 @@
<el-radio v-for="item in approvalTypes" :label="item.type" :key="item.type">{{ item.name }}</el-radio>
</el-radio-group>
<!-- <div v-else>-->
<!-- <span class="item-desc">发起人自己作为审批人进行审批</span>-->
<!-- </div>-->
<!-- <div v-else>-->
<!-- <span class="item-desc">发起人自己作为审批人进行审批</span>-->
<!-- </div>-->
</el-form-item>
<el-form-item style="margin-top: -18px">
<div v-if="nodeProps.assignedType === 'ASSIGN_USER'" >
<div v-if="nodeProps.assignedType === 'ASSIGN_USER'">
<el-button size="mini" icon="Plus" type="primary" @click="showSysRolePicker" round>
选择人员
</el-button>
<user-picker :check-matrix="true" title="请选择人员" :multiple="false" ref="sysRolePicker" :v-model="assignedUser" @ok="selectedUser"/>
<user-picker :check-matrix="true" title="请选择人员" :multiple="false" ref="sysRolePicker"
v-model:value="assignedUser" @ok="selectedUser"/>
<!-- <ellipsis :row="3" :user-info="assignedUser"/>-->
<role-items v-model="assignedUser"/>
</div>
@@ -57,125 +58,130 @@
</div>
<div v-else-if="nodeProps.assignedType === 'FORM_USER'">
<el-form-item label="选择表单联系人项" prop="text" class="approve-end">
<el-select style="width: 80%;" size="small" v-model="nodeProps.formUser" placeholder="请选择包含联系人的表单项" filterable>
<el-select style="width: 80%;" size="small" v-model="nodeProps.formUser" placeholder="请选择包含联系人的表单项"
filterable>
<el-option v-for="(op,i) in forms" :label="op.title" :value="op.id" :key="i"></el-option>
</el-select>
</el-form-item>
</div>
</el-form-item>
<!-- <el-divider></el-divider>-->
<!-- <el-form-item label="审批人为空时" prop="text" class="line-mode">-->
<!-- <el-radio-group v-model="nodeProps.nobody.handler">-->
<!-- <el-radio label="TO_PASS">自动通过</el-radio>-->
<!-- <el-radio label="TO_REFUSE">自动驳回</el-radio>-->
<!-- <el-radio label="TO_ADMIN">转交审批管理员</el-radio>-->
<!-- <el-radio label="TO_USER">转交到指定人员</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div style="margin-top: 10px" v-if="nodeProps.nobody.handler === 'TO_USER'">-->
<!-- <el-button size="mini" icon="Plus" type="primary" @click="showUserPicker()" round>-->
<!-- 选择人员-->
<!-- </el-button>-->
<!-- <user-picker title="请指定用户" :multiple="false" ref="toUserPicker" :v-model="nobodyAssignedUser"-->
<!-- @ok="selectNoSetUser"/>-->
<!-- <ellipsis :row="3" :user-info="nobodyAssignedUser"/>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-divider></el-divider>-->
<!-- <el-form-item label="审批人为空时" prop="text" class="line-mode">-->
<!-- <el-radio-group v-model="nodeProps.nobody.handler">-->
<!-- <el-radio label="TO_PASS">自动通过</el-radio>-->
<!-- <el-radio label="TO_REFUSE">自动驳回</el-radio>-->
<!-- <el-radio label="TO_ADMIN">转交审批管理员</el-radio>-->
<!-- <el-radio label="TO_USER">转交到指定人员</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div style="margin-top: 10px" v-if="nodeProps.nobody.handler === 'TO_USER'">-->
<!-- <el-button size="mini" icon="Plus" type="primary" @click="showUserPicker()" round>-->
<!-- 选择人员-->
<!-- </el-button>-->
<!-- <user-picker title="请指定用户" :multiple="false" ref="toUserPicker" :v-model="nobodyAssignedUser"-->
<!-- @ok="selectNoSetUser"/>-->
<!-- <ellipsis :row="3" :user-info="nobodyAssignedUser"/>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <div v-if="showMode">-->
<!-- <el-divider/>-->
<!-- <el-form-item label="多人审批时审批方式" prop="text" class="approve-mode">-->
<!-- <el-radio-group v-model="nodeProps.mode">-->
<!-- <el-radio label="NEXT">会签 按选择顺序审批每个人必须同意</el-radio>-->
<!-- <el-radio label="AND">会签可同时审批每个人必须同意</el-radio>-->
<!-- <el-radio label="OR">或签有一人同意即可</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </div>-->
<!-- <div v-if="showMode">-->
<!-- <el-divider/>-->
<!-- <el-form-item label="多人审批时审批方式" prop="text" class="approve-mode">-->
<!-- <el-radio-group v-model="nodeProps.mode">-->
<!-- <el-radio label="NEXT">会签 按选择顺序审批每个人必须同意</el-radio>-->
<!-- <el-radio label="AND">会签可同时审批每个人必须同意</el-radio>-->
<!-- <el-radio label="OR">或签有一人同意即可</el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </div>-->
<el-divider>高级设置</el-divider>
<!-- <el-form-item label="✍ 审批同意时是否需要签字" prop="text">-->
<!-- <el-switch inactive-text="不用" active-text="需要" v-model="nodeProps.sign"></el-switch>-->
<!-- <el-tooltip class="item" effect="dark" content="如果全局设置了需要签字,则此处不生效" placement="top-start">-->
<!-- <i class="el-icon-question" style="margin-left: 10px; font-size: medium; color: #b0b0b1"></i>-->
<!-- </el-tooltip>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="✍ 审批同意时是否需要签字" prop="text">-->
<!-- <el-switch inactive-text="不用" active-text="需要" v-model="nodeProps.sign"></el-switch>-->
<!-- <el-tooltip class="item" effect="dark" content="如果全局设置了需要签字,则此处不生效" placement="top-start">-->
<!-- <i class="el-icon-question" style="margin-left: 10px; font-size: medium; color: #b0b0b1"></i>-->
<!-- </el-tooltip>-->
<!-- </el-form-item>-->
<el-form-item label="是否使用矩阵审批" prop="text">
<el-switch inactive-text="不用" active-text="使用" v-model="nodeProps.matrixApproval"></el-switch>
</el-form-item>
<!-- <el-form-item label="审批期限(为 0 则不生效)" prop="timeLimit">-->
<!-- <el-input style="width: 180px;" placeholder="时长" type="number"-->
<!-- v-model="nodeProps.timeLimit.timeout.value">-->
<!-- <el-select style="width: 75px;" v-model="nodeProps.timeLimit.timeout.unit" slot="append" placeholder="请选择" filterable>-->
<!-- <el-option label="天" value="D"></el-option>-->
<!-- <el-option label="小时" value="H"></el-option>-->
<!-- </el-select>-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审批期限超时后执行" prop="level" v-if="nodeProps.timeLimit.timeout.value > 0">-->
<!-- <el-radio-group v-model="nodeProps.timeLimit.handler.type">-->
<!-- <el-radio label="PASS">自动通过</el-radio>-->
<!-- <el-radio label="REFUSE">自动驳回</el-radio>-->
<!-- <el-radio label="NOTIFY">发送提醒</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div v-if="nodeProps.timeLimit.handler.type === 'NOTIFY'">-->
<!-- <div style="color:#409EEF; font-size: small">默认提醒当前审批人</div>-->
<!-- <el-switch inactive-text="循环" active-text="一次" v-model="nodeProps.timeLimit.handler.notify.once"></el-switch>-->
<!-- <span style="margin-left: 20px" v-if="!nodeProps.timeLimit.handler.notify.once">-->
<!-- 每隔-->
<!-- <el-input-number :min="0" :max="10000" :step="1" size="mini"-->
<!-- v-model="nodeProps.timeLimit.handler.notify.hour"/>-->
<!-- 小时提醒一次-->
<!-- </span>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="🙅‍ 如果审批被驳回 👇">-->
<!-- <el-radio-group v-model="nodeProps.refuse.type">-->
<!-- <el-radio label="TO_INITIAL">重新开始流程</el-radio>-->
<!-- <el-radio label="TO_BEFORE">驳回到上级审批节点</el-radio>-->
<!-- <el-radio label="TO_NODE">驳回到指定节点</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div v-if="nodeProps.refuse.type === 'TO_NODE'">-->
<!-- <span>指定节点:</span>-->
<!-- <el-select style="margin-left: 10px; width: 150px;" placeholder="选择跳转步骤" size="small"-->
<!-- v-model="nodeProps.refuse.target" filterable>-->
<!-- <el-option v-for="(node, index) in nodeOptions" :key="index" :label="node.name"-->
<!-- :value="node.id"></el-option>-->
<!-- </el-select>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="自定义监听器">-->
<!-- <div slot="label">-->
<!-- <span style="margin-left: 20px">使用自定义监听器: </span>-->
<!-- &lt;!&ndash; <el-switch v-model="config.listener.state" @change="getListener"></el-switch>&ndash;&gt;-->
<!-- </div>-->
<!-- <div v-if="config.listener.state">-->
<!-- <div slot="label">-->
<!-- <span style="margin-right: 10px">设置监听器</span>-->
<!-- <el-button type="primary" @click="addListener(config.listener.list)" link> + 添加</el-button>-->
<!-- </div>-->
<!-- <div v-for="(listen, index) in config.listener.list" :key="index">-->
<!-- <el-input v-if="listen.isSys" placeholder="监听器名称" :disabled="true" size="small" style="width: 100px;"-->
<!-- v-model="listen.listenerName"/>-->
<!-- <el-input v-if="!listen.isSys" placeholder="监听器名称" size="small" style="width: 100px;"-->
<!-- v-model="listen.listenerName"/>-->
<!-- <el-radio-group size="small" style="margin: 0 5px;" @change="typeChange(listen)" v-model="listen.isSys">-->
<!-- <el-radio-button :label="true">内置</el-radio-button>-->
<!-- <el-radio-button :label="false">自定义</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- <el-select v-if="listen.isSys" style="width: 180px;" v-model="listen.listenerValue" size="small"-->
<!-- @change="listenerOptionChange(listen)"-->
<!-- placeholder="请选择表单字段" filterable>-->
<!-- <el-option v-for="option in listenerOption" :key="option.value" :label="option.label"-->
<!-- :value="option.value"/>-->
<!-- </el-select>-->
<!-- &lt;!&ndash; <el-input v-if="listen.isSys" placeholder="请设置字段值" size="small" v-model="listen.listenerValue" style="width: 180px;"/>&ndash;&gt;-->
<!-- <el-button v-if="!listen.isSys" type="primary" size="small" @click="settingListener(listen)" link>设置</el-button>-->
<!-- <el-button @click="delListener(config.listener.list, index)"-->
<!-- class="el-icon-delete" type="primary"-->
<!-- style="margin-left: 5px; color: #c75450;" link/>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-form-item>-->
<el-form-item v-if="nodeProps.matrixApproval && nodeProps.assignedType === 'SELF'" label="是否跳过自己" prop="text">
<!-- {{nodeProps.skipSelf}}-->
<el-switch inactive-text="不跳过" active-text="跳过" v-model="nodeProps.skipSelf"></el-switch>
</el-form-item>
<!-- <el-form-item label="审批期限(为 0 则不生效)" prop="timeLimit">-->
<!-- <el-input style="width: 180px;" placeholder="时长" type="number"-->
<!-- v-model="nodeProps.timeLimit.timeout.value">-->
<!-- <el-select style="width: 75px;" v-model="nodeProps.timeLimit.timeout.unit" slot="append" placeholder="请选择" filterable>-->
<!-- <el-option label="天" value="D"></el-option>-->
<!-- <el-option label="小时" value="H"></el-option>-->
<!-- </el-select>-->
<!-- </el-input>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="审批期限超时后执行" prop="level" v-if="nodeProps.timeLimit.timeout.value > 0">-->
<!-- <el-radio-group v-model="nodeProps.timeLimit.handler.type">-->
<!-- <el-radio label="PASS">自动通过</el-radio>-->
<!-- <el-radio label="REFUSE">自动驳回</el-radio>-->
<!-- <el-radio label="NOTIFY">发送提醒</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div v-if="nodeProps.timeLimit.handler.type === 'NOTIFY'">-->
<!-- <div style="color:#409EEF; font-size: small">默认提醒当前审批人</div>-->
<!-- <el-switch inactive-text="循环" active-text="一次" v-model="nodeProps.timeLimit.handler.notify.once"></el-switch>-->
<!-- <span style="margin-left: 20px" v-if="!nodeProps.timeLimit.handler.notify.once">-->
<!-- 每隔-->
<!-- <el-input-number :min="0" :max="10000" :step="1" size="mini"-->
<!-- v-model="nodeProps.timeLimit.handler.notify.hour"/>-->
<!-- 小时提醒一次-->
<!-- </span>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="🙅‍ 如果审批被驳回 👇">-->
<!-- <el-radio-group v-model="nodeProps.refuse.type">-->
<!-- <el-radio label="TO_INITIAL">重新开始流程</el-radio>-->
<!-- <el-radio label="TO_BEFORE">驳回到上级审批节点</el-radio>-->
<!-- <el-radio label="TO_NODE">驳回到指定节点</el-radio>-->
<!-- </el-radio-group>-->
<!-- <div v-if="nodeProps.refuse.type === 'TO_NODE'">-->
<!-- <span>指定节点:</span>-->
<!-- <el-select style="margin-left: 10px; width: 150px;" placeholder="选择跳转步骤" size="small"-->
<!-- v-model="nodeProps.refuse.target" filterable>-->
<!-- <el-option v-for="(node, index) in nodeOptions" :key="index" :label="node.name"-->
<!-- :value="node.id"></el-option>-->
<!-- </el-select>-->
<!-- </div>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="自定义监听器">-->
<!-- <div slot="label">-->
<!-- <span style="margin-left: 20px">使用自定义监听器: </span>-->
<!-- &lt;!&ndash; <el-switch v-model="config.listener.state" @change="getListener"></el-switch>&ndash;&gt;-->
<!-- </div>-->
<!-- <div v-if="config.listener.state">-->
<!-- <div slot="label">-->
<!-- <span style="margin-right: 10px">设置监听器</span>-->
<!-- <el-button type="primary" @click="addListener(config.listener.list)" link> + 添加</el-button>-->
<!-- </div>-->
<!-- <div v-for="(listen, index) in config.listener.list" :key="index">-->
<!-- <el-input v-if="listen.isSys" placeholder="监听器名称" :disabled="true" size="small" style="width: 100px;"-->
<!-- v-model="listen.listenerName"/>-->
<!-- <el-input v-if="!listen.isSys" placeholder="监听器名称" size="small" style="width: 100px;"-->
<!-- v-model="listen.listenerName"/>-->
<!-- <el-radio-group size="small" style="margin: 0 5px;" @change="typeChange(listen)" v-model="listen.isSys">-->
<!-- <el-radio-button :label="true">内置</el-radio-button>-->
<!-- <el-radio-button :label="false">自定义</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- <el-select v-if="listen.isSys" style="width: 180px;" v-model="listen.listenerValue" size="small"-->
<!-- @change="listenerOptionChange(listen)"-->
<!-- placeholder="请选择表单字段" filterable>-->
<!-- <el-option v-for="option in listenerOption" :key="option.value" :label="option.label"-->
<!-- :value="option.value"/>-->
<!-- </el-select>-->
<!-- &lt;!&ndash; <el-input v-if="listen.isSys" placeholder="请设置字段值" size="small" v-model="listen.listenerValue" style="width: 180px;"/>&ndash;&gt;-->
<!-- <el-button v-if="!listen.isSys" type="primary" size="small" @click="settingListener(listen)" link>设置</el-button>-->
<!-- <el-button @click="delListener(config.listener.list, index)"-->
<!-- class="el-icon-delete" type="primary"-->
<!-- style="margin-left: 5px; color: #c75450;" link/>-->
<!-- </div>-->
<!-- </div>-->
<!-- </el-form-item>-->
</el-form>
<!--
<el-dialog custom-class="custom-dialog" class="border" width="600px" title="定义监听器设置"
@@ -308,7 +314,7 @@ const roleList = computed({
props.config.roleList = val
}
})
watch(()=>props.config.roleList,(value)=>{
watch(() => props.config.roleList, (value) => {
roleList.value = value
})
@@ -398,7 +404,8 @@ const selectedUser = (select) => {
let userInfo = {
id: val.id,
name: val.name,
avatar: val.avatar,
companyName: val.companyName,
accountType: val.accountType,
}
userInfoList.push(userInfo)
}