Parcourir la source

2022.5.11 16:25

山水共长天一色 il y a 3 ans
Parent
commit
ac0fd6f4a7

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/config/index.js

@@ -1,7 +1,7 @@
 var path = require('path')
 
 //  var ip = '127.0.0.1'
-var ip = '192.168.2.24'
+var ip = '192.168.2.29'
 // var ip = '192.168.2.12'// var ip = '47.100.37.243' 
 
 // var os = require('os'), ip = '', ifaces = os.networkInterfaces() // 获取本机ip

+ 2 - 0
fhKeeper/formulahousekeeper/timesheet/src/permissions.js

@@ -45,6 +45,7 @@ const StringUtil = {
         reportPhase : false, // 项目阶段工时表 // 
         reportOvertime : false, // 加班情况统计表 //
         reportCost: false, // 查看加班成本 //
+        reportCostWarning: false, // 工时成本预警表 //
 
         // 请假模块
         leaveFil : false, // 请假填报 // 
@@ -125,6 +126,7 @@ const StringUtil = {
         arr[i] == '管理专业证书' ? obj.structureCertificate = true : ''
         arr[i] == '查看加班成本' ? obj.reportCost = true : ''
         arr[i] == '下拨成本预算' ? obj.projectAllocate = true : ''
+        arr[i] == '工时成本预警表' ? obj.reportCostWarning = true : ''
     }
 
     return obj

+ 109 - 6
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -19,10 +19,11 @@
               <el-menu-item index="1-1"><p @click="ssl(0)">项目报表</p></el-menu-item>
               <el-menu-item index="1-2" v-if="permissions.reportTask"><p @click="ssl(1)">项目任务报表</p></el-menu-item>
               <el-menu-item index="1-3" v-if="permissions.reportCostOf"><p @click="ssl(2)">项目成本报表</p></el-menu-item>
-              <el-menu-item index="1-4" v-if="permissions.reportBalance"><p @click="ssl(3)">项目收支平衡表</p></el-menu-item>
-              <el-menu-item index="1-5" v-if="user.company.packageCustomer == 1 && permissions.reportProfits"><p @click="ssl(4)">客户项目利润表</p></el-menu-item>
-              <el-menu-item index="1-6" v-if="permissions.reportPhase"><p @click="ssl(5)">项目阶段工时表</p></el-menu-item>
-              <el-menu-item index="1-7" v-if="permissions.reportOvertime"><p @click="ssl(6)">加班情况统计表</p></el-menu-item>
+              <el-menu-item index="1-4" v-if="permissions.reportCostWarning"><p @click="ssl(7)">工时成本预警表</p></el-menu-item>
+              <el-menu-item index="1-5" v-if="permissions.reportBalance"><p @click="ssl(3)">项目收支平衡表</p></el-menu-item>
+              <el-menu-item index="1-6" v-if="user.company.packageCustomer == 1 && permissions.reportProfits"><p @click="ssl(4)">客户项目利润表</p></el-menu-item>
+              <el-menu-item index="1-7" v-if="permissions.reportPhase"><p @click="ssl(5)">项目阶段工时表</p></el-menu-item>
+              <el-menu-item index="1-8" v-if="permissions.reportOvertime"><p @click="ssl(6)">加班情况统计表</p></el-menu-item>
             </el-submenu>
           </el-menu>
       </el-col>
@@ -158,6 +159,7 @@
                     </template>
                 </el-table-column>
             </el-table>
+
             <!--项目收支平衡表 -->
             <el-table v-if="ins == 3"  :key="ins" border :data="list" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
                 <el-table-column prop="projectCode" label="项目编号"  width="120"></el-table-column>
@@ -308,6 +310,44 @@
                 </el-table-column> 
               </el-table>
             </div>
+            
+            <!-- 工时成本预警表 -->
+            <el-table v-if="ins == 7" :key="ins" border :data="baseCostList" highlight-current-row v-loading="listLoading" :height="tableHeight" style="width: 100%;">
+            <!-- 当前总预算,已发生工时成本,xxx成本预算,xxx已发生成本,xxx已发生占比, yyy成本预算,yyy已发生成本,yyy已发生占比。 -->
+                <el-table-column  prop="projectCode" label="项目编号"  width="120"></el-table-column>
+                <el-table-column  prop="projectName" label="项目名称" width="200"></el-table-column>
+                <el-table-column prop="baseCurcost" label="当前总预算" width="100" align="right">
+                  <template slot-scope="scope">
+                    <span>¥{{scope.row.baseCurcost | numberToCurrency}}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="feeMan" label="已发生工时成本" width="100" align="right">
+                  <template slot-scope="scope">
+                    <span :class="scope.row.baseCurcost * 0.9 < scope.row.feeMan ? 'warntext' : ''">¥{{scope.row.feeMan | numberToCurrency}}</span>
+                  </template>
+                </el-table-column>
+                <template v-for="item in baseCostColumns">
+                  <el-table-column :label="item.name + '成本预算'" width="100" align="right">
+                    <template slot-scope="scope">
+                      <span>¥{{budgetFilter(scope.row.curcostList,item.id) | numberToCurrency}}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column :label="item.name + '已发生成本'" width="100" align="right">
+                    <template slot-scope="scope">
+                      <span :class="percentageFilter(scope.row,item.id) > 90 ? 'warntext' : ''"
+                      >¥{{AlreadyFilter(scope.row.realcostList,item.id) | numberToCurrency}}</span>
+                    </template>
+                  </el-table-column>
+                  <el-table-column :label="item.name + '已发生占比'" width="100" align="right">
+                    <template slot-scope="scope">
+                      <span :class="percentageFilter(scope.row,item.id) > 90 ? 'warntext' : ''"
+                      >{{percentageFilter(scope.row,item.id) == 'NaN' ? '-' : percentageFilter(scope.row,item.id) + '%'}}</span>
+                    </template>
+                  </el-table-column>
+                </template>
+
+            </el-table>
+
         <!--工具条-->
         <el-col :span="24" class="toolbar" v-if="ins != 6">
             <el-pagination
@@ -473,7 +513,7 @@ export default {
       z   : null,
       value: null,
       dialog: false, // 单据查看展示
-      shuz: ["项目报表","项目任务报表","项目成本报表","项目收支平衡表(利润表)","客户项目利润报表","项目阶段工时表","加班情况统计表"],
+      shuz: ["项目报表","项目任务报表","项目成本报表","项目收支平衡表(利润表)","客户项目利润报表","项目阶段工时表","加班情况统计表","工时成本预警表"],
       ins: 0,
       user: JSON.parse(sessionStorage.user),
       overTimeList: [], // 项目加班情况统计列表
@@ -484,7 +524,9 @@ export default {
       userId: '',
       userList: [],
       dialogVisibleDetails: false,
-      detailsList: []
+      detailsList: [],
+      baseCostList: [],
+      baseCostColumns: []
     };
   },
   computed: {},
@@ -631,6 +673,8 @@ export default {
                     this.getProjectStages();
                 } else if (this.ins == 6) {
                     this.overTime()
+                } else if (this.ins == 7) {
+                    this.getBaseCost()
                 }
             },
       exportExcel() {
@@ -661,6 +705,9 @@ export default {
           sl.startDate = this.rangeDatas[0]
           sl.endDate = this.rangeDatas[1]
           sl.projectId = this.proJuctId
+        } else if (this.ins == 7) {
+          fName = "工时成本预警表.xls";
+          url += "/exportBaseCostAndRealCost";
         }
           this.http.post(url, sl,
             res => {
@@ -854,6 +901,59 @@ export default {
             });
         });
     },
