Pārlūkot izejas kodu

钉钉和日报

seyason 3 gadi atpakaļ
vecāks
revīzija
510690e926

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -287,4 +287,13 @@ public class DingDingController {
         dingDingService.syncUserWorkData(companyId, workDate);
         return new HttpRespMsg();
     }
+
+    @RequestMapping("/testWaitingApply")
+    public HttpRespMsg testWaitingApply(Integer companyId) {
+        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+
+        companyDingdingService.sendReportWaitingApplyMsg(companyId, companyDingding.getAgentId(),
+                4L, "040534176023851922");
+        return new HttpRespMsg();
+    }
 }

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

@@ -3,6 +3,9 @@ package com.management.platform.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
+import com.management.platform.mapper.GroupParticipatorMapper;
+import com.management.platform.mapper.ProjectMapper;
+import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.*;
 import com.management.platform.util.HttpRespMsg;
 import org.springframework.util.StringUtils;
@@ -13,7 +16,9 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -37,6 +42,12 @@ public class TaskGroupController {
     private StagesService stagesService;
     @Resource
     private GroupTmpstagesService groupTmpstagesService;
+    @Resource
+    private GroupParticipatorMapper groupParticipatorMapper;
+    @Resource
+    private ProjectMapper projectMapper;
+    @Resource
+    private UserMapper userMapper;
     /**
      * 保存任务分组
      */
@@ -103,6 +114,49 @@ public class TaskGroupController {
         return msg;
     }
 
+    /**
+     * 获取任务分组
+     * @param item
+     * @return
+     */
+    @RequestMapping("/listMyJoinGroup")
+    public HttpRespMsg listMyJoinGroup(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);
+        if (project.getTaskGpIncharge() == 0) {
+            msg.data = taskGroupService.list(queryWrapper);
+        } else {
+            List<GroupParticipator> groupParticipatorList = groupParticipatorMapper.selectList(new QueryWrapper<GroupParticipator>().eq("user_id", token));
+            if (groupParticipatorList.size() > 0) {
+                List<Integer> groupIds = groupParticipatorList.stream().map(GroupParticipator::getGroupId).collect(Collectors.toList());
+                List<TaskGroup> list = taskGroupService.list(new QueryWrapper<TaskGroup>().in("id", groupIds).eq("project_id", item.getProjectId()));
+                msg.data = list;
+            } else {
+                msg.data = new ArrayList<>();
+            }
+        }
+
+        return msg;
+    }
+
+    @RequestMapping("/getGroupIncharger")
+    public HttpRespMsg getGroupIncharger(Integer groupId) {
+        TaskGroup group = taskGroupService.getById(groupId);
+        User user = userMapper.selectById(group.getInchargerId());
+        HashMap map = new HashMap();
+        map.put("auditorId", user.getId());
+        map.put("auditorName", user.getName());
+        List list = new ArrayList();
+        list.add(map);
+        HttpRespMsg msg = new HttpRespMsg();
+        msg.data = list;
+        return msg;
+    }
+
 
     @RequestMapping("/copy")
     public HttpRespMsg copy(Integer id) {

+ 4 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/mapper/ReportMapper.java

@@ -103,4 +103,8 @@ public interface ReportMapper extends BaseMapper<Report> {
     List<Map> getSameDayPassReport(Integer companyId, @Param("dateReportList") List<Report> dateReportList);
 
     double getMyOvertime(String userId);
+
+    List<Map<String, Object>> getWaitingApproveCnt(Integer companyId);
+
+
 }

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

@@ -19,4 +19,6 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
     public void sendRejectReportMsg(Integer companyId, String date, String projectNames, String reason, String auditorName, String useridList);
 
     public void sendLeaveApplyAlertMsg(Integer companyId, Long agentId, String msg, String useridList);
+
+    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
 }

+ 26 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -43,6 +43,9 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
     public static final String TEMPLATE_REJECT_REPORT = "62a3cb7230734fe0824f776f5cee5a7a";
     //请假申请提交提醒到审核人
     public static final String TEMPLATE_LEAVE_APPLY = "8e2f89e03f1a43b58b3e83dc7c9ac5ba";
+    //日报待审批的数量通知
+    public static final String TEMPLATE_REPORT_WAITING_APPLY = "d871e80191d14ec8aeec3986aca3ce46";
+
 
 
     @Resource
@@ -121,6 +124,29 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         System.out.println(rsp.getBody());
     }
 
