Selaa lähdekoodia

出差的审批流开发

seyason 2 vuotta sitten
vanhempi
commit
24768c3cd4
13 muutettua tiedostoa jossa 431 lisäystä ja 61 poistoa
  1. 10 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BusinessTripController.java
  2. 30 7
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java
  3. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/BusinessTripService.java
  4. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/AuditWorkflowSettingServiceImpl.java
  5. 266 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BusinessTripServiceImpl.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/InformationServiceImpl.java
  7. 4 13
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java
  8. 16 5
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java
  9. 7 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/BusinessTripMapper.xml
  10. 1 0
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/LeaveSheetMapper.xml
  11. 5 1
      fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue
  12. 80 11
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  13. 9 1
      fhKeeper/formulahousekeeper/timesheet/src/views/leave/list.vue

+ 10 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/BusinessTripController.java

@@ -46,6 +46,14 @@ public class BusinessTripController {
 
     }
 
+
+    @RequestMapping("/cancel")
+    public HttpRespMsg cancel(Integer id) {
+        String userId = request.getHeader("Token");
+        return businessTripService.cancel(id, userId);
+    }
+
+
     @RequestMapping("/delete")
     public HttpRespMsg delete(Integer id) {
         return businessTripService.delete(id);
@@ -63,14 +71,11 @@ public class BusinessTripController {
 
     @RequestMapping("/approve")
     public HttpRespMsg approve(Integer id) {
-
         return businessTripService.approve(id);
-
     }
     @RequestMapping("/deny")
-    public HttpRespMsg deny(Integer id, String denyReason) {
-
-        return businessTripService.deny(id, denyReason);
+    public HttpRespMsg deny(Integer id, String reason) {
+        return businessTripService.deny(id, reason);
 
     }
 

+ 30 - 7
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/BusinessTrip.java

@@ -21,7 +21,7 @@ import org.springframework.format.annotation.DateTimeFormat;
  * </p>
  *
  * @author Seyason
- * @since 2022-07-15
+ * @since 2022-12-12
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -127,12 +127,6 @@ public class BusinessTrip extends Model<BusinessTrip> {
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime indate;
 
-    @TableField(exist = false)
-    private String departmentName;
-
-    @TableField(exist = false)
-    List<BustripProject> projectList;
-
     /**
      * 是否已经关联
      */
@@ -151,6 +145,35 @@ public class BusinessTrip extends Model<BusinessTrip> {
     @TableField("gmt_finished")
     private String gmtFinished;
 
+    /**
+     * 审核人id
+     */
+    @TableField("auditor_id")
+    private String auditorId;
+
+    /**
+     * 审核人姓名
+     */
+    @TableField("auditor_name")
+    private String auditorName;
+
+    /**
+     * 1-部门审核,2-指定人员审核
+     */
+    @TableField("auditor_type")
+    private Integer auditorType;
+
+    /**
+     * 当前审核节点id
+     */
+    @TableField("cur_audit_setting_id")
+    private Integer curAuditSettingId;
+
+    @TableField(exist = false)
+    private String departmentName;
+
+    @TableField(exist = false)
+    List<BustripProject> projectList;
 
     @Override
     protected Serializable pkVal() {

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

@@ -31,4 +31,6 @@ public interface BusinessTripService extends IService<BusinessTrip> {
     HttpRespMsg exportData(BusinessTrip sheet,Integer keyword, String startDate, String endDate, String userId);
 
     HttpRespMsg auditList(BusinessTrip sheet, Integer pageIndex, Integer pageSize, Integer checkState);
+
+    HttpRespMsg cancel(Integer id, String userId);
 }

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

@@ -35,8 +35,6 @@ public class AuditWorkflowSettingServiceImpl extends ServiceImpl<AuditWorkflowSe
     UserMapper userMapper;
     @Resource
     DepartmentMapper departmentMapper;
-    @Resource
-    ReportMapper reportMapper;
 
     @Override
     public List<AuditWorkflowSetting> get(Integer deptId, Integer type) {

+ 266 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/BusinessTripServiceImpl.java

@@ -1,14 +1,19 @@
 package com.management.platform.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.management.platform.controller.AuditWorkflowSettingController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.SysRichFunction;
 import com.management.platform.mapper.*;
+import com.management.platform.service.AuditWorkflowSettingService;
 import com.management.platform.service.BusinessTripService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.management.platform.service.DepartmentService;
+import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.ExcelUtil;
 import com.management.platform.util.HttpRespMsg;
 import com.management.platform.util.MessageUtils;
@@ -42,6 +47,10 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
     @Resource
     private BustripProjectMapper bustripProjectMapper;
     @Resource
+    AuditWorkflowSettingMapper auditWorkflowSettingMapper;
+    @Resource
+    BustripAuditLogMapper bustripAuditLogMapper;
+    @Resource
     private TimeTypeMapper timeTypeMapper;
     @Resource
     private HttpServletRequest request;
@@ -57,6 +66,14 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
     LocaleInformationMapper localeInformationMapper;
     @Resource
     CompanyMapper companyMapper;
+    @Resource
+    AuditWorkflowSettingService auditWorkflowSettingService;
+    @Resource
+    WxCorpInfoMapper wxCorpInfoMapper;
+    @Resource
+    WxCorpInfoService wxCorpInfoService;
+    @Resource
+    InformationMapper informationMapper;
 
     @Override
     public HttpRespMsg modifyProject(BusinessTrip sheet) {
@@ -201,6 +218,25 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
         return httpRespMsg;
     }
 
+    @Override
+    public HttpRespMsg cancel(Integer id, String userId) {
+        HttpRespMsg msg = new HttpRespMsg();
+        BusinessTrip oldSheet = businessTripMapper.selectById(id);
+        if (oldSheet.getStatus() == 0) {
+            msg.setError("当前出差申请已通过,无法撤销");
+        } else if (oldSheet.getStatus() == 2) {
+            msg.setError("当前出差申请已驳回,无法撤销");
+        } else {
+            BusinessTrip sheet = new BusinessTrip();
+            sheet.setId(id);
+            sheet.setStatus(3);//撤销状态
+            businessTripMapper.updateById(sheet);
+            //删除相关的审批记录
+            bustripAuditLogMapper.delete(new QueryWrapper<BustripAuditLog>().eq("sheet_id", id));
+        }
+        return msg;
+    }
+
     @Override
     public HttpRespMsg add(BusinessTrip sheet) {
         HttpRespMsg msg = new HttpRespMsg();
@@ -214,8 +250,36 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
         sheet.setOwnerName(user.getName());
         sheet.setCompanyId(user.getCompanyId());
         sheet.setStatus(1);//填报时是待审核状态
+
+        //获取第一个审批人
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        if (owner.getDepartmentId() == 0) {
+            //没有部门,不能提交出差申请
+            msg.setError("请联系管理员设置您所在部门");
+            return msg;
+        } else {
+            List<AuditWorkflowSetting> auditList = auditWorkflowSettingService.get(owner.getDepartmentId(), AuditWorkflowSettingController.TYPE_LEAVE);
+            if (auditList.size() > 0) {
+                AuditWorkflowSetting workflowNode = auditList.get(0);
+                if (workflowNode.getAuditorType() == 1) {
+                    //部门负责人
+                    Department dept = departmentMapper.selectById(workflowNode.getAuditDeptId());
+                    if (dept.getManagerId() == null) {
+                        msg.setError("请联系管理员设置您所在部门的主要负责人");
+                        return msg;
+                    }
+                    sheet.setAuditorId(dept.getManagerId());
+                    sheet.setAuditorName(userMapper.selectById(dept.getManagerId()).getName());
+                } else if (workflowNode.getAuditorType() == 2) {
+                    //指定一个人审批
+                    sheet.setAuditorId(workflowNode.getUserId());
+                    sheet.setAuditorName(workflowNode.getUserName());
+                }
+                sheet.setCurAuditSettingId(workflowNode.getId());
+            }
+        }
+
         if (isNew) {
-            //检查该时间段是否已经有按天请假
             QueryWrapper<BusinessTrip> queryWrapper = new QueryWrapper<>();
             queryWrapper.eq("owner_id", sheet.getOwnerId());
             queryWrapper.le("start_date", sheet.getEndDate()).ge("end_date", sheet.getStartDate());
@@ -224,16 +288,97 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
             if (count > 0) {
                 //msg.setError("该时间段已有出差申请,不能重复提交");
                 msg.setError(MessageUtils.message("leave.businessRepeat"));
+                return msg;
             } else {
                 businessTripMapper.insert(sheet);
             }
         } else {
             businessTripMapper.updateById(sheet);
         }
-
+        sheet = businessTripMapper.selectById(sheet.getId());
+        saveNotifyToAuditor(sheet);
+        WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+        if (wxCorpInfo != null) {
+            sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+        }
         return msg;
     }
 
+
+    //发送审核结果消息提醒
+    private void sendAuditResult(WxCorpInfo wxCorpInfo, User auditor, BusinessTrip sheet, String denyReason) {
+        //推送到企业微信
+        StringBuilder stringBuilder = new StringBuilder();
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate());
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate());
+        }
+
+        stringBuilder.append("$userName="+auditor.getCorpwxUserid()+"$")
+                .append(sheet.getStatus() == 0?"通过":"驳回")
+                .append("了您")
+                .append(applyTimeDesc)
+                .append("的出差申请。");
+        if (sheet.getStatus() == 2) {
+            //驳回加原因
+            stringBuilder.append("原因: ").append(denyReason);
+        }
+
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,owner.getCorpwxUserid(), stringBuilder.toString(), "awayOffice",
+                sheet.getStatus() == 0?WxCorpInfoServiceImpl.TEXT_CARD_MSG_BUSTRIP_AGREE:WxCorpInfoServiceImpl.TEXT_CARD_MSG_BUSTRIP_DENY);
+
+    }
+
+    private void saveNotifyToApplier(BusinessTrip sheet) {
+        String applyTimeDesc = "";
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("M月d日");
+        if (sheet.getStartDate().isEqual(sheet.getEndDate())) {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate());
+        } else {
+            applyTimeDesc = dateTimeFormatter.format(sheet.getStartDate()) +"至" + dateTimeFormatter.format(sheet.getEndDate()) ;
+        }
+        String ownerId = sheet.getOwnerId();
+        User owner = userMapper.selectById(ownerId);
+        User auditor = userMapper.selectById(sheet.getAuditorId());
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(owner.getId());
+        information.setTime(LocalDateTime.now());
+        information.setMsg("您"+applyTimeDesc + "出差申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
+                +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
+        information.setType(5);
+        information.setContent(sheet.getId()+"");
+        informationMapper.insert(information);
+    }
+
+    private void saveNotifyToAuditor(BusinessTrip sheet) {
+        //系统内消息
+        Information information=new Information();
+        information.setUserId(sheet.getAuditorId());
+        information.setTime(LocalDateTime.now());
+        User owner = userMapper.selectById(sheet.getOwnerId());
+        information.setMsg("出差待审核, 申请人:" + (owner.getCorpwxUserid() != null?("$userName="+owner.getCorpwxUserid()+"$"):owner.getName()));
+        information.setType(5);
+        information.setContent(sheet.getId()+"");
+        informationMapper.insert(information);
+    }
+
+    //发送待审核提醒
+    private void sendAuditNotifyMsg(WxCorpInfo wxCorpInfo, User applier, BusinessTrip sheet) {
+        //推送到企业微信
+        StringBuilder sb = new StringBuilder();
+        sb.append("出差申请待审核,申请人:").append("$userName="+applier.getCorpwxUserid()+"$");
+
+        String auditorId = sheet.getAuditorId();
+        User auditor = userMapper.selectById(auditorId);
+        wxCorpInfoService.sendWXCorpMsg(wxCorpInfo,auditor.getCorpwxUserid(), sb.toString(), "awayOffice", WxCorpInfoServiceImpl.TEXT_CARD_MSG_BUSTRIP_WAITING_AUDIT);
+    }
+
     @Override
     public HttpRespMsg delete(Integer id) {
         HttpRespMsg msg=new HttpRespMsg();
@@ -346,21 +491,128 @@ public class BusinessTripServiceImpl extends ServiceImpl<BusinessTripMapper, Bus
 
     @Override
     public HttpRespMsg approve(Integer id) {
-        BusinessTrip sheet = new BusinessTrip();
-        sheet.setId(id);
-        sheet.setStatus(0);
-        businessTripMapper.updateById(sheet);
-        return new HttpRespMsg();
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        BusinessTrip originSheet = businessTripMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取下个审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            BusinessTrip sheet = new BusinessTrip();
+            sheet.setId(id);
+            if (auditWorkflowSetting == null) {
+                //当前审核节点已不存在,直接审核通过
+                sheet.setStatus(0);
+            } else {
+                Integer seq = auditWorkflowSetting.getSeq();
+                AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("type", 2).eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
+                System.out.println("nextAuditNode=="+nextAuditNode);
+                if (nextAuditNode == null) {
+                    sheet.setStatus(0);
+                } else {
+                    //进入下个审核节点
+                    if (nextAuditNode.getAuditorType() == 1) {
+                        //部门负责人审核
+                        Department department = departmentMapper.selectById(nextAuditNode.getAuditDeptId());
+                        if (department == null) {
+                            //部门已被删除,直接审核通过
+                            sheet.setStatus(0);
+                        } else {
+                            if (department.getManagerId() == null) {
+                                httpRespMsg.setError("尚未设置下个节点的部门负责人,请联系管理员");
+                                return httpRespMsg;
+                            } else {
+                                sheet.setCurAuditSettingId(nextAuditNode.getId());
+                                sheet.setAuditorId(department.getManagerId());
+                                sheet.setAuditorName(userMapper.selectById(department.getManagerId()).getName());
+                                sheet.setAuditorType(nextAuditNode.getAuditorType());
+                            }
+                        }
+                    } else if (nextAuditNode.getAuditorType() == 2){
+                        //指定人员审核
+                        sheet.setCurAuditSettingId(nextAuditNode.getId());
+                        sheet.setAuditorId(nextAuditNode.getUserId());
+                        sheet.setAuditorName(nextAuditNode.getUserName());
+                        sheet.setAuditorType(nextAuditNode.getAuditorType());
+                    }
+                }
+            }
+            businessTripMapper.updateById(sheet);
+            //保存审核记录
+            saveAgreeLog(id, auditWorkflowSetting, user);
+            //最终审核通过,发送通过消息
+            sheet = businessTripMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                if (sheet.getStatus() == 0) {
+                    //最终通过
+                    sendAuditResult(wxCorpInfo, user, sheet, null);
+                } else {
+                    //通知下个节点的审核人去审核
+                    sendAuditNotifyMsg(wxCorpInfo, user, sheet);
+                }
+            }
+            if (sheet.getStatus() == 0) {
+                //最终通过
+                saveNotifyToApplier(sheet);
+            } else {
+                //通知下个节点的审核人去审核
+                saveNotifyToAuditor(sheet);
+            }
+        }
+        return httpRespMsg;
+    }
+
+
+    private void saveAgreeLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator) {
+        BustripAuditLog log = new BustripAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(1);
+        bustripAuditLogMapper.insert(log);
+    }
+    private void saveDenyLog(int sheetId, AuditWorkflowSetting curAuditNode, User operator, String reason) {
+        BustripAuditLog log = new BustripAuditLog();
+        log.setSheetId(sheetId);
+        if (curAuditNode != null) {
+            log.setAuditNodeId(curAuditNode.getId());
+        }
+        log.setAuditorId(operator.getId());
+        log.setAuditorName(operator.getName());
+        log.setIsPass(0);
+        log.setDenyReason(reason);
+        bustripAuditLogMapper.insert(log);
     }
 
     @Override
-    public HttpRespMsg deny(Integer id, String denyReason) {
-        BusinessTrip sheet = new BusinessTrip();
-        sheet.setId(id);
-        sheet.setStatus(2);
-        sheet.setDenyReason(denyReason);
-        businessTripMapper.updateById(sheet);
-        return new HttpRespMsg();
+    public HttpRespMsg deny(Integer id, String reason) {
+        String token = request.getHeader("TOKEN");
+        //检查操作人权限
+        User user = userMapper.selectById(token);
+        HttpRespMsg httpRespMsg = new HttpRespMsg();
+        BusinessTrip originSheet = businessTripMapper.selectById(id);
+        if (user.getId().equals(originSheet.getAuditorId())) {
+            //是当前的审核人,获取当前审核节点
+            AuditWorkflowSetting auditWorkflowSetting = auditWorkflowSettingMapper.selectById(originSheet.getCurAuditSettingId());
+            BusinessTrip sheet = new BusinessTrip();
+            sheet.setId(id);
+            sheet.setStatus(2);
+            businessTripMapper.updateById(sheet);
+            saveDenyLog(id, auditWorkflowSetting, user, reason);
+            sheet = businessTripMapper.selectById(id);
+            WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
+            if (wxCorpInfo != null) {
+                sendAuditResult(wxCorpInfo, user, sheet, reason);
+            }
+            saveNotifyToApplier(sheet);
+        }
+
+        return httpRespMsg;
     }
 
     @Override

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

@@ -44,7 +44,7 @@ public class InformationServiceImpl extends ServiceImpl<InformationMapper, Infor
         try {
             User user = userMapper.selectById(request.getHeader("token"));
             List<Information> information = informationMapper.selectList(new QueryWrapper<Information>()
-                    .eq("user_id", user.getId()).orderByDesc("time").last("LIMIT 10"));
+                    .eq("user_id", user.getId()).orderByDesc("time").last("LIMIT 20"));
             WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id",user.getCompanyId()));
             if(wxCorpInfo!=null&&wxCorpInfo.getSaasSyncContact()==1){
                 List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id",user.getCompanyId()));

+ 4 - 13
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/LeaveSheetServiceImpl.java

@@ -104,6 +104,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
             if (count > 0) {
                 //msg.setError("该时间段已有请假申请,不能重复请假");
                 msg.setError(MessageUtils.message("leave.repeatedLeave"));
+                return msg;
             }
         }
 
@@ -188,16 +189,6 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         String ownerId = sheet.getOwnerId();
         User owner = userMapper.selectById(ownerId);
         wxCorpInfoService.sendWXCorpTemplateMsg(wxCorpInfo,owner.getCorpwxUserid(), json);
-
-        //系统内消息
-        Information information=new Information();
-        information.setUserId(owner.getId());
-        information.setTime(LocalDateTime.now());
-        information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 1?"已通过":"已驳回")+", 审核人:"+("$userName="+auditor.getCorpwxUserid()+"$"));
-        information.setType(4);
-        information.setContent(sheet.getId()+"");
-        information.setMsg(applyTimeDesc);
-        informationMapper.insert(information);
     }
 
     private void saveNotifyToApplier(LeaveSheet sheet) {
@@ -216,7 +207,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         Information information=new Information();
         information.setUserId(owner.getId());
         information.setTime(LocalDateTime.now());
-        information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 1?"已通过":"已驳回")+", 审核人:"
+        information.setMsg("您"+applyTimeDesc + "请假申请审核"+(sheet.getStatus() == 0?"已通过":"已驳回")+", 审核人:"
                 +(auditor.getCorpwxUserid() != null ? ("$userName="+auditor.getCorpwxUserid()+"$"):auditor.getName()));
         information.setType(4);
         information.setContent(sheet.getId()+"");