+    getBaseCost(){
+      this.listLoading = true
+      this.http.post('/project/getBaseCostAndRealCost',{
+        pageIndex: this.page,
+        pageSize: this.size
+      },res => {
+        if(res.code == 'ok'){
+          this.baseCostList = res.data.records
+          this.baseCostColumns = res.data.columns
+          this.total = res.data.total
+          this.listLoading = false
+        }else {
+          this.listLoading = false
+          this.$message({
+            message: res.msg,
+            type: 'error'
+          })
+        }
+      },err => {
+        this.listLoading = false
+        this.$message({
+          message: err,
+          type: 'error'
+        })
+      })
+    },
+
+    budgetFilter(emList,eId){
+                let emItem = emList.filter((em)=>{
+                    return em.baseId == eId
+                })
+                if(emItem.length == 0){
+                    return 0
+                }else{
+                    return emItem[0].baseAmount
+                }
+    },
+    AlreadyFilter(emList,eId){
+                let emItem = emList.filter((em)=>{
+                    return em.basecostId == eId
+                })
+                if(emItem.length == 0){
+                    return 0
+                }else{
+                    return emItem[0].cost
+                }
+    },
+    percentageFilter(row,eid){
+      let budget = this.budgetFilter(row.curcostList,eid)
+      let already = this.AlreadyFilter(row.realcostList,eid)
+      let ret = (already / budget)*100
+      return ret.toFixed(0)
+    },
 
     
     getProjectList() {
@@ -1124,5 +1224,8 @@ export default {
   display: inline-block;
   margin-right: 20px;
 }
+.warntext{
+  color:red;
+}
 
 </style>

+ 25 - 9
fhKeeper/formulahousekeeper/timesheet/src/views/project/CostBaseline.vue

@@ -1,6 +1,6 @@
 <template>
     <div :style="'padding:10px;background:#f7f7f7;min-height:'+tableHeight+'px;'">
-        <div style="margin: 0 auto;width:1120px;">
+        <div style="margin: 0 auto;width:1000px;">
             <el-row :gutter="24">
                 <el-col :span="12">
                     <div class="box" style="min-height:180px">
@@ -9,7 +9,10 @@
                             <label class="lableTxt">总成本基线<el-link v-if="permissions.projectCorrection" @click="correctBase" style="float:right;"><i class="el-icon-edit"  ></i></el-link></label>
                             <div class="lableCon" v-for="item in projectBaseCostData" :key="item.id">
                                 <div><span class="gray_label">{{item.baseName}}:</span></div>
-                                <div><span style="padding-right:20px;float:right;">¥{{item.baseAmount==null?'-':item.baseAmount | numberToCurrency}}</span></div>
+                                <div><span style="padding-right:20px;float:right;">¥{{item.baseAmount | numberToCurrency}}</span></div>
+                                <div>
+                                    <span style="padding-right:15px;float:right;">剩余可下拨 <span :style="item.baseAmount * 0.9 < baseCostFilter(item.baseId) ? 'color:red;' : ''">¥{{(item.baseAmount - baseCostFilter(item.baseId)) | numberToCurrency}}</span></span>
+                                </div>
                             </div>
                             <div style="height:24px">
                             <el-link style="float:right;margin-right:10px" @click="addCostAdd" size="small" v-if="permissions.projectAllocate" type="primary">下拨成本预算</el-link>
@@ -48,7 +51,7 @@
                             <el-table-column label="下拨时间" prop="indate" align="center"></el-table-column>
                             <el-table-column label="操作人员" prop="userName" align="center"></el-table-column>
                             <el-table-column label="备注" prop="remark" align="left" header-align="center" show-overflow-tooltip></el-table-column>
-                            <el-table-column label="" align="center">
+                            <el-table-column label="" align="center" fixed="right">
                                 <template slot-scope="scope">
                                     <el-button size="small" @click="revert(scope.row.id)" v-if="scope.$index == 0">撤销</el-button>
                                 </template>
@@ -150,6 +153,16 @@
                 // let item = this.itemListFilter(list,lid)
                 console.log('test',this.addListColumns);
             },