+    @Override
+    public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList) {
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
+        OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
+        System.out.println("发送 待审批日报数量 =="+auditNum+", agentId="+agentId);
+        CompanyDingding dingding = getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+        req.setAgentId(agentId);
+        req.setUseridList(useridList);
+        req.setTemplateId(TEMPLATE_REPORT_WAITING_APPLY);
+        JSONObject json = new JSONObject();
+        json.put("auditNum", ""+auditNum);
+        req.setData(json.toJSONString());
+        OapiMessageCorpconversationSendbytemplateResponse rsp = null;
+        try {
+            rsp = client.execute(req, getCorpAccessToken(dingding));
+        } catch (ApiException e) {
+            e.printStackTrace();
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+        System.out.println(rsp.getBody());
+    }
+
     private String getDDSuiteAccessToken() throws ApiException {
         if (DingDingServiceImpl.SUITE_ACCESS_TOKEN == null || DingDingServiceImpl.suiteTokenExpireTime < System.currentTimeMillis()) {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_suite_token");

+ 19 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -52,6 +52,8 @@ public class TimingTask {
     @Autowired
     private RedisUtil redisUtil;
 
+    @Resource
+    private CompanyMapper companyMapper;
     @Resource
     private ScreenshotMapper screenshotMapper;
     @Resource
@@ -116,6 +118,23 @@ public class TimingTask {
         }
     }
 
+    //每天9点10分提醒去审核
+    @Scheduled(cron = "0 30 9 ? * *")
+    private void alertWaitingApprove() {
+        if (isDev) return;
+        List<CompanyDingding> list = companyDingdingService.list(new QueryWrapper<CompanyDingding>());
+        for (CompanyDingding companyDingding : list) {
+            List<Map<String, Object>> result = reportMapper.getWaitingApproveCnt(companyDingding.getCompanyId());
+            for (Map<String, Object> map : result) {
+                if (companyDingding.getCompanyId() == 434) {
+                    companyDingdingService.sendReportWaitingApplyMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(),
+                            (Long)map.get("num"), (String)map.get("auditorDDId"));
+                }
+            }
+        }
+    }
+
+
     //每周日晚上11点 同步一次本月的考勤打卡记录
     @Scheduled(cron = "0 0 23 ? * 7")
     private void weeklySyncCorpWXCardTime() {

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

@@ -532,4 +532,11 @@
     <select id="getMyOvertime"  resultType="java.lang.Double">
         select IFNULL(sum(overtime_hours),0) from report where creator_id=#{userId}
     </select>
+    <select id="getWaitingApproveCnt" resultType="java.util.HashMap">
+        select count(1) as num, user.dingding_userid as auditorDDId from report
+         left join user on user.id = project_auditor_id
+         where state = 0 and project_audit_state = 0 and is_dept_audit = 0
+        and report.company_id = #{companyId}
+        group by project_auditor_id
+    </select>
 </mapper>

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

@@ -232,7 +232,15 @@
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
                 </el-form-item>
-                <el-form-item label="日报审核人" >
+                <!--非建筑工程专业版设置 -->
+                <el-form-item label="日报审核权限" v-if="user.company.packageProject==1 && user.company.packageEngineering == 0">
+                    <el-radio-group v-model="addForm.taskGpIncharge" >
+                        <el-radio :label="0">由项目设置的审核人审核</el-radio>
+                        <el-radio :label="1">由各任务分组负责人审核</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+                
+                <el-form-item label="日报审核人" v-show="addForm.taskGpIncharge==0">
                     <el-select v-model="addForm.auditUserIds" multiple="true" :disabled=" !(permissions.projectManagement|| user.id == addForm.inchargerId || user.id == addForm.creatorId)" filterable placeholder="默认为项目负责人" style="width:100%;" >
                         <el-option v-for="item in participator" :key="item.id" :label="item.name" :value="item.id"></el-option>
                     </el-select>
@@ -265,13 +273,6 @@
                      placeholder="选择日期"></el-date-picker>
                 </el-form-item>
 
-                <!--非建筑工程专业版设置 -->
-                <!-- <el-form-item label="日报审核权限" v-if="user.company.packageProject==1 && user.company.packageEngineering == 0">
-                    <el-radio-group v-model="addForm.taskGpIncharge" >
-                        <el-radio :label="0">由项目负责人审核</el-radio>
-                        <el-radio :label="1">由各任务分组负责人审核</el-radio>
-                    </el-radio-group>
-                </el-form-item> -->
                 
                 <!-- 项目基线 -->
                 <div style="margin: 10px 0 30px 0;min-height:200px;" v-if="user.company.packageProject == 1">

+ 52 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -333,12 +333,11 @@
                             :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                             <i class="fa fa-trash" style="color: red;;font-size:18px;"></i>
                         </el-link>
-
                         <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
-                            :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
+                            :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制{{domain.timeType}}</el-link>
                     </el-form-item>
-                    
-                    <el-form-item label="项目审核人" >
+
+                    <el-form-item label="项目审核人">
                         <el-select v-model="domain.projectAuditorId" :disabled="!canEdit" @change="$forceUpdate()">
                             <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id"></el-option>
                         </el-select>
@@ -1425,7 +1424,7 @@
             //获取项目下的任务分组
             getTaskGroups(domain, index) {
                 this.workForm.domains[index].groupId=null;
-                this.http.post('/task-group/list',{ 
+                this.http.post('/task-group/listMyJoinGroup',{ 
                     projectId: domain.projectId
                 },
                 res => {
@@ -2367,7 +2366,13 @@
                 //获取项目下的任务分组
                 this.getTaskGroups(domain, index);
                 //获取项目审核人
-                this.getProjectAuditorList(domain, index);
+                var curProject = this.projectList.filter(p=>p.id == domain.projectId)[0];
+                if (curProject.taskGpIncharge == 0) {
+                    this.getProjectAuditorList(domain, index);
+                } 
+                // // this.$set(this.workForm.domains[index], "taskGpIncharge", curProject.taskGpIncharge);
+                // this.workForm.domains[index].taskGpIncharge = curProject.taskGpIncharge;
+                // this.$forceUpdate();
             },
 
             //获取项目审核人
@@ -2449,8 +2454,32 @@
                             type: "error"
                         });
                     });
+                //检查当前的项目是否需要获取分组的负责人
+                var curProject = this.projectList.filter(p=>p.id == domain.projectId)[0];
+                if (curProject.taskGpIncharge == 1) {
+                    this.http.post("/task-group/getGroupIncharger", {groupId: domain.groupId},
+                        res => {
+                            if (res.code == "ok") {
+                                this.workForm.domains[index].getProjectAuditorList = res.data;
+                                domain.auditUserList = res.data;
+                                if (res.data.length==1) {
+                                    domain.projectAuditorId = domain.auditUserList[0].auditorId;
+                                    domain.projectAuditorName = domain.auditUserList[0].auditorName;
+                                }
+                                this.$forceUpdate();
+                            }
+                        },
+                        error => {
+                            this.$message({
+                                message: error,
+                                type: "error"
+                            });
+                        });
+                }
             },
 
+
+
             getProjectProfessions(domain, index) {
                 this.http.post("/project-profession/getMyProfession", {projectId: domain.projectId},
                     res => {
@@ -3268,7 +3297,6 @@
                                     this.canEdit = true;
                                 }
                             }
-                            alert(list.time);
                             this.workForm = {
                                 createDate: this.workForm.createDate,
                                 domains: arr,
@@ -3289,11 +3317,13 @@
                                     timeType:0,
                                     multiWorktime: this.reportTimeType.multiWorktime,
                                     worktimeList:[{}],
+                                    taskGpIncharge:1,
                                 }],
                                 userId:null,
                                 userNames:null,
                                 time: this.report.time
                             }
+                            
                             this.canEdit = true;
                         }
                     } else {
@@ -4213,6 +4243,21 @@
                         this.listLoading = true;
                         let formData = new FormData();
                         formData.append("draft", this.isDraft);
+
+                        //检查workingTime合计
+                        if (this.reportTimeType.type == 1 && this.user.timeType.syncDingding==1) {
+                            var totalTime = 0;
+                            for (var t=0;t<this.workForm.domains.length; t++) {
+                                totalTime += this.workForm.domains[t].workingTime;
+                            }
+                            if (totalTime > this.workForm.time.workHours) {
+                                this.$message({
+                                        message: "填报工时之和不能超过考勤总工时("+this.workForm.time.workHours+"h)",
+                                        type: "error"
+                                    });
+                                return;
+                            }
+                        }
                         
                         for(var i in this.workForm.domains) {
                             if(this.workForm.domains[i].degreeId) {