25 changed files with 2526 additions and 240 deletions
@ -1,3 +1,3 @@ |
|||
# 网站标题 |
|||
VITE_GLOB_APP_TITLE = 国研咨询 |
|||
VITE_GLOB_APP_TITLE = 国研信息 |
|||
|
|||
|
@ -0,0 +1,101 @@ |
|||
<template> |
|||
<v-chart :option="option" theme="auto" :autoresize="true" style="width: 93%; height: 100%" /> |
|||
</template> |
|||
|
|||
<script lang="ts" name="PieChart" setup> |
|||
import { ref, reactive } from 'vue' |
|||
let parameter = defineProps(["title", "data"]) |
|||
let option = reactive({}) |
|||
option = { |
|||
tooltip: { |
|||
trigger: 'axis', |
|||
axisPointer: { |
|||
type: 'shadow' |
|||
} |
|||
}, |
|||
legend: { |
|||
right: '1%' |
|||
}, |
|||
grid: { |
|||
left: '3%', |
|||
right: '4%', |
|||
bottom: '3%', |
|||
containLabel: true |
|||
}, |
|||
xAxis: { |
|||
type: 'value' |
|||
}, |
|||
yAxis: { |
|||
type: 'category', |
|||
data: parameter.data.names, |
|||
inverse: true |
|||
}, |
|||
series: [ |
|||
{ |
|||
name: '总计', |
|||
type: 'bar', |
|||
barGap: '-100%', |
|||
stack: 'total1', |
|||
label: { |
|||
show: true, |
|||
position: 'right', // 将标签显示在条形图的右侧 |
|||
formatter: function (params) { |
|||
const total = option.series[0].data[params.dataIndex] + option.series[1].data[params.dataIndex]; |
|||
return total; // 显示总和 |
|||
}, |
|||
color:"black" |
|||
}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: parameter.data.totalMoney, // 总和数据 |
|||
itemStyle: { |
|||
color: 'rgba(128, 128, 128, 2)', |
|||
|
|||
} |
|||
}, |
|||
{ |
|||
name: '入库项目申报资金', |
|||
type: 'bar', |
|||
stack: 'total', |
|||
label: { |
|||
show: false, |
|||
position: 'inside', // 将标签显示在条形图内部 |
|||
formatter: function (params) { |
|||
return params.data; // 显示入库的金额 |
|||
} |
|||
}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: parameter.data.storagevalues, |
|||
itemStyle: { |
|||
color: '#1890FF' |
|||
} |
|||
}, |
|||
{ |
|||
name: '配套项目申报资金', |
|||
type: 'bar', |
|||
stack: 'total', |
|||
label: { |
|||
show: false, |
|||
position: 'inside', // 将标签显示在条形图内部 |
|||
formatter: function (params) { |
|||
return params.data; // 显示配套的金额 |
|||
} |
|||
}, |
|||
emphasis: { |
|||
focus: 'series' |
|||
}, |
|||
data: parameter.data.supportvalues, |
|||
itemStyle: { |
|||
color: '#D6E4FF' |
|||
} |
|||
}, |
|||
|
|||
] |
|||
}; |
|||
|
|||
</script> |
|||
|
|||
<style></style> |
@ -0,0 +1,245 @@ |
|||
<template> |
|||
<div class="container mx-auto mt-4 mb-4 h-70"> |
|||
<div class="grid grid-cols-2 gap-4 h-full"> |
|||
<div class="grid grid-rows-3 gap-2"> |
|||
<div> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#1890FF] h-full"></div> |
|||
<div class="w-9/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>项目数量</div |
|||
> |
|||
<div class="w-6/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
projectNumber.total |
|||
}}</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ projectNumber.countyNum }} |
|||
</div> |
|||
<div class="row-span-1"> 区县 </div> |
|||
</div> |
|||
</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ projectNumber.cityNum }} |
|||
</div> |
|||
<div class="row-span-1">市本级 </div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#2E54A1] h-full"></div> |
|||
<div class="w-9/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>入库项目数量</div |
|||
> |
|||
<div class="w-6/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
storagedNumber.total |
|||
}}</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ storagedNumber.countyNum }} |
|||
</div> |
|||
<div class="row-span-1"> 区县 </div> |
|||
</div> |
|||
</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ storagedNumber.cityNum }} |
|||
</div> |
|||
<div class="row-span-1">市本级 </div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div></div |
|||
> |
|||
<div |
|||
><div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#91ACE0] h-full"></div> |
|||
<div class="w-9/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>配套项目数量</div |
|||
> |
|||
<div class="w-6/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
supportingNumber.total |
|||
}}</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ supportingNumber.countyNum }} |
|||
</div> |
|||
<div class="row-span-1"> 区县 </div> |
|||
</div> |
|||
</div> |
|||
<div class="w-6/28 flex items-center justify-center h-full"> |
|||
<div class="grid grid-rows-3 h-full"> |
|||
<div class="row-span-2 flex items-center justify-center text-3xl font-bold"> |
|||
{{ supportingNumber.cityNum }} |
|||
</div> |
|||
<div class="row-span-1">市本级 </div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div></div |
|||
> |
|||
</div> |
|||
<div> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="h-1/10 flex items-center"> |
|||
<div class="text-2xl mt-10 ml -10 w-1/2"> {{ basicBarTitle }} {{ basicBarMoney }} </div> |
|||
<div class="text-2xl mt-10 mr -10 w-1/2 flex justify-end"> |
|||
<a-radio-group v-model:value="radioValue" button-style="solid" @change="changeRadio"> |
|||
<a-radio-button value="ruku">入库项目</a-radio-button> |
|||
<a-radio-button value="peitao">配套项目</a-radio-button> |
|||
</a-radio-group> |
|||
</div> |
|||
</div> |
|||
<div class="h-9/10"> |
|||
<basic_bar :data="bas_barData" :key="basicBarKey"></basic_bar> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script lang="ts" setup> |
|||
import { defineComponent, ref } from 'vue'; |
|||
import { Card } from 'ant-design-vue'; |
|||
import { Icon } from '@/components/Icon'; |
|||
import { groupItems } from './data'; |
|||
import basic_bar from './basic_bar.vue'; |
|||
import { getWorkcountNumber } from '@/views/myWork/inComplete/inComplete.api'; |
|||
import { |
|||
getProjectNumber, |
|||
getStoragedNumber, |
|||
getSupportingNumber, |
|||
getStoragedFound, |
|||
getSupportingFound, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import { useRouter } from 'vue-router'; // 导入 useRouter |
|||
//刷新当前页面 |
|||
const router = useRouter(); |
|||
let bas_barData = ref<any>({ |
|||
names: ['中央资金', '省级资金', '市级资金', '区县级资金', '自筹资金'], |
|||
values: [120, 200, 150, 80, 70], |
|||
}); |
|||
let basicBarTitle = ref<string>('入库项目总投资'); |
|||
let basicBarMoney = ref<string>('1000230'); |
|||
let basicBarKey = ref<number>(1); |
|||
let radioValue = ref<string>('ruku'); |
|||
let projectNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
let storagedNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
let supportingNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
getProjectNumber().then((res) => { |
|||
console.log('getProjectNumber', res); |
|||
projectNumber.value = res; |
|||
}); |
|||
getStoragedNumber().then((res) => { |
|||
console.log('getStoragedNumber', res); |
|||
storagedNumber.value = res; |
|||
}); |
|||
getSupportingNumber().then((res) => { |
|||
console.log('getSupportingNumber', res); |
|||
supportingNumber.value = res; |
|||
}); |
|||
getStoragedFound().then((res) => { |
|||
console.log('getStoragedFound', res); |
|||
bas_barData.value = { |
|||
names: ['中央资金', '省级资金', '市级资金', '区县级资金', '自筹资金'], |
|||
values: [ |
|||
res.totalCentral, |
|||
res.totalProvincial, |
|||
res.totalCity, |
|||
res.totalCounty, |
|||
res.totalSelf, |
|||
], |
|||
}; |
|||
basicBarMoney.value = res.totalMoney; |
|||
basicBarKey.value += 1; |
|||
}); |
|||
const updateFun = (item) => { |
|||
console.log('item', item); |
|||
if (item.title === '待签任务') { |
|||
router.push({ |
|||
// push方法 |
|||
path: '/activiti/task/claim-list', //项目计划文件审批详情页面 |
|||
}); |
|||
} else if (item.title === '待办任务') { |
|||
router.push({ |
|||
// push方法 |
|||
path: '/myWork/inComplete/index', //项目计划文件审批详情页面 |
|||
}); |
|||
} else if (item.title === '已办任务') { |
|||
router.push({ |
|||
// push方法 |
|||
path: '/myWork/completed/index', //项目计划文件审批详情页面 |
|||
}); |
|||
} |
|||
}; |
|||
// getProjectNumber().then((res) => { |
|||
// console.log('getProjectNumber', res); |
|||
// projectNumber.value = res |
|||
// }); |
|||
function changeRadio(e) { |
|||
console.log('radioValue', radioValue.value); |
|||
|
|||
if (radioValue.value === 'ruku') { |
|||
basicBarTitle.value = '入库项目总投资'; |
|||
getStoragedFound().then((res) => { |
|||
console.log('getStoragedFound', res); |
|||
bas_barData.value = { |
|||
names: ['中央资金', '省级资金', '市级资金', '区县级资金', '自筹资金'], |
|||
values: [ |
|||
res.totalCentral, |
|||
res.totalProvincial, |
|||
res.totalCity, |
|||
res.totalCounty, |
|||
res.totalSelf, |
|||
], |
|||
}; |
|||
basicBarMoney.value = res.totalMoney; |
|||
basicBarKey.value += 1; |
|||
}); |
|||
} else { |
|||
basicBarTitle.value = '配套项目总投资'; |
|||
getSupportingFound().then((res) => { |
|||
console.log('getSupportingFound', res); |
|||
bas_barData.value = { |
|||
names: ['中央资金', '省级资金', '市级资金', '区县级资金', '自筹资金'], |
|||
values: [ |
|||
res.totalCentral, |
|||
res.totalProvincial, |
|||
res.totalCity, |
|||
res.totalCounty, |
|||
res.totalSelf, |
|||
], |
|||
}; |
|||
basicBarMoney.value = res.totalMoney; |
|||
basicBarKey.value += 1; |
|||
}); |
|||
} |
|||
} |
|||
//查询待签任务 |
|||
|
|||
//查询代办任务 |
|||
console.log('groupItems111', groupItems); |
|||
</script> |
@ -0,0 +1,144 @@ |
|||
<template> |
|||
<div class="container mx-auto mt-4 mb-4 h-70"> |
|||
<div class="grid grid-cols-10 gap-4 h-full"> |
|||
<div class="col-span-3 grid grid-rows-3 gap-2"> |
|||
<div> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#1890FF] h-full"></div> |
|||
<div class="w-17/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>申报项目数量</div |
|||
> |
|||
<div class="w-10/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
projectNumber.total |
|||
}}</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<div> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#2E54A1] h-full"></div> |
|||
<div class="w-17/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>入库项目数量</div |
|||
> |
|||
<div class="w-10/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
storagedNumber.total |
|||
}}</div> |
|||
</div> |
|||
</div></div |
|||
> |
|||
<div |
|||
><div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="flex items-center gap-1 w-full h-full"> |
|||
<div class="w-1/28 bg-[#91ACE0] h-full"></div> |
|||
<div class="w-17/28 flex items-center justify-center h-full text-2xl font-semibold" |
|||
>配套项目数量</div |
|||
> |
|||
<div class="w-10/28 flex items-center justify-center h-full text-4xl font-bold">{{ |
|||
supportingNumber.total |
|||
}}</div> |
|||
</div> |
|||
</div></div |
|||
> |
|||
</div> |
|||
<div class="col-span-7"> |
|||
<div class="container mx-auto bg-white w-full h-full"> |
|||
<div class="h-1/10 flex items-center"> |
|||
<div class="text-2xl mt-10 ml -10 w-1/2"> {{ basicBarTitle }} {{ basicBarMoney }} </div> |
|||
</div> |
|||
<div class="h-9/10"> |
|||
<basic_bar :data="bas_barData" :key="basicBarKey"></basic_bar> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script lang="ts" setup> |
|||
import { defineComponent, ref,onMounted } from 'vue'; |
|||
import { Card } from 'ant-design-vue'; |
|||
import { Icon } from '@/components/Icon'; |
|||
import { groupItems } from './data'; |
|||
import basic_bar from './basic_bar.vue'; |
|||
import { getWorkcountNumber } from '@/views/myWork/inComplete/inComplete.api'; |
|||
import { |
|||
getProjectNumber, |
|||
getStoragedNumber, |
|||
getSupportingNumber, |
|||
getStoragedFound, |
|||
getSupportingFound, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import { useRouter } from 'vue-router'; // 导入 useRouter |
|||
import { number } from 'vue-types'; |
|||
//刷新当前页面 |
|||
const router = useRouter(); |
|||
let bas_barData = ref<any>({ |
|||
names: ['中央资金', '省级资金', '市级资金', '区县级资金', '自筹资金'], |
|||
}); |
|||
let basicBarTitle = ref<string>('项目总投资'); |
|||
let basicBarMoney = ref<string>('1000230'); |
|||
let basicBarKey = ref<number>(1); |
|||
let projectNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
let storagedNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
let supportingNumber = ref({ |
|||
cityNum: 0, |
|||
countyNum: 0, |
|||
total: 0, |
|||
}); |
|||
getProjectNumber().then((res) => { |
|||
console.log('getProjectNumber', res); |
|||
projectNumber.value = res; |
|||
}); |
|||
getStoragedNumber().then((res) => { |
|||
console.log('getStoragedNumber', res); |
|||
storagedNumber.value = res; |
|||
}); |
|||
getSupportingNumber().then((res) => { |
|||
console.log('getSupportingNumber', res); |
|||
supportingNumber.value = res; |
|||
}); |
|||
onMounted(async()=>{ |
|||
let storData=await getStoragedFound(); |
|||
let supData=await getSupportingFound(); |
|||
bas_barData.value['storagevalues']=[ |
|||
storData.totalCentral, |
|||
storData.totalProvincial, |
|||
storData.totalCity, |
|||
storData.totalCounty, |
|||
storData.totalSelf, |
|||
] |
|||
basicBarMoney.value = storData.totalMoney; |
|||
bas_barData.value['supportvalues']=[ |
|||
supData.totalCentral, |
|||
supData.totalProvincial, |
|||
supData.totalCity, |
|||
supData.totalCounty, |
|||
supData.totalSelf, |
|||
], |
|||
bas_barData.value['totalMoney']=[ |
|||
storData.totalCentral+supData.totalCentral, |
|||
storData.totalProvincial+supData.totalProvincial, |
|||
storData.totalCity+supData.totalCity, |
|||
storData.totalCounty+supData.totalCounty, |
|||
storData.totalSelf+supData.totalSelf, |
|||
] |
|||
basicBarMoney.value = Number(basicBarMoney.value + supData.totalMoney).toFixed(0); |
|||
basicBarKey.value += 1; |
|||
}) |
|||
|
|||
// getProjectNumber().then((res) => { |
|||
// console.log('getProjectNumber', res); |
|||
// projectNumber.value = res |
|||
// }); |
|||
|
|||
console.log('groupItems111', groupItems); |
|||
</script> |
@ -0,0 +1,71 @@ |
|||
<template> |
|||
<PageWrapper> |
|||
<div class="card-container" v-if="true"> |
|||
<projectDetail></projectDetail> |
|||
|
|||
</div> |
|||
<div> |
|||
<planSummary /> |
|||
</div> |
|||
</PageWrapper> |
|||
</template> |
|||
<script lang="ts" setup> |
|||
import { ref, reactive, onMounted } from 'vue'; |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { count } from '@/views/projectLib/projectInfo/projectInfo.api'; |
|||
import WorkbenchHeader from './components/WorkbenchHeader.vue'; |
|||
import ProjectCard from './components/ProjectCard.vue'; |
|||
import projectDetail from '@/views/dashboard/workbench/components/projectDetail.vue' |
|||
import planSummary from '@/views/projectSummary/planSummary/index.vue'; |
|||
|
|||
const loading = ref(true); |
|||
const activeKey = ref('0'); |
|||
let data = reactive({ |
|||
xiangmZJD: { |
|||
fininshNum: 1, |
|||
unfininshNum: 2, |
|||
}, |
|||
xiangmuZJ: { |
|||
fininshNum: 1, |
|||
unfininshNum: 2, |
|||
}, |
|||
xiangmuZT: [{ name: '已建', value: 100 }], |
|||
ssggrw: [ |
|||
{ name: '2+N紧密型城市医疗集团建设', fininshNum: 100, unfininshNum: 30 }, |
|||
{ name: '2+9+9+N县域医共体建设', fininshNum: 140, unfininshNum: 20 }, |
|||
{ name: '市县公立医院妇幼能力建设', fininshNum: 140, unfininshNum: 120 }, |
|||
{ name: '高水平县级医院建设 ', fininshNum: 140, unfininshNum: 90 }, |
|||
{ name: '打造长三角市域医学高地', fininshNum: 140, unfininshNum: 90 }, |
|||
{ name: '公立医院院前急救与院内救治服务融合发展', fininshNum: 170, unfininshNum: 90 }, |
|||
{ name: '医共体下三医联动改革', fininshNum: 170, unfininshNum: 90 }, |
|||
{ name: '智慧医院服务能力提档升级', fininshNum: 100, unfininshNum: 30 }, |
|||
{ name: '数字健康大脑建设', fininshNum: 140, unfininshNum: 270 }, |
|||
{ name: '舒心就医', fininshNum: 140, unfininshNum: 270 }, |
|||
{ name: '中医药固本培元', fininshNum: 140, unfininshNum: 210 }, |
|||
{ name: '公立医院运营管理', fininshNum: 140, unfininshNum: 80 }, |
|||
{ name: '公立医院党建全行业引领改革工程 ', fininshNum: 140, unfininshNum: 40 }, |
|||
{ name: '高质量临床重点专科建设 ', fininshNum: 140, unfininshNum: 80 }, |
|||
], |
|||
xxqy: [ |
|||
{ name: '南浔区', fininshNum: 100, unfininshNum: 30 }, |
|||
{ name: '吴兴区', fininshNum: 140, unfininshNum: 20 }, |
|||
{ name: '市本级', fininshNum: 140, unfininshNum: 120 }, |
|||
{ name: '安吉县', fininshNum: 140, unfininshNum: 90 }, |
|||
{ name: '德清县', fininshNum: 140, unfininshNum: 90 }, |
|||
{ name: '长兴县', fininshNum: 170, unfininshNum: 90 }, |
|||
], |
|||
dwsx: [ |
|||
{ name: '卫生行政部门', fininshNum: 1000, unfininshNum: 3000 }, |
|||
{ name: '医疗机构 ', fininshNum: 1400, unfininshNum: 2000 }, |
|||
], |
|||
}); |
|||
|
|||
onMounted(() => { |
|||
console.log('datadatadatadatadatadata', data); |
|||
}); |
|||
setTimeout(async () => { |
|||
data = await count(); |
|||
loading.value = false; |
|||
activeKey.value = '1'; |
|||
}, 10); |
|||
</script> |
@ -1,27 +1,129 @@ |
|||
<template> |
|||
<el-steps direction="vertical" finish-status="success"> |
|||
<el-step v-for="(item, index) in dataTo.child" :key="index" :status="item.isfinish==2?'success':'wait'"> |
|||
<el-steps direction="vertical" finish-status="success" class="steps"> |
|||
<el-step |
|||
v-for="(item, index) in dataTo.child" |
|||
:key="index" |
|||
:status="item.isfinish == 2 ? 'success' : item.isfinish == 0 ? 'wait' : 'process'" |
|||
> |
|||
<template #title> |
|||
<div> |
|||
{{ item.taskName }} |
|||
<div class="flex"> |
|||
<div> |
|||
{{ item.taskName }} |
|||
</div> |
|||
<div v-if="item.isfinish == 1"> |
|||
<a-button type="text" size="small" @click="handleShowprocess(item)"> |
|||
<template #icon> |
|||
<DownOutlined style="color: #0ac00d" /> |
|||
</template> |
|||
</a-button> |
|||
</div> |
|||
</div> |
|||
|
|||
<div> |
|||
{{ item.scheduledStartTime }} |
|||
</div> |
|||
<div> |
|||
{{ item.scheduledEndTime }} |
|||
</div> |
|||
<div v-if="item.showProcessDetail == true"> |
|||
<a-button |
|||
type="text" |
|||
size="small" |
|||
class="text-blue text-xs flex justify-end w-full" |
|||
@click="clickDetail(item)" |
|||
>详情</a-button |
|||
> |
|||
<div v-for="(process, index) in item.processDetail" class="flex text-black text-xs"> |
|||
<!-- 实心绿色圆球 --> |
|||
<div |
|||
class="rounded-full bg-green-500 h-3 w-3 mr-2 mt-0.5" |
|||
v-if="process.approvalStatue == 1" |
|||
></div> |
|||
<!-- 空心绿色圆圈 --> |
|||
<div |
|||
class="rounded-full border-2 border-green-500 h-3 w-3 mr-2 mt-0.5" |
|||
v-else-if="process.approvalStatue == 0 && process.isdangqian == 1" |
|||
></div> |
|||
<div class="rounded-full border-2 border-gray-300 h-3 w-3 mr-2 mt-0.5" v-else ></div> |
|||
|
|||
<div |
|||
v-if="process.approvalStatue == 0 && process.isdangqian == 0" |
|||
class="text-gray-300" |
|||
> |
|||
{{ process.taskName }} |
|||
</div> |
|||
<div v-else> |
|||
{{ process.taskName }} |
|||
</div> |
|||
<div |
|||
v-if="process.approvalStatue == 0 && process.isdangqian == 1" |
|||
class="ml-9 text-yellow-600" |
|||
> |
|||
{{ process.timedays }} |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<template #description> |
|||
<elstepchild v-if="item.children!=null" :child="item.children"></elstepchild> |
|||
<elstepchild v-if="item.children != null" :child="item.children"></elstepchild> |
|||
</template> |
|||
</el-step> |
|||
</el-steps> |
|||
<planinfoFileDetail @register="registerFileInfo" /> |
|||
</template> |
|||
<script lang="ts" name="viewPlanDetail" setup> |
|||
import elstepchild from './elstepchild.vue' |
|||
let dataTo = defineProps(["child"]) |
|||
import { defineProps, ref } from 'vue'; |
|||
import elstepchild from './elstepchild.vue'; |
|||
import { DownOutlined } from '@ant-design/icons-vue'; |
|||
import { getProcessDetailByPlaninfoid } from './projectPlan.api'; |
|||
import { useModal } from '@/components/Modal'; |
|||
import planinfoFileDetail from './planinfoFileDetail.vue'; |
|||
|
|||
const [registerFileInfo, { openModal: openFileInfo }] = useModal(); //文件上传和查看 |
|||
let dataTo = defineProps(['child']); |
|||
async function handleShowprocess(item) { |
|||
item['processDetail'] = await getProcessDetailByPlaninfoid({ planinfoid: item.id }); |
|||
|
|||
//更加id查询流程进度情况 |
|||
if (item['showProcessDetail']) { |
|||
item['showProcessDetail'] = !item['showProcessDetail']; |
|||
} else { |
|||
item['showProcessDetail'] = true; |
|||
} |
|||
console.log('processDetail', item.processDetail); |
|||
} |
|||
function clickDetail(item) { |
|||
openFileInfo(true, { |
|||
planinfoid: item.id, |
|||
taskName: item.taskName, |
|||
isfinish: item.isfinish, |
|||
projectid: item.projectId, |
|||
}); |
|||
} |
|||
</script> |
|||
<style scoped></style> |
|||
|
|||
<style lang="less" scoped> |
|||
@publicColor: #0ac00d; |
|||
@publicHeight: 35px; |
|||
.steps { |
|||
::v-deep .el-step { |
|||
.el-step__head.is-process { |
|||
color: @publicColor; |
|||
border-color: @publicColor; |
|||
} |
|||
.el-step__head.is-success { |
|||
color: @publicColor; |
|||
border-color: @publicColor; |
|||
} |
|||
.is-process .el-step__icon.is-text { |
|||
background: @publicColor; |
|||
color: #fff; |
|||
} |
|||
.el-step__title.is-process { |
|||
color: @publicColor; |
|||
} |
|||
.el-step__title.is-success { |
|||
color: @publicColor; |
|||
} |
|||
} |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,156 @@ |
|||
<template> |
|||
<!-- 自定义表单 --> |
|||
<PageWrapper dense> |
|||
<BasicTable @register="registerTable" @fetch-success="fetchSuccess"> |
|||
<template #action="{ record }"> |
|||
<TableAction :actions="getTableAction(record)" /> |
|||
</template> |
|||
<template #tableTitle> |
|||
<a-button type="primary" @click="setWancheng" shape="round" v-if="isShowByRoles('org')">线下完成情况</a-button> |
|||
</template> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
</template> |
|||
<template #headerTop> |
|||
<div class="container mx-auto mt-4 mb-4 h-20"> |
|||
<div class="grid grid-cols-5 gap-4 h-full"> |
|||
<div class="bg-[#1890FF] opacity-100 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目申报阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[0].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-90 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目立项阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[1].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-85 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目采购阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[2].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-80 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目建设阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[3].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-70 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目验收阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[5].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
</BasicTable> |
|||
|
|||
<BasicModal |
|||
@register="registeruploadFile" |
|||
title="查看进度" |
|||
width="1200px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<showtu :res="showtuList" /> |
|||
</BasicModal> |
|||
<SetWanCheng @register="registerwancheng"></SetWanCheng> |
|||
</PageWrapper> |
|||
</template> |
|||
<script lang="ts" name="addAndModify" setup> |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { ref, onMounted } from 'vue'; |
|||
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table'; |
|||
import { useModalInner, BasicModal } from '@/components/Modal'; |
|||
import { |
|||
detailColumn, |
|||
searchFormSchema, |
|||
} from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { |
|||
getProjectDetailPage, |
|||
getCountStage, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import { queryPlanInfoMainTimeline } from '@/views/projectLib/projectPlan/projectPlan.api'; |
|||
import showtu from '@/views/projectLib/projectPlan/showtu.vue'; |
|||
import { useModal } from '@/components/Modal'; |
|||
import { isShowByRoles } from '@/views/projectLib/projectInfo/projectInfo.api'; |
|||
import SetWanCheng from '@/views/projectSummary/planSummary/SetWanCheng.vue'; |
|||
const [registeruploadFile, { openModal: openPlanFile, closeModal: closePlanFile }] = useModal(); //文件上传和查看 |
|||
const [registerwancheng, { openModal }] = useModal(); |
|||
let fatherData = ref<any>(); |
|||
let showtuList = ref<Array<Object>>(); |
|||
|
|||
const emit = defineEmits(['close']); |
|||
let pageType = ref<string>('renwu'); |
|||
let countStage = ref<any>([ |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
]); |
|||
const [registerTable, { getForm, setProps }] = useTable({ |
|||
api: getProjectDetailPage, |
|||
columns: detailColumn, |
|||
showIndexColumn: false, |
|||
useSearchForm: true, |
|||
actionColumn: { |
|||
width: 140, |
|||
title: '操作', |
|||
dataIndex: 'action', |
|||
slots: { customRender: 'action' }, |
|||
}, |
|||
//表单查询项设置 |
|||
formConfig: { |
|||
schemas: searchFormSchema, |
|||
}, |
|||
}); |
|||
function getTableAction(record): ActionItem[] { |
|||
return [ |
|||
{ |
|||
label: '查看进度', |
|||
onClick: handlejindu.bind(null, record), |
|||
ifShow: () => { |
|||
if (record.projectStage == '项目申报阶段') { |
|||
return false; |
|||
} else { |
|||
return true; |
|||
} |
|||
}, |
|||
}, |
|||
]; |
|||
} |
|||
async function fetchSuccess() { |
|||
let formdata = await getForm().getFieldsValue(); |
|||
countStage.value = await getCountStage(formdata); |
|||
console.log('afterFetch', formdata); |
|||
} |
|||
async function handlejindu(record) { |
|||
showtuList.value = await queryPlanInfoMainTimeline({ projectid: record.id }); |
|||
openPlanFile(true); |
|||
} |
|||
function setWancheng() { |
|||
openModal(true,fatherData.value); |
|||
} |
|||
</script> |
|||
<style></style> |
@ -0,0 +1,95 @@ |
|||
<template> |
|||
<!-- 自定义表单 --> |
|||
<BasicModal |
|||
v-bind="$attrs" |
|||
@register="registerModal" |
|||
title="入库项目汇总详情" |
|||
width="1700px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<BasicTable @register="registerTable"> |
|||
<template #action="{ record }"> |
|||
<TableAction :actions="getTableAction(record)" /> |
|||
</template> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
</template> |
|||
</BasicTable> |
|||
</BasicModal> |
|||
<BasicModal |
|||
@register="registeruploadFile" |
|||
title="查看进度" |
|||
width="1200px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<settu :res="showtuList" /> |
|||
</BasicModal> |
|||
</template> |
|||
<script lang="ts" name="addAndModify" setup> |
|||
import { ref, onMounted } from 'vue'; |
|||
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table'; |
|||
import { useModalInner, BasicModal } from '@/components/Modal'; |
|||
import { |
|||
detailColumn, |
|||
searchFormSchema, |
|||
} from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { |
|||
getProjectDetailPage, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import settu from './settu.vue'; |
|||
import { useModal } from '@/components/Modal'; |
|||
import { queryPlanInfoMainTimelineOffline } from '@/views/projectLib/projectPlan/projectPlan.api'; |
|||
|
|||
const [registeruploadFile, { openModal: openPlanFile, closeModal: closePlanFile }] = useModal(); //文件上传和查看 |
|||
|
|||
let showtuList = ref<Array<Object>>(); |
|||
|
|||
const emit = defineEmits(['close']); |
|||
let pageType = ref<string>('renwu'); |
|||
|
|||
const [registerModal, { closeModal }] = useModalInner(); |
|||
const [registerTable, { getForm, setProps }] = useTable({ |
|||
api: getProjectDetailPage, |
|||
columns: detailColumn, |
|||
showIndexColumn: false, |
|||
useSearchForm: true, |
|||
actionColumn: { |
|||
width: 140, |
|||
title: '操作', |
|||
dataIndex: 'action', |
|||
slots: { customRender: 'action' }, |
|||
}, |
|||
//表单查询项设置 |
|||
formConfig: { |
|||
schemas: searchFormSchema, |
|||
}, |
|||
}); |
|||
function getTableAction(record): ActionItem[] { |
|||
return [ |
|||
{ |
|||
label: '填写', |
|||
onClick: handleset.bind(null, record), |
|||
ifShow: () => { |
|||
if (record.projectStage == '项目申报阶段') { |
|||
return false; |
|||
} else { |
|||
return true; |
|||
} |
|||
}, |
|||
}, |
|||
]; |
|||
} |
|||
async function handleset(record) { |
|||
showtuList.value = await queryPlanInfoMainTimelineOffline({ projectid: record.id }); |
|||
openPlanFile(true); |
|||
} |
|||
|
|||
|
|||
function dialogVisible() { |
|||
closeModal(); |
|||
emit('close'); |
|||
} |
|||
</script> |
|||
<style></style> |
@ -0,0 +1,179 @@ |
|||
<template> |
|||
<!-- 自定义表单 --> |
|||
<BasicModal |
|||
v-bind="$attrs" |
|||
@register="registerModal" |
|||
title="入库项目汇总详情" |
|||
width="1700px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<BasicTable @register="registerTable" @fetch-success="fetchSuccess"> |
|||
<template #action="{ record }"> |
|||
<TableAction :actions="getTableAction(record)" /> |
|||
</template> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
</template> |
|||
<template #headerTop> |
|||
<div class="container mx-auto mt-4 mb-4 h-20"> |
|||
<div class="grid grid-cols-5 gap-4 h-full"> |
|||
<div class="bg-[#1890FF] opacity-100 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目申报阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[0].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-90 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目立项阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[1].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-85 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目采购阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[2].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-80 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目建设阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[3].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
<div class="bg-[#1890FF] opacity-70 h-full"> |
|||
<div class="grid grid-cols-4 gap-1 h-full"> |
|||
<div class="col-span-3 mt-4 ml-4 text-white">项目验收阶段</div> |
|||
<div |
|||
class="col-span-1 flex justify-center items-center text-white text-4xl font-bold" |
|||
>{{ countStage[5].value }}</div |
|||
> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
</BasicTable> |
|||
</BasicModal> |
|||
<BasicModal |
|||
@register="registeruploadFile" |
|||
title="查看进度" |
|||
width="1200px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<showtu :res="showtuList" /> |
|||
</BasicModal> |
|||
<SetWanCheng @register="registerwancheng"></SetWanCheng> |
|||
|
|||
</template> |
|||
<script lang="ts" name="addAndModify" setup> |
|||
import { ref, onMounted } from 'vue'; |
|||
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table'; |
|||
import { useModalInner, BasicModal } from '@/components/Modal'; |
|||
import { |
|||
detailColumn, |
|||
searchFormSchemacengji, |
|||
searchFormSchemarenwu, |
|||
} from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { |
|||
getProjectDetailPage, |
|||
getCountStage, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import { queryPlanInfoMainTimeline } from '@/views/projectLib/projectPlan/projectPlan.api'; |
|||
import showtu from '@/views/projectLib/projectPlan/showtu.vue'; |
|||
import { useModal } from '@/components/Modal'; |
|||
import { isShowByRoles } from '@/views/projectLib/projectInfo/projectInfo.api'; |
|||
import SetWanCheng from './SetWanCheng.vue'; |
|||
const [registeruploadFile, { openModal: openPlanFile, closeModal: closePlanFile }] = useModal(); //文件上传和查看 |
|||
const [registerwancheng, { openModal }] = useModal(); |
|||
let fatherData = ref<any>(); |
|||
let showtuList = ref<Array<Object>>(); |
|||
|
|||
const emit = defineEmits(['close']); |
|||
let pageType = ref<string>('renwu'); |
|||
let countStage = ref<any>([ |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
{ value: 0 }, |
|||
]); |
|||
const [registerModal, { closeModal }] = useModalInner(init); |
|||
async function init(data) { |
|||
fatherData.value=data; |
|||
pageType.value = data.pageType; |
|||
console.log('pageType', data.pageType); |
|||
if (data.pageType == 'cengji') { |
|||
setProps({ formConfig: { schemas: searchFormSchemacengji } }); |
|||
getForm().setFieldsValue(data.form); |
|||
} else { |
|||
setProps({ formConfig: { schemas: searchFormSchemarenwu } }); |
|||
getForm().setFieldsValue(data.form); |
|||
} |
|||
// countStage.value=await getCountStage() |
|||
console.log('countStage', countStage.value); |
|||
} |
|||
const [registerTable, { getForm, setProps }] = useTable({ |
|||
api: getProjectDetailPage, |
|||
columns: detailColumn, |
|||
showIndexColumn: false, |
|||
useSearchForm: true, |
|||
actionColumn: { |
|||
width: 140, |
|||
title: '操作', |
|||
dataIndex: 'action', |
|||
slots: { customRender: 'action' }, |
|||
}, |
|||
//表单查询项设置 |
|||
formConfig: { |
|||
schemas: searchFormSchemacengji, |
|||
}, |
|||
}); |
|||
function getTableAction(record): ActionItem[] { |
|||
return [ |
|||
{ |
|||
label: '查看进度', |
|||
onClick: handlejindu.bind(null, record), |
|||
ifShow: () => { |
|||
if (record.projectStage == '项目申报阶段') { |
|||
return false; |
|||
} else { |
|||
return true; |
|||
} |
|||
}, |
|||
}, |
|||
]; |
|||
} |
|||
async function fetchSuccess() { |
|||
let formdata = await getForm().getFieldsValue(); |
|||
countStage.value = await getCountStage(formdata); |
|||
console.log('afterFetch', formdata); |
|||
} |
|||
async function handlejindu(record) { |
|||
showtuList.value = await queryPlanInfoMainTimeline({ projectid: record.id }); |
|||
openPlanFile(true); |
|||
} |
|||
function setWancheng() { |
|||
openModal(true,fatherData.value); |
|||
} |
|||
function dialogVisible() { |
|||
closeModal(); |
|||
emit('close'); |
|||
} |
|||
</script> |
|||
<style></style> |
@ -0,0 +1,124 @@ |
|||
<template> |
|||
<!-- 自定义表单 --> |
|||
<BasicModal |
|||
v-bind="$attrs" |
|||
@register="registerModal" |
|||
title="入库项目汇总" |
|||
width="1600px" |
|||
:showOkBtn="false" |
|||
:showCancelBtn="false" |
|||
> |
|||
<BasicTable @register="registerTable"> |
|||
<template #action="{ record }"> |
|||
<TableAction :actions="getTableAction(record)" /> |
|||
</template> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
</template> |
|||
</BasicTable> |
|||
</BasicModal> |
|||
<ShowDetailPage @register="register" /> |
|||
</template> |
|||
<script lang="ts" name="addAndModify" setup> |
|||
import { ref } from 'vue'; |
|||
import { ActionItem, BasicTable, TableAction, useTable } from '@/components/Table'; |
|||
import { useModalInner, BasicModal, useModal } from '@/components/Modal'; |
|||
import { |
|||
renwuSummaryDetailColumn, |
|||
cengjiSummaryDetailColumn, |
|||
} from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { |
|||
getProjectSummaryPage, |
|||
getProjectSummaryPageByTask, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import ShowDetailPage from './ShowDetailPage.vue'; |
|||
const [register, { openModal }] = useModal(); |
|||
|
|||
const emit = defineEmits(['close']); |
|||
let pageType = ref<string>('renwu'); |
|||
const [registerModal, { closeModal }] = useModalInner(init); |
|||
function init(data) { |
|||
pageType.value = data.type; |
|||
console.log('pageType', data.type); |
|||
if (data.type == 'cengji') { |
|||
setColumns(cengjiSummaryDetailColumn); |
|||
setProps({ api: getProjectSummaryPage }); |
|||
} else { |
|||
setColumns(renwuSummaryDetailColumn); |
|||
setProps({ api: getProjectSummaryPageByTask }); |
|||
} |
|||
} |
|||
const [registerTable, { setColumns, setProps }] = useTable({ |
|||
api: getProjectSummaryPageByTask, |
|||
columns: renwuSummaryDetailColumn, |
|||
showIndexColumn: false, |
|||
useSearchForm: false, |
|||
actionColumn: { |
|||
width: 140, |
|||
title: '操作', |
|||
dataIndex: 'action', |
|||
slots: { customRender: 'action' }, |
|||
}, |
|||
showSummary: true, |
|||
summaryFunc: onSummary, |
|||
}); |
|||
function getTableAction(record): ActionItem[] { |
|||
return [ |
|||
{ |
|||
label: '详情', |
|||
onClick: handleDatail.bind(null, record), |
|||
}, |
|||
]; |
|||
} |
|||
function handleDatail(record) { |
|||
openModal(true, { |
|||
pageType: pageType.value, |
|||
form: { |
|||
dutyWorkplace: record.dutyWorkplace, |
|||
reformName: record.reformName, |
|||
superLeader: record.superLeader, |
|||
}, |
|||
}); |
|||
} |
|||
function mapTableTotalSummary(tableData, fields) { |
|||
let totals = {}; |
|||
fields.forEach((field) => { |
|||
totals[field] = tableData.reduce((acc, item) => acc + Number(item[field]), 0); |
|||
}); |
|||
return totals; |
|||
} |
|||
|
|||
function onSummary(tableData: Recordable[]) { |
|||
const totals = mapTableTotalSummary(tableData, [ |
|||
'projectNum', |
|||
'projectProgress', |
|||
'totalMoney', |
|||
'centralMoney', |
|||
'estimateMoney', |
|||
'contractMoney', |
|||
'contractCentralMoney', |
|||
]); |
|||
console.log('onSummary****totals>>>', totals); |
|||
return [ |
|||
// totals, |
|||
{ |
|||
reformName: '总计', |
|||
// superLeader:"总计", |
|||
dutyWorkplace: '总计', |
|||
// 计算平均值 |
|||
projectNum: totals.projectNum, |
|||
centralMoney: totals.centralMoney, |
|||
totalMoney: totals.totalMoney, |
|||
estimateMoney: totals.estimateMoney, |
|||
contractMoney: totals.contractMoney, |
|||
contractCentralMoney: totals.contractCentralMoney, |
|||
projectProgress: (totals.projectProgress / tableData.length).toFixed(2), |
|||
}, |
|||
]; |
|||
} |
|||
function dialogVisible() { |
|||
closeModal(); |
|||
emit('close'); |
|||
} |
|||
</script> |
|||
<style></style> |
@ -1,193 +1,155 @@ |
|||
<template> |
|||
<PageWrapper dense> |
|||
<!--引用表格--> |
|||
<BasicTable @register="registerTable"> |
|||
|
|||
<template v-for="(item, index) in planSummary" v-slot:[item.dataIndex]="{ record }"> |
|||
<div v-if="record[item.dataIndex]"> |
|||
<span>{{ record[item.dataIndex].taskName }}</span> |
|||
<Progress type="circle" :percent="record[item.dataIndex].percent" :size="20" :strokeColor="record[item.dataIndex].color" @click="handleViewPlanDetail(record[item.dataIndex].id, record[item.dataIndex].color)"></Progress> |
|||
</div> |
|||
</template> |
|||
<!-- <template #phaseNumber0="{ record }"> |
|||
<div v-if="record.phaseNumber0"> |
|||
<span>{{ record.phaseNumber0.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber0.percent" :size="20" :strokeColor="record.phaseNumber0.color"></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber1="{ record }"> |
|||
<div v-if="record.phaseNumber1"> |
|||
<span>{{ record.phaseNumber1.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber1.percent" :size="20" :strokeColor="record.phaseNumber1.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber2="{ record }"> |
|||
<div v-if="record.phaseNumber2"> |
|||
<span>{{ record.phaseNumber2.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber2.percent" :size="20" :strokeColor="record.phaseNumber2.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber3="{ record }"> |
|||
<div v-if="record.phaseNumber3"> |
|||
<span>{{ record.phaseNumber3.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber3.percent" :size="20" :strokeColor="record.phaseNumber3.color" ></Progress> |
|||
</div> |
|||
|
|||
|
|||
</template> |
|||
<template #phaseNumber4="{ record }"> |
|||
<div v-if="record.phaseNumber4"> |
|||
<span>{{ record.phaseNumber4.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber4.percent" :size="20" :strokeColor="record.phaseNumber4.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber5="{ record }"> |
|||
<div v-if="record.phaseNumber5"> |
|||
<span>{{ record.phaseNumber5.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber5.percent" :size="20" :strokeColor="record.phaseNumber5.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber6="{ record }"> |
|||
<div v-if="record.phaseNumber6"> |
|||
<span>{{ record.phaseNumber6.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber6.percent" :size="20" :strokeColor="record.phaseNumber6.color" ></Progress> |
|||
</div> |
|||
</template> --> |
|||
|
|||
</BasicTable> |
|||
<!-- <BasicModal @register="registeViewPlanDetail" title="项目计划详情" width="1200px" :showOkBtn="false"> |
|||
<viewPlanDetail :projectId="projectId" :projectStage="projectStage" /> |
|||
</BasicModal> |
|||
<BasicModal @register="registerProjectPlan" title="发起项目计划审批" width="1200px" :showOkBtn="false" |
|||
:showCancelBtn="false"> |
|||
<addPlan :type="type" :projectid="projectId" @close="closeProjectPlanModal()" /> |
|||
</BasicModal> --> |
|||
<div> |
|||
<a-tabs v-model:activeKey="activeKey" type="card"> |
|||
<a-tab-pane key="1" tab="入库项目汇总(按任务)"> |
|||
<BasicTable @register="registerRenwuTable"> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
<a-button type="primary" @click="showMore('renwu')" shape="round">更多</a-button> |
|||
</template> |
|||
</BasicTable> |
|||
</a-tab-pane> |
|||
<a-tab-pane key="2" tab="入库项目汇总(按层级)"> |
|||
<BasicTable @register="registerCengjiTable"> |
|||
<template #toolbar> |
|||
<div class="text-base font-bold">单位:(万元)</div> |
|||
<a-button type="primary" @click="showMore('cengji')" shape="round">更多</a-button> |
|||
</template> |
|||
</BasicTable> |
|||
</a-tab-pane> |
|||
</a-tabs> |
|||
|
|||
<ShowMorePage @register="register" /> |
|||
</div> |
|||
</PageWrapper> |
|||
|
|||
</template> |
|||
|
|||
<script lang="ts" name="planSummary" setup> |
|||
//ts语法 |
|||
import { ref, onMounted } from 'vue'; |
|||
import { BasicTable, useTable } from '@/components/Table'; |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { Progress } from 'ant-design-vue'; |
|||
|
|||
import { searchFormSchema } from '@/views/projectLib/projectInfo/projectInfo.data'; |
|||
import { planSummaryColumn } from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { getplanSummary } from '@/views/projectSummary/planSummary/planSummary.api' |
|||
|
|||
onMounted(async () => { |
|||
|
|||
}) |
|||
let planSummary = ref<Array<any>>([]); |
|||
|
|||
const [registerTable, { setColumns }] = useTable({ |
|||
api: getplanSummary, |
|||
columns: planSummaryColumn, |
|||
rowKey:"projectName", |
|||
showIndexColumn:false, |
|||
useSearchForm: true, |
|||
// actionColumn: { |
|||
// width: 140, |
|||
// title: '操作', |
|||
// dataIndex: 'action', |
|||
// slots: { customRender: 'action' }, |
|||
// }, |
|||
afterFetch: (data) => { |
|||
planSummary.value.pop() |
|||
let temp = JSON.parse(JSON.stringify(planSummaryColumn)) |
|||
data.forEach(item => { |
|||
Object.entries(item).forEach(([key, value]) => { |
|||
if (key.includes("phaseNumber")) { |
|||
let keyExists = true; |
|||
Object.entries(temp).forEach(([keytemp, valuetemp]) => { |
|||
if (valuetemp.dataIndex == key) { |
|||
keyExists = false |
|||
return |
|||
} |
|||
}) |
|||
if (keyExists) { |
|||
temp.push({ |
|||
title: key.replace("phaseNumber", "阶段"), |
|||
dataIndex: key, |
|||
slots: { customRender: key }, |
|||
align:'left' |
|||
}) |
|||
planSummary.value.push({ |
|||
title: key, |
|||
dataIndex: key, |
|||
}) |
|||
} |
|||
} |
|||
|
|||
}); |
|||
}) |
|||
console.log("lanSummary.valu", planSummary.value); |
|||
setColumns(temp) |
|||
}, |
|||
//表单查询项设置 |
|||
formConfig: { |
|||
schemas: searchFormSchema, |
|||
//ts语法 |
|||
import { ref, onMounted } from 'vue'; |
|||
import { BasicTable, useTable } from '@/components/Table'; |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { renwuColumn, cengjiColumn } from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { |
|||
getProjectSummaryPage, |
|||
getProjectSummaryPageByTask, |
|||
} from '@/views/projectSummary/planSummary/planSummary.api'; |
|||
import { useModal, BasicModal } from '@/components/Modal'; |
|||
import ShowMorePage from './ShowMorePage.vue'; |
|||
const [register, { openModal }] = useModal(); |
|||
|
|||
onMounted(async () => {}); |
|||
let planSummary = ref<Array<any>>([]); |
|||
let activeKey = ref('1'); |
|||
const [registerRenwuTable] = useTable({ |
|||
api: getProjectSummaryPageByTask, |
|||
title: '入库项目汇总', |
|||
columns: renwuColumn, |
|||
rowKey: 'projectName', |
|||
showIndexColumn: false, |
|||
useSearchForm: false, |
|||
showSummary: true, |
|||
summaryFunc: onSummary, |
|||
// actionColumn: { |
|||
// width: 140, |
|||
// title: '操作', |
|||
// dataIndex: 'action', |
|||
// slots: { customRender: 'action' }, |
|||
// }, |
|||
}); |
|||
const [registerCengjiTable] = useTable({ |
|||
api: getProjectSummaryPage, |
|||
title: '入库项目汇总', |
|||
columns: cengjiColumn, |
|||
rowKey: 'projectName', |
|||
showIndexColumn: false, |
|||
useSearchForm: false, |
|||
showSummary: true, |
|||
summaryFunc: onSummary, |
|||
// actionColumn: { |
|||
// width: 140, |
|||
// title: '操作', |
|||
// dataIndex: 'action', |
|||
// slots: { customRender: 'action' }, |
|||
// }, |
|||
}); |
|||
function mapTableTotalSummary(tableData, fields) { |
|||
let totals = {}; |
|||
fields.forEach((field) => { |
|||
totals[field] = tableData.reduce((acc, item) => acc + Number(item[field]), 0); |
|||
}); |
|||
return totals; |
|||
} |
|||
function showMore(type) { |
|||
openModal(true, { type: type }); |
|||
console.log(type); |
|||
} |
|||
function onSummary(tableData: Recordable[]) { |
|||
const totals = mapTableTotalSummary(tableData, ["projectNum", 'projectProgress',"totalMoney","centralMoney"]); |
|||
console.log('onSummary****totals>>>', totals); |
|||
return [ |
|||
// totals, |
|||
{ |
|||
reformName: '总计', |
|||
// superLeader:"总计", |
|||
dutyWorkplace: '总计', |
|||
// 计算平均值 |
|||
projectNum: totals.projectNum , |
|||
centralMoney:totals.centralMoney, |
|||
totalMoney:totals.totalMoney, |
|||
projectProgress: (totals.projectProgress / tableData.length).toFixed(2), |
|||
|
|||
}, |
|||
]; |
|||
} |
|||
|
|||
}); |
|||
function handleViewPlanDetail(projectId: string, color: string) { |
|||
console.log("handleViewPlanDetail", projectId, color); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
</script> |
|||
|
|||
<style scoped> |
|||
.timeline { |
|||
display: flex; |
|||
width: 100%; |
|||
margin-bottom: 100px; |
|||
|
|||
.lineitem { |
|||
transform: translateX(50%); |
|||
width: 25%; |
|||
.timeline { |
|||
display: flex; |
|||
width: 100%; |
|||
margin-bottom: 100px; |
|||
|
|||
.lineitem { |
|||
transform: translateX(50%); |
|||
width: 25%; |
|||
} |
|||
} |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__tail { |
|||
border-left: none; |
|||
width: 100%; |
|||
border-top: 2px solid #e4e7ed; |
|||
position: absolute; |
|||
top: 6px; |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__wrapper { |
|||
padding-left: 0; |
|||
position: absolute; |
|||
top: 20px; |
|||
transform: translateX(-50%); |
|||
text-align: center; |
|||
} |
|||
::v-deep .el-timeline-item__tail { |
|||
border-left: none; |
|||
width: 100%; |
|||
border-top: 2px solid #e4e7ed; |
|||
position: absolute; |
|||
top: 6px; |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__timestamp { |
|||
font-size: 14px; |
|||
} |
|||
::v-deep .el-timeline-item__wrapper { |
|||
padding-left: 0; |
|||
position: absolute; |
|||
top: 20px; |
|||
transform: translateX(-50%); |
|||
text-align: center; |
|||
} |
|||
|
|||
.nested-timeline { |
|||
margin-left: 20px; |
|||
border-left: 1px dashed #ccc; |
|||
padding-left: 20px; |
|||
} |
|||
::v-deep .el-timeline-item__timestamp { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.nested-timeline-item { |
|||
margin-bottom: 10px; |
|||
} |
|||
.nested-timeline { |
|||
margin-left: 20px; |
|||
border-left: 1px dashed #ccc; |
|||
padding-left: 20px; |
|||
} |
|||
|
|||
.nested-timeline-item { |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
::v-deep .ant-table-expanded-row { |
|||
height: auto !important; |
|||
/* 其他样式 */ |
|||
} |
|||
</style> |
|||
::v-deep .ant-table-expanded-row { |
|||
height: auto !important; |
|||
/* 其他样式 */ |
|||
} |
|||
</style> |
|||
|
@ -0,0 +1,193 @@ |
|||
<template> |
|||
<PageWrapper dense> |
|||
<!--引用表格--> |
|||
<BasicTable @register="registerTable"> |
|||
|
|||
<template v-for="(item, index) in planSummary" v-slot:[item.dataIndex]="{ record }"> |
|||
<div v-if="record[item.dataIndex]"> |
|||
<span>{{ record[item.dataIndex].taskName }}</span> |
|||
<Progress type="circle" :percent="record[item.dataIndex].percent" :size="20" :strokeColor="record[item.dataIndex].color" @click="handleViewPlanDetail(record[item.dataIndex].id, record[item.dataIndex].color)"></Progress> |
|||
</div> |
|||
</template> |
|||
<!-- <template #phaseNumber0="{ record }"> |
|||
<div v-if="record.phaseNumber0"> |
|||
<span>{{ record.phaseNumber0.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber0.percent" :size="20" :strokeColor="record.phaseNumber0.color"></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber1="{ record }"> |
|||
<div v-if="record.phaseNumber1"> |
|||
<span>{{ record.phaseNumber1.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber1.percent" :size="20" :strokeColor="record.phaseNumber1.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber2="{ record }"> |
|||
<div v-if="record.phaseNumber2"> |
|||
<span>{{ record.phaseNumber2.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber2.percent" :size="20" :strokeColor="record.phaseNumber2.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber3="{ record }"> |
|||
<div v-if="record.phaseNumber3"> |
|||
<span>{{ record.phaseNumber3.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber3.percent" :size="20" :strokeColor="record.phaseNumber3.color" ></Progress> |
|||
</div> |
|||
|
|||
|
|||
</template> |
|||
<template #phaseNumber4="{ record }"> |
|||
<div v-if="record.phaseNumber4"> |
|||
<span>{{ record.phaseNumber4.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber4.percent" :size="20" :strokeColor="record.phaseNumber4.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber5="{ record }"> |
|||
<div v-if="record.phaseNumber5"> |
|||
<span>{{ record.phaseNumber5.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber5.percent" :size="20" :strokeColor="record.phaseNumber5.color" ></Progress> |
|||
</div> |
|||
</template> |
|||
<template #phaseNumber6="{ record }"> |
|||
<div v-if="record.phaseNumber6"> |
|||
<span>{{ record.phaseNumber6.taskName }}</span> |
|||
<Progress type="circle" :percent="record.phaseNumber6.percent" :size="20" :strokeColor="record.phaseNumber6.color" ></Progress> |
|||
</div> |
|||
</template> --> |
|||
|
|||
</BasicTable> |
|||
<!-- <BasicModal @register="registeViewPlanDetail" title="项目计划详情" width="1200px" :showOkBtn="false"> |
|||
<viewPlanDetail :projectId="projectId" :projectStage="projectStage" /> |
|||
</BasicModal> |
|||
<BasicModal @register="registerProjectPlan" title="发起项目计划审批" width="1200px" :showOkBtn="false" |
|||
:showCancelBtn="false"> |
|||
<addPlan :type="type" :projectid="projectId" @close="closeProjectPlanModal()" /> |
|||
</BasicModal> --> |
|||
</PageWrapper> |
|||
|
|||
</template> |
|||
|
|||
<script lang="ts" name="planSummary" setup> |
|||
//ts语法 |
|||
import { ref, onMounted } from 'vue'; |
|||
import { BasicTable, useTable } from '@/components/Table'; |
|||
import { PageWrapper } from '@/components/Page'; |
|||
import { Progress } from 'ant-design-vue'; |
|||
|
|||
import { searchFormSchema } from '@/views/projectLib/projectInfo/projectInfo.data'; |
|||
import { planSummaryColumn } from '@/views/projectSummary/planSummary/planSummary.data'; |
|||
import { getplanSummary } from '@/views/projectSummary/planSummary/planSummary.api' |
|||
|
|||
onMounted(async () => { |
|||
|
|||
}) |
|||
let planSummary = ref<Array<any>>([]); |
|||
|
|||
const [registerTable, { setColumns }] = useTable({ |
|||
api: getplanSummary, |
|||
columns: planSummaryColumn, |
|||
rowKey:"projectName", |
|||
showIndexColumn:false, |
|||
useSearchForm: true, |
|||
// actionColumn: { |
|||
// width: 140, |
|||
// title: '操作', |
|||
// dataIndex: 'action', |
|||
// slots: { customRender: 'action' }, |
|||
// }, |
|||
afterFetch: (data) => { |
|||
planSummary.value.pop() |
|||
let temp = JSON.parse(JSON.stringify(planSummaryColumn)) |
|||
data.forEach(item => { |
|||
Object.entries(item).forEach(([key, value]) => { |
|||
if (key.includes("phaseNumber")) { |
|||
let keyExists = true; |
|||
Object.entries(temp).forEach(([keytemp, valuetemp]) => { |
|||
if (valuetemp.dataIndex == key) { |
|||
keyExists = false |
|||
return |
|||
} |
|||
}) |
|||
if (keyExists) { |
|||
temp.push({ |
|||
title: key.replace("phaseNumber", "阶段"), |
|||
dataIndex: key, |
|||
slots: { customRender: key }, |
|||
align:'left' |
|||
}) |
|||
planSummary.value.push({ |
|||
title: key, |
|||
dataIndex: key, |
|||
}) |
|||
} |
|||
} |
|||
|
|||
}); |
|||
}) |
|||
console.log("lanSummary.valu", planSummary.value); |
|||
setColumns(temp) |
|||
}, |
|||
//表单查询项设置 |
|||
formConfig: { |
|||
schemas: searchFormSchema, |
|||
} |
|||
|
|||
}); |
|||
function handleViewPlanDetail(projectId: string, color: string) { |
|||
console.log("handleViewPlanDetail", projectId, color); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
</script> |
|||
|
|||
<style scoped> |
|||
.timeline { |
|||
display: flex; |
|||
width: 100%; |
|||
margin-bottom: 100px; |
|||
|
|||
.lineitem { |
|||
transform: translateX(50%); |
|||
width: 25%; |
|||
} |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__tail { |
|||
border-left: none; |
|||
width: 100%; |
|||
border-top: 2px solid #e4e7ed; |
|||
position: absolute; |
|||
top: 6px; |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__wrapper { |
|||
padding-left: 0; |
|||
position: absolute; |
|||
top: 20px; |
|||
transform: translateX(-50%); |
|||
text-align: center; |
|||
} |
|||
|
|||
::v-deep .el-timeline-item__timestamp { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.nested-timeline { |
|||
margin-left: 20px; |
|||
border-left: 1px dashed #ccc; |
|||
padding-left: 20px; |
|||
} |
|||
|
|||
.nested-timeline-item { |
|||
margin-bottom: 10px; |
|||
} |
|||
|
|||
|
|||
::v-deep .ant-table-expanded-row { |
|||
height: auto !important; |
|||
/* 其他样式 */ |
|||
} |
|||
</style> |
@ -0,0 +1,68 @@ |
|||
<template> |
|||
<el-steps direction="vertical" finish-status="success" class="steps"> |
|||
<el-step |
|||
v-for="(item, index) in dataTo.child" |
|||
:key="index" |
|||
:status="item.isoffline == 1 ? 'success' : 'wait' " |
|||
> |
|||
<template #title> |
|||
<a-button type="text" @click="handleClickStep(item)"> |
|||
<template #default> |
|||
<div class="flex text-[#0ac00d]" v-if="item.isoffline == 1"> |
|||
{{ item.taskName }} |
|||
</div> |
|||
<div v-else> |
|||
{{ item.taskName }} |
|||
</div> |
|||
</template> |
|||
</a-button> |
|||
</template> |
|||
<template #description> |
|||
<setElstepchild v-if="item.children != null" :child="item.children"></setElstepchild> |
|||
</template> |
|||
</el-step> |
|||
</el-steps> |
|||
</template> |
|||
<script lang="ts" name="viewPlanDetail" setup> |
|||
import { defineProps, ref } from 'vue'; |
|||
import setElstepchild from './setElstepchild.vue'; |
|||
import { useModal } from '@/components/Modal'; |
|||
import { setPlaninfoIsoffline } from '@/views/projectLib/projectPlan/projectPlan.api'; |
|||
|
|||
let dataTo = defineProps(['child']); |
|||
function handleClickStep(item) { |
|||
if(item.isoffline == 1){ |
|||
item.isoffline = 0; |
|||
}else{ |
|||
item.isoffline = 1; |
|||
} |
|||
setPlaninfoIsoffline({id:item.id,isoffline:item.isoffline}) |
|||
console.log(item); |
|||
} |
|||
</script> |
|||
<style lang="less" scoped> |
|||
@publicColor: #0ac00d; |
|||
@publicHeight: 35px; |
|||
.steps { |
|||
::v-deep .el-step { |
|||
.el-step__head.is-process { |
|||
color: @publicColor; |
|||
border-color: @publicColor; |
|||
} |
|||
.el-step__head.is-success { |
|||
color: @publicColor; |
|||
border-color: @publicColor; |
|||
} |
|||
.is-process .el-step__icon.is-text { |
|||
background: @publicColor; |
|||
color: #fff; |
|||
} |
|||
.el-step__title.is-process { |
|||
color: @publicColor; |
|||
} |
|||
.el-step__title.is-success { |
|||
color: @publicColor; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,126 @@ |
|||
<template> |
|||
<div> |
|||
<el-row> |
|||
<el-col :span="24"> |
|||
项目进度:<Progress :size="15" :percent="activities[0]?.totalPercent"></Progress> |
|||
</el-col> |
|||
</el-row> |
|||
<el-row> |
|||
<el-col :span="24"> |
|||
<el-steps finish-status="success" :active="activities.status"> |
|||
<el-step |
|||
v-for="(item, index) in activities" |
|||
:key="index" |
|||
:status=" 'wait'" |
|||
> |
|||
<template #title> |
|||
<div> |
|||
{{ item.taskName }} |
|||
</div> |
|||
<div> |
|||
{{ item.scheduledStartTime + '--' + item.scheduledEndTime }} |
|||
</div> |
|||
</template> |
|||
<template #description> |
|||
<setElstepchild v-if="item.children != null" :child="item.children"></setElstepchild> |
|||
</template> |
|||
<template #icon> |
|||
<Progress |
|||
type="circle" |
|||
:percent="item.percent" |
|||
:size="40" |
|||
:status="item.progressStatus" |
|||
></Progress> |
|||
</template> |
|||
</el-step> |
|||
</el-steps> |
|||
</el-col> |
|||
</el-row> |
|||
</div> |
|||
|
|||
</template> |
|||
<script lang="ts" name="viewPlanDetail" setup> |
|||
import { ref, onMounted } from 'vue'; |
|||
import setElstepchild from './setElstepchild.vue'; |
|||
import { Progress, message } from 'ant-design-vue'; |
|||
|
|||
|
|||
let dataTo = defineProps(["res"]); |
|||
let activities = ref([]); |
|||
onMounted(() => { |
|||
activities.value=dataTo.res |
|||
}); |
|||
|
|||
|
|||
</script> |
|||
<style scoped> |
|||
.timeline { |
|||
display: flex; |
|||
width: 100%; |
|||
margin-bottom: 100px; |
|||
|
|||
.lineitem { |
|||
transform: translateX(50%); |
|||
width: 25%; |
|||
} |
|||
} |
|||
|
|||
:deep(.el-timeline-item__tail) { |
|||
border-left: none; |
|||
border-top: 2px solid #e4e7ed; |
|||
width: 100%; |
|||
position: absolute; |
|||
top: 9px; |
|||
} |
|||
|
|||
:deep(.el-timeline-item__wrapper) { |
|||
padding-left: 0; |
|||
position: absolute; |
|||
top: 20px; |
|||
transform: translateX(-50%); |
|||
text-align: center; |
|||
} |
|||
|
|||
:deep(.el-timeline-item__timestamp) { |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.el-row { |
|||
margin-bottom: 25px; |
|||
margin-top: 25px; |
|||
} |
|||
|
|||
.componentA { |
|||
position: absolute; |
|||
z-index: 1; |
|||
/* 设置较低的z-index值 */ |
|||
/* 其他样式 */ |
|||
} |
|||
|
|||
.componentB { |
|||
position: absolute; |
|||
z-index: 2; |
|||
/* 设置较高的z-index值 */ |
|||
/* 其他样式 */ |
|||
} |
|||
|
|||
.custom-content { |
|||
position: absolute; |
|||
top: 0; |
|||
transform: translateX(-50%); |
|||
transition: left 0.3s; |
|||
z-index: 3; |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
.italicize { |
|||
/* transform: skew(15deg); 使用 transform 属性进行倾斜 */ |
|||
transform: rotate(-45deg); |
|||
display: inline-block; |
|||
/* 需要将元素设为块级元素才能应用transform属性 */ |
|||
z-index: 4; |
|||
margin-top: -20px; |
|||
color: #ea1212; |
|||
font-size: large; |
|||
} |
|||
</style> |
Loading…
Reference in new issue