|
@@ -6,32 +6,35 @@
|
|
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large" :disabled="dataType === 'view'">
|
|
<el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large" :disabled="dataType === 'view'">
|
|
<div class="project-form-top">
|
|
<div class="project-form-top">
|
|
<HcCardItem title="基础信息">
|
|
<HcCardItem title="基础信息">
|
|
- <el-form-item label="项目名称:" prop="key">
|
|
|
|
- <el-input v-model="formModel.key"/>
|
|
|
|
|
|
+ <el-form-item label="项目名称:" prop="name">
|
|
|
|
+ <el-input v-model="formModel.name"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="建设单位:" prop="key">
|
|
|
|
- <el-input v-model="formModel.key"/>
|
|
|
|
|
|
+ <el-form-item label="建设单位:" prop="constructUnit">
|
|
|
|
+ <el-input v-model="formModel.constructUnit"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="项目类型:" prop="key1">
|
|
|
|
- <el-select v-model="formModel.key1" block clearable placeholder="项目类型">
|
|
|
|
- <el-option v-for="item in projectType" :label="item.name" :value="item.key"/>
|
|
|
|
|
|
+ <el-form-item label="项目类型:" prop="projectType">
|
|
|
|
+ <el-select v-model="formModel.projectType" block clearable placeholder="项目类型">
|
|
|
|
+ <el-option v-for="item in projectType" :label="item.dictName" :value="item.dictValue"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="项目进程:" prop="key3">
|
|
<el-form-item label="项目进程:" prop="key3">
|
|
<el-select v-model="formModel.key3" block disabled="disabled" placeholder="项目进程">
|
|
<el-select v-model="formModel.key3" block disabled="disabled" placeholder="项目进程">
|
|
- <el-option v-for="item in projectProcess" :label="item.name" :value="item.key"/>
|
|
|
|
|
|
+ <el-option v-for="item in projectProcess" :label="item.dictName" :value="item.key"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="服务类型:" prop="key1">
|
|
|
|
- <el-select v-model="formModel.key1" block clearable placeholder="项目服务类型">
|
|
|
|
- <el-option v-for="item in projectType" :label="item.name" :value="item.key"/>
|
|
|
|
|
|
+ <!-- <el-form-item label="项目进程:" prop="currentProcessName">
|
|
|
|
+ <el-input v-model="formModel.currentProcessName" disabled/>
|
|
|
|
+ </el-form-item> -->
|
|
|
|
+ <el-form-item label="服务类型:" prop="projectServerType">
|
|
|
|
+ <el-select v-model="formModel.projectServerType" block clearable placeholder="项目服务类型">
|
|
|
|
+ <el-option v-for="item in serverType" :label="item.dictName" :value="item.dictValue"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="起止日期:">
|
|
<el-form-item label="起止日期:">
|
|
- <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" size="large" disabled="disabled"/>
|
|
|
|
|
|
+ <HcDatePicker :dates="probetweenTime" clearable @change="betweenTimeUpdate" size="large" disabled="disabled"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="合同额:">
|
|
<el-form-item label="合同额:">
|
|
- <el-input v-model="formModel.key6" disabled="disabled"/>
|
|
|
|
|
|
+ <el-input v-model="formModel.contractMoney" disabled="disabled"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="已回款:">
|
|
<el-form-item label="已回款:">
|
|
<el-input v-model="formModel.key7" disabled="disabled"/>
|
|
<el-input v-model="formModel.key7" disabled="disabled"/>
|
|
@@ -47,17 +50,17 @@
|
|
<div class="project-form-bottom">
|
|
<div class="project-form-bottom">
|
|
<HcCardItem title="联系人信息">
|
|
<HcCardItem title="联系人信息">
|
|
<el-form-item label="项目负责人:">
|
|
<el-form-item label="项目负责人:">
|
|
- <el-select v-model="formModel.key5" block clearable placeholder="项目负责人" size="large">
|
|
|
|
|
|
+ <el-select v-model="formModel.projectPrincipal" block clearable placeholder="项目负责人" size="large">
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="实施负责人:">
|
|
<el-form-item label="实施负责人:">
|
|
- <el-select v-model="formModel.key5" block clearable placeholder="实施负责人" size="large">
|
|
|
|
|
|
+ <el-select v-model="formModel.implementPrincipal" block clearable placeholder="实施负责人" size="large">
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="维护负责人:">
|
|
<el-form-item label="维护负责人:">
|
|
- <el-select v-model="formModel.key5" block clearable placeholder="维护负责人" size="large">
|
|
|
|
|
|
+ <el-select v-model="formModel.maintainPrincipal" block clearable placeholder="维护负责人" size="large">
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
<el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -69,21 +72,21 @@
|
|
<div class="right-box">
|
|
<div class="right-box">
|
|
<el-scrollbar class="hc--right-15">
|
|
<el-scrollbar class="hc--right-15">
|
|
<el-timeline class="p-1">
|
|
<el-timeline class="p-1">
|
|
- <el-timeline-item v-for="(item, index) in timeLineData" :key="index" :type="item.type">
|
|
|
|
|
|
+ <el-timeline-item v-for="(item, index) in timeLineData" :key="index" :type="item.status===3?'success':item.status===2?'primary':'info'">
|
|
<div class="hac-time-line-box">
|
|
<div class="hac-time-line-box">
|
|
<div class="hac-time-line-title-box">
|
|
<div class="hac-time-line-title-box">
|
|
- <div class="title">{{item.title}}</div>
|
|
|
|
- <div class="state">{{item.state}}</div>
|
|
|
|
|
|
+ <div class="title">{{item.name}}</div>
|
|
|
|
+ <div class="state">{{item.statusValue}}</div>
|
|
</div>
|
|
</div>
|
|
<div class="hac-time-line-time">
|
|
<div class="hac-time-line-time">
|
|
- <span class="time">{{item.time}}</span>
|
|
|
|
- <span class="icon text-blue text-hover" v-if="dataType !== 'view'" @click="item.editTime = true">
|
|
|
|
|
|
+ <span class="time" v-if="item.processStartTime">{{item.processStartTime+"~"+item.processEndTime}}</span>
|
|
|
|
+ <span class="icon text-blue text-hover" v-if="dataType !== 'view'" @click="editTime(item)">
|
|
<HcIcon name="edit-2"/>
|
|
<HcIcon name="edit-2"/>
|
|
</span>
|
|
</span>
|
|
</div>
|
|
</div>
|
|
<div class="hac-time-line-time picker" v-if="item.editTime">
|
|
<div class="hac-time-line-time picker" v-if="item.editTime">
|
|
<div class="picker-box">
|
|
<div class="picker-box">
|
|
- <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
|
|
|
|
|
|
+ <HcDatePicker :dates="item.betweenTime" clearable @change="betweenTimeUpdate($event,item)"/>
|
|
</div>
|
|
</div>
|
|
<div class="icon-box text-blue text-hover" @click="item.editTime = false">
|
|
<div class="icon-box text-blue text-hover" @click="item.editTime = false">
|
|
<HcIcon name="check"/>
|
|
<HcIcon name="check"/>
|
|
@@ -101,7 +104,7 @@
|
|
<span v-if="dataType !== 'view'">取消并返回</span>
|
|
<span v-if="dataType !== 'view'">取消并返回</span>
|
|
<span v-else>返回</span>
|
|
<span v-else>返回</span>
|
|
</el-button>
|
|
</el-button>
|
|
- <el-button size="large" type="primary" hc-btn @click="doubleClick" v-if="dataType !== 'view'">
|
|
|
|
|
|
+ <el-button size="large" type="primary" hc-btn @click="doubleClick" v-if="dataType !== 'view'" :loading="saveLoading">
|
|
<HcIcon name="check-double"/>
|
|
<HcIcon name="check-double"/>
|
|
<span>提交保存</span>
|
|
<span>提交保存</span>
|
|
</el-button>
|
|
</el-button>
|
|
@@ -110,8 +113,10 @@
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
-import {ref, onActivated} from "vue";
|
|
|
|
|
|
+import {ref, onActivated,onMounted} from "vue";
|
|
import {useRoute, useRouter} from 'vue-router'
|
|
import {useRoute, useRouter} from 'vue-router'
|
|
|
|
+import projectApi from '~api/project/project-list.js';
|
|
|
|
+import {getArrValue,getObjValue,formValidate} from "js-fast-way"
|
|
|
|
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
const useRoutes = useRoute()
|
|
const useRoutes = useRoute()
|
|
@@ -124,25 +129,68 @@ const dataId = ref(useRoutes?.query?.id ?? '')
|
|
onActivated(() => {
|
|
onActivated(() => {
|
|
dataType.value = useRoutes?.query?.type ?? 'view'
|
|
dataType.value = useRoutes?.query?.type ?? 'view'
|
|
dataId.value = useRoutes?.query?.id ?? ''
|
|
dataId.value = useRoutes?.query?.id ?? ''
|
|
|
|
+ getBaseProcess()
|
|
|
|
+ if(dataType.value!=='add'){
|
|
|
|
+ getProjectInfoById()
|
|
|
|
+ }else{
|
|
|
|
+ formModel.value={}
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+})
|
|
|
|
+onMounted(()=>{
|
|
|
|
+ getProjectType()
|
|
|
|
+ getProjectServerTypeDict()
|
|
|
|
+
|
|
})
|
|
})
|
|
|
|
+//获取项目类型
|
|
|
|
+const getProjectType=async()=>{
|
|
|
|
+ const {error, code, data} = await projectApi.getProjectTypeDict()
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ projectType.value=getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ projectType.value=[]
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//获取项目服务类型
|
|
|
|
+const getProjectServerTypeDict=async()=>{
|
|
|
|
+ const {error, code, data} = await projectApi.getProjectServerTypeDict()
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ serverType.value=getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ serverType.value=[]
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//获取项目详情
|
|
|
|
+const getProjectInfoById=async()=>{
|
|
|
|
+ const {error, code, data} = await projectApi.getProjectInfoById({id: dataId.value})
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ formModel.value=getObjValue(data)
|
|
|
|
+ let arr=[]
|
|
|
|
+ arr[0]= formModel.value?.startTime
|
|
|
|
+ arr[1]= formModel.value?.endTime
|
|
|
|
+ probetweenTime.value=arr
|
|
|
|
+ formModel.value.contractMoney=formModel.value.contractMoney>0?formModel.value.contractMoney:''
|
|
|
|
+ timeLineData.value=formModel.value?.projectProcessList
|
|
|
|
+ } else {
|
|
|
|
+ formModel.value={}
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+//新增获取项目进程
|
|
|
|
+const getBaseProcess=async()=>{
|
|
|
|
+ const {error, code, data} = await projectApi.getBaseProcess()
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ timeLineData.value=getArrValue(data)
|
|
|
|
+ } else {
|
|
|
|
+ timeLineData.value=[]
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+}
|
|
//项目类型
|
|
//项目类型
|
|
-const projectType = ref([
|
|
|
|
- {name: '二级路', key: '二级路'},
|
|
|
|
- {name: '国道', key: '国道'},
|
|
|
|
- {name: '水利水电', key: '水利水电'},
|
|
|
|
- {name: '市政', key: '市政'},
|
|
|
|
-])
|
|
|
|
-
|
|
|
|
-//合同类型
|
|
|
|
-const contractType = ref([
|
|
|
|
- {name: '咨询服务+软件', key: '1'},
|
|
|
|
- {name: '软件', key: '2'},
|
|
|
|
- {name: '咨询服务', key: '3'},
|
|
|
|
- {name: '后期服务+软件', key: '4'},
|
|
|
|
- {name: '数字化扫描+软件', key: '5'},
|
|
|
|
-])
|
|
|
|
|
|
+const projectType = ref([])
|
|
|
|
|
|
|
|
+//项目服务类型
|
|
|
|
+const serverType = ref([])
|
|
|
|
+const contractType=ref([])
|
|
//项目进程
|
|
//项目进程
|
|
const projectProcess = ref([
|
|
const projectProcess = ref([
|
|
{name: '商机-演示沟通', key: '1'},
|
|
{name: '商机-演示沟通', key: '1'},
|
|
@@ -164,42 +212,42 @@ const formModel = ref({
|
|
key1: '', key2: '', key3: '', key4: '', key5: '',
|
|
key1: '', key2: '', key3: '', key4: '', key5: '',
|
|
})
|
|
})
|
|
const formRules = {
|
|
const formRules = {
|
|
- key: {
|
|
|
|
|
|
+ name: {
|
|
required: true,
|
|
required: true,
|
|
trigger: 'blur',
|
|
trigger: 'blur',
|
|
message: "请输入项目名称"
|
|
message: "请输入项目名称"
|
|
},
|
|
},
|
|
- key1: {
|
|
|
|
|
|
+ projectType: {
|
|
required: true,
|
|
required: true,
|
|
trigger: 'blur',
|
|
trigger: 'blur',
|
|
message: "请选择项目类型"
|
|
message: "请选择项目类型"
|
|
},
|
|
},
|
|
- key2: {
|
|
|
|
- required: true,
|
|
|
|
- trigger: 'blur',
|
|
|
|
- message: "请选择项目开始时间"
|
|
|
|
- },
|
|
|
|
- key3: {
|
|
|
|
- required: true,
|
|
|
|
- trigger: 'blur',
|
|
|
|
- message: "项目进程异常"
|
|
|
|
- },
|
|
|
|
- key8: {
|
|
|
|
|
|
+ constructUnit: {
|
|
required: true,
|
|
required: true,
|
|
trigger: 'blur',
|
|
trigger: 'blur',
|
|
- message: "请输入负责人"
|
|
|
|
|
|
+ message: "请选择项目建设单位"
|
|
},
|
|
},
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//日期时间被选择
|
|
//日期时间被选择
|
|
|
|
+const probetweenTime = ref(null)
|
|
|
|
+const probetweenTimeUpdate = ({arr, query}) => {
|
|
|
|
+ probetweenTime.value = arr
|
|
|
|
+ formModel.value.betweenTime = query
|
|
|
|
+}
|
|
const betweenTime = ref(null)
|
|
const betweenTime = ref(null)
|
|
-const betweenTimeUpdate = ({arr, query}) => {
|
|
|
|
|
|
+const betweenTimeUpdate = ({arr, query},item) => {
|
|
betweenTime.value = arr
|
|
betweenTime.value = arr
|
|
- //formModel.value.betweenTime = query
|
|
|
|
|
|
+ item.processStartTime=arr[0]
|
|
|
|
+ item.processEndTime=arr[1]
|
|
|
|
+ item.betweenTime=arr
|
|
|
|
+}
|
|
|
|
+const editTime=(item)=>{
|
|
|
|
+ item.editTime = true
|
|
|
|
+ item.betweenTime=[item.processStartTime,item.processEndTime]
|
|
}
|
|
}
|
|
-
|
|
|
|
-
|
|
|
|
//时间线数据
|
|
//时间线数据
|
|
const timeLineData = ref([
|
|
const timeLineData = ref([
|
|
{title: '商机-沟通演示', state: '已闭环', time: '2023-02-23~2023-03-14', type: 'success'},
|
|
{title: '商机-沟通演示', state: '已闭环', time: '2023-02-23~2023-03-14', type: 'success'},
|
|
@@ -220,9 +268,37 @@ const timeLineData = ref([
|
|
const goBackClick = () => {
|
|
const goBackClick = () => {
|
|
router.back()
|
|
router.back()
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+const saveLoading=ref(false)
|
|
//提交保存
|
|
//提交保存
|
|
-const doubleClick = () => {
|
|
|
|
|
|
+const doubleClick =async () => {
|
|
|
|
+ formModel.value.projectProcessList=timeLineData.value
|
|
|
|
+ const res = await formValidate(formRef.value)
|
|
|
|
+ if (res&&dataId.value.length>0) {
|
|
|
|
+ formModel.value.id=dataId.value
|
|
|
|
+ updateProjectInfo()
|
|
|
|
+ }else{
|
|
|
|
+ addProjectInfo()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+//新增项目
|
|
|
|
+const addProjectInfo=async()=>{
|
|
|
|
+ saveLoading.value=true;
|
|
|
|
+ const {error, code, data,msg} = await projectApi.addProjectInfo( formModel.value)
|
|
|
|
+ saveLoading.value=false;
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ window.$message.success(msg)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|
|
|
|
+//修改
|
|
|
|
+const updateProjectInfo=async()=>{
|
|
|
|
+ saveLoading.value=true;
|
|
|
|
+ const {error, code, data,msg} = await projectApi.updateProjectInfo( formModel.value)
|
|
|
|
+ saveLoading.value=false;
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ window.$message.success(msg)
|
|
|
|
+ }
|
|
|
|
|
|
}
|
|
}
|
|
</script>
|
|
</script>
|