@@ -361,7 +352,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
                 sheet.setStatus(0);
             } else {
                 Integer seq = auditWorkflowSetting.getSeq();
-                AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
+                AuditWorkflowSetting nextAuditNode = auditWorkflowSettingMapper.selectOne(new QueryWrapper<AuditWorkflowSetting>().eq("type", 1).eq("seq", (seq + 1)).eq("dept_id", auditWorkflowSetting.getDeptId()));
                 if (nextAuditNode == null) {
                     sheet.setStatus(0);
                 } else {
@@ -665,7 +656,7 @@ public class LeaveSheetServiceImpl extends ServiceImpl<LeaveSheetMapper, LeaveSh
         if (oldSheet.getStatus() == 0) {
             msg.setError("当前请假申请已通过,无法撤销");
         } else if (oldSheet.getStatus() == 2) {
-            msg.setError("当前请假申已驳回,无法撤销");
+            msg.setError("当前请假申已驳回,无法撤销");
         } else {
             LeaveSheet sheet = new LeaveSheet();
             sheet.setId(id);

+ 16 - 5
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectMainServiceImpl.java

@@ -49,25 +49,36 @@ public class ProjectMainServiceImpl extends ServiceImpl<ProjectMainMapper, Proje
         ProjectCategory projectCategory = projectCategoryMapper.selectById(projectMain.getCategoryId());
         projectMain.setCategoryName(projectCategory.getName());
         if(projectMain.getId()!=null){
+            ProjectMain oldProject = projectMainMapper.selectById(projectMain.getId());
             Integer count = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
                     .eq("code", projectMain.getCode()).ne("id", projectMain.getId()));
-            Integer count1 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
-                    .eq("name", projectMain.getName()).ne("id", projectMain.getId()));
             if(count>0){
                 //httpRespMsg.setError("编号已存在");
                 httpRespMsg.setError(MessageUtils.message("other.NumAlreadyExists"));
                 return httpRespMsg;
             }
+            Integer count1 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
+                    .eq("name", projectMain.getName()).ne("id", projectMain.getId()));
             if(count1>0){
                 //httpRespMsg.setError("名称已存在");
                 httpRespMsg.setError(MessageUtils.message("name.nameRepeat"));
                 return httpRespMsg;
             }
+            boolean nameChanged = !oldProject.getName().equals(projectMain.getName());
+            boolean categoryChanged = !oldProject.getCategoryId().equals(projectMain.getCategoryId());
             projectMainMapper.updateById(projectMain);
             //修改主项目名称  更新项目表
-            List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().eq("project_main_id", projectMain.getId()));
-            projectList.forEach(pl->pl.setProjectMainName(projectMain.getName()));
-            projectService.updateBatchById(projectList);
+            Project updateP = new Project();
+            if (nameChanged) {
+                updateP.setProjectMainName(projectMain.getName());
+            }
+            if (categoryChanged) {
+                updateP.setCategory(projectMain.getCategoryId());
+                updateP.setCategoryName(projectMain.getCategoryName());
+            }
+            if (nameChanged || categoryChanged) {
+                projectService.update(updateP, new QueryWrapper<Project>().eq("project_main_id", projectMain.getId()));
+            }
         }else {
             Integer count2 = projectMainMapper.selectCount(new QueryWrapper<ProjectMain>().eq("company_id", projectMain.getCompanyId())
                     .eq("code", projectMain.getCode()));

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

@@ -23,6 +23,10 @@
         <result column="is_linked" property="isLinked" />
         <result column="procinst_id" property="procinstId" />
         <result column="gmt_finished" property="gmtFinished" />
+        <result column="auditor_id" property="auditorId" />
+        <result column="auditor_name" property="auditorName" />
+        <result column="auditor_type" property="auditorType" />
+        <result column="cur_audit_setting_id" property="curAuditSettingId" />
     </resultMap>
     <resultMap id="BaseResultMap1" type="com.management.platform.entity.BusinessTrip">
         <result column="owner_id" property="ownerId" />
@@ -32,8 +36,9 @@
     </resultMap>
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, company_id, owner_id, owner_name, reason, start_date, end_date, way, city_from, city_to, go_back, day_count, remark, status, deny_reason, indate, is_linked, procinst_id, gmt_finished
+        id, company_id, owner_id, owner_name, reason, start_date, end_date, way, city_from, city_to, go_back, day_count, remark, status, deny_reason, indate, is_linked, procinst_id, gmt_finished, auditor_id, auditor_name, auditor_type, cur_audit_setting_id
     </sql>
+
     <select id="summaryData"  resultMap="BaseResultMap1">
         select owner_id, owner_name, sum(day_count) as day_count, department.department_name as department_name from business_trip
         left join user on user.id = business_trip.owner_id
@@ -43,6 +48,7 @@
             and owner_name like '%${keyword}%'
         </if>
         and business_trip.company_id = #{companyId}
+        and business_trip.status = 0
         group by owner_id
     </select>
 

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

@@ -38,6 +38,7 @@
             and owner_name like '%${keyword}%'
         </if>
         and company_id = #{companyId}
+        and status = 0
         group by owner_id
     </select>
 

+ 5 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/Home.vue

@@ -521,9 +521,13 @@
                             this.$router.push("/expense");
                             this.drawer = false;
                         } else if (type == 4) {
-                            //4- 任务有新进展
+                            //4- 请假消息
                             this.$router.push("/leave");
                             this.drawer = false;
+                        } else if (type == 5) {
+                            //5- 出差消息
+                            this.$router.push("/awayOffice");
+                            this.drawer = false;
                         }
                         
                     } else {

+ 80 - 11
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -229,7 +229,7 @@
                             <div><span :style="scope.row.dayCount >= 10 ? 'color:#e62412' : ''">{{scope.row.dayCount}}{{ $t('time.day') }}</span></div>
                         </template>
                     </el-table-column>
-                    <el-table-column :label="$t('detailsbusinessrip')" width="600" align="center">
+                    <el-table-column :label="$t('detailsbusinessrip')" width="600" align="center" v-if="isSyncData">
                         <template slot-scope="scope">
                             <div v-for="item in scope.row.projectList" :key="item.projectId" class="detailsScope">
                                 <span>{{item.startDate + $t('other.to') + item.endDate}}</span><span>{{item.projectName}}</span><span>{{item.degreeName}}</span>
@@ -268,7 +268,12 @@
                     <el-table-column prop="status" :label="$t('state.states')" width="100" fixed="right">
                         <template slot-scope="scope">
                             <span v-if="scope.row.status == 0">{{ $t('state.approved') }}</span>
-                            <span v-if="scope.row.status == 1" style="color: orange">{{ $t('state.WaitingAudit') }}</span>
+                            <div v-if="scope.row.status == 1" style="color: orange"><span>{{ $t('state.WaitingAudit') }}-</span>
+                                <span v-if="user.userNameNeedTranslate != 1">{{scope.row.auditorName}}</span>
+                                <span v-if="user.userNameNeedTranslate == 1">
+                                <ww-open-data type='userName' :openid='scope.row.auditorName'></ww-open-data>
+                                </span>
+                            </div>
                             <span v-if="scope.row.status == 2" style="color: red">{{ $t('btn.rejected') }}</span>
                             <span v-if="scope.row.status == 3" style="color: #666666">{{ $t('btn.undo') }}</span>
                         </template>
@@ -554,7 +559,7 @@
                 </template>
             </el-table-column>
             <el-table-column prop="reason" :label="$t('travelreason')" width="150" header-align="center"></el-table-column>
-            <el-table-column prop="projectName" :label="$t('screening.inputProject')" width="150" align="center"></el-table-column>
+            <el-table-column prop="projectName" :label="$t('screening.inputProject')" width="150" align="center" v-if="isSyncData"></el-table-column>
             <el-table-column :label="$t('traffictools')" width="120" align="center">
                 <template slot-scope="scope">
                     <span v-if="scope.row.way == 0">{{ $t('plane') }}</span>
@@ -575,7 +580,7 @@
             <el-table-column prop="endDate" :label="$t('endtimeofbusinesstrip')" width="150" align="center"></el-table-column>
             <el-table-column prop="remark" :label="$t('bei-zhu')" width="200">
                 <template slot-scope="scope">
-                    <el-popover placement="top-start" title="$t('biao-ti')" width="200" trigger="hover" :content="scope.row.remark">
+                    <el-popover placement="top-start" width="200" trigger="hover" :content="scope.row.remark">
                         <div slot="reference" class="apls">{{scope.row.remark}}</div>
                     </el-popover>
                 </template>
@@ -684,6 +689,28 @@
             <el-button type="primary" @click="listSynchronize()" :loading="synchronizeLoading">{{ $t('synchronous') }}</el-button>
         </span>
     </el-dialog>
+
+    <el-dialog :title="$t('defaultText.pleaseEnterTheReason')"  v-if="denyDialogV" :visible.sync="denyDialogV" :close-on-click-modal="false" customClass="customWidth" width="500px">
+        <div>
+            <el-input type="textarea" v-model="denyInfo.reason" rows="2" :placeholder="$t('reasonforyourdecisiontoreject')" />
+        </div>
+        <div slot="footer" class="dialog-footer">
+            <el-button  @click="denyDialogV = false" >{{ $t('btn.cancel') }}</el-button>
+            <el-button type="primary" @click="submitDeny()" >{{ $t('btn.determine') }}</el-button>
+        </div>
+    </el-dialog>
+    <el-dialog :title="$t('title.reviewProcess')" v-if="denyReasonVisible" :visible.sync="denyReasonVisible" customClass="customWidth" width="400px">
+        <div style="padding:20px 40px 20px 0">
+            <el-timeline :reverse="false">
+                <el-timeline-item v-for="item in auditLogList" :key="item.id" :timestamp="item.indate">
+                  <span v-if="user.userNameNeedTranslate == 1"><ww-open-data type='userName' :openid='item.auditorName'></ww-open-data> </span>
+                  <span v-if="user.userNameNeedTranslate == 0">{{item.auditorName}}</span>
+                  <span> {{item.isPass==0?"驳回了请假申请。":"审核通过。"}}</span>
+                  <span v-if="item.isPass == 0">原因:{{item.denyReason}}</span>
+                  </el-timeline-item>
+            </el-timeline>
+        </div>
+    </el-dialog>
 </section>
 </template>
 
@@ -716,6 +743,8 @@ export default {
         //         }
         //     };
         return {
+            denyDialogV: false,
+            denyInfo: {},
             summaryLoading: false,
             displayTable: false,
             formloading: false,
@@ -1434,7 +1463,11 @@ export default {
             },
             res => {
                 if (res.code == "ok") {
-                    this.billss(true);
+                    this.auditList();
+                    this.$message({
+                        message: '操作成功',
+                        type: "success"
+                        });
                 } else {
                     this.$message({
                     message: res.msg,
@@ -1450,12 +1483,21 @@ export default {
             });
         },
         deny(item) {
-            //审核驳回
-            this.http.post('/business-trip/deny', {id:item.id
-            },
+            this.denyDialogV = true;
+            this.denyInfo = {id:item.id, reason:null};
+        },
+        
+        submitDeny(id) {
+        //审核驳回
+        this.http.post('/business-trip/deny', this.denyInfo,
             res => {
                 if (res.code == "ok") {
-                    this.billss(true);
+                    this.auditList();
+                    this.denyDialogV = false;
+                    this.$message({
+                        message: '操作成功',
+                        type: "success"
+                        });
                 } else {
                     this.$message({
                     message: res.msg,
@@ -1470,6 +1512,33 @@ export default {
                 });
             });
         },
+        cancel(e) {
+            this.$confirm('确定要撤回该出差申请吗', this.$t('other.prompts'), {
+                //type: 'warning'
+            }).then(() => {
+                this.http.post('/business-trip/cancel', {id:e.id},
+                res => {
+                    if (res.code == "ok") {
+                        this.bills();
+                        this.$message({
+                            message: '操作成功',
+                            type: "success"
+                        });
+                    } else {
+                        this.$message({
+                        message: res.msg,
+                        type: "error"
+                        });
+                    }
+                },
+                error => {
+                    this.$message({
+                        message: error,
+                        type: "error"
+                    });
+                });
+            });
+        },
         // 操作 - 删除
         deletes(e) {
             this.$confirm(this.$t('deleteit'), this.$t('other.prompts'), {}).then(() => {
@@ -1603,8 +1672,8 @@ export default {
                 pageIndex: this.detailspage,
                 pageSize: this.detailssize,
                 status: 0,
-                startDate: '',
-                endDate: '',
+                startDate: this.searchDates[0],
+                endDate: this.searchDates[1],
                 ownerId: this.detailsuserid,
                 way: '',
             };

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

@@ -284,7 +284,7 @@
                 <el-table-column prop="remark" :label="$t('bei-zhu')" min-width="200" header-align="center">
                   <template slot-scope="scope">
                     <!-- <div class="apls">{{scope.row.remark}}</div> -->
-                    <el-popover placement="top-start" :title="$t('biao-ti')" width="200" trigger="hover" :content="scope.row.remark">
+                    <el-popover placement="top-start"  width="200" trigger="hover" :content="scope.row.remark">
                       <div slot="reference" class="apls">{{scope.row.remark}}</div>
                     </el-popover>
                   </template>
@@ -1546,6 +1546,10 @@ export default {
         res => {
             if (res.code == "ok") {
                 this.auditList();
+                this.$message({
+                        message: '操作成功',
+                        type: "success"
+                        });
             } else {
                 this.$message({
                 message: res.msg,
@@ -1572,6 +1576,10 @@ export default {
             if (res.code == "ok") {
                 this.auditList();
                 this.denyDialogV = false;
+                this.$message({
+                        message: '操作成功',
+                        type: "success"
+                        });
             } else {
                 this.$message({
                 message: res.msg,