123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699 |
- <template>
- <hc-card scrollbar class="hc-system-set-box">
- <div class="hc-system-set-title hc-flex">
- <div class="title flex-1">
- <hc-icon class="font-bold" name="alarm-warning" />
- <span class="ml-1 text-[18px] font-bold">项目异常设置</span>
- </div>
- <div class="extra">
- <el-button :loading="saveProjectWarningLoad" class="ml-8 text-white" color="#20C98B" @click="saveProjectWarning">保存项目异常设置</el-button>
- </div>
- </div>
- <div class="warn-box-items flex">
- <el-row :gutter="14">
- <el-col :span="12" class="h-full">
- <div class="warn-item h-full">
- <div class="warn-item-tilte">投资进展缓慢</div>
- <div class="warn-item-inner">
- <el-row :gutter="4" class="h-full">
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第一季度</div>
- <div class="warn-item-inner-title mt-2 text-right text-14px">该季度投资计划完成比例</div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow w-60px text-14px">三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].oneThree" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-oringe w-60px text-14px">二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].oneTwo" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-red w-60px text-14px"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].oneOne" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第二季度</div>
- <div class="warn-item-inner-box-title mt-2 text-14px">
- <div class="flex-1" />
- <div class="warn-item-inner-title flex-1 text-center">该季度投资计划完成比例</div>
- <div class="warn-item-inner-title ml-2 flex-1 text-center">前两季度累计投资计化完成比例</div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow"> 三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].twoThree" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].twoThreeAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-oringe"> 二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].twoTwo" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].twoTwoAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-red"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].twoOne" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].twoOneAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第三季度</div>
- <div class="warn-item-inner-box-title mt-2 text-14px">
- <div class="flex-1" />
- <div class="warn-item-inner-title flex-1 text-center">
- 该季度投资计划完成比例
- </div>
- <div class="warn-item-inner-title ml-2 flex-1 text-center">
- 前三季度累计投资计化完成比例
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow"> 三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].threeThree" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].threeThreeAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-oringe"> 二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].threeTwo" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].threeTwoAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-red"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].threeOne" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].threeOneAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第四季度</div>
- <div class="warn-item-inner-box-title mt-2 text-14px">
- <div class="flex-1" />
- <div class="warn-item-inner-title flex-1 text-center">
- 该季度投资计划完成比例
- </div>
- <div class="warn-item-inner-title ml-2 flex-1 text-center">
- 当年度累计投资计化完成比例
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow"> 三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[0].fourThree" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].fourThreeAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-oringe"> 二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].fourTwo" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].fourTwoAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div>
- <div class="arrow arrow-red"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].fourOne" />
- <span class="ml-1">%</span>
- </div>
- <div class="hc-flex">
- <span class="mr-1"><</span>
- <HcInputNumber v-model="projectWarning[0].fourOneAll" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- </el-col>
- <el-col :span="12" class="h-full">
- <div class="warn-item h-full">
- <div class="warn-item-tilte">建设进展缓慢</div>
- <div class="warn-item-inner">
- <el-row :gutter="4" class="h-full">
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第一季度</div>
- <div class="warn-item-inner-title mt-2 text-right text-14px">该季度工作计划完成比例</div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow w-60px text-14px">三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].oneThree" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-oringe w-60px text-14px">二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].oneTwo" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-red w-60px text-14px"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].oneOne" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第二季度</div>
- <div class="warn-item-inner-title mt-2 text-right text-14px">
- 该季度工作计划完成比例
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow w-60px text-14px">三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].twoThree" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-oringe w-60px text-14px">二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].twoTwo" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-red w-60px text-14px"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].twoOne" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第三季度</div>
- <div class="warn-item-inner-title mt-2 text-right text-14px">
- 该季度工作计划完成比例
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow w-60px text-14px">三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].threeThree" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-oringe w-60px text-14px">二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].threeTwo" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-red w-60px text-14px"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].threeOne" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="12">
- <div class="warn-item-inner-box">
- <div class="text-center text-14px">第四季度</div>
- <div class="warn-item-inner-title mt-2 text-right text-14px">
- 该季度工作计划完成比例
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow w-60px text-14px">三级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].fourThree" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-oringe w-60px text-14px">二级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].fourTwo" />
- <span class="ml-1">%</span>
- </div>
- </div>
- <div class="warn-item-inner-box-detail">
- <div class="arrow arrow-red w-60px text-14px"> 一级</div>
- <div class="container">
- <div class="triangle" />
- </div>
- <div class="hc-flex">
- <span class="mr-1"> < </span>
- <HcInputNumber v-model="projectWarning[1].fourOne" />
- <span class="ml-1">%</span>
- </div>
- </div>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- </el-col>
- </el-row>
- </div>
- <div class="hc-system-set-title hc-flex mt-5">
- <hc-icon class="font-bold" name="projector" />
- <span class="ml-1 text-[18px] font-bold">项目相关设置</span>
- </div>
- <div class="hc-system-set-project">
- <div class="set-project-row">
- <el-row :gutter="24">
- <el-col :span="8">
- <div class="set-project-row-col">
- <div class="set-project-row-col-title hc-flex">
- <div class="title flex-1">
- <span class="mr-2">项目阶段</span>
- <span class="text-14px">(重点项目推进计划)</span>
- </div>
- <div class="extra">
- <el-button :loading="saveProStationLoad" class="text-white" color="#20C98B" @click="saveProStation">保存项目阶段</el-button>
- </div>
- </div>
- <div class="set-project-row-col-content max-h-300px">
- <div v-for="(item, index) in proStation" :key="index" class="hc-flex mt-1">
- <el-input v-model="item.dictValue" placeholder="阶段名称" class="flex-1" />
- <el-link :underline="false" type="primary" class="ml-2">
- <hc-icon class="text-20px font-bold" name="add" @click="addClick(item, index)" />
- </el-link>
- <el-link :underline="false" type="danger" class="ml-1">
- <hc-icon class="text-20px font-bold" name="close" @click="delClick(item, index)" />
- </el-link>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="set-project-row-col">
- <div class="set-project-row-col-title hc-flex">
- <div class="title flex-1">项目类型</div>
- <div class="extra">
- <el-button :loading="saveProTypenLoad" class="text-white" color="#20C98B" @click="saveProType">保存项目类型</el-button>
- </div>
- </div>
- <div class="set-project-row-col-content max-h-300px">
- <div v-for="(item, index) in proType" :key="index" class="hc-flex mt-1">
- <el-input v-model="item.dictValue" placeholder="类型名称" class="flex-1" />
- <el-link :underline="false" type="primary" class="ml-2">
- <hc-icon class="text-20px font-bold" name="add" @click="addClickType(item, index)" />
- </el-link>
- <el-link :underline="false" type="danger" class="ml-1">
- <hc-icon class="text-20px font-bold" name="close" @click="delClickType(item, index)" />
- </el-link>
- </div>
- </div>
- </div>
- </el-col>
- <el-col :span="8">
- <div class="set-project-row-col">
- <div class="set-project-row-col-title hc-flex">
- <div class="title flex-1">
- <span class="mr-2">项目阶段</span>
- <span class="text-14px">(工作要点任务分工)</span>
- </div>
- <div class="extra">
- <el-button :loading="savProStationTipLoad" class="text-white" color="#20C98B" @click="saveProStationTip">保存项目阶段</el-button>
- </div>
- </div>
- <div class="set-project-row-col-content max-h-300px">
- <div v-for="(item, index) in proStationTip" :key="index" class="hc-flex mt-1">
- <el-input v-model="item.dictValue" placeholder="阶段名称" class="flex-1" />
- <el-link :underline="false" type="primary" class="ml-2">
- <hc-icon class="text-20px font-bold" name="add" @click="addClickTip(item, index)" />
- </el-link>
- <el-link :underline="false" type="danger" class="ml-1">
- <hc-icon class="text-20px font-bold" name="close" @click="delClickTip(item, index)" />
- </el-link>
- </div>
- </div>
- </div>
- </el-col>
- </el-row>
- </div>
- </div>
- </hc-card>
- </template>
- <script setup>
- import { onMounted, ref } from 'vue'
- import { getDictionary, saveDict } from '~api/dictbiz'
- import { projectDetailWarning, projectSaveWarning } from '~api/other'
- import { arrToKey, getArrValue, isArrItem } from 'js-fast-way'
- import HcInputNumber from './modules/input-number.vue'
- onMounted(() => {
- projectWarningDetail()
- getProStation()
- getProType()
- getProStationTip()
- })
- //项目预警详情
- const projectWarning = ref([{ warningType: 1 }, { warningType: 2 }])
- const projectWarningDetail = async () => {
- const { data } = await projectDetailWarning()
- const res = getArrValue(data?.list)
- if (res.length <= 0 ) {
- projectWarning.value = [{ warningType: 1 }, { warningType: 2 }]
- } else {
- projectWarning.value = res
- }
- }
- //保存项目预警
- const saveProjectWarningLoad = ref(false)
- const saveProjectWarning = async () => {
- saveProjectWarningLoad.value = true
- const list = projectWarning.value
- const { error, code, msg } = await projectSaveWarning(list)
- saveProjectWarningLoad.value = false
- if (!error && code === 200) {
- window?.$message?.success(msg)
- projectWarningDetail().then()
- } else {
- window.$message.error(msg ?? '操作失败')
- }
- }
- //相关相关设置
- const proStation = ref([{ dictValue: '' }])
- const getProStation = async () => {
- const { error, code, data } = await getDictionary({ code: 'projectStage' })
- if (!error && code === 200) {
- proStation.value = getArrValue(data)
- if (proStation.value.length === 0) {
- proStation.value = [
- { dictValue: '' },
- ]
- }
- } else {
- proStation.value = []
- }
- }
- const addClick = (item, index) => {
- proStation.value.splice(index + 1, 0, { dictValue: '' })
- }
- const delClick = (item, index) => {
- if (proStation.value.length === 1) {
- window.$message.warning('请至少保留一条数据')
- return
- }
- proStation.value.splice(index, 1)
- }
- const saveProStationLoad = ref(false)
- const saveProStation = async () => {
- const list = arrToKey(proStation.value, 'dictValue', ',').split(',')
- const isIn = isArrItem(list, '') // true
- if (isIn) {
- window.$message.warning('请输入阶段名称')
- return
- }
- saveProStationLoad.value = true
- const { error, code, msg } = await saveDict({ type: 'projectStage', list })
- saveProStationLoad.value = false
- if (!error && code === 200) {
- window?.$message?.success(msg)
- getProStation()
- } else {
- window.$message.error(msg ?? '操作失败')
- }
- }
- const proType = ref([
- { name: '铁路' },
- { name: '建成项目' },
- ])
- const getProType = async () => {
- const { error, code, data } = await getDictionary({ code: 'projectType' })
- if (!error && code === 200) {
- proType.value = getArrValue(data)
- if (proType.value.length === 0) {
- proType.value = [
- { dictValue: '' },
- ]
- }
- } else {
- proType.value = []
- }
- }
- const addClickType = (item, index) => {
- proType.value.splice(index + 1, 0, { dictValue: '' })
- }
- const delClickType = (item, index) => {
- if (proType.value.length === 1) {
- window.$message.warning('请至少保留一条数据')
- return
- }
- proType.value.splice(index, 1)
- }
- const saveProTypenLoad = ref(false)
- const saveProType = async () => {
- const list = arrToKey(proType.value, 'dictValue', ',').split(',')
- const isIn = isArrItem(list, '') // true
- if (isIn) {
- window.$message.warning('请输入类型名称')
- return
- }
- saveProTypenLoad.value = true
- const { error, code, msg } = await saveDict({ type: 'projectType', list })
- saveProTypenLoad.value = false
- if (!error && code === 200) {
- window?.$message?.success(msg)
- getProType()
- } else {
- window.$message.error(msg ?? '操作失败')
- }
- }
- const proStationTip = ref([])
- const getProStationTip = async () => {
- const { error, code, data } = await getDictionary({ code: 'workFocusStage' })
- if (!error && code === 200) {
- proStationTip.value = getArrValue(data)
- if (proStationTip.value.length === 0) {
- proStationTip.value = [
- { dictValue: '' },
- ]
- }
- } else {
- proStationTip.value = []
- }
- }
- const addClickTip = (item, index) => {
- proStationTip.value.splice(index + 1, 0, { dictValue: '' })
- }
- const delClickTip = (item, index) => {
- if (proStationTip.value.length === 1) {
- window.$message.warning('请至少保留一条数据')
- return
- }
- proStationTip.value.splice(index, 1)
- }
- const savProStationTipLoad = ref(false)
- const saveProStationTip = async () => {
- const list = arrToKey(proStationTip.value, 'dictValue', ',').split(',')
- const isIn = isArrItem(list, '') // true
- if (isIn) {
- window.$message.warning('请输入阶段名称')
- return
- }
- savProStationTipLoad.value = true
- const { error, code, msg } = await saveDict({ type: 'workFocusStage', list })
- savProStationTipLoad.value = false
- if (!error && code === 200) {
- window?.$message?.success(msg)
- getProStationTip()
- } else {
- window.$message.error(msg ?? '操作失败')
- }
- }
- </script>
- <style lang='scss'>
- @import "~src/styles/view/set";
- </style>
|