+            baseCostFilter(eId){
+                let emItem = this.nowBaseList.filter((em)=>{
+                    return em.baseId == eId
+                })
+                if(emItem.length == 0){
+                    return 0
+                }else{
+                    return emItem[0].baseAmount
+                }
+            },
             itemListFilter(emList,eId){
                 let emItem = emList.filter((em)=>{
                     return em.baseId == eId
@@ -159,7 +172,6 @@
                 }else{
                     return emItem[0].baseAmount
                 }
-                
             },
             getProjectBaseData(projectId) {
                 this.http.post('/project-basecost/get',{
@@ -427,18 +439,22 @@
 }
 .lableCon{
     margin: 20px 10px;
+    height: 20px;
 }
 .lableCon div:nth-child(1){
-    width: 50%;
+    width: 30%;
     float: left;
 }
 .lableCon div:nth-child(2){
-    width: 25%;
-    display: inline-block;
+    width: 30%;
+    float: left;
 }
 .lableCon div:nth-child(3){
-    width: 24%;
-    display: inline-block;
+    width: 40%;
+    float: left;
+    font-size: 13px;
+    color: #999;
+    line-height: 20px;
 }
 .gray_label {
     color: #999;

+ 42 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/project/gantt.vue

@@ -99,7 +99,48 @@ export default {
 	  gantt.config.date_scale = "%F, %Y";		//设置时间刻度的格式(X轴) 多个尺度
 
 	  gantt.config.scale_height = 50; //设置时间刻度的高度和网格的标题
-
+// gantt.config.layout = {
+//     css: "gantt_container",
+//     rows:[
+//         {
+//            cols: [
+//             {
+//               // the default grid view  
+//               view: "grid",  
+//               scrollX:"scrollHor", 
+//               scrollY:"scrollVer"
+//             },
+//             { resizer: true, width: 2 },
+//             {
+//               // the default timeline view
+//               view: "timeline", 
+//               scrollX:"scrollHor", 
+//               scrollY:"scrollVer"
+//             },
+//             {
+//               view: "scrollbar", 
+//               id:"scrollVer"
+//             }
+//         ]},
+//         {
+//             view: "scrollbar", 
+//             id:"scrollHor"
+//         }
+//     ]
+// }
+// gantt.templates.task_time = function(start,end,task){
+//   console.log('startend',start,end,task);
+//   let Jstart = JSON.parse(JSON.stringify(start))
+//   let Jend = JSON.parse(JSON.stringify(end))
+//   let estartmonth = Jstart.getMonth() + 1
+//   let estartday = Jstart.getDate()
+//   let estart = Jstart.getFullYear() + '-' + (estartmonth < 10 ? '0' + estartmonth : estartmonth) + '-' + (estartday < 10 ? '0' + estartday : estartday)
+//   let tend = new Date(Jend.setDate(end.getDate() - 1))
+//   let eendmonth = tend.getMonth() + 1
+//   let eendday = tend.getDate()
+//   let eend = tend.getFullYear() + '-' + (eendmonth < 10 ? '0' + eendmonth : eendmonth) + '-' + (eendday < 10 ? '0' + eendday : eendday)
+//   return estart + ' ' + eend
+// };
     gantt.config.subscales = [
       {unit: "day", step: 1, date: "周%D,%d"}
     ];

+ 17 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/project/project_gantt.vue

@@ -212,7 +212,10 @@ export default {
                                     res.data[i].color = '#F56C6C'
                                   }
                                 }
+                                // console.log('beforeedit',res.data);
                                 this.tasks = {data:res.data};
+                                this.tasksEdit()
+                                // console.log('afteredit',this.tasks.data);
                                 this.isDataLoaded = true;
                                 // console.log("getlist",this.tasks);
                                 
@@ -244,6 +247,20 @@ export default {
                             }
                         );
           
+      },
+      tasksEdit(){
+        let etasks = JSON.parse(JSON.stringify(this.tasks.data))
+        for(let i=0;i<etasks.length;i++){
+          if(etasks[i].parent != null){
+            let edate = new Date(etasks[i].end_date)
+            edate = new Date(edate.setDate(edate.getDate() + 1))
+            let edatemonth = edate.getMonth() + 1
+            let edateday = edate.getDate()
+            edate = edate.getFullYear() + '-' + (edatemonth < 10 ? '0' + edatemonth : edatemonth) + '-' + (edateday < 10 ? '0' + edateday : edateday)
+            etasks[i].end_date = edate
+          }
+        }
+        this.tasks = {data:etasks}
       }
   },
   mounted: function () {