瀏覽代碼

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

zhouyy 2 月之前
父節點
當前提交
8efcc95ca2

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

@@ -1606,5 +1606,10 @@ public class ProjectController {
     public HttpRespMsg batchSetProjectTaskExecutor(@RequestParam String projectIds,@RequestParam String userIds){
         return projectService.batchSetProjectTaskExecutor(projectIds,userIds);
     }
+
+    @RequestMapping("/transferProjectReviwer")
+    public HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId){
+        return projectService.transferProjectReviwer(userId,targetAuditorId);
+    }
 }
 

+ 29 - 38
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -477,7 +477,6 @@ public class ReportController {
                 customData[i] = 0.0;
             }
         }
-        System.out.println("projectAuditorId:"+(projectAuditorId == null?"为Null":"Length="+projectAuditorId.length));
         if (projectAuditorId == null || projectAuditorId.length == 0) {
             projectAuditorId = new String[projectId.length];
             for(int i=0;i<projectAuditorId.length; i++) {
@@ -1193,38 +1192,7 @@ public class ReportController {
                                 //并非并行审核模式下的代填,需要设置审核状态
                                 report.setState(0);
                                 setReportWorkflowAuditor(auditWorkflowList, allDeptList, report,comTimeType);
-//                                if (auditWorkflowList.size() == 0) {
-//                                    //没有自定义审核流,直接代填的,还是走正常的审核流程
-//                                    report.setIsDeptAudit(0);
-//                                    report.setIsFinalAudit(1);
-//                                    report.setState(0);
-//                                } else {
-//                                    System.out.println("代填的情况下,有自定义审核流程");
-
-//                                    int projectLeaderNodeIndex = 0;
-//                                    for (int t=0;t<auditWorkflowList.size(); t++) {
-//                                        if (auditWorkflowList.get(t).getIsDeptAudit() == 0) {
-//                                            projectLeaderNodeIndex = t;
-//                                            break;
-//                                        }
-//                                    }
-//                                    if (projectLeaderNodeIndex == auditWorkflowList.size() -1) {
-//                                        //最后一个节点就是项目经理,那就不用审核了,直接通过
-//                                        report.setState(1);
-//                                    } else {
-//                                        //否则取下一个节点,待审核
-//                                        report.setState(0);
-//                                        int nextIndex = projectLeaderNodeIndex + 1;
-//                                        AuditWorkflowTimeSetting nextNode = auditWorkflowList.get(nextIndex);
-//                                        report.setIsFinalAudit((nextIndex == auditWorkflowList.size()-1)?1:0);
-//                                        report.setIsDeptAudit(nextNode.getIsDeptAudit());
-//                                        report.setAuditDeptid(nextNode.getAuditDeptId());
-//                                        report.setAuditDeptManagerid(nextNode.getAuditDeptId() != null?allDeptList.stream().filter(d->d.getDepartmentId().equals(nextNode.getAuditDeptId())).findFirst().get().getManagerId(): null);
-//                                    }
-//                                }
                             }
-
-
                             if (taskId != null && taskId[i] != null && taskId[i] != 0) {
                                 report.setTaskId(taskId[i]);
                             }
@@ -1607,11 +1575,18 @@ public class ReportController {
             for (User creator : creatorList) {
                 if (!StringUtils.isEmpty(creator.getSuperiorId())) {
                     User superior = userMapper.selectById(creator.getSuperiorId());
+                    //校验直属日报审核人是否已经离职
+                    if (superior.getIsActive() == 0) {
+                        HttpRespMsg msg = new HttpRespMsg();
+                        msg.setError("直属日报审核人已离职,请联系管理员重新设置后再提交");
+                        return msg;
+                    }
                     if (!tempAuditorUserList.stream().anyMatch(item -> item.getId().equals(superior.getId()))) {
                         tempAuditorUserList.add(superior);
                     }
                 }
             }
+
             for (Report report : reportList) {
                 report.setDepartmentAuditState(0);
                 //优先按照当前日报填写人的直属审核人审核
@@ -1631,6 +1606,14 @@ public class ReportController {
                             HttpRespMsg httpRespMsg=new HttpRespMsg();
                             httpRespMsg.setError("当前所在部门["+first.get().getDepartmentName()+"]不存在负责人,请联系管理员设置");
                             return httpRespMsg;
+                        } else {
+                            //检查部门负责人是否已经离职
+                            User deptAuditor = userMapper.selectById(first.get().getManagerId());
+                            if (deptAuditor.getIsActive() == 0) {
+                                HttpRespMsg msg = new HttpRespMsg();
+                                msg.setError("部门负责人已离职,请联系管理员重新设置后再提交");
+                                return msg;
+                            }
                         }
                         report.setAuditDeptid(first.get().getDepartmentId());
                         report.setProjectAuditorId(null);
@@ -1938,8 +1921,8 @@ public class ReportController {
             }
         }
         HttpRespMsg httpRespMsg = reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId(), summary, weeklyAttachment);
-        //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用
-        if (company.getId() == 862 || company.getId() == 10 || company.getId() == 3344 || company.getId() == 936) {
+        //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用;以及设置了自动审核通过的公司
+        if (company.getId() == 862 || company.getId() == 3344 || company.getId() == 936 || comTimeType.getAutoProjectApprove()) {
             //项目审核人是提交人的情况,直接审核
             List<String> reportIds = new ArrayList<>();
             for (int i = 0; i<id.length; i++) {
@@ -2971,7 +2954,7 @@ public class ReportController {
     }
 
     @RequestMapping("/denyByCheckId")
-    public HttpRespMsg denyByCheckId(String userId){
+    public HttpRespMsg denyByCheckId(String userId, @RequestParam(required = false,defaultValue = "true") Boolean isPermanent, HttpServletRequest request){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
@@ -2981,6 +2964,7 @@ public class ReportController {
         List<Report> reportList = reportMapper.selectList(queryWrapper);
         reportList.forEach(r->{
             r.setState(2);
+            r.setRejectReason("审核人已离职,请重新提交日报");
         });
         if(!reportService.updateBatchById(reportList)){
             msg.setError("验证失败");
@@ -2989,12 +2973,16 @@ public class ReportController {
         User user = userMapper.selectById(userId);
         user.setIsActive(0);
         userMapper.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            //永久移除,需要删除
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
+
         return msg;
     }
 
     @RequestMapping("/transferReportAuditor")
-    public HttpRespMsg transferReportAuditor(String userId, String targetAuditorId){
+    public HttpRespMsg transferReportAuditor(String userId, String targetAuditorId,@RequestParam(required = false,defaultValue = "true") Boolean isPermanent){
         HttpRespMsg msg=new HttpRespMsg();
         Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
         LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
@@ -3016,7 +3004,10 @@ public class ReportController {
         User user = userMapper.selectById(userId);
         user.setIsActive(0);
         userMapper.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            //永久移除,需要删除
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
         return msg;
     }
 

+ 27 - 12
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserController.java

@@ -111,11 +111,13 @@ public class UserController {
 
     @Resource
     private ParticipationMapper participationMapper;
-
+    @Resource
+    private ProjectMapper projectMapper;
     public static HashMap<String, Integer> corpddJobCenter = new HashMap();
     //用于控制线程锁
     public static HashMap<String, CorpwxJobResult> corpwxJobCenter = new HashMap();
 
+
     /**
      * 登录网页端
      * username 用户名
@@ -748,24 +750,37 @@ public class UserController {
     public HttpRespMsg changeSysManager(String toUserId, Integer myRoleId) {return userService.changeSysManager(toUserId, myRoleId, request); }
 
     @RequestMapping("/deactiveUser")
-    public HttpRespMsg deactiveUser(User user) {
+    public HttpRespMsg deactiveUser(User user, @RequestParam(required = false, defaultValue = "true") Boolean isPermanent) {
         HttpRespMsg msg = new HttpRespMsg();
         Integer companyId = userService.getById(request.getHeader("token")).getCompanyId();
-        //针对美莱德,飞锐特,湾创在对人员进行停用操作时,需要检查待他审核的日报
-        if(companyId==876||companyId==877||companyId==878 || companyId==10){
-            LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(Report::getState,0);
-            queryWrapper.eq(Report::getCompanyId,companyId);
-            queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
-            Integer count = reportMapper.selectCount(queryWrapper);
-            if(count>0){
-                msg.setError("当前员工有待审核日报,请确认处理方式?");
+        TimeType timeType = timeTypeMapper.selectById(companyId);
+        if (isPermanent && timeType.getReportAuditType() == 8) {
+            //项目经理先审核,复核人后审核,校验复核人
+            LambdaQueryWrapper<Project> projectLambdaQueryWrapper = new LambdaQueryWrapper<Project>();
+            projectLambdaQueryWrapper.eq(Project::getReviwerId, user.getId());
+            int cnt = projectMapper.selectCount(projectLambdaQueryWrapper);
+            if (cnt > 0) {
+                msg.setCode("project");
+                msg.setMsg("当前用户担任项目复核人,需要转移给其他人才能停用");
                 return msg;
             }
         }
+
+        //需要检查待他审核的日报
+        LambdaQueryWrapper<Report> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Report::getState,0);
+        queryWrapper.eq(Report::getCompanyId,companyId);
+        queryWrapper.and(wrapper->wrapper.and(wr->wr.eq(Report::getAuditDeptManagerid,user.getId()).eq(Report::getIsDeptAudit,1)).or(wr1->wr1.eq(Report::getProjectAuditorId,user.getId()).eq(Report::getIsDeptAudit,0)));
+        Integer count = reportMapper.selectCount(queryWrapper);
+        if(count>0){
+            msg.setError("当前员工有担任审核人的日报,请确认处理方式?");
+            return msg;
+        }
         user.setIsActive(0);
         userService.updateById(user);
-        participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        if (isPermanent) {
+            participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
+        }
         return msg;
     }
 

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

@@ -1,23 +1,23 @@
 package com.management.platform.entity;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
+import java.math.BigDecimal;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.List;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.List;
-
 /**
  * <p>
  * 
  * </p>
  *
  * @author Seyason
- * @since 2025-01-04
+ * @since 2025-03-11
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -644,6 +644,11 @@ public class TimeType extends Model<TimeType> {
     @TableField("report_charge_msg")
     private Integer reportChargeMsg;
 
+    /**
+     * 项目审核人是自己时自动审核通过
+     */
+    @TableField("auto_project_approve")
+    private Boolean autoProjectApprove;
 
     @TableField(exist = false)
     private List<User> userList;
@@ -652,6 +657,7 @@ public class TimeType extends Model<TimeType> {
     @TableField(exist = false)
     private Integer saasSyncContact;
 
+
     @Override
     protected Serializable pkVal() {
         return this.companyId;

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

@@ -321,4 +321,6 @@ public interface ProjectService extends IService<Project> {
     HttpRespMsg getProjectTaskPlanAndRealCost(Integer pageIndex, Integer pageSize, Integer projectId,  HttpServletRequest request, Integer taskType);
 
     HttpRespMsg exportProjectTaskPlanAndRealCost(Integer projectId, HttpServletRequest request, Integer taskType);
+
+    HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId);
 }

+ 10 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -1224,6 +1224,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg transferProjectReviwer(String userId, String targetAuditorId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        Project p = new Project();
+        p.setReviwerId(targetAuditorId);
+        projectMapper.update(p, new QueryWrapper<Project>().eq("reviwer_id", userId));
+        return msg;
+    }
+
     public HttpRespMsg getProjectEstimatedWork(Integer pageIndex, Integer pageSize, Integer projectId, HttpServletRequest request) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
         //通过公司id获取该公司所有的项目列表
@@ -13692,6 +13701,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         return msg;
     }
 
+    //依斯倍SAP项目同步
     @Override
     public HttpRespMsg syncProjectWithSap(String startDate,String endDate,String projectCodes) {
         HttpRespMsg msg=new HttpRespMsg();

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -995,7 +995,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 contactSyncLogMapper.insert(contactSyncLog);
                 user.setIsActive(0);//先同步过来,但是停用
                 userMapper.insert(user);
-                participationMapper.delete(new LambdaQueryWrapper<Participation>().eq(Participation::getUserId,user.getId()));
             }else {
                 userMapper.insert(user);
                 contactSyncLog.setResult(1);

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


+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/i18n/zh.json

@@ -198,7 +198,7 @@
     "read": "已读",
     "changeThePassword": "修改密码",
     "launchTheLogin": "退出登录",
-    "confirmExit": "确定退出吗",
+    "confirmExit": "确定退出吗",
     "prompts": "提示",
     "expired": "已过期",
     "AskForLeaveOnTheSameDay": "当日请假",

+ 5 - 0
fhKeeper/formulahousekeeper/timesheet/src/views/settings/timetype.vue

@@ -382,6 +382,11 @@
                 <!-- <span v-if="timeType.reportAuditType == 10">公司副总:{{timeType.thirdAuditor}}</span><el-link underline="none" v-if="timeType.reportAuditType == 10">设置</el-link> -->
             </el-tag>
         </div>
+        <div class="yanjiu" >
+            <p style="margin-left:10px;color:#666;">自动审核</p>
+            <el-switch style="margin-left: 55px" v-model="timeType.autoProjectApprove" :active-color="themeColor" > </el-switch>
+            <span style="margin-left:10px;color:#999;">项目审核人是自己时自动审核通过</span>
+        </div>
         <div class="yanjiu">
             <p style="margin-left:10px;color:#666;">{{ $t('xiangMuChaoQiHouBuKeTianBao') }}</p>
             <el-switch style="margin-left: 40px" v-model="timeType.notAllowedExpiredProject" :active-color="themeColor" > </el-switch>

+ 66 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/team/index.vue

@@ -650,6 +650,14 @@
                 <el-form-item :label="$t('employeedeparture')" >
                     <el-date-picker type="date" v-model="deactiveDate" value-format="yyyy-MM-dd" format="yyyy-MM-dd" :placeholder="$t('defaultText.pleaseChoose')" />
                 </el-form-item>
+                <el-form-item label="停用时效" >
+                  <el-radio-group v-model="isPermanent">
+                      <el-radio :label="true" >永久停用</el-radio>
+                      <el-radio :label="false" >暂时停用</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+                <p style="text-align:center; margin:0 auto; color:orange" v-if="isPermanent">永久停用会将该员工从项目参与人中移除</p>
+                <p style="text-align:center; margin:0 auto; color:orange" v-if="!isPermanent">临时停用会保留该员工参与的项目</p>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button type="default" @click="deactiveDialog = false">{{ $t('btn.cancel') }}</el-button>
@@ -683,6 +691,25 @@
                 <el-button type="primary" @click="confirmInactiveWay" >{{ $t('btn.submit') }}</el-button>
             </span>
         </el-dialog>
+        <el-dialog title="离职信息转移" :visible.sync="projectReviewerSelectDialog" width="500px" >
+            <p>*该用户在项目中担任复审人,请选择其他人接手</p>
+            <el-form :model="userInActiveForm" label-width="120px">
+                <!-- 主要负责人 -->
+                <el-form-item label="选择新的复审人">
+                    <el-select v-model="userInActiveForm.targetAuditorId" filterable v-if="user.userNameNeedTranslate != '1'" clearable  :placeholder="$t('defaultText.pleaseChoose')" style="width: 200px">
+                        <el-option v-for="item in users" :key="item.id" :label="item.name" :value="item.id">
+                          <span style="float: left">{{ item.name }}</span>
+                          <span style="float: right; color: #8492a6; font-size: 13px">{{ item.jobNumber }}</span>
+                        </el-option>
+                    </el-select>
+                    <selectCat :size="'medium'" :filterable="true" :clearable="true" :widthStr="'360'" v-if="user.userNameNeedTranslate == '1'" :subject="users" :subjectId="userInActiveForm.targetAuditorId" :distinction="'30'" @selectCal="selectCal"></selectCat>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="projectReviewerSelectDialog = false">{{ $t('btn.cancel') }}</el-button>
+                <el-button type="primary" @click="confirmTransferReviwer" >{{ $t('btn.submit') }}</el-button>
+            </span>
+        </el-dialog>
         <!-- 管理专业证书 -->
         <el-dialog :title="$t('professionalCertificate inManagement')" :visible.sync="managementDiolog" width="500px" :before-close="handleClose">
             <div>
@@ -981,7 +1008,9 @@ export default {
   },
   data() {
     return {
+      isPermanent: true,
       reportAuditorSelectDialog: false,
+      projectReviewerSelectDialog: false,
       userInActiveForm:{way:0,targetAuditorId:null},
       isExporting: false,
       isSyncContact: false,
@@ -2298,6 +2327,7 @@ export default {
         {
           id: this.deactiveUser.id,
           inactiveDate: this.deactiveDate,
+          isPermanent: this.isPermanent
         },
         (res) => {
           if (res.code == "ok") {
@@ -2307,17 +2337,14 @@ export default {
               type: "success",
             });
             this.getUser();
-          } else {
-            if(this.user.companyId==876||this.user.companyId==877||this.user.companyId==878 || this.user.companyId == 10){
-              //新的模式
+          } else if (res.code == 'project') {
+              //项目复核人需要转移为其他人 
               this.userInActiveForm.userId = this.deactiveUser.id;
-              this.reportAuditorSelectDialog = true;
-            }else{
-              this.$message({
-                message: error,
-                type: "error",
-              });
-            }
+              this.projectReviewerSelectDialog = true;
+          }else {
+            //新的模式
+            this.userInActiveForm.userId = this.deactiveUser.id;
+            this.reportAuditorSelectDialog = true;
           }
         },
         (error) => {
@@ -2328,8 +2355,36 @@ export default {
         }
       );
     },
-
+    confirmTransferReviwer() {
+      var url = '/project/transferProjectReviwer'
+      this.http.post(
+          url,
+          this.userInActiveForm,
+          (res) => {
+            if (res.code == "ok") {
+              this.$message({
+                message: '复核人已转移,请继续停用',
+                type: "success",
+              });
+              this.projectReviewerSelectDialog = false;
+            } else {
+              this.$message({
+                message: res.msg,
+                type: "error",
+              });
+            }
+          },
+          (error) => {
+            this.listLoading = false;
+            this.$message({
+              message: error,
+              type: "error",
+            });
+          }
+        );
+    },
     confirmInactiveWay() {
+      this.userInActiveForm.isPermanent = this.isPermanent;
       var url = this.userInActiveForm.way?'/report/transferReportAuditor':'/report/denyByCheckId'
       this.http.post(
           url,