ソースを参照

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

cs 2 年 前
コミット
6ed779bf24

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ProjectController.java

@@ -625,6 +625,10 @@ public class ProjectController {
     public HttpRespMsg exportReportTimelinessRate(HttpServletRequest request,String startDate,String endDate){
         return projectService.exportReportTimelinessRate(request,startDate,endDate);
     }
+    @RequestMapping("/exportReportTimelinessRateByQuarter")
+    public HttpRespMsg exportReportTimelinessRateByQuarter(HttpServletRequest request,String year,Integer quarter){
+        return projectService.exportReportTimelinessRateByQuarter(request,year,quarter);
+    }
     @RequestMapping("/getWaitingReviewList")
     public HttpRespMsg getWaitingReviewList(HttpServletRequest request,Integer stateKey,String userId,Integer pageIndex,Integer pageSize,String startDate,String endDate,Integer departmentId){
         return projectService.getWaitingReviewList(request,stateKey,userId,pageIndex,pageSize,startDate,endDate,departmentId);

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ProjectService.java

@@ -209,4 +209,6 @@ public interface ProjectService extends IService<Project> {
 
     HttpRespMsg exportDeptPartInProjects(String startDate,String endDate, Integer departmentId, HttpServletRequest request);
 
+
+    HttpRespMsg exportReportTimelinessRateByQuarter(HttpServletRequest request, String year, Integer quarter);
 }

+ 68 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -5788,7 +5788,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
             }
             List<Map<String, Object>> mapList = listMap.get(user.getName());
             //请假的不参与及时率统计
-            System.out.println(leaveSheets);
             if(leaveSheets.size()>0){
                 for (LeaveSheet leaveSheet : leaveSheets) {
                     List<LocalDateTime> leaveDateList = getDays(leaveSheet.getStartDate().atTime(LocalTime.MIN), leaveSheet.getEndDate().atTime(LocalTime.MIN));
@@ -5833,8 +5832,8 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 }
 
             }
+            int num=0;
             if(mapList!=null){
-                int num=0;
                 for (Map<String, Object> map : mapList) {
                     Map<String,Object> objectMap=new HashMap<>();
                     Object date = map.get("createDate");
@@ -5867,8 +5866,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                     }
                     dataList.add(objectMap);
                 }
-                System.out.println(days);
-                System.out.println(num);
                 BigDecimal bigDecimal=new BigDecimal(num);
                 BigDecimal divide;
                 if(days!=0){
@@ -5888,7 +5885,6 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 String number = dft.format(divide);
                 timelinessRateVO.setTimelinessRate(String.valueOf(number));
             }else {
-                int num=0;
                 BigDecimal bigDecimal=new BigDecimal(num);
                 BigDecimal divide;
                 if(days!=0){
@@ -7613,4 +7609,71 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    @Override
+    public HttpRespMsg exportReportTimelinessRateByQuarter(HttpServletRequest request, String year, Integer quarter) {
+        HttpRespMsg httpRespMsg=new HttpRespMsg();
+        DateTimeFormatter df=DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", companyId));
+        String startDate=null;
+        String endDate=null;
+        LocalDate date1;
+        LocalDate date2;
+        switch (quarter){
+            case 1:
+                date1 = LocalDate.parse(year + "-01-01", df).minusWeeks(1);
+                startDate=date1.format(df);
+                date2 = LocalDate.parse(year + "-03-31", df).minusWeeks(1);
+                endDate=date2.format(df);
+                break;
+            case 2:
+                date1 = LocalDate.parse(year + "-04-01", df).minusWeeks(1);
+                startDate=date1.format(df);
+                date2 = LocalDate.parse(year + "-06-30", df).minusWeeks(1);
+                endDate=date2.format(df);
+                break;
+            case 3:
+                date1 = LocalDate.parse(year + "-07-01", df).minusWeeks(1);
+                startDate=date1.format(df);
+                date2 = LocalDate.parse(year + "-09-30", df).minusWeeks(1);
+                endDate=date2.format(df);
+                break;
+            case 4:
+                date1 = LocalDate.parse(year + "-10-01", df).minusWeeks(1);
+                startDate=date1.format(df);
+                date2 = LocalDate.parse(year + "-12-31", df).minusWeeks(1);
+                endDate=date2.format(df);
+                break;
+        }
+        HttpRespMsg msg = getUserReportTimelinessRate(request, startDate, endDate, null, null, null, null);
+        HashMap map= (HashMap) msg.data;
+        List<TimelinessRateVO> list = (List<TimelinessRateVO>) map.get("list");
+        //String[] s={"人员","工号","部门","填报及时率"};
+        String[] s={MessageUtils.message("entry.personnel"),MessageUtils.message("entry.No"),MessageUtils.message("excel.department"),MessageUtils.message("excel.timeFill")};
+        List<String> titleString = Arrays.asList(s);
+        List<List<String>> dataList=new ArrayList<>();
+        dataList.add(titleString);
+        for (TimelinessRateVO timelinessRateVO : list) {
+            List<String> item=new ArrayList<>();
+            if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
+                item.add(timelinessRateVO.getCorpwxUserId()==null?"":timelinessRateVO.getCorpwxUserId());
+            }else {
+                item.add(timelinessRateVO.getUserName());
+            }
+            item.add(timelinessRateVO.getJobNumber());
+            item.add(timelinessRateVO.getDepartmentName());
+            item.add(timelinessRateVO.getTimelinessRate());
+            dataList.add(item);
+        }
+        //生成excel文件导出
+        //String fileName = year+"人员填报及时率统计_"+System.currentTimeMillis();
+        String fileName = year+"_"+quarter+MessageUtils.message("fileName.quarter")+MessageUtils.message("fileName.timePerFill")+System.currentTimeMillis();
+        try {
+            return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,fileName , dataList, path);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return httpRespMsg;
+    }
+
 }

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages.properties

@@ -515,6 +515,7 @@ fileName.hourCostAlert=工时成本预警表_
 fileName.proClassLaborCost=项目分类工时成本统计_
 fileName.perHoursAllSta=人员工时分配统计_
 fileName.timePerFill=人员填报及时率统计_
+fileName.quarter=季度_
 fileName.perReviewed=人员待审核统计_
 fileName.perHoursSta=人员工时统计_
 fileName.taskGroupHours=任务分组工时统计

+ 1 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/resources/i18n/messages_en_US.properties

@@ -515,6 +515,7 @@ fileName.hourCostAlert=Hour Cost Alert_
 fileName.proClassLaborCost=Project Classification Labor Cost Statistics_
 fileName.perHoursAllSta=Personnel Hours Allocation Statistics_
 fileName.timePerFill=Statistics of timeliness rate of personnel filling_
+fileName.quarter=Quarter_
 fileName.perReviewed=Statistics of personnel to be approved_
 fileName.perHoursSta=Personnel Hours Statistics_
 fileName.taskGroupHours=Task Grouping Work Statistics

+ 67 - 3
fhKeeper/formulahousekeeper/timesheet/src/views/corpreport/list.vue

@@ -54,7 +54,7 @@
   <div class="contents" v-if="allWrong">
     <div class="headine headConCon" ref="headine" :style="'width:'+(windowWidth - 400)+'px'">
       <h3 ref="headHe" style="padding-left: 10px;float:left;width:15%">{{shuz[ins]}}</h3>
-      <div class="headScreen" style="width:70%">
+      <div class="headScreen" :style="ins == 9 ? 'width:60%' : 'width:70%'">
       <!-- 客户项目利润表的筛选 -->
         <template v-if="ins == 4">
           <el-select v-model="customerId" :placeholder="$t('pleaseelectcustomers')" clearable filterable size="small" @change="selcts(4)" style="margin-right:20px">
@@ -132,7 +132,11 @@
             <el-option v-for="item in firstStages" :key="item" :label="item" :value="item"></el-option>
           </el-select>
       </div>
-      <p style="float: right;margin-right: 25px;width:10%" ><el-button type="primary" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button></p>
+      <p :style="ins == 9 ? 'float: right;margin-right: 25px;width:20%' : 'float: right;margin-right: 25px;width:10%'" >
+        <el-button type="primary" @click="exportExcel" size="mini">{{ $t('reporderived') }}</el-button>
+        <el-button type="primary" @click="exportExcelByQuarter" size="mini" v-if="ins == 9">按季度导出</el-button>
+      </p>
+      
     </div>
     <div ref="staff" style="margin: 5px 0px 0px 10px; width: 98%">
         <div class="staff" ref="tabless" :style="'width:'+(windowWidth - 430)+'px'">
@@ -905,6 +909,32 @@
             <el-table-column prop="detail" :label="$t('fillincase')"></el-table-column>
           </el-table>
         </el-dialog>
+
+        <el-dialog title="按季度导出" :visible.sync="byQuarterDialog" width="500px">
+          <el-form>
+            <el-form-item label="选择年份">
+              <el-date-picker
+                v-model="quarterParameter.year"
+                type="year"
+                value-format="yyyy"
+                :clearable="false"
+                style="width:200px"
+                placeholder="选择年">
+              </el-date-picker>
+            </el-form-item>
+            <el-form-item label="选择季度">
+              <el-select v-model="quarterParameter.quarter" style="width:200px">
+                <el-option label="第一季度" :value="1"></el-option>
+                <el-option label="第二季度" :value="2"></el-option>
+                <el-option label="第三季度" :value="3"></el-option>
+                <el-option label="第四季度" :value="4"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-form>
+          <div slot="footer" class="dialog-footer" style="text-align: center;">
+            <el-button @click.native="quarterExport" type="primary">导出</el-button>
+          </div>
+        </el-dialog>
   </section>
 </template>
 
@@ -1024,7 +1054,12 @@ export default {
       monthlyPersonnelList: [],
       monthPersonnel: '',
 
-      tableList: []
+      tableList: [],
+      byQuarterDialog: false,
+      quarterParameter: {
+        year: '2022',
+        quarter: 1
+      }
     };
   },
   computed: {},
