@@ -104,7 +104,11 @@ onMounted(() => { | |||
const tableDom = document.querySelector('#out-table') | |||
emits('handleTable', tableDom) | |||
}) | |||
defineExpose({ tableRef, pageParams, setRadio, toggleRowSelect, getSelectRows }) | |||
function clearSelection () { | |||
tableRef.value.clearSelection() | |||
} | |||
defineExpose({ tableRef, pageParams, setRadio, toggleRowSelect, getSelectRows, clearSelection }) | |||
</script> | |||
<template> | |||
@@ -3,6 +3,9 @@ import http from '@/http' | |||
export const getReviewMeetingList = params => http.get('/api/v1/meeting/listReviewProject', { params }) // 会议评审列表java | |||
export const getMeetingProjectList = params => http.get('/api/v1/meeting/option/project', { params }) // 评审会议项目列表java | |||
export const createMeeting = data => http.post('/api/v1/meeting/create', data) // 新建会议java | |||
export const randomInviteExpect = data => http.post('/api/v1/meeting/random-invite-expect', data) // 新建会议java | |||
export const meetingList = params => http.get('/api/v1/meeting/manager/meetingList', { params }) // 评审会议列表 | |||
export const meetingBasicInfo = meetingId => http.get(`/api/v1/meeting/basicInfo/${meetingId}`) // 会议详情-基本信息 | |||
@@ -120,7 +120,6 @@ const | |||
{ required: true, message: '请选择上级主管单位', trigger: 'change' } | |||
], | |||
buildDuration: [{ required: true, message: '请选择建设起止年限', trigger: 'change' }], | |||
templateType: [{ required: true, message: '请选择绩效评价类型', trigger: 'change' }], | |||
buildLevel: [{ required: true, message: '请选择建设层级', trigger: 'change' }], | |||
lowestLevel: [{ required: true, message: '请选择贯通层级', trigger: 'change' }], | |||
baseProjBasis: [{ required: true, message: '请选择立项依据', trigger: 'change' }], | |||
@@ -220,7 +219,8 @@ const | |||
// 回显 | |||
setFormData = (data) => { | |||
formData.value = { | |||
baseProjIsConfidentiality: data.baseProjIsConfidentiality || '01', | |||
// baseProjIsConfidentiality: data.baseProjIsConfidentiality || '01', | |||
baseProjIsConfidentiality: '01', | |||
projectName: data.projectName, | |||
projectType: data.projectType ? data.projectType : '01', | |||
isFirst: data.isFirst, | |||
@@ -240,7 +240,6 @@ const | |||
higherSuperOrgCode: data.higherSuperOrgCode, | |||
higherSuperOrg: data.higherSuperOrg, | |||
buildDuration: data.beginTime && data.endTime ? [data.beginTime, data.endTime] : [], | |||
templateType: data.templateType, | |||
buildLevel: data.buildLevel, | |||
lowestLevel: data.lowestLevel, | |||
buildBasis: undefined, | |||
@@ -395,8 +394,10 @@ const | |||
isDisabledCreditCode = ref({}), | |||
getCode = async (name, code) => { | |||
const res = await getOrganizationByCode(code || userInfo.value.empPosUnitCode) | |||
isDisabledCreditCode.value[name] = !!res.data.unifiedSocialCreditCode | |||
formData.value[name] = res.data.unifiedSocialCreditCode || formData.value[name] | |||
if (res.data && res.data.unifiedSocialCreditCode) { | |||
isDisabledCreditCode.value[name] = !!res.data.unifiedSocialCreditCode | |||
formData.value[name] = res.data.unifiedSocialCreditCode || formData.value[name] | |||
} | |||
}, | |||
// 选择负责人、联系人 | |||
userDialogData = reactive({ | |||
@@ -787,22 +788,6 @@ function changeProjectType () { | |||
</el-col> | |||
<template v-if="formData.baseProjIsConfidentiality==='01'"> | |||
<el-col :span="24"> | |||
<el-form-item label="绩效评价类型" prop="templateType"> | |||
<el-radio-group | |||
v-model="formData.templateType" | |||
:disabled="$route.name==='declarePlan'||[10012,10013,10016].includes(detailData?.status)" | |||
> | |||
<el-radio | |||
v-for="(v,k) in templateTypeListData" | |||
:key="k" | |||
:label="v.id" | |||
> | |||
{{ v.name }} | |||
</el-radio> | |||
</el-radio-group> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="24"> | |||
<el-form-item label="建设层级" prop="buildLevel"> | |||
<el-radio-group v-model="formData.buildLevel"> | |||
<el-radio | |||
@@ -625,6 +625,7 @@ async function reuseItem (data) { | |||
buildOrgName, | |||
orgCreditCode, | |||
...annualPaymentFormData, | |||
baseProjIsConfidentiality: '02', | |||
// 新项目不应该有状态 | |||
status: undefined | |||
} | |||
@@ -441,7 +441,7 @@ onMounted(async () => { | |||
</el-row> | |||
<el-dialog v-model="dialogVideVisible" title="项目申报教学视频" width="800"> | |||
<video src="http://www.heletech.com.cn/img/%E5%AE%98%E7%BD%91%E4%BB%8B%E7%BB%8D.mp4" controls></video> | |||
<video style="width: 100%;" src="http://www.heletech.com.cn/img/%E5%AE%98%E7%BD%91%E4%BB%8B%E7%BB%8D.mp4" controls></video> | |||
</el-dialog> | |||
</template> | |||
<style lang='less' scoped> | |||
@@ -0,0 +1,404 @@ | |||
<template> | |||
<el-card class="mb-16" shadow="never"> | |||
<template #header> | |||
<div class="card-header"> | |||
<span>抽取信息</span> | |||
</div> | |||
</template> | |||
<el-row | |||
:gutter="20" | |||
> | |||
<el-col :span="24"> | |||
<el-form-item | |||
label="抽取规则" | |||
> | |||
<el-card | |||
v-for="(ele,index) in ExtractionRule" | |||
:key="index" | |||
class="box-card w-full mb-8" | |||
> | |||
<template #header> | |||
<div class="card-header flex justify-between"> | |||
<span>规则{{ index+1 }}</span> | |||
<el-button | |||
type="danger" | |||
plain | |||
icon="Delete" | |||
:disabled="ExtractionRule.length === 1" | |||
@click="delExtractionRule(index)" | |||
> | |||
删除规则 | |||
</el-button> | |||
</div> | |||
</template> | |||
<el-row class="mt-8" :gutter="10"> | |||
<el-col :span="8"> | |||
<el-form-item | |||
label="邀请数量" | |||
:label-width="100" | |||
:prop="`expertInviteRule.randomRules[${index}].count`" | |||
:rules=" [ | |||
{ required: true, message: ' ', trigger: 'blur' } | |||
]" | |||
> | |||
<el-input-number | |||
v-model="ruleForm.expertInviteRule.randomRules[index].count" | |||
placeholder="请输入" | |||
:min="1" | |||
:controls="false" | |||
:step="1" | |||
step-strictly | |||
/> | |||
</el-form-item> | |||
</el-col> | |||
</el-row> | |||
<el-row :gutter="10" class="mt-8"> | |||
<el-col :span="8"> | |||
<el-form-item label="其他标签" :label-width="100"> | |||
<el-select | |||
v-model="ruleForm.expertInviteRule.randomRules[index].otherTag" | |||
class="w-full" | |||
clearable | |||
placeholder="请选择" | |||
@change="handleRandomRulesTags($event, index)" | |||
@visible-change="getDictionaryData('other')" | |||
> | |||
<el-option | |||
v-for="item in otherTree" | |||
:key="item.value" | |||
:label="item.label" | |||
:value="item.value" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="专家级别" :label-width="100"> | |||
<el-cascader | |||
v-model="ruleForm.expertInviteRule.randomRules[index].expertRegionLists" | |||
clearable | |||
:options="regionTree" | |||
placeholder="请选择" | |||
class="w-full" | |||
:props="regionProps" | |||
@change="handleExpertRegion($event, index)" | |||
/> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="内外围" :label-width="100"> | |||
<el-select | |||
v-model="ruleForm.expertInviteRule.randomRules[index].expertType" | |||
placeholder="请选择" | |||
class="w-full" | |||
clearable | |||
@change="handleRandomRulesDictionary($event, index)" | |||
> | |||
<el-option | |||
v-for="(item,order) in dictList && | |||
dictList.length && | |||
dictList.find(i => i.dictionaryName === 'expert_type') | |||
.dictionaryList" | |||
:key="order" | |||
:label="item.describe" | |||
:value="item.dictionaryCode+'##'+item.dictionaryType" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
</el-col> | |||
</el-row> | |||
<el-row :gutter="10" class="mt-8"> | |||
<el-col :span="8"> | |||
<el-form-item label="履职意向" :label-width="100"> | |||
<el-cascader | |||
:options="regionTree" | |||
class="w-full" | |||
clearable | |||
@change="handleExpertIntentionWorkRegions($event,index)" | |||
/> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="专家来源" :label-width="100"> | |||
<el-select | |||
v-model="ruleForm.expertInviteRule.randomRules[index].expertSource" | |||
class="w-full" | |||
placeholder="请选择" | |||
clearable | |||
@change="handleRandomRulesTags($event, index)" | |||
@visible-change="getDictionaryData('expert_source')" | |||
> | |||
<el-option | |||
v-for="(item,order) in expertSource" | |||
:key="order" | |||
:label="item.label" | |||
:value="item.value" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="职称级别" :label-width="100"> | |||
<el-select | |||
v-model="ruleForm.expertInviteRule.randomRules[index].professionalLevel" | |||
class="w-full" | |||
placeholder="请选择" | |||
clearable | |||
@change="handleRandomRulesDictionary($event, index)" | |||
> | |||
<el-option | |||
v-for="(item,order) in dictList && | |||
dictList.length && | |||
dictList.find(i => i.dictionaryName === 'title_level') | |||
.dictionaryList" | |||
:key="order" | |||
:label="item.describe" | |||
:value="item.dictionaryCode+'##'+item.dictionaryType" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
</el-col> | |||
</el-row> | |||
<el-row :gutter="10" class="mt-8"> | |||
<el-col :span="8"> | |||
<el-form-item label="擅长方向" :label-width="100"> | |||
<el-select | |||
v-model="ruleForm.expertInviteRule.randomRules[index].goodAt" | |||
class="w-full" | |||
placeholder="请选择" | |||
clearable | |||
@change="handleRandomRulesTags($event, index)" | |||
@visible-change="getDictionaryData('good_at')" | |||
> | |||
<el-option | |||
v-for="(item,order) in goodAtTree" | |||
:key="order" | |||
:label="item.label" | |||
:value="item.value" | |||
/> | |||
</el-select> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="技术专长" :label-width="100"> | |||
<el-cascader | |||
:options="technicalExpertiseTree" | |||
placeholder="请选择" | |||
class="w-full" | |||
clearable | |||
@change="handleRandomRulesTags($event, index)" | |||
@visible-change="getDictionaryData('technical_expertise')" | |||
/> | |||
</el-form-item> | |||
</el-col> | |||
<el-col :span="8"> | |||
<el-form-item label="行业领域" :label-width="100"> | |||
<el-cascader | |||
:options="industrySectorTree" | |||
placeholder="请选择" | |||
class="w-full" | |||
clearable | |||
@change="handleRandomRulesTags($event, index)" | |||
@visible-change="getDictionaryData('industry_sector')" | |||
/> | |||
</el-form-item> | |||
</el-col> | |||
</el-row> | |||
</el-card> | |||
<el-button | |||
class="w-full" | |||
type="primary" | |||
icon="plus" | |||
plain | |||
@click="addExtractionRule" | |||
>添加规则</el-button> | |||
</el-form-item> | |||
</el-col> | |||
</el-row> | |||
</el-card> | |||
</template> | |||
<script setup> | |||
import { getCurrentInstance, onMounted, reactive, ref } from 'vue' | |||
import { storeToRefs } from 'pinia' | |||
import store from '@/store' | |||
const { dictList } = storeToRefs(store.dictStore) | |||
const regionTree = ref([]) | |||
const regionProps = ref({ multiple: true }) | |||
import { getDictionaryTree } from '@/http/apis/expertManage/expertStore' | |||
import { districtList } from '@/http/apis/commonApi' | |||
const { proxy } = getCurrentInstance() | |||
const ExtractionRule = ref([0]) | |||
const userInfo = storeToRefs(store.userStore).userInfo || {} | |||
const ruleForm = reactive({ | |||
expertInviteRule: { | |||
inviteType: 1, | |||
randomRules: [{ expertDicts: [], expertTags: [] }], | |||
appointRule: {}, | |||
avoidRule: { | |||
avoidUnitIdList: [], | |||
avoidOrgIdList: [], | |||
expertIds: [], | |||
avoidType: userInfo.value.regionName === '市本级' ? 2 : 1 | |||
} | |||
}, | |||
meetingBasicInfo: { | |||
isInnerProject: true | |||
} | |||
}) | |||
onMounted(async () => { | |||
// 获取履职意向数据 | |||
const res = await districtList({ regionCode: 330500, regionLevel: 2 }) | |||
const regionRes = [] | |||
regionRes.push(res.data) | |||
regionTree.value = copeData(regionRes) | |||
}) | |||
const copeData = (val) => { | |||
const data = val.map((item) => { | |||
const deptData = {} | |||
deptData.value = item.unionCode | |||
deptData.label = item.name | |||
if (item.children && item.children.length) { | |||
deptData.children = item.children.map((v) => ({ value: v.unionCode, label: v.name })) | |||
const childrenData = copeData(item.children) | |||
deptData.children = [...childrenData] | |||
} | |||
return deptData | |||
}) | |||
return data | |||
} | |||
const addExtractionRule = () => { | |||
if (ruleForm.expertInviteRule.randomRules.length >= 5) { | |||
proxy.$message.warning('最多添加5个规则') | |||
return | |||
} | |||
ExtractionRule.value.push(ExtractionRule.value.length) | |||
ruleForm.expertInviteRule.randomRules.push({ expertDicts: [], expertTags: [] }) | |||
} | |||
const delExtractionRule = (index) => { | |||
ruleForm.expertInviteRule.randomRules.splice(index, 1) | |||
ExtractionRule.value.splice(index, 1) | |||
} | |||
// 处理抽取规则标签数据expertTags | |||
const handleRandomRulesTags = ($event, index) => { | |||
let tagGeneralType // 级联选择器标签总类型 | |||
let tagType // select选择器标签总类型 | |||
let dictObj | |||
if (!$event) { | |||
dictObj = undefined | |||
ruleForm.expertInviteRule.randomRules[index].expertTags = [] | |||
return | |||
} else if (Array.isArray($event)) { // 处理级联选择器,数组型数据 | |||
tagGeneralType = $event[0].split('##')[0] | |||
tagType = $event[$event.length - 1].split('##')[0] | |||
dictObj = { tagGeneralType, tagCodes: [$event[$event.length - 1].split('##')[2]], expertTag: tagGeneralType } | |||
} else { // 处理select选择器,字符串型数据 | |||
tagType = $event.split('##')[0] | |||
dictObj = { tagType, tagCodes: [$event.split('##')[2]], expertTag: tagType } | |||
} | |||
if (ruleForm.expertInviteRule.randomRules[index].expertTags.length === 0) { | |||
ruleForm.expertInviteRule.randomRules[index].expertTags.push(dictObj) | |||
} else { | |||
if (Array.isArray($event)) { | |||
// (级联选择器数组型)判断选择的数据是否已经存在,若存在替换之前的数据,否则直接添加当前数据 | |||
const order = ruleForm.expertInviteRule.randomRules[index].expertTags.findIndex(i => i.tagGeneralType === tagGeneralType) | |||
if (order !== -1) { ruleForm.expertInviteRule.randomRules[index].expertTags.splice(order, 1, dictObj) } else { | |||
ruleForm.expertInviteRule.randomRules[index].expertTags.push(dictObj) | |||
} | |||
} else { | |||
// (select选择器字符串型)同理 | |||
const order = ruleForm.expertInviteRule.randomRules[index].expertTags.findIndex(i => i.tagType === tagType) | |||
if (order !== -1) { ruleForm.expertInviteRule.randomRules[index].expertTags.splice(order, 1, dictObj) } else { | |||
ruleForm.expertInviteRule.randomRules[index].expertTags.push(dictObj) | |||
} | |||
} | |||
} | |||
} | |||
// 处理抽取规则字典数据expertDicts | |||
const handleRandomRulesDictionary = ($event, index) => { | |||
if (!$event) { | |||
ruleForm.expertInviteRule.randomRules[index].expertDicts = [] | |||
return | |||
} | |||
const dictType = $event.split('##')[1] | |||
const dictObj = { dictCodes: [$event.split('##')[0]], expertDict: dictType } | |||
if (ruleForm.expertInviteRule.randomRules[index].expertDicts.length === 0) { | |||
ruleForm.expertInviteRule.randomRules[index].expertDicts.push(dictObj) | |||
} else { | |||
const order = ruleForm.expertInviteRule.randomRules[index].expertDicts.findIndex(i => i.expertDict === dictType) | |||
if (order !== -1) { ruleForm.expertInviteRule.randomRules[index].expertDicts.splice(order, 1, dictObj) } else { | |||
ruleForm.expertInviteRule.randomRules[index].expertDicts.push(dictObj) | |||
} | |||
} | |||
} | |||
// 处理履职意向数据 | |||
const handleExpertIntentionWorkRegions = ($event, index) => { | |||
let regionArr = [] | |||
if (!$event) { | |||
regionArr = [] | |||
} else { | |||
regionArr = $event.pop().split('##') | |||
} | |||
const regionCode = regionArr?.[0] | |||
const regionLevel = regionArr?.[2] | |||
ruleForm.expertInviteRule.randomRules[index].intentionRegionCode = regionCode | |||
ruleForm.expertInviteRule.randomRules[index].intentionRegionLevel = regionLevel | |||
} | |||
// 各种字典数据 | |||
const technicalExpertiseTree = ref([])// 技术专长 | |||
const industrySectorTree = ref([])// 行业领域 | |||
const expertSource = ref([])// 专家来源 | |||
const goodAtTree = ref([])// 擅长 | |||
const otherTree = ref([])// 其他标签 | |||
// 获取各种字典数据 | |||
const getDictionaryData = async (params) => { | |||
if (params === 'technical_expertise' && technicalExpertiseTree.value.length === 0) { | |||
const technicalExpertiseRes = await getDictionaryTree({ rootTagCodeList: [params] }) | |||
technicalExpertiseTree.value = copeDictionaryData(technicalExpertiseRes)[0].children | |||
} else if (params === 'industry_sector' && industrySectorTree.value.length === 0) { | |||
const industrySectorRes = await getDictionaryTree({ rootTagCodeList: [params] }) | |||
industrySectorTree.value = copeDictionaryData(industrySectorRes)[0].children | |||
} else if (params === 'expert_source' && expertSource.value.length === 0) { | |||
const expertSourceRes = await getDictionaryTree({ rootTagCodeList: [params] }) | |||
expertSource.value = copeDictionaryData(expertSourceRes)[0].children | |||
} else if (params === 'good_at' && goodAtTree.value.length === 0) { | |||
const goodAtRes = await getDictionaryTree({ rootTagCodeList: [params] }) | |||
goodAtTree.value = copeDictionaryData(goodAtRes)[0].children | |||
} else if (params === 'other' && otherTree.value.length === 0) { | |||
const otherRes = await getDictionaryTree({ rootTagCodeList: [params] }) | |||
otherTree.value = copeDictionaryData(otherRes)[0].children | |||
} | |||
} | |||
const copeDictionaryData = (val) => { // 处理字典数据的方法 | |||
const data = val?.map((item) => { | |||
const deptData = {} | |||
deptData.value = item.parentCode + '##' + item.unionCode | |||
deptData.label = item.tagName | |||
// deptData.isLeaf = false | |||
if (item.children && item.children.length) { | |||
deptData.children = item.children.map((v) => ({ value: v.parentCode + '##' + v.unionCode, label: v.tagName })) | |||
const childrenData = copeDictionaryData(item.children) | |||
deptData.children = [...childrenData] | |||
} | |||
return deptData | |||
}) | |||
return data | |||
} | |||
// 处理专家层级数据 | |||
const handleExpertRegion = ($event, index) => { | |||
console.log(ruleForm.expertInviteRule.randomRules[index].expertRegionLists) | |||
ruleForm.expertInviteRule.randomRules[index].expertRegionList = ruleForm.expertInviteRule.randomRules[index].expertRegionLists?.map(i => { | |||
return { | |||
regionCode: i[i.length - 1]?.split('##')[0], | |||
regionLevel: i[i.length - 1]?.split('##')[2] * 1 | |||
} | |||
}) || [] | |||
} | |||
</script> | |||
<style scoped lang="less"> | |||
</style> |
@@ -4,12 +4,13 @@ import OrgTree from '@/components/orgTree/index.vue' | |||
import AddExpertDialog from './components/addExpertDialog.vue' | |||
import AddProjectDialog from './components/addProjectDialog.vue' | |||
import { getDictionaryTree } from '@/http/apis/expertManage/expertStore' | |||
import { createMeeting } from '@/http/apis/expertManage/reviewMeeting' | |||
import { createMeeting, randomInviteExpect } from '@/http/apis/expertManage/reviewMeeting' | |||
import { districtList, getBusinessstripLine } from '@/http/apis/commonApi' | |||
import { storeToRefs } from 'pinia' | |||
import store from '@/store' | |||
import { useRouter } from 'vue-router' | |||
import getTimeDiffer from '@/utils/getTimeDiffer.js' | |||
import { ElMessageBox } from 'element-plus' | |||
const { dictList } = storeToRefs(store.dictStore), { meetingTypeOptions, projectTypeOptions } = store.dictStore.globalDicts || {} | |||
const { proxy } = getCurrentInstance(), | |||
userInfo = storeToRefs(store.userStore).userInfo || {}, | |||
@@ -268,19 +269,41 @@ const { proxy } = getCurrentInstance(), | |||
ruleFormClone.meetingBasicInfo.endTime = ruleFormClone.meetingBasicInfo.times?.[1] || undefined | |||
ruleFormClone.meetingBasicInfo.times = undefined | |||
loading.value = true | |||
try { | |||
await createMeeting(ruleFormClone) | |||
proxy.$message.success('提交成功!') | |||
loading.value = false | |||
router.go(-1) | |||
} catch (e) { | |||
loading.value = false | |||
} | |||
// const res = await randomInviteExpect(ruleFormClone) | |||
// const total = ruleFormClone.expertInviteRule.randomRules.reduce((accumulator, currentItem) => { | |||
// return accumulator + currentItem.count | |||
// }, 0) | |||
// console.log(total) | |||
// if (res.data.canInvite < total) { | |||
// ElMessageBox.confirm('当前可邀请专家数量不足,是否继续邀请?', '提示', { | |||
// confirmButtonText: '确定', | |||
// cancelButtonText: '取消', | |||
// type: 'warning' | |||
// }).then(() => { | |||
// // 继续邀请 | |||
// console.log('继续') | |||
// addMetting(ruleFormClone) | |||
// }) | |||
// } else { | |||
// await addMetting(ruleFormClone) | |||
// } | |||
await addMetting(ruleFormClone) | |||
} else { | |||
console.log('error submit!', fields) | |||
} | |||
}) | |||
}, | |||
addMetting = async (ruleFormClone) => { | |||
try { | |||
await createMeeting(ruleFormClone) | |||
proxy.$message.success('提交成功!') | |||
loading.value = false | |||
router.go(-1) | |||
} catch (e) { | |||
loading.value = false | |||
} | |||
}, | |||
// 添加项目 | |||
projectDialogData = reactive({ | |||
visible: false, | |||
@@ -527,6 +550,29 @@ onMounted(async () => { | |||
regionTree.value = copeData(regionRes) | |||
getLineList() | |||
}) | |||
async function beforeSubmit () { | |||
const xx = '{"expertInviteRule":{"inviteType":1,"randomRules":[{"expertDicts":[{"dictCodes":["300000"],"expertDict":"expert_type"},{"dictCodes":["900001"],"expertDict":"title_level"}],"expertTags":[{"tagType":"other","tagCodes":["5300000"],"expertTag":"other"},{"tagType":"expert_source","tagCodes":["1020000"],"expertTag":"expert_source"},{"tagGeneralType":"industry_sector","tagCodes":["4040300"],"expertTag":"industry_sector"},{"tagGeneralType":"technical_expertise","tagCodes":["3010102"],"expertTag":"technical_expertise"},{"tagType":"good_at","tagCodes":["2010000"],"expertTag":"good_at"}],"count":12,"expertRegionList":[{"regionCode":"330502","regionLevel":3}],"intentionRegionCode":"330500","intentionRegionLevel":"3","inviteType":1}],"avoidRule":{"avoidUnitIdList":["GO_3bc86256687a4884ae410af00682b762"],"avoidOrgIdList":[],"expertIds":[172],"avoidType":2,"weekInviteCount":1}},"meetingBasicInfo":{"isInnerProject":true,"name":"测试","type":"2","projectIdList":[{"buildOrg":"发改委","createOn":"2024-08-21 17:12","declaredAmount":20,"id":1000,"projectCode":"33050000020240100074","projectName":"725预审撤回测试","projectType":"02","projectYear":2024}],"meetingUsageTime":2,"judgesAttendanceTime":"2024-09-15 00:00","meetingAddress":"111","connecter":"的","contact":"18181818181","innerProjects":[{"projectId":1000,"projectCode":"33050000020240100074"}],"startTime":"2024-09-15 00:00","endTime":"2024-09-18 00:00"}}\n' | |||
const postData = JSON.parse(xx) | |||
const res = await randomInviteExpect(postData) | |||
const total = postData.expertInviteRule.randomRules.reduce((accumulator, currentItem) => { | |||
return accumulator + currentItem.count | |||
}, 0) | |||
console.log(total) | |||
if (res.data.canInvite < total) { | |||
ElMessageBox.confirm('当前可邀请专家数量不足,是否继续邀请?', '提示', { | |||
confirmButtonText: '确定', | |||
cancelButtonText: '取消', | |||
type: 'warning' | |||
}).then(() => { | |||
// 继续邀请 | |||
console.log('继续') | |||
}) | |||
} | |||
} | |||
</script> | |||
<template> | |||
@@ -1150,6 +1196,8 @@ onMounted(async () => { | |||
提交 | |||
</el-button> | |||
<el-button @click="router.go(-1)">返回</el-button> | |||
<el-button @click="beforeSubmit">测试</el-button> | |||
</div> | |||
</el-form> | |||
<org-tree | |||
@@ -129,7 +129,7 @@ const { proxy } = getCurrentInstance(), | |||
label: '是否参加', | |||
key: 'confirmedAttend', | |||
prop: 'confirmedAttend', | |||
render: row => h('span', `${row.noticeStatus === '已通知' && row.confirmedAttend ? '确认参加' : row.noticeStatus === '已通知' && !row.confirmedAttend ? '拒绝参加' : '-'}`) | |||
render: row => h('span', row.status === 3 ? '是' : row.status === 4 || row.status === 5 || row.status === 7 ? '否' : '-') | |||
}, | |||
{ | |||
label: '专家请假', | |||
@@ -137,16 +137,10 @@ const { proxy } = getCurrentInstance(), | |||
slot: 'leaved' | |||
}, | |||
{ | |||
label: '语音通知状态', | |||
key: 'noticeStatus', | |||
prop: 'noticeStatus', | |||
width: '200' | |||
}, | |||
{ | |||
label: '语音通知时间', | |||
key: 'noticeTime', | |||
prop: 'noticeTime', | |||
width: '200' | |||
label: '操作', | |||
slot: 'action', | |||
width: '180', | |||
fixed: 'right' | |||
} | |||
]), | |||
column4 = reactive([ | |||
@@ -368,6 +362,7 @@ const { proxy } = getCurrentInstance(), | |||
}, | |||
// 随机邀请人数是否足够 | |||
getIsEnough = () => { | |||
if (!inviteExpertListData.value.inviteStatistics) return false | |||
if (inviteExpertListData.value.inviteStatistics.filter(i => i.agreeCnt !== i.inviteCnt)?.length) { | |||
return true | |||
} | |||
@@ -453,9 +448,11 @@ onMounted(async () => { | |||
const res = await districtList() | |||
regionTree.value.push(res.data) | |||
}) | |||
// import RefillDialog from '@/pages/expertManage/reviewMeeting/addMeeting/components/RefillDialog.vue' | |||
</script> | |||
<template> | |||
<!-- <refill-dialog />--> | |||
<el-card class="box-card"> | |||
<template #header> | |||
<div class="card-header"> | |||
@@ -642,6 +639,15 @@ onMounted(async () => { | |||
<template #ruleId="{ scope }"> | |||
<a @click="viewRule(scope.row.ruleId)">规则{{ inviteRuleDetail?.randomRules?.findIndex(i => i.id === scope.row.ruleId)+1||'' }}</a> | |||
</template> | |||
<template #action="{ scope }"> | |||
<div v-if="!scope.row.status"> | |||
<a @click="confirmExpert(scope.row,true)">参会</a> | |||
<a @click="confirmExpert(scope.row,false)">不参会</a> | |||
</div> | |||
<div v-else> | |||
<span>-</span> | |||
</div> | |||
</template> | |||
</table-list> | |||
</el-card> | |||
</template> | |||
@@ -147,12 +147,13 @@ const getVerificationCodeFunc = async () => { | |||
} | |||
} | |||
onMounted(() => { | |||
var device = navigator.userAgent.toLowerCase() | |||
if (/ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(device)) { | |||
window.location.href = appName === '浙政钉' ? 'http://60.188.225.145:8090/' : 'http://lsmobile.ningdatech.com/' | |||
} else { | |||
autoLogin() | |||
} | |||
// var device = navigator.userAgent.toLowerCase() | |||
// if (/ipad|iphone|midp|rv:1.2.3.4|ucweb|android|windows ce|windows mobile/.test(device)) { | |||
// window.location.href = appName === '浙政钉' ? 'http://60.188.225.145:8090/' : 'http://lsmobile.ningdatech.com/' | |||
// } else { | |||
// autoLogin() | |||
// } | |||
autoLogin() | |||
}) | |||
</script> | |||
@@ -223,10 +223,12 @@ onMounted(async () => { | |||
}) | |||
function tabChange () { | |||
getTableData() | |||
reset() | |||
column.value = columnType[queryProjectType.value] | |||
// 清空选择的项目 | |||
selectProject.value = [] | |||
tableListRef.value.clearSelection() | |||
} | |||
const operationVisible = ref(false) | |||
@@ -269,9 +269,9 @@ onMounted(() => { | |||
<!-- <el-descriptions-item label="财政编码">--> | |||
<!-- {{ detailData.financialCode || '-' }}--> | |||
<!-- </el-descriptions-item>--> | |||
<el-descriptions-item label="绩效评价类型"> | |||
{{ templateTypeListData?.find(i => i.id === detailData.templateType)?.name || "-" }} | |||
</el-descriptions-item> | |||
<!-- <el-descriptions-item label="绩效评价类型">--> | |||
<!-- {{ templateTypeListData?.find(i => i.id === detailData.templateType)?.name || "-" }}--> | |||
<!-- </el-descriptions-item>--> | |||
<el-descriptions-item | |||
label="是否临时增补项目" | |||
:span="2" | |||
@@ -12,9 +12,9 @@ defineProps({ | |||
<el-descriptions-item label="项目开工时间"> | |||
{{ detailData.operation?.projectStartDate?.split(' ')[0]||'-' }} | |||
</el-descriptions-item> | |||
<el-descriptions-item label="初验时间"> | |||
{{ detailData.operation?.initialInspectionDate?.split(' ')[0]||'-' }} | |||
</el-descriptions-item> | |||
<!-- <el-descriptions-item label="初验时间">--> | |||
<!-- {{ detailData.operation?.initialInspectionDate?.split(' ')[0]||'-' }}--> | |||
<!-- </el-descriptions-item>--> | |||
<el-descriptions-item label="试运行开始时间"> | |||
{{ detailData.operation?.startTrialOperationDate?.split(' ')[0]||'-' }} | |||
</el-descriptions-item> | |||
@@ -49,7 +49,7 @@ const route = useRoute(), | |||
const res = await toDoCenterList(props.state, { | |||
...pageParams, | |||
...searchForm, | |||
isTemporaryAugment: activeName.value, | |||
// isTemporaryAugment: activeName.value, | |||
createOnMin: searchForm.times?.[0], | |||
createOnMax: searchForm.times?.[1], | |||
times: undefined, | |||
@@ -138,10 +138,13 @@ onMounted(async () => { | |||
</el-card> | |||
<el-card class="w-full mt-8 tab-card"> | |||
<template #header> | |||
<div class="flex justify-between items-center"> | |||
<el-tabs v-model="activeName" @tab-click="handleClick"> | |||
<el-tab-pane :label="`非增补项目${notAppendNum&&route.name==='waitMeToHandle'?`(${notAppendNum})`:''}`" name="0" /> | |||
<el-tab-pane :label="`增补项目${appendNum&&route.name==='waitMeToHandle'?`(${appendNum})`:''}`" name="1" /> | |||
<div class="flex justify-between items-center p-5"> | |||
<el-tabs | |||
v-model="activeName" | |||
@tab-click="handleClick" | |||
> | |||
<el-tab-pane v-if="false" :label="`非增补项目${notAppendNum&&route.name==='waitMeToHandle'?`(${notAppendNum})`:''}`" name="0" /> | |||
<el-tab-pane v-if="false" :label="`增补项目${appendNum&&route.name==='waitMeToHandle'?`(${appendNum})`:''}`" name="1" /> | |||
</el-tabs> | |||
<el-button | |||
type="primary" | |||
@@ -366,52 +366,52 @@ export const useDictStore = defineStore('dictionaries', { | |||
color: 'danger', | |||
code: 10002 | |||
}, | |||
{ | |||
name: '待预审', | |||
color: 'warning', | |||
code: 10003 | |||
}, | |||
{ | |||
name: '省级部门联审中', | |||
color: 'warning', | |||
code: 10004 | |||
}, | |||
{ | |||
name: '省级部门联审不通过', | |||
color: 'danger', | |||
code: 10005 | |||
}, | |||
{ | |||
name: '省级部门联审通过', | |||
color: 'success', | |||
code: 10018 | |||
}, | |||
{ | |||
name: '预审中', | |||
color: 'warning', | |||
code: 10006 | |||
}, | |||
{ | |||
name: '预审不通过', | |||
color: 'danger', | |||
code: 10007 | |||
}, | |||
// { | |||
// name: '待预审', | |||
// color: 'warning', | |||
// code: 10003 | |||
// }, | |||
// { | |||
// name: '省级部门联审中', | |||
// color: 'warning', | |||
// code: 10004 | |||
// }, | |||
// { | |||
// name: '省级部门联审不通过', | |||
// color: 'danger', | |||
// code: 10005 | |||
// }, | |||
// { | |||
// name: '省级部门联审通过', | |||
// color: 'success', | |||
// code: 10018 | |||
// }, | |||
// { | |||
// name: '预审中', | |||
// color: 'warning', | |||
// code: 10006 | |||
// }, | |||
// { | |||
// name: '预审不通过', | |||
// color: 'danger', | |||
// code: 10007 | |||
// }, | |||
// { | |||
// name: '待预审选择态', | |||
// color: 'warning', | |||
// code: 10017 | |||
// }, | |||
{ | |||
name: '部门联审中', | |||
color: 'warning', | |||
code: 10008 | |||
}, | |||
{ | |||
name: '部门联审不通过', | |||
color: 'danger', | |||
code: 10009 | |||
}, | |||
// { | |||
// name: '部门联审中', | |||
// color: 'warning', | |||
// code: 10008 | |||
// }, | |||
// { | |||
// name: '部门联审不通过', | |||
// color: 'danger', | |||
// code: 10009 | |||
// }, | |||
{ | |||
name: '年度计划中', | |||
color: 'warning', | |||
@@ -441,13 +441,13 @@ export const useDictStore = defineStore('dictionaries', { | |||
name: '待立项批复', | |||
color: 'warning', | |||
code: 10014 | |||
}, | |||
{ | |||
name: '待应用注册', | |||
color: 'warning', | |||
code: 10021 | |||
} | |||
// { | |||
// name: '待应用注册', | |||
// color: 'warning', | |||
// code: 10021 | |||
// } | |||
// { | |||
// name: '待申报', | |||
// color: 'warning', | |||
// code: 10015 | |||
@@ -47,8 +47,8 @@ export default defineConfig(() => { | |||
host: '0.0.0.0', | |||
proxy: { | |||
'/pm': { | |||
// 后台地址 | |||
target: 'http://121.199.28.40:9089', | |||
// 后台地址 http://121.199.28.40:9089 | |||
target: 'http://hzxg.ningdatech.com/', | |||
changeOrigin: true | |||
} | |||
} | |||