瀏覽代碼

项目列表接口对接

duy 2 年之前
父節點
當前提交
b9480e94ae
共有 3 個文件被更改,包括 289 次插入95 次删除
  1. 68 0
      src/api/modules/project/project-list.js
  2. 86 36
      src/views/project/list/index.vue
  3. 135 59
      src/views/project/list/list-info.vue

+ 68 - 0
src/api/modules/project/project-list.js

@@ -0,0 +1,68 @@
+import {httpApi} from "../../request/httpApi";
+
+export default {
+    //获取项目列表
+    async getProjectList(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/page',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取项目类型字典
+    async getProjectTypeDict(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/getProjectTypeDict',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取项目服务类型字典
+    async getProjectServerTypeDict(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/getProjectServerTypeDict',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //获取项目详情
+    async getProjectInfoById(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/getProjectInfoById',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //新增项目
+    async addProjectInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/addProjectInfo',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //修改项目
+    async updateProjectInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/updateProjectInfo',
+            method: 'post',
+            data: form
+        }, msg);
+    },
+    //新增获取项目进程
+    async getBaseProcess(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectProcess/getBaseProcess',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+    //删除项目
+    async removeProjectInfo(form, msg = true) {
+        return httpApi({
+            url: '/api/blade-control/projectInfo/removeProjectInfo',
+            method: 'get',
+            params: form
+        }, msg);
+    },
+}

+ 86 - 36
src/views/project/list/index.vue

@@ -3,21 +3,21 @@
         <template #header>
             <div class="w-36">
                 <el-select v-model="searchForm.projectType" block clearable placeholder="项目类型" size="large">
-                    <el-option v-for="item in projectType" :label="item.name" :value="item.key"/>
+                    <el-option v-for="item in projectType" :label="item.dictName" :value="item.dictValue"/>
                 </el-select>
             </div>
             <div class="w-40 ml-2">
-                <el-select v-model="searchForm.contractType" block clearable placeholder="服务类型" size="large">
-                    <el-option v-for="item in contractType" :label="item.name" :value="item.key"/>
+                <el-select v-model="searchForm.projectServerType" block clearable placeholder="服务类型" size="large">
+                    <el-option v-for="item in serverType" :label="item.dictName" :value="item.dictValue"/>
                 </el-select>
             </div>
             <div class="w-36 ml-2">
-                <el-select v-model="searchForm.projectUser" block clearable placeholder="实施负责人" size="large">
+                <el-select v-model="searchForm.implementPrincipal" block clearable placeholder="实施负责人" size="large">
                     <el-option v-for="item in projectUser" :label="item.name" :value="item.key"/>
                 </el-select>
             </div>
             <div class="w-36 ml-2">
-                <el-select v-model="searchForm.date" block clearable placeholder="选择时间" size="large">
+                <el-select v-model="searchForm.queryDate" block clearable placeholder="选择时间" size="large">
                     <el-option v-for="item in annuals" :label="item.name" :value="item.key"/>
                 </el-select>
             </div>
@@ -45,12 +45,15 @@
         </template>
 
         <HcTable :isIndex="false" :column="tableColumn" :datas="tableData" :loading="tableLoading">
-            <template #key1="{row}">
-                <span class="text-blue text-hover" @click="rowClick(row)">{{row.key1}}</span>
+            <template #name="{row}">
+                <span class="text-blue text-hover" @click="rowClick(row)">{{row.name}}</span>
+            </template>
+            <template #key7="{row}">
+                <span class="text-blue text-hover">{{row.startTime+'~'+row.endTime}}</span>
             </template>
             <template #action="{row,index}">
                 <el-button plain size="small" type="primary" @click="editRowClick(row)">编辑</el-button>
-                <el-button plain size="small" type="danger">删除</el-button>
+                <el-button plain size="small" type="danger" @click="delRowClick(row)" :loading="row.delLoad||false">删除</el-button>
             </template>
         </HcTable>
 
@@ -61,27 +64,31 @@
 </template>
 
 <script setup>
-import {ref} from "vue";
+import {ref,onMounted,onActivated} from "vue";
 import {useRouter} from 'vue-router'
+import projectApi from '~api/project/project-list.js';
+import {getArrValue} from "js-fast-way"
+import {delMessage} from "~uti/tools";
 
 const router = useRouter()
-
+onMounted(()=>{
+    getTableData()
+    getProjectType()
+    getProjectServerTypeDict()
+})
+onActivated(()=>{
+    getTableData()
+})
 //项目类型
 const projectType = ref([
-    {name: '二级路', key: '二级路'},
-    {name: '国道', key: '国道'},
-    {name: '水利水电', key: '水利水电'},
-    {name: '市政', key: '市政'},
+    // {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 serverType = ref([])
 
 //实施负责人
 const projectUser = ref([
@@ -119,6 +126,7 @@ const searchClick = () => {
 //重置搜索表单
 const resetClick = () => {
     searchForm.value = {current: 1, size: 20, total: 0}
+    getTableData()
 }
 
 
@@ -132,16 +140,16 @@ const pageChange = ({current, size}) => {
 //获取数据
 const tableLoading = ref(false)
 const tableColumn = [
-    {key: 'key', name: '编号', width: '100', align: 'center'},
-    {key: 'key1', name: '项目名称', width: '260'},
-    {key: 'key2', name: '客户单位', width: '200', align: 'center'},
-    {key: 'key4', name: '项目类型', width: '140', align: 'center'},
-    {key: 'key5', name: '服务类型', width: '140', align: 'center'},
-    {key: 'key6', name: '合同额(W)', width: '100', align: 'center'},
-    {key: 'key8', name: '项目负责人', width: '100', align: 'center'},
-    {key: 'key8', name: '实施负责人', width: '100', align: 'center'},
+    {key: 'number', name: '编号', width: '100', align: 'center'},
+    {key: 'name', name: '项目名称', minWidth: '260'},
+    {key: 'constructUnit', name: '客户单位', width: '200', align: 'center'},
+    {key: 'projectTypeValue', name: '项目类型', width: '140', align: 'center'},
+    {key: 'projectServerTypeValue', name: '服务类型', width: '140', align: 'center'},
+    {key: 'contractMoney', name: '合同额(W)', width: '100', align: 'center'},
+    {key: 'projectPrincipalName', name: '项目负责人', width: '100', align: 'center'},
+    {key: 'implementPrincipalName', name: '实施负责人', width: '100', align: 'center'},
     {key: 'key7', name: '项目起止日期', width: '220', align: 'center'},
-    {key: 'action', name: '操作', width: '130', align: 'center', fixed: 'right'},
+    {key: 'action', name: '操作', width: '160', align: 'center', fixed: 'right'},
 ]
 const tableData = ref([
     {id: 1, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key8: '张三', key7: '2022-07-01 ~ 2022-04-01'},
@@ -149,10 +157,36 @@ const tableData = ref([
     {id: 3, key: 'GS-01', key1: '焦作至唐河高速公路方城至唐河段', key2: '研发-配置', key3: '2022-07-01', key4: '高速公路', key5: '软件合同', key6: '40', key7: '2022-07-01 ~ 2022-04-01'},
 ])
 
-const getTableData = () => {
-
+const getTableData = async() => {
+    tableLoading.value = true
+    const {error, code, data} = await projectApi.getProjectList(searchForm.value)
+    tableLoading.value = false
+    if (!error && code === 200) {
+        tableData.value = getArrValue(data['records'])
+        searchForm.value.total = data['total'] || 0
+    } else {
+        tableData.value = []
+        searchForm.value.total = 0
+    }
+}
+//获取项目类型
+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 rowClick = (row) => {
     router.push({
@@ -164,7 +198,7 @@ const rowClick = (row) => {
     })
 }
 
-//编辑预算
+//编辑
 const editRowClick = (row) => {
     router.push({
         name: 'project-list-info',
@@ -175,7 +209,7 @@ const editRowClick = (row) => {
     })
 }
 
-//新增预算
+//新增
 const addRowClick = () => {
     router.push({
         name: 'project-list-info',
@@ -183,5 +217,21 @@ const addRowClick = () => {
             type: 'add'
         }
     })
+}
+//删除
+const delRowClick = (row) => {
+    delMessage(async() => {
+            row.delLoad= true
+            const {error, code, data,msg} = await projectApi.removeProjectInfo({id:row.id})
+            row.delLoad= false
+            if (!error && code === 200) {
+                window.$message.success(msg)
+                getTableData()
+            } else {
+                getTableData()
+            }
+    })
+    
+
 }
 </script>

+ 135 - 59
src/views/project/list/list-info.vue

@@ -6,32 +6,35 @@
                     <el-form ref="formRef" :model="formModel" :rules="formRules" label-width="auto" size="large" :disabled="dataType === 'view'">
                         <div class="project-form-top">
                             <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 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 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-form-item>
                                 <el-form-item label="项目进程:" prop="key3">
                                     <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-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-form-item>
                                 <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 label="合同额:">
-                                    <el-input v-model="formModel.key6" disabled="disabled"/>
+                                    <el-input v-model="formModel.contractMoney" disabled="disabled"/>
                                 </el-form-item>
                                 <el-form-item label="已回款:">
                                     <el-input v-model="formModel.key7" disabled="disabled"/>
@@ -47,17 +50,17 @@
                         <div class="project-form-bottom">
                             <HcCardItem title="联系人信息">
                                 <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-select>
                                 </el-form-item>
                                 <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-select>
                                 </el-form-item>
                                 <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-select>
                                 </el-form-item>
@@ -69,21 +72,21 @@
             <div class="right-box">
                 <el-scrollbar class="hc--right-15">
                     <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-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 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"/>
                                     </span>
                                 </div>
                                 <div class="hac-time-line-time picker" v-if="item.editTime">
                                     <div class="picker-box">
-                                        <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
+                                        <HcDatePicker :dates="item.betweenTime" clearable @change="betweenTimeUpdate($event,item)"/>
                                     </div>
                                     <div class="icon-box text-blue text-hover" @click="item.editTime = false">
                                         <HcIcon name="check"/>
@@ -101,7 +104,7 @@
                 <span v-if="dataType !== 'view'">取消并返回</span>
                 <span v-else>返回</span>
             </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"/>
                 <span>提交保存</span>
             </el-button>
@@ -110,8 +113,10 @@
 </template>
 
 <script setup>
-import {ref, onActivated} from "vue";
+import {ref, onActivated,onMounted} from "vue";
 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 useRoutes = useRoute()
@@ -124,25 +129,68 @@ const dataId = ref(useRoutes?.query?.id ?? '')
 onActivated(() => {
     dataType.value = useRoutes?.query?.type ?? 'view'
     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([
     {name: '商机-演示沟通', key: '1'},
@@ -164,42 +212,42 @@ const formModel = ref({
     key1: '', key2: '', key3: '', key4: '', key5: '',
 })
 const formRules = {
-    key: {
+    name: {
         required: true,
         trigger: 'blur',
         message: "请输入项目名称"
     },
-    key1: {
+    projectType: {
         required: true,
         trigger: 'blur',
         message: "请选择项目类型"
     },
-    key2: {
-        required: true,
-        trigger: 'blur',
-        message: "请选择项目开始时间"
-    },
-    key3: {
-        required: true,
-        trigger: 'blur',
-        message: "项目进程异常"
-    },
-    key8: {
+    constructUnit: {
         required: true,
         trigger: 'blur',
-        message: "请输入负责人"
+        message: "请选择项目建设单位"
     },
+
 }
 
 
 //日期时间被选择
+const probetweenTime = ref(null)
+const probetweenTimeUpdate = ({arr, query}) => {
+    probetweenTime.value = arr
+    formModel.value.betweenTime = query
+}
 const betweenTime = ref(null)
-const betweenTimeUpdate = ({arr, query}) => {
+const betweenTimeUpdate = ({arr, query},item) => {
     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([
     {title: '商机-沟通演示', state: '已闭环', time: '2023-02-23~2023-03-14', type: 'success'},
@@ -220,9 +268,37 @@ const timeLineData = ref([
 const goBackClick = () => {
     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>