瀏覽代碼

新版按周填报

seyason 1 年之前
父節點
當前提交
873959b7ab

+ 13 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -266,6 +266,13 @@ public class ReportController {
         return reportService.getWeeklyReportData(targetDate, request);
     }
 
+    //新版按周填报
+    @RequestMapping("/getWeeklyFillReportData")
+    public HttpRespMsg getWeeklyFillReportData(@RequestParam String targetDate) {
+        return reportService.getWeeklyFillReportData(targetDate, request);
+    }
+
+
 
     private void fillReportProgress(Report report, String professionProgress) {
         if (!StringUtil.isEmpty(professionProgress)) {
@@ -439,6 +446,12 @@ public class ReportController {
                 extraField3[i] = null;
             }
         }
+        if (professionProgress == null) {
+            professionProgress = new String[projectId.length];
+            for(int i=0;i<professionProgress.length; i++) {
+                professionProgress[i] = null;
+            }
+        }
         if (company.getPackageProject() == 1) {
             //检查是否设置了预算的工时预警
             ProjectBasecostSetting alarmSetting = projectBasecostSettingMapper.selectOne(new QueryWrapper<ProjectBasecostSetting>()

+ 31 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskGroupController.java

@@ -20,6 +20,7 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -218,6 +219,36 @@ public class TaskGroupController {
         return msg;
     }
 
+    //针对新的按周填报,获取分组和审核人
+    @RequestMapping("/listProjectGroupAndAuditor")
+    public HttpRespMsg listProjectGroupAndAuditor(TaskGroup item) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        Integer projectId = item.getProjectId();
+        Project project = projectMapper.selectById(projectId);
+        QueryWrapper<TaskGroup> queryWrapper = new QueryWrapper<TaskGroup>();
+        queryWrapper.eq("project_id", projectId);
+        List<TaskGroup> list = taskGroupService.list(queryWrapper);
+        //处理审核人,如果就是自己,得换成项目经理
+        for (TaskGroup taskGroup : list) {
+            if (token.equals(taskGroup.getInchargerId())) {
+                taskGroup.setInchargerId(project.getInchargerId());
+            }
+        }
+        List<String> collect = list.stream().map(TaskGroup::getInchargerId).collect(Collectors.toList());
+        if (collect.size() > 0) {
+            userMapper.selectList(new QueryWrapper<User>().in("id", collect)).forEach(u->{
+                list.stream().forEach(g->{
+                    if (u.getId().equals(g.getInchargerId())) {
+                        g.setInchargerName(u.getName());
+                    }
+                });
+            });
+        }
+        msg.data = list;
+        return msg;
+    }
+
     /**
      * 获取任务分组
      * @param item

+ 3 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TaskGroup.java

@@ -57,6 +57,9 @@ public class TaskGroup extends Model<TaskGroup> {
     @TableField(exist = false)
     private boolean isNew;
 
+    @TableField(exist = false)
+    private String inchargerName;
+
     @Override
     protected Serializable pkVal() {
         return this.id;

+ 7 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2023-08-16
+ * @since 2023-10-31
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -492,6 +492,12 @@ public class TimeType extends Model<TimeType> {
     @TableField("stop_report")
     private Integer stopReport;
 
+    /**
+     * 是否启用新的按周填报模式
+     */
+    @TableField("enable_new_weeklyfill")
+    private Integer enableNewWeeklyfill;
+
 
     @Override
     protected Serializable pkVal() {

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

@@ -122,4 +122,6 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg batchApproveByDate(String startDate, String endDate, Integer departmentId, HttpServletRequest request);
 
     List getAuditWorkflowList(Integer reportId);
+
+    HttpRespMsg getWeeklyFillReportData(String targetDate, HttpServletRequest request);
 }

+ 108 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -6517,4 +6517,112 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         }
     }
 