@@ -1461,6 +1496,35 @@ export default {
                 });
             });
       },
+      exportExcelByQuarter(){
+        this.byQuarterDialog = true
+      },
+      quarterExport(){
+        this.http.post('/project/exportReportTimelinessRateByQuarter', this.quarterParameter,
+            res => {
+                if (res.code == "ok") {
+                    var filePath = res.data;
+                    var fName = this.$t('personnelfillingtimelyratestatistics') + '(' + this.quarterParameter.year + '第' + this.quarterParameter.quarter  + '季度).xls'
+                    const a = document.createElement('a'); // 创建a标签
+                    a.setAttribute('download', fName);// download属性
+                    a.setAttribute('href', filePath);// href链接
+                    a.click(); //自执行点击事件
+                    a.remove();
+                    this.byQuarterDialog  = false
+                } else {
+                    this.$message({
+                    message: res.msg,
+                    type: "error"
+                    });
+                }
+            },
+            error => {
+                this.$message({
+                    message: error,
+                    type: "error"
+                });
+            });
+      },
     ssl(index) {
       this.z = index
       this.ins = index;

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

@@ -401,7 +401,7 @@
 
         <!--新增界面-->
         <el-dialog :title="title" v-if="addFormVisible" :visible.sync="addFormVisible" :close-on-click-modal="false" customClass="customWidth" width="960px" :top="'6vh'">
-            <div style="height: 72vh;overflow: auto;">
+            <div style="height: 72vh;overflow-y: auto;overflow-x: hidden;">
                 <el-form ref="form1" :model="addForm" :rules="rules" label-width="120px">
                     <el-form-item :label="$t('Itemno')" :class="title == $t('newproject') && user.companyId == 936 ? 'wpgCssClass' : ''">
                         <!-- <el-input v-model="addForm.code" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目编号" clearable></el-input> -->

+ 10 - 6
fhKeeper/formulahousekeeper/timesheet_h5/public/index.html

@@ -17,17 +17,21 @@
     <!-- 引入企业微信js -->
     <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js" referrerpolicy="origin"></script>
     <script src="https://open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js" referrerpolicy="origin"></script>
-    <script>
-        window.onerror = function(err) {
-            return true
+    <script language="javascript"> 
+        function killerrors() {
+            return true;
         }
-    </script>
-    <meta name="wpk-bid" content="dta_2_71020"> <script>var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);var isProductEnv = window &&window.location &&window.location.host 
+        window.onerror = killerrors;
+      </script>
+    <meta name="wpk-bid" content="dta_2_71020">
+        <script>
+        var isDingtalk = navigator && /DingTalk/.test(navigator.userAgent);var isProductEnv = window &&window.location &&window.location.host 
         && window.location.host.indexOf('//127.0.0.1')===-1
         && window.location.host.indexOf('//localhost')===-1
         && window.location.host.indexOf('//192.168.')===-1
         // 如果有其它测试域名,请一起排掉,减少测试环境对生产环境监控的干扰
-    if (isProductEnv) {    !(function(c,i,e,b){var h=i.createElement("script");var f=i.getElementsByTagName("script")[0];h.type="text/javascript";h.crossorigin=true;h.onload=function(){c[b]||(c[b]=new c.wpkReporter({bid:"dta_2_71020"}));c[b].installAll()};f.parentNode.insertBefore(h,f);h.src=e})(window,document,"https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js","__wpk"); }</script>
+        if (isProductEnv) {    !(function(c,i,e,b){var h=i.createElement("script");var f=i.getElementsByTagName("script")[0];h.type="text/javascript";h.crossorigin=true;h.onload=function(){c[b]||(c[b]=new c.wpkReporter({bid:"dta_2_71020"}));c[b].installAll()};f.parentNode.insertBefore(h,f);h.src=e})(window,document,"https://g.alicdn.com/woodpeckerx/jssdk??wpkReporter.js","__wpk"); }
+    </script>
 
     <script>
         function IsPC() { 

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/project/projectInside.vue

@@ -231,7 +231,7 @@ export default {
         return {
             user: JSON.parse(localStorage.userInfo),
             projectId: JSON.parse(sessionStorage.projectId),
-            projectDetail: null,
+            projectDetail: {},
             
             active: 0,
             inside:{    // 任务看板