@@ -104,7 +104,11 @@ onMounted(() => { | |||||
const tableDom = document.querySelector('#out-table') | const tableDom = document.querySelector('#out-table') | ||||
emits('handleTable', tableDom) | emits('handleTable', tableDom) | ||||
}) | }) | ||||
defineExpose({ tableRef, pageParams, setRadio, toggleRowSelect, getSelectRows }) | |||||
function clearSelection () { | |||||
tableRef.value.clearSelection() | |||||
} | |||||
defineExpose({ tableRef, pageParams, setRadio, toggleRowSelect, getSelectRows, clearSelection }) | |||||
</script> | </script> | ||||
<template> | <template> | ||||
@@ -3,6 +3,9 @@ import http from '@/http' | |||||
export const getReviewMeetingList = params => http.get('/api/v1/meeting/listReviewProject', { params }) // 会议评审列表java | 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 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 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 meetingList = params => http.get('/api/v1/meeting/manager/meetingList', { params }) // 评审会议列表 | ||||
export const meetingBasicInfo = meetingId => http.get(`/api/v1/meeting/basicInfo/${meetingId}`) // 会议详情-基本信息 | export const meetingBasicInfo = meetingId => http.get(`/api/v1/meeting/basicInfo/${meetingId}`) // 会议详情-基本信息 | ||||
@@ -120,7 +120,6 @@ const | |||||
{ required: true, message: '请选择上级主管单位', trigger: 'change' } | { required: true, message: '请选择上级主管单位', trigger: 'change' } | ||||
], | ], | ||||
buildDuration: [{ required: true, message: '请选择建设起止年限', trigger: 'change' }], | buildDuration: [{ required: true, message: '请选择建设起止年限', trigger: 'change' }], | ||||
templateType: [{ required: true, message: '请选择绩效评价类型', trigger: 'change' }], | |||||
buildLevel: [{ required: true, message: '请选择建设层级', trigger: 'change' }], | buildLevel: [{ required: true, message: '请选择建设层级', trigger: 'change' }], | ||||
lowestLevel: [{ required: true, message: '请选择贯通层级', trigger: 'change' }], | lowestLevel: [{ required: true, message: '请选择贯通层级', trigger: 'change' }], | ||||
baseProjBasis: [{ required: true, message: '请选择立项依据', trigger: 'change' }], | baseProjBasis: [{ required: true, message: '请选择立项依据', trigger: 'change' }], | ||||
@@ -220,7 +219,8 @@ const | |||||
// 回显 | // 回显 | ||||
setFormData = (data) => { | setFormData = (data) => { | ||||
formData.value = { | formData.value = { | ||||
baseProjIsConfidentiality: data.baseProjIsConfidentiality || '01', | |||||
// baseProjIsConfidentiality: data.baseProjIsConfidentiality || '01', | |||||
baseProjIsConfidentiality: '01', | |||||
projectName: data.projectName, | projectName: data.projectName, | ||||
projectType: data.projectType ? data.projectType : '01', | projectType: data.projectType ? data.projectType : '01', | ||||
isFirst: data.isFirst, | isFirst: data.isFirst, | ||||
@@ -240,7 +240,6 @@ const | |||||
higherSuperOrgCode: data.higherSuperOrgCode, | higherSuperOrgCode: data.higherSuperOrgCode, | ||||
higherSuperOrg: data.higherSuperOrg, | higherSuperOrg: data.higherSuperOrg, | ||||
buildDuration: data.beginTime && data.endTime ? [data.beginTime, data.endTime] : [], | buildDuration: data.beginTime && data.endTime ? [data.beginTime, data.endTime] : [], | ||||
templateType: data.templateType, | |||||
buildLevel: data.buildLevel, | buildLevel: data.buildLevel, | ||||
lowestLevel: data.lowestLevel, | lowestLevel: data.lowestLevel, | ||||
buildBasis: undefined, | buildBasis: undefined, | ||||
@@ -395,8 +394,10 @@ const | |||||
isDisabledCreditCode = ref({}), | isDisabledCreditCode = ref({}), | ||||
getCode = async (name, code) => { | getCode = async (name, code) => { | ||||
const res = await getOrganizationByCode(code || userInfo.value.empPosUnitCode) | 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({ | userDialogData = reactive({ | ||||
@@ -787,22 +788,6 @@ function changeProjectType () { | |||||
</el-col> | </el-col> | ||||
<template v-if="formData.baseProjIsConfidentiality==='01'"> | <template v-if="formData.baseProjIsConfidentiality==='01'"> | ||||
<el-col :span="24"> | <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-form-item label="建设层级" prop="buildLevel"> | ||||
<el-radio-group v-model="formData.buildLevel"> | <el-radio-group v-model="formData.buildLevel"> | ||||
<el-radio | <el-radio | ||||
@@ -625,6 +625,7 @@ async function reuseItem (data) { | |||||
buildOrgName, | buildOrgName, | ||||
orgCreditCode, | orgCreditCode, | ||||
...annualPaymentFormData, | ...annualPaymentFormData, | ||||
baseProjIsConfidentiality: '02', | |||||
// 新项目不应该有状态 | // 新项目不应该有状态 | ||||
status: undefined | status: undefined | ||||
} | } | ||||
@@ -441,7 +441,7 @@ onMounted(async () => { | |||||
</el-row> | </el-row> | ||||
<el-dialog v-model="dialogVideVisible" title="项目申报教学视频" width="800"> | <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> | </el-dialog> | ||||
</template> | </template> | ||||
<style lang='less' scoped> | <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 AddExpertDialog from './components/addExpertDialog.vue' | ||||
import AddProjectDialog from './components/addProjectDialog.vue' | import AddProjectDialog from './components/addProjectDialog.vue' | ||||
import { getDictionaryTree } from '@/http/apis/expertManage/expertStore' | 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 { districtList, getBusinessstripLine } from '@/http/apis/commonApi' | ||||
import { storeToRefs } from 'pinia' | import { storeToRefs } from 'pinia' | ||||
import store from '@/store' | import store from '@/store' | ||||
import { useRouter } from 'vue-router' | import { useRouter } from 'vue-router' | ||||
import getTimeDiffer from '@/utils/getTimeDiffer.js' | import getTimeDiffer from '@/utils/getTimeDiffer.js' | ||||
import { ElMessageBox } from 'element-plus' | |||||
const { dictList } = storeToRefs(store.dictStore), { meetingTypeOptions, projectTypeOptions } = store.dictStore.globalDicts || {} | const { dictList } = storeToRefs(store.dictStore), { meetingTypeOptions, projectTypeOptions } = store.dictStore.globalDicts || {} | ||||
const { proxy } = getCurrentInstance(), | const { proxy } = getCurrentInstance(), | ||||
userInfo = storeToRefs(store.userStore).userInfo || {}, | userInfo = storeToRefs(store.userStore).userInfo || {}, | ||||
@@ -268,19 +269,41 @@ const { proxy } = getCurrentInstance(), | |||||
ruleFormClone.meetingBasicInfo.endTime = ruleFormClone.meetingBasicInfo.times?.[1] || undefined | ruleFormClone.meetingBasicInfo.endTime = ruleFormClone.meetingBasicInfo.times?.[1] || undefined | ||||
ruleFormClone.meetingBasicInfo.times = undefined | ruleFormClone.meetingBasicInfo.times = undefined | ||||
loading.value = true | 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 { | } else { | ||||
console.log('error submit!', fields) | 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({ | projectDialogData = reactive({ | ||||
visible: false, | visible: false, | ||||
@@ -527,6 +550,29 @@ onMounted(async () => { | |||||
regionTree.value = copeData(regionRes) | regionTree.value = copeData(regionRes) | ||||
getLineList() | 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> | </script> | ||||
<template> | <template> | ||||
@@ -1150,6 +1196,8 @@ onMounted(async () => { | |||||
提交 | 提交 | ||||
</el-button> | </el-button> | ||||
<el-button @click="router.go(-1)">返回</el-button> | <el-button @click="router.go(-1)">返回</el-button> | ||||
<el-button @click="beforeSubmit">测试</el-button> | |||||
</div> | </div> | ||||
</el-form> | </el-form> | ||||
<org-tree | <org-tree | ||||
@@ -129,7 +129,7 @@ const { proxy } = getCurrentInstance(), | |||||
label: '是否参加', | label: '是否参加', | ||||
key: 'confirmedAttend', | key: 'confirmedAttend', | ||||
prop: '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: '专家请假', | label: '专家请假', | ||||
@@ -137,16 +137,10 @@ const { proxy } = getCurrentInstance(), | |||||
slot: 'leaved' | 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([ | column4 = reactive([ | ||||
@@ -368,6 +362,7 @@ const { proxy } = getCurrentInstance(), | |||||
}, | }, | ||||
// 随机邀请人数是否足够 | // 随机邀请人数是否足够 | ||||
getIsEnough = () => { | getIsEnough = () => { | ||||
if (!inviteExpertListData.value.inviteStatistics) return false | |||||
if (inviteExpertListData.value.inviteStatistics.filter(i => i.agreeCnt !== i.inviteCnt)?.length) { | if (inviteExpertListData.value.inviteStatistics.filter(i => i.agreeCnt !== i.inviteCnt)?.length) { | ||||
return true | return true | ||||
} | } | ||||
@@ -453,9 +448,11 @@ onMounted(async () => { | |||||
const res = await districtList() | const res = await districtList() | ||||
regionTree.value.push(res.data) | regionTree.value.push(res.data) | ||||
}) | }) | ||||
// import RefillDialog from '@/pages/expertManage/reviewMeeting/addMeeting/components/RefillDialog.vue' | |||||
</script> | </script> | ||||
<template> | <template> | ||||
<!-- <refill-dialog />--> | |||||
<el-card class="box-card"> | <el-card class="box-card"> | ||||
<template #header> | <template #header> | ||||
<div class="card-header"> | <div class="card-header"> | ||||
@@ -642,6 +639,15 @@ onMounted(async () => { | |||||
<template #ruleId="{ scope }"> | <template #ruleId="{ scope }"> | ||||
<a @click="viewRule(scope.row.ruleId)">规则{{ inviteRuleDetail?.randomRules?.findIndex(i => i.id === scope.row.ruleId)+1||'' }}</a> | <a @click="viewRule(scope.row.ruleId)">规则{{ inviteRuleDetail?.randomRules?.findIndex(i => i.id === scope.row.ruleId)+1||'' }}</a> | ||||
</template> | </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> | </table-list> | ||||
</el-card> | </el-card> | ||||
</template> | </template> | ||||
@@ -147,12 +147,13 @@ const getVerificationCodeFunc = async () => { | |||||
} | } | ||||
} | } | ||||
onMounted(() => { | 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> | </script> | ||||
@@ -223,10 +223,12 @@ onMounted(async () => { | |||||
}) | }) | ||||
function tabChange () { | function tabChange () { | ||||
getTableData() | |||||
reset() | |||||
column.value = columnType[queryProjectType.value] | column.value = columnType[queryProjectType.value] | ||||
// 清空选择的项目 | // 清空选择的项目 | ||||
selectProject.value = [] | selectProject.value = [] | ||||
tableListRef.value.clearSelection() | |||||
} | } | ||||
const operationVisible = ref(false) | const operationVisible = ref(false) | ||||
@@ -269,9 +269,9 @@ onMounted(() => { | |||||
<!-- <el-descriptions-item label="财政编码">--> | <!-- <el-descriptions-item label="财政编码">--> | ||||
<!-- {{ detailData.financialCode || '-' }}--> | <!-- {{ detailData.financialCode || '-' }}--> | ||||
<!-- </el-descriptions-item>--> | <!-- </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 | <el-descriptions-item | ||||
label="是否临时增补项目" | label="是否临时增补项目" | ||||
:span="2" | :span="2" | ||||
@@ -12,9 +12,9 @@ defineProps({ | |||||
<el-descriptions-item label="项目开工时间"> | <el-descriptions-item label="项目开工时间"> | ||||
{{ detailData.operation?.projectStartDate?.split(' ')[0]||'-' }} | {{ detailData.operation?.projectStartDate?.split(' ')[0]||'-' }} | ||||
</el-descriptions-item> | </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="试运行开始时间"> | <el-descriptions-item label="试运行开始时间"> | ||||
{{ detailData.operation?.startTrialOperationDate?.split(' ')[0]||'-' }} | {{ detailData.operation?.startTrialOperationDate?.split(' ')[0]||'-' }} | ||||
</el-descriptions-item> | </el-descriptions-item> | ||||
@@ -49,7 +49,7 @@ const route = useRoute(), | |||||
const res = await toDoCenterList(props.state, { | const res = await toDoCenterList(props.state, { | ||||
...pageParams, | ...pageParams, | ||||
...searchForm, | ...searchForm, | ||||
isTemporaryAugment: activeName.value, | |||||
// isTemporaryAugment: activeName.value, | |||||
createOnMin: searchForm.times?.[0], | createOnMin: searchForm.times?.[0], | ||||
createOnMax: searchForm.times?.[1], | createOnMax: searchForm.times?.[1], | ||||
times: undefined, | times: undefined, | ||||
@@ -138,10 +138,13 @@ onMounted(async () => { | |||||
</el-card> | </el-card> | ||||
<el-card class="w-full mt-8 tab-card"> | <el-card class="w-full mt-8 tab-card"> | ||||
<template #header> | <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-tabs> | ||||
<el-button | <el-button | ||||
type="primary" | type="primary" | ||||
@@ -366,52 +366,52 @@ export const useDictStore = defineStore('dictionaries', { | |||||
color: 'danger', | color: 'danger', | ||||
code: 10002 | 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: '待预审选择态', | // name: '待预审选择态', | ||||
// color: 'warning', | // color: 'warning', | ||||
// code: 10017 | // code: 10017 | ||||
// }, | // }, | ||||
{ | |||||
name: '部门联审中', | |||||
color: 'warning', | |||||
code: 10008 | |||||
}, | |||||
{ | |||||
name: '部门联审不通过', | |||||
color: 'danger', | |||||
code: 10009 | |||||
}, | |||||
// { | |||||
// name: '部门联审中', | |||||
// color: 'warning', | |||||
// code: 10008 | |||||
// }, | |||||
// { | |||||
// name: '部门联审不通过', | |||||
// color: 'danger', | |||||
// code: 10009 | |||||
// }, | |||||
{ | { | ||||
name: '年度计划中', | name: '年度计划中', | ||||
color: 'warning', | color: 'warning', | ||||
@@ -441,13 +441,13 @@ export const useDictStore = defineStore('dictionaries', { | |||||
name: '待立项批复', | name: '待立项批复', | ||||
color: 'warning', | color: 'warning', | ||||
code: 10014 | code: 10014 | ||||
}, | |||||
{ | |||||
name: '待应用注册', | |||||
color: 'warning', | |||||
code: 10021 | |||||
} | } | ||||
// { | // { | ||||
// name: '待应用注册', | |||||
// color: 'warning', | |||||
// code: 10021 | |||||
// } | |||||
// { | |||||
// name: '待申报', | // name: '待申报', | ||||
// color: 'warning', | // color: 'warning', | ||||
// code: 10015 | // code: 10015 | ||||
@@ -47,8 +47,8 @@ export default defineConfig(() => { | |||||
host: '0.0.0.0', | host: '0.0.0.0', | ||||
proxy: { | proxy: { | ||||
'/pm': { | '/pm': { | ||||
// 后台地址 | |||||
target: 'http://121.199.28.40:9089', | |||||
// 后台地址 http://121.199.28.40:9089 | |||||
target: 'http://hzxg.ningdatech.com/', | |||||
changeOrigin: true | changeOrigin: true | ||||
} | } | ||||
} | } | ||||