ソースを参照

创建项目,项目列表

gangyj 3 年 前
コミット
b5bae8cd17

+ 18 - 0
src/api/manager/contractinfo.js

@@ -0,0 +1,18 @@
+import request from '@/router/axios';
+
+export const submitContractInfo = (contractInfo) => {
+  return request({
+    url: '/api/blade-manager/contractInfo/submit',
+    method: 'post',
+    data: contractInfo
+  })
+}
+export const findContractByProjectId = (pid) => {
+  return request({
+    url: '/api/blade-manager/contractInfo/findContractInfoByPid',
+    method: 'get',
+    params: {
+      pid
+    }
+  })
+}

+ 21 - 0
src/api/manager/projectinfo.js

@@ -0,0 +1,21 @@
+import request from '@/router/axios';
+
+export const submitProject = (projectInfo) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/submit',
+    method: 'post',
+    data: projectInfo
+  })
+}
+
+export const getProjectList = (current, size, params) => {
+  return request({
+    url: '/api/blade-manager/projectInfo/list',
+    method: 'get',
+    params: {
+      ...params,
+      current,
+      size,
+    }
+  })
+}

+ 20 - 0
src/styles/common.scss

@@ -37,6 +37,19 @@ a{
 .jc-sb{
   justify-content:space-between
 }
+.jc-al-c{
+  align-items: center;
+}
+.flex-center{
+  justify-content: center;
+  align-items: center;
+}
+
+.grid4x4{
+  display: grid;
+  grid-template-columns: 25% 25% 25% 25%;
+  grid-template-rows: 25% 25% 25% 25%;
+}
 
 .w-100p{width: 100%;}
 .h-100p{height: 100%;}
@@ -65,6 +78,8 @@ a{
 .pd-b-20{padding-bottom: 20px;}
 .pd-20{padding: 20px;}
 
+.box-size-bb{box-sizing: border-box;}
+
 .bgc-f6{background-color: #f6f6f6;}
 .normal-black{color: #606266;}
 .border-grey{
@@ -72,6 +87,9 @@ a{
   border-width: 1px;
   border-style: solid;
 }
+.border-grey-b{
+  border-bottom: 1px solid rgb(187, 187, 187);
+}
 
 .font-s-12{font-size: 12px;}
 .font-c-warning{color: rgb(240, 99, 10);}
@@ -84,6 +102,8 @@ a{
   color: #f56c6c;
 }
 
+.text-align-c{text-align: center;}
+
 .custom-tree-node {
   flex: 1;
   display: flex;

+ 168 - 0
src/views/manager/projectinfo/detail.vue

@@ -0,0 +1,168 @@
+<template>
+  <basic-container>
+    <div>
+      <el-tabs v-model="activeType" :before-leave="beforeLeave">
+        <el-tab-pane label="项目基本信息" name="1">
+          <div>
+            <el-form :model="projectForm" :rules="projectRules" ref="projectForm" label-width="120px">
+              <el-row>
+                <el-col :span="12">
+                  <el-form-item label="项目名称" prop="projectName">
+                    <el-input v-model="projectForm.projectName"></el-input>
+                  </el-form-item>
+                  <el-form-item label="项目别名" prop="projectAlias">
+                    <el-input v-model="projectForm.projectAlias"></el-input>
+                  </el-form-item>
+                  <el-form-item label="项目编号" prop="projectNumber">
+                    <el-input v-model="projectForm.projectNumber"></el-input>
+                  </el-form-item>
+                  <el-form-item label="公路等级" prop="projectGrade">
+                    <el-select v-model="projectForm.projectGrade" placeholder="请选择" class="w-100p">
+                      <el-option v-for="item in highwayGradeList" :key="item.id" :label="item.dictValue"  :value="item.dictKey"></el-option>
+                    </el-select>
+                  </el-form-item>
+                  <el-form-item label="计划开工日期" prop="planStartTime">
+                    <el-date-picker  v-model="projectForm.planStartTime"  type="date"  placeholder="选择日期"></el-date-picker>
+                  </el-form-item>
+                  <el-form-item label="实际开工日期" prop="actualStartTime">
+                    <el-date-picker  v-model="projectForm.actualStartTime"  type="date"  placeholder="选择日期"></el-date-picker>
+                  </el-form-item>
+                  <el-form-item label="项目预算投资" prop="estimatedAmount">
+                    <el-input v-model="projectForm.estimatedAmount">
+                      <template slot="append">万元</template>
+                    </el-input>
+                  </el-form-item>
+                </el-col>
+                <el-col :span="12">
+                  <el-form-item label="项目概况" prop="projectGist">
+                    <el-input v-model="projectForm.projectGist" type="textarea" :rows="7"></el-input>
+                  </el-form-item>
+                  <el-form-item label="内置里程">
+                    <el-radio-group v-model="radioType">
+                      <el-radio-button label="总里程"></el-radio-button>
+                      <el-radio-button label="路面"></el-radio-button>
+                      <el-radio-button label="路基"></el-radio-button>
+                    </el-radio-group>
+                    <el-input-number v-model="projectForm.projectAllMileage" v-show="radioType == '总里程'" :min="0" label="总里程"></el-input-number>
+                    <el-input-number v-model="projectForm.projectPavement" v-show="radioType == '路面'" :min="0" label="路面"></el-input-number>
+                    <el-input-number v-model="projectForm.projectSubgrade" v-show="radioType == '路基'" :min="0" label="路基"></el-input-number>
+                  </el-form-item>
+                  <el-form-item label="计划完工日期" prop="planEndTime">
+                    <el-date-picker  v-model="projectForm.planEndTime"  type="date"  placeholder="选择日期"></el-date-picker>
+                  </el-form-item>
+                  <el-form-item label="实际完工日期" prop="actualEndTime">
+                    <el-date-picker  v-model="projectForm.actualEndTime"  type="date"  placeholder="选择日期"></el-date-picker>
+                  </el-form-item>
+                </el-col>
+              </el-row>
+            </el-form>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane label="分配试验模版" name="2">
+          <div>
+            
+          </div>
+        </el-tab-pane>
+        <el-tab-pane label="分配系统维护人员" name="3">
+          <div>
+            
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+
+      <div class="flex jc-sb">
+        <div></div>
+        <div>
+          <el-button type="success" size="medium" @click="saveQuit">保存并退出</el-button>
+          <el-button type="info" size="medium" @click="saveNext">保存并进入下一步</el-button>
+        </div>
+      </div>
+    </div>
+  </basic-container>
+</template>
+
+<script>
+  import {submitProject} from "@/api/manager/projectinfo";
+  import {getDictionary} from "@/api/system/dict";
+  import {mapGetters} from "vuex";
+  export default {
+    data() {
+      return {
+        activeType:'1',
+
+        highwayGradeList:[],
+        radioType:'总里程',
+
+        projectForm:{},
+        projectRules:{
+          projectName: [
+            { required: true, message: '请输入项目名称', trigger: 'blur' },
+          ],
+          projectAlias: [
+            { required: true, message: '请输入项目别名', trigger: 'blur' },
+          ],
+        },
+      }
+    },
+    computed: {
+      ...mapGetters(["userInfo"]),
+    },
+    created() {
+      this.init();
+      //console.log(this.userInfo)
+    },
+    methods: {
+     init(){
+       this.getHighwayGradeList();
+     },
+     beforeLeave(activeName, oldActiveName){
+       console.log(oldActiveName,'oldActiveName');
+       console.log(this.activeType);
+     },
+
+     saveQuit(){
+       this.saveProject().then((res)=>{
+         this.projectForm.id = res.data.data.id;
+         this.$message({
+            type: "success",
+            message: "保存成功!"
+          });
+       }).catch((res)=>{
+         console.log(res)
+       })
+     },
+     saveNext(){
+
+     },
+     saveProject(){
+       return new Promise((resolve, reject) => {
+         this.$refs['projectForm'].validate((valid) => {
+          if (valid) {
+            resolve(submitProject(this.projectForm))
+          }else{
+            reject('验证失败')
+          }
+        })
+       })
+     },
+
+     getHighwayGradeList(){
+        if(this.highwayGradeList.length >1){
+          return;
+        }
+        getDictionary({
+          code:'highway_grade'
+        }).then((res)=>{
+          res.data.data.forEach(element => {
+            element.dictKey = Number(element.dictKey)
+          });
+          this.highwayGradeList = res.data.data;
+        })
+      },
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  
+</style>

+ 196 - 0
src/views/manager/projectinfo/list.vue

@@ -0,0 +1,196 @@
+<template>
+  <basic-container>
+    <div>
+      <div class="pd-b-20 border-grey-b">
+        <span class="mg-r-10">选择项目名称</span>
+        <el-select v-model="projectId" @change="projectChange" placeholder="请选择">
+          <el-option  v-for="item in projectList"  :key="item.id" :label="item.projectName" :value="item.id"></el-option>
+        </el-select>
+      </div>
+      <div class="pd-t-20">
+        <el-row :gutter="20"  style="height:calc(100vh - 290px)">
+          <el-col :span="6" v-for="(item,index) in projectPageList" :key="item.id" style="height:20%;" class="mg-b-20 box-size-bb">
+            <el-card @click.native="projectClick(item)" class="box-card h-100p flex flex-center project_name" :class="getBg(index)">
+              {{item.projectAlias}}
+            </el-card>
+          </el-col>
+        </el-row>
+      </div>
+      <div>
+        <el-pagination
+          layout="prev, pager, next" class="text-align-c"
+          @current-change="handleCurrentChange"
+          :current-page.sync="page.currentPage"
+          :total="page.total" :page-size="page.pageSize">
+        </el-pagination>
+      </div>
+    </div>
+
+    <el-dialog title="项目信息" :visible.sync="projectVisible" width="800px" append-to-body>
+      <div class="flex jc-sb pd-b-10">
+        <span>{{curProjiect.projectName}}</span>
+        <div>
+          <el-button size="small" type="success">WBS树管理</el-button>
+          <el-button size="small" type="primary">编辑项目信息</el-button>
+          <el-button size="small" type="info">创建新合同段</el-button>
+          <el-button size="small" @click="projectVisible = false">返回</el-button>
+        </div>
+      </div>
+      <div style="height:400px;overflow: auto;" v-if="contractList.length > 0">
+        <el-card shadow="never" v-for="(item) in contractList" :key="item.id">
+          <div class="flex jc-sb">
+            <div class="flex jc-al-c">
+              <el-avatar :size="50" :class="getAvatarBg(item.contractType)">{{getFont(item.contractType)}}</el-avatar>
+              <span class="mg-l-10">{{item.contractName}}</span>
+            </div>
+            <div class="flex jc-al-c">
+              <el-link type="primary" >编辑合同段信息</el-link>
+              <el-link type="primary" class="mg-l-10">分配WBS</el-link>
+              <el-link type="primary" class="mg-l-10">分配项目人员</el-link>
+              <el-link type="primary" class="mg-l-10">删除</el-link>
+            </div>
+          </div>
+        </el-card>
+      </div>
+      <div class="text-align-c pd-t-20" v-else>
+        暂无合同段,请先创建合同段
+      </div>
+    </el-dialog>
+  </basic-container>
+</template>
+
+<script>
+  import {getProjectList} from "@/api/manager/projectinfo";
+  import {findContractByProjectId} from "@/api/manager/contractinfo";
+  import {getDictionary} from "@/api/system/dict";
+  import {mapGetters} from "vuex";
+  export default {
+    data() {
+      return {
+        projectId:'',
+        curProjiect:{},
+        projectList:[],
+        projectPageList:[],
+
+        projectVisible:false,
+        contractList:[],
+
+        page:{
+          currentPage:1,
+          pageSize:16,
+          total:0
+        }
+      }
+    },
+    computed: {
+      ...mapGetters(["userInfo"]),
+    },
+    created() {
+      this.init();
+      //console.log(this.userInfo)
+    },
+    methods: {
+      init(){
+        this.getProjectList();
+        this.getProjectPageList();
+      },
+
+      getProjectList(){
+        getProjectList(1,999).then((res)=>{
+          this.projectList = res.data.data.records;
+        })
+      },
+      getProjectPageList(){
+        getProjectList(this.page.currentPage,this.page.pageSize).then((res)=>{
+          this.projectPageList = res.data.data.records;
+          this.page.total = res.data.data.total;
+        })
+      },
+
+      projectClick(item){
+        this.curProjiect = item;
+        findContractByProjectId(this.curProjiect.id).then((res)=>{
+          this.contractList = res.data.data;
+        })
+        this.projectVisible = true;
+      },
+
+      handleCurrentChange(val){
+        this.getProjectPageList();
+        this.page.currentPage = val;
+      },
+
+      projectChange(id){
+        for (let i = 0; i < this.projectList.length; i++) {
+          if(id == this.projectList[i].id){
+            this.curProjiect = this.projectList[i];
+            findContractByProjectId(this.curProjiect.id).then((res)=>{
+              this.contractList = res.data.data;
+            })
+            this.projectVisible = true;
+            return;
+          }
+        }
+      },
+
+      getFont(type){
+        if(type == 1){
+          return '施';
+        }else if(type == 2){
+          return '监';
+        }else if(type == 3){
+          return '业';
+        }
+        return '';
+      },
+      getAvatarBg(type){
+        if(type == 1){
+          return {'abg1':true};
+        }else if(type == 2){
+          return {'abg2':true};
+        }else if(type == 3){
+          return {'abg3':true};
+        }
+        return {};
+      },
+      getBg(index){
+        let num = Math.trunc(index/4);
+        if((num%2)===0){//判定条件余数为0时为偶数
+          return{
+            'bg1':true
+          }
+        }else{
+          return{
+            'bg2':true
+          }
+        }
+      }
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+  .project_name{
+    font-size: 20px;
+    cursor: pointer;
+  }
+  .bg1{
+    background-color: rgb(127, 164, 221);
+    border-color: rgb(187, 187, 187);
+    box-shadow: rgba(0, 0, 0, .4) 0px 2px 6px 0px;
+  }
+  .bg2{
+    background-color: rgb(239, 240, 229);
+    border-color: rgb(187, 187, 187);
+    box-shadow: rgba(0, 0, 0, .4) 0px 2px 6px 0px;
+  }
+  .abg1{
+    background-color: rgb(42, 155, 121);
+  }
+  .abg2{
+    background-color: rgb(155, 108, 42);
+  }
+  .abg3{
+    background-color: rgb(42, 53, 155);
+  }
+</style>