+    @Override
+    public HttpRespMsg getWeeklyFillReportData(String targetDate, HttpServletRequest request) {
+        HttpRespMsg msg = new HttpRespMsg();
+        String userId = request.getHeader("TOKEN");
+        User user = userMapper.selectById(userId);
+        //根据targetDate获取本周的日期
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate date = LocalDate.parse(targetDate, dtf);
+        LocalDate monday = date.with(DayOfWeek.MONDAY);
+        LocalDate sunday = date.with(DayOfWeek.SUNDAY);
+        //需要填报的最后一天
+        LocalDate lastDay = sunday;
+        int days = sunday.lengthOfMonth() - sunday.getDayOfMonth();
+        if (days <= 2) {
+            //周日距离月底相差天数在2天以内,比如周日是10.29,则10.30和10.31也算在本周内
+            lastDay = sunday.plusDays(days);
+        }
+        //如果上周只有2天以内工作日,需要并到这周来
+
+        String startDate = monday.format(dtf);
+        String endDate = lastDay.format(dtf);
+        TimeType timeType = timeTypeMapper.selectById(user.getCompanyId());
+        //获取日报详情
+        List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", userId).between("create_date", startDate, endDate).orderByAsc("create_date"));
+        List<Integer> collect = reportList.stream().map(Report::getProjectId).collect(Collectors.toList());
+        //加载这段时间内已填报过的项目
+        List<Project> projectList = new ArrayList<>();
+        if (collect.size() > 0) {
+            projectList = projectMapper.selectList(new QueryWrapper<Project>().in("id", collect));
+            //获取项目的任务分组列表
+            List<TaskGroup> taskGroups = taskGroupMapper.selectList(new QueryWrapper<TaskGroup>().in("project_id", collect));
+            //获取负责人的用户集合
+            List<User> userList = userMapper.selectList(new QueryWrapper<User>().in("id", taskGroups.stream().map(TaskGroup::getInchargerId).collect(Collectors.toList())));
+            reportList.forEach(r->{
+                r.setTaskGroups(taskGroups.stream().filter(tg->tg.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
+                for (TaskGroup gp : r.getTaskGroups()) {
+                    if (!StringUtils.isEmpty(gp.getInchargerId()) ) {
+                        if (gp.getInchargerId().equals(userId)) {
+                            //自己担任任务分组的负责人,自己的审核人是项目经理
+                            gp.setInchargerId(projectMapper.selectById(r.getProjectId()).getInchargerId());
+                            //不存在的话,加上项目经理
+                            if (!userList.stream().anyMatch(u->u.getId().equals(gp.getInchargerId()))) {
+                                userList.add(userMapper.selectById(gp.getInchargerId()));
+                            }
+                        }
+                        gp.setInchargerName(userList.stream().filter(u->u.getId().equals(gp.getInchargerId())).findFirst().get().getName());
+                    }
+                }
+            });
+        }
+
+
+//        List cardTimeList = new ArrayList();
+//        if (timeType.getShowDdCardtime() == 1) {
+//            List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
+//                    .eq("user_id", userId).between("work_date", startDate, endDate));
+//            cardTimeList = dingdingTimes;
+//        } else if(timeType.getSyncFanwei()==1){
+//            List<UserFvTime> userFvTimes = userFvTimeMapper.selectList(new QueryWrapper<UserFvTime>()
+//                    .eq("user_id", userId).between("work_date", startDate, endDate));
+//            cardTimeList = userFvTimes;
+//        } else if (timeType.getShowCorpwxCardtime() == 1) {
+//            List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+//                    .eq("corpwx_userid", user.getCorpwxUserid()).between("create_date", startDate, endDate));
+//            cardTimeList = corpwxTimes;
+//        }
+
+        Map<String, List> reportMap = new HashMap<>();
+//        reportMap.put("reportList", reportList);
+//        reportMap.put("cardTimeList", cardTimeList);
+        reportMap.put("projectList", projectList);
+        //计算日期,进行返回
+        List<HashMap> dateList = new ArrayList<>();
+        LocalDate today = LocalDate.now();
+        LocalDate itemDate = monday;
+        while(true) {
+            System.out.println("itemDate=="+itemDate.toString());
+            if (WorkDayCalculateUtils.isWorkDay(itemDate)) {
+                HashMap item = new HashMap();
+                item.put("date", itemDate.format(dtf));
+                //计算显示的周几
+                item.put("weekDayTxt", DateTimeUtil.getWeekDayTxt(itemDate.getDayOfWeek().getValue()));
+                //不可提前填报
+                if (timeType.getFillAhead() == 0 && itemDate.isAfter(today)) {
+                    item.put("canFill", 0);
+                } else {
+                    item.put("canFill", 1);
+                }
+                //放入当天对应的日报
+                final LocalDate finalItemDate = itemDate;
+                List<Report> dateReportList = reportList.stream().filter(r -> r.getCreateDate().isEqual(finalItemDate)).collect(Collectors.toList());
+                item.put("reportList", dateReportList);
+                double sum = dateReportList.stream().mapToDouble(Report::getWorkingTime).sum();
+                item.put("filledTime", sum);
+                dateList.add(item);
+            }
+            //往后推一天
+            itemDate = itemDate.plusDays(1);
+            //超过最后一天了,跳出循环
+            if (itemDate.isAfter(lastDay)) {
+                break;
+            }
+        }
+        reportMap.put("dateList", dateList);
+        msg.data = reportMap;
+        return msg;
+    }
+
 }

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -120,7 +120,7 @@
     </select>
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
-        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc
+        SELECT id, project_code AS projectCode, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc,is_public as isPublic
         FROM project
         WHERE id IN (
             SELECT project_id

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ReportMapper.xml

@@ -324,7 +324,7 @@
         a.department_audit_state as departmentAuditState,a.stage, a.pic_str as picStr, multi_worktime as multiWorktime,a.is_dept_audit as isDeptAudit,a.group_audit_state as groupAuditState,task_group.incharger_id as inchargerId,a.project_audit_state as projectAuditState,a.audit_dept_managerid as deptAuditorName
         ,c.plate1 as plate1,c.plate2 as plate2,c.plate3 as plate3,c.plate4 as plate4,c.plate5 as plate5
         , reject_reason as rejectReason, reject_username as rejectUsername, reject_userid as rejectUserid, degree_id as degree_id,report_extra_degree.name as degreeName,task_group.name as groupName,a.group_id as groupId, a.custom_data as customData
-        ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName,
+        ,u.name as projectAuditorName,u.corpwx_userid as projectAuditorCorpwxUserId, a.project_auditor_id as projectAuditorId, department.department_name as departmentName,dp2.department_name as buDepartmentName,department.department_id as departmentId, a.overtime_hours as overtimeHours, a.custom_text as customText, a.project_audit_time as projectAuditTime,project_main.name as projectMainName
         ,a.extra_field1 as extraField1,a.extra_field2 as extraField2,a.extra_field3 as extraField3
         FROM report AS a
         JOIN project AS b ON a.project_id=b.id

文件差異過大導致無法顯示
+ 2 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/TimeTypeMapper.xml


+ 2 - 4
fhKeeper/formulahousekeeper/timesheet-workshop/src/views/Login.vue

@@ -8,7 +8,6 @@
                         <img v-else :src="'/upload/'+appLogo" style="width:100px;height:80px;"/>
                     </div>
                     <h3 class="title">{{ appName? appName:"生产车间工时管家" }}</h3>
-                    <!-- <p style="color:goldenrod;text-align: center;">演示版</p> -->
                     <el-form-item class="login-input" prop="username">
                         <el-input type="text" v-model="ruleForm.username" autocomplete="off" :placeholder="$t('zhang-hao-shou-ji-hao')" clearable prefix-icon="el-icon-user-solid"></el-input>
                     </el-form-item>
@@ -73,8 +72,8 @@
                 logining: false,
                 // 登录信息
                 ruleForm: {
-                    username: '屈跃庭',
-                    password: '000000'
+                    username: '',
+                    password: ''
                 },
                 rules: {
                     username: [{ required: true, message: this.$t('peaseenterthe'), trigger: 'blur' },],
@@ -118,7 +117,6 @@
         mounted() {
             this.getSettings();
             var ua = navigator.userAgent.toLowerCase();
-            console.log(ua, '打印出来')
             if (ua.indexOf("wxwork") > 0) {
                 this.isCorpWX = true;
             } 

+ 26 - 19
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -263,7 +263,10 @@
                                                     <span style="margin-left:10px;">工作职责:{{ item2.extraField2? item2.extraField2Name:''}}</span>
                                                     <span style="margin-left:10px;">工作内容:{{ item2.extraField3? item2.extraField3Name:''}}</span></p>
                                                     <!--任务分组和阶段 -->
-                                                    <p v-if="item2.groupId != 0">{{$t('other.taskGroup')}}:{{item2.groupName}} <span v-if="item2.stage != null && item2.stage != '-'" style="margin-left:10px;">{{$t('other.inputStage')}}:{{item2.stage}}</span></p>
+                                                    <p v-if="item2.groupId != 0">
+                                                        {{$t('other.taskGroup')}}:{{item2.groupName}} 
+                                                        <span v-if="item2.stage != null && item2.stage != '-' && user.companyId != yuzhongCompId" style="margin-left:10px;">{{$t('other.inputStage')}}:{{item2.stage}}</span>
+                                                    </p>
                                                     <p v-if="user.timeType.customDegreeActive==1 && item2.degree_id != null && item2.degree_id != -1">{{user.timeType.customDegreeName}}:{{item2.degreeName}}</p>
                                                     <p v-if="user.timeType.customDataActive==1">{{user.timeType.customDataName}}:{{item2.customData}}</p>
                                                     <!-- 自定义日报文本 -->
@@ -453,18 +456,17 @@
                                 </el-option-group>
                             </el-select>
                             <!--昱众不显示子项目-->
-                            <template v-if="user.timeType.mainProjectState != 1 && user.companyId != yuzhongCompId">
-                            <span style="margin-left:45px;">
+                            <template v-if="user.timeType.mainProjectState != 1 && user.companyId != yuzhongCompId && domain.subProjectList != null && domain.subProjectList.length> 0 && domain.projectId != ''">
+                                <span style="margin-left:45px;">
                                {{$t('lable.subproject')}}</span>
                                 <!--子项目 -->
                                 <el-select v-model="domain.subProjectId" :placeholder="$t('defaultText.PleaseSelectaSub-item')" style="width:200px;margin-left:10px;" clearable="true"
-                                    v-if="domain.subProjectList != null && domain.subProjectList.length> 0 && domain.projectId != ''"
                                 :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)" @change="updateSubProject">
                                     <el-option v-for="item in domain.subProjectList" :key="item.id" :label="item.name" :value="item.id"></el-option>
                                 </el-select>
                             </template>
                             <template v-if="user.companyId == yuzhongCompId">
-                                <span style="margin-left:45px;">角色选择</span>
+                                <span style="color:#FF0000;margin-left:45px;">*</span><span style="margin-left:3px;">角色选择</span>
                                 <!--角色选择 -->
                                 <el-select v-model="domain.extraField1" style="width:200px;margin-left:10px;" placeHolder="请选择"
                                 :disabled="(workForm.domains[index].state>=2?false:true)" @change="updateResponse(domain)">
@@ -493,15 +495,18 @@
                                 <el-option v-for="item in timeBasecostList" :label="item.name" :value="item.id" :key="item.id"></el-option>
                             </el-select>
                         </el-form-item>
-                        <el-form-item :label="$t('lable.taskGrouping')" v-if="user.company.packageProject == 1"
-                                          >
+                        <el-form-item v-if="user.company.packageProject == 1">
+                            <template slot="label">
+                                <span style="color:#FF0000;" v-if="user.timeType.reportAuditType == 1 ||user.timeType.reportAuditType == 2">*</span>
+                                <span >{{$t('lable.taskGrouping')}}</span>
+                            </template>
                             <!-- 任务分组 -->
                             <el-select v-model="domain.groupId" :placeholder="$t('defaultText.pleaseSelectaTaskGroup')" style="width:200px;" clearable="true" 
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)" @change="getGroupStages(domain, index)">
                                 <el-option v-for="item in domain.taskGroups" :key="item.id" :label="item.name" :value="item.id"></el-option>
                             </el-select>
                             <template v-if="user.companyId == yuzhongCompId">
-                                <span style="margin-left:45px;">工作职责</span>
+                                <span style="margin-left:45px;"><span style="color:#FF0000;">*</span>工作职责</span>
                                 <el-select v-model="domain.extraField2" style="width:200px;margin-left:10px;" placeHolder="请选择"
                                 :disabled="(workForm.domains[index].state>=2?false:true)" @change="updateJobContent(domain)">
                                     <el-option
@@ -513,19 +518,21 @@
                                 </el-select>
                             </template>
                             <template v-else><!-- 项目的阶段 -->
-                                <span v-if="domain.stages != null && domain.stages.length> 0" >{{$t('other.inputStage')}}</span>
+                                <span v-if="domain.stages != null && domain.stages.length> 0" style="margin-left:45px;">{{$t('other.inputStage')}}</span>
                                 <el-select v-model="domain.stage" :placeholder="$t('defaultText.pleaseChoose')" style="width:200px;margin-left:10px;" 
                                 clearable="true" v-if="domain.stages != null && domain.stages.length> 0"
                                 @change="changeStages(domain, index)"
                                 :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                                     <el-option v-for="item in domain.stages" :key="item.id" :label="item.stagesName" :value="item.stagesName"></el-option>
                                 </el-select>
-
                             </template>
-
                         </el-form-item>
                         <div v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && domain.auditUserList">
-                            <el-form-item :label="user.companyId==781? $t('other.reviewer') : $t('other.projectAuditor')" v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && domain.auditUserList.length > 0">
+                            <el-form-item v-if="user.timeType.reportAuditType != 3 && user.timeType.reportAuditType != 5 && domain.auditUserList.length > 0">
+                                <template slot="label">
+                                    <span style="color:#FF0000;">*</span>
+                                    <span >{{user.companyId==781? $t('other.reviewer') : $t('other.projectAuditor')}}</span>
+                                </template>
                                 
                                 <el-select v-model="domain.projectAuditorId" :disabled="!domain.canEdit" @change="$forceUpdate()" v-if="user.userNameNeedTranslate != '1'" style="width:200px;">
                                     <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id">
@@ -533,13 +540,15 @@
                                         <span style="float: left" v-if="user.userNameNeedTranslate != '1'">{{item.auditorName}}</span>
                                     </el-option>
                                 </el-select>
-
                                 <selectCat v-if="user.userNameNeedTranslate == '1'" :size="'medium'" :subject="domain.auditUserList" :idx="index" :subjectId="domain.projectAuditorId" ref="selectCat" :flg="domain.projectAuditorId ? true : false" :flgs="true" @selectCatCli="selectCatCli" :disabled="!domain.canEdit"></selectCat>
-
                             </el-form-item>
                         </div>
-                        <el-form-item label="工作内容" v-if="user.companyId == yuzhongCompId">
-                            <el-select v-model="domain.extraField3" style="width:200px;" placeHolder="请选择"
+                        <el-form-item v-if="user.companyId == yuzhongCompId">
+                            <template slot="label">
+                                <span style="color:#FF0000;">*</span>
+                                <span >工作内容</span>
+                            </template>
+                            <el-select v-model="domain.extraField3" style="width:200px;" placeHolder="请选择" @change="$forceUpdate()"
                             :disabled="(workForm.domains[index].state>=2?false:true)" >
                                 <el-option
                                     v-for="item in domain.workContentList"
@@ -2297,6 +2306,7 @@
                     var isPublic = this.fillProjectList.filter(p=>p.id == selectPid)[0].isPublic;
                     console.log('==========','isPublic=='+isPublic);
                     var filteredRespList = this.jobResponseList.filter(j=>j.timeType == (isPublic?'非项目工时':'项目工时') && j.role == (this.roleList.filter(r=>r.value==domainItem.extraField1)[0].label));
+                    console.log(filteredRespList);
                     domainItem.filteredRespList = filteredRespList;
                 }
                 
@@ -6790,7 +6800,6 @@
                             for(var p in this.workForm.domains) {
                                 var oneProItem = this.workForm.domains[p]
                                 if (!oneProItem.extraField1) {
-                                    //没有选择子项目
                                     this.$message({
                                         message: '角色必填,请检查',
                                         type: "error"
@@ -6798,7 +6807,6 @@
                                     return
                                 }
                                 if (!oneProItem.extraField2) {
-                                    //没有选择子项目
                                     this.$message({
                                         message: '工作职责必填,请检查',
                                         type: "error"
@@ -6806,7 +6814,6 @@
                                     return
                                 }
                                 if (!oneProItem.extraField3) {
-                                    //没有选择子项目
                                     this.$message({
                                         message: '工作内容必填,请检查',
                                         type: "error"

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

@@ -134,7 +134,7 @@
                                 <p v-if="item.groupId">
                                     <span>{{$t('other.taskGroup')}}:{{item.groupName}}</span>
                                     <!-- 阶段 -->
-                                    <span v-if="item.stage != null" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
+                                    <span v-if="item.stage != null && user.companyId != yuzhongCompId" style="margin-left:10px;"> {{$t('other.inputStage')}}:{{item.stage}}</span>
                                 </p>
                                 <p v-if="user.company.companyName == '成都明夷电子科技有限公司'">
                                     <span>用时占比:{{ item.progress }}%</span>