Enford пре 5 година
родитељ
комит
f2257d1615
100 измењених фајлова са 19213 додато и 0 уклоњено
  1. 32 0
      src/main/java/com/jeeplus/modules/workjobgrade/dao/WorkJobGradeDao.java
  2. 147 0
      src/main/java/com/jeeplus/modules/workjobgrade/entity/WorkJobGrade.java
  3. 139 0
      src/main/java/com/jeeplus/modules/workjobgrade/service/WorkJobGradeService.java
  4. 284 0
      src/main/java/com/jeeplus/modules/workjobgrade/web/WorkJobGradeController.java
  5. 39 0
      src/main/java/com/jeeplus/modules/workloan/dao/WorkLoanDao.java
  6. 274 0
      src/main/java/com/jeeplus/modules/workloan/entity/WorkLoan.java
  7. 895 0
      src/main/java/com/jeeplus/modules/workloan/service/WorkLoanService.java
  8. 545 0
      src/main/java/com/jeeplus/modules/workloan/web/WorkLoanController.java
  9. 17 0
      src/main/java/com/jeeplus/modules/worklog/dao/WorkLogDao.java
  10. 18 0
      src/main/java/com/jeeplus/modules/worklog/dao/WorkMeetingDao.java
  11. 130 0
      src/main/java/com/jeeplus/modules/worklog/entity/WorkLog.java
  12. 128 0
      src/main/java/com/jeeplus/modules/worklog/entity/WorkMeeting.java
  13. 56 0
      src/main/java/com/jeeplus/modules/worklog/service/WorkLogService.java
  14. 57 0
      src/main/java/com/jeeplus/modules/worklog/service/WorkMeetingService.java
  15. 211 0
      src/main/java/com/jeeplus/modules/worklog/web/WorkLogController.java
  16. 195 0
      src/main/java/com/jeeplus/modules/worklog/web/WorkMeetingController.java
  17. 24 0
      src/main/java/com/jeeplus/modules/workmeeting/dao/WorkmeetinginfoDao.java
  18. 29 0
      src/main/java/com/jeeplus/modules/workmeeting/dao/WorkmeetinguserDao.java
  19. 47 0
      src/main/java/com/jeeplus/modules/workmeeting/entity/Workmeetinginfo.java
  20. 68 0
      src/main/java/com/jeeplus/modules/workmeeting/entity/Workmeetinguser.java
  21. 67 0
      src/main/java/com/jeeplus/modules/workmeeting/service/WorkmeetinginfoService.java
  22. 73 0
      src/main/java/com/jeeplus/modules/workmeeting/service/WorkmeetinguserService.java
  23. 196 0
      src/main/java/com/jeeplus/modules/workmeeting/web/WorkmeetinginfoController.java
  24. 196 0
      src/main/java/com/jeeplus/modules/workmeeting/web/WorkmeetinguserController.java
  25. 33 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/dao/WorkMonthlyPlanDao.java
  26. 22 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/dao/WorkMonthlyPlanThisDao.java
  27. 154 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/entity/WorkMonthlyPlan.java
  28. 168 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/entity/WorkMonthlyPlanThis.java
  29. 212 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/service/WorkMonthlyPlanService.java
  30. 63 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/service/WorkMonthlyPlanThisService.java
  31. 344 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/web/WorkMonthlyPlanController.java
  32. 196 0
      src/main/java/com/jeeplus/modules/workmonthlyplan/web/WorkMonthlyPlanThisController.java
  33. 20 0
      src/main/java/com/jeeplus/modules/workofficechange/dao/WorkOfficeChangeDao.java
  34. 19 0
      src/main/java/com/jeeplus/modules/workofficechange/dao/WorkOfficeChangeUserDao.java
  35. 194 0
      src/main/java/com/jeeplus/modules/workofficechange/entity/WorkOfficeChange.java
  36. 188 0
      src/main/java/com/jeeplus/modules/workofficechange/entity/WorkOfficeChangeUser.java
  37. 839 0
      src/main/java/com/jeeplus/modules/workofficechange/service/WorkOfficeChangeService.java
  38. 50 0
      src/main/java/com/jeeplus/modules/workofficechange/service/WorkOfficeChangeUserService.java
  39. 404 0
      src/main/java/com/jeeplus/modules/workofficechange/web/WorkOfficeChangeController.java
  40. 237 0
      src/main/java/com/jeeplus/modules/workofficechange/web/WorkOfficeChangeUserController.java
  41. 43 0
      src/main/java/com/jeeplus/modules/workout/dao/WorkOutDao.java
  42. 251 0
      src/main/java/com/jeeplus/modules/workout/entity/WorkOut.java
  43. 756 0
      src/main/java/com/jeeplus/modules/workout/service/WorkOutService.java
  44. 365 0
      src/main/java/com/jeeplus/modules/workout/web/WorkOutController.java
  45. 37 0
      src/main/java/com/jeeplus/modules/workoutsignin/dao/WorkOutSignInDao.java
  46. 91 0
      src/main/java/com/jeeplus/modules/workoutsignin/entity/WorkOutSignIn.java
  47. 111 0
      src/main/java/com/jeeplus/modules/workoutsignin/service/WorkOutSignInService.java
  48. 234 0
      src/main/java/com/jeeplus/modules/workoutsignin/web/WorkOutSignInController.java
  49. 42 0
      src/main/java/com/jeeplus/modules/workovertime/dao/WorkOvertimeDao.java
  50. 228 0
      src/main/java/com/jeeplus/modules/workovertime/entity/WorkOvertime.java
  51. 737 0
      src/main/java/com/jeeplus/modules/workovertime/service/WorkOvertimeService.java
  52. 370 0
      src/main/java/com/jeeplus/modules/workovertime/web/WorkOvertimeController.java
  53. 59 0
      src/main/java/com/jeeplus/modules/workovertimeform/dao/WorkOvertimeFormDao.java
  54. 433 0
      src/main/java/com/jeeplus/modules/workovertimeform/entity/WorkOvertimeForm.java
  55. 796 0
      src/main/java/com/jeeplus/modules/workovertimeform/service/WorkOvertimeFormService.java
  56. 334 0
      src/main/java/com/jeeplus/modules/workovertimeform/web/WorkOvertimeFormController.java
  57. 19 0
      src/main/java/com/jeeplus/modules/workpartetag/dao/WorkPartEtagDao.java
  58. 113 0
      src/main/java/com/jeeplus/modules/workpartetag/entity/WorkPartEtag.java
  59. 53 0
      src/main/java/com/jeeplus/modules/workpartetag/service/WorkPartEtagService.java
  60. 230 0
      src/main/java/com/jeeplus/modules/workpartetag/web/WorkPartEtagController.java
  61. 20 0
      src/main/java/com/jeeplus/modules/workpayment/dao/WorkPaymentDao.java
  62. 323 0
      src/main/java/com/jeeplus/modules/workpayment/entity/WorkPayment.java
  63. 670 0
      src/main/java/com/jeeplus/modules/workpayment/service/WorkPaymentService.java
  64. 436 0
      src/main/java/com/jeeplus/modules/workpayment/web/WorkPaymentController.java
  65. 19 0
      src/main/java/com/jeeplus/modules/workperformance/dao/WorkPerformanceDao.java
  66. 207 0
      src/main/java/com/jeeplus/modules/workperformance/entity/WorkPerformance.java
  67. 97 0
      src/main/java/com/jeeplus/modules/workperformance/service/WorkPerformanceService.java
  68. 297 0
      src/main/java/com/jeeplus/modules/workperformance/web/WorkPerformanceController.java
  69. 19 0
      src/main/java/com/jeeplus/modules/workperson/dao/WorkPersonDao.java
  70. 65 0
      src/main/java/com/jeeplus/modules/workperson/entity/WorkPerson.java
  71. 64 0
      src/main/java/com/jeeplus/modules/workperson/service/WorkPersonService.java
  72. 230 0
      src/main/java/com/jeeplus/modules/workperson/web/WorkPersonController.java
  73. 21 0
      src/main/java/com/jeeplus/modules/workpettycash/dao/WorkPettyCashDao.java
  74. 381 0
      src/main/java/com/jeeplus/modules/workpettycash/entity/WorkPettyCash.java
  75. 661 0
      src/main/java/com/jeeplus/modules/workpettycash/service/WorkPettyCashService.java
  76. 439 0
      src/main/java/com/jeeplus/modules/workpettycash/web/WorkPettyCashController.java
  77. 81 0
      src/main/java/com/jeeplus/modules/workprequalification/dao/WorkPrequalificationDao.java
  78. 19 0
      src/main/java/com/jeeplus/modules/workprequalification/dao/WorkProjectLinkmanDao.java
  79. 270 0
      src/main/java/com/jeeplus/modules/workprequalification/entity/WorkPrequalification.java
  80. 116 0
      src/main/java/com/jeeplus/modules/workprequalification/entity/WorkProjectLinkman.java
  81. 137 0
      src/main/java/com/jeeplus/modules/workprequalification/service/WorkPrequalificationService.java
  82. 716 0
      src/main/java/com/jeeplus/modules/workprequalification/web/WorkPrequalificationController.java
  83. 21 0
      src/main/java/com/jeeplus/modules/workprocesstype/dao/WorkProcessDetailDao.java
  84. 21 0
      src/main/java/com/jeeplus/modules/workprocesstype/dao/WorkProcessTypeDao.java
  85. 73 0
      src/main/java/com/jeeplus/modules/workprocesstype/entity/WorkProcessDetail.java
  86. 57 0
      src/main/java/com/jeeplus/modules/workprocesstype/entity/WorkProcessType.java
  87. 55 0
      src/main/java/com/jeeplus/modules/workprocesstype/service/WorkProcessDetailService.java
  88. 49 0
      src/main/java/com/jeeplus/modules/workprocesstype/service/WorkProcessTypeService.java
  89. 206 0
      src/main/java/com/jeeplus/modules/workprocesstype/web/WorkProcessDetailController.java
  90. 214 0
      src/main/java/com/jeeplus/modules/workprocesstype/web/WorkProcessTypeController.java
  91. 25 0
      src/main/java/com/jeeplus/modules/workproject/dao/WorkProjectDao.java
  92. 93 0
      src/main/java/com/jeeplus/modules/workproject/entity/WorkProject.java
  93. 76 0
      src/main/java/com/jeeplus/modules/workproject/service/WorkProjectService.java
  94. 382 0
      src/main/java/com/jeeplus/modules/workproject/web/WorkProjectController.java
  95. 20 0
      src/main/java/com/jeeplus/modules/workprojectcalc/dao/WorkProjectCalcBuildDao.java
  96. 19 0
      src/main/java/com/jeeplus/modules/workprojectcalc/dao/WorkProjectCalcDecorDao.java
  97. 115 0
      src/main/java/com/jeeplus/modules/workprojectcalc/entity/WorkProjectCalcBuild.java
  98. 137 0
      src/main/java/com/jeeplus/modules/workprojectcalc/entity/WorkProjectCalcDecor.java
  99. 50 0
      src/main/java/com/jeeplus/modules/workprojectcalc/service/WorkProjectCalcBuildService.java
  100. 0 0
      src/main/java/com/jeeplus/modules/workprojectcalc/service/WorkProjectCalcDecorService.java

+ 32 - 0
src/main/java/com/jeeplus/modules/workjobgrade/dao/WorkJobGradeDao.java

@@ -0,0 +1,32 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workjobgrade.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.TreeDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+
+
+import javax.validation.OverridesAttribute;
+
+import java.util.List;
+
+/**
+ * 职级类型DAO接口
+ * @author ssrh
+ * @version 2018-08-02
+ */
+@MyBatisDao
+public interface WorkJobGradeDao extends TreeDao<WorkJobGrade> {
+
+
+    void changeState(WorkJobGrade workJobGrade);
+
+    public List<WorkJobGrade> findByBranchOffice(WorkJobGrade workJobGrade);
+
+
+    List<WorkJobGrade> findByName(WorkJobGrade select);
+
+}

+ 147 - 0
src/main/java/com/jeeplus/modules/workjobgrade/entity/WorkJobGrade.java

@@ -0,0 +1,147 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workjobgrade.entity;
+
+import com.jeeplus.common.persistence.TreeEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import com.fasterxml.jackson.annotation.JsonBackReference;
+import javax.validation.constraints.NotNull;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 职级类型Entity
+ * @author ssrh
+ * @version 2018-08-02
+ */
+public class WorkJobGrade extends TreeEntity<WorkJobGrade> {
+	
+	private static final long serialVersionUID = 1L;
+	private Office office;		// 所属部门
+	private String companyId;		// 所属公司
+	private String no;		// 类型编号
+	private String endFlag;		// 末级标记 0 有子节点 1 无子节点
+	private String branchOffice;		// 分公司id
+	private String state;		// 禁用状态 0 启用 1 禁用
+	private Double pay;		// 职级工资
+    private String isLeaf;
+
+	public WorkJobGrade() {
+		super();
+	}
+
+	public WorkJobGrade(String id){
+		super(id);
+	}
+
+	@ExcelField(title="所属部门", fieldType=Office.class, value="office.name", align=2, sort=7)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+	
+	@ExcelField(title="所属公司", align=2, sort=8)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="名称", align=2, sort=9)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="类型编号", align=2, sort=10)
+	public String getNo() {
+		return no;
+	}
+
+	public void setNo(String no) {
+		this.no = no;
+	}
+	
+	@JsonBackReference
+	@ExcelField(title="父节点", align=2, sort=11)
+	public WorkJobGrade getParent() {
+		return parent;
+	}
+
+	public void setParent(WorkJobGrade parent) {
+		this.parent = parent;
+	}
+	
+	@ExcelField(title="末级标记 0 有子节点 1 无子节点", align=2, sort=12)
+	public String getEndFlag() {
+		return endFlag;
+	}
+
+	public void setEndFlag(String endFlag) {
+		this.endFlag = endFlag;
+	}
+	
+	@ExcelField(title="父节点ids", align=2, sort=13)
+	public String getParentIds() {
+		return parentIds;
+	}
+
+	public void setParentIds(String parentIds) {
+		this.parentIds = parentIds;
+	}
+	
+	@ExcelField(title="分公司id", align=2, sort=14)
+	public String getBranchOffice() {
+		return branchOffice;
+	}
+
+	public void setBranchOffice(String branchOffice) {
+		this.branchOffice = branchOffice;
+	}
+	
+	@ExcelField(title="禁用状态 0 启用 1 禁用", align=2, sort=15)
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+	
+	@ExcelField(title="职级工资", align=2, sort=16)
+	public Double getPay() {
+		return pay;
+	}
+
+	public void setPay(Double pay) {
+		this.pay = pay;
+	}
+	
+	@NotNull(message="排序不能为空")
+	@ExcelField(title="排序", align=2, sort=17)
+	public Integer getSort() {
+		return sort;
+	}
+
+	public void setSort(Integer sort) {
+		this.sort = sort;
+	}
+
+    public String getIsLeaf() {
+        return isLeaf;
+    }
+
+    public void setIsLeaf(String isLeaf) {
+        this.isLeaf = isLeaf;
+    }
+}

+ 139 - 0
src/main/java/com/jeeplus/modules/workjobgrade/service/WorkJobGradeService.java

@@ -0,0 +1,139 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workjobgrade.service;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.service.TreeService;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workreview.entity.WorkReviewStandard;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+import com.jeeplus.modules.workjobgrade.dao.WorkJobGradeDao;
+
+/**
+ * 职级类型Service
+ * @author ssrh
+ * @version 2018-08-02
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkJobGradeService extends TreeService<WorkJobGradeDao, WorkJobGrade> {
+
+	public WorkJobGrade get(String id) {
+        WorkJobGrade workJobGrade = super.get(id);
+        if(workJobGrade!=null) {
+            WorkJobGrade select = new WorkJobGrade();
+            select.setParent(workJobGrade);
+            List<WorkJobGrade> jobGradeList = dao.findByParent(select);
+            if(jobGradeList!=null&&jobGradeList.size()>0){
+                workJobGrade.setIsLeaf("否");
+            }else {
+                workJobGrade.setIsLeaf("是");
+            }
+        }
+        return workJobGrade;
+	}
+	
+	public List<WorkJobGrade> findList(WorkJobGrade workJobGrade) {
+        User user = UserUtils.getUser();
+        Office branchOffice = user.getBranchOffice();
+        if(branchOffice==null){
+            branchOffice=user.getCompany();
+        }
+        workJobGrade.setCompanyId(user.getCompany().getId());
+        workJobGrade.setBranchOffice(branchOffice.getId());
+        workJobGrade.getCurrentUser().setBranchOffice(branchOffice);
+        List<WorkJobGrade> list = super.findList(workJobGrade);
+        if(list!=null&&list.size()>0) {
+            List<WorkJobGrade> sortedList = new ArrayList<>(list.size());
+            this.sortList(sortedList,list,null);
+            return sortedList;
+        }
+        return list;
+	}
+
+    private void sortList(List<WorkJobGrade> sortedList, List<WorkJobGrade> list,WorkJobGrade parent) {
+        Iterator<WorkJobGrade> iterator = list.iterator();
+        while (iterator.hasNext()){
+            WorkJobGrade next = iterator.next();
+            if(next==null)continue;
+            if(parent==null) {
+                sortedList.add(next);
+                iterator.remove();
+                this.sortList(sortedList,list,next);
+                next.getParent().setId("0");
+                iterator = list.iterator();
+            }else {
+                if(parent.getId().equals(next.getParent().getId())){
+                    sortedList.add(next);
+                    iterator.remove();
+                    this.sortList(sortedList,list,next);
+                    iterator = list.iterator();
+                }
+            }
+        }
+    }
+
+    public Page<WorkJobGrade> findPage(Page<WorkJobGrade> page, WorkJobGrade workJobGrade) {
+		return super.findPage(page, workJobGrade);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkJobGrade workJobGrade) {
+        User user = UserUtils.getUser();
+        if(StringUtils.isBlank(workJobGrade.getCompanyId())){
+	        workJobGrade.setCompanyId(user.getComId());
+        }
+        if(StringUtils.isBlank(workJobGrade.getBranchOffice())){
+            workJobGrade.setBranchOffice(user.getBranchOffice()==null?workJobGrade.getCompanyId():user.getBranchOffice().getId());
+        }
+        if(workJobGrade.getOffice()==null){
+            workJobGrade.setOffice(user.getOffice());
+        }
+		super.save(workJobGrade);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkJobGrade workJobGrade) {
+		super.delete(workJobGrade);
+	}
+
+    @Transactional(readOnly = false)
+    public String changeState(WorkJobGrade workJobGrade) {
+        String msg = null;
+        if("禁用".equals(workJobGrade.getState())){
+            workJobGrade.setState("启用");
+            msg = "恢复";
+        }else {
+            workJobGrade.setState("禁用");
+            msg = "移除";
+        }
+        dao.changeState(workJobGrade);
+        return msg;
+    }
+
+    public List<WorkJobGrade> findByName(String name) {
+	    WorkJobGrade select = new WorkJobGrade();
+	    select.setName(name);
+        User user = UserUtils.getUser();
+        Office branchOffice = user.getBranchOffice();
+        if(branchOffice==null){
+            branchOffice=user.getCompany();
+        }
+	    select.setBranchOffice(branchOffice.getId());
+        return dao.findByName(select);
+    }
+}

+ 284 - 0
src/main/java/com/jeeplus/modules/workjobgrade/web/WorkJobGradeController.java

@@ -0,0 +1,284 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workjobgrade.web;
+
+import java.beans.PropertyEditorSupport;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.modules.workreview.entity.WorkReviewStandard;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+import com.jeeplus.modules.workjobgrade.service.WorkJobGradeService;
+
+/**
+ * 职级类型Controller
+ * @author ssrh
+ * @version 2018-08-02
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workjobgrade/workJobGrade")
+public class WorkJobGradeController extends BaseController {
+
+	@Autowired
+	private WorkJobGradeService workJobGradeService;
+	
+	@ModelAttribute
+	public WorkJobGrade get(@RequestParam(required=false) String id) {
+		WorkJobGrade entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workJobGradeService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkJobGrade();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 职级类型列表页面
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkJobGrade workJobGrade, HttpServletRequest request, HttpServletResponse response, Model model) {
+        List<WorkJobGrade> list = workJobGradeService.findList(workJobGrade);
+        model.addAttribute("list", list);
+		return "modules/workjobgrade/workJobGradeList";
+	}
+
+	/**
+	 * 查看,增加,编辑职级类型表单页面
+	 */
+	@RequiresPermissions(value={"workjobgrade:workJobGrade:add","workjobgrade:workJobGrade:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkJobGrade workJobGrade, Model model) {
+	    if(workJobGrade.getIsNewRecord()){
+	        workJobGrade.setIsLeaf("是");
+	        workJobGrade.setState("启用");
+        }
+		model.addAttribute("workJobGrade", workJobGrade);
+		return "modules/workjobgrade/workJobGradeForm";
+	}
+	/**
+	 * 查看,增加,编辑职级类型表单页面
+	 */
+	@RequestMapping(value = "view")
+	public String view(WorkJobGrade workJobGrade, Model model) {
+	    if(workJobGrade.getIsNewRecord()){
+	        workJobGrade.setIsLeaf("是");
+	        workJobGrade.setState("启用");
+        }
+		model.addAttribute("workJobGrade", workJobGrade);
+		return "modules/workjobgrade/workJobGradeView";
+	}
+
+	/**
+	 * 保存职级类型
+	 */
+	@RequiresPermissions(value={"workjobgrade:workJobGrade:add","workjobgrade:workJobGrade:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkJobGrade workJobGrade, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workJobGrade)){
+			return form(workJobGrade, model);
+		}
+		if(!workJobGrade.getIsNewRecord()){//编辑表单保存
+			WorkJobGrade t = workJobGradeService.get(workJobGrade.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workJobGrade, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workJobGradeService.save(t);//保存
+		}else{//新增表单保存
+			workJobGradeService.save(workJobGrade);//保存
+		}
+		addMessage(redirectAttributes, "保存职级类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+	}
+	
+	/**
+	 * 删除职级类型
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkJobGrade workJobGrade, RedirectAttributes redirectAttributes) {
+		workJobGradeService.delete(workJobGrade);
+		addMessage(redirectAttributes, "删除职级类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+	}
+	
+	/**
+	 * 批量删除职级类型
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workJobGradeService.delete(workJobGradeService.get(id));
+		}
+		addMessage(redirectAttributes, "删除职级类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkJobGrade workJobGrade, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "职级类型"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkJobGrade> page = workJobGradeService.findPage(new Page<WorkJobGrade>(request, response, -1), workJobGrade);
+    		new ExportExcel("职级类型", WorkJobGrade.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出职级类型记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkJobGrade> list = ei.getDataList(WorkJobGrade.class);
+			for (WorkJobGrade workJobGrade : list){
+				try{
+					workJobGradeService.save(workJobGrade);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条职级类型记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条职级类型记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入职级类型失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+    }
+	
+	/**
+	 * 下载导入职级类型数据模板
+	 */
+	@RequiresPermissions("workjobgrade:workJobGrade:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "职级类型数据导入模板.xlsx";
+    		List<WorkJobGrade> list = Lists.newArrayList(); 
+    		new ExportExcel("职级类型数据", WorkJobGrade.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+    }
+
+    @RequiresPermissions("user")
+    @ResponseBody
+    @RequestMapping(value = "treeData")
+    public List<Map<String, Object>> treeData(@RequestParam(required = false) String extId, HttpServletResponse response) {
+        List<Map<String, Object>> mapList = Lists.newArrayList();
+        WorkJobGrade workJobGrade = new WorkJobGrade();
+        workJobGrade.setState("启用");
+        List<WorkJobGrade> list = workJobGradeService.findList(workJobGrade);
+        for (int i = 0; i < list.size(); i++) {
+            WorkJobGrade e = list.get(i);
+            if ((StringUtils.isBlank(extId) || (extId != null && !extId.equals(e.getId()) && e.getParentIds().indexOf("," + extId + ",") == -1)) ) {
+                Map<String, Object> map = Maps.newHashMap();
+                map.put("id", e.getId());
+                map.put("pId", e.getParentId());
+                map.put("pIds", e.getParentIds());
+                map.put("name", e.getName());
+                map.put("no", e.getNo());
+                map.put("salary", e.getPay());
+                mapList.add(map);
+            }
+        }
+        return mapList;
+    }
+    @InitBinder
+    protected void initBinder(WebDataBinder binder) {
+        binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
+            @Override
+            public void setAsText(String text) {
+                setValue(text == null ? null : StringEscapeUtils.escapeHtml4(text.trim()));
+            }
+            @Override
+            public String getAsText() {
+                Object value = getValue();
+                return value != null ? value.toString() : "";
+            }
+        });
+        // Date 类型转换
+        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
+            @Override
+            public void setAsText(String text) {
+                setValue(DateUtils.parseDate(text));
+            }
+        });
+        // 数字类型转换
+        binder.registerCustomEditor(Double.class, new PropertyEditorSupport() {
+            @Override
+            public void setAsText(String text) {
+                DecimalFormat df =   new DecimalFormat("###,##0.00");
+                try {
+                    if(StringUtils.isNotBlank(text)) {
+                        setValue(df.parse(text).doubleValue());
+                    }
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+    }
+
+    /**
+     * 启用、禁用工作内容类型
+     */
+    @RequiresPermissions("workjobgrade:workJobGrade:edit")
+    @RequestMapping(value = "change")
+    public String changeStatus(WorkJobGrade workJobGrade, RedirectAttributes redirectAttributes) {
+        String msg = workJobGradeService.changeState(workJobGrade);
+        addMessage(redirectAttributes, msg+"工作内容类型成功");
+        return "redirect:"+Global.getAdminPath()+"/workjobgrade/workJobGrade/?repage";
+    }
+}

+ 39 - 0
src/main/java/com/jeeplus/modules/workloan/dao/WorkLoanDao.java

@@ -0,0 +1,39 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workloan.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workloan.entity.WorkLoan;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 借款DAO接口
+ * @author ssrh
+ * @version 2018-10-16
+ */
+@MyBatisDao
+public interface WorkLoanDao extends CrudDao<WorkLoan> {
+
+   int updateReay(WorkLoan workLoan);
+
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(WorkLoan workLoan);
+
+    /**
+     * 根据流程实例ID获取
+     * @param processInstanceId
+     * @return
+     */
+    public WorkLoan getByProcessInstanceId(String processInstanceId);
+    //合同找数据
+    List<WorkLoan> findListByContract(@Param("contractId") String  contractId, @Param("repayState")String repayState);
+    //人员找数据
+    List<WorkLoan> findListByUser(@Param("userId") String  userId, @Param("repayState")String repayState);
+}

+ 274 - 0
src/main/java/com/jeeplus/modules/workloan/entity/WorkLoan.java

@@ -0,0 +1,274 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workloan.entity;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.workrepay.entity.WorkRepay;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+/**
+ * 借款Entity
+ * @author ssrh
+ * @version 2018-10-16
+ */
+public class WorkLoan extends ActEntity<WorkLoan> {
+	//通知87     //编码30   //流程表 ggh3125f1f194c82bdea93555c75edfv  //	assignmentType29
+	private static final long serialVersionUID = 1L;
+	public static final String SERIAL_BIZCODE = "30";//编号模板类型
+
+	private String processInstanceId;		// 流程号
+	private String officeId;		// 部门
+	private String companyId;		// 公司
+	private String status;		// 状态
+	private WorkStaffBasicInfo workStaffBasicInfo;		// 档案
+	private String num;		// 借款编码
+	private String type;		// 借款类型   (1行政借款2项目借款)
+	private ProjectRecords projectRecords;		// 借款项目
+	private String contractNotRepay;		// 合同未还款累计
+	private String money;		// 借款金额
+	private String notRepay;		// 未还借款累计
+	private Date loanDate;		// 借款日期
+	private String repay;		// 还款金额
+	private String repayState;		// 还款状态(1已还款2部分还款3未还款)
+	private String home;
+	private Date beginContractDate;		// 开始
+	private Date endContractDate;		// 结束
+	//还款明细
+	private List<WorkRepay> workRepays = Lists.newArrayList();
+
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+	public Date getBeginContractDate() {
+		return beginContractDate;
+	}
+
+	public void setBeginContractDate(Date beginContractDate) {
+		this.beginContractDate = beginContractDate;
+	}
+
+	public Date getEndContractDate() {
+		return endContractDate;
+	}
+
+	public void setEndContractDate(Date endContractDate) {
+		this.endContractDate = endContractDate;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public WorkLoan() {
+		super();
+	}
+
+	public WorkLoan(String id){
+		super(id);
+	}
+
+	public List<WorkRepay> getWorkRepays() {
+		return workRepays;
+	}
+
+	public void setWorkRepays(List<WorkRepay> workRepays) {
+		this.workRepays = workRepays;
+	}
+
+	@ExcelField(title="流程号", align=2, sort=7)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+	
+	@ExcelField(title="部门", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="公司", align=2, sort=9)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="状态", align=2, sort=10)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+
+
+	@ExcelField(title="档案", align=2, sort=11)
+	public WorkStaffBasicInfo getWorkStaffBasicInfo() {
+		return workStaffBasicInfo;
+	}
+
+	public void setWorkStaffBasicInfo(WorkStaffBasicInfo workStaffBasicInfo) {
+		this.workStaffBasicInfo = workStaffBasicInfo;
+	}
+
+	@ExcelField(title="借款编码", align=2, sort=12)
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	@ExcelField(title="借款类型", align=2, sort=13)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+
+
+
+	@ExcelField(title="借款项目", align=2, sort=14)
+	public ProjectRecords getProjectRecords() {
+		return projectRecords;
+	}
+
+	public void setProjectRecords(ProjectRecords projectRecords) {
+		this.projectRecords = projectRecords;
+	}
+	@ExcelField(title="合同未还款累计", align=2, sort=15)
+	public String getContractNotRepay() {
+		return contractNotRepay;
+	}
+
+	public void setContractNotRepay(String contractNotRepay) {
+		this.contractNotRepay = contractNotRepay;
+	}
+	
+	@ExcelField(title="借款金额", align=2, sort=16)
+	public String getMoney() {
+		return money;
+	}
+
+	public void setMoney(String money) {
+		this.money = money;
+	}
+	
+	@ExcelField(title="未还借款累计", align=2, sort=17)
+	public String getNotRepay() {
+		return notRepay;
+	}
+
+	public void setNotRepay(String notRepay) {
+		this.notRepay = notRepay;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="借款日期", align=2, sort=18)
+	public Date getLoanDate() {
+		return loanDate;
+	}
+
+	public void setLoanDate(Date loanDate) {
+		this.loanDate = loanDate;
+	}
+	
+	@ExcelField(title="还款金额", align=2, sort=19)
+	public String getRepay() {
+		return repay;
+	}
+
+	public void setRepay(String repay) {
+		this.repay = repay;
+	}
+	
+	@ExcelField(title="还款状态", align=2, sort=20)
+	public String getRepayState() {
+		return repayState;
+	}
+
+	public void setRepayState(String repayState) {
+		this.repayState = repayState;
+	}
+	
+}

+ 895 - 0
src/main/java/com/jeeplus/modules/workloan/service/WorkLoanService.java

@@ -0,0 +1,895 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workloan.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.projectrecord.dao.WorkProjectUserDao;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.workrepay.dao.WorkRepayDao;
+import com.jeeplus.modules.workrepay.entity.WorkRepay;
+import com.jeeplus.modules.workrepay.service.WorkRepayService;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.activiti.engine.*;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workloan.entity.WorkLoan;
+import com.jeeplus.modules.workloan.dao.WorkLoanDao;
+
+/**
+ * 借款Service
+ * @author ssrh
+ * @version 2018-10-16
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkLoanService extends CrudService<WorkLoanDao, WorkLoan> {
+
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private SerialNumTplService serialNumTplService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkLoanDao workLoanDao;
+	@Autowired
+	@Lazy
+	private WorkRepayService workRepayService;
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+	@Autowired
+	private WorkRepayDao workRepayDao;
+
+	@SuppressWarnings("unchecked")
+	public WorkLoan get(String id) {
+		WorkLoan workLoan = super.get(id);
+		if(workLoan!=null){
+			WorkRepay workRepay = new WorkRepay();
+			workRepay.setStatus("5");
+			workRepay.setWorkLoan(workLoan);
+			List<WorkRepay> list = workRepayService.findList(workRepay);
+			workLoan.setWorkRepays(list);
+			//合同未还款累计
+			if(workLoan.getProjectRecords()!=null && workLoan.getProjectRecords().getWorkContractInfo()!=null && StringUtils.isNotBlank(workLoan.getProjectRecords().getWorkContractInfo().getId())){
+				Double contractNotRepay = this.getContractRepay(workLoan.getProjectRecords().getWorkContractInfo());
+				workLoan.setContractNotRepay(contractNotRepay+"");
+			}
+			//未还借款累计
+			if(workLoan.getWorkStaffBasicInfo()!=null && StringUtils.isNotBlank(workLoan.getWorkStaffBasicInfo().getUserId())){
+				Double notRepay = this.getnotRepay(workLoan.getWorkStaffBasicInfo());
+				workLoan.setNotRepay(notRepay+"");
+			}
+			//还款金额
+			if(StringUtils.isNotBlank(workLoan.getId())){
+				Double repay = this.getRepay(workLoan);
+				workLoan.setRepay(repay+"");
+			}
+
+		}
+		return workLoan;
+	}
+	public WorkLoan getLon(String id) {
+		WorkLoan workLoan = super.get(id);
+		if(workLoan!=null){
+			WorkRepay workRepay = new WorkRepay();
+			workRepay.setStatus("5");
+			workRepay.setWorkLoan(workLoan);
+			List<WorkRepay> list = workRepayService.findList(workRepay);
+			workLoan.setWorkRepays(list);
+			//合同未还款累计
+			if(workLoan.getProjectRecords()!=null && workLoan.getProjectRecords().getWorkContractInfo()!=null && StringUtils.isNotBlank(workLoan.getProjectRecords().getWorkContractInfo().getId())){
+				Double contractNotRepay = this.getContractRepay(workLoan.getProjectRecords().getWorkContractInfo());
+				workLoan.setContractNotRepay(contractNotRepay+"");
+			}
+			//未还借款累计
+			String notRepay=workRepayDao.findSumRepayList(workLoan.getId());
+			workLoan.setNotRepay(String.valueOf(Double.parseDouble(workLoan.getMoney()) - Double.parseDouble(notRepay)));
+		}
+		return workLoan;
+	}
+	public Double getnotRepay(WorkStaffBasicInfo workStaffBasicInfo){
+		//未还借款累计
+		List<WorkLoan> list1 = this.findListByUser(workStaffBasicInfo.getUserId(),"3");
+		double moneyCount= 0.00;//借款
+		for(int i=0;i<list1.size();i++){
+			WorkLoan workLoan = list1.get(i);
+			if(StringUtils.isNotBlank(workLoan.getMoney())){
+				moneyCount = moneyCount + Double.parseDouble(workLoan.getMoney());
+			}
+		}
+		//部分还款
+		List<WorkLoan> list2 = this.findListByUser(workStaffBasicInfo.getUserId(),"2");
+		for(int i=0;i<list2.size();i++){
+			WorkLoan workLoan = list2.get(i);
+			Double repay = this.getRepay(workLoan);
+			if(StringUtils.isNotBlank(workLoan.getMoney()) && repay!=null){
+				moneyCount = moneyCount + (Double.parseDouble(workLoan.getMoney()) - repay);
+			}
+		}
+		return moneyCount;
+	}
+
+	public Double getContractRepay(WorkContractInfo workContractInfo){
+		//合同未还累计
+		//未还款
+		List<WorkLoan> list1 = this.findListByContract(workContractInfo.getId(),"3");
+		double moneyCount= 0.00;//借款
+		for(int i=0;i<list1.size();i++){
+			WorkLoan workLoan = list1.get(i);
+			if(StringUtils.isNotBlank(workLoan.getMoney())){
+				moneyCount = moneyCount + Double.parseDouble(workLoan.getMoney());
+			}
+		}
+		//部分还款
+		List<WorkLoan> list2 = this.findListByContract(workContractInfo.getId(),"2");
+		for(int i=0;i<list2.size();i++){
+			WorkLoan workLoan = list2.get(i);
+			if(StringUtils.isNotBlank(workLoan.getMoney()) && StringUtils.isNotBlank(workLoan.getRepay())){
+				moneyCount = moneyCount + (Double.parseDouble(workLoan.getMoney()) - Double.parseDouble(workLoan.getRepay()));
+			}
+		}
+		return moneyCount;
+	}
+	public Double getRepay(WorkLoan workLoan){
+		//借款-还款累计
+		double moneyCount= 0.00;
+		WorkRepay workRepay = new WorkRepay();
+		workRepay.setStatus("5");
+		workRepay.setWorkLoan(workLoan);
+		List<WorkRepay> list = workRepayService.findList(workRepay);
+		for(int i=0;i<list.size();i++){
+			WorkRepay w = list.get(i);
+			if(StringUtils.isNotBlank(w.getMoney())){
+				moneyCount = moneyCount+(Double.parseDouble(w.getMoney()));
+			}
+		}
+		return moneyCount;
+	}
+	public List<WorkLoan> findList(WorkLoan workLoan) {
+		return super.findList(workLoan);
+	}
+	
+	public Page<WorkLoan> findPage(Page<WorkLoan> page, WorkLoan workLoan) {
+		workLoan.getSqlMap().put("dsf", dataScopeFilter(workLoan.getCurrentUser(), "o", "u","s", MenuStatusEnum.WORK_REIMBURSEMENT.getValue()));
+		workLoan.setPage(page);
+		page.setList(findList(workLoan));
+		return page;
+	}
+
+	/**
+	 * 暂存
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public  void save(WorkLoan workLoan){
+		if (StringUtils.isBlank(workLoan.getNum())) {
+			User user = UserUtils.getUser();
+			workLoan.setNum(serialNumTplService.genSerialNum(user.getCompany(), workLoan.SERIAL_BIZCODE));
+		}
+		super.save(workLoan);
+	}
+
+	@Transactional(readOnly = false)
+	public String save(WorkLoan workLoan, Map<String, Object> variables, String processInstanceId) {
+		User user = UserUtils.getUser();
+		if (StringUtils.isBlank(workLoan.getNum())) {
+			workLoan.setNum(serialNumTplService.genSerialNum(user.getCompany(), workLoan.SERIAL_BIZCODE));
+		}
+		super.save(workLoan);
+		Office office = null;
+		if(workLoan!=null && workLoan.getWorkStaffBasicInfo()!=null && StringUtils.isNotBlank(workLoan.getWorkStaffBasicInfo().getId())){
+			WorkStaffBasicInfo workStaffBasicInfo=workStaffBasicInfoService.getAchives(workLoan.getWorkStaffBasicInfo().getId());
+			if(workStaffBasicInfo!=null){
+				office = workStaffBasicInfo.getOffice();
+			}
+		}
+		if(office == null || StringUtils.isBlank(office.getId())){
+			return "借款人档案信息有误,请确认!";
+		}
+		String str = "借款申请编号:"+workLoan.getNum()+",借款人:"+workLoan.getWorkStaffBasicInfo().getName()+",所属部门:"+office.getName();
+		String title = "借款人:"+workLoan.getWorkStaffBasicInfo().getName();
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(user.getId());
+		// 启动流程
+		String businessKey = workLoan.getId().toString();
+		WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("ggh3125f1f194c82bdea93555c75edfv", office);
+		// 启动流程
+		String processType = workActivityMenu.getProcessType();
+		StringBuffer buffer = new StringBuffer();
+		Activity activity = new Activity();
+		WorkProjectNotify workProjectNotify = UtilNotify
+				.saveNotify(workLoan.getId(),
+						null,
+						workLoan.getCompanyId(),
+						title,
+						str,
+						"87",
+						"0",
+						"待审批",
+						""
+				);
+		List<User> users = new ArrayList<>();
+		List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"29",workLoan.getCreateBy());
+		List<User> fglds = UserUtils.getByRoleActivityEnname("fgld",2,office.getId(),"29",workLoan.getCreateBy());
+		List<User> cws = UserUtils.getByRoleActivityEnname("cwzg",3,office.getId(),"29",workLoan.getCreateBy());
+		List<User> zjls = UserUtils.getByRoleActivityEnname("zjl",3,office.getId(),"29",workLoan.getCreateBy());
+		List<User> cwzjs = UserUtils.getByRoleActivityEnname("cwfgld",3,office.getId(),"29",workLoan.getCreateBy());
+		List<User> cns = UserUtils.getByRoleActivityEnname("cn",3,office.getId(),"29",workLoan.getCreateBy());
+		if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+			workProjectNotify.setNotifyRole("");
+			workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+			List<Activity> activities = workActivityMenu.getActivities();
+			for (Activity a : activities) {
+				String encount = a.getEncount();
+				String enlist = a.getEnlist();
+				if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+					List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"29",workLoan.getCreateBy());
+					if (enusers.size()==0){
+						workLoan.setStatus("1");
+						super.save(workLoan);
+						return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+					}
+					variables.put(enlist, enusers);
+					variables.put(encount, enusers.size());
+				}
+				if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+					activity = a;
+				}
+			}
+			buffer.append(activity.getRole().getEnname());
+			if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+				//角色审批
+				if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+					users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"29",workLoan.getCreateBy());
+				}
+				//人员审批
+				if (StringUtils.isNotBlank(activity.getUser().getId())) {
+					users.add(activity.getUser());
+				}
+			}
+			workProjectNotify.setId("");
+		} else {
+			variables.put("bmzrList", bmzrs);
+            /*variables.put("fgldList", fglds);
+            variables.put("cwList", cws);
+            variables.put("zjlList", zjls);
+            variables.put("cwzjList", cwzjs);
+            variables.put("cnList", cns);*/
+			//|| fglds.size()==0 || cws.size()==0 || zjls.size()==0 || cwzjs.size()==0 || cns.size()==0
+			if (bmzrs.size()==0 ){
+				workLoan.setStatus("1");
+				super.save(workLoan);
+			}
+			if (bmzrs.size()==0){
+				return "流程审批人不能为空,角色部门负责人下无用户,请联系管理员!";
+			}
+           /* if (fglds.size()==0){
+                return "流程审批人不能为空,角色分管领导下无用户,请联系管理员!";
+            }
+            if (cws.size()==0){
+                return "流程审批人不能为空,角色财务主管下无用户,请联系管理员!";
+            }
+            if (zjls.size()==0){
+                return "流程审批人不能为空,角色总经理下无用户,请联系管理员!";
+            }
+            if (cwzjs.size()==0){
+                return "流程审批人不能为空,角色财务分管领导下无用户,请联系管理员!";
+            }
+            if (cns.size()==0){
+                return "流程审批人不能为空,角色出纳下无用户,请联系管理员!";
+            }*/
+			variables.put("bmzrcount",bmzrs.size());
+            /*variables.put("fgldcount",fglds.size());
+            variables.put("cwcount",cws.size());
+            variables.put("zjlcount",zjls.size());
+            variables.put("cwzjcount",cwzjs.size());
+            variables.put("cncount",cns.size());*/
+			processType = "workloan";
+			users.addAll(bmzrs);
+		}
+		for (User u : users){
+			workProjectNotify.setUser(u);
+			workProjectNotify.setId("");
+			workProjectNotify.setNotifyRole("部门负责人审批");
+			workProjectNotifyService
+					.save(workProjectNotify);
+               /* List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+                for (WebSocket toUserConn:toUserConns) {
+                   String message = "{\"to\":\""+u.getId()+"\"," +
+                            "\"msg\":\"审批信息 报销人:" + user.getName() + ",报销编号:"+ workReimbursement.getNumber() + " 待审批!\"," +
+                            "\"useType\":\"sys\"}";
+                    ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+                }*/
+			Map<String,Object> extras = new HashMap<>();
+			extras.put("type","7002");
+			extras.put("id",workProjectNotify.getId());
+			extras.put("procDefKey","13");
+			UserUtils.pushInfoToApp(title,str,extras,u.getId());
+			UserUtils.pushIm(u.getId(),str);
+		}
+		variables.put("type", processType);
+		variables.put("busId", businessKey);
+		variables.put("title", "审批单:" + workLoan.getNum());//设置标题;
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+		workLoan.setProcessInstance(processInstance);
+		if (StringUtils.isNotBlank(processInstanceId)) {
+			workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+			workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+			workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+		}
+		// 更新流程实例ID
+		workLoan.setProcessInstanceId(processInstance.getId());
+		workLoanDao.updateProcessInstanceId(workLoan);
+		List<Activity> list = workActivityMenu.getActivities();
+		if (list != null && list.size() != 0) {
+			workActivityProcessService.saveList(list, processInstance.getId());
+		} else {
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessKey("workloan");
+			workActivityProcess.setCount(1);
+			workActivityProcess.setProcessInstanceId(processInstance.getId());
+			workActivityProcess.setIsApproval("0");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcess.setCount(2);
+			workActivityProcess.setId("");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcess.setCount(3);
+			workActivityProcess.setId("");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcess.setCount(4);
+			workActivityProcess.setId("");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcess.setCount(5);
+			workActivityProcess.setId("");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcess.setCount(6);
+			workActivityProcess.setId("");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),1,1);
+			workActivityProcessService.insertAuditsByType(fglds,processInstance.getId(),2,0);
+			workActivityProcessService.insertAuditsByType(cws,processInstance.getId(),3,0);
+			workActivityProcessService.insertAuditsByType(zjls,processInstance.getId(),4,0);
+			workActivityProcessService.insertAuditsByType(cwzjs,processInstance.getId(),5,0);
+			workActivityProcessService.insertAuditsByType(cns,processInstance.getId(),6,0);
+		}
+		logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[]{
+				ActUtils.PD_REIMBURSEMENT[0], businessKey, processInstance.getId(), variables});
+		return "";
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkLoan workLoan) {
+		super.delete(workLoan);
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workLoan.getId());
+		List<User> users = workProjectNotifyService.readByNotifyId(notify);
+		if (users!=null && users.size()!=0){
+			for (User user:users){
+				UserUtils.pushMeIm(user.getId());
+			}
+		}
+	}
+
+	/**
+	 * 审核流程
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(WorkLoan workLoan,List<User> auditUsers) {
+		Office office = null;
+		if(workLoan!=null && workLoan.getWorkStaffBasicInfo()!=null && StringUtils.isNotBlank(workLoan.getWorkStaffBasicInfo().getId())){
+			WorkStaffBasicInfo workStaffBasicInfo=workStaffBasicInfoService.getAchives(workLoan.getWorkStaffBasicInfo().getId());
+			if(workStaffBasicInfo!=null){
+				office = workStaffBasicInfo.getOffice();
+			}
+		}
+		if(office == null || StringUtils.isBlank(office.getId())){
+			return "借款人档案信息有误,请确认!";
+		}
+		String str = "借款申请编号:"+workLoan.getNum()+",借款人:"+workLoan.getWorkStaffBasicInfo().getName()+",所属部门:"+office.getName();
+		String title = "借款人:"+workLoan.getWorkStaffBasicInfo().getName();
+
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = workLoan.getAct().getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey)) {
+			actTaskService.claim(workLoan.getAct().getTaskId(), UserUtils.getUser().getId());
+		}else{
+			workLoan.getAct().setFlag("yes");
+		}
+		String comment = "";
+		if (workLoan.getStatus().equals("4")){
+			comment = ("yes".equals(workLoan.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(workLoan.getAct().getFlag())?"[同意] ":"[驳回] ")+workLoan.getAct().getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		workLoan.setStatus(("yes".equals(workLoan.getAct().getFlag()) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(workLoan.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(workLoan.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workloan")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(workLoan.getAct().getFlag())) {
+						workLoan.setStatus("4");
+						workActivityProcess.setIsApproval("2");
+						String returnBack = "-1";
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								returnBack = activity.getReturnBack();
+								notifyRole = activity.getName();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					notifyRole = "调整申请";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(workLoan.getAct().getFlag())) {
+						workLoan.setStatus("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("workloan");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				String count = activityProcess.getCount() + "";
+				workActivityProcess = activityProcess;
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("bmzr".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						vars.put("fgldList", auditUsers);
+						vars.put("fgldcount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workLoan.getProcessInstanceId(),2,1);
+						workActivityProcess.setIsApproval("1");
+						notifyRole = "分管领导审核";
+						enname = "fgld";
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("fgld".equals(taskDefKey) && count.contains("2")) {
+					taskCount = "2";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						vars.put("cwList", auditUsers);
+						vars.put("cwcount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workLoan.getProcessInstanceId(),3,1);
+						notifyRole = "财务审核";
+						workActivityProcess.setIsApproval("1");
+						enname = "cwzg";
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("cw".equals(taskDefKey) && count.contains("3")) {
+					taskCount = "3";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						vars.put("zjlList", auditUsers);
+						vars.put("zjlcount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workLoan.getProcessInstanceId(),4,1);
+						notifyRole = "总经理审核";
+						workActivityProcess.setIsApproval("1");
+						enname = "zjl";
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("zjl".equals(taskDefKey) && count.contains("4")) {
+					taskCount = "4";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						vars.put("cwzjList", auditUsers);
+						vars.put("cwzjcount",auditUsers.size());
+						notifyRole = "财务分管领导审核";
+						workActivityProcessService.insertAuditsByType(auditUsers,workLoan.getProcessInstanceId(),5,1);
+
+						workActivityProcess.setIsApproval("1");
+						enname = "cwfgld";
+					} else {
+						workActivityProcess.setIsApproval("2");
+						notifyRole = "调整申请";
+					}
+					break;
+				} else if ("cwzj".equals(taskDefKey) && count.contains("5")) {
+					taskCount = "5";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						vars.put("cnList", auditUsers);
+						vars.put("cncount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workLoan.getProcessInstanceId(),6,1);
+						notifyRole = "报销付款";
+						workActivityProcess.setIsApproval("1");
+						enname = "cn";
+					} else {
+						workActivityProcess.setIsApproval("2");
+						notifyRole = "调整申请";
+					}
+					break;
+				} else if ("cn".equals(taskDefKey) && count.contains("6")) {
+					taskCount = "6";
+					exp = "pass";
+					if ("yes".equals(workLoan.getAct().getFlag())) {
+						notifyRole = "审批通过";
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					taskCount = "0";
+					notifyRole = "部门负责人审批";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "bmzr";
+					if (!"yes".equals(workLoan.getAct().getFlag())) {
+						workLoan.setStatus("3");
+					}
+					break;
+				} else if ("apply_end".equals(taskDefKey)) {
+				}
+
+			}
+		}
+		// 设置意见
+		workLoan.getAct().setComment(("yes".equals(workLoan.getAct().getFlag()) ? "[同意] " : "[驳回] ") + workLoan.getAct().getComment());
+		workLoan.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(workLoan.getAct().getFlag()) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,workLoan.getProcessInstanceId(),taskDefKey,"modifyApply",workLoan.getAct().getFlag(),comment, activities);
+		// 提交流程任务
+		actTaskService.complete(workLoan.getAct().getTaskId(), workLoan.getAct().getProcInsId(), workLoan.getAct().getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(workLoan.getAct().getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		if (!state) {
+			users.add(workLoan.getCreateBy());
+			if ("yes".equals(workLoan.getAct().getFlag())) {
+				workLoan.setStatus("5");
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workLoan.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(workLoan.getId(),
+										workLoan.getCreateBy(),
+										workLoan.getCompanyId(),
+										title,
+										str,
+										"87",
+										"0",
+										"待通知",
+										notifyRole));
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workLoan.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(workLoan.getStatus()) && !workLoan.getStatus().equals("3")){
+					workLoan.setStatus("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workLoan.getId(),
+											workLoan.getCreateBy(),
+											workLoan.getCompanyId(),
+											title,
+											str,
+											"87",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(workLoan.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workloan")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workLoan.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				//users.addAll(userList);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(workLoan.getId(),
+								new User(),
+								workLoan.getCompanyId(),
+								title,
+								str,
+								"87",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						workLoan.getAct().getFlag(),
+						taskCount,
+						workLoan.getCreateBy(),
+						workLoan.getOfficeId(),
+						"29");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+					if (!"modifyApply".equals(taskDefKey)){
+						Map<String,Object> extras = new HashMap<>();
+						if ( "cn".equals(taskDefKey) ){
+							extras.put("type","7001");
+						}else {
+							extras.put("type","7002");
+						}
+						extras.put("id",workProjectNotify.getId());
+						extras.put("procDefKey","87");
+						UserUtils.pushInfoToApp(title,str,extras,workProjectNotify1.getUser().getId());
+
+					}
+				}
+
+			} else {
+				if (!"yes".equals(workLoan.getAct().getFlag())) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(workLoan.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					//users.addAll(userList);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workLoan.getId(),
+											workLoan.getCreateBy(),
+											workLoan.getCompanyId(),
+											title,
+											str,
+											"87",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( workLoan.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workLoan.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						//users.addAll(userList1);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(workLoan.getId(),
+										new User(),
+										workLoan.getCompanyId(),
+										title,
+										str,
+										"87",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1:auditUsers){
+							workProjectNotify.setId("");
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+							if (!"modifyApply".equals(taskDefKey)){
+								Map<String,Object> extras = new HashMap<>();
+								if ("cn".equals(taskDefKey) ){
+									extras.put("type","7001");
+								}else {
+									extras.put("type","7002");
+								}
+								extras.put("id",workProjectNotify.getId());
+								extras.put("procDefKey","87");
+								UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+
+							}
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workLoan.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.addAll(userList);
+						users.add(workLoan.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(workLoan.getId(),
+												workLoan.getCreateBy(),
+												workLoan.getCompanyId(),
+												title,
+												str,
+												"87",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),str);
+			}
+		}
+		if (userList!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+
+		workLoanDao.update(workLoan);
+		return "保存审核意见成功!";
+	}
+	/**
+	 * 获取流程详细信息
+	 * @param processInstanceId
+	 */
+	@SuppressWarnings("unchecked")
+	public WorkLoan getByProcessInstanceId(String processInstanceId) {
+		WorkLoan workLoan = workLoanDao.getByProcessInstanceId(processInstanceId);
+		return workLoan;
+	}
+	/**
+	 * 强制撤销
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public void cancelInvalidate(WorkLoan workLoan) {
+		String invalidateProcessInstanceId = workLoan.getProcessInstanceId();
+		try {
+			//将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+			WorkActivityProcess process = new WorkActivityProcess();
+			process.setProcessInstanceId(workLoan.getProcessInstanceId());
+			process.setIsApproval("0");
+			//List<WorkActivityProcess> processList1 = workActivityProcessService.findByProcInsId(process);
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessInstanceId(workLoan.getProcessInstanceId());
+			List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+			WorkProjectNotify notify = new WorkProjectNotify();
+			notify.setNotifyId(workLoan.getId());
+			List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+			if (userList!=null && userList.size()!=0) {
+				for (User u : userList) {
+					User user = UserUtils.get(u.getId());
+					UserUtils.pushMeIm(user.getId());
+				}
+			}
+			if(processList!=null && processList.size()>0){
+				for (int i =0;i<processList.size();i++) {
+					WorkActivityProcess p = processList.get(i);
+					if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+						p.setDelFlag("1");
+						p.setIsApproval("-1");
+						workActivityProcessDao.updateDelFlagAndIsApproval(p);
+					}
+				}
+				WorkActivityProcess pro = new WorkActivityProcess();
+				pro.setId("");
+				pro.setDelFlag("0");
+				pro.preInsert();
+				pro.setRemarks("[强制撤销]");
+				pro.setProcessKey(processList.get(0).getProcessKey());
+				pro.setIsApproval("1");
+				pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+				pro.setCount(0);
+				workActivityProcessDao.insert(pro);
+			}
+
+			//结束该流程,设为"撤销"状态
+			actTaskService.endProcessInstance(invalidateProcessInstanceId,"强制撤销");
+			workLoan.setStatus("3");
+			workLoan.preUpdate();
+			workLoanDao.update(workLoan);
+		}catch (ActivitiObjectNotFoundException e){
+			System.err.println("撤销异常,因为这个流程已不存在!");
+			e.printStackTrace();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+	public List<WorkLoan> findListByContract(String contractId,String repayState){
+		return workLoanDao.findListByContract(contractId,repayState);
+	}
+	public List<WorkLoan> findListByUser(String userId,String repayState){
+		return workLoanDao.findListByUser(userId,repayState);
+	}
+}

+ 545 - 0
src/main/java/com/jeeplus/modules/workloan/web/WorkLoanController.java

@@ -0,0 +1,545 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workloan.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.mapper.JsonMapper;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectrecord.dao.WorkProjectUserDao;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysmtree.service.SysMtreeService;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workbidproject.service.WorkBidProjectService;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workfullmanage.service.WorkFullManageService;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import com.jeeplus.modules.worksupplier.service.WorkSupplierService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workloan.entity.WorkLoan;
+import com.jeeplus.modules.workloan.service.WorkLoanService;
+
+/**
+ * 借款Controller
+ * @author ssrh
+ * @version 2018-10-16
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workloan/workLoan")
+public class WorkLoanController extends BaseController {
+
+	@Autowired
+	private WorkLoanService workLoanService;
+
+	@Autowired
+	protected RuntimeService runtimeService;
+
+	@Autowired
+	protected TaskService taskService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private HttpServletRequest request;
+
+	@Autowired
+	private WorkClientInfoService workClientInfoService;
+	@Autowired
+	private WorkFullManageService workFullManageService;
+
+	@Autowired
+	private WorkBidProjectService workBidProjectService;
+
+	@Autowired
+	private SysMtreeService sysMtreeService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+
+	@ModelAttribute
+	public WorkLoan get(@RequestParam(required=false) String id) {
+		WorkLoan entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workLoanService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkLoan();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 借款列表页面
+	 */
+	@RequiresPermissions("workloan:workLoan:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkLoan workLoan, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkLoan> page = workLoanService.findPage(new Page<WorkLoan>(request, response), workLoan); 
+		model.addAttribute("page", page);
+		return "modules/workloan/workLoanList";
+	}
+
+	/**
+	 * 查看,增加,编辑借款表单页面
+	 */
+	//@RequiresPermissions(value={"workloan:workLoan:view","workloan:workLoan:add","workloan:workLoan:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkLoan workLoan, Model model) {
+		String view = "workLoanForm";
+		String tabId = request.getParameter("tabId");
+		if("1".equals(tabId)){
+			view = "workLoanView";
+		}else if("3".equals(tabId)){
+			ProcessInstance processInstance = actTaskService.getProcIns(workLoan.getProcessInstanceId());
+			if (processInstance!=null) {
+				Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+				Act act = new Act();
+				act.setTaskId(taskInfok.getId());
+				act.setTaskName(taskInfok.getName());
+				act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+				act.setProcDefId(taskInfok.getProcessDefinitionId());
+				act.setProcInsId(taskInfok.getProcessInstanceId());
+				act.setTask(taskInfok);
+				workLoan.setAct(act);
+				view = "workLoanModify";
+			}
+		}
+		// 环节编号
+		String taskDefKey = workLoan.getAct().getTaskDefKey();
+		if (StringUtils.isNotBlank(taskDefKey) && !taskDefKey.equals("modifyApply")){
+			view = "workLoanAudit";
+		}
+		if(StringUtils.isBlank(workLoan.getId())){
+			WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+			workStaffBasicInfo.setUserId(UserUtils.getUser().getId());
+			workStaffBasicInfo.setOffice(UserUtils.getSelectOffice());
+			workStaffBasicInfo = workStaffBasicInfoService.getByUserOffice(workStaffBasicInfo);
+			workLoan.setWorkStaffBasicInfo(workStaffBasicInfo);
+			workLoan.setRepayState("3");
+			workLoan.setCreateBy(UserUtils.getUser());
+			workLoan.setLoanDate(new Date());
+			workLoan.setRepay("0");
+			if(workStaffBasicInfo!=null && StringUtils.isNotBlank(workStaffBasicInfo.getUserId())){
+				/*//未还款
+				List<WorkLoan> list1 = workLoanService.findListByUser(workStaffBasicInfo.getUserId(),"3");
+				double moneyCount= 0.00;//借款
+				for(int i=0;i<list1.size();i++){
+					WorkLoan workLoans = list1.get(i);
+					if(StringUtils.isNotBlank(workLoans.getMoney())){
+						moneyCount = moneyCount + Double.parseDouble(workLoans.getMoney());
+					}
+				}
+				//部分还款
+				List<WorkLoan> list2 = workLoanService.findListByContract(workStaffBasicInfo.getUserId(),"2");
+				for(int i=0;i<list2.size();i++){
+					WorkLoan workLoans = list2.get(i);
+					if(StringUtils.isNotBlank(workLoans.getMoney()) && StringUtils.isNotBlank(workLoans.getRepay())){
+						moneyCount = moneyCount + (Double.parseDouble(workLoans.getMoney()) - Double.parseDouble(workLoans.getRepay()));
+					}
+				}*/
+				Double notRepay = workLoanService.getnotRepay(workStaffBasicInfo);
+				workLoan.setNotRepay(notRepay+"");
+			}
+		}
+		model.addAttribute("workLoan", workLoan);
+		return "modules/workloan/"+view;
+	}
+	/**
+	 * 暂存报销单
+	 */
+	@RequestMapping(value = "store")
+	public String store(WorkLoan workLoan,
+						Model model,
+						RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workLoan)){
+			return form(workLoan, model);
+		}
+		User user = workLoan.getCreateBy();
+		String submitter = "";
+		if(user != null){
+			submitter = user.getId();
+		}
+		String sta = workLoan.getStatus();
+		if(!UserUtils.getUser().getId().equals(submitter) && !Strings.isNullOrEmpty(submitter) && sta != null){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+		}
+		workLoan.setStatus("1"); //暂存状态
+		workLoan.setCompanyId(UserUtils.getSelectCompany().getId());
+		workLoan.setOfficeId(UserUtils.getSelectOffice().getId());
+		if (StringUtils.isNotBlank(workLoan.getProcessInstanceId()) && workLoan.getProcessInstanceId().equals("NULL")){
+			workLoan.setProcessInstanceId("");
+		}
+		if(!workLoan.getIsNewRecord()){//编辑表单保存
+			WorkLoan t = workLoanService.get(workLoan.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workLoan, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workLoanService.save(t);//保存
+		}else{//新增表单保存
+			workLoanService.save(workLoan);//保存
+		}
+		addMessage(redirectAttributes, "保存成功");
+		return "redirect:" + adminPath +"/workloan/workLoan/?repage";
+	}
+
+	/**
+	 * 保存提交报销单
+	 * 启动流程
+	 */
+	@RequestMapping(value = "save")
+	public String save(WorkLoan workLoan,
+					   Model model,
+					   RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workLoan)){
+			return form(workLoan, model);
+		}
+		User user = workLoan.getCreateBy();
+		String sta = workLoan.getStatus();
+		if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+		}
+		//状态设置为审核中
+		workLoan.setStatus("2");
+		String processInstanceId ="";
+		if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(sta) && "3".equals(sta)){
+			processInstanceId = workLoanService.get(workLoan.getId()).getProcessInstanceId();
+		}
+		try {
+			Map<String, Object> variables = Maps.newHashMap();
+			workLoan.setCompanyId(UserUtils.getSelectCompany().getId());
+			workLoan.setOfficeId(UserUtils.getSelectOffice().getId());
+			String str = workLoanService.save(workLoan, variables,processInstanceId);
+			if (StringUtils.isNotBlank(str)){
+				addMessage(redirectAttributes, "申请提交失败:"+str);
+			}else {
+				addMessage(redirectAttributes, "申请已经提交");
+			}
+
+		} catch (Exception e) {
+			logger.info("Exception e:"+e);
+			addMessage(redirectAttributes, "申请提交失败!");
+			addMessage(redirectAttributes, "系统内部错误");
+		}
+		return "redirect:" + adminPath +"/workloan/workLoan/?repage";
+	}
+
+	/**
+	 * 工单执行(完成任务)
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkLoan workLoan, Model model,
+							RedirectAttributes redirectAttributes) {
+		try {
+			// 对不同环节的业务逻辑进行操作
+			String taskDefKey = workLoan.getAct().getTaskDefKey();
+			List<User> users = null;
+			Office office = null;
+			if(workLoan!=null && workLoan.getWorkStaffBasicInfo()!=null && StringUtils.isNotBlank(workLoan.getWorkStaffBasicInfo().getId())){
+				WorkStaffBasicInfo workStaffBasicInfo=workStaffBasicInfoService.getAchives(workLoan.getWorkStaffBasicInfo().getId());
+				if(workStaffBasicInfo!=null){
+					office = workStaffBasicInfo.getOffice();
+				}
+			}
+			if(office == null || StringUtils.isBlank(office.getId())){
+				addMessage(redirectAttributes, "审批失败,借款人档案信息有误,请确认!");
+				if (StringUtils.isNotBlank(workLoan.getHome()) && "home".equals(workLoan.getHome())) {
+					return "redirect:" + Global.getAdminPath() + "/home/?repage";
+				} else {
+					return "redirect:" + Global.getAdminPath() + "/workloan/workLoan/?repage";
+				}
+			}
+			if ("bmzr".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),2);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("fgld",2,office.getId(),"29",workLoan.getCreateBy());
+			}else  if ("fgld".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),3);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("cwzg", 3, office.getId(), "29", workLoan.getCreateBy());
+			}else  if ("cw".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),4);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("zjl",3,office.getId(),"29",workLoan.getCreateBy());
+			}else  if ("zjl".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),5);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("cwfgld",3,office.getId(),"29",workLoan.getCreateBy());
+			}else  if ("cwzj".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),6);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("cn",3,office.getId(),"29",workLoan.getCreateBy());
+			}else if ("cn".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),6);
+			}else if ("modifyApply".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workLoan.getProcessInstanceId(),1);
+			}
+			String flag = workLoan.getAct().getFlag();
+			if ("yes".equals(flag) &&(users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str =workLoanService.auditSave(workLoan,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			logger.info("Exception e:"+e);
+			addMessage(redirectAttributes, "审批失败");
+		}
+		if (StringUtils.isNotBlank(workLoan.getHome()) && "home".equals(workLoan.getHome())) {
+			return "redirect:" + Global.getAdminPath() + "/home/?repage";
+		} else {
+			return "redirect:" + Global.getAdminPath() + "/workloan/workLoan/?repage";
+		}
+	}
+
+	/**
+	 * 删除借款
+	 */
+	@RequiresPermissions("workloan:workLoan:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkLoan workLoan, RedirectAttributes redirectAttributes) {
+		workLoanService.delete(workLoan);
+		addMessage(redirectAttributes, "删除借款成功");
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+	}
+	
+	/**
+	 * 批量删除借款
+	 */
+	@RequiresPermissions("workloan:workLoan:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workLoanService.delete(workLoanService.get(id));
+		}
+		addMessage(redirectAttributes, "删除借款成功");
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+	}
+	@RequestMapping(value = "getProcessOne")
+	public String getProcessOne(WorkLoan workLoan,Model model) {
+		model.addAttribute("processInstanceId", workLoan.getProcessInstanceId());
+		return "modules/workloan/workTrack";
+	}
+	@RequestMapping("cancelInvalidate")
+	public String cancelInvalidate(WorkLoan workLoan,RedirectAttributes redirectAttributes){
+		try {
+			WorkLoan reportData =workLoanService.get(workLoan.getId());
+			if(reportData.getStatus().equals("5")){
+				addMessage(redirectAttributes, "申请已审批通过,无法撤回");
+			}else{
+				workLoanService.cancelInvalidate(workLoan);
+				addMessage(redirectAttributes, "申请撤回成功");
+			}
+		}catch (Exception e){
+			logger.error("Exception e"+e);
+			addMessage(redirectAttributes, "申请撤回失败");
+		}
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+	}
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workloan:workLoan:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkLoan workLoan, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "借款"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkLoan> page = workLoanService.findPage(new Page<WorkLoan>(request, response, -1), workLoan);
+    		new ExportExcel("借款", WorkLoan.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出借款记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workloan:workLoan:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkLoan> list = ei.getDataList(WorkLoan.class);
+			for (WorkLoan workLoan : list){
+				try{
+					workLoanService.save(workLoan);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条借款记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条借款记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入借款失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+    }
+	
+	/**
+	 * 下载导入借款数据模板
+	 */
+	@RequiresPermissions("workloan:workLoan:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "借款数据导入模板.xlsx";
+    		List<WorkLoan> list = Lists.newArrayList(); 
+    		new ExportExcel("借款数据", WorkLoan.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workloan/workLoan/?repage";
+    }
+
+	/**
+	 * 选择项目
+	 */
+	@RequestMapping(value = "selectproject")
+	public String selectReproject(String userId,ProjectRecords projectId, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		projectId.setCompany(UserUtils.getSelectCompany());
+		WorkStaffBasicInfo workStaffBasicInfo=workStaffBasicInfoService.getAchives(userId);
+		Page<ProjectRecords> page = projectRecordsService.findPageByRe(new Page<ProjectRecords>(request, response), projectId,workStaffBasicInfo.getUserId());
+		try {
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", projectId);
+		model.addAttribute("allowInput", true);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselectcallproject";
+	}
+
+	/**
+	 * 获取项目信息
+	 * @return
+	 */
+	@RequestMapping(value = "getProjectInfo")
+	@ResponseBody
+	public String getProjectInfo() {
+		HashMap<Object, Object> map = Maps.newHashMap();
+		String obj = request.getParameter("obj");
+		ProjectRecords projectRecords = projectRecordsService.getQueryProjectUsers(obj);
+		if(projectRecords != null){
+			WorkContractInfo workContractInfo = projectRecords.getWorkContractInfo();
+			if(workContractInfo!=null){
+				map.put("contractPrice",workContractInfo.getContractPrice()==null?"":workContractInfo.getContractPrice());
+				//合同未还款累计
+				if(StringUtils.isNotBlank(workContractInfo.getId())){
+					//未还款
+					List<WorkLoan> list1 = workLoanService.findListByContract(workContractInfo.getId(),"3");
+					double moneyCount= 0.00;//借款
+					for(int i=0;i<list1.size();i++){
+						WorkLoan workLoan = list1.get(i);
+						if(StringUtils.isNotBlank(workLoan.getMoney())){
+							moneyCount = moneyCount + Double.parseDouble(workLoan.getMoney());
+						}
+					}
+					//部分还款
+					List<WorkLoan> list2 = workLoanService.findListByContract(workContractInfo.getId(),"2");
+					for(int i=0;i<list2.size();i++){
+						WorkLoan workLoan = list2.get(i);
+						if(StringUtils.isNotBlank(workLoan.getMoney()) && StringUtils.isNotBlank(workLoan.getRepay())){
+							moneyCount = moneyCount + (Double.parseDouble(workLoan.getMoney()) - Double.parseDouble(workLoan.getRepay()));
+						}
+					}
+					map.put("contractNotRepay",moneyCount+"");
+				}else{
+					map.put("contractNotRepay","");
+				}
+			}
+		}
+		return JsonMapper.toJsonString(map);
+	}
+
+	/**
+	 * 获取项目信息
+	 * @return
+	 */
+	@RequestMapping(value = "userInfo")
+	@ResponseBody
+	public String userInfo() {
+		HashMap<Object, Object> map = Maps.newHashMap();
+		String id = request.getParameter("id");
+		WorkStaffBasicInfo workStaffBasicInfo = workStaffBasicInfoService.getAchives(id);
+		if(workStaffBasicInfo!=null && StringUtils.isNotBlank(workStaffBasicInfo.getUserId())){
+			double moneyCount= workLoanService.getnotRepay(workStaffBasicInfo);
+			map.put("notRepay",moneyCount+"");
+		}else {
+			map.put("notRepay", "");
+		}
+		return JsonMapper.toJsonString(map);
+	}
+}

+ 17 - 0
src/main/java/com/jeeplus/modules/worklog/dao/WorkLogDao.java

@@ -0,0 +1,17 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+
+
+@MyBatisDao
+public interface WorkLogDao extends CrudDao<WorkLog> {
+
+    int deleteByProId(WorkLog workLog);
+
+    WorkLog findListByProId(WorkLog workLog);
+}

+ 18 - 0
src/main/java/com/jeeplus/modules/worklog/dao/WorkMeetingDao.java

@@ -0,0 +1,18 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+
+
+@MyBatisDao
+public interface WorkMeetingDao extends CrudDao<WorkMeeting> {
+
+    int deleteByProId(WorkMeeting workMeeting);
+
+    WorkMeeting findListByProId(WorkMeeting workMeeting);
+}

+ 130 - 0
src/main/java/com/jeeplus/modules/worklog/entity/WorkLog.java

@@ -0,0 +1,130 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.entity;
+
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Area;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+
+import java.util.Date;
+import java.util.List;
+
+
+public class WorkLog extends DataEntity<WorkLog> {
+
+	private static final long serialVersionUID = 1L;
+	private String projectId;		// 项目编号
+	private String logType;     //日志类型
+	private Date startDate;     //日期
+	private Area area;      //区域
+	private String address;   //详细地址
+	private String weather;  //天气
+	private String lowTem; //低温
+	private String highTem; //高温
+	private String theme;    //日志主题
+	private String content;   //内容
+	private String wind;
+
+	public String getWind() {
+		return wind;
+	}
+
+	public void setWind(String wind) {
+		this.wind = wind;
+	}
+
+	public String getLogType() {
+		return logType;
+	}
+
+	public void setLogType(String logType) {
+		this.logType = logType;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getWeather() {
+		return weather;
+	}
+
+	public void setWeather(String weather) {
+		this.weather = weather;
+	}
+
+	public String getLowTem() {
+		return lowTem;
+	}
+
+	public void setLowTem(String lowTem) {
+		this.lowTem = lowTem;
+	}
+
+	public String getHighTem() {
+		return highTem;
+	}
+
+	public void setHighTem(String highTem) {
+		this.highTem = highTem;
+	}
+
+	public String getTheme() {
+		return theme;
+	}
+
+	public void setTheme(String theme) {
+		this.theme = theme;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+
+	public WorkLog() {
+		super();
+	}
+
+	public WorkLog(String id){
+		super(id);
+	}
+
+
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+}

+ 128 - 0
src/main/java/com/jeeplus/modules/worklog/entity/WorkMeeting.java

@@ -0,0 +1,128 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.modules.sys.entity.Area;
+
+import java.util.Date;
+
+
+public class WorkMeeting extends DataEntity<WorkMeeting> {
+
+	private static final long serialVersionUID = 1L;
+	private String projectId;		// 项目编号
+	private String meetType;     //类型
+	private Date startDate;     //日期
+	private Area area;      //区域
+	private String address;   //详细地址
+	private String weather;  //天气
+	private String lowTem; //低温
+	private String highTem; //高温
+	private String theme;    //主题
+	private String content;   //内容
+	private String wind;
+
+
+	public String getWind() {
+		return wind;
+	}
+
+	public void setWind(String wind) {
+		this.wind = wind;
+	}
+
+	public String getMeetType() {
+		return meetType;
+	}
+
+	public void setMeetType(String meetType) {
+		this.meetType = meetType;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+
+
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+
+	public String getWeather() {
+		return weather;
+	}
+
+	public void setWeather(String weather) {
+		this.weather = weather;
+	}
+
+	public String getLowTem() {
+		return lowTem;
+	}
+
+	public void setLowTem(String lowTem) {
+		this.lowTem = lowTem;
+	}
+
+	public String getHighTem() {
+		return highTem;
+	}
+
+	public void setHighTem(String highTem) {
+		this.highTem = highTem;
+	}
+
+	public String getTheme() {
+		return theme;
+	}
+
+	public void setTheme(String theme) {
+		this.theme = theme;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+
+	public WorkMeeting() {
+		super();
+	}
+
+	public WorkMeeting(String id){
+		super(id);
+	}
+
+
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+
+	public Area getArea() {
+		return area;
+	}
+
+	public void setArea(Area area) {
+		this.area = area;
+	}
+}

+ 56 - 0
src/main/java/com/jeeplus/modules/worklog/service/WorkLogService.java

@@ -0,0 +1,56 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.worklog.dao.WorkLogDao;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+@Service
+@Transactional(readOnly = true)
+public class WorkLogService extends CrudService<WorkLogDao, WorkLog> {
+
+	@Autowired
+	private WorkLogDao workLogDao;
+	@Autowired
+	private WorkClientAttachmentDao workClientAttachmentDao;
+
+	public WorkLog get(String id) {
+		WorkLog workLog =  super.get(id);
+		return workLog;
+	}
+	
+	public List<WorkLog> findList(WorkLog workLog) {
+		return super.findList(workLog);
+	}
+	
+	public Page<WorkLog> findPage(Page<WorkLog> page, WorkLog workLog) {
+		return super.findPage(page, workLog);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkLog workLog) {
+		super.save(workLog);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkLog workLog) {
+		super.delete(workLog);
+	}
+
+
+	public WorkLog findListByProId(WorkLog workLog){
+		return workLogDao.findListByProId(workLog);
+	}
+	
+}

+ 57 - 0
src/main/java/com/jeeplus/modules/worklog/service/WorkMeetingService.java

@@ -0,0 +1,57 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.worklog.dao.WorkMeetingDao;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+import com.jeeplus.modules.worklog.dao.WorkMeetingDao;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+@Service
+@Transactional(readOnly = true)
+public class WorkMeetingService extends CrudService<WorkMeetingDao, WorkMeeting> {
+
+	@Autowired
+	private WorkMeetingDao workMeetingDao;
+	@Autowired
+	private WorkClientAttachmentDao workClientAttachmentDao;
+
+	public WorkMeeting get(String id) {
+		WorkMeeting workMeeting =  super.get(id);
+		return workMeeting;
+	}
+	
+	public List<WorkMeeting> findList(WorkMeeting workMeeting) {
+		return super.findList(workMeeting);
+	}
+	
+	public Page<WorkMeeting> findPage(Page<WorkMeeting> page, WorkMeeting workMeeting) {
+		return super.findPage(page, workMeeting);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkMeeting workMeeting) {
+		super.save(workMeeting);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkMeeting workMeeting) {
+		super.delete(workMeeting);
+	}
+
+
+	public WorkMeeting findListByProId(WorkMeeting workMeeting){
+		return workMeetingDao.findListByProId(workMeeting);
+	}
+	
+}

+ 211 - 0
src/main/java/com/jeeplus/modules/worklog/web/WorkLogController.java

@@ -0,0 +1,211 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.HttpClientUtil;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.worklog.entity.WorkLog;
+import com.jeeplus.modules.worklog.service.WorkLogService;
+import net.sf.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+@Controller
+@RequestMapping(value = "${adminPath}/worklog/workLog")
+public class WorkLogController extends BaseController {
+
+	@Autowired
+	private WorkLogService workLogService;
+	
+	@ModelAttribute
+	public WorkLog get(@RequestParam(required=false) String id) {
+		WorkLog entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workLogService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkLog();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 日志列表页面
+	 */
+//	@RequiresPermissions("worklog:worklog:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkLog workLog, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkLog> page = workLogService.findPage(new Page<WorkLog>(request, response), workLog); 
+		model.addAttribute("page", page);
+		return "modules/worklog/workLogList";
+	}
+
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+//	@RequiresPermissions(value={"worklog:worklog:view","worklog:worklog:add","worklog:worklog:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkLog workLog,HttpServletRequest request, Model model) {
+		String view = request.getParameter("view");
+		if("view".equals(view)){
+			view = "modules/worklog/workLogFormView";
+		}else{
+			view = "modules/worklog/workLogForm";
+		}
+		if(!Strings.isNullOrEmpty(workLog.getProjectId())){
+			workLog = workLogService.get(workLog.getProjectId());
+		}
+		model.addAttribute("workLog", workLog);
+		return view;
+	}
+
+	/**
+	 * 保存记录
+	 */
+//	@RequiresPermissions(value={"worklog:worklog:add","worklog:worklog:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkLog workLog, HttpServletRequest request,Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workLog)){
+			return form(workLog,request, model);
+		}
+		if(!workLog.getIsNewRecord()){//编辑表单保存
+			WorkLog t = workLogService.get(workLog.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workLog, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workLogService.save(t);//保存
+		}else{//新增表单保存
+			workLogService.save(workLog);//保存
+		}
+		addMessage(redirectAttributes, "保存记录成功");
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+	}
+	
+
+//	@RequiresPermissions("worklog:worklog:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkLog workLog, RedirectAttributes redirectAttributes) {
+		workLogService.delete(workLog);
+		addMessage(redirectAttributes, "删除日志成功");
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+	}
+	
+
+//	@RequiresPermissions("worklog:worklog:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workLogService.delete(workLogService.get(id));
+		}
+		addMessage(redirectAttributes, "删除日志成功");
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+//	@RequiresPermissions("worklog:worklog:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkLog workLog, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "日志"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkLog> page = workLogService.findPage(new Page<WorkLog>(request, response, -1), workLog);
+    		new ExportExcel("日志", WorkLog.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出日志失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+//	@RequiresPermissions("worklog:worklog:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkLog> list = ei.getDataList(WorkLog.class);
+			for (WorkLog workLog : list){
+				try{
+					workLogService.save(workLog);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+    }
+	
+	/**
+	 * 下载导入现场踏勘记录数据模板
+	 */
+//	@RequiresPermissions("worklog:worklog:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "日志导入模板.xlsx";
+    		List<WorkLog> list = Lists.newArrayList(); 
+    		new ExportExcel("日志", WorkLog.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/worklog/worklog/?repage";
+    }
+
+    @ResponseBody
+	@RequestMapping(value = "getWeather")
+	public Map getWeather(String code){
+    	Map map = new HashMap();
+    	try {
+			String url = "http://t.weather.sojson.com/api/weather/city/" + code;
+			JSONObject jsonObject = HttpClientUtil.httpRequest(url, "GET", null);
+			map.put("code", 1);
+			map.put("data", jsonObject);
+		}catch (Exception e){
+    		map.put("code",0);
+		}
+
+		return map;
+	}
+	
+	
+	
+
+}

+ 195 - 0
src/main/java/com/jeeplus/modules/worklog/web/WorkMeetingController.java

@@ -0,0 +1,195 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.worklog.web;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.worklog.entity.WorkMeeting;
+import com.jeeplus.modules.worklog.service.WorkLogService;
+import com.jeeplus.modules.worklog.service.WorkMeetingService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+
+
+@Controller
+@RequestMapping(value = "${adminPath}/workmeeting/workMeeting")
+public class WorkMeetingController extends BaseController {
+
+	@Autowired
+	private WorkMeetingService workMeetingService;
+	
+	@ModelAttribute
+	public WorkMeeting get(@RequestParam(required=false) String id) {
+		WorkMeeting entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workMeetingService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkMeeting();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 日志列表页面
+	 */
+//	@RequiresPermissions("workMeeting:workMeeting:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkMeeting workMeeting, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkMeeting> page = workMeetingService.findPage(new Page<WorkMeeting>(request, response), workMeeting); 
+		model.addAttribute("page", page);
+		return "modules/workMeeting/workMeetingList";
+	}
+
+	/**
+	 * 查看,增加,编辑表单页面
+	 */
+//	@RequiresPermissions(value={"workMeeting:workMeeting:view","workMeeting:workMeeting:add","workMeeting:workMeeting:edit"},Meetingical=Meetingical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkMeeting workMeeting,HttpServletRequest request, Model model) {
+		String view = request.getParameter("view");
+		if("view".equals(view)){
+			view = "modules/worklog/workMeetFormView";
+		}else{
+			view = "modules/worklog/workMeetingForm";
+		}
+		if(!Strings.isNullOrEmpty(workMeeting.getProjectId())){
+			workMeeting = workMeetingService.get(workMeeting.getProjectId());
+		}
+		model.addAttribute("workMeeting", workMeeting);
+		return view;
+	}
+
+	/**
+	 * 保存记录
+	 */
+//	@RequiresPermissions(value={"workMeeting:workMeeting:add","workMeeting:workMeeting:edit"},Meetingical=Meetingical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkMeeting workMeeting, HttpServletRequest request,Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workMeeting)){
+			return form(workMeeting,request, model);
+		}
+		if(!workMeeting.getIsNewRecord()){//编辑表单保存
+			WorkMeeting t = workMeetingService.get(workMeeting.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workMeeting, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workMeetingService.save(t);//保存
+		}else{//新增表单保存
+			workMeetingService.save(workMeeting);//保存
+		}
+		addMessage(redirectAttributes, "保存记录成功");
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+	}
+	
+
+//	@RequiresPermissions("workMeeting:workMeeting:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkMeeting workMeeting, RedirectAttributes redirectAttributes) {
+		workMeetingService.delete(workMeeting);
+		addMessage(redirectAttributes, "删除日志成功");
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+	}
+	
+
+//	@RequiresPermissions("workMeeting:workMeeting:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workMeetingService.delete(workMeetingService.get(id));
+		}
+		addMessage(redirectAttributes, "删除日志成功");
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+//	@RequiresPermissions("workMeeting:workMeeting:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkMeeting workMeeting, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "日志"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkMeeting> page = workMeetingService.findPage(new Page<WorkMeeting>(request, response, -1), workMeeting);
+    		new ExportExcel("日志", WorkMeeting.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出日志失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+//	@RequiresPermissions("workMeeting:workMeeting:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkMeeting> list = ei.getDataList(WorkMeeting.class);
+			for (WorkMeeting workMeeting : list){
+				try{
+					workMeetingService.save(workMeeting);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+    }
+	
+	/**
+	 * 下载导入现场踏勘记录数据模板
+	 */
+//	@RequiresPermissions("workMeeting:workMeeting:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "日志导入模板.xlsx";
+    		List<WorkMeeting> list = Lists.newArrayList(); 
+    		new ExportExcel("日志", WorkMeeting.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workMeeting/workMeeting/?repage";
+    }
+	
+	
+	
+
+}

+ 24 - 0
src/main/java/com/jeeplus/modules/workmeeting/dao/WorkmeetinginfoDao.java

@@ -0,0 +1,24 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinginfo;
+
+import java.util.List;
+
+/**
+ * 会议信息DAO接口
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@MyBatisDao
+public interface WorkmeetinginfoDao extends CrudDao<Workmeetinginfo> {
+
+    public Workmeetinginfo getByRoomName(String roomName);
+    public int updateByRoomName(Workmeetinginfo workmeetinginfo);
+    public int deleteByRoomName(String roomName);
+    public List<Workmeetinginfo>  findListBystatus(String status);
+}

+ 29 - 0
src/main/java/com/jeeplus/modules/workmeeting/dao/WorkmeetinguserDao.java

@@ -0,0 +1,29 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinguser;
+
+import java.util.List;
+
+/**
+ * 会议用户信息DAO接口
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@MyBatisDao
+public interface WorkmeetinguserDao extends CrudDao<Workmeetinguser> {
+
+    public List<Workmeetinguser> getByMeetingId(Workmeetinguser workmeetinguser);
+    public Workmeetinguser getByMeetingIdAndUser(Workmeetinguser workmeetinguser);
+
+    public List<Workmeetinguser> getByUserId(Workmeetinguser workmeetinguser);
+
+    public int updateByRoomName(Workmeetinguser workmeetinguser);
+    public int updateByUser(Workmeetinguser workmeetinguser);
+    public int deleteByRoomName(String roomName);
+
+}

+ 47 - 0
src/main/java/com/jeeplus/modules/workmeeting/entity/Workmeetinginfo.java

@@ -0,0 +1,47 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 会议信息Entity
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+public class Workmeetinginfo extends DataEntity<Workmeetinginfo> {
+	
+	private static final long serialVersionUID = 1L;
+	private String roomName;		// 房间名
+	private String status;		// 房间状态
+	
+	public Workmeetinginfo() {
+		super();
+	}
+
+	public Workmeetinginfo(String id){
+		super(id);
+	}
+
+	@ExcelField(title="房间名", align=2, sort=7)
+	public String getRoomName() {
+		return roomName;
+	}
+
+	public void setRoomName(String roomName) {
+		this.roomName = roomName;
+	}
+	
+	@ExcelField(title="房间状态", align=2, sort=8)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+}

+ 68 - 0
src/main/java/com/jeeplus/modules/workmeeting/entity/Workmeetinguser.java

@@ -0,0 +1,68 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.entity;
+
+import com.jeeplus.modules.sys.entity.User;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 会议用户信息Entity
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+public class Workmeetinguser extends DataEntity<Workmeetinguser> {
+	
+	private static final long serialVersionUID = 1L;
+	private String type;		// 用户类型 (1:发起者;2:加入者)
+	private User user;		// 用户id
+	private String meetingId;		// 会议id
+	private String status;		// 用户状态(1:开会中;2:拒绝;3:退出;4;结束)
+	
+	public Workmeetinguser() {
+		super();
+	}
+
+	public Workmeetinguser(String id){
+		super(id);
+	}
+
+	@ExcelField(title="用户类型 (0:发起者;1:加入者)", align=2, sort=7)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	@ExcelField(title="用户id", align=2, sort=8)
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	@ExcelField(title="会议id", align=2, sort=9)
+	public String getMeetingId() {
+		return meetingId;
+	}
+
+	public void setMeetingId(String meetingId) {
+		this.meetingId = meetingId;
+	}
+
+	@ExcelField(title="用户状态(1:开会中;2:拒绝;3:退出;4;结束)", align=2, sort=10)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+}

+ 67 - 0
src/main/java/com/jeeplus/modules/workmeeting/service/WorkmeetinginfoService.java

@@ -0,0 +1,67 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinginfo;
+import com.jeeplus.modules.workmeeting.dao.WorkmeetinginfoDao;
+
+/**
+ * 会议信息Service
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkmeetinginfoService extends CrudService<WorkmeetinginfoDao, Workmeetinginfo> {
+
+	public Workmeetinginfo get(String id) {
+		return super.get(id);
+	}
+
+	public Workmeetinginfo getByRoomName(String roomName) {
+		return dao.getByRoomName(roomName);
+	}
+
+	public List<Workmeetinginfo> findListBystatus(String status) {
+		return dao.findListBystatus(status);
+	}
+
+	@Transactional(readOnly = false)
+	public int updateByRoomName(Workmeetinginfo workmeetinginfo) {
+		return dao.updateByRoomName(workmeetinginfo);
+	}
+
+	public List<Workmeetinginfo> findList(Workmeetinginfo workmeetinginfo) {
+		return super.findList(workmeetinginfo);
+	}
+	
+	public Page<Workmeetinginfo> findPage(Page<Workmeetinginfo> page, Workmeetinginfo workmeetinginfo) {
+		return super.findPage(page, workmeetinginfo);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Workmeetinginfo workmeetinginfo) {
+		super.save(workmeetinginfo);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(Workmeetinginfo workmeetinginfo) {
+		super.delete(workmeetinginfo);
+	}
+	@Transactional(readOnly = false)
+	public int deleteByRoomName(String roomName) {
+		return dao.deleteByRoomName(roomName);
+	}
+
+	
+	
+	
+}

+ 73 - 0
src/main/java/com/jeeplus/modules/workmeeting/service/WorkmeetinguserService.java

@@ -0,0 +1,73 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinguser;
+import com.jeeplus.modules.workmeeting.dao.WorkmeetinguserDao;
+
+/**
+ * 会议用户信息Service
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkmeetinguserService extends CrudService<WorkmeetinguserDao, Workmeetinguser> {
+
+	public Workmeetinguser get(String id) {
+		return super.get(id);
+	}
+
+	public List<Workmeetinguser> getByMeetingId(Workmeetinguser workmeetinguser) {
+		return dao.getByMeetingId(workmeetinguser);
+	}
+
+	public Workmeetinguser getByMeetingIdAndUser(Workmeetinguser workmeetinguser) {
+		return dao.getByMeetingIdAndUser(workmeetinguser);
+	}
+	public List<Workmeetinguser> getByUserId(Workmeetinguser workmeetinguser) {
+		return dao.getByUserId(workmeetinguser);
+	}
+
+	public List<Workmeetinguser> findList(Workmeetinguser workmeetinguser) {
+		return super.findList(workmeetinguser);
+	}
+	
+	public Page<Workmeetinguser> findPage(Page<Workmeetinguser> page, Workmeetinguser workmeetinguser) {
+		return super.findPage(page, workmeetinguser);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(Workmeetinguser workmeetinguser) {
+		super.save(workmeetinguser);
+	}
+	@Transactional(readOnly = false)
+	public void updateByRoomName(Workmeetinguser workmeetinguser) {
+		dao.updateByRoomName(workmeetinguser);
+	}
+	@Transactional(readOnly = false)
+	public void updateByUser(Workmeetinguser workmeetinguser) {
+		dao.updateByUser(workmeetinguser);
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(Workmeetinguser workmeetinguser) {
+		super.delete(workmeetinguser);
+	}
+	@Transactional(readOnly = false)
+	public void deleteByRoomName(String roomName) {
+		dao.deleteByRoomName(roomName);
+	}
+
+	
+	
+	
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/workmeeting/web/WorkmeetinginfoController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinginfo;
+import com.jeeplus.modules.workmeeting.service.WorkmeetinginfoService;
+
+/**
+ * 会议信息Controller
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workmeeting/workmeetinginfo")
+public class WorkmeetinginfoController extends BaseController {
+
+	@Autowired
+	private WorkmeetinginfoService workmeetinginfoService;
+	
+	@ModelAttribute
+	public Workmeetinginfo get(@RequestParam(required=false) String id) {
+		Workmeetinginfo entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workmeetinginfoService.get(id);
+		}
+		if (entity == null){
+			entity = new Workmeetinginfo();
+		}
+		return entity;
+	}
+	
+	/**
+	 * workmeeting列表页面
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Workmeetinginfo workmeetinginfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Workmeetinginfo> page = workmeetinginfoService.findPage(new Page<Workmeetinginfo>(request, response), workmeetinginfo); 
+		model.addAttribute("page", page);
+		return "modules/workmeeting/workmeetinginfoList";
+	}
+
+	/**
+	 * 查看,增加,编辑workmeeting表单页面
+	 */
+	@RequiresPermissions(value={"workmeeting:workmeetinginfo:view","workmeeting:workmeetinginfo:add","workmeeting:workmeetinginfo:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Workmeetinginfo workmeetinginfo, Model model) {
+		model.addAttribute("workmeetinginfo", workmeetinginfo);
+		return "modules/workmeeting/workmeetinginfoForm";
+	}
+
+	/**
+	 * 保存workmeeting
+	 */
+	@RequiresPermissions(value={"workmeeting:workmeetinginfo:add","workmeeting:workmeetinginfo:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Workmeetinginfo workmeetinginfo, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workmeetinginfo)){
+			return form(workmeetinginfo, model);
+		}
+		if(!workmeetinginfo.getIsNewRecord()){//编辑表单保存
+			Workmeetinginfo t = workmeetinginfoService.get(workmeetinginfo.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workmeetinginfo, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workmeetinginfoService.save(t);//保存
+		}else{//新增表单保存
+			workmeetinginfoService.save(workmeetinginfo);//保存
+		}
+		addMessage(redirectAttributes, "保存workmeeting成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+	}
+	
+	/**
+	 * 删除workmeeting
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:del")
+	@RequestMapping(value = "delete")
+	public String delete(Workmeetinginfo workmeetinginfo, RedirectAttributes redirectAttributes) {
+		workmeetinginfoService.delete(workmeetinginfo);
+		addMessage(redirectAttributes, "删除workmeeting成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+	}
+	
+	/**
+	 * 批量删除workmeeting
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workmeetinginfoService.delete(workmeetinginfoService.get(id));
+		}
+		addMessage(redirectAttributes, "删除workmeeting成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Workmeetinginfo workmeetinginfo, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "workmeeting"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Workmeetinginfo> page = workmeetinginfoService.findPage(new Page<Workmeetinginfo>(request, response, -1), workmeetinginfo);
+    		new ExportExcel("workmeeting", Workmeetinginfo.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出workmeeting记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Workmeetinginfo> list = ei.getDataList(Workmeetinginfo.class);
+			for (Workmeetinginfo workmeetinginfo : list){
+				try{
+					workmeetinginfoService.save(workmeetinginfo);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条workmeeting记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条workmeeting记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入workmeeting失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+    }
+	
+	/**
+	 * 下载导入workmeeting数据模板
+	 */
+	@RequiresPermissions("workmeeting:workmeetinginfo:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "workmeeting数据导入模板.xlsx";
+    		List<Workmeetinginfo> list = Lists.newArrayList(); 
+    		new ExportExcel("workmeeting数据", Workmeetinginfo.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinginfo/?repage";
+    }
+	
+	
+	
+
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/workmeeting/web/WorkmeetinguserController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmeeting.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workmeeting.entity.Workmeetinguser;
+import com.jeeplus.modules.workmeeting.service.WorkmeetinguserService;
+
+/**
+ * 会议用户信息Controller
+ * @author 杨帆
+ * @version 2018-03-05
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workmeeting/workmeetinguser")
+public class WorkmeetinguserController extends BaseController {
+
+	@Autowired
+	private WorkmeetinguserService workmeetinguserService;
+	
+	@ModelAttribute
+	public Workmeetinguser get(@RequestParam(required=false) String id) {
+		Workmeetinguser entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workmeetinguserService.get(id);
+		}
+		if (entity == null){
+			entity = new Workmeetinguser();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 会议用户信息列表页面
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(Workmeetinguser workmeetinguser, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<Workmeetinguser> page = workmeetinguserService.findPage(new Page<Workmeetinguser>(request, response), workmeetinguser); 
+		model.addAttribute("page", page);
+		return "modules/workmeeting/workmeetinguserList";
+	}
+
+	/**
+	 * 查看,增加,编辑会议用户信息表单页面
+	 */
+	@RequiresPermissions(value={"workmeeting:workmeetinguser:view","workmeeting:workmeetinguser:add","workmeeting:workmeetinguser:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(Workmeetinguser workmeetinguser, Model model) {
+		model.addAttribute("workmeetinguser", workmeetinguser);
+		return "modules/workmeeting/workmeetinguserForm";
+	}
+
+	/**
+	 * 保存会议用户信息
+	 */
+	@RequiresPermissions(value={"workmeeting:workmeetinguser:add","workmeeting:workmeetinguser:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(Workmeetinguser workmeetinguser, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workmeetinguser)){
+			return form(workmeetinguser, model);
+		}
+		if(!workmeetinguser.getIsNewRecord()){//编辑表单保存
+			Workmeetinguser t = workmeetinguserService.get(workmeetinguser.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workmeetinguser, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workmeetinguserService.save(t);//保存
+		}else{//新增表单保存
+			workmeetinguserService.save(workmeetinguser);//保存
+		}
+		addMessage(redirectAttributes, "保存会议用户信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+	}
+	
+	/**
+	 * 删除会议用户信息
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:del")
+	@RequestMapping(value = "delete")
+	public String delete(Workmeetinguser workmeetinguser, RedirectAttributes redirectAttributes) {
+		workmeetinguserService.delete(workmeetinguser);
+		addMessage(redirectAttributes, "删除会议用户信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+	}
+	
+	/**
+	 * 批量删除会议用户信息
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workmeetinguserService.delete(workmeetinguserService.get(id));
+		}
+		addMessage(redirectAttributes, "删除会议用户信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(Workmeetinguser workmeetinguser, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "会议用户信息"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<Workmeetinguser> page = workmeetinguserService.findPage(new Page<Workmeetinguser>(request, response, -1), workmeetinguser);
+    		new ExportExcel("会议用户信息", Workmeetinguser.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出会议用户信息记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<Workmeetinguser> list = ei.getDataList(Workmeetinguser.class);
+			for (Workmeetinguser workmeetinguser : list){
+				try{
+					workmeetinguserService.save(workmeetinguser);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条会议用户信息记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条会议用户信息记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入会议用户信息失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+    }
+	
+	/**
+	 * 下载导入会议用户信息数据模板
+	 */
+	@RequiresPermissions("workmeeting:workmeetinguser:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "会议用户信息数据导入模板.xlsx";
+    		List<Workmeetinguser> list = Lists.newArrayList(); 
+    		new ExportExcel("会议用户信息数据", Workmeetinguser.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmeeting/workmeetinguser/?repage";
+    }
+	
+	
+	
+
+}

+ 33 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/dao/WorkMonthlyPlanDao.java

@@ -0,0 +1,33 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlan;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 月计划管理DAO接口
+ * @author cyp
+ * @version 2018-06-27
+ */
+@MyBatisDao
+public interface WorkMonthlyPlanDao extends CrudDao<WorkMonthlyPlan> {
+    public List<WorkMonthlyPlan> findHisList(String officeId);
+
+	public void deleteWorkMonthlyPlanThis(WorkMonthlyPlan workMonthlyPlan);
+
+	public WorkMonthlyPlan getThisMaxMonthly(String officeId);
+
+    public List<WorkMonthlyPlan> getMonthly(WorkMonthlyPlan workMonthlyPlan);
+    public WorkMonthlyPlan getMonthlyRew(WorkMonthlyPlan workMonthlyPlan);
+    public List<WorkClientInfo> clientInfoList();
+
+    public WorkMonthlyPlanThis getBeforeThisMonthMoney(WorkMonthlyPlanThis workMonthlyPlanThis);
+}

+ 22 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/dao/WorkMonthlyPlanThisDao.java

@@ -0,0 +1,22 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+
+import java.util.List;
+
+/**
+ * 本月计划DAO接口
+ * @author cyp
+ * @version 2018-06-27
+ */
+@MyBatisDao
+public interface WorkMonthlyPlanThisDao extends CrudDao<WorkMonthlyPlanThis> {
+	public List<WorkMonthlyPlanThis> findByWorkMonthlyPlanId(String workMonthlyPlanId);
+	public List<WorkMonthlyPlanThis> findByWorkMonthlyPlanThis(String workMonthlyPlanId);
+	public List<WorkMonthlyPlanThis> findHisList(String officeId);
+}

+ 154 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/entity/WorkMonthlyPlan.java

@@ -0,0 +1,154 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.entity;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workreimbursement.entity.WorkAccount;
+
+/**
+ * 月计划管理Entity
+ * @author cyp
+ * @version 2018-06-27
+ */
+public class WorkMonthlyPlan extends DataEntity<WorkMonthlyPlan> {
+	
+	private static final long serialVersionUID = 1L;
+	private Date planMonthly;		// 计划月份
+	private String officeId;		// 所属部门
+	private String planStatus;		// 计划状态
+	private String companyId;		// 所属公司
+	private BigDecimal yearSumMoney;//年度收款计划
+	private BigDecimal beforeSumMoney;//本月前已收款
+	private BigDecimal remainingSumMoney;//剩余计划
+	private BigDecimal thisSumMoney;//本月计划收款
+	private String officeName;
+	private String name;
+	private BigDecimal estimatePrice;
+	private BigDecimal accumulativePrice;
+
+	public BigDecimal getEstimatePrice() {
+		return estimatePrice;
+	}
+
+	public void setEstimatePrice(BigDecimal estimatePrice) {
+		this.estimatePrice = estimatePrice;
+	}
+
+	public BigDecimal getAccumulativePrice() {
+		return accumulativePrice;
+	}
+
+	public void setAccumulativePrice(BigDecimal accumulativePrice) {
+		this.accumulativePrice = accumulativePrice;
+	}
+
+	private List<WorkMonthlyPlanThis> workMonthlyPlanThisList = Lists.newArrayList();
+	public List<WorkMonthlyPlanThis> getWorkMonthlyPlanThisList() {
+		return workMonthlyPlanThisList;
+	}
+	public void setWorkMonthlyPlanThisList(List<WorkMonthlyPlanThis> workMonthlyPlanThisList) {
+		this.workMonthlyPlanThisList = workMonthlyPlanThisList;
+	}
+	public BigDecimal getYearSumMoney() {
+		return yearSumMoney;
+	}
+
+	public void setYearSumMoney(BigDecimal yearSumMoney) {
+		this.yearSumMoney = yearSumMoney;
+	}
+
+	public BigDecimal getBeforeSumMoney() {
+		return beforeSumMoney;
+	}
+
+	public void setBeforeSumMoney(BigDecimal beforeSumMoney) {
+		this.beforeSumMoney = beforeSumMoney;
+	}
+
+	public BigDecimal getRemainingSumMoney() {
+		return remainingSumMoney;
+	}
+
+	public void setRemainingSumMoney(BigDecimal remainingSumMoney) {
+		this.remainingSumMoney = remainingSumMoney;
+	}
+
+	public BigDecimal getThisSumMoney() {
+		return thisSumMoney;
+	}
+
+	public void setThisSumMoney(BigDecimal thisSumMoney) {
+		this.thisSumMoney = thisSumMoney;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public WorkMonthlyPlan() {
+		super();
+	}
+
+	public WorkMonthlyPlan(String id){
+		super(id);
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="计划月份", align=2, sort=7)
+	public Date getPlanMonthly() {
+		return planMonthly;
+	}
+
+	public void setPlanMonthly(Date planMonthly) {
+		this.planMonthly = planMonthly;
+	}
+	
+	@ExcelField(title="所属部门", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="计划状态", align=2, sort=9)
+	public String getPlanStatus() {
+		return planStatus;
+	}
+
+	public void setPlanStatus(String planStatus) {
+		this.planStatus = planStatus;
+	}
+	
+	@ExcelField(title="所属公司", align=2, sort=10)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+}

+ 168 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/entity/WorkMonthlyPlanThis.java

@@ -0,0 +1,168 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.math.BigDecimal;
+
+/**
+ * 本月计划Entity
+ * @author cyp
+ * @version 2018-06-27
+ */
+public class WorkMonthlyPlanThis extends DataEntity<WorkMonthlyPlanThis> {
+	
+	private static final long serialVersionUID = 1L;
+	private WorkMonthlyPlan workMonthlyPlan;		// 月计划表主键
+	private String workMonthlyPlanId;
+	private String workClientInfoId;		// 合同信息表主键
+	private BigDecimal annualCollectionPlan;		// 年度收款计划
+	private BigDecimal  beforeThisMonthMoney;		// 本月前已收款
+	private BigDecimal remainingPlan;		// 剩余计划
+	private BigDecimal thisMonthPlanMoney;		// 本月计划收款
+	private String clientName; //委托方姓名
+	private BigDecimal estimatePrice;
+	private BigDecimal accumulativePrice;
+	private String contractNum;
+	private String contractName;
+	private String contractId;
+	private String planMonthly;
+	private String officeName;
+	@ExcelField(title="所属部门", align=2, sort=2)
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public String getContractId() {
+		return contractId;
+	}
+
+	public void setContractId(String contractId) {
+		this.contractId = contractId;
+	}
+	@ExcelField(title="计划月份", align=2, sort=1)
+	public String getPlanMonthly() {
+		return planMonthly;
+	}
+
+	public void setPlanMonthly(String planMonthly) {
+		this.planMonthly = planMonthly;
+	}
+	@ExcelField(title="合同预计收费", align=2, sort=6)
+	public BigDecimal getEstimatePrice() {
+		return estimatePrice;
+	}
+
+	public void setEstimatePrice(BigDecimal estimatePrice) {
+		this.estimatePrice = estimatePrice;
+	}
+	@ExcelField(title="合同累计收费", align=2, sort=7)
+	public BigDecimal getAccumulativePrice() {
+		return accumulativePrice;
+	}
+
+	public void setAccumulativePrice(BigDecimal accumulativePrice) {
+		this.accumulativePrice = accumulativePrice;
+	}
+	@ExcelField(title="合同编号", align=2, sort=4)
+	public String getContractNum() {
+		return contractNum;
+	}
+
+	public void setContractNum(String contractNum) {
+		this.contractNum = contractNum;
+	}
+	@ExcelField(title="合同名称", align=2, sort=3)
+	public String getContractName() {
+		return contractName;
+	}
+
+	public void setContractName(String contractName) {
+		this.contractName = contractName;
+	}
+
+	@ExcelField(title="主委托方", align=2, sort=5)
+	public String getClientName() {
+		return clientName;
+	}
+
+	public void setClientName(String clientName) {
+		this.clientName = clientName;
+	}
+
+	public String getWorkMonthlyPlanId() {
+		return workMonthlyPlanId;
+	}
+
+	public void setWorkMonthlyPlanId(String workMonthlyPlanId) {
+		this.workMonthlyPlanId = workMonthlyPlanId;
+	}
+	@ExcelField(title="本年度预计收费", align=2, sort=8)
+	public BigDecimal getAnnualCollectionPlan() {
+		return annualCollectionPlan;
+	}
+
+	public void setAnnualCollectionPlan(BigDecimal annualCollectionPlan) {
+		this.annualCollectionPlan = annualCollectionPlan;
+	}
+	@ExcelField(title="本年度已收费", align=2, sort=9)
+	public BigDecimal getBeforeThisMonthMoney() {
+		return beforeThisMonthMoney;
+	}
+
+	public void setBeforeThisMonthMoney(BigDecimal beforeThisMonthMoney) {
+		this.beforeThisMonthMoney = beforeThisMonthMoney;
+	}
+
+	public BigDecimal getRemainingPlan() {
+		return remainingPlan;
+	}
+
+	public void setRemainingPlan(BigDecimal remainingPlan) {
+		this.remainingPlan = remainingPlan;
+	}
+	@ExcelField(title="本月计划收费", align=2, sort=10)
+	public BigDecimal getThisMonthPlanMoney() {
+		return thisMonthPlanMoney;
+	}
+
+	public void setThisMonthPlanMoney(BigDecimal thisMonthPlanMoney) {
+		this.thisMonthPlanMoney = thisMonthPlanMoney;
+	}
+
+	public WorkMonthlyPlanThis() {
+		super();
+	}
+
+	public WorkMonthlyPlanThis(String id){
+		super(id);
+	}
+
+	public WorkMonthlyPlan getWorkMonthlyPlan() {
+		return workMonthlyPlan;
+	}
+
+	public void setWorkMonthlyPlan(WorkMonthlyPlan workMonthlyPlan) {
+		this.workMonthlyPlan = workMonthlyPlan;
+	}
+
+	public String getWorkClientInfoId() {
+		return workClientInfoId;
+	}
+
+	public void setWorkClientInfoId(String workClientInfoId) {
+		this.workClientInfoId = workClientInfoId;
+	}
+
+	public static long getSerialVersionUID() {
+		return serialVersionUID;
+	}
+}

+ 212 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/service/WorkMonthlyPlanService.java

@@ -0,0 +1,212 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.service;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientBank;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workcontractinfo.dao.WorkContractInfoDao;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workmonthlyplan.dao.WorkMonthlyPlanThisDao;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlan;
+import com.jeeplus.modules.workmonthlyplan.dao.WorkMonthlyPlanDao;
+
+/**
+ * 月计划管理Service
+ * @author cyp
+ * @version 2018-06-27
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkMonthlyPlanService extends CrudService<WorkMonthlyPlanDao, WorkMonthlyPlan> {
+    @Autowired
+    private WorkMonthlyPlanThisDao workMonthlyPlanThisDao;
+
+	@Autowired
+	private WorkMonthlyPlanDao workMonthlyPlanDao;
+	@Autowired
+	private WorkContractInfoDao workContractInfoDao;
+	public WorkMonthlyPlan get(String id) {
+		return super.get(id);
+	}
+
+	/**
+	 * 获取查询列表
+	 * @param workMonthlyPlan
+	 * @return
+	 */
+	public List<WorkMonthlyPlan> findList(WorkMonthlyPlan workMonthlyPlan) {
+		return super.findList(workMonthlyPlan);
+	}
+	/**
+	 * 根据业务权限分页查询
+	 * @param workMonthlyPlan
+	 * @return
+	 */
+	public Page<WorkMonthlyPlan> findPage(Page<WorkMonthlyPlan> page, WorkMonthlyPlan workMonthlyPlan) {
+		workMonthlyPlan.getSqlMap().put("dsf", dataScopeFilter(workMonthlyPlan.getCurrentUser(), "o", "u","s", MenuStatusEnum.WORK_MONTHLYPLAN.getValue()));
+		int count = dao.queryCount(workMonthlyPlan);
+		page.setCount(count);
+		page.setCountFlag(false);
+		workMonthlyPlan.setPage(page);
+		page.setList(findList(workMonthlyPlan));
+		return page;
+	}
+	/**
+	 * 保存
+	 * @param workMonthlyPlan
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void save(WorkMonthlyPlan workMonthlyPlan) {
+		super.save(workMonthlyPlan);
+		//保存明细
+        updateWorkMonthlyPlanInfo(workMonthlyPlan);
+	}
+	/**
+	 * 删除
+	 * @param workMonthlyPlan
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void delete(WorkMonthlyPlan workMonthlyPlan) {
+		super.delete(workMonthlyPlan);
+		deleteWorkMonthlyPlanThis(workMonthlyPlan);
+	}
+	/**
+	 * 保存子表
+	 * @param workMonthlyPlan
+	 * @return
+	 */
+    @Transactional(readOnly = false)
+    public void updateWorkMonthlyPlanInfo(WorkMonthlyPlan workMonthlyPlan) {
+        for (WorkMonthlyPlanThis workMonthlyPlanThis : workMonthlyPlan.getWorkMonthlyPlanThisList()) {
+			if (StringUtils.isBlank(workMonthlyPlanThis.getId()) ) {
+				workMonthlyPlanThis.preInsert();
+				workMonthlyPlanThis.setWorkMonthlyPlanId(workMonthlyPlan.getId());
+				if(StringUtils.isNotBlank(workMonthlyPlanThis.getWorkClientInfoId())){
+
+                    workMonthlyPlanThisDao.insert(workMonthlyPlanThis);
+                }
+
+		} else {
+				workMonthlyPlanThis.preUpdate();
+				workMonthlyPlanThis.setWorkMonthlyPlanId(workMonthlyPlan.getId());
+                if(StringUtils.isNotBlank(workMonthlyPlanThis.getWorkClientInfoId())){
+                    workMonthlyPlanThisDao.update(workMonthlyPlanThis);
+                }
+
+		}
+        }
+    }
+    //查询子表数据
+	public List<WorkMonthlyPlanThis> findWorkMonthlyPlanThisList(String id) {
+		List<WorkMonthlyPlanThis> workMonthlyPlanThisList=workMonthlyPlanThisDao.findByWorkMonthlyPlanId(id);
+		return workMonthlyPlanThisList;
+	}
+
+//查询本部门最近12个月计划
+	public List<WorkMonthlyPlan> findHisList() {
+		List<WorkMonthlyPlan> workMonthlyPlanList=workMonthlyPlanDao.findHisList(UserUtils.getSelectOffice().getId());
+		return workMonthlyPlanList;
+	}
+
+	//删除子表数据
+	public void deleteWorkMonthlyPlanThis(WorkMonthlyPlan workMonthlyPlan) {
+		workMonthlyPlanDao.deleteWorkMonthlyPlanThis(workMonthlyPlan);
+
+	}
+
+	//查询引用数据
+	public List<WorkMonthlyPlanThis> findWorkMonthlyPlanThis(String id) {
+		List<WorkMonthlyPlanThis> workMonthlyPlanThisList=workMonthlyPlanThisDao.findByWorkMonthlyPlanThis(id);
+		return workMonthlyPlanThisList;
+	}
+
+	//查询本部门最大月份
+	public Date getThisMaxMonthly() throws ParseException {
+		WorkMonthlyPlan workMonthlyPlan=workMonthlyPlanDao.getThisMaxMonthly(UserUtils.getSelectOffice().getId());
+		if(workMonthlyPlan!=null){
+			return workMonthlyPlan.getPlanMonthly();
+		}else{
+			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+			Date myDate = dateFormat.parse("2000-01-01");
+			return myDate;
+		}
+
+	}
+
+//验证本月是否已制定计划
+	public boolean getMonthly(WorkMonthlyPlan workMonthlyPlan) {
+		List<WorkMonthlyPlan> workMonthlyPlan1=workMonthlyPlanDao.getMonthly(workMonthlyPlan);
+		if (workMonthlyPlan1!=null&&workMonthlyPlan1.size()>0){
+			return true;
+		}else {
+			return false;
+		}
+	}
+
+
+	/**
+	 * 获取一个客户信息
+	 * @param page 分页对象
+	 * @param workClientInfo
+	 * @return
+	 */
+	public Page<WorkClientInfo> clientInfoList(Page<WorkClientInfo> page, WorkClientInfo workClientInfo) {
+
+		workClientInfo.setPage(page);
+		List<WorkClientInfo> list = workMonthlyPlanDao.clientInfoList();
+		page.setList(list);
+		return page;
+	}
+	/**
+	 * 获取所选客户本月前已收款
+	 *
+	 * @return
+	 */
+	public WorkMonthlyPlanThis getBeforeThisMonthMoney(String clientId,String planMonthly) throws ParseException {
+		StringBuilder sb=new StringBuilder();
+		sb.append(planMonthly);
+		sb.append("-01");
+		WorkMonthlyPlanThis w =new WorkMonthlyPlanThis();
+		w.setContractId(clientId);
+		w.setPlanMonthly(sb.toString());
+		WorkMonthlyPlanThis workMonthlyPlanThis = workMonthlyPlanDao.getBeforeThisMonthMoney(w);
+		return workMonthlyPlanThis;
+	}
+	/**
+	 * 获取一个客户信息
+	 * @param page 分页对象
+	 * @param
+	 * @return
+	 */
+	public Page<WorkContractInfo> findWorkContractInfoPage(Page<WorkContractInfo> page, WorkContractInfo workContractInfo) {
+		workContractInfo.setPage(page);
+		List<WorkContractInfo> list = workContractInfoDao.findWorkContractInfoPage(workContractInfo);
+		page.setList(list);
+		return page;
+	}
+
+
+}

+ 63 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/service/WorkMonthlyPlanThisService.java

@@ -0,0 +1,63 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+import com.jeeplus.modules.workmonthlyplan.dao.WorkMonthlyPlanThisDao;
+
+/**
+ * 本月计划Service
+ * @author cyp
+ * @version 2018-06-27
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkMonthlyPlanThisService extends CrudService<WorkMonthlyPlanThisDao, WorkMonthlyPlanThis> {
+
+	public WorkMonthlyPlanThis get(String id) {
+		return super.get(id);
+	}
+
+	/**
+	 * 获取列表
+	 * @param workMonthlyPlanThis
+	 * @return
+	 */
+	public List<WorkMonthlyPlanThis> findList(WorkMonthlyPlanThis workMonthlyPlanThis) {
+		return super.findList(workMonthlyPlanThis);
+	}
+	/**
+	 * 分页
+	 * @param workMonthlyPlanThis
+	 * @return
+	 */
+	public Page<WorkMonthlyPlanThis> findPage(Page<WorkMonthlyPlanThis> page, WorkMonthlyPlanThis workMonthlyPlanThis) {
+		return super.findPage(page, workMonthlyPlanThis);
+	}
+	/**
+	 * 保存
+	 * @param workMonthlyPlanThis
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void save(WorkMonthlyPlanThis workMonthlyPlanThis) {
+		super.save(workMonthlyPlanThis);
+	}
+	/**
+	 * 删除
+	 * @param workMonthlyPlanThis
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void delete(WorkMonthlyPlanThis workMonthlyPlanThis) {
+		super.delete(workMonthlyPlanThis);
+	}
+}

+ 344 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/web/WorkMonthlyPlanController.java

@@ -0,0 +1,344 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.projectcontentinfo.entity.ProjectContentData;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlan;
+import com.jeeplus.modules.workmonthlyplan.service.WorkMonthlyPlanService;
+
+/**
+ * 月计划管理Controller
+ * @author cyp
+ * @version 2018-06-27
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workmonthlyplan/workMonthlyPlan")
+public class WorkMonthlyPlanController extends BaseController {
+
+	@Autowired
+	private WorkMonthlyPlanService workMonthlyPlanService;
+	@Autowired
+	private WorkClientInfoService workClientInfoService;
+	@Autowired
+	private HttpServletRequest request;
+	@ModelAttribute
+	public WorkMonthlyPlan get(@RequestParam(required=false) String id) {
+		WorkMonthlyPlan entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workMonthlyPlanService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkMonthlyPlan();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 月计划管理列表页面
+	 */
+	@RequiresPermissions("workmonthlyplan:workMonthlyPlan:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkMonthlyPlan workMonthlyPlan, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkMonthlyPlan> page = workMonthlyPlanService.findPage(new Page<WorkMonthlyPlan>(request, response), workMonthlyPlan); 
+		model.addAttribute("page", page);
+		return "modules/workmonthlyplan/workMonthlyPlanList";
+	}
+
+	/**
+	 * 查看,增加,编辑月计划管理表单页面
+	 */
+	@RequiresPermissions(value={"workmonthlyplan:workMonthlyPlan:view","workmonthlyplan:workMonthlyPlan:add","workmonthlyplan:workMonthlyPlan:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkMonthlyPlan workMonthlyPlan, Model model) {
+		String view = "workMonthlyPlanFormAdd";
+		String tabId = request.getParameter("tabId");
+		if("1".equals(tabId)){
+			view = "workMonthlyPlanFormView";
+		}
+		//新增默认回显数据
+		if("2".equals(tabId)){
+			Office office = UserUtils.getSelectOffice();
+			workMonthlyPlan.setOfficeId(office.getId());
+			workMonthlyPlan.setOfficeName(office.getTopCompany());
+			workMonthlyPlan.setName(UserUtils.getUser().getName());
+			workMonthlyPlan.setCompanyId(UserUtils.getSelectCompany().getId());
+		}
+		//查询子表数据
+		List<WorkMonthlyPlanThis> workMonthlyPlanThisList = workMonthlyPlanService.findWorkMonthlyPlanThisList(workMonthlyPlan.getId());
+		workMonthlyPlan.setWorkMonthlyPlanThisList(workMonthlyPlanThisList);
+		model.addAttribute("workMonthlyPlan", workMonthlyPlan);
+		return "modules/workmonthlyplan/"+view;
+	}
+
+	/**
+	 * 保存月计划管理
+	 */
+	@RequiresPermissions(value={"workmonthlyplan:workMonthlyPlan:add","workmonthlyplan:workMonthlyPlan:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkMonthlyPlan workMonthlyPlan, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		System.out.println(workMonthlyPlan.getWorkMonthlyPlanThisList());
+		if (!beanValidator(model, workMonthlyPlan)){
+			return form(workMonthlyPlan, model);
+		}
+		//判断本部门本月份是否已审定过计划
+		boolean flag=workMonthlyPlanService.getMonthly(workMonthlyPlan);
+		if(flag){
+            addMessage(redirectAttributes, "本部门该月份已制定计划,请选择其它月份!");
+            return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+        }
+		workMonthlyPlan.setPlanStatus("0");
+		if(!workMonthlyPlan.getIsNewRecord()){//编辑表单保存
+			System.out.println(workMonthlyPlan.getWorkMonthlyPlanThisList());
+			WorkMonthlyPlan t = workMonthlyPlanService.get(workMonthlyPlan.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workMonthlyPlan, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workMonthlyPlanService.save(t);//保存
+		}else{//新增表单保存
+			workMonthlyPlanService.save(workMonthlyPlan);//保存
+		}
+		addMessage(redirectAttributes, "保存成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+	}
+	/**
+	 * 保存月计划管理
+	 */
+	@RequiresPermissions(value={"workmonthlyplan:workMonthlyPlan:review"},logical=Logical.OR)
+	@RequestMapping(value = "review")
+	public String review(WorkMonthlyPlan workMonthlyPlan, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workMonthlyPlan)){
+			return form(workMonthlyPlan, model);
+		}
+        //判断本部门本月份是否已审定过计划
+       /* boolean flag=workMonthlyPlanService.getMonthlyRew(workMonthlyPlan);
+        if(flag){
+            addMessage(redirectAttributes, "本部门该月份已制定计划,请选择其它月份!");
+            return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+        }*/
+		workMonthlyPlan.setPlanStatus("1");
+		if(!workMonthlyPlan.getIsNewRecord()){//编辑表单保存
+			WorkMonthlyPlan t = workMonthlyPlanService.get(workMonthlyPlan.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workMonthlyPlan, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workMonthlyPlanService.save(t);//保存
+		}else{//新增表单保存
+			workMonthlyPlanService.save(workMonthlyPlan);//保存
+		}
+		addMessage(redirectAttributes, "保存成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+	}
+	
+	/**
+	 * 删除月计划管理
+	 */
+	@RequiresPermissions("workmonthlyplan:workMonthlyPlan:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkMonthlyPlan workMonthlyPlan, RedirectAttributes redirectAttributes) {
+		workMonthlyPlanService.delete(workMonthlyPlan);
+		addMessage(redirectAttributes, "删除月计划管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+	}
+	
+	/**
+	 * 批量删除月计划管理
+	 */
+	@RequiresPermissions("workmonthlyplan:workMonthlyPlan:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workMonthlyPlanService.delete(workMonthlyPlanService.get(id));
+		}
+		addMessage(redirectAttributes, "删除月计划管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	//@RequiresPermissions("workmonthlyplan:workMonthlyPlan:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkMonthlyPlan workMonthlyPlan, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "月计划管理"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkMonthlyPlan> page = workMonthlyPlanService.findPage(new Page<WorkMonthlyPlan>(request, response, -1), workMonthlyPlan);
+            List<WorkMonthlyPlanThis> list =new ArrayList<>();
+            for (WorkMonthlyPlan w:page.getList()){
+                List<WorkMonthlyPlanThis> workMonthlyPlanThisList = workMonthlyPlanService.findWorkMonthlyPlanThisList(w.getId());
+                list.addAll(workMonthlyPlanThisList);
+            }
+    		new ExportExcel("月计划管理", WorkMonthlyPlanThis.class).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出月计划管理记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workmonthlyplan:workMonthlyPlan:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkMonthlyPlan> list = ei.getDataList(WorkMonthlyPlan.class);
+			for (WorkMonthlyPlan workMonthlyPlan : list){
+				try{
+					workMonthlyPlanService.save(workMonthlyPlan);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条月计划管理记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条月计划管理记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入月计划管理失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+    }
+	
+	/**
+	 * 下载导入月计划管理数据模板
+	 */
+	@RequiresPermissions("workmonthlyplan:workMonthlyPlan:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "月计划管理数据导入模板.xlsx";
+    		List<WorkMonthlyPlan> list = Lists.newArrayList(); 
+    		new ExportExcel("月计划管理数据", WorkMonthlyPlan.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplan/workMonthlyPlan/?repage";
+    }
+
+	@RequestMapping("selectcontentData")
+	public String gridSelectData(WorkMonthlyPlan workMonthlyPlan, String searchLabel , HttpServletRequest request, HttpServletResponse response, Model model){
+		List<WorkMonthlyPlan> list = workMonthlyPlanService.findHisList();
+		//model.addAttribute("obj", workMonthlyPlan);
+		model.addAttribute("list", list);
+		//model.addAttribute("searchLabel",searchLabel);
+		return "modules/workmonthlyplan/workMonthlyPlanQuote";
+	}
+
+	@RequestMapping("getWorkMonthlyPlanThis")
+	@ResponseBody
+	public List<WorkMonthlyPlanThis> getWorkMonthlyPlanThis(String  id){
+		List<WorkMonthlyPlanThis> workMonthlyPlanThisList = workMonthlyPlanService.findWorkMonthlyPlanThis(id);
+		return  workMonthlyPlanThisList;
+	}
+	//获取本部门计划最大月份
+	@RequestMapping("getThisMaxMonthly")
+	@ResponseBody
+	public Date getThisMaxMonthly() throws ParseException {
+		Date maxThisMonthly = workMonthlyPlanService.getThisMaxMonthly();
+		return  maxThisMonthly;
+	}
+	@RequestMapping("linkmanList")
+	public String queryLinkmanListByClientId(WorkClientLinkman linkman, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, String searchLabel1, String searchKey1, HttpServletRequest request, HttpServletResponse response, Model model){
+		Page<WorkClientLinkman> page = workClientInfoService.findLinkmanPage(new Page<WorkClientLinkman>(request, response), linkman);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", linkman);
+		model.addAttribute("page", page);
+		return  "modules/workmonthlyplan/gridselect";
+	}
+
+	//获取所选客户本月前已收款
+	@RequestMapping("getBeforeThisMonthMoney")
+	@ResponseBody
+	public WorkMonthlyPlanThis getBeforeThisMonthMoney(String clientId,String planMonthly) throws ParseException {
+		WorkMonthlyPlanThis workMonthlyPlanThis = workMonthlyPlanService.getBeforeThisMonthMoney(clientId,planMonthly);
+		return  workMonthlyPlanThis;
+	}
+
+	/**
+	 * 合同管理列表页面
+	 */
+	@RequestMapping(value = {"clientInfoList"})
+	public String list(WorkContractInfo workContractInfo, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		workContractInfo.setOfficeId(user.getOffice().getId());
+		Page<WorkContractInfo> page = workMonthlyPlanService.findWorkContractInfoPage(new Page<WorkContractInfo>(request, response), workContractInfo);
+		model.addAttribute("page", page);
+		return "modules/workmonthlyplan/gridselect";
+	}
+
+
+/*	@RequestMapping("getHisThis")
+	@ResponseBody
+	public String getHisThis(String  planMonthly){
+		//判断本部门本月份是否已审定过计划
+		WorkMonthlyPlan workMonthlyPlan=new WorkMonthlyPlan();
+		workMonthlyPlan.setOfficeId(UserUtils.getSelectOffice().getId());
+		boolean flag=workMonthlyPlanService.getMonthly(workMonthlyPlan);
+		if(flag){
+			return "no";
+		}else{
+			return  "yes";
+		}
+
+	}*/
+}

+ 196 - 0
src/main/java/com/jeeplus/modules/workmonthlyplan/web/WorkMonthlyPlanThisController.java

@@ -0,0 +1,196 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workmonthlyplan.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+import com.jeeplus.modules.workmonthlyplan.service.WorkMonthlyPlanThisService;
+
+/**
+ * 本月计划Controller
+ * @author cyp
+ * @version 2018-06-27
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workmonthlyplanthis/workMonthlyPlanThis")
+public class WorkMonthlyPlanThisController extends BaseController {
+
+	@Autowired
+	private WorkMonthlyPlanThisService workMonthlyPlanThisService;
+	
+	@ModelAttribute
+	public WorkMonthlyPlanThis get(@RequestParam(required=false) String id) {
+		WorkMonthlyPlanThis entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workMonthlyPlanThisService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkMonthlyPlanThis();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 本月计划列表页面
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkMonthlyPlanThis workMonthlyPlanThis, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkMonthlyPlanThis> page = workMonthlyPlanThisService.findPage(new Page<WorkMonthlyPlanThis>(request, response), workMonthlyPlanThis); 
+		model.addAttribute("page", page);
+		return "modules/workmonthlyplan/workMonthlyPlanThisList";
+	}
+
+	/**
+	 * 查看,增加,编辑本月计划表单页面
+	 */
+	@RequiresPermissions(value={"workmonthlyplanthis:workMonthlyPlanThis:view","workmonthlyplanthis:workMonthlyPlanThis:add","workmonthlyplanthis:workMonthlyPlanThis:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkMonthlyPlanThis workMonthlyPlanThis, Model model) {
+		model.addAttribute("workMonthlyPlanThis", workMonthlyPlanThis);
+		return "modules/workmonthlyplan/workMonthlyPlanThisForm";
+	}
+
+	/**
+	 * 保存本月计划
+	 */
+	@RequiresPermissions(value={"workmonthlyplanthis:workMonthlyPlanThis:add","workmonthlyplanthis:workMonthlyPlanThis:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkMonthlyPlanThis workMonthlyPlanThis, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workMonthlyPlanThis)){
+			return form(workMonthlyPlanThis, model);
+		}
+		if(!workMonthlyPlanThis.getIsNewRecord()){//编辑表单保存
+			WorkMonthlyPlanThis t = workMonthlyPlanThisService.get(workMonthlyPlanThis.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workMonthlyPlanThis, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workMonthlyPlanThisService.save(t);//保存
+		}else{//新增表单保存
+			workMonthlyPlanThisService.save(workMonthlyPlanThis);//保存
+		}
+		addMessage(redirectAttributes, "保存本月计划成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+	}
+	
+	/**
+	 * 删除本月计划
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkMonthlyPlanThis workMonthlyPlanThis, RedirectAttributes redirectAttributes) {
+		workMonthlyPlanThisService.delete(workMonthlyPlanThis);
+		addMessage(redirectAttributes, "删除本月计划成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+	}
+	
+	/**
+	 * 批量删除本月计划
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workMonthlyPlanThisService.delete(workMonthlyPlanThisService.get(id));
+		}
+		addMessage(redirectAttributes, "删除本月计划成功");
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkMonthlyPlanThis workMonthlyPlanThis, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "本月计划"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkMonthlyPlanThis> page = workMonthlyPlanThisService.findPage(new Page<WorkMonthlyPlanThis>(request, response, -1), workMonthlyPlanThis);
+    		new ExportExcel("本月计划", WorkMonthlyPlanThis.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出本月计划记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkMonthlyPlanThis> list = ei.getDataList(WorkMonthlyPlanThis.class);
+			for (WorkMonthlyPlanThis workMonthlyPlanThis : list){
+				try{
+					workMonthlyPlanThisService.save(workMonthlyPlanThis);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条本月计划记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条本月计划记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入本月计划失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+    }
+	
+	/**
+	 * 下载导入本月计划数据模板
+	 */
+	@RequiresPermissions("workmonthlyplanthis:workMonthlyPlanThis:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "本月计划数据导入模板.xlsx";
+    		List<WorkMonthlyPlanThis> list = Lists.newArrayList(); 
+    		new ExportExcel("本月计划数据", WorkMonthlyPlanThis.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workmonthlyplanthis/workMonthlyPlanThis/?repage";
+    }
+	
+	
+	
+
+}

+ 20 - 0
src/main/java/com/jeeplus/modules/workofficechange/dao/WorkOfficeChangeDao.java

@@ -0,0 +1,20 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChange;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularApply;
+
+/**
+ * 部门调转DAO接口
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@MyBatisDao
+public interface WorkOfficeChangeDao extends CrudDao<WorkOfficeChange> {
+    public int updateProcessInstanceId(WorkOfficeChange workOfficeChange);
+	
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workofficechange/dao/WorkOfficeChangeUserDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChangeUser;
+
+/**
+ * 调转成员DAO接口
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@MyBatisDao
+public interface WorkOfficeChangeUserDao extends CrudDao<WorkOfficeChangeUser> {
+
+	
+}

+ 194 - 0
src/main/java/com/jeeplus/modules/workofficechange/entity/WorkOfficeChange.java

@@ -0,0 +1,194 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.entity;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularScore;
+
+/**
+ * 部门调转Entity
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+public class WorkOfficeChange extends ActEntity<WorkOfficeChange> {
+	
+	private static final long serialVersionUID = 1L;
+	private String officeId;		// 所属部门
+	private String companyId;		// 所属公司
+	private String changeOffice;		// 调入部门
+	private String changeOfficeName;		// 调入部门
+	private String changer;		// 调用人
+	private String number;		// 编号
+	private Date changeDate;		// 调用日期
+	private String changeFor;		// 调转原因
+	private String state;		// 申请状态
+	private String processInstanceId;		// 流程实例id
+	private Date beginDate;
+	private Date endDate;
+	private String userName;
+	private String home;
+	private List<WorkOfficeChangeUser> WorkOfficeChangeUserList;
+	private String roleId;
+	private String roleName;
+	public WorkOfficeChange() {
+		super();
+	}
+
+	public WorkOfficeChange(String id){
+		super(id);
+	}
+
+	public List<WorkOfficeChangeUser> getWorkOfficeChangeUserList() {
+		return WorkOfficeChangeUserList;
+	}
+
+	public void setWorkOfficeChangeUserList(List<WorkOfficeChangeUser> workOfficeChangeUserList) {
+		WorkOfficeChangeUserList = workOfficeChangeUserList;
+	}
+	@ExcelField(title="调入部门", align=2, sort=2)
+	public String getChangeOfficeName() {
+		return changeOfficeName;
+	}
+
+	public void setChangeOfficeName(String changeOfficeName) {
+		this.changeOfficeName = changeOfficeName;
+	}
+
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+
+	public String getChangeOffice() {
+		return changeOffice;
+	}
+
+	public void setChangeOffice(String changeOffice) {
+		this.changeOffice = changeOffice;
+	}
+	
+
+	public String getChanger() {
+		return changer;
+	}
+
+	public void setChanger(String changer) {
+		this.changer = changer;
+	}
+	
+	@ExcelField(title="编号", align=2, sort=1)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	@ExcelField(title="调用日期", align=2, sort=3)
+	public Date getChangeDate() {
+		return changeDate;
+	}
+
+	public void setChangeDate(Date changeDate) {
+		this.changeDate = changeDate;
+	}
+	
+	@ExcelField(title="调转原因", align=2, sort=5)
+	public String getChangeFor() {
+		return changeFor;
+	}
+
+	public void setChangeFor(String changeFor) {
+		this.changeFor = changeFor;
+	}
+	
+	@ExcelField(title="申请状态", align=2, sort=6,dictType = "audit_state")
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+	
+
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public Date getBeginDate() {
+		return beginDate;
+	}
+
+	public void setBeginDate(Date beginDate) {
+		this.beginDate = beginDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+	@ExcelField(title="调用人", align=2, sort=4)
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public String getRoleId() {
+		return roleId;
+	}
+
+	public void setRoleId(String roleId) {
+		this.roleId = roleId;
+	}
+
+	public String getRoleName() {
+		return roleName;
+	}
+
+	public void setRoleName(String roleName) {
+		this.roleName = roleName;
+	}
+}

+ 188 - 0
src/main/java/com/jeeplus/modules/workofficechange/entity/WorkOfficeChangeUser.java

@@ -0,0 +1,188 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+
+/**
+ * 调转成员Entity
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+public class WorkOfficeChangeUser extends DataEntity<WorkOfficeChangeUser> {
+	
+	private static final long serialVersionUID = 1L;
+	private String officeId;		// 所属部门
+	private String companyId;		// 所属公司
+	private String changeId;		// 调转表主键
+	private String userId;		// 用户表主键
+	private String basicInfoId;		// 入职登记表主键
+	private WorkStaffBasicInfo workStaffBasicInfo;
+	private WorkJobGrade  jobGrade1;
+	private WorkJobGrade  jobGrade2;
+	private String oldOfficeName;		// 原部门名称
+	private String oldOfficeId;		// 原部门名称主键
+
+	public String getOldOfficeName() {
+		return oldOfficeName;
+	}
+
+	public void setOldOfficeName(String oldOfficeName) {
+		this.oldOfficeName = oldOfficeName;
+	}
+
+	public String getOldOfficeId() {
+		return oldOfficeId;
+	}
+
+	public void setOldOfficeId(String oldOfficeId) {
+		this.oldOfficeId = oldOfficeId;
+	}
+
+	public WorkJobGrade getJobGrade1() {
+		return jobGrade1;
+	}
+
+	public void setJobGrade1(WorkJobGrade jobGrade1) {
+		this.jobGrade1 = jobGrade1;
+	}
+
+	public WorkJobGrade getJobGrade2() {
+		return jobGrade2;
+	}
+
+	public void setJobGrade2(WorkJobGrade jobGrade2) {
+		this.jobGrade2 = jobGrade2;
+	}
+
+	public WorkStaffBasicInfo getWorkStaffBasicInfo() {
+		return workStaffBasicInfo;
+	}
+
+	public void setWorkStaffBasicInfo(WorkStaffBasicInfo workStaffBasicInfo) {
+		this.workStaffBasicInfo = workStaffBasicInfo;
+	}
+
+	public WorkOfficeChangeUser() {
+		super();
+	}
+
+	public WorkOfficeChangeUser(String id){
+		super(id);
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+
+	public String getChangeId() {
+		return changeId;
+	}
+
+	public void setChangeId(String changeId) {
+		this.changeId = changeId;
+	}
+	
+
+	public String getUserId() {
+		return userId;
+	}
+
+	public void setUserId(String userId) {
+		this.userId = userId;
+	}
+	
+
+	public String getBasicInfoId() {
+		return basicInfoId;
+	}
+
+	public void setBasicInfoId(String basicInfoId) {
+		this.basicInfoId = basicInfoId;
+	}
+
+	private String no;
+	private String name;
+	private String idCard;
+	private String officeName;
+	private String job;
+	private String status;
+	private String newJob;
+	@ExcelField(title="工号", align=2, sort=1)
+	public String getNo() {
+		return no;
+	}
+
+	public void setNo(String no) {
+		this.no = no;
+	}
+	@ExcelField(title="姓名", align=2, sort=2)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@ExcelField(title="新职级", align=2, sort=7)
+	public String getNewJob() {
+		return newJob;
+	}
+
+	public void setNewJob(String newJob) {
+		this.newJob = newJob;
+	}
+
+	public String getIdCard() {
+		return idCard;
+	}
+
+	public void setIdCard(String idCard) {
+		this.idCard = idCard;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public String getJob() {
+		return job;
+	}
+
+	public void setJob(String job) {
+		this.job = job;
+	}
+
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+}

+ 839 - 0
src/main/java/com/jeeplus/modules/workofficechange/service/WorkOfficeChangeService.java

@@ -0,0 +1,839 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.websocket.onchat.ChatServerPool;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+import com.jeeplus.modules.sys.dao.OfficeDao;
+import com.jeeplus.modules.sys.dao.RoleDao;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.service.UserService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysuseroffice.dao.UserofficeDao;
+import com.jeeplus.modules.sysuseroffice.entity.Useroffice;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workchangejob.entity.WorkChangeJobUser;
+import com.jeeplus.modules.workjobgrade.dao.WorkJobGradeDao;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+import com.jeeplus.modules.workofficechange.dao.WorkOfficeChangeUserDao;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChangeUser;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularApply;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularScore;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.dao.WorkStaffBasicInfoDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.java_websocket.WebSocket;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChange;
+import com.jeeplus.modules.workofficechange.dao.WorkOfficeChangeDao;
+
+/**
+ * 部门调转Service
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOfficeChangeService extends CrudService<WorkOfficeChangeDao, WorkOfficeChange> {
+	@Autowired
+	private UserDao userDao;
+	@Autowired
+	private OfficeDao officeDao;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private SerialNumTplService serialNumTplService;
+	@Autowired
+	protected WorkOfficeChangeUserDao workOfficeChangeUserDao;
+	@Autowired
+	protected WorkStaffBasicInfoDao workStaffBasicInfoDao;
+	@Autowired
+	protected WorkOfficeChangeUserService workOfficeChangeUserService;
+	@Autowired
+	protected SystemService systemService;
+	@Autowired
+	protected UserofficeDao userofficeDao;
+	@Autowired
+	protected RoleDao roleDao;
+	@Autowired
+	private WorkStaffAchivesDao workStaffAchivesDao;
+	@Autowired
+	private WorkJobGradeDao workJobGradeDao;
+	@Autowired
+	private UserService userService;
+
+	public WorkOfficeChange get(String id) {
+		return super.get(id);
+	}
+
+	/**
+	 * 获取列表
+	 * @param workOfficeChange
+	 * @return
+	 */
+	public List<WorkOfficeChange> findList(WorkOfficeChange workOfficeChange) {
+		return super.findList(workOfficeChange);
+	}
+	/**
+	 *权限范围内的数据
+	 * @param workOfficeChange
+	 * @return
+	 */
+	public Page<WorkOfficeChange> findPage(Page<WorkOfficeChange> page, WorkOfficeChange workOfficeChange) {
+		workOfficeChange.getSqlMap().put("dsf", dataScopeFilter(workOfficeChange.getCurrentUser(), "o", "u","s", MenuStatusEnum.OFFICE_CHANGE.getValue()));
+		int count = dao.queryCount(workOfficeChange);
+		page.setCount(count);
+		page.setCountFlag(false);
+		workOfficeChange.setPage(page);
+		page.setList(findList(workOfficeChange));
+		return page;
+	}
+
+	/**
+	 * 保存
+	 * @param workOfficeChange
+	 */
+	@Transactional(readOnly = false)
+	public void save(WorkOfficeChange workOfficeChange) {
+		super.save(workOfficeChange);
+		updateWorkOfficeChangeList(workOfficeChange);
+	}
+	/**
+	 * 保存调整明细
+	 * @param workOfficeChange
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void updateWorkOfficeChangeList(WorkOfficeChange workOfficeChange) {
+		if (workOfficeChange.getWorkOfficeChangeUserList() != null && workOfficeChange.getWorkOfficeChangeUserList().size() > 0) {
+			String officeId = workOfficeChange.getChangeOffice();
+            for (WorkOfficeChangeUser workOfficeChangeUser : workOfficeChange.getWorkOfficeChangeUserList()) {
+				if (StringUtils.isBlank(workOfficeChangeUser.getId())) {
+					if (StringUtils.isNotBlank(workOfficeChangeUser.getBasicInfoId())) {
+						workOfficeChangeUser.preInsert();
+						workOfficeChangeUser.setChangeId(workOfficeChange.getId());
+						workOfficeChangeUser.setOfficeId(workOfficeChange.getOfficeId());
+						User user = userDao.get(workOfficeChangeUser.getUserId());
+						if (user != null) {
+							workOfficeChangeUser.setOldOfficeId(user.getOffice().getId());
+							workOfficeChangeUser.setOldOfficeName(user.getOffice().getName());
+						}
+						workOfficeChangeUser.setCompanyId(workOfficeChange.getCompanyId());
+						workOfficeChangeUserDao.insert(workOfficeChangeUser);
+					}
+				} else {
+					if (StringUtils.isNotBlank(workOfficeChangeUser.getBasicInfoId())) {
+						workOfficeChangeUser.preUpdate();
+						workOfficeChangeUser.setOfficeId(workOfficeChange.getOfficeId());
+						workOfficeChangeUser.setChangeId(workOfficeChange.getId());
+						User user = userDao.get(workOfficeChangeUser.getUserId());
+						if (user != null) {
+							workOfficeChangeUser.setOldOfficeId(user.getOffice().getId());
+							workOfficeChangeUser.setOldOfficeName(user.getOffice().getName());
+						}
+						workOfficeChangeUser.setCompanyId(workOfficeChange.getCompanyId());
+						workOfficeChangeUserDao.update(workOfficeChangeUser);
+					}
+				}
+				//更新新职级和新部门
+				String userId = workOfficeChangeUser.getUserId();
+				String jobGradeId = workOfficeChangeUser.getJobGrade2().getId();
+				workStaffBasicInfoDao.updateJobGradeByUserId(userId,jobGradeId);
+                //新岗位
+                roleDao.updateRoleByUserId(workOfficeChange.getRoleId(),userId);
+				//新部门
+				workStaffBasicInfoDao.updateOfficeByUserId(userId,officeId);
+				//更新user表的officeId
+				User user =  new User();
+				user.setId(userId);
+                Office office = new Office();
+                office.setId(officeId);
+                user.setOffice(office);
+				userService.updateUser(user);
+			}
+		}
+	}
+	/**
+	 * 删除
+	 * @param workOfficeChange
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void delete(WorkOfficeChange workOfficeChange) {
+		super.delete(workOfficeChange);
+		if(workOfficeChange.getWorkOfficeChangeUserList()!=null&&workOfficeChange.getWorkOfficeChangeUserList().size()>0){
+			for(WorkOfficeChangeUser workOfficeChangeUser:workOfficeChange.getWorkOfficeChangeUserList()){
+				workOfficeChangeUserDao.delete(workOfficeChangeUser);
+			}
+		}
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workOfficeChange.getId());
+		List<User> users = workProjectNotifyService.readByNotifyId(notify);
+		if (users!=null && users.size()!=0){
+			for (User user:users){
+				UserUtils.pushMeIm(user.getId());
+			}
+		}
+	}
+
+
+
+	@Transactional(readOnly = false)
+	public WorkStaffBasicInfo getWorkStaffBasicInfo(String userId) {
+		WorkStaffBasicInfo w=workStaffAchivesDao.getWorkStaffBasicInfo(userId);
+		return w;
+	}
+	/**
+	 * 保存并启动流程
+	 * @param workOfficeChange
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public String saveChange(WorkOfficeChange workOfficeChange) {
+		if(StringUtils.isBlank(workOfficeChange.getNumber())){
+			User createBy = workOfficeChange.getCreateBy();
+			if(createBy != null){
+				createBy = UserUtils.get(createBy.getId());
+			}else {
+				createBy = UserUtils.getUser();
+				workOfficeChange.setCreateBy(createBy);
+			}
+//			业务标识20:  -> 默认部门调转编号模板:
+			workOfficeChange.setNumber(serialNumTplService.genSerialNum(createBy.getCompany(),"20"));
+		}
+		this.save(workOfficeChange);
+		return this.startAudit(workOfficeChange,workOfficeChange.getProcessInstanceId());
+	}
+
+	/**
+	 * 启动审批流程
+	 */
+	@Transactional(readOnly = false)
+	public String startAudit(WorkOfficeChange workOfficeChange, String processInstanceId){
+		try{
+			Map<String, Object> variables = new HashMap<String, Object>();
+			identityService.setAuthenticatedUserId(workOfficeChange.getCurrentUser().getId());
+			User createUser = UserUtils.getUser();
+			String contentStr = "转入部门:"+ workOfficeChange.getChangeOfficeName()+",调转日期:"+ DateUtils.formatDate(workOfficeChange.getChangeDate());
+			String titleStr = "转入部门:"+ workOfficeChange.getChangeOfficeName();
+			String businessKey = workOfficeChange.getId();
+			Office office = UserUtils.getSelectOffice();
+			WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("bmdz3125f1f194c87u7ua9miiii750904", office);
+			// 启动流程
+			String processType = workActivityMenu.getProcessType();
+			StringBuffer buffer = new StringBuffer();
+			Activity activity = new Activity();
+			WorkProjectNotify workProjectNotify = UtilNotify
+					.saveNotify(workOfficeChange.getId(),
+							null,
+							workOfficeChange.getCompanyId(),
+							titleStr,
+							contentStr,
+							"68",
+							"0",
+							"待审批",
+							""
+					);
+
+			List<User> users = new ArrayList<>();
+			String oldOfficeId = workOfficeChange.getWorkOfficeChangeUserList().get(0).getOldOfficeId();
+			String newOfficeId = workOfficeChange.getChangeOffice();
+			List<User> bmzrList = UserUtils.getByRoleActivityEnname("bmzr",2,oldOfficeId,"24",workOfficeChange.getCreateBy()); //原部门负责人
+			List<User> fgldList = UserUtils.getByRoleActivityEnname("bmzr",2,newOfficeId,"24",workOfficeChange.getCreateBy());  //现部门负责人
+			List<User> zjlList = UserUtils.findRszrList(createUser); //人事主任
+			if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+				workProjectNotify.setNotifyRole("");
+				workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+				List<Activity> activities = workActivityMenu.getActivities();
+				for (Activity a : activities) {
+					String encount = a.getEncount();
+					String enlist = a.getEnlist();
+					if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+						List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"24",workOfficeChange.getCreateBy());
+						if (enusers.size()==0){
+							workOfficeChange.setState("1");
+							this.save(workOfficeChange);
+							return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+						}
+						variables.put(enlist, enusers);
+						variables.put(encount, enusers.size());
+					}
+					if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+						activity = a;
+					}
+				}
+				buffer.append(activity.getRole().getEnname());
+				if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+					//角色审批
+					if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+						users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"24",workOfficeChange.getCreateBy());
+					}
+					//人员审批
+					if (StringUtils.isNotBlank(activity.getUser().getId())) {
+						users.add(activity.getUser());
+					}
+				}
+				workProjectNotify.setId("");
+			} else {
+				variables.put("bmzrList", bmzrList);
+				if (bmzrList.size()==0 ){
+					workOfficeChange.setState("1");
+					this.save(workOfficeChange);
+					return "流程审批人不能为空,请联系管理员!";
+				}
+				variables.put("bmzrCount",bmzrList.size());
+				processType = "jobChange";
+				users.addAll(bmzrList);
+			}
+			List<String> userIds = new ArrayList<>(users.size());
+			for (User u : users){
+				userIds.add(u.getId());
+				workProjectNotify.setUser(u);
+				workProjectNotify.setId("");
+				workProjectNotify.setNotifyRole("现部门主任审核");
+				workProjectNotifyService.save(workProjectNotify);
+				Map<String,Object> extras = new HashMap<>();
+				extras.put("type","7001");
+				extras.put("procDefKey","68");
+				extras.put("id",workProjectNotify.getId());
+				UserUtils.pushInfoToApp(titleStr, contentStr,extras,u.getId());
+			}
+			UserUtils.pushIm(userIds,contentStr);
+
+			variables.put("busId", businessKey);
+			variables.put("type", processType);
+			variables.put("title", "审批单:" +"转入部门:"+workOfficeChange.getChangeOfficeName());//设置标题;
+
+			ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+			if (org.apache.commons.lang3.StringUtils.isNotBlank(processInstanceId)) {
+				workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+				workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+				workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+			}
+			List<Activity> list = workActivityMenu.getActivities();
+			if (list != null && list.size() != 0) {
+				workActivityProcessService.saveList(list, processInstance.getId());
+			} else {
+				WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+				workActivityProcess.setProcessKey(processType);
+				workActivityProcess.setCount(1);
+				workActivityProcess.setProcessInstanceId(processInstance.getId());
+				workActivityProcess.setIsApproval("0");
+				workActivityProcessService.insert(workActivityProcess);
+				workActivityProcess.setCount(2);
+				workActivityProcessService.insert(workActivityProcess);
+				workActivityProcess.setCount(3);
+				workActivityProcessService.insert(workActivityProcess);
+				workActivityProcessService.insertAuditsByType(bmzrList,processInstance.getId(),1,1);
+				workActivityProcessService.insertAuditsByType(fgldList,processInstance.getId(),2,0);
+				workActivityProcessService.insertAuditsByType(zjlList,processInstance.getId(),3,0);
+			}
+			workOfficeChange.setProcessInstanceId(processInstance.getId());
+			workOfficeChange.setState("2");
+			dao.updateProcessInstanceId(workOfficeChange);
+		}catch (Exception e){
+			logger.error("启动审批流程异常:",e);
+			return "启动审批流程异常:"+e.getMessage();
+		}
+		return "";
+	}
+
+	/**
+	 * 审核流程
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(WorkOfficeChange workOfficeChange, List<User> auditUsers) {
+		String flag = workOfficeChange.getAct().getFlag();
+		// 对不同环节的业务逻辑进行操作
+		Act act = workOfficeChange.getAct();
+		String taskDefKey = act.getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey) && !taskDefKey.contains("audit")  ) {
+			actTaskService.claim(act.getTaskId(), UserUtils.getUser().getId());
+		}else {
+			flag = "yes";
+			this.save(workOfficeChange);
+		}
+		String title = "转入部门:"+workOfficeChange.getChangeOfficeName();
+		String str =  "转入部门:"+workOfficeChange.getChangeOfficeName();
+
+		if (StringUtils.isBlank(act.getComment())){
+			act.setComment(flag.equals("yes")?"同意":"驳回");
+		}
+		String comment = "";
+		if (workOfficeChange.getState().equals("4")){
+			comment = ("yes".equals(flag)?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(flag)?"[同意] ":"[驳回] ")+act.getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		workOfficeChange.setState(("yes".equals(flag) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(workOfficeChange.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(workOfficeChange.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("jobChange")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(flag)) {
+						workActivityProcess.setIsApproval("2");
+						workOfficeChange.setState("4");
+						String returnBack = "-1";
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								returnBack = activity.getReturnBack();
+								notifyRole = activity.getName();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					notifyRole = "调整申请";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(flag)) {
+						workOfficeChange.setState("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("jobChange");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				String count = activityProcess.getCount() + "";
+				workActivityProcess = activityProcess;
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("bmzr".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						vars.put("fgldList", auditUsers);
+						vars.put("fgldCount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workOfficeChange.getProcessInstanceId(),2,1);
+						notifyRole = "新部门主任审核";
+						workActivityProcess.setIsApproval("1");
+						enname = "fgld";
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				}
+				// 审核环节
+				else if ("fgld".equals(taskDefKey) && count.contains("2")) {
+					taskCount = "2";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						vars.put("zjlList", auditUsers);
+						vars.put("zjlCount",auditUsers.size());
+						workActivityProcessService.insertAuditsByType(auditUsers,workOfficeChange.getProcessInstanceId(),3,1);
+						notifyRole = "人事主任审核";
+						workActivityProcess.setIsApproval("1");
+						enname = "zjl";
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("zjl".equals(taskDefKey) && count.contains("3")) {
+					taskCount = "3";
+					exp = "pass";
+					if ("yes".equals(flag)) {
+						notifyRole = "审批通过";
+						this.changeOffice(workOfficeChange);
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				}  else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					notifyRole = "现部门主任审核";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "bmzr";
+					if (!"yes".equals(flag)) {
+						workOfficeChange.setState("3");
+					}
+					break;
+				}
+			}
+		}
+		// 设置意见
+		act.setComment(("yes".equals(flag) ? "[同意] " : "[驳回] ") + act.getComment());
+		workOfficeChange.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(flag) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,workOfficeChange.getProcessInstanceId(),taskDefKey,"modifyApply",flag,comment, activities);
+		// 提交流程任务
+		actTaskService.complete(act.getTaskId(), act.getProcInsId(), act.getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(act.getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		if (!state) {
+			users.add(workOfficeChange.getCreateBy());
+			if ("yes".equals(flag)) {
+				str =  "转入部门:"+workOfficeChange.getChangeOfficeName();
+				workOfficeChange.setState("5");
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOfficeChange.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(workOfficeChange.getId(),
+										workOfficeChange.getCreateBy(),
+										workOfficeChange.getCompanyId(),
+										title,
+										str,
+										"68",
+										"0",
+										"待通知",
+										notifyRole));
+
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOfficeChange.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(workOfficeChange.getState()) && !workOfficeChange.getState().equals("3")){
+					workOfficeChange.setState("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOfficeChange.getId(),
+											workOfficeChange.getCreateBy(),
+											workOfficeChange.getCompanyId(),
+											title,
+											str,
+											"68",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(workOfficeChange.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("jobChange")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOfficeChange.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(workOfficeChange.getId(),
+								new User(),
+								workOfficeChange.getCompanyId(),
+								title,
+								str,
+								"68",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						flag,
+						taskCount,
+						workOfficeChange.getCreateBy(),
+						workOfficeChange.getOfficeId(),
+						"68");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+				}
+
+			} else {
+				if (!"yes".equals(flag)) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(workOfficeChange.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOfficeChange.getId(),
+											workOfficeChange.getCreateBy(),
+											workOfficeChange.getCompanyId(),
+											title,
+											str,
+											"68",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( workOfficeChange.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOfficeChange.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(workOfficeChange.getId(),
+										new User(),
+										workOfficeChange.getCompanyId(),
+										title,
+										str,
+										"68",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1 : users) {
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setId("");
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+							Map<String,Object> extras = new HashMap<>();
+							extras.put("type","7001");
+							extras.put("procDefKey","68");
+							extras.put("id",workProjectNotify.getId());
+							UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOfficeChange.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.add(workOfficeChange.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(workOfficeChange.getId(),
+												workOfficeChange.getCreateBy(),
+												workOfficeChange.getCompanyId(),
+												title,
+												str,
+												"68",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),title);
+			}
+		}
+		if (users!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+		dao.update(workOfficeChange);
+		return "保存审核意见成功!";
+	}
+	/**
+	 * 撤回申请
+	 * @return
+	 */
+	@Transactional(readOnly = false)
+	public void cancelProcess(String id) throws Exception {
+		WorkOfficeChange workOfficeChange = this.get(id);
+		WorkActivityProcess process = new WorkActivityProcess();
+		process.setProcessInstanceId(workOfficeChange.getProcessInstanceId());
+		process.setIsApproval("0");
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		workActivityProcess.setProcessInstanceId(workOfficeChange.getProcessInstanceId());
+		List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workOfficeChange.getId());
+		List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+		if (userList!=null && userList.size()!=0) {
+			for (User u : userList) {
+				User user = UserUtils.get(u.getId());
+				UserUtils.pushIm(u.getId(),"调转人:"+ workOfficeChange.getUserName() +" 强制撤销!");
+			}
+		}
+		if(processList!=null && processList.size()>0){
+			for (int i =0;i<processList.size();i++) {
+				WorkActivityProcess p = processList.get(i);
+				if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+					p.setIsApproval("-1");
+					p.setDelFlag("1");
+					workActivityProcessDao.updateDelFlagAndIsApproval(p);
+				}
+			}
+			WorkActivityProcess pro = new WorkActivityProcess();
+			pro.setId("");
+			pro.setDelFlag("0");
+			pro.preInsert();
+			pro.setRemarks("[强制撤销]");
+			pro.setProcessKey(processList.get(0).getProcessKey());
+			pro.setIsApproval("1");
+			pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+			pro.setCount(0);
+			workActivityProcessDao.insert(pro);
+
+			//结束该流程,设为"撤销"状态月
+			WorkOfficeChange officeChange = new WorkOfficeChange();
+			officeChange.setId(id);
+			officeChange.setState("3");
+			officeChange.setProcessInstanceId(workOfficeChange.getProcessInstanceId());
+			officeChange.preUpdate();
+			this.updateStateById(officeChange);
+			actTaskService.endProcessInstance(officeChange.getProcessInstanceId(), "调转申请-撤回");
+		}
+	}
+	private void updateStateById(WorkOfficeChange workOfficeChange) {
+		dao.updateProcessInstanceId(workOfficeChange);
+	}
+/*
+* 部门调转后更改调转成员相关数据
+* */
+	private  void changeOffice(WorkOfficeChange workOfficeChange){
+		if(workOfficeChange.getWorkOfficeChangeUserList()!=null&&workOfficeChange.getWorkOfficeChangeUserList().size()>0){
+			for (WorkOfficeChangeUser workOfficeChangeUser:workOfficeChange.getWorkOfficeChangeUserList()){
+				User user=userDao.get(workOfficeChangeUser.getUserId());//修改人员表office
+				Office office=officeDao.get(workOfficeChange.getChangeOffice());
+				WorkStaffBasicInfo workStaffBasicInfo=	workStaffAchivesDao.get(workOfficeChangeUser.getBasicInfoId());
+				if(!workStaffBasicInfo.getOffice().getId().equals(workOfficeChange.getChangeOffice())){//如果该人员已在本部门不做修改
+					if(user!=null){
+						//清缓存
+						systemService.saveCurrentCompanyById(workOfficeChangeUser.getUserId(),user.getCompany().getId(),user.getOffice().getId());
+						//判断
+						//修改sys_user_office
+						Useroffice useroffice=new Useroffice();
+						useroffice.setUserId(workOfficeChangeUser.getUserId());
+						useroffice.setCompanyId(workStaffBasicInfo.getCompany().getId());
+						useroffice.setOfficeId(workOfficeChange.getChangeOffice());
+						Useroffice useroffice1=userofficeDao.findOfficeId(useroffice);
+						if(useroffice1 != null) {
+							if (useroffice1.getOfficeId().equals(user.getOffice().getId())) {
+								user.setId(workOfficeChangeUser.getUserId());
+								user.setOffice(office);
+								userDao.update(user);
+							}
+						}
+						userofficeDao.updateOffice(useroffice);
+						//在新部门增加默认岗位
+//						Role r=new Role();
+//						r.setOffice(office);
+//						r.setName("员工");
+//						r.setEnname("yg");
+//						List<Role> list=new ArrayList<>();
+//						Role role=roleDao.getRoleByOfficeId(r);
+//						if(role!=null){
+//							list.add(role);
+//							User uu=new User();
+//							uu.setId(workOfficeChangeUser.getUserId());
+//							uu.setRoleList(list);
+//							//查询是否存在员工岗位
+//							List userRole=userDao.findUserRole(workOfficeChangeUser.getUserId(),role.getId());
+//							if(userRole==null||list.size() ==0 ){
+//								userDao.insertUserRole(uu);
+//							}
+//						}
+
+					}
+					//修改入职登记表office
+					workStaffBasicInfo.setId(workOfficeChangeUser.getBasicInfoId());
+					workStaffBasicInfo.setOffice(office);
+					workStaffAchivesDao.update(workStaffBasicInfo);
+				}
+				//如果新职级不为空
+				if(workOfficeChangeUser.getJobGrade2().getId()!=null&&!"".equals(workOfficeChangeUser.getJobGrade2().getId())){
+					WorkJobGrade workJobGrade=workJobGradeDao.get(workOfficeChangeUser.getJobGrade2().getId());
+					workStaffBasicInfo.setJobGrade(workJobGrade);
+					workStaffBasicInfo.setSalary(workJobGrade.getPay());
+					workStaffAchivesDao.update(workStaffBasicInfo);
+				}
+			}
+			String userId = workOfficeChange.getWorkOfficeChangeUserList().get(0).getUserId();
+			String roleId = workOfficeChange.getRoleId();
+			WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+			workStaffBasicInfo.setUserId(userId);
+			workStaffBasicInfo.setRoleId(roleId);
+			userService.updateRole(workStaffBasicInfo);
+		}
+
+	}
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/workofficechange/service/WorkOfficeChangeUserService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChangeUser;
+import com.jeeplus.modules.workofficechange.dao.WorkOfficeChangeUserDao;
+
+/**
+ * 调转成员Service
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOfficeChangeUserService extends CrudService<WorkOfficeChangeUserDao, WorkOfficeChangeUser> {
+
+	public WorkOfficeChangeUser get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkOfficeChangeUser> findList(WorkOfficeChangeUser workOfficeChangeUser) {
+		return super.findList(workOfficeChangeUser);
+	}
+	
+	public Page<WorkOfficeChangeUser> findPage(Page<WorkOfficeChangeUser> page, WorkOfficeChangeUser workOfficeChangeUser) {
+		return super.findPage(page, workOfficeChangeUser);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkOfficeChangeUser workOfficeChangeUser) {
+		super.save(workOfficeChangeUser);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkOfficeChangeUser workOfficeChangeUser) {
+		super.delete(workOfficeChangeUser);
+	}
+	
+	
+	
+	
+}

+ 404 - 0
src/main/java/com/jeeplus/modules/workofficechange/web/WorkOfficeChangeController.java

@@ -0,0 +1,404 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.web;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workmonthlyplan.entity.WorkMonthlyPlanThis;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChangeUser;
+import com.jeeplus.modules.workofficechange.service.WorkOfficeChangeUserService;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularApply;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularContent;
+import com.jeeplus.modules.workregularapply.entity.WorkRegularScore;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChange;
+import com.jeeplus.modules.workofficechange.service.WorkOfficeChangeService;
+
+/**
+ * 部门调转Controller
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workofficechange/workOfficeChange")
+public class WorkOfficeChangeController extends BaseController {
+	@Autowired
+	private HttpServletRequest request;
+	@Autowired
+	private WorkOfficeChangeService workOfficeChangeService;
+	@Autowired
+	private WorkOfficeChangeUserService workOfficeChangeUserService;
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private UserDao userDao;
+	@ModelAttribute
+	public WorkOfficeChange get(@RequestParam(required=false) String id) {
+		WorkOfficeChange entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workOfficeChangeService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkOfficeChange();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 部门调转列表页面
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkOfficeChange workOfficeChange, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkOfficeChange> page = workOfficeChangeService.findPage(new Page<WorkOfficeChange>(request, response), workOfficeChange); 
+		model.addAttribute("page", page);
+		return "modules/workofficechange/workOfficeChangeList";
+	}
+
+	/**
+	 * 查看,增加,编辑部门调转表单页面
+	 */
+	@RequiresPermissions(value={"workofficechange:workOfficeChange:view","workofficechange:workOfficeChange:add","workofficechange:workOfficeChange:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkOfficeChange workOfficeChange, Model model) {
+		String flat=request.getParameter("tabId");
+		if("1".equals(flat)){
+			workOfficeChange.setUserName(UserUtils.getUser().getName());
+			workOfficeChange.setChanger(UserUtils.getUser().getId());
+		}else{
+			WorkOfficeChangeUser workOfficeChangeUser=new WorkOfficeChangeUser();
+			workOfficeChangeUser.setChangeId(workOfficeChange.getId());
+			List<WorkOfficeChangeUser> workOfficeChangeUserList=workOfficeChangeUserService.findList(workOfficeChangeUser);
+			workOfficeChange.setWorkOfficeChangeUserList(workOfficeChangeUserList);
+		}
+		model.addAttribute("workOfficeChange", workOfficeChange);
+		return "modules/workofficechange/workOfficeChangeForm";
+	}
+
+	/**
+	 * 保存部门调转
+	 */
+	@RequiresPermissions(value={"workofficechange:workOfficeChange:add","workofficechange:workOfficeChange:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkOfficeChange workOfficeChange, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOfficeChange)){
+			return form(workOfficeChange, model);
+		}
+		workOfficeChange.setState("2");
+		if(!workOfficeChange.getIsNewRecord()){//编辑表单保存
+			WorkOfficeChange t = workOfficeChangeService.get(workOfficeChange.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOfficeChange, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			String str =workOfficeChangeService.saveChange(t);//保存
+			if (StringUtils.isNotBlank(str)){
+				addMessage(redirectAttributes, "部门调转申请提交失败:"+str);
+			}else {
+				addMessage(redirectAttributes, "部门调转申请已经提交");
+			}
+		}else{//新增表单保存
+			workOfficeChange.setCompanyId(UserUtils.getSelectCompany().getId());
+			workOfficeChange.setOfficeId(UserUtils.getSelectOffice().getId());
+			String str=workOfficeChangeService.saveChange(workOfficeChange);//保存
+			if (StringUtils.isNotBlank(str)){
+				addMessage(redirectAttributes, "部门调转申请提交失败:"+str);
+			}else {
+				addMessage(redirectAttributes, "部门调转申请已经提交");
+			}
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+	}
+	/**
+	 * 保存部门调转
+	 */
+	@RequiresPermissions(value={"workofficechange:workOfficeChange:add","workofficechange:workOfficeChange:edit"},logical=Logical.OR)
+	@RequestMapping(value = "store")
+	public String store(WorkOfficeChange workOfficeChange, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOfficeChange)){
+			return form(workOfficeChange, model);
+		}
+		workOfficeChange.setState("1");
+		if(!workOfficeChange.getIsNewRecord()){//编辑表单保存
+			WorkOfficeChange t = workOfficeChangeService.get(workOfficeChange.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOfficeChange, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workOfficeChangeService.save(t);//保存
+		}else{//新增表单保存
+			workOfficeChange.setCompanyId(UserUtils.getSelectCompany().getId());
+			workOfficeChange.setOfficeId(UserUtils.getSelectOffice().getId());
+			workOfficeChangeService.save(workOfficeChange);//保存
+		}
+		addMessage(redirectAttributes, "保存部门调转成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+	}
+	/**
+	 * 删除部门调转
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkOfficeChange workOfficeChange, RedirectAttributes redirectAttributes) {
+		if("5".equals(workOfficeChange.getState())|| "2".equals(workOfficeChange.getState())){
+			if("5".equals(workOfficeChange.getState())){
+				addMessage(redirectAttributes, "部门调转已审批通过,无法删除");
+				return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+			}else{
+				addMessage(redirectAttributes, "部门调转正在审核中,无法删除");
+				return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+			}
+		}
+		workOfficeChangeService.delete(workOfficeChange);
+		addMessage(redirectAttributes, "删除部门调转成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+	}
+	
+	/**
+	 * 批量删除部门调转
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workOfficeChangeService.delete(workOfficeChangeService.get(id));
+		}
+		addMessage(redirectAttributes, "删除部门调转成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkOfficeChange workOfficeChange, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "部门调转"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkOfficeChange> page = workOfficeChangeService.findPage(new Page<WorkOfficeChange>(request, response, -1), workOfficeChange);
+    		new ExportExcel("部门调转", WorkOfficeChange.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出部门调转记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkOfficeChange> list = ei.getDataList(WorkOfficeChange.class);
+			for (WorkOfficeChange workOfficeChange : list){
+				try{
+					workOfficeChangeService.save(workOfficeChange);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条部门调转记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条部门调转记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入部门调转失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+    }
+	
+	/**
+	 * 下载导入部门调转数据模板
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChange:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "部门调转数据导入模板.xlsx";
+    		List<WorkOfficeChange> list = Lists.newArrayList(); 
+    		new ExportExcel("部门调转数据", WorkOfficeChange.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChange/?repage";
+    }
+
+
+	//获取入职信息
+	@RequestMapping(value = "getBasicInfo")
+	@ResponseBody
+	public List<WorkStaffBasicInfo> getBasicInfo(String ids)  {
+		String arr[]=ids.split(",");
+		List<WorkStaffBasicInfo> workStaffBasicInfoList=new ArrayList<>();
+		for(String id:arr){
+			WorkStaffBasicInfo workStaffBasicInfo =new WorkStaffBasicInfo();
+			workStaffBasicInfo.setId(id);
+			WorkStaffBasicInfo w=workOfficeChangeService.getWorkStaffBasicInfo(id);
+			if(w!=null){
+				workStaffBasicInfoList.add(w);
+			}
+		}
+		return  workStaffBasicInfoList;
+	}
+	/**
+	 * 工单执行(完成任务)
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkOfficeChange workOfficeChange, Model model,
+							RedirectAttributes redirectAttributes) {
+//		try {
+			// 对不同环节的业务逻辑进行操作
+			String taskDefKey = workOfficeChange.getAct().getTaskDefKey();
+			List<User> users = null;
+			User createUser = UserUtils.getUser();
+			String newOfficeId = workOfficeChange.getChangeOffice();
+			if ("bmzr".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workOfficeChange.getProcessInstanceId(),2);
+				if (users==null )
+					users = UserUtils.getByRoleActivityEnname("bmzr",2,newOfficeId,"68",workOfficeChange.getCreateBy());
+			}else  if ("fgld".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workOfficeChange.getProcessInstanceId(),3);
+				if (users==null )
+					users = UserUtils.findRszrList(createUser);
+			}else  if ("zjl".equals(taskDefKey)){
+				users = UserUtils.findRszrList(createUser);
+			}else if ("modifyApply".equals(taskDefKey)){
+				users = UserUtils.getByProssType(workOfficeChange.getProcessInstanceId(),1);
+			}
+			if (users==null || (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = workOfficeChangeService.auditSave(workOfficeChange,users);
+				addMessage(redirectAttributes, str);
+			}
+//		}catch (Exception e){
+//			logger.info("Exception e:"+e);
+//			addMessage(redirectAttributes, "审批失败");
+//		}
+		if (StringUtils.isNotBlank(workOfficeChange.getHome()) && "home".equals(workOfficeChange.getHome())) {
+			return "redirect:" + Global.getAdminPath() + "/home/?repage";
+		} else {
+			return "redirect:" + Global.getAdminPath() + "/workofficechange/workOfficeChange/?repage";
+		}
+	}
+
+	//	审批页面
+	@RequestMapping(value = "audit")
+	public String workContractInfoAudit(Act act, WorkOfficeChange workOfficeChange, Model model) {
+
+		if (act.getProcInsId() != null) {
+			if (actTaskService.getProcIns(act.getProcInsId()) != null) {
+				act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+			} else {
+				act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+			}
+		}
+		if (act != null && StringUtils.isNotBlank(act.getTaskId())) {
+			workOfficeChange.setAct(act);
+			model.addAttribute("processInstanceId", workOfficeChange.getProcessInstanceId());
+		}
+		model.addAttribute("workOfficeChange", workOfficeChange);
+		return "modules/workofficechange/workOfficeChangeAudit";
+	}
+
+	@RequiresPermissions(value={"workofficechange:workOfficeChange:edit"},logical=Logical.OR)
+	@RequestMapping(value = "modify")
+	public String modify(WorkOfficeChange workOfficeChange, Model model, RedirectAttributes redirectAttributes) {
+		workOfficeChange=workOfficeChangeService.get(workOfficeChange.getId());
+		ProcessInstance processInstance = actTaskService.getProcIns(workOfficeChange.getProcessInstanceId());
+		if (processInstance!=null) {
+			Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+			Act act = new Act();
+			act.setTaskId(taskInfok.getId());
+			act.setTaskName(taskInfok.getName());
+			act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+			act.setProcDefId(taskInfok.getProcessDefinitionId());
+			act.setProcInsId(taskInfok.getProcessInstanceId());
+			act.setTask(taskInfok);
+			workOfficeChange.setAct(act);
+		}
+		WorkOfficeChangeUser workOfficeChangeUser=new WorkOfficeChangeUser();
+		workOfficeChangeUser.setChangeId(workOfficeChange.getId());
+		List<WorkOfficeChangeUser> workOfficeChangeUserList=workOfficeChangeUserService.findList(workOfficeChangeUser);
+		workOfficeChange.setWorkOfficeChangeUserList(workOfficeChangeUserList);
+		model.addAttribute("workOfficeChange", workOfficeChange);
+		return "modules/workofficechange/workOfficeChangeModifyApply";
+	}
+
+	@RequestMapping(value = "getProcess")
+	public String getProcess(WorkOfficeChange workOfficeChange, Model model, HttpServletRequest request){
+		model.addAttribute("processInstanceId", workOfficeChange.getProcessInstanceId());
+		return "modules/workofficechange/workOfficeChangeTask";
+	}
+
+	@RequiresPermissions(value={"workofficechange:workOfficeChange:edit"},logical=Logical.OR)
+	@RequestMapping(value = "revoke")
+	public String revoke(HttpServletRequest request, RedirectAttributes redirectAttributes) {
+		HashMap<String, String> requestMap = findRequestMap(request);
+		String processInstanceId = requestMap.get("processInstanceId");
+		String id = requestMap.get("id");
+		try {
+			workOfficeChangeService.cancelProcess(id);
+			addMessage(redirectAttributes, "撤回调转申请成功");
+		}catch (Exception e){
+			logger.info(e.getMessage());
+			addMessage(redirectAttributes, "撤回调转申请失败");
+		}
+		return "redirect:" + Global.getAdminPath() + "/workofficechange/workOfficeChange/?repage";
+	}
+
+
+	@RequestMapping(value = "view")
+	public String view(WorkOfficeChange workOfficeChange, Model model) {
+		WorkOfficeChangeUser workOfficeChangeUser=new WorkOfficeChangeUser();
+		workOfficeChangeUser.setChangeId(workOfficeChange.getId());
+		List<WorkOfficeChangeUser> workOfficeChangeUserList=workOfficeChangeUserService.findList(workOfficeChangeUser);
+		workOfficeChange.setWorkOfficeChangeUserList(workOfficeChangeUserList);
+		model.addAttribute("workOfficeChange", workOfficeChange);
+		return "modules/workofficechange/workOfficeChangeView";
+	}
+}

+ 237 - 0
src/main/java/com/jeeplus/modules/workofficechange/web/WorkOfficeChangeUserController.java

@@ -0,0 +1,237 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workofficechange.web;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.workjobgrade.dao.WorkJobGradeDao;
+import com.jeeplus.modules.workjobgrade.entity.WorkJobGrade;
+import com.jeeplus.modules.workreceiptsregister.entity.ResponseEntity;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workofficechange.entity.WorkOfficeChangeUser;
+import com.jeeplus.modules.workofficechange.service.WorkOfficeChangeUserService;
+
+/**
+ * 调转成员Controller
+ * @author chenyuping
+ * @version 2018-08-01
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workofficechange/workOfficeChangeUser")
+public class WorkOfficeChangeUserController extends BaseController {
+
+	@Autowired
+	private WorkOfficeChangeUserService workOfficeChangeUserService;
+    @Autowired
+    private WorkStaffAchivesDao workStaffAchivesDao;
+    @Autowired
+    private WorkJobGradeDao workJobGradeDao;
+	@ModelAttribute
+	public WorkOfficeChangeUser get(@RequestParam(required=false) String id) {
+		WorkOfficeChangeUser entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workOfficeChangeUserService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkOfficeChangeUser();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 调转成员列表页面
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChangeUser:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkOfficeChangeUser workOfficeChangeUser, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkOfficeChangeUser> page = workOfficeChangeUserService.findPage(new Page<WorkOfficeChangeUser>(request, response), workOfficeChangeUser); 
+		model.addAttribute("page", page);
+		return "modules/workofficechange/workOfficeChangeUserList";
+	}
+
+	/**
+	 * 查看,增加,编辑调转成员表单页面
+	 */
+	@RequiresPermissions(value={"workofficechange:workOfficeChangeUser:view","workofficechange:workOfficeChangeUser:add","workofficechange:workOfficeChangeUser:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkOfficeChangeUser workOfficeChangeUser, Model model) {
+		model.addAttribute("workOfficeChangeUser", workOfficeChangeUser);
+		return "modules/workofficechange/workOfficeChangeUserForm";
+	}
+
+	/**
+	 * 保存调转成员
+	 */
+	@RequiresPermissions(value={"workofficechange:workOfficeChangeUser:add","workofficechange:workOfficeChangeUser:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkOfficeChangeUser workOfficeChangeUser, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOfficeChangeUser)){
+			return form(workOfficeChangeUser, model);
+		}
+		if(!workOfficeChangeUser.getIsNewRecord()){//编辑表单保存
+			WorkOfficeChangeUser t = workOfficeChangeUserService.get(workOfficeChangeUser.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOfficeChangeUser, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workOfficeChangeUserService.save(t);//保存
+		}else{//新增表单保存
+			workOfficeChangeUserService.save(workOfficeChangeUser);//保存
+		}
+		addMessage(redirectAttributes, "保存调转成员成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChangeUser/?repage";
+	}
+	
+	/**
+	 * 删除调转成员
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChangeUser:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkOfficeChangeUser workOfficeChangeUser, RedirectAttributes redirectAttributes) {
+		workOfficeChangeUserService.delete(workOfficeChangeUser);
+		addMessage(redirectAttributes, "删除调转成员成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChangeUser/?repage";
+	}
+	
+	/**
+	 * 批量删除调转成员
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChangeUser:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workOfficeChangeUserService.delete(workOfficeChangeUserService.get(id));
+		}
+		addMessage(redirectAttributes, "删除调转成员成功");
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChangeUser/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workofficechange:workOfficeChangeUser:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkOfficeChangeUser workOfficeChangeUser, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "调转成员"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkOfficeChangeUser> page = workOfficeChangeUserService.findPage(new Page<WorkOfficeChangeUser>(request, response, -1), workOfficeChangeUser);
+    		new ExportExcel("调转成员", WorkOfficeChangeUser.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出调转成员记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChangeUser/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	//@RequiresPermissions("workofficechange:workOfficeChangeUser:import")
+    @RequestMapping(value = "import")
+	@ResponseBody
+    public ResponseEntity importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+        List<WorkStaffBasicInfo> workStaffBasicInfos=new ArrayList<>();
+        ResponseEntity<WorkStaffBasicInfo> responseEntity = new ResponseEntity<>();
+        try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkOfficeChangeUser> list = ei.getDataList(WorkOfficeChangeUser.class);
+
+            StringBuilder stringBuilder=new StringBuilder();
+			for (WorkOfficeChangeUser workOfficeChangeUser : list){
+				try{
+                    WorkStaffBasicInfo workStaffBasicInfo=new WorkStaffBasicInfo();
+                    workStaffBasicInfo.setNo(workOfficeChangeUser.getNo());
+                    workStaffBasicInfo.setName(workOfficeChangeUser.getName());
+                    WorkStaffBasicInfo basicInfo=workStaffAchivesDao.findUserInfoExcel(workStaffBasicInfo);
+                    Boolean flat=false;
+                    if(basicInfo!=null){
+                        flat=true;
+                        if(StringUtils.isNotBlank(workOfficeChangeUser.getNewJob())){
+                            WorkJobGrade jobGrade=new WorkJobGrade();
+                            jobGrade.setName(workOfficeChangeUser.getNewJob());
+                            jobGrade.setBranchOffice(basicInfo.getBranchOffice().getId());
+                            List<WorkJobGrade> workJobGrades=workJobGradeDao.findByBranchOffice(jobGrade);
+                            if(workJobGrades!=null&&workJobGrades.size()>0){
+                                basicInfo.setSqlStr(workJobGrades.get(0).getName());
+                                basicInfo.setBankName(workJobGrades.get(0).getId());
+                                workStaffBasicInfos.add(basicInfo);
+                                flat=false;
+                                successNum++;
+                            }else{
+                                stringBuilder.append("员工:"+workOfficeChangeUser.getName()+"的新职级!["+workOfficeChangeUser.getNewJob()+"]在系统中未定义请联系管理员!");
+                            }
+                        }
+                        if(flat){
+                            successNum++;
+                            workStaffBasicInfos.add(basicInfo);
+                        }
+                    }else{
+                        stringBuilder.append("员工:["+workOfficeChangeUser.getName()+"]在人员档案中未找到!");
+                    }
+                    responseEntity.setData(workStaffBasicInfos);
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条调转成员记录。");
+			}
+			//addMessage(redirectAttributes, "已成功导入 "+successNum+" 条调转成员记录"+failureMsg+stringBuilder.toString());
+            responseEntity.setMessage("已成功导入 "+successNum+" 条调转成员记录"+failureMsg+stringBuilder.toString());
+		} catch (Exception e) {
+			//addMessage(redirectAttributes, "导入调转成员失败!失败信息:"+e.getMessage());
+            responseEntity.setMessage("导入调转成员失败!失败信息:"+e.getMessage());
+		}
+		return responseEntity;
+    }
+	
+	/**
+	 * 下载导入调转成员数据模板
+	 */
+	//@RequiresPermissions("workofficechange:workOfficeChangeUser:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "调转成员数据导入模板.xlsx";
+    		List<WorkOfficeChangeUser> list = Lists.newArrayList(); 
+    		new ExportExcel("调转成员数据", WorkOfficeChangeUser.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workofficechange/workOfficeChangeUser/?repage";
+    }
+	
+	
+	
+
+}

+ 43 - 0
src/main/java/com/jeeplus/modules/workout/dao/WorkOutDao.java

@@ -0,0 +1,43 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workout.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workout.entity.WorkOut;
+import com.jeeplus.modules.workovertime.entity.WorkOvertime;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 出差申请DAO接口
+ * @author ssrh
+ * @version 2018-09-06
+ */
+@MyBatisDao
+public interface WorkOutDao extends CrudDao<WorkOut> {
+
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(WorkOut workOut);
+
+    /**
+     * 根据流程实例ID获取
+     * @param processInstanceId
+     * @return
+     */
+    public WorkOut getByProcessInstanceId(String processInstanceId);
+
+    /**
+     * 根据时间和档案id查询数据
+     * @param staffId,time
+     * @return
+     */
+    public WorkOut getByStaffIdAndTime(@Param("staffId")String staffId, @Param("time")String time);
+
+    List<WorkOut> findListValidateTime(String staffId);
+}

+ 251 - 0
src/main/java/com/jeeplus/modules/workout/entity/WorkOut.java

@@ -0,0 +1,251 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workout.entity;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.modules.sys.entity.Office;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+/**
+ * 出差申请Entity
+ * @author ssrh
+ * @version 2018-09-06
+ */
+public class WorkOut extends ActEntity<WorkOut> {
+	//出差 zzsql3125qwer94clzsqasdfiiii750904 (通知78 附件73 编码28	assignmentType20)
+	private static final long serialVersionUID = 1L;
+
+	public static final String SERIAL_BIZCODE = "28";
+	private String processInstanceId;		// 流程号
+	private String officeId;		// 部门
+	private String companyId;		// 公司
+	private String num;		// 加班编号
+	private String name;		// 姓名
+	private Date startDate;		// 开始日期
+	private String startType;		// 类型1
+	private Date endDate;		// 结束日期
+	private String endType;		// 类型2
+	private String reason;		// 出差事由
+	private WorkStaffBasicInfo workStaffBasicInfo;		// 档案
+	private String status;		// 状态
+	private String days;		// 出差天数
+	private String address;		// 出差地点
+	private String home;
+	private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public WorkOut() {
+		super();
+	}
+
+	public WorkOut(String id){
+		super(id);
+	}
+
+	@ExcelField(title="流程号", align=2, sort=7)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	@ExcelField(title="公司", align=2, sort=9)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="加班编号", align=2, sort=10)
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	@ExcelField(title="姓名", align=2, sort=11)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="开始日期", align=2, sort=12)
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+	
+	@ExcelField(title="类型1", align=2, sort=13)
+	public String getStartType() {
+		return startType;
+	}
+
+	public void setStartType(String startType) {
+		this.startType = startType;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="结束日期", align=2, sort=14)
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+	
+	@ExcelField(title="类型2", align=2, sort=15)
+	public String getEndType() {
+		return endType;
+	}
+
+	public void setEndType(String endType) {
+		this.endType = endType;
+	}
+	
+	@ExcelField(title="出差事由", align=2, sort=16)
+	public String getReason() {
+		return reason;
+	}
+
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+
+	public WorkStaffBasicInfo getWorkStaffBasicInfo() {
+		return workStaffBasicInfo;
+	}
+
+	public void setWorkStaffBasicInfo(WorkStaffBasicInfo workStaffBasicInfo) {
+		this.workStaffBasicInfo = workStaffBasicInfo;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	public List<WorkClientAttachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+	@ExcelField(title="状态", align=2, sort=18)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="出差天数", align=2, sort=19)
+	public String getDays() {
+		return days;
+	}
+
+	public void setDays(String days) {
+		this.days = days;
+	}
+	
+	@ExcelField(title="出差地点", align=2, sort=20)
+	public String getAddress() {
+		return address;
+	}
+
+	public void setAddress(String address) {
+		this.address = address;
+	}
+	
+}

+ 756 - 0
src/main/java/com/jeeplus/modules/workout/service/WorkOutService.java

@@ -0,0 +1,756 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workout.service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.leaveapply.service.LeaveApplyService;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workfield.service.WorkFieldService;
+import com.jeeplus.modules.workovertime.dao.WorkOvertimeDao;
+import com.jeeplus.modules.workovertime.entity.WorkOvertime;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.ActivitiObjectNotFoundException;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workout.entity.WorkOut;
+import com.jeeplus.modules.workout.dao.WorkOutDao;
+
+/**
+ * 出差申请Service
+ * @author ssrh
+ * @version 2018-09-06
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOutService extends CrudService<WorkOutDao, WorkOut> {
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private SerialNumTplService serialNumTplService;
+
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private LeaveApplyService leaveApplyService;
+	@Autowired
+	@Lazy
+	private WorkFieldService workFieldService;
+
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private WorkStaffAchivesDao workStaffAchivesDao;
+	@Autowired
+	private WorkClientAttachmentDao workClientAttachmentDao;
+	@Autowired
+	private WorkOutDao workOutDao;
+
+	public WorkOut get(String id) {
+		WorkOut workOut = super.get(id);
+		if(workOut!=null){
+			//附件
+			WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+			workClientAttachment.setAttachmentId(id);
+			workClientAttachment.setAttachmentFlag("73");
+			workOut.setWorkAttachments(workClientAttachmentDao.findList(workClientAttachment));
+		}
+		return workOut;
+	}
+
+	public WorkOut getByStaffIdAndTime(String staffId, String time) {
+		WorkOut workOut = dao.getByStaffIdAndTime(staffId, time);
+		return workOut;
+	}
+
+	public List<WorkOut> findList(WorkOut workOut) {
+		return super.findList(workOut);
+	}
+	
+	public Page<WorkOut> findPage(Page<WorkOut> page, WorkOut workOut) {
+		workOut.getSqlMap().put("dsf", dataScopeFilter(workOut.getCurrentUser(), "o", "u","s", MenuStatusEnum.WORK_OUT.getValue()));
+		workOut.setPage(page);
+		page.setList(findList(workOut));
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkOut workOut) {
+		super.save(workOut);
+		updateInfo(workOut);
+	}
+
+	@Transactional(readOnly = false)
+	public void updateInfo(WorkOut workOut) {
+		//附件信息
+		for (WorkClientAttachment workClientAttachment : workOut.getWorkAttachments()) {
+			if (workClientAttachment.getId() == null) {
+				continue;
+			}
+			if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+				workClientAttachment.setAttachmentId(workOut.getId());
+				workClientAttachment.setAttachmentFlag("73");
+				workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+				if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+					workClientAttachment.preInsert();
+					workClientAttachmentDao.insert(workClientAttachment);
+				} else {
+					workClientAttachment.preUpdate();
+					workClientAttachmentDao.update(workClientAttachment);
+				}
+			} else {
+				workClientAttachmentDao.delete(workClientAttachment);
+			}
+		}
+	}
+
+	//时间验证
+	@Transactional(readOnly = false)
+	public String validateTime(Date startTime, String startType, Date endTime, String endType){
+		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
+		WorkStaffBasicInfo workStaffBasicInfo=leaveApplyService.getBasicInfo();
+		List<WorkOut> leaveDetails=workOutDao.findListValidateTime(workStaffBasicInfo.getId());
+		double start=Integer.parseInt(sdf1.format(startTime));
+		double end=Integer.parseInt(sdf1.format(endTime));
+		if("2".equals(startType)){
+			start=start+0.5;
+		}
+		if("2".equals(endType)){
+			end=end+0.5;
+		}
+		for(int i=0;i<leaveDetails.size();i++){
+			WorkOut detail=leaveDetails.get(i);
+			Date stateTime1 = detail.getStartDate();
+			double start1=Integer.parseInt(sdf1.format(stateTime1));
+			Date realEndTime1 = detail.getEndDate();
+			double realEnd1=Integer.parseInt(sdf1.format(realEndTime1));
+			String startType1 = detail.getStartType();
+			String realEndType1 = detail.getEndType();
+			if("2".equals(startType1)){
+				start1=start1+0.5;
+			}
+			if("2".equals(realEndType1)){
+				realEnd1=realEnd1+0.5;
+			}
+			if((start>=start1&&start<=realEnd1)||(end>=start1&&end<=realEnd1)
+					||(start1>=start&&start1<=end)||(realEnd1>=start&&realEnd1<=end)){
+				return  "出差时间存在重叠情况!";
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 提交存储
+	 * @param
+	 * @param variables
+	 */
+	@Transactional(readOnly = false)
+	public String save(WorkOut workOut, Map<String, Object> variables, String processInstanceId) {
+		//时间校验
+		String sign1 = leaveApplyService.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+		if(StringUtils.isNotBlank(sign1)){
+			updateInfo(workOut);
+			if("2".equals(workOut.getStatus())){
+				workOut.setStatus("1");
+			}
+			super.save(workOut);
+			return sign1;
+		}else{
+			String sign2 = workFieldService.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+			if(StringUtils.isNotBlank(sign2)){
+				updateInfo(workOut);
+				if("2".equals(workOut.getStatus())){
+					workOut.setStatus("1");
+				}
+				super.save(workOut);
+				return sign2;
+			}else{
+				String sign3 = this.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+				if(StringUtils.isNotBlank(sign3)){
+					updateInfo(workOut);
+					if("2".equals(workOut.getStatus())){
+						workOut.setStatus("1");
+					}
+					super.save(workOut);
+					return sign3;
+				}
+			}
+		}
+		User user = UserUtils.getUser();
+		if (StringUtils.isBlank(workOut.getNum())) {
+			workOut.setNum(serialNumTplService.genSerialNum(user.getCompany(), workOut.SERIAL_BIZCODE));
+		}
+		super.save(workOut);
+		Office office = officeService.get(workOut.getOfficeId());
+		String str =  "出差申请编号:"+workOut.getNum()+",出差事由:"+workOut.getReason()+",所属部门:"+office.getName();
+		String title = "出差申请人:"+user.getName();
+		updateInfo(workOut);
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(user.getId());
+		// 启动流程
+		String businessKey = workOut.getId().toString();
+		WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194clzsqasdfiiii750904", office);
+		// 启动流程
+		String processType = workActivityMenu.getProcessType();
+		StringBuffer buffer = new StringBuffer();
+		Activity activity = new Activity();
+		WorkProjectNotify workProjectNotify = UtilNotify
+				.saveNotify(workOut.getId(),
+						null,
+						workOut.getCompanyId(),
+						title,
+						str,
+						"78",
+						"0",
+						"待审批",
+						""
+				);
+		List<User> users = new ArrayList<>();
+		List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"20",workOut.getCreateBy());
+		if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+			workProjectNotify.setNotifyRole("");
+			workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+			List<Activity> activities = workActivityMenu.getActivities();
+			for (Activity a : activities) {
+				String encount = a.getEncount();
+				String enlist = a.getEnlist();
+				if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+					List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"20",workOut.getCreateBy());
+					if (enusers.size()==0){
+						workOut.setStatus("1");
+						super.save(workOut);
+						return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+					}
+					variables.put(enlist, enusers);
+					variables.put(encount, enusers.size());
+				}
+				if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+					activity = a;
+				}
+			}
+			buffer.append(activity.getRole().getEnname());
+			if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+				//角色审批
+				if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+					users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"20",workOut.getCreateBy());
+				}
+				//人员审批
+				if (StringUtils.isNotBlank(activity.getUser().getId())) {
+					users.add(activity.getUser());
+				}
+			}
+			workProjectNotify.setId("");
+		} else {
+			variables.put("bmzrList", bmzrs);
+			if (bmzrs.size()==0 ){
+				workOut.setStatus("1");
+				super.save(workOut);
+			}
+			if (bmzrs.size()==0){
+				return "流程审批人不能为空,角色部门负责人下无用户,请联系管理员!";
+			}
+			variables.put("bmzrcount",bmzrs.size());
+			processType = "workout";
+			users.addAll(bmzrs);
+		}
+		for (User u : users){
+			workProjectNotify.setUser(u);
+			workProjectNotify.setId("");
+			workProjectNotify.setNotifyRole("部门负责人审批");
+			workProjectNotifyService
+					.save(workProjectNotify);
+			Map<String,Object> extras = new HashMap<>();
+			extras.put("type","7002");
+			extras.put("id",workProjectNotify.getId());
+			extras.put("procDefKey","78");
+			UserUtils.pushInfoToApp(title,str,extras,u.getId());
+			UserUtils.pushIm(u.getId(),str);
+		}
+		variables.put("type", processType);
+		variables.put("busId", businessKey);
+		variables.put("title", "审批单:" + workOut.getNum());//设置标题;
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+		workOut.setProcessInstance(processInstance);
+		if (StringUtils.isNotBlank(processInstanceId)) {
+			workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+			workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+			workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+		}
+		// 更新流程实例ID
+		workOut.setProcessInstanceId(processInstance.getId());
+		workOutDao.updateProcessInstanceId(workOut);
+		List<Activity> list = workActivityMenu.getActivities();
+		if (list != null && list.size() != 0) {
+			workActivityProcessService.saveList(list, processInstance.getId());
+		} else {
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessKey("workout");
+			workActivityProcess.setCount(1);
+			workActivityProcess.setProcessInstanceId(processInstance.getId());
+			workActivityProcess.setIsApproval("0");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),1,1);
+		}
+		logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[]{
+				ActUtils.PD_REIMBURSEMENT[0], businessKey, processInstance.getId(), variables});
+		return "";
+	}
+	@Transactional(readOnly = false)
+	public void delete(WorkOut workOut) {
+		super.delete(workOut);
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workOut.getId());
+		List<User> users = workProjectNotifyService.readByNotifyId(notify);
+		if (users!=null && users.size()!=0){
+			for (User user:users){
+				UserUtils.pushMeIm(user.getId());
+			}
+		}
+	}
+
+	/**
+	 * 审核流程
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(WorkOut workOut,List<User> auditUsers) {
+		String userName = UserUtils.get(workOut.getCreateBy().getId()).getName();
+		Office office = officeService.get(workOut.getOfficeId());
+		String title = "出差申请人:"+userName;
+		String str  =  "出差申请编号:"+workOut.getNum()+",出差事由:"+workOut.getReason()+",所属部门:"+office.getName();
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = workOut.getAct().getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey)) {
+			actTaskService.claim(workOut.getAct().getTaskId(), UserUtils.getUser().getId());
+		}else{
+			//时间校验
+			String sign1 = leaveApplyService.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+			if(StringUtils.isNotBlank(sign1)){
+				updateInfo(workOut);
+				return sign1;
+			}else{
+				String sign2 = workFieldService.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+				if(StringUtils.isNotBlank(sign2)){
+					updateInfo(workOut);
+					return sign2;
+				}else{
+					String sign3 = this.validateTime(workOut.getStartDate(),workOut.getStartType(),workOut.getEndDate(),workOut.getEndType());
+					if(StringUtils.isNotBlank(sign3)){
+						updateInfo(workOut);
+						return sign3;
+					}
+				}
+			}
+			workOut.getAct().setFlag("yes");
+			updateInfo(workOut);
+		}
+		String comment = "";
+		if (workOut.getStatus().equals("4")){
+			comment = ("yes".equals(workOut.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(workOut.getAct().getFlag())?"[同意] ":"[驳回] ")+workOut.getAct().getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		workOut.setStatus(("yes".equals(workOut.getAct().getFlag()) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(workOut.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(workOut.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workout")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(workOut.getAct().getFlag())) {
+						workOut.setStatus("4");
+						workActivityProcess.setIsApproval("2");
+						String returnBack = "-1";
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								returnBack = activity.getReturnBack();
+								notifyRole = activity.getName();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					notifyRole = "调整申请";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(workOut.getAct().getFlag())) {
+						workOut.setStatus("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("workout");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				String count = activityProcess.getCount() + "";
+				workActivityProcess = activityProcess;
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("bmzr".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(workOut.getAct().getFlag())) {
+						notifyRole = "审批通过";
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					taskCount = "0";
+					notifyRole = "部门负责人审批";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "bmzr";
+					if (!"yes".equals(workOut.getAct().getFlag())) {
+						workOut.setStatus("3");
+					}
+					break;
+				} else if ("apply_end".equals(taskDefKey)) {
+				}
+
+			}
+		}
+		// 设置意见
+		workOut.getAct().setComment(("yes".equals(workOut.getAct().getFlag()) ? "[同意] " : "[驳回] ") + workOut.getAct().getComment());
+		workOut.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(workOut.getAct().getFlag()) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,workOut.getProcessInstanceId(),taskDefKey,"modifyApply",workOut.getAct().getFlag(),comment, activities);
+		// 提交流程任务
+		actTaskService.complete(workOut.getAct().getTaskId(), workOut.getAct().getProcInsId(), workOut.getAct().getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(workOut.getAct().getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		if (!state) {
+			users.add(workOut.getCreateBy());
+			if ("yes".equals(workOut.getAct().getFlag())) {
+				workOut.setStatus("5");
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOut.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(workOut.getId(),
+										workOut.getCreateBy(),
+										workOut.getCompanyId(),
+										title,
+										str,
+										"78",
+										"0",
+										"待通知",
+										notifyRole));
+
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOut.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(workOut.getStatus()) && !workOut.getStatus().equals("3")){
+					workOut.setStatus("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOut.getId(),
+											workOut.getCreateBy(),
+											workOut.getCompanyId(),
+											title,
+											str,
+											"78",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(workOut.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workout")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOut.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				//users.addAll(userList);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(workOut.getId(),
+								new User(),
+								workOut.getCompanyId(),
+								title,
+								str,
+								"78",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						workOut.getAct().getFlag(),
+						taskCount,
+						workOut.getCreateBy(),
+						workOut.getOfficeId(),
+						"20");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+					if (!"modifyApply".equals(taskDefKey)){
+						Map<String,Object> extras = new HashMap<>();
+						extras.put("type","7002");
+						extras.put("id",workProjectNotify.getId());
+						extras.put("procDefKey","78");
+						UserUtils.pushInfoToApp(title,str,extras,workProjectNotify1.getUser().getId());
+
+					}
+				}
+
+			} else {
+				if (!"yes".equals(workOut.getAct().getFlag())) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(workOut.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					//users.addAll(userList);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOut.getId(),
+											workOut.getCreateBy(),
+											workOut.getCompanyId(),
+											title,
+											str,
+											"78",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( workOut.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOut.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						//users.addAll(userList1);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(workOut.getId(),
+										new User(),
+										workOut.getCompanyId(),
+										title,
+										str,
+										"78",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1:auditUsers){
+							workProjectNotify.setId("");
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+							if (!"modifyApply".equals(taskDefKey)){
+								Map<String,Object> extras = new HashMap<>();
+								extras.put("type","7002");
+								extras.put("id",workProjectNotify.getId());
+								extras.put("procDefKey","13");
+								UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+
+							}
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOut.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.addAll(userList);
+						users.add(workOut.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(workOut.getId(),
+												workOut.getCreateBy(),
+												workOut.getCompanyId(),
+												title,
+												str,
+												"78",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),str);
+			}
+		}
+		if (userList!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+
+		workOutDao.update(workOut);
+		return "保存审核意见成功!";
+	}
+
+	/**
+	 * 获取流程详细信息
+	 * @param processInstanceId
+	 */
+	@SuppressWarnings("unchecked")
+	public WorkOut getByProcessInstanceId(String processInstanceId) {
+		WorkOut workOut = workOutDao.getByProcessInstanceId(processInstanceId);
+		return workOut;
+	}
+
+	/**
+	 * 强制撤销
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public void cancelInvalidate(WorkOut workOut) {
+		String invalidateProcessInstanceId = workOut.getProcessInstanceId();
+		try {
+			//将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+			WorkActivityProcess process = new WorkActivityProcess();
+			process.setProcessInstanceId(workOut.getProcessInstanceId());
+			process.setIsApproval("0");
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessInstanceId(workOut.getProcessInstanceId());
+			List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+			WorkProjectNotify notify = new WorkProjectNotify();
+			notify.setNotifyId(workOut.getId());
+			List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+			if (userList!=null && userList.size()!=0) {
+				for (User u : userList) {
+					User user = UserUtils.get(u.getId());
+					/*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+					for (WebSocket toUserConn : toUserConns) {
+						String message = "{\"to\":\""+u.getId()+"\"," +
+								"\"msg\":\"审批信息 归档申请人:"+ user.getName()+",归档编号:"+workContractRecord.getRecordNum()+" 强制撤销!\"," +
+								"\"useType\":\"sys\"}";
+						ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+					}*/
+					UserUtils.pushIm(u.getId(),"出差申请人:"+ user.getName()+",出差申请编号:"+workOut.getNum()+" 强制撤销!");
+
+				}
+			}
+			if(processList!=null && processList.size()>0){
+				for (int i =0;i<processList.size();i++) {
+					WorkActivityProcess p = processList.get(i);
+					if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+						p.setDelFlag("1");
+						p.setIsApproval("-1");
+						workActivityProcessDao.updateDelFlagAndIsApproval(p);
+					}
+				}
+				WorkActivityProcess pro = new WorkActivityProcess();
+				pro.setId("");
+				pro.preInsert();
+				pro.setDelFlag("0");
+				pro.setRemarks("[强制撤销]");
+				pro.setProcessKey(processList.get(0).getProcessKey());
+				pro.setIsApproval("1");
+				pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+				pro.setCount(0);
+				workActivityProcessDao.insert(pro);
+			}
+
+			//结束该流程,设为"撤销"状态
+			actTaskService.endProcessInstance(invalidateProcessInstanceId,"出差申请-强制撤销");
+			workOut.setStatus("3");
+			workOut.preUpdate();
+			workOutDao.update(workOut);
+
+		}catch (ActivitiObjectNotFoundException e){
+			System.err.println("撤销异常,因为这个流程已不存在!");
+			e.printStackTrace();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 365 - 0
src/main/java/com/jeeplus/modules/workout/web/WorkOutController.java

@@ -0,0 +1,365 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workout.web;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.RoleActivityEnname;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysmtree.service.SysMtreeService;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workovertime.service.WorkOvertimeService;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workout.entity.WorkOut;
+import com.jeeplus.modules.workout.service.WorkOutService;
+
+/**
+ * 出差申请Controller
+ * @author ssrh
+ * @version 2018-09-06
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workout/workOut")
+public class WorkOutController extends BaseController {
+	@Autowired
+	protected RuntimeService runtimeService;
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+	@Autowired
+	protected TaskService taskService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private HttpServletRequest request;
+
+	@Autowired
+	private SysMtreeService sysMtreeService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private OfficeService officeService;
+
+	@Autowired
+	private WorkOutService workOutService;
+	
+	@ModelAttribute
+	public WorkOut get(@RequestParam(required=false) String id) {
+		WorkOut entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workOutService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkOut();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 出差申请列表页面
+	 */
+	@RequiresPermissions("workout:workOut:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkOut workOut, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkOut> page = workOutService.findPage(new Page<WorkOut>(request, response), workOut); 
+		model.addAttribute("page", page);
+		return "modules/workout/workOutList";
+	}
+
+	/**
+	 * 查看1,增加2,编辑3,出差申请表单页面
+	 */
+	//@RequiresPermissions(value={"workout:workOut:view","workout:workOut:add","workout:workOut:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkOut workOut, Model model) {
+		String view = "workOutForm";
+		Office office = UserUtils.getSelectOffice();
+		String tabId = request.getParameter("tabId");
+		if("1".equals(tabId)){
+			view = "workOutView";
+		}else if("3".equals(tabId)){
+			ProcessInstance processInstance = actTaskService.getProcIns(workOut.getProcessInstanceId());
+			if (processInstance!=null) {
+				Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+				Act act = new Act();
+				act.setTaskId(taskInfok.getId());
+				act.setTaskName(taskInfok.getName());
+				act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+				act.setProcDefId(taskInfok.getProcessDefinitionId());
+				act.setProcInsId(taskInfok.getProcessInstanceId());
+				act.setTask(taskInfok);
+				workOut.setAct(act);
+				view = "workOutModify";
+			}
+		}
+		// 环节编号
+		String taskDefKey = workOut.getAct().getTaskDefKey();
+		if (StringUtils.isNotBlank(taskDefKey) && ("bmzr".equals(taskDefKey))){
+			view = "workOutAudit";
+		}
+		if(StringUtils.isBlank(workOut.getId())){
+			workOut.setName(UserUtils.getUser().getName());
+			WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+			workStaffBasicInfo.setUserId(UserUtils.getUser().getId());
+			workStaffBasicInfo.setOffice(UserUtils.getSelectOffice());
+			workStaffBasicInfo = workStaffBasicInfoService.getByUserOffice(workStaffBasicInfo);
+			workOut.setWorkStaffBasicInfo(workStaffBasicInfo);
+			workOut.setCreateDate(new Date());
+		}
+		model.addAttribute("workOut", workOut);
+		return "modules/workout/"+view;
+	}
+	/**
+	 * 暂存
+	 */
+	@RequestMapping(value = "store")
+	public String store(WorkOut workOut,
+						Model model,
+						RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOut)){
+			return form(workOut, model);
+		}
+		User user = workOut.getCreateBy();
+		String submitter = "";
+		if(user != null){
+			submitter = user.getId();
+		}
+		String sta = workOut.getStatus();
+		if(!UserUtils.getUser().getId().equals(submitter) && !Strings.isNullOrEmpty(submitter) && sta != null){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+		}
+		workOut.setStatus("1"); //暂存状态
+		workOut.setCompanyId(UserUtils.getSelectCompany().getId());
+		workOut.setOfficeId(UserUtils.getSelectOffice().getId());
+		if (StringUtils.isNotBlank(workOut.getProcessInstanceId()) && workOut.getProcessInstanceId().equals("NULL")){
+			workOut.setProcessInstanceId("");
+		}
+		if(!workOut.getIsNewRecord()){//编辑表单保存
+			WorkOut t = workOutService.get(workOut.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOut, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workOutService.save(t);//保存
+		}else{//新增表单保存
+			workOutService.save(workOut);//保存
+		}
+		addMessage(redirectAttributes, "保存出差申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+	}
+	/**
+	 * 保存出差申请
+	 */
+	@RequiresPermissions(value={"workout:workOut:add","workout:workOut:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkOut workOut, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOut)){
+			return form(workOut, model);
+		}
+		User user = workOut.getCreateBy();
+		String sta = workOut.getStatus();
+		if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+		}
+		//状态设置为审核中
+		workOut.setStatus("2");
+		String processInstanceId ="";
+		if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(sta) && "3".equals(sta)){
+			processInstanceId = workOutService.get(workOut.getId()).getProcessInstanceId();
+		}
+		try {
+			Map<String, Object> variables = Maps.newHashMap();
+			workOut.setCompanyId(UserUtils.getSelectCompany().getId());
+			workOut.setOfficeId(UserUtils.getSelectOffice().getId());
+			String str = workOutService.save(workOut, variables,processInstanceId);
+			if (StringUtils.isNotBlank(str)){
+				addMessage(redirectAttributes, "出差申请提交失败:"+str);
+			}else {
+				addMessage(redirectAttributes, "出差申请已经提交");
+			}
+
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "出差申请提交失败!");
+			addMessage(redirectAttributes, "系统内部错误");
+		}
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+	}
+
+	/**
+	 * 工单执行(完成任务)
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkOut workOut, Model model,
+							RedirectAttributes redirectAttributes) {
+		try {
+			List<User> users = UserUtils.getByProssType(workOut.getProcessInstanceId(),1);
+			String flag = workOut.getAct().getFlag();
+			if ("yes".equals(flag) && (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = workOutService.auditSave(workOut,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "审批失败");
+		}
+
+		if (StringUtils.isNotBlank(workOut.getHome()) && "home".equals(workOut.getHome())){
+			return "redirect:" + Global.getAdminPath() + "/home/?repage";
+		}else {
+			return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+		}
+	}
+
+	/**
+	 * 删除出差申请
+	 */
+	@RequiresPermissions("workout:workOut:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkOut workOut, RedirectAttributes redirectAttributes) {
+		workOutService.delete(workOut);
+		addMessage(redirectAttributes, "删除出差申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+	}
+	
+	/**
+	 * 批量删除出差申请
+	 */
+	@RequiresPermissions("workout:workOut:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workOutService.delete(workOutService.get(id));
+		}
+		addMessage(redirectAttributes, "删除出差申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workout:workOut:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkOut workOut, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "出差申请"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkOut> page = workOutService.findPage(new Page<WorkOut>(request, response, -1), workOut);
+    		new ExportExcel("出差申请", WorkOut.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出出差申请记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workout:workOut:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkOut> list = ei.getDataList(WorkOut.class);
+			for (WorkOut workOut : list){
+				try{
+					workOutService.save(workOut);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条出差申请记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条出差申请记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入出差申请失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+    }
+	
+	/**
+	 * 下载导入出差申请数据模板
+	 */
+	@RequiresPermissions("workout:workOut:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "出差申请数据导入模板.xlsx";
+    		List<WorkOut> list = Lists.newArrayList(); 
+    		new ExportExcel("出差申请数据", WorkOut.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+    }
+
+	/**
+	 * 强制撤销
+	 */
+	@RequestMapping("cancelInvalidate")
+	public String cancelInvalidate(WorkOut workOut,RedirectAttributes redirectAttributes){
+		workOutService.cancelInvalidate(workOut);
+		return "redirect:"+Global.getAdminPath()+"/workout/workOut/?repage";
+	}
+	/**
+	 * 读取单个实体流程
+	 * @return
+	 */
+	@RequestMapping(value = "getProcessOne")
+	public String getProcessOne(WorkOut workOut,Model model) {
+		model.addAttribute("processInstanceId", workOut.getProcessInstanceId());
+		return "modules/workout/workTrack";
+	}
+}

+ 37 - 0
src/main/java/com/jeeplus/modules/workoutsignin/dao/WorkOutSignInDao.java

@@ -0,0 +1,37 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workoutsignin.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import com.jeeplus.modules.workoutsignin.entity.WorkOutSignIn;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 外勤签到DAO接口
+ * @author 
+ * @version 2017-04-20
+ */
+@MyBatisDao
+public interface WorkOutSignInDao extends CrudDao<WorkOutSignIn> {
+
+	public WorkOutSignIn findLast();
+	
+	public Long findCount(WorkOutSignIn workOutSignIn);
+
+	public List<WorkOutSignIn> findByCompany(WorkOutSignIn workOutSignIn);
+
+    List getCreateDateList(Map<String, String> map);
+    List<WorkOutSignIn> findByCompany2(Map<String,Object> map);
+	List<WorkOutSignIn> findByCompany1(Map<String,String> map);
+	List getCreateDateList1(Map<String, String> map);
+	List<WorkOutSignIn> findByCompanyAll(Map<String,String> map);
+	List getCreateDateListAll(Map<String, String> map);
+	public List<WorkOutSignIn> findByManage(Map<String,Object> map);
+	public List<WorkOutSignIn> findByCompanySelf(Map<String,Object> map);
+}

+ 91 - 0
src/main/java/com/jeeplus/modules/workoutsignin/entity/WorkOutSignIn.java

@@ -0,0 +1,91 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workoutsignin.entity;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.jeeplus.modules.sys.entity.Company;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 外勤签到Entity
+ * @author 李韵轩
+ * @version 2017-04-20
+ */
+public class WorkOutSignIn extends DataEntity<WorkOutSignIn> {
+	
+	private static final long serialVersionUID = 1L;
+	private String locationName;		// 位置名称
+	private String locationInfo;		// 位置详情
+	private String longitude;		// 经度
+	private String latitude;		// 纬度
+	private String companyId; //公司名称
+	private User user;		// 归属用户
+	
+	public WorkOutSignIn() {
+		super();
+	}
+
+	public WorkOutSignIn(String id){
+		super(id);
+	}
+
+	@ExcelField(title="位置名称", align=2, sort=1)
+	public String getLocationName() {
+		return locationName;
+	}
+
+	public void setLocationName(String locationName) {
+		this.locationName = locationName;
+	}
+	
+	@ExcelField(title="位置详情", align=2, sort=2)
+	public String getLocationInfo() {
+		return locationInfo;
+	}
+
+	public void setLocationInfo(String locationInfo) {
+		this.locationInfo = locationInfo;
+	}
+	
+	@ExcelField(title="经度", align=2, sort=3)
+	public String getLongitude() {
+		return longitude;
+	}
+
+	public void setLongitude(String longitude) {
+		this.longitude = longitude;
+	}
+	
+	@ExcelField(title="纬度", align=2, sort=4)
+	public String getLatitude() {
+		return latitude;
+	}
+
+	public void setLatitude(String latitude) {
+		this.latitude = latitude;
+	}
+	
+	@ExcelField(title="归属用户", fieldType=User.class, value="user.name", align=2, sort=5)
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+}

+ 111 - 0
src/main/java/com/jeeplus/modules/workoutsignin/service/WorkOutSignInService.java

@@ -0,0 +1,111 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workoutsignin.service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.work.entity.report.WorkReport;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workoutsignin.entity.WorkOutSignIn;
+import com.jeeplus.modules.workoutsignin.dao.WorkOutSignInDao;
+
+/**
+ * 外勤签到Service
+ * @author 李韵轩
+ * @version 2017-04-20
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOutSignInService extends CrudService<WorkOutSignInDao, WorkOutSignIn> {
+
+	@Autowired
+	private WorkOutSignInDao workOutSignInDao;
+	public WorkOutSignIn get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkOutSignIn> findList(WorkOutSignIn workOutSignIn) {
+		return super.findList(workOutSignIn);
+	}
+
+	public Page<WorkOutSignIn> findPage(Page<WorkOutSignIn> page, WorkOutSignIn workOutSignIn) {
+		return super.findPage(page, workOutSignIn);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkOutSignIn workOutSignIn) {
+		super.save(workOutSignIn);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkOutSignIn workOutSignIn) {
+		super.delete(workOutSignIn);
+	}
+
+
+	public List<WorkOutSignIn> findByCompany(WorkOutSignIn workOutSignIn) {
+		return dao.findByCompany(workOutSignIn);
+	}
+
+	public Page<WorkOutSignIn> findPageByUser(Page<WorkOutSignIn> page, WorkOutSignIn workOutSignIn) {
+		workOutSignIn.setPage(page);
+		page.setList(dao.findListByUser(workOutSignIn));
+		return page ;
+	}
+
+    public List getCreateDateList(String companyId, String date) {
+		Map<String,String> map = new HashMap<>();
+		map.put("companyId",companyId);
+		map.put("date",date);
+		return workOutSignInDao.getCreateDateList(map);
+    }
+	public List getCreateDateList1(String time) {
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("userId",UserUtils.getUser().getId());
+		map.put("time",time);
+		return workOutSignInDao.getCreateDateList1(map);
+	}
+	public List<WorkOutSignIn> findByCompany1(String time){
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("userId",UserUtils.getUser().getId());
+		map.put("time",time);
+		return workOutSignInDao.findByCompany1(map);
+	}
+
+	public List getCreateDateListAll(String time) {
+		WorkOutSignIn w=new WorkOutSignIn();
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_OUT_SIGNIN.getValue()));
+		map.put("time",time);
+		return workOutSignInDao.getCreateDateListAll(map);
+	}
+	public List<WorkOutSignIn> findByCompanyAll(String time){
+		WorkOutSignIn w=new WorkOutSignIn();
+		Map<String,String> map = new HashMap<String,String>();
+		map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_OUT_SIGNIN.getValue()));
+		map.put("time",time);
+		return workOutSignInDao.findByCompanyAll(map);
+	}
+    public List<WorkOutSignIn> findByCompany2(WorkOutSignIn workOutSignIn, String date) {
+		Map<String,Object> map = new HashMap<String, Object>();
+		map.put("sign",workOutSignIn);
+		map.put("date",date);
+		return  workOutSignInDao.findByCompany2(map);
+    }
+	public List<WorkOutSignIn> findByManage(Map<String,Object> map) {
+		return workOutSignInDao.findByManage(map);
+	}
+	public List<WorkOutSignIn> findByCompanySelf(Map<String,Object> map) {
+		return workOutSignInDao.findByCompanySelf(map);
+	}
+}

+ 234 - 0
src/main/java/com/jeeplus/modules/workoutsignin/web/WorkOutSignInController.java

@@ -0,0 +1,234 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workoutsignin.web;
+
+import java.lang.ref.ReferenceQueue;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.modules.oa.entity.OaAttendance;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.SystemService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.apache.poi.util.StringUtil;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workoutsignin.entity.WorkOutSignIn;
+import com.jeeplus.modules.workoutsignin.service.WorkOutSignInService;
+
+/**
+ * 外勤签到Controller
+ * @author 李韵轩
+ * @version 2017-04-20
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workoutsignin/workOutSignIn")
+public class WorkOutSignInController extends BaseController {
+
+	@Autowired
+	private WorkOutSignInService workOutSignInService;
+	@Autowired
+	private SystemService systemService;
+	@ModelAttribute
+	public WorkOutSignIn get(@RequestParam(required=false) String id) {
+		WorkOutSignIn entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workOutSignInService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkOutSignIn();
+		}
+		return entity;
+	}
+
+	/**
+	 * 签到列表页面--管理员查看本公司所有,普通用户只能查看自己的外勤签到记录
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkOutSignIn workOutSignIn, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		String username = request.getParameter("username");
+		Page<WorkOutSignIn> page = null ;
+		if(!user.isAdmin()){
+			workOutSignIn.setCompanyId(user.getComId());
+			if(UserUtils.isManager()){
+				if(!StringUtils.isBlank(username)){
+					User u = new User();
+					u.setName(username);
+					workOutSignIn.setUser(u);
+				}
+				page = workOutSignInService.findPage(new Page<WorkOutSignIn>(request,response),workOutSignIn);
+			}else{
+				workOutSignIn.setUser(user);
+				if(!StringUtils.isBlank(username)){
+					User u = new User();
+					u.setId(user.getId());
+					u.setName(username);
+					workOutSignIn.setUser(u);
+				}
+				page = workOutSignInService.findPageByUser(new Page<WorkOutSignIn>(request,response),workOutSignIn);
+			}
+		}else{
+			if(!StringUtils.isBlank(username)){
+				User u = new User();
+				u.setName(username);
+				workOutSignIn.setUser(u);
+			}
+			page = workOutSignInService.findPage(new Page<WorkOutSignIn>(request,response),workOutSignIn);
+		}
+		model.addAttribute("username", username);
+		model.addAttribute("page", page);
+		return "modules/workoutsignin/workOutSignInList";
+	}
+
+	/**
+	 * 查看,增加,编辑签到表单页面
+	 */
+	@RequiresPermissions(value={"workoutsignin:workOutSignIn:view","workoutsignin:workOutSignIn:add","workoutsignin:workOutSignIn:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(@RequestParam(value = "readAttr",required = false)String readAttr,WorkOutSignIn workOutSignIn, Model model) {
+		model.addAttribute("workOutSignIn", workOutSignIn);
+		model.addAttribute("disabled",(readAttr==null||"".equals(readAttr))?"false":"true");
+		return "modules/workoutsignin/workOutSignInForm";
+	}
+
+	/**
+	 * 保存签到
+	 */
+	@RequiresPermissions(value={"workoutsignin:workOutSignIn:add","workoutsignin:workOutSignIn:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkOutSignIn workOutSignIn, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOutSignIn)){
+			return form("",workOutSignIn, model);
+		}
+		if(!workOutSignIn.getIsNewRecord()){//编辑表单保存
+			WorkOutSignIn t = workOutSignInService.get(workOutSignIn.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOutSignIn, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workOutSignInService.save(t);//保存
+		}else{//新增表单保存
+			workOutSignInService.save(workOutSignIn);//保存
+		}
+		addMessage(redirectAttributes, "保存签到成功");
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+	}
+	
+	/**
+	 * 删除签到
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkOutSignIn workOutSignIn, RedirectAttributes redirectAttributes) {
+		workOutSignInService.delete(workOutSignIn);
+		addMessage(redirectAttributes, "删除签到成功");
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+	}
+	
+	/**
+	 * 批量删除签到
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workOutSignInService.delete(workOutSignInService.get(id));
+		}
+		addMessage(redirectAttributes, "删除签到成功");
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkOutSignIn workOutSignIn, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "签到"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkOutSignIn> page = workOutSignInService.findPage(new Page<WorkOutSignIn>(request, response, -1), workOutSignIn);
+    		new ExportExcel("签到", WorkOutSignIn.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出签到记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkOutSignIn> list = ei.getDataList(WorkOutSignIn.class);
+			for (WorkOutSignIn workOutSignIn : list){
+				try{
+					workOutSignInService.save(workOutSignIn);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条签到记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条签到记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入签到失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+    }
+	
+	/**
+	 * 下载导入签到数据模板
+	 */
+	@RequiresPermissions("workoutsignin:workOutSignIn:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "签到数据导入模板.xlsx";
+    		List<WorkOutSignIn> list = Lists.newArrayList(); 
+    		new ExportExcel("签到数据", WorkOutSignIn.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workoutsignin/workOutSignIn/?repage";
+    }
+	
+	
+	
+
+}

+ 42 - 0
src/main/java/com/jeeplus/modules/workovertime/dao/WorkOvertimeDao.java

@@ -0,0 +1,42 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertime.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.leaveapply.entity.LeaveDetail;
+import com.jeeplus.modules.workovertime.entity.WorkOvertime;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 加班申请DAO接口
+ * @author ssrh
+ * @version 2018-09-04
+ */
+@MyBatisDao
+public interface WorkOvertimeDao extends CrudDao<WorkOvertime> {
+    /**
+     * 更新流程实例ID
+     * @return
+     */
+    public int updateProcessInstanceId(WorkOvertime workOvertime);
+
+    /**
+     * 根据流程实例ID获取
+     * @param processInstanceId
+     * @return
+     */
+    public WorkOvertime getByProcessInstanceId(String processInstanceId);
+    /**
+     * 根据时间和档案id查询数据
+     * @param staffId,time
+     * @return
+     */
+    public WorkOvertime getByStaffIdAndTime(@Param("staffId")String staffId, @Param("time")String time);
+
+    List<WorkOvertime> findListValidateTime(String staffId);
+}

+ 228 - 0
src/main/java/com/jeeplus/modules/workovertime/entity/WorkOvertime.java

@@ -0,0 +1,228 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertime.entity;
+
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 加班申请Entity
+ * @author ssrh
+ * @version 2018-09-04
+ */
+public class WorkOvertime extends ActEntity<WorkOvertime> {
+	//通知77      //附件72      //编码27    //流程表 zzsql3125f1f194clzsqasdfiiii750904  //	assignmentType19
+
+
+	private static final long serialVersionUID = 1L;
+
+	public static final String SERIAL_BIZCODE = "27";
+
+	private String processInstanceId;		// 流程号
+	private String officeId;		// 部门
+	private String companyId;		// 公司
+	private String num;		// 加班编号
+	private String name;		// 姓名
+	private Date startDate;		// 开始日期
+	private String startType;		// 类型1(1上午2下午)
+	private Date endDate;		// 结束日期
+	private String endType;		// 类型2(1上午2下午 date_type)
+	private String reason;		// 加班原因
+	private WorkStaffBasicInfo workStaffBasicInfo;		// 档案
+	private String status;		// 状态
+	private String home;
+	private List<WorkClientAttachment> workAttachments = Lists.newArrayList();
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+	public WorkOvertime() {
+		super();
+	}
+
+	public WorkOvertime(String id){
+		super(id);
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+
+	@ExcelField(title="流程号", align=2, sort=7)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+	
+	@ExcelField(title="部门", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="公司", align=2, sort=9)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="加班编号", align=2, sort=10)
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	@ExcelField(title="姓名", align=2, sort=11)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+
+	public List<WorkClientAttachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+
+
+	public String getStartType() {
+		return startType;
+	}
+
+	public void setStartType(String startType) {
+		this.startType = startType;
+	}
+
+	public Date getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(Date startDate) {
+		this.startDate = startDate;
+	}
+
+	public Date getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(Date endDate) {
+		this.endDate = endDate;
+	}
+
+	public String getEndType() {
+		return endType;
+	}
+
+	public void setEndType(String endType) {
+		this.endType = endType;
+	}
+
+	@ExcelField(title="加班原因", align=2, sort=16)
+	public String getReason() {
+		return reason;
+	}
+
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+
+	public WorkStaffBasicInfo getWorkStaffBasicInfo() {
+		return workStaffBasicInfo;
+	}
+
+	public void setWorkStaffBasicInfo(WorkStaffBasicInfo workStaffBasicInfo) {
+		this.workStaffBasicInfo = workStaffBasicInfo;
+	}
+
+	@ExcelField(title="状态", align=2, sort=18)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+}

+ 737 - 0
src/main/java/com/jeeplus/modules/workovertime/service/WorkOvertimeService.java

@@ -0,0 +1,737 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertime.service;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.leaveapply.service.LeaveApplyService;
+import com.jeeplus.modules.serialnum.service.SerialNumTplService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.dao.WorkActivityProcessDao;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.entity.WorkActivityProcess;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workactivity.service.WorkActivityProcessService;
+import com.jeeplus.modules.workactivitymenu.entity.WorkActivityMenu;
+import com.jeeplus.modules.workactivitymenu.service.WorkActivityMenuService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workcontractinfo.service.WorkContractInfoService;
+import com.jeeplus.modules.workcontractrecord.dao.WorkContractRecordDao;
+import com.jeeplus.modules.workfield.entity.WorkField;
+import com.jeeplus.modules.workfield.service.WorkFieldService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workprojectnotify.util.UtilNotify;
+import com.jeeplus.modules.workstaff.dao.WorkStaffAchivesDao;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.activiti.engine.ActivitiObjectNotFoundException;
+import org.activiti.engine.IdentityService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workovertime.entity.WorkOvertime;
+import com.jeeplus.modules.workovertime.dao.WorkOvertimeDao;
+
+/**
+ * 加班申请Service
+ * @author ssrh
+ * @version 2018-09-04
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOvertimeService extends CrudService<WorkOvertimeDao, WorkOvertime> {
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private WorkActivityMenuService workActivityMenuService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private SerialNumTplService serialNumTplService;
+
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkActivityProcessService workActivityProcessService;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private WorkFieldService workFieldService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private LeaveApplyService leaveApplyService;
+	@Autowired
+	private WorkActivityProcessDao workActivityProcessDao;
+	@Autowired
+	private WorkStaffAchivesDao workStaffAchivesDao;
+	@Autowired
+	private WorkOvertimeDao workOvertimeDao;
+	@Autowired
+	private WorkClientAttachmentDao workClientAttachmentDao;
+
+	public WorkOvertime get(String id) {
+		WorkOvertime workOvertime = super.get(id);
+		if(workOvertime!=null){
+			//附件
+			WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+			workClientAttachment.setAttachmentId(id);
+			workClientAttachment.setAttachmentFlag("72");
+			workOvertime.setWorkAttachments(workClientAttachmentDao.findList(workClientAttachment));
+		}
+		return workOvertime;
+	}
+	public WorkOvertime getByStaffIdAndTime(String staffId,String time) {
+		WorkOvertime workOvertime = dao.getByStaffIdAndTime(staffId, time);
+		return workOvertime;
+	}
+
+	public List<WorkOvertime> findList(WorkOvertime workOvertime) {
+		return super.findList(workOvertime);
+	}
+	
+	public Page<WorkOvertime> findPage(Page<WorkOvertime> page, WorkOvertime workOvertime) {
+		workOvertime.getSqlMap().put("dsf", dataScopeFilter(workOvertime.getCurrentUser(), "o", "u","s", MenuStatusEnum.WORK_OVERTIME.getValue()));
+		workOvertime.setPage(page);
+		page.setList(findList(workOvertime));
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkOvertime workOvertime) {
+		super.save(workOvertime);
+		updateInfo(workOvertime);
+	}
+	@Transactional(readOnly = false)
+	public void updateInfo(WorkOvertime workOvertime) {
+		//附件信息
+		for (WorkClientAttachment workClientAttachment : workOvertime.getWorkAttachments()) {
+			if (workClientAttachment.getId() == null) {
+				continue;
+			}
+			if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+				workClientAttachment.setAttachmentId(workOvertime.getId());
+				workClientAttachment.setAttachmentFlag("72");
+				workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+				if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+					workClientAttachment.preInsert();
+					workClientAttachmentDao.insert(workClientAttachment);
+				} else {
+					workClientAttachment.preUpdate();
+					workClientAttachmentDao.update(workClientAttachment);
+				}
+			} else {
+				workClientAttachmentDao.delete(workClientAttachment);
+			}
+		}
+	}
+	//时间验证
+	@Transactional(readOnly = false)
+	public String validateTime(Date startTime,String startType,Date endTime,String endType){
+		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
+		WorkStaffBasicInfo workStaffBasicInfo=leaveApplyService.getBasicInfo();
+		List<WorkOvertime> leaveDetails=workOvertimeDao.findListValidateTime(workStaffBasicInfo.getId());
+		double start=Integer.parseInt(sdf1.format(startTime));
+		double end=Integer.parseInt(sdf1.format(endTime));
+		if("2".equals(startType)){
+			start=start+0.5;
+		}
+		if("2".equals(endType)){
+			end=end+0.5;
+		}
+		for(int i=0;i<leaveDetails.size();i++){
+			WorkOvertime detail=leaveDetails.get(i);
+			Date stateTime1 = detail.getStartDate();
+			double start1=Integer.parseInt(sdf1.format(stateTime1));
+			Date realEndTime1 = detail.getEndDate();
+			double realEnd1=Integer.parseInt(sdf1.format(realEndTime1));
+			String startType1 = detail.getStartType();
+			String realEndType1 = detail.getEndType();
+			if("2".equals(startType1)){
+				start1=start1+0.5;
+			}
+			if("2".equals(realEndType1)){
+				realEnd1=realEnd1+0.5;
+			}
+			if((start>=start1&&start<=realEnd1)||(end>=start1&&end<=realEnd1)
+					||(start1>=start&&start1<=end)||(realEnd1>=start&&realEnd1<=end)){
+				return  "加班时间存在重叠情况!";
+			}
+		}
+		return "";
+	}
+	/**
+	 * 提交存储
+	 * @param
+	 * @param variables
+	 */
+	@Transactional(readOnly = false)
+	public String save(WorkOvertime workOvertime, Map<String, Object> variables, String processInstanceId) {
+		//时间校验
+		String sign1 = leaveApplyService.validateTime(workOvertime.getStartDate(),workOvertime.getStartType(),workOvertime.getEndDate(),workOvertime.getEndType());
+		if(StringUtils.isNotBlank(sign1)){
+			updateInfo(workOvertime);
+			if("2".equals(workOvertime.getStatus())){
+				workOvertime.setStatus("1");
+			}
+			super.save(workOvertime);
+			return sign1;
+		}else{
+			String sign2 = this.validateTime(workOvertime.getStartDate(),workOvertime.getStartType(),workOvertime.getEndDate(),workOvertime.getEndType());
+			if(StringUtils.isNotBlank(sign2)){
+				updateInfo(workOvertime);
+				if("2".equals(workOvertime.getStatus())){
+					workOvertime.setStatus("1");
+				}
+				super.save(workOvertime);
+				return sign2;
+			}
+		}
+		User user = UserUtils.getUser();
+		if (StringUtils.isBlank(workOvertime.getNum())) {
+			workOvertime.setNum(serialNumTplService.genSerialNum(user.getCompany(), WorkOvertime.SERIAL_BIZCODE));
+		}
+		super.save(workOvertime);
+		Office office = officeService.get(workOvertime.getOfficeId());
+		String str =  "加班申请编号:"+workOvertime.getNum()+",加班原因:"+workOvertime.getReason()+",所属部门:"+office.getName();
+		String title = "加班申请人:"+user.getName();
+		updateInfo(workOvertime);
+		// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+		identityService.setAuthenticatedUserId(user.getId());
+		// 启动流程
+		String businessKey = workOvertime.getId().toString();
+		WorkActivityMenu workActivityMenu = workActivityMenuService.findByParentAndOffice("zzsql3125f1f194clzsqasdfiiii750904", office);
+		// 启动流程
+		String processType = workActivityMenu.getProcessType();
+		StringBuffer buffer = new StringBuffer();
+		Activity activity = new Activity();
+		WorkProjectNotify workProjectNotify = UtilNotify
+				.saveNotify(workOvertime.getId(),
+						null,
+						workOvertime.getCompanyId(),
+						title,
+						str,
+						"77",
+						"0",
+						"待审批",
+						""
+				);
+		List<User> users = new ArrayList<>();
+		List<User> bmzrs = UserUtils.getByRoleActivityEnname("bmzr",2,office.getId(),"19",workOvertime.getCreateBy());
+		if (StringUtils.isNotBlank(workActivityMenu.getId())) {
+			workProjectNotify.setNotifyRole("");
+			workActivityMenu = workActivityMenuService.get(workActivityMenu.getId());
+			List<Activity> activities = workActivityMenu.getActivities();
+			for (Activity a : activities) {
+				String encount = a.getEncount();
+				String enlist = a.getEnlist();
+				if (a.getRole()!=null && StringUtils.isNotBlank(a.getRole().getEnname())){
+					List enusers = UserUtils.getByRoleActivityEnnames(a.getRole().getEnname(),office.getId(),"19",workOvertime.getCreateBy());
+					if (enusers.size()==0){
+						workOvertime.setStatus("1");
+						super.save(workOvertime);
+						return "流程审批人不能为空,角色"+a.getRole().getName()+"下无用户,请联系管理员!";
+					}
+					variables.put(enlist, enusers);
+					variables.put(encount, enusers.size());
+				}
+				if (a.getDelFlag().equals("0") && a.getCount() == 1) {
+					activity = a;
+				}
+			}
+			buffer.append(activity.getRole().getEnname());
+			if (activity != null && StringUtils.isNotBlank(activity.getId())) {
+				//角色审批
+				if (StringUtils.isNotBlank(activity.getRole().getEnname())) {
+					users = UserUtils.getByRoleActivityEnnames(activity.getRole().getEnname(),office.getId(),"19",workOvertime.getCreateBy());
+				}
+				//人员审批
+				if (StringUtils.isNotBlank(activity.getUser().getId())) {
+					users.add(activity.getUser());
+				}
+			}
+			workProjectNotify.setId("");
+		} else {
+			variables.put("bmzrList", bmzrs);
+			if (bmzrs.size()==0 ){
+				workOvertime.setStatus("1");
+				super.save(workOvertime);
+			}
+			if (bmzrs.size()==0){
+				return "流程审批人不能为空,角色部门负责人下无用户,请联系管理员!";
+			}
+			variables.put("bmzrcount",bmzrs.size());
+			processType = "workovertime";
+			users.addAll(bmzrs);
+		}
+		for (User u : users){
+			workProjectNotify.setUser(u);
+			workProjectNotify.setId("");
+			workProjectNotify.setNotifyRole("部门负责人审批");
+			workProjectNotifyService
+					.save(workProjectNotify);
+			Map<String,Object> extras = new HashMap<>();
+			extras.put("type","7002");
+			extras.put("id",workProjectNotify.getId());
+			extras.put("procDefKey","77");
+			UserUtils.pushInfoToApp(title,str,extras,u.getId());
+			UserUtils.pushIm(u.getId(),str);
+		}
+		variables.put("type", processType);
+		variables.put("busId", businessKey);
+		variables.put("title", "审批单:" + workOvertime.getNum());//设置标题;
+
+		ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processType, businessKey, variables);
+		workOvertime.setProcessInstance(processInstance);
+		if (StringUtils.isNotBlank(processInstanceId)) {
+			workActivityProcessService.updateProcessInstanceId(processInstance.getId(),processInstanceId);
+			workActivityProcessService.deleteProcessInstanceId(processInstanceId);
+			workActivityProcessService.deleteProcessIdAuditUsers(processInstanceId);
+		}
+		// 更新流程实例ID
+		workOvertime.setProcessInstanceId(processInstance.getId());
+		workOvertimeDao.updateProcessInstanceId(workOvertime);
+		List<Activity> list = workActivityMenu.getActivities();
+		if (list != null && list.size() != 0) {
+			workActivityProcessService.saveList(list, processInstance.getId());
+		} else {
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessKey("workovertime");
+			workActivityProcess.setCount(1);
+			workActivityProcess.setProcessInstanceId(processInstance.getId());
+			workActivityProcess.setIsApproval("0");
+			workActivityProcessService.save(workActivityProcess);
+			workActivityProcessService.insertAuditsByType(bmzrs,processInstance.getId(),1,1);
+		}
+		logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[]{
+				ActUtils.PD_REIMBURSEMENT[0], businessKey, processInstance.getId(), variables});
+		return "";
+	}
+
+	@Transactional(readOnly = false)
+	public void delete(WorkOvertime workOvertime) {
+		super.delete(workOvertime);
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workOvertime.getId());
+		List<User> users = workProjectNotifyService.readByNotifyId(notify);
+		if (users!=null && users.size()!=0){
+			for (User user:users){
+				UserUtils.pushMeIm(user.getId());
+			}
+		}
+	}
+
+	/**
+	 * 审核流程
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public String auditSave(WorkOvertime workOvertime,List<User> auditUsers) {
+		String userName = UserUtils.get(workOvertime.getCreateBy().getId()).getName();
+		Office office = officeService.get(workOvertime.getOfficeId());
+		String title = "加班申请人:"+userName;
+		String str  =  "加班申请编号:"+workOvertime.getNum()+",加班原因:"+workOvertime.getReason()+",所属部门:"+office.getName();
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = workOvertime.getAct().getTaskDefKey();
+		if (!"modifyApply".equals(taskDefKey)) {
+			actTaskService.claim(workOvertime.getAct().getTaskId(), UserUtils.getUser().getId());
+		}else{
+			//时间校验
+			String sign1 = leaveApplyService.validateTime(workOvertime.getStartDate(),workOvertime.getStartType(),workOvertime.getEndDate(),workOvertime.getEndType());
+			if(StringUtils.isNotBlank(sign1)){
+				updateInfo(workOvertime);
+				super.save(workOvertime);
+				return sign1;
+			}else{
+				String sign2 = this.validateTime(workOvertime.getStartDate(),workOvertime.getStartType(),workOvertime.getEndDate(),workOvertime.getEndType());
+				if(StringUtils.isNotBlank(sign2)){
+					updateInfo(workOvertime);
+					super.save(workOvertime);
+					return sign2;
+				}
+			}
+			workOvertime.getAct().setFlag("yes");
+			updateInfo(workOvertime);
+		}
+		String comment = "";
+		if (workOvertime.getStatus().equals("4")){
+			comment = ("yes".equals(workOvertime.getAct().getFlag())?"[重新申请] ":"[已撤销] ");
+		}else {
+			comment = ("yes".equals(workOvertime.getAct().getFlag())?"[同意] ":"[驳回] ")+workOvertime.getAct().getComment();
+		}
+		//yes 的时候状态为审核通过 否则为未通过
+		//1 审核中 2 未通过
+		workOvertime.setStatus(("yes".equals(workOvertime.getAct().getFlag()) ? "2" : "4"));
+		Map<String, Object> vars = Maps.newHashMap();
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		String taskCount = "";
+		String notifyRole = "";
+		int key = 0;
+		String enname = "";
+		List<Activity> activitieList = activityService.getByProcessInstanceId(workOvertime.getProcessInstanceId());
+		WorkActivityMenu workActivityMenu = new WorkActivityMenu();
+		if (activitieList != null && activitieList.size() != 0) {
+			workActivityMenu.setProcessType(activitieList.get(0).getProcessKey());
+			workActivityMenu.setActivities(activitieList);
+		}
+
+		WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+		WorkActivityProcess selectProcess = new WorkActivityProcess();
+		selectProcess.setProcessInstanceId(workOvertime.getProcessInstanceId());
+		List<WorkActivityProcess> workActivityProcesses = workActivityProcessService.findList(selectProcess);
+		List<Activity> activities = workActivityMenu.getActivities();
+		if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workovertime")) {
+			key = 1;
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				if (taskDefKey.equals(activityProcess.getActivityTask()) && !taskDefKey.equals("modifyApply")) {
+					taskCount = activityProcess.getCount()+"";
+					workActivityProcess = activityProcess;
+					if (!workActivityProcess.getIsApproval().equals("0")) {
+						workActivityProcess.setId("");
+					}
+					exp = "pass";
+					if (!"yes".equals(workOvertime.getAct().getFlag())) {
+						workOvertime.setStatus("4");
+						workActivityProcess.setIsApproval("2");
+						String returnBack = "-1";
+						for (Activity activity : activities) {
+							if (activity.getCount() == activityProcess.getCount()) {
+								returnBack = activity.getReturnBack();
+								notifyRole = activity.getName();
+								break;
+							}
+						}
+						if (returnBack.equals("0")) {
+							workActivityProcess.setId("");
+						}
+
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+				}else if(taskDefKey.equals("modifyApply")){
+					notifyRole = "调整申请";
+					taskCount = "0";
+					exp = "pass";
+					workActivityProcess.setId("");
+					workActivityProcess.setCount(0);
+					if (!"yes".equals(workOvertime.getAct().getFlag())) {
+						workOvertime.setStatus("3");
+						workActivityProcess.setIsApproval("2");
+					} else {
+						workActivityProcess.setIsApproval("1");
+					}
+					break;
+				}
+			}
+		} else {
+			workActivityMenu.setProcessType("workovertime");
+			for (int i = 0; i < workActivityProcesses.size(); i++) {
+				WorkActivityProcess activityProcess = workActivityProcesses.get(i);
+				String count = activityProcess.getCount() + "";
+				workActivityProcess = activityProcess;
+				if (!workActivityProcess.getIsApproval().equals("0")) {
+					workActivityProcess.setId("");
+				}
+				// 审核环节
+				if ("bmzr".equals(taskDefKey) && count.contains("1")) {
+					taskCount = "1";
+					exp = "pass";
+					if ("yes".equals(workOvertime.getAct().getFlag())) {
+						notifyRole = "审批通过";
+						workActivityProcess.setIsApproval("1");
+					} else {
+						notifyRole = "调整申请";
+						workActivityProcess.setIsApproval("2");
+					}
+					break;
+				} else if ("modifyApply".equals(taskDefKey)&& count.contains("0")) {
+					taskCount = "0";
+					notifyRole = "部门负责人审批";
+					exp = "pass";
+					workActivityProcess.setCount(0);
+					enname = "bmzr";
+					if (!"yes".equals(workOvertime.getAct().getFlag())) {
+						workOvertime.setStatus("3");
+					}
+					break;
+				} else if ("apply_end".equals(taskDefKey)) {
+				}
+
+			}
+		}
+		// 设置意见
+		workOvertime.getAct().setComment(("yes".equals(workOvertime.getAct().getFlag()) ? "[同意] " : "[驳回] ") + workOvertime.getAct().getComment());
+		workOvertime.preUpdate();
+		// 提交流程任务
+		vars.put(exp, "yes".equals(workOvertime.getAct().getFlag()) ? true : false);
+		vars.put("passs", true);
+		workActivityProcessService.updateProcess(workActivityProcess,workActivityMenu,key,taskCount,workOvertime.getProcessInstanceId(),taskDefKey,"modifyApply",workOvertime.getAct().getFlag(),comment, activities);
+		// 提交流程任务
+		actTaskService.complete(workOvertime.getAct().getTaskId(), workOvertime.getAct().getProcInsId(), workOvertime.getAct().getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(workOvertime.getAct().getProcInsId());
+		List<User> users = new ArrayList<>();
+		List<User> userList = new ArrayList<>();
+		if (!state) {
+			users.add(workOvertime.getCreateBy());
+			if ("yes".equals(workOvertime.getAct().getFlag())) {
+				workOvertime.setStatus("5");
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOvertime.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				workProjectNotifyService
+						.save(UtilNotify
+								.saveNotify(workOvertime.getId(),
+										workOvertime.getCreateBy(),
+										workOvertime.getCompanyId(),
+										title,
+										str,
+										"77",
+										"0",
+										"待通知",
+										notifyRole));
+
+			} else {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOvertime.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				if (StringUtils.isNotBlank(workOvertime.getStatus()) && !workOvertime.getStatus().equals("3")){
+					workOvertime.setStatus("4");
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOvertime.getId(),
+											workOvertime.getCreateBy(),
+											workOvertime.getCompanyId(),
+											title,
+											str,
+											"77",
+											"0",
+											"待通知",
+											notifyRole));
+				}
+			}
+			workActivityProcessService.deleteProcessIdAuditUsers(workOvertime.getProcessInstanceId());
+		} else {
+			if (StringUtils.isNotBlank(workActivityMenu.getProcessType()) && !workActivityMenu.getProcessType().equals("workovertime")) {
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setNotifyId(workOvertime.getId());
+				userList = workProjectNotifyService.readByNotifyId(notify);
+				//users.addAll(userList);
+				WorkProjectNotify workProjectNotify = UtilNotify
+						.saveNotify(workOvertime.getId(),
+								new User(),
+								workOvertime.getCompanyId(),
+								title,
+								str,
+								"77",
+								"0",
+								"待审批",
+								notifyRole);
+				List<WorkProjectNotify> workProjectNotifys = activityService.getByFlagAndTaskDefKeyList(
+						activities,
+						workProjectNotify,
+						taskDefKey,
+						workOvertime.getAct().getFlag(),
+						taskCount,
+						workOvertime.getCreateBy(),
+						workOvertime.getOfficeId(),
+						"19");
+				for (WorkProjectNotify workProjectNotify1:workProjectNotifys){
+					users.add(workProjectNotify1.getUser());
+					workProjectNotify1.setId("");
+					workProjectNotify1.setIsNewRecord(false);
+					workProjectNotifyService
+							.save(workProjectNotify1);
+					if (!"modifyApply".equals(taskDefKey)){
+						Map<String,Object> extras = new HashMap<>();
+						extras.put("type","7002");
+						extras.put("id",workProjectNotify.getId());
+						extras.put("procDefKey","77");
+						UserUtils.pushInfoToApp(title,str,extras,workProjectNotify1.getUser().getId());
+
+					}
+				}
+
+			} else {
+				if (!"yes".equals(workOvertime.getAct().getFlag())) {
+					WorkProjectNotify notify = new WorkProjectNotify();
+					notify.setNotifyId(workOvertime.getId());
+					userList = workProjectNotifyService.readByNotifyId(notify);
+					//users.addAll(userList);
+					workProjectNotifyService
+							.save(UtilNotify
+									.saveNotify(workOvertime.getId(),
+											workOvertime.getCreateBy(),
+											workOvertime.getCompanyId(),
+											title,
+											str,
+											"77",
+											"0",
+											"重新申请",
+											notifyRole));
+					users.add( workOvertime.getCreateBy());
+				} else {
+					if (StringUtils.isNotBlank(enname)) {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOvertime.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						//users.addAll(userList1);
+						WorkProjectNotify workProjectNotify = UtilNotify
+								.saveNotify(workOvertime.getId(),
+										new User(),
+										workOvertime.getCompanyId(),
+										title,
+										str,
+										"77",
+										"0",
+										"待审批",
+										notifyRole);
+						users.addAll(auditUsers);
+						for (User user1:auditUsers){
+							workProjectNotify.setId("");
+							workProjectNotify.setUser(user1);
+							workProjectNotify.setIsNewRecord(false);
+							workProjectNotifyService
+									.save(workProjectNotify);
+							if (!"modifyApply".equals(taskDefKey)){
+								Map<String,Object> extras = new HashMap<>();
+								extras.put("type","7002");
+								extras.put("id",workProjectNotify.getId());
+								extras.put("procDefKey","77");
+								UserUtils.pushInfoToApp(title,str,extras,user1.getId());
+
+							}
+						}
+					}else {
+						WorkProjectNotify notify = new WorkProjectNotify();
+						notify.setNotifyId(workOvertime.getId());
+						userList = workProjectNotifyService.readByNotifyId(notify);
+						users.addAll(userList);
+						users.add(workOvertime.getCreateBy());
+						workProjectNotifyService
+								.save(UtilNotify
+										.saveNotify(workOvertime.getId(),
+												workOvertime.getCreateBy(),
+												workOvertime.getCompanyId(),
+												title,
+												str,
+												"77",
+												"0",
+												"重新申请",
+												notifyRole));
+					}
+				}
+			}
+		}
+		if (users!=null && users.size()!=0) {
+			for (User u : users) {
+				UserUtils.pushIm(u.getId(),str);
+			}
+		}
+		if (userList!=null && userList.size()!=0) {
+			for (User u : userList) {
+				UserUtils.pushMeIm(u.getId());
+			}
+		}
+
+		workOvertimeDao.update(workOvertime);
+		return "保存审核意见成功!";
+	}
+
+	/**
+	 * 获取流程详细信息
+	 * @param processInstanceId
+	 */
+	@SuppressWarnings("unchecked")
+	public WorkOvertime getByProcessInstanceId(String processInstanceId) {
+		WorkOvertime workOvertime = workOvertimeDao.getByProcessInstanceId(processInstanceId);
+		return workOvertime;
+	}
+
+	/**
+	 * 强制撤销
+	 * @param
+	 */
+	@Transactional(readOnly = false)
+	public void cancelInvalidate(WorkOvertime workOvertime) {
+		String invalidateProcessInstanceId = workOvertime.getProcessInstanceId();
+		try {
+			//将流程图中尚未走到的task的流程追踪信息逻辑删除,添加一条"撤销"流程追踪信息
+			WorkActivityProcess process = new WorkActivityProcess();
+			process.setProcessInstanceId(workOvertime.getProcessInstanceId());
+			process.setIsApproval("0");
+			WorkActivityProcess workActivityProcess = new WorkActivityProcess();
+			workActivityProcess.setProcessInstanceId(workOvertime.getProcessInstanceId());
+			List<WorkActivityProcess> processList = workActivityProcessService.findList(workActivityProcess);
+			WorkProjectNotify notify = new WorkProjectNotify();
+			notify.setNotifyId(workOvertime.getId());
+			List<User> userList = workProjectNotifyService.readByNotifyId(notify);
+			if (userList!=null && userList.size()!=0) {
+				for (User u : userList) {
+					User user = UserUtils.get(u.getId());
+					/*List<WebSocket> toUserConns = ChatServerPool.getWebSocketByUser(u.getId());
+					for (WebSocket toUserConn : toUserConns) {
+						String message = "{\"to\":\""+u.getId()+"\"," +
+								"\"msg\":\"审批信息 归档申请人:"+ user.getName()+",归档编号:"+workContractRecord.getRecordNum()+" 强制撤销!\"," +
+								"\"useType\":\"sys\"}";
+						ChatServerPool.sendMessageToUser(toUserConn, message);//同时向本人发送消息
+					}*/
+					UserUtils.pushIm(u.getId(),"加班申请人:"+ user.getName()+",加班申请编号:"+workOvertime.getNum()+" 强制撤销!");
+
+				}
+			}
+			if(processList!=null && processList.size()>0){
+				for (int i =0;i<processList.size();i++) {
+					WorkActivityProcess p = processList.get(i);
+					if(StringUtils.isNotBlank(p.getIsApproval()) && "0".equals(p.getIsApproval())){
+						p.setDelFlag("1");
+						p.setIsApproval("-1");
+						workActivityProcessDao.updateDelFlagAndIsApproval(p);
+					}
+				}
+				WorkActivityProcess pro = new WorkActivityProcess();
+				pro.setId("");
+				pro.preInsert();
+				pro.setDelFlag("0");
+				pro.setRemarks("[强制撤销]");
+				pro.setProcessKey(processList.get(0).getProcessKey());
+				pro.setIsApproval("1");
+				pro.setProcessInstanceId(processList.get(0).getProcessInstanceId());
+				pro.setCount(0);
+				workActivityProcessDao.insert(pro);
+			}
+
+			//结束该流程,设为"撤销"状态
+			actTaskService.endProcessInstance(invalidateProcessInstanceId,"加班申请-强制撤销");
+			workOvertime.setStatus("3");
+			workOvertime.preUpdate();
+			workOvertimeDao.update(workOvertime);
+
+		}catch (ActivitiObjectNotFoundException e){
+			System.err.println("撤销异常,因为这个流程已不存在!");
+			e.printStackTrace();
+		}
+		catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}

+ 370 - 0
src/main/java/com/jeeplus/modules/workovertime/web/WorkOvertimeController.java

@@ -0,0 +1,370 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertime.web;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.base.Strings;
+import com.google.common.collect.Maps;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.projectrecord.dao.WorkProjectUserDao;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.sysmtree.service.SysMtreeService;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workbidproject.service.WorkBidProjectService;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workfullmanage.service.WorkFullManageService;
+import com.jeeplus.modules.workreimbursement.service.WorkReimbursementService;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workovertime.entity.WorkOvertime;
+import com.jeeplus.modules.workovertime.service.WorkOvertimeService;
+
+/**
+ * 加班申请Controller
+ * @author ssrh
+ * @version 2018-09-04
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workovertime/workOvertime")
+public class WorkOvertimeController extends BaseController {
+
+	@Autowired
+	protected RuntimeService runtimeService;
+
+	@Autowired
+	protected TaskService taskService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private HttpServletRequest request;
+
+	@Autowired
+	private SysMtreeService sysMtreeService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private OfficeService officeService;
+
+	@Autowired
+	private WorkOvertimeService workOvertimeService;
+
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+	
+	@ModelAttribute
+	public WorkOvertime get(@RequestParam(required=false) String id) {
+		WorkOvertime entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workOvertimeService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkOvertime();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 加班申请列表页面
+	 */
+	@RequiresPermissions("workovertime:workOvertime:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkOvertime workOvertime, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkOvertime> page = workOvertimeService.findPage(new Page<WorkOvertime>(request, response), workOvertime); 
+		model.addAttribute("page", page);
+		return "modules/workovertime/workOvertimeList";
+	}
+
+	/**
+	 * 查看,增加,编辑加班申请表单页面
+	 */
+	//@RequiresPermissions(value={"workovertime:workOvertime:view","workovertime:workOvertime:add","workovertime:workOvertime:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkOvertime workOvertime, Model model) {
+		String view = "workOvertimeForm";
+		Office office = UserUtils.getSelectOffice();
+		String tabId = request.getParameter("tabId");
+		if("1".equals(tabId)){
+			view = "workOvertimeView";
+		}else if("3".equals(tabId)){
+			ProcessInstance processInstance = actTaskService.getProcIns(workOvertime.getProcessInstanceId());
+			if (processInstance!=null) {
+				Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+				Act act = new Act();
+				act.setTaskId(taskInfok.getId());
+				act.setTaskName(taskInfok.getName());
+				act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+				act.setProcDefId(taskInfok.getProcessDefinitionId());
+				act.setProcInsId(taskInfok.getProcessInstanceId());
+				act.setTask(taskInfok);
+				workOvertime.setAct(act);
+				view = "workOvertimeModify";
+			}
+		}
+		// 环节编号
+		String taskDefKey = workOvertime.getAct().getTaskDefKey();
+		if (StringUtils.isNotBlank(taskDefKey) && ("bmzr".equals(taskDefKey))){
+			view = "workOvertimeAudit";
+		}
+		if(StringUtils.isBlank(workOvertime.getId())){
+			workOvertime.setName(UserUtils.getUser().getName());
+			WorkStaffBasicInfo workStaffBasicInfo = new WorkStaffBasicInfo();
+			workStaffBasicInfo.setUserId(UserUtils.getUser().getId());
+			workStaffBasicInfo.setOffice(UserUtils.getSelectOffice());
+			workStaffBasicInfo = workStaffBasicInfoService.getByUserOffice(workStaffBasicInfo);
+			workOvertime.setWorkStaffBasicInfo(workStaffBasicInfo);
+		}
+		model.addAttribute("workOvertime", workOvertime);
+		return "modules/workovertime/"+view;
+	}
+	/**
+	 * 暂存
+	 */
+	@RequestMapping(value = "store")
+	public String store(WorkOvertime workOvertime,
+						Model model,
+						RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOvertime)){
+			return form(workOvertime, model);
+		}
+		User user = workOvertime.getCreateBy();
+		String submitter = "";
+		if(user != null){
+			submitter = user.getId();
+		}
+		String sta = workOvertime.getStatus();
+		if(!UserUtils.getUser().getId().equals(submitter) && !Strings.isNullOrEmpty(submitter) && sta != null){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+		}
+		workOvertime.setStatus("1"); //暂存状态
+		workOvertime.setCompanyId(UserUtils.getSelectCompany().getId());
+		workOvertime.setOfficeId(UserUtils.getSelectOffice().getId());
+		if (StringUtils.isNotBlank(workOvertime.getProcessInstanceId()) && workOvertime.getProcessInstanceId().equals("NULL")){
+			workOvertime.setProcessInstanceId("");
+		}
+		if(!workOvertime.getIsNewRecord()){//编辑表单保存
+			WorkOvertime t = workOvertimeService.get(workOvertime.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workOvertime, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workOvertimeService.save(t);//保存
+		}else{//新增表单保存
+			workOvertimeService.save(workOvertime);//保存
+		}
+		addMessage(redirectAttributes, "保存加班申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+	}
+	/**
+	 * 保存加班申请
+	 */
+	@RequiresPermissions(value={"workovertime:workOvertime:add","workovertime:workOvertime:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkOvertime workOvertime, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workOvertime)){
+			return form(workOvertime, model);
+		}
+		User user = workOvertime.getCreateBy();
+		String sta = workOvertime.getStatus();
+		if(user!=null && !UserUtils.getUser().getId().equals(user.getId()) && StringUtils.isNotBlank(user.getId())){
+			addMessage(redirectAttributes, "您不是申请人,无法修改");
+			return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+		}
+		//状态设置为审核中
+		workOvertime.setStatus("2");
+		String processInstanceId ="";
+		if (user!=null && StringUtils.isNotBlank(user.getId()) && StringUtils.isNotBlank(sta) && "3".equals(sta)){
+			processInstanceId = workOvertimeService.get(workOvertime.getId()).getProcessInstanceId();
+		}
+		try {
+			Map<String, Object> variables = Maps.newHashMap();
+			workOvertime.setCompanyId(UserUtils.getSelectCompany().getId());
+			workOvertime.setOfficeId(UserUtils.getSelectOffice().getId());
+			String str = workOvertimeService.save(workOvertime, variables,processInstanceId);
+			if (StringUtils.isNotBlank(str)){
+				addMessage(redirectAttributes, "加班申请提交失败:"+str);
+			}else {
+				addMessage(redirectAttributes, "加班申请已经提交");
+			}
+
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "加班申请提交失败!");
+			addMessage(redirectAttributes, "系统内部错误");
+		}
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+	}
+	/**
+	 * 工单执行(完成任务)
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkOvertime workOvertime, Model model,
+							RedirectAttributes redirectAttributes) {
+		try {
+			List<User> users = UserUtils.getByProssType(workOvertime.getProcessInstanceId(),1);
+			String flag = workOvertime.getAct().getFlag();
+			if ("yes".equals(flag) && (users==null || users.size()==0)){
+				addMessage(redirectAttributes, "审批失败,审批人为空,请联系管理员!");
+			}else {
+				String str = workOvertimeService.auditSave(workOvertime,users);
+				addMessage(redirectAttributes, str);
+			}
+		}catch (Exception e){
+			addMessage(redirectAttributes, "审批失败");
+		}
+
+		if (StringUtils.isNotBlank(workOvertime.getHome()) && "home".equals(workOvertime.getHome())){
+			return "redirect:" + Global.getAdminPath() + "/home/?repage";
+		}else {
+			return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+		}
+	}
+	/**
+	 * 删除加班申请
+	 */
+	@RequiresPermissions("workovertime:workOvertime:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkOvertime workOvertime, RedirectAttributes redirectAttributes) {
+		workOvertimeService.delete(workOvertime);
+		addMessage(redirectAttributes, "删除加班申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+	}
+	
+	/**
+	 * 批量删除加班申请
+	 */
+	@RequiresPermissions("workovertime:workOvertime:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workOvertimeService.delete(workOvertimeService.get(id));
+		}
+		addMessage(redirectAttributes, "删除加班申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workovertime:workOvertime:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkOvertime workOvertime, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "加班申请"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkOvertime> page = workOvertimeService.findPage(new Page<WorkOvertime>(request, response, -1), workOvertime);
+    		new ExportExcel("加班申请", WorkOvertime.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出加班申请记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workovertime:workOvertime:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkOvertime> list = ei.getDataList(WorkOvertime.class);
+			for (WorkOvertime workOvertime : list){
+				try{
+					workOvertimeService.save(workOvertime);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条加班申请记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条加班申请记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入加班申请失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+    }
+	
+	/**
+	 * 下载导入加班申请数据模板
+	 */
+	@RequiresPermissions("workovertime:workOvertime:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "加班申请数据导入模板.xlsx";
+    		List<WorkOvertime> list = Lists.newArrayList(); 
+    		new ExportExcel("加班申请数据", WorkOvertime.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+    }
+	/**
+	 * 强制撤销
+	 */
+	@RequestMapping("cancelInvalidate")
+	public String cancelInvalidate(WorkOvertime workOvertime,RedirectAttributes redirectAttributes){
+		workOvertimeService.cancelInvalidate(workOvertime);
+		return "redirect:"+Global.getAdminPath()+"/workovertime/workOvertime/?repage";
+	}
+	/**
+	 * 读取单个实体流程
+	 * @return
+	 */
+	@RequestMapping(value = "getProcessOne")
+	public String getProcessOne(WorkOvertime workOvertime,Model model) {
+		model.addAttribute("processInstanceId", workOvertime.getProcessInstanceId());
+		return "modules/workovertime/workTrack";
+	}
+	
+
+}

+ 59 - 0
src/main/java/com/jeeplus/modules/workovertimeform/dao/WorkOvertimeFormDao.java

@@ -0,0 +1,59 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertimeform.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workovertimeform.entity.WorkOvertimeForm;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 加班申请DAO接口
+ * @author 丁旭
+ * @version 2017-04-26
+ */
+@MyBatisDao
+public interface WorkOvertimeFormDao extends CrudDao<WorkOvertimeForm> {
+
+	
+	/**
+	 * 更新流程实例ID
+	 * @param workOvertimeForm
+	 * @return
+	 */
+	public int updateProcessInstanceId(WorkOvertimeForm workOvertimeForm);
+
+	/**
+	 * 更新实际开始结束时间
+	 * @param workOvertimeForm
+	 * @return
+	 */
+	public int updateRealityTime(WorkOvertimeForm workOvertimeForm);
+
+    /**
+     * 获取当天出差list
+     * @param workOvertimeForm
+     * @return
+     */
+    public List<WorkOvertimeForm> findByCompany(WorkOvertimeForm workOvertimeForm);
+
+    /**
+     * 根据流程实例ID获取Leave
+     * @param processInstanceId
+     * @return
+     */
+    public WorkOvertimeForm getByProcessInstanceId(String processInstanceId);
+
+    List getCreateDateList(Map<String, String> map);
+
+    List<WorkOvertimeForm> findByCompany2(Map<String, Object> map);
+	public List getCreateDateList1(Map<String,String> map);
+	public List findByCompany1(Map<String,String> map);
+	public List getCreateDateListAll(Map<String,String> map);
+	public List findByCompanyAll(Map<String,String> map);
+	public List<WorkOvertimeForm> findByManage(Map<String,Object> map);
+	public List<WorkOvertimeForm> findByCompanySelf(Map<String,Object> map);
+}

+ 433 - 0
src/main/java/com/jeeplus/modules/workovertimeform/entity/WorkOvertimeForm.java

@@ -0,0 +1,433 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertimeform.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 加班申请Entity
+ * @author 丁旭
+ * @version 2017-04-26
+ */
+public class WorkOvertimeForm extends ActEntity<WorkOvertimeForm> {
+	
+	private static final long serialVersionUID = 1L;
+	private String startTime;		// 开始时间
+	private String endTime;		// 结束时间
+	private String longTime;		// 加班时长
+	private String isHolidays;		// 是否节假日
+	private Office office;		// 部门
+	private User user;		// user_id
+	private String companyId;		// company_id
+	private String officeId;
+	private String status;		// 加班申请状态
+	private String processInstanceId; // 流程实例编号
+    private String reason;//加班理由
+    private String realityStartTime; // 实际开始时间
+    private String realityEndTime; // 实际结束时间
+    private String files; //
+    private String comment; //审核意见 目前只保存手机端审核
+	private String ids;
+	private String idNames;
+	private String ida;
+	private String idNamea;
+	private String idb;
+	private String idNameb;
+	private String idc;
+	private String idNamec;
+	private String idd;
+	private String idNamed;
+	private String ide;
+	private String idNamee;
+	private String CCId;
+	private Date createDateStart;
+	private Date createDateEnd;
+	private String name;
+	private String time;
+	private List<String> adds = Lists.newArrayList();
+	private List<Workattachment> workattachmentList;
+	private String home;
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getTime() {
+		return time;
+	}
+
+	public void setTime(String time) {
+		this.time = time;
+	}
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+
+
+    public String getFiles() {
+        return files;
+    }
+
+    public void setFiles(String files) {
+        this.files = files;
+    }
+	
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+    public String getReason() {
+        return reason;
+    }
+
+    public void setReason(String reason) {
+        this.reason = reason;
+    }
+
+    public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public WorkOvertimeForm() {
+		super();
+	}
+
+	public WorkOvertimeForm(String id){
+		super(id);
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="开始时间", align=2, sort=7)
+	public String getStartTime() {
+		return startTime;
+	}
+
+	public void setStartTime(String startTime) {
+		this.startTime = startTime;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="结束时间", align=2, sort=8)
+	public String getEndTime() {
+		return endTime;
+	}
+
+	public void setEndTime(String endTime) {
+		this.endTime = endTime;
+	}
+	
+	@ExcelField(title="加班时长", align=2, sort=9)
+	public String getLongTime() {
+		return longTime;
+	}
+
+	public void setLongTime(String longTime) {
+		this.longTime = longTime;
+	}
+	
+	@ExcelField(title="是否节假日", dictType="is_holidays", align=2, sort=10)
+	public String getIsHolidays() {
+		return isHolidays;
+	}
+
+	public void setIsHolidays(String isHolidays) {
+		this.isHolidays = isHolidays;
+	}
+	
+	@ExcelField(title="部门", fieldType=Office.class, value="office.name", align=2, sort=11)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+	
+	@ExcelField(title="user_id", fieldType=User.class, value="user.name", align=2, sort=12)
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+	
+	@ExcelField(title="company_id", align=2, sort=13)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="加班申请状态", dictType="overtime_status", align=2, sort=14)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+    public String getRealityEndTime() {
+        return realityEndTime;
+    }
+
+    public void setRealityEndTime(String realityEndTime) {
+        this.realityEndTime = realityEndTime;
+    }
+
+    public String getRealityStartTime() {
+        return realityStartTime;
+    }
+
+    public void setRealityStartTime(String realityStartTime) {
+        this.realityStartTime = realityStartTime;
+    }
+
+	public String getIds() {
+		List<String> idList = Lists.newArrayList();
+		if (StringUtils.isNotBlank(ids)) {
+			String ss = ids.trim().replace(" ", ",").replace(" ", ",").replace(",", ",").replace("'", "");
+			for (String s : ss.split(",")) {
+				// if(s.matches("\\d*")) {
+				idList.add("'" + s + "'");
+				// }
+			}
+		}
+		return StringUtils.join(idList, ",");
+	}
+
+	public void setIds(String ids) {
+		this.ids = ids;
+	}
+
+	public String getIdNames() {
+		List<String> idList = Lists.newArrayList();
+		if (StringUtils.isNotBlank(idNames)) {
+			String ss = idNames.trim().replace(" ", ",").replace(" ", ",").replace(",", ",").replace("'", "");
+			for (String s : ss.split(",")) {
+				// if(s.matches("\\d*")) {
+				idList.add("'" + s + "'");
+				// }
+			}
+		}
+		return StringUtils.join(idList, ",");
+	}
+
+	public void setIdNames(String idNames) {
+		this.idNames = idNames;
+	}
+
+	@ExcelField(title="申请人", align=2, sort=12)
+	public String getIda() {
+		return ida;
+	}
+
+	public void setIda(String ida) {
+		this.ida = ida;
+	}
+
+	public String getIdNamea() {
+		return idNamea;
+	}
+
+	public void setIdNamea(String idNamea) {
+		this.idNamea = idNamea;
+	}
+
+	public String getIdb() {
+		return idb;
+	}
+
+	public void setIdb(String idb) {
+		this.idb = idb;
+	}
+
+	public String getIdNameb() {
+		return idNameb;
+	}
+
+	public void setIdNameb(String idNameb) {
+		this.idNameb = idNameb;
+	}
+
+	public String getIdc() {
+		return idc;
+	}
+
+	public void setIdc(String idc) {
+		this.idc = idc;
+	}
+
+	public String getIdNamec() {
+		return idNamec;
+	}
+
+	public void setIdNamec(String idNamec) {
+		this.idNamec = idNamec;
+	}
+
+	public String getIdd() {
+		return idd;
+	}
+
+	public void setIdd(String idd) {
+		this.idd = idd;
+	}
+
+	public String getIdNamed() {
+		return idNamed;
+	}
+
+	public void setIdNamed(String idNamed) {
+		this.idNamed = idNamed;
+	}
+
+	public String getIde() {
+		return ide;
+	}
+
+	public void setIde(String ide) {
+		this.ide = ide;
+	}
+
+	public String getIdNamee() {
+		return idNamee;
+	}
+
+	public void setIdNamee(String idNamee) {
+		this.idNamee = idNamee;
+	}
+
+	public String getCCId() {
+		return CCId;
+	}
+
+	public void setCCId(String CCId) {
+		this.CCId = CCId;
+	}
+
+	public Date getCreateDateStart() {
+		return createDateStart;
+	}
+
+	public void setCreateDateStart(Date createDateStart) {
+		this.createDateStart = createDateStart;
+	}
+
+	public Date getCreateDateEnd() {
+		return createDateEnd;
+	}
+
+	public void setCreateDateEnd(Date createDateEnd) {
+		this.createDateEnd = createDateEnd;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	public List<String> getAdds() {
+		return adds;
+	}
+
+	public void setAdds(List<String> adds) {
+		this.adds = adds;
+	}
+
+	public List<Workattachment> getWorkattachmentList() {
+		return workattachmentList;
+	}
+
+	public void setWorkattachmentList(List<Workattachment> workattachmentList) {
+		this.workattachmentList = workattachmentList;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+}

+ 796 - 0
src/main/java/com/jeeplus/modules/workovertimeform/service/WorkOvertimeFormService.java

@@ -0,0 +1,796 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertimeform.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.oss.OSSClientUtil;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import com.jeeplus.modules.pushinfo.service.PushinfoService;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.entity.Workattachment;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workapprovalcopy.entity.ApprovalCopy;
+import com.jeeplus.modules.workapprovalcopy.service.ApprovalCopyService;
+import com.jeeplus.modules.workovertimeform.dao.WorkOvertimeFormDao;
+import com.jeeplus.modules.workovertimeform.entity.WorkOvertimeForm;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 加班申请Service
+ * @author 丁旭
+ * @version 2017-04-26
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkOvertimeFormService extends CrudService<WorkOvertimeFormDao, WorkOvertimeForm> {
+
+    @Autowired
+    private WorkOvertimeFormDao workOvertimeFormDao ;
+    @Autowired
+    private RuntimeService runtimeService;
+    @Autowired
+    protected TaskService taskService;
+    @Autowired
+    protected HistoryService historyService;
+    @Autowired
+    protected RepositoryService repositoryService;
+    @Autowired
+    private IdentityService identityService;
+    @Autowired
+    private UserDao userDao;
+    @Autowired
+    private ActTaskService actTaskService;
+    @Autowired
+    private ApprovalCopyService approvalCopyService;
+    @Autowired
+    private PushinfoService pushinfoService;
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+    @Autowired
+    private WorkattachmentService workattachmentService;
+
+    public WorkOvertimeForm get(String id){
+        WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.get(id);
+        Map<String,Object> variables=null;
+        HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(workOvertimeForm.getProcessInstanceId()).singleResult();
+        if(historicProcessInstance!=null) {
+            variables = Collections3.extractToMap(historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list(), "variableName", "value");
+        } else {
+            variables = runtimeService.getVariables(runtimeService.createProcessInstanceQuery().processInstanceId(workOvertimeForm.getProcessInstanceId()).active().singleResult().getId());
+        }
+        workOvertimeForm.setVariables(variables);
+
+        List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(workOvertimeForm.getId(),"72");
+        workOvertimeForm.setWorkattachmentList(workattachmentList);
+        return workOvertimeForm;
+
+    }
+
+    public WorkOvertimeForm getById(String id){
+        WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.get(id);
+        return workOvertimeForm;
+    }
+
+    @Transactional(readOnly = false)
+    public Map getOverTimeById(String id,String type){
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        WorkOvertimeForm workOvertimeForm = this.getById(id);
+        Map<String,Object> map = Maps.newHashMap();
+        if(workOvertimeForm!=null){
+            User user = userDao.get(workOvertimeForm.getCreateBy());
+            String officeName = "";
+            if(user!=null){
+                map.put("userName", user.getName());
+                map.put("photo",user.getPhoto());
+                map.put("users",user.getId());
+                Office office = user.getOffice();
+                if(office!=null && office.getName()!=null){
+                    officeName = office.getName();
+                }
+            }
+            map.put("officeName",officeName);
+            map.put("createDate",workOvertimeForm.getCreateDate()==null?"":sdf.format(workOvertimeForm.getCreateDate()));
+            map.put("startTime",workOvertimeForm.getStartTime());
+            map.put("endTime",workOvertimeForm.getEndTime());
+            String isHolidays = workOvertimeForm.getIsHolidays();
+            if (isHolidays.equals("1")){
+                isHolidays = "是";
+            }else if (isHolidays.equals("2")){
+                isHolidays = "不是";
+            }
+            map.put("isHolidays",isHolidays);
+            //map.put("office",workOvertimeForm.getOffice().getName());
+            map.put("status",workOvertimeForm.getStatus());
+            map.put("reason",workOvertimeForm.getReason());
+            map.put("companyId",workOvertimeForm.getCompanyId());
+            map.put("approvalId",id);
+            map.put("status",workOvertimeForm.getStatus());
+           /* map.put("files", workOvertimeForm.getFiles()==null?"": workOvertimeForm.getFiles());*/
+            List<Workattachment> workattachmentList = workattachmentService.getListByAttachmentIdAndFlag(workOvertimeForm.getId(),"72");
+            String files = "";
+            if (workattachmentList!=null && workattachmentList.size()!=0){
+                for (Workattachment workattachment : workattachmentList){
+                    files += workattachment.getUrl()+",";
+                }
+                if (files.length() > 1) {
+                    files = files.substring(0, files.length() - 1);
+                }
+            }
+            map.put("files", files);
+            map.put("longTime",workOvertimeForm.getLongTime()==null?"":workOvertimeForm.getLongTime());
+            List<Act> list = actTaskService.histoicFlowList(workOvertimeForm.getProcessInstanceId(), "", "");
+            List<Act> list2 = actTaskService.toMyStartedList(workOvertimeForm.getProcessInstanceId());
+            if (list2!=null && list2.size()!=0){
+                Act act1 = list2.get(list2.size()-1);
+                map.put("taskId", act1.getTaskId());
+                map.put("taskName",act1.getTaskName());
+                map.put("procInsId", act1.getProcInsId());
+                map.put("procDefId", act1.getProcDefId());
+                map.put("actStatus", act1.getStatus()==null?"todo":act1.getStatus());
+                map.put("taskDefKey", act1.getTaskDefKey());
+                map.put("procDefKey", "overtime");
+            }
+            List list1 = new ArrayList();
+            String approvalStatus = "0";
+            String assigneeName = "";
+            if (list!=null && list.size()!=0) {
+                if (list.get(0).getHistIns().getActivityName().contains("审批")) {
+                    for (int i = list.size() - 1; i > -1; i--) {
+                        Act act = list.get(i);
+                        Map<String, Object> maps = new HashMap<String, Object>();
+                        String state = "0";
+                        String activityName = "";
+                        if (act.getHistIns().getActivityName().contains("审批")) {
+                            if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+                                activityName = "已审批";
+                                if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
+                                    approvalStatus = "1";
+                                }
+                            } else {
+                                activityName = "待审批";
+                                state = "2";
+                            }
+                        } else {
+                            activityName = act.getHistIns().getActivityName();
+                        }
+                        maps.put("activityName", activityName);
+                        maps.put("assigneeName", UserUtils.getUser().getName().equals(act.getAssigneeName()) ? "我" : act.getAssigneeName());
+                        maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+                        maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+                        maps.put("durationTime", act.getDurationTime());
+                        maps.put("state", state);
+                        maps.put("userId", act.getCurrentUser().getId());
+                        list1.add(maps);
+                    }
+                } else {
+                    if (workOvertimeForm.getStatus().equals("4") || workOvertimeForm.getStatus().equals("3")){
+                        for (int i = 0; i < list.size()-1; i++) {
+                            Act act = list.get(i);
+                            Map<String, Object> maps = new HashMap<String, Object>();
+                            String state = "0";
+                            String activityName = "";
+                            if (act.getHistIns().getActivityName().contains("发起申请")) {
+                                activityName = act.getHistIns().getActivityName();
+                                assigneeName = act.getAssigneeName();
+                            }else if (act.getHistIns().getActivityName().contains("审批")) {
+                                if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+                                    assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+                                }
+                                if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+                                    activityName = "已审批";
+                                    if (UserUtils.getUser().getName().equals(assigneeName)){
+                                        approvalStatus = "1";
+                                    }
+                                    if (i == (list.size()-2) && workOvertimeForm.getStatus().equals("4")){
+                                        activityName = "审核驳回";
+                                        state = "1";
+                                    }else if (i == (list.size()-2) && workOvertimeForm.getStatus().equals("3")){
+                                        activityName = "审核成功";
+                                    }
+                                } else {
+                                    activityName = "待审批";
+                                    state = "2";
+                                }
+                            }
+                            else {
+                                activityName = act.getHistIns().getActivityName();
+                                if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+                                    assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+                                }
+                            }
+
+                            maps.put("activityName", activityName);
+                            maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
+                            maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+                            maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+                            maps.put("durationTime", act.getDurationTime());
+                            maps.put("state", state);
+                            maps.put("userId", act.getCurrentUser().getId());
+                            list1.add(maps);
+                        }
+                    }else {
+                        for (int i = 0; i < list.size(); i++) {
+                            Act act = list.get(i);
+                            Map<String, Object> maps = new HashMap<String, Object>();
+                            String state = "0";
+                            String activityName = "";
+                            if (act.getHistIns().getActivityName().contains("发起申请")) {
+                                activityName = act.getHistIns().getActivityName();
+                                assigneeName = act.getAssigneeName();
+                            }else if (act.getHistIns().getActivityName().contains("审批")) {
+                                if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+                                    assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+                                }
+                                if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+                                    activityName = "已审批";
+                                    if (UserUtils.getUser().getName().equals(assigneeName)){
+                                        approvalStatus = "1";
+                                    }
+                                } else {
+                                    activityName = "待审批";
+                                    state = "2";
+                                }
+                            }
+                            else {
+                                if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+                                    assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+                                }
+                                activityName = act.getHistIns().getActivityName();
+                            }
+                            if (workOvertimeForm.getStatus().equals("5") && i == list.size() - 1) {
+                                activityName = "已撤销";
+                                state = "1";
+                            }
+                            maps.put("activityName", activityName);
+                            maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" :assigneeName);
+                            maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+                            maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+                            maps.put("durationTime", act.getDurationTime());
+                            maps.put("state", state);
+                            maps.put("userId", act.getCurrentUser().getId());
+                            list1.add(maps);
+                        }
+                    }
+                }
+            }
+            map.put("approvalStatus", approvalStatus);
+            ApprovalCopy approvalCopy = new ApprovalCopy();
+            approvalCopy.setApprovalId(id);
+            List<ApprovalCopy> approvalCopyList = approvalCopyService.findList(approvalCopy);
+            String CCName = "";
+            String CCId = "";
+            Boolean readFlag = false;
+            if (approvalCopyList!=null && approvalCopyList.size()!=0) {
+                ApprovalCopy approvalCopy1 = approvalCopyList.get(0);
+                CCId = approvalCopy1.getCCId();
+                String[] CCid = approvalCopy1.getCCId().split(",");
+                readFlag = approvalCopy1.getReadFlag().equals("0");
+                if (type.equals("3") && readFlag){
+                    approvalCopy1.setReadFlag("1");
+                    approvalCopyService.save(approvalCopy1);
+                }
+                for (String userId : CCid) {
+                    User CCUser = UserUtils.get(userId);
+                    if (CCUser != null) {
+                        CCName = CCUser.getName() + ",";
+                    }
+                }
+                if (CCName.length() > 1) {
+                    CCName = CCName.substring(0, CCName.length() - 1);
+                } else {
+                    CCName = "";
+                }
+            }
+            map.put("nameCopy",CCName);
+            map.put("CCId",CCId);
+            map.put("process",list1);
+        }
+        return map;
+    }
+
+    /**
+     * 获取流程详细信息
+     * @param processInstanceId
+     */
+    @SuppressWarnings("unchecked")
+    public WorkOvertimeForm getByProcessInstanceId(String processInstanceId) {
+        WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.getByProcessInstanceId(processInstanceId);
+        return workOvertimeForm;
+    }
+
+    public List<WorkOvertimeForm> findList(WorkOvertimeForm workOvertimeForm) {
+        return super.findList(workOvertimeForm);
+    }
+
+    public Page<WorkOvertimeForm> findPage(Page<WorkOvertimeForm> page, WorkOvertimeForm workOvertimeForm) {
+        return super.findPage(page, workOvertimeForm);
+    }
+
+    @Transactional(readOnly = false)
+    public void save(WorkOvertimeForm workOvertimeForm) {
+        super.save(workOvertimeForm);
+    }
+
+    @Transactional(readOnly = false)
+    public void present(WorkOvertimeForm workOvertimeForm,Map<String, Object> variables,String type){
+        // 保存业务数据
+        if (StringUtils.isBlank(workOvertimeForm.getId())) {
+            super.save(workOvertimeForm);
+
+            logger.debug("save entity: {}", workOvertimeForm);
+
+            // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+            identityService.setAuthenticatedUserId(workOvertimeForm.getCurrentUser().getId());
+            // 启动流程
+            String businessKey = workOvertimeForm.getId().toString();
+            variables.put("type", "overtimeform");
+            variables.put("busId", businessKey);
+            variables.put("title", workOvertimeForm.getReason());//设置标题;
+
+            ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OVERTIMEFORM[0], businessKey, variables);
+            workOvertimeForm.setProcessInstance(processInstance);
+            workOvertimeForm.setProcessInstanceId(processInstance.getProcessInstanceId());
+            workOvertimeFormDao.updateProcessInstanceId(workOvertimeForm);
+
+            logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[] {
+                    ActUtils.PD_OVERTIMEFORM[0], businessKey, processInstance.getId(), variables });
+        }else{
+            workOvertimeForm.preUpdate();
+            workOvertimeFormDao.update(workOvertimeForm);
+            workOvertimeForm.getAct().setComment(("yes".equals(workOvertimeForm.getAct().getFlag())?"[重申] ":"[销毁] ")+workOvertimeForm.getAct().getComment());
+
+            // 完成流程任务
+            Map<String, Object> vars = Maps.newHashMap();
+            vars.put("reApply", "yes".equals(workOvertimeForm.getAct().getFlag())? true : false);
+            actTaskService.complete(workOvertimeForm.getAct().getTaskId(), workOvertimeForm.getAct().getProcInsId(), workOvertimeForm.getAct().getComment(), workOvertimeForm.getComment(), vars);
+        }
+
+
+    }
+
+    @Transactional(readOnly = false)
+    public void saveFile(WorkOvertimeForm workOvertimeForm) {
+        if (StringUtils.isBlank(workOvertimeForm.getId())){
+            workOvertimeForm.preInsert();
+            workOvertimeFormDao.insert(workOvertimeForm);
+        }else{
+            workOvertimeForm.preUpdate();
+            workOvertimeFormDao.update(workOvertimeForm);
+        }
+    }
+
+    @Transactional(readOnly = false)
+    public void delete(WorkOvertimeForm workOvertimeForm) {
+        workOvertimeFormDao.delete(workOvertimeForm);
+    }
+
+    @Transactional(readOnly = false)
+    public void update(WorkOvertimeForm workOvertimeForm) {
+        workOvertimeFormDao.update(workOvertimeForm);
+    }
+
+    /**
+     * 查询待办任务
+     * @param userId 用户ID
+     * @return
+     */
+    public List<WorkOvertimeForm> findTodoTasks(String userId) {
+        List<WorkOvertimeForm> results = new ArrayList<>();
+        List<Task> tasks = new ArrayList<Task>();
+        // 根据当前人的ID查询
+        List<Task> todoList = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OVERTIMEFORM[0]).taskAssignee(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();
+        // 根据当前人未签收的任务
+        List<Task> unsignedTasks = taskService.createTaskQuery().processDefinitionKey(ActUtils.PD_OVERTIMEFORM[0]).taskCandidateUser(userId).active().orderByTaskPriority().desc().orderByTaskCreateTime().desc().list();
+        // 合并
+        tasks.addAll(todoList);
+        tasks.addAll(unsignedTasks);
+        // 根据流程的业务ID查询实体并关联
+        for (Task task : tasks) {
+            String processInstanceId = task.getProcessInstanceId();
+            ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+            String businessKey = processInstance.getBusinessKey();
+            WorkOvertimeForm workOvertimeForm = workOvertimeFormDao.get(businessKey);
+            workOvertimeForm.setTask(task);
+            workOvertimeForm.setProcessInstance(processInstance);
+            workOvertimeForm.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId((processInstance.getProcessDefinitionId())).singleResult());
+            results.add(workOvertimeForm);
+        }
+        return results;
+    }
+
+
+
+    public Page<WorkOvertimeForm> find(Page<WorkOvertimeForm> page, WorkOvertimeForm workOvertimeForm) {
+
+        workOvertimeForm.getSqlMap().put("dsf", dataScopeFilter(workOvertimeForm.getCurrentUser(), "o", "u","", MenuStatusEnum.WORK_OVERTIME_FORM.getValue()));
+
+        workOvertimeForm.setPage(page);
+        page.setList(workOvertimeFormDao.findList(workOvertimeForm));
+
+        for(WorkOvertimeForm item : page.getList()) {
+            String processInstanceId = item.getProcessInstanceId();
+            HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+            if(historicProcessInstance!=null) {
+                item.setHistoricProcessInstance(historicProcessInstance);
+                item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
+            } else {
+                ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+                if (processInstance != null){
+                    item.setProcessInstance(processInstance);
+                    item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
+                }
+            }
+            ProcessInstance processInstance = actTaskService.getProcIns(item.getProcessInstanceId());
+            if (processInstance!=null) {
+                Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+                if (StringUtils.isNotBlank(taskInfok.getAssignee()) && taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
+                    item.setTask(taskInfok);
+                }
+            }
+        }
+        return page;
+    }
+
+    /* * 审核审批保存
+     * @param testAudit
+     */
+    @Transactional(readOnly = false)
+    public void auditSave(WorkOvertimeForm workOvertimeForm) {
+
+        // 设置意见
+        workOvertimeForm.getAct().setComment(("yes".equals(workOvertimeForm.getAct().getFlag())?"[同意] ":"[驳回] ")+workOvertimeForm.getAct().getComment());
+        workOvertimeForm.preUpdate();
+        this.update(workOvertimeForm);
+        // 对不同环节的业务逻辑进行操作
+        String taskDefKey = workOvertimeForm.getAct().getTaskDefKey();
+
+        //发送通知
+        WorkProjectNotify notify = new WorkProjectNotify();
+        notify.setNotifyId(workOvertimeForm.getId());
+        notify.setCompanyId(UserUtils.getSelectCompany().getId());
+        notify.setType("25");
+        notify.setStatus("0");
+        notify.setNotifyRole("");
+
+        //业务逻辑对应的条件表达式
+        String exp = "";
+        // 审核环节
+        if ("audit1".equals(taskDefKey)){
+            exp = "pass";
+        }else if ("audit2".equals(taskDefKey)){
+            exp = "pass";
+        }else if ("audit3".equals(taskDefKey)){
+            exp = "pass";
+        }else if ("audit4".equals(taskDefKey)){
+            exp = "pass";
+        }else if ("audit5".equals(taskDefKey)){
+            exp = "pass";
+        }else if("apply_end".equals(taskDefKey)){
+            exp = "pass";
+        }
+        // 未知环节,直接返回
+        else{
+            return;
+        }
+
+        // 提交流程任务
+        Map<String, Object> vars = Maps.newHashMap();
+        vars.put(exp, "yes".equals(workOvertimeForm.getAct().getFlag())? false : true);
+        // 提交流程任务
+        actTaskService.complete(workOvertimeForm.getAct().getTaskId(), workOvertimeForm.getAct().getProcInsId(), workOvertimeForm.getAct().getComment(), vars);
+        boolean state = actTaskService.isProcessEnd(workOvertimeForm.getAct().getProcInsId());
+        workOvertimeForm.setStatus("2");
+        if (!state){
+            if ("yes".equals(workOvertimeForm.getAct().getFlag())){
+                workOvertimeForm.setStatus("3");
+            }else {
+                workOvertimeForm.setStatus("4");
+            }
+        }
+        workOvertimeForm.preUpdate();
+        this.update(workOvertimeForm);
+
+        //需在workOvertimeForm更新后 操作:
+        //1待审核  2审核中 3通过 4驳回 5已撤销 6催办中
+        if("2".equals(workOvertimeForm.getStatus())){
+            workOvertimeForm = this.get(workOvertimeForm.getId());
+            String userId = workOvertimeForm.getVariables().get("assignee").toString();
+            if(StringUtils.isNotBlank(userId)){
+                notify.setUser(UserUtils.get(userId));
+            }
+            notify.setTitle("您有新的加班申请待审批");
+            notify.setRemarks("待审批");
+            notify.setContent("加班申请--待审批");
+
+        }else if("3".equals(workOvertimeForm.getStatus())){
+            notify.setUser(workOvertimeForm.getCreateBy());
+            notify.setTitle("您的加班申请已通过");
+            notify.setRemarks("待通知");
+            notify.setContent(workOvertimeForm.getAct().getComment());
+        }else if("4".equals(workOvertimeForm.getStatus())){
+            notify.setUser(workOvertimeForm.getCreateBy());
+            notify.setTitle("您的加班申请被驳回");
+            notify.setRemarks("待通知");
+            notify.setContent(workOvertimeForm.getAct().getComment());
+        }
+        workProjectNotifyService.save(notify);
+
+        //更新审核人的阅读状态
+        WorkProjectNotify notify2 = new WorkProjectNotify();
+        notify2.setUser(UserUtils.getUser());
+        notify2.setNotifyId(workOvertimeForm.getId());
+        workProjectNotifyService.readByNotifyIdAndNotifyUser(notify2);
+
+        //抄送
+        if("3".equals(workOvertimeForm.getStatus()) || "4".equals(workOvertimeForm.getStatus())){
+            ApprovalCopy approvalCopy = approvalCopyService.getByApprovalId(workOvertimeForm.getId());
+            if(approvalCopy!=null && StringUtils.isNotBlank(approvalCopy.getCCId())){
+                WorkProjectNotify notify1= new WorkProjectNotify();
+                notify1.setNotifyId(workOvertimeForm.getId());
+                notify1.setCompanyId(UserUtils.getSelectCompany().getId());
+                notify1.setType("25");
+                notify1.setStatus("0");
+                notify1.setNotifyRole("");
+                notify1.setContent(workOvertimeForm.getAct().getComment());
+                String[] ccIds = approvalCopy.getCCId().split(",");
+                for(String ccId : ccIds){
+                    if(StringUtils.isNotBlank(ccId)){
+                        notify1.setUser(new User(ccId));
+                        if("3".equals(workOvertimeForm.getStatus())){
+                            notify1.setTitle(UserUtils.get(workOvertimeForm.getCreateBy().getId()).getName()+"的加班申请已通过");
+                        }
+                        if("4".equals(workOvertimeForm.getStatus())){
+                            notify1.setTitle(UserUtils.get(workOvertimeForm.getCreateBy().getId()).getName()+"的加班申请被驳回");
+                        }
+                        notify1.setRemarks("待通知");
+                        notify1.setId("");
+                        workProjectNotifyService.save(notify1);
+                    }
+                }
+            }
+        }
+    }
+
+    /* * 审批保存
+     * @param testAudit
+     */
+    @Transactional(readOnly = false)
+    public boolean saveWorkovertimeform(WorkOvertimeForm workOvertimeForm,MultipartFile[] this_upload_files) {
+        try {
+            Map<String, Object> variables = Maps.newHashMap();
+            workOvertimeForm.setStatus("1");
+            String approverId = "";
+            List<String> adds = workOvertimeForm.getAdds();
+            for(int i = 0;i<adds.size();i++){
+                if(i + 1 == adds.size()){
+                    approverId += adds.get(i);
+                }else{
+                    approverId += adds.get(i) + ",";
+                }
+            }
+            workOvertimeForm.setIds(approverId);
+            String type = "1";
+            String alias = "1";
+            List<String> assigneeList=new ArrayList<String>(); //分配任务的人员
+            if(approverId!=null && !approverId.equals("")) {
+                if (!UserUtils.getUser().isAdmin() && approverId.contains(UserUtils.getUser().getId())){
+                    logger.error("用印申请失败,审批人不能为本人");
+                    return false;
+                }
+                String[] approverIds = approverId.split(",");
+                for (int i =0 ;i<approverIds.length;i++){
+                    assigneeList.add(approverIds[i]);
+                }
+                type = approverIds.length+"";
+                alias = approverIds[0];
+            }
+            variables.put("assigneeList", assigneeList);
+            variables.put("count",assigneeList.size());
+            User CC = new User();
+            CC.setId(workOvertimeForm.getCCId());
+            User user = UserUtils.getUser();
+            workOvertimeForm.setUser(user);
+            workOvertimeForm.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+            workOvertimeForm.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
+            workOvertimeForm.setOffice(UserUtils.getSelectOffice());
+            workOvertimeForm.setCreateBy(user);
+            workOvertimeForm.setUpdateBy(user);
+            workOvertimeForm.setDelFlag("0");
+            workOvertimeForm.setStatus("1");
+            present(workOvertimeForm, variables,type);
+
+            if(this_upload_files!=null&&this_upload_files.length>0){
+                OSSClientUtil ossClientUtil = new OSSClientUtil();
+                for (int i = 0; i < this_upload_files.length; i++) {
+                    MultipartFile file = this_upload_files[i];
+                    if(file!=null && !file.isEmpty()&& file.getSize()>0){
+                        uploadFile(ossClientUtil,file,workOvertimeForm,"72");
+                    }
+                }
+            }
+
+            ApprovalCopy approvalCopy = new ApprovalCopy();
+            approvalCopy.setCCId(workOvertimeForm.getCCId());
+            approvalCopy.setUserId(user.getId());
+            approvalCopy.setRemarks(workOvertimeForm.getReason());
+            approvalCopy.setType("overtime");
+            approvalCopy.setApproverId(approverId);
+            approvalCopy.setApprovalId(workOvertimeForm.getId());
+            approvalCopy.setReadFlag("0");
+            approvalCopyService.save(approvalCopy);
+
+            //给抄送人、审批人发送通知
+            if(approvalCopy!=null && org.apache.commons.lang3.StringUtils.isNotBlank(approvalCopy.getId())){
+                String chaosongIds = approvalCopy.getCCId();//给所有抄送人发送通知
+                String shenpiIds = alias;//给审批流程的第一个人发送通知
+                this.sendNotify(chaosongIds,shenpiIds,approvalCopy.getApprovalId());
+                String content = "审批信息 申请人:" + user.getName() + ",加班申请: 待审批!";
+                UserUtils.pushIm(alias,content);
+            }
+
+            String title="审批";
+            String content =  UserUtils.getUser().getName()+"的加班申请需要你审批";
+            String status = "待审批";
+            String remarks = "开始时间:"+workOvertimeForm.getStartTime()+ "\n"
+                    +"结束时间:"+workOvertimeForm.getEndTime()+ "\n"
+                    +"加班时长(小时):"+workOvertimeForm.getLongTime();
+            Map extras = new HashMap();
+            extras.put("type", "4001");
+            extras.put("id", workOvertimeForm.getId());
+            extras.put("procDefKey", "overtime");
+
+            boolean b = JPushClientUtil.sendNotificationToAlias(title, content, extras, alias);
+            Pushinfo pushinfo = new Pushinfo();
+            pushinfo.setCurrentUser(UserUtils.getUser());
+            pushinfo.setRemarks(remarks);
+            pushinfo.setUserId(UserUtils.getUser().getId());
+            pushinfo.setType("4001");
+            pushinfo.setPushId(workOvertimeForm.getId());
+            pushinfo.setTitle(title);
+            pushinfo.setContent(content);
+            pushinfo.setStatus(status);
+            pushinfo.setAddcontent("overtime");
+            pushinfo.setMobile("ios,android");
+            pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+            pushinfo.setPushUserId(alias);
+            pushinfo.setParentType("singleApproval");
+            pushinfoService.save(pushinfo);
+            if (b){
+                return true;
+            }
+        } catch (Exception e) {
+            logger.error("启动加班流程失败:", e);
+        }
+        return false;
+    }
+
+    @Transactional(readOnly = false)
+    public String uploadFile(OSSClientUtil ossClientUtil, MultipartFile file, WorkOvertimeForm workOvertimeForm, String flag) {
+        String fileName = file.getOriginalFilename();
+        String fileType = fileName.substring(fileName.lastIndexOf("."));
+        String url = ossClientUtil.uploadFile2OSS(file,"overtimeform");
+        Workattachment workattachment = new Workattachment();
+        workattachment.setUrl(url);
+        workattachment.setType(fileType);
+        workattachment.setAttachmentName(fileName);
+        workattachment.setAttachmentUser(UserUtils.getUser().getId());
+        workattachment.setAttachmentId(workOvertimeForm.getId());
+        workattachment.setCompanyId(UserUtils.getSelectCompany().getId());
+        workattachment.setAttachmentFlag(flag);
+        workattachmentService.save(workattachment);
+        return url;
+    }
+
+    @Transactional(readOnly = false)
+    public void sendNotify(String chaosongIds,String shenpiId,String goOutId) {
+        if(StringUtils.isNotBlank(goOutId)){
+            if(StringUtils.isNotBlank(chaosongIds)){
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setTitle(UserUtils.getUser().getName()+"发起了加班申请");
+                notify.setRemarks("待通知");
+                notify.setContent(UserUtils.getUser().getName()+"的加班申请");
+                notify.setNotifyRole("");
+                notify.setNotifyId(goOutId);
+                notify.setStatus("0");
+                notify.setCompanyId(UserUtils.getSelectCompany().getId());
+                notify.setType("25");
+                String[] arr = chaosongIds.split(",");
+                for (String id : arr){
+                    if(StringUtils.isNotBlank(id)){
+                        notify.setId("");
+                        notify.setUser(new User(id));
+                        workProjectNotifyService.save(notify);
+                    }
+                }
+            }
+            if(StringUtils.isNotBlank(shenpiId)){
+                WorkProjectNotify notify = new WorkProjectNotify();
+                notify.setTitle("您有新的加班申请待审批");
+                notify.setRemarks("待审批");
+                notify.setContent("加班申请--待审批");
+                notify.setNotifyRole("");
+                notify.setUser(new User(shenpiId));
+                notify.setNotifyId(goOutId);
+                notify.setStatus("0");
+                notify.setCompanyId(UserUtils.getSelectCompany().getId());
+                notify.setType("25");
+                workProjectNotifyService.save(notify);
+            }
+        }
+    }
+
+    public List getCreateDateList(String companyId, String date) {
+        Map<String,String> map = new HashMap<String, String>();
+        map.put("companyId",companyId);
+        map.put("date",date);
+        return workOvertimeFormDao.getCreateDateList(map);
+    }
+
+    public List<WorkOvertimeForm> findByCompany2(WorkOvertimeForm workOvertimeForm, String date) {
+        Map<String,Object> map = new HashMap<>();
+        map.put("workOvertime",workOvertimeForm);
+        map.put("date",date);
+        return workOvertimeFormDao.findByCompany2(map);
+    }
+
+    public List getCreateDateList1(String time) {
+        Map<String,String> map = new HashMap<String,String>();
+        map.put("userId",UserUtils.getUser().getId());
+        map.put("time",time);
+        return workOvertimeFormDao.getCreateDateList1(map);
+    }
+    public List<WorkOvertimeForm> findByCompany1(String time){
+        Map<String,String> map = new HashMap<String,String>();
+        map.put("userId",UserUtils.getUser().getId());
+        map.put("time",time);
+        return workOvertimeFormDao.findByCompany1(map);
+    }
+    public List getCreateDateListAll(String time) {
+        Map<String,String> map = new HashMap<String,String>();
+        WorkOvertimeForm w=new WorkOvertimeForm();
+        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_OVERTIME_FORM.getValue()));
+        map.put("time",time);
+        return workOvertimeFormDao.getCreateDateListAll(map);
+    }
+    public List<WorkOvertimeForm> findByCompanyAll(String time){
+        Map<String,String> map = new HashMap<String,String>();
+        WorkOvertimeForm w=new WorkOvertimeForm();
+        map.put("sqlStr",dataScopeFilter(w.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_OVERTIME_FORM.getValue()));
+        map.put("time",time);
+        return workOvertimeFormDao.findByCompanyAll(map);
+    }
+    public List<WorkOvertimeForm> findByManage(Map<String,Object> map) {
+        return workOvertimeFormDao.findByManage(map);
+    }
+    public List<WorkOvertimeForm> findByCompanySelf(Map<String,Object> map) {
+        return workOvertimeFormDao.findByCompanySelf(map);
+    }
+}

+ 334 - 0
src/main/java/com/jeeplus/modules/workovertimeform/web/WorkOvertimeFormController.java

@@ -0,0 +1,334 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workovertimeform.web;
+
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActAuditService;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workovertimeform.entity.WorkOvertimeForm;
+import com.jeeplus.modules.workovertimeform.service.WorkOvertimeFormService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 加班申请Controller
+ * @author 丁旭
+ * @version 2017-04-26
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workovertimeform/workOvertimeForm")
+public class WorkOvertimeFormController extends BaseController {
+
+	@Autowired
+	private WorkOvertimeFormService workOvertimeFormService;
+
+    @Autowired
+    protected RuntimeService runtimeService;
+
+    @Autowired
+    protected TaskService taskService;
+
+    @Autowired
+    private ActTaskService actTaskService;
+
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+    @Autowired
+    private OfficeService officeService;
+    @Autowired
+    private ActAuditService actAuditService;
+
+    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    @ModelAttribute
+    public WorkOvertimeForm get(@RequestParam(required=false) String id){//,
+//			@RequestParam(value="act.procInsId", required=false) String procInsId) {
+        WorkOvertimeForm workOvertimeForm = null;
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(id)){
+            workOvertimeForm = workOvertimeFormService.get(id);
+//		}else if (StringUtils.isNotBlank(procInsId)){
+//			testAudit = testAuditService.getByProcInsId(procInsId);
+        }
+        if (workOvertimeForm == null){
+            workOvertimeForm = new WorkOvertimeForm();
+        }
+        return workOvertimeForm;
+    }
+
+    @RequiresPermissions(value={"workovertimeform:workovertimeForm:view","workovertimeform:workovertimeForm:add","workovertimeform:workovertimeForm:edit"},logical= Logical.OR)
+    @RequestMapping(value = {"form"})
+    public String form(WorkOvertimeForm workOvertimeForm, Model model) {
+        String view = "workOvertimeFormForm";
+        // 查看审批申请单
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(workOvertimeForm.getId())){//.getAct().getProcInsId())){
+            // 环节编号
+            String taskDefKey = workOvertimeForm.getAct().getTaskDefKey();
+            if (taskDefKey!=null) {
+                // 查看工单
+                if (workOvertimeForm.getAct().isFinishTask()) {
+                    view = "workOvertimeView";
+                }
+                // 修改环节
+                else if ("apply_end".equals(taskDefKey)) {
+                    view = "workOvertimeAudit";
+                }
+                // 审核环节
+                else if ("audit1".equals(taskDefKey)) {
+                    if (org.apache.commons.lang3.StringUtils.isBlank(workOvertimeForm.getAct().getStatus())){
+                        model.addAttribute("disabled","true");
+                    }else {
+                        model.addAttribute("disabled","false");
+                    }
+                    view = "workOvertimeAudit";
+                }
+                //
+                else if ("modifyApply".equals(taskDefKey)) {
+                    view = "workOvertimeFormForm";
+                }
+            }
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(workOvertimeForm.getName())){
+                if (workOvertimeForm.getName().equals("view")){
+                    model.addAttribute("disabled","true");
+                    workOvertimeForm.getAct().setProcInsId(workOvertimeForm.getProcessInstanceId());
+                    view = "workOvertimeAudit";
+                }
+            }
+        }
+
+        model.addAttribute("workOvertimeForm", workOvertimeForm);
+        return "modules/workovertimeform/"+view;
+    }
+
+    /**
+     * 启动加班流程
+     * @param workOvertimeForm
+     */
+    @RequestMapping(value = "save", method = RequestMethod.POST)
+    public String save(WorkOvertimeForm workOvertimeForm, @RequestParam(value = "this_upload_files",required = false)MultipartFile[] this_upload_files, RedirectAttributes redirectAttributes) throws Exception{
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(workOvertimeForm.getId())) {
+            WorkOvertimeForm t = workOvertimeFormService.get(workOvertimeForm.getId());//从数据库取出记录的值
+            MyBeanUtils.copyBeanNotNull2Bean(workOvertimeForm, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            if (t.getStatus().equals("3") || t.getStatus().equals("4")){
+                addMessage(redirectAttributes, "已结束流程不能修改!");
+            }else {
+                workOvertimeFormService.save(t);
+            }
+        } else {
+            try {
+                boolean b = workOvertimeFormService.saveWorkovertimeform(workOvertimeForm,this_upload_files);
+                if (b) {
+                    addMessage(redirectAttributes, "出差加班已经提交");
+                } else {
+                    addMessage(redirectAttributes, "系统内部错误!");
+                }
+            } catch (Exception e) {
+                logger.info("save e.getMessage()=" + e.getMessage());
+                addMessage(redirectAttributes, "系统内部错误!");
+            }
+        }
+        return "redirect:" + adminPath + "/workovertimeform/workOvertimeForm";
+    }
+
+
+    /**
+     * 工单执行(完成任务)
+     * @param workOvertimeForm
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "saveAudit")
+    public String saveAudit(WorkOvertimeForm workOvertimeForm, Map<String, Object> vars, Model model, RedirectAttributes redirectAttributes) {
+        /*if (org.apache.commons.lang3.StringUtils.isBlank(workOvertimeForm.getAct().getComment())){
+            addMessage(model, "请填写审核意见。");
+            return form(workOvertimeForm, model);
+        }*/
+        //workOvertimeFormService.auditSave(workOvertimeForm);
+        Act act = workOvertimeForm.getAct();
+        AjaxJson json = actAuditService.saveAudit(act, act.getProcInsId(), "overtimeform", workOvertimeForm.getAct().getComment(), workOvertimeForm.getId(), "2");
+        addMessage(redirectAttributes, json.getMsg());
+        if (workOvertimeForm!=null && StringUtils.isNotBlank(workOvertimeForm.getHome()) && workOvertimeForm.getHome().equals("home")){
+            return "redirect:" + adminPath + "/home";
+        }
+        return "redirect:" + adminPath + "/workovertimeform/workOvertimeForm";
+    }
+
+    /**
+     * 读取所有流程
+     * @return
+     */
+    @RequiresPermissions("workovertimeform:workovertimeForm:list")
+    @RequestMapping(value = {"list", ""})
+    public String list(WorkOvertimeForm workOvertimeForm, HttpServletRequest request, HttpServletResponse response, Model model) {
+        User user = UserUtils.getUser();
+        if (!user.isAdmin()){
+            workOvertimeForm.setCompanyId(user.getComId());
+            if (!UserUtils.isManager()){
+                workOvertimeForm.setCreateBy(user);
+            }
+        }
+        Page<WorkOvertimeForm> page = workOvertimeFormService.find(new Page<WorkOvertimeForm>(request, response), workOvertimeForm);
+        model.addAttribute("page", page);
+        return "modules/workovertimeform/workOvertimeFormList";
+    }
+
+    /**
+     * 待办任务列表页面
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = {"workOvertimeTodoList"})
+    public String workovertimeTodoList(Act act, HttpServletRequest request, HttpServletResponse response, Model model) {
+        act.setProcDefKey("overtimeform");
+        List<Act> list = actTaskService.todoList(act);
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office==null?"":office.getId();
+        List<WorkOvertimeForm> lists = new ArrayList<WorkOvertimeForm>();
+        for (Act a : list) {
+            WorkOvertimeForm workOvertimeForm = workOvertimeFormService.getByProcessInstanceId(a.getProcInsId());
+            if (workOvertimeForm != null && workOvertimeForm.getCompanyId().equals(companyId)) {
+                if (a.getVars().getMap().get("applyUserId")!=null) {
+                    User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+                    if (user != null) {
+                        a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+                    }
+                }
+                workOvertimeForm.setAct(a);
+                if (com.jeeplus.common.utils.StringUtils.isNotBlank(workOvertimeForm.getId())){
+                    workOvertimeForm.setName(officeService.get(companyId).getName());
+                }
+                lists.add(workOvertimeForm);
+            }
+        }
+        model.addAttribute("list", lists);
+        return "modules/workovertimeform/workOvertimeTodoList";
+    }
+
+    /**
+     * 已办任务
+     * @param act
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = {"workOvertimeHistoricList"})
+    public String oaEvectionHistoricList (Act act, HttpServletRequest request, HttpServletResponse response, Model model){
+        act.setProcDefKey("overtimeform");
+        Page<Act> page = actTaskService.historicList(new Page<Act>(request, response), act);
+        List<Act> list = page.getList();
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office==null?"":office.getId();
+        List<WorkOvertimeForm> lists = new ArrayList<WorkOvertimeForm>();
+        for (Act a : list) {
+            WorkOvertimeForm workOvertimeForm = workOvertimeFormService.getByProcessInstanceId(a.getHistTask().getProcessInstanceId());
+            if (workOvertimeForm != null && workOvertimeForm.getCompanyId().equals(companyId)) {
+                if (a.getVars().getMap().get("applyUserId")!=null){
+                    a.getVars().getMap().put("applyUserId",UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+                }
+                workOvertimeForm.setAct(a);
+                if (com.jeeplus.common.utils.StringUtils.isNotBlank(workOvertimeForm.getId())){
+                    workOvertimeForm.setName(officeService.get(companyId).getName());
+                }
+                lists.add(workOvertimeForm);
+            }
+        }
+        model.addAttribute("list", lists);
+
+        return "modules/workovertimeform/workOvertimeHistoricList";
+    }
+
+    /**
+     * 审核企业信息
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "applyOnOvertime")
+    public String applyOnCompany(Act act, HttpServletResponse response, Model model) {
+        // 获取流程XML上的表单KEY
+        String formKey = actTaskService.getFormKey(act.getProcDefId(), act.getTaskDefKey());
+        //logger.info("------formKeys:"+formKeys);
+        // 获取流程实例对象
+        if (act.getProcInsId() != null){
+            if(actTaskService.getProcIns(act.getProcInsId())!=null){
+                act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+            }else{
+                act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+            }
+        }
+        return "redirect:" + ActUtils.getFormUrl(formKey, act);
+    }
+
+    /**
+     * 加班申请撤销
+     * @param
+     * @return
+     */
+    @RequestMapping(value = "revoke")
+    public String revoke(HttpServletRequest request, HttpServletResponse response) {
+
+        HashMap<String, String> requestMap = findRequestMap(request);
+        String processInstanceId = requestMap.get("processInstanceId");
+        String id = requestMap.get("id");
+        String deleteReason = requestMap.get("reason");
+
+        AjaxJson j = new AjaxJson();
+        try {
+            WorkOvertimeForm workOvertimeForm = workOvertimeFormService.getById(id);
+            workOvertimeForm.setStatus("5");
+            workOvertimeForm.preUpdate();
+            workOvertimeFormService.update(workOvertimeForm);
+            Map map = workOvertimeFormService.getOverTimeById(id,"1");
+            j.put("data",map);
+            actTaskService.endProcessInstance(processInstanceId, deleteReason);
+            j.setMsg("撤销申请成功");
+
+            //撤销后,更改所有发送过的通知的阅读状态
+            WorkProjectNotify notify = new WorkProjectNotify();
+            notify.setNotifyId(workOvertimeForm.getId());
+            workProjectNotifyService.readByNotifyId(notify);
+        }catch (Exception e){
+            j.setErrorCode("101");
+            logger.info(e.getMessage());
+            j.setMsg("撤销申请失败");
+            j.setSuccess(false);
+        }
+        return "redirect:" + adminPath + "/workovertimeform/workOvertimeForm";
+    }
+
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workpartetag/dao/WorkPartEtagDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpartetag.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workpartetag.entity.WorkPartEtag;
+
+/**
+ * 断点续传DAO接口
+ * @author 杨帆
+ * @version 2017-12-18
+ */
+@MyBatisDao
+public interface WorkPartEtagDao extends CrudDao<WorkPartEtag> {
+    public WorkPartEtag getByuploadId(WorkPartEtag workPartEtag);
+	
+}

+ 113 - 0
src/main/java/com/jeeplus/modules/workpartetag/entity/WorkPartEtag.java

@@ -0,0 +1,113 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpartetag.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 断点续传Entity
+ * @author 杨帆
+ * @version 2017-12-18
+ */
+public class WorkPartEtag extends DataEntity<WorkPartEtag> {
+	
+	private static final long serialVersionUID = 1L;
+	private String status;		// 状态值
+	private String bucketName;		// oss地址
+	private String key;		// 键
+	private String uploadId;		// uId
+	private String partNumber;		// 编号
+	private String eTag;		// tag值
+	private String size;		// 大小
+	private String partCRC;		// 大小
+
+	public WorkPartEtag() {
+		super();
+	}
+
+	public WorkPartEtag(String id){
+		super(id);
+	}
+
+	@ExcelField(title="状态值", align=2, sort=6)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="oss地址", align=2, sort=8)
+	public String getBucketName() {
+		return bucketName;
+	}
+
+	public void setBucketName(String bucketName) {
+		this.bucketName = bucketName;
+	}
+	
+	@ExcelField(title="键", align=2, sort=9)
+	public String getKey() {
+		return key;
+	}
+
+	public void setKey(String key) {
+		this.key = key;
+	}
+	
+	@ExcelField(title="uId", align=2, sort=10)
+	public String getUploadId() {
+		return uploadId;
+	}
+
+	public void setUploadId(String uploadId) {
+		this.uploadId = uploadId;
+	}
+	
+	@ExcelField(title="编号", align=2, sort=11)
+	public String getPartNumber() {
+		return partNumber;
+	}
+
+	public void setPartNumber(String partNumber) {
+		this.partNumber = partNumber;
+	}
+	
+	@ExcelField(title="tag值", align=2, sort=12)
+	public String getETag() {
+		return eTag;
+	}
+
+	public void setETag(String eTag) {
+		this.eTag = eTag;
+	}
+	
+	@ExcelField(title="大小", align=2, sort=13)
+	public String getSize() {
+		return size;
+	}
+
+	public void setSize(String size) {
+		this.size = size;
+	}
+
+	public String geteTag() {
+		return eTag;
+	}
+
+	public void seteTag(String eTag) {
+		this.eTag = eTag;
+	}
+
+	public String getPartCRC() {
+		return partCRC;
+	}
+
+	public void setPartCRC(String partCRC) {
+		this.partCRC = partCRC;
+	}
+}

+ 53 - 0
src/main/java/com/jeeplus/modules/workpartetag/service/WorkPartEtagService.java

@@ -0,0 +1,53 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpartetag.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workpartetag.entity.WorkPartEtag;
+import com.jeeplus.modules.workpartetag.dao.WorkPartEtagDao;
+
+/**
+ * 断点续传Service
+ * @author 杨帆
+ * @version 2017-12-18
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkPartEtagService extends CrudService<WorkPartEtagDao, WorkPartEtag> {
+
+	public WorkPartEtag get(String id) {
+		return super.get(id);
+	}
+	public WorkPartEtag getByuploadId(WorkPartEtag workPartEtag) {
+		return dao.getByuploadId(workPartEtag);
+	}
+	
+	public List<WorkPartEtag> findList(WorkPartEtag workPartEtag) {
+		return super.findList(workPartEtag);
+	}
+	
+	public Page<WorkPartEtag> findPage(Page<WorkPartEtag> page, WorkPartEtag workPartEtag) {
+		return super.findPage(page, workPartEtag);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkPartEtag workPartEtag) {
+		super.save(workPartEtag);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkPartEtag workPartEtag) {
+		super.delete(workPartEtag);
+	}
+	
+	
+	
+	
+}

+ 230 - 0
src/main/java/com/jeeplus/modules/workpartetag/web/WorkPartEtagController.java

@@ -0,0 +1,230 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpartetag.web;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workpartetag.entity.WorkPartEtag;
+import com.jeeplus.modules.workpartetag.service.WorkPartEtagService;
+
+/**
+ * 断点续传Controller
+ * @author 杨帆
+ * @version 2017-12-18
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workpartetag/workPartEtag")
+public class WorkPartEtagController extends BaseController {
+
+	@Autowired
+	private WorkPartEtagService workPartEtagService;
+	
+	@ModelAttribute
+	public WorkPartEtag get(@RequestParam(required=false) String id) {
+		WorkPartEtag entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workPartEtagService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkPartEtag();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 断点续传成功列表页面
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkPartEtag workPartEtag, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkPartEtag> page = workPartEtagService.findPage(new Page<WorkPartEtag>(request, response), workPartEtag); 
+		model.addAttribute("page", page);
+		return "modules/workpartetag/workPartEtagList";
+	}
+
+	/**
+	 * 查看,增加,编辑断点续传成功表单页面
+	 */
+	@RequiresPermissions(value={"workpartetag:workPartEtag:view","workpartetag:workPartEtag:add","workpartetag:workPartEtag:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkPartEtag workPartEtag, Model model) {
+		model.addAttribute("workPartEtag", workPartEtag);
+		return "modules/workpartetag/workPartEtagForm";
+	}
+
+	/**
+	 * 保存断点续传成功
+	 */
+	@RequiresPermissions(value={"workpartetag:workPartEtag:add","workpartetag:workPartEtag:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkPartEtag workPartEtag, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workPartEtag)){
+			return form(workPartEtag, model);
+		}
+		if(!workPartEtag.getIsNewRecord()){//编辑表单保存
+			WorkPartEtag t = workPartEtagService.get(workPartEtag.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workPartEtag, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workPartEtagService.save(t);//保存
+		}else{//新增表单保存
+			workPartEtagService.save(workPartEtag);//保存
+		}
+		addMessage(redirectAttributes, "保存断点续传成功成功");
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+	}
+	/**
+	 * 保存断点续传成功
+	 */
+	@RequestMapping(value = "setCheckpoint")
+	@ResponseBody
+	public Map<String,Object> setCheckpoint(String percent,String nextPart,String fileSize,
+											String type,String name,String partSize,String uploadId) throws Exception{
+		WorkPartEtag workPartEtag = new WorkPartEtag();
+		workPartEtag.setSize(fileSize);
+		workPartEtag.setUploadId(uploadId);
+		workPartEtag.setPartNumber(nextPart);
+		Map map = new HashMap();
+		workPartEtagService.save(workPartEtag);//保存
+		map.put("str","success");
+		map.put("workPartEtag",workPartEtag);
+		return map;
+	}
+
+	/**
+	 * 断点续传信息
+	 */
+	@RequestMapping(value = "findByuploadId")
+	@ResponseBody
+	public Map<String,Object> findByuploadId(WorkPartEtag workPartEtag, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Map map = new HashMap();
+		List<WorkPartEtag> list = workPartEtagService.findList(workPartEtag);
+		WorkPartEtag etag = new WorkPartEtag();
+		if (list!=null && list.size()!=0){
+			etag = list.get(0);
+		}
+		map.put("str","success");
+		map.put("workPartEtag",etag);
+		map.put("uploadId",etag.getUploadId());
+		return map;
+	}
+
+	/**
+	 * 删除断点续传成功
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkPartEtag workPartEtag, RedirectAttributes redirectAttributes) {
+		workPartEtagService.delete(workPartEtag);
+		addMessage(redirectAttributes, "删除断点续传成功成功");
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+	}
+	
+	/**
+	 * 批量删除断点续传成功
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workPartEtagService.delete(workPartEtagService.get(id));
+		}
+		addMessage(redirectAttributes, "删除断点续传成功成功");
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkPartEtag workPartEtag, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "断点续传成功"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkPartEtag> page = workPartEtagService.findPage(new Page<WorkPartEtag>(request, response, -1), workPartEtag);
+    		new ExportExcel("断点续传成功", WorkPartEtag.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出断点续传成功记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkPartEtag> list = ei.getDataList(WorkPartEtag.class);
+			for (WorkPartEtag workPartEtag : list){
+				try{
+					workPartEtagService.save(workPartEtag);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条断点续传成功记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条断点续传成功记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入断点续传成功失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+    }
+	
+	/**
+	 * 下载导入断点续传成功数据模板
+	 */
+	@RequiresPermissions("workpartetag:workPartEtag:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "断点续传成功数据导入模板.xlsx";
+    		List<WorkPartEtag> list = Lists.newArrayList(); 
+    		new ExportExcel("断点续传成功数据", WorkPartEtag.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpartetag/workPartEtag/?repage";
+    }
+	
+	
+	
+
+}

+ 20 - 0
src/main/java/com/jeeplus/modules/workpayment/dao/WorkPaymentDao.java

@@ -0,0 +1,20 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpayment.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workpayment.entity.WorkPayment;
+
+/**
+ * 付款申请DAO接口
+ * @author fgy
+ * @version 2018-01-16
+ */
+@MyBatisDao
+public interface WorkPaymentDao extends CrudDao<WorkPayment> {
+
+    WorkPayment getByProcessInstanceId(String processInstanceId);
+    int updateProcessInstanceId(WorkPayment workPayment);
+}

+ 323 - 0
src/main/java/com/jeeplus/modules/workpayment/entity/WorkPayment.java

@@ -0,0 +1,323 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpayment.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.Number2CN;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 付款申请Entity
+ * @author fgy
+ * @version 2018-01-16
+ */
+public class WorkPayment extends ActEntity<WorkPayment> {
+	
+	private static final long serialVersionUID = 1L;
+	private Office company;			//公司
+	private String companyId;		// 公司
+	private String companyName;
+	private Office office;          //部门
+	private String officeId;		// 部门
+	private String officeName;
+	private User user;		//
+	private String userName;	//
+	private String reason;		// 付款事由
+	private String amount;		// 付款总额
+	private String amountCN;	//金额大写
+	private String payType;		// 支付方式
+	private Date payDate;		// 支付日期
+	private String payObject;		// 支付对象
+	private String payBank;		// 开户银行
+	private String payBankAccount;		// 银行账户
+	private String status;		// 审核状态
+	private String processInstanceId;		// 审核实例id
+	private String ids;		//审批人
+	private String CCid;   //抄送人
+	private String name;
+	private String home;
+	private List<String> adds = Lists.newArrayList();
+	private String comment; //审核意见 目前只保存手机端审核
+
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+
+	public WorkPayment() {
+		super();
+	}
+
+	public WorkPayment(String id){
+		super(id);
+	}
+
+	@ExcelField(title="公司", align=2, sort=7)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="部门", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="付款事由", align=2, sort=9)
+	public String getReason() {
+		return reason;
+	}
+
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+	
+	@ExcelField(title="付款总额", align=2, sort=10)
+	public String getAmount() {
+		return amount;
+	}
+
+	public void setAmount(String amount) {
+		this.amount = amount;
+	}
+	
+	@ExcelField(title="支付方式", dictType="pay_type", align=2, sort=11)
+	public String getPayType() {
+		return payType;
+	}
+
+	public void setPayType(String payType) {
+		this.payType = payType;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="支付日期", align=2, sort=12)
+	public Date getPayDate() {
+		return payDate;
+	}
+
+	public void setPayDate(Date payDate) {
+		this.payDate = payDate;
+	}
+	
+	@ExcelField(title="支付对象", align=2, sort=13)
+	public String getPayObject() {
+		return payObject;
+	}
+
+	public void setPayObject(String payObject) {
+		this.payObject = payObject;
+	}
+	
+	@ExcelField(title="开户银行", align=2, sort=14)
+	public String getPayBank() {
+		return payBank;
+	}
+
+	public void setPayBank(String payBank) {
+		this.payBank = payBank;
+	}
+	
+	@ExcelField(title="银行账户", align=2, sort=15)
+	public String getPayBankAccount() {
+		return payBankAccount;
+	}
+
+	public void setPayBankAccount(String payBankAccount) {
+		this.payBankAccount = payBankAccount;
+	}
+	
+	@ExcelField(title="审核状态", dictType="act_status", align=2, sort=16)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="审核实例id", align=2, sort=17)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public Office getCompany() {
+		return company;
+	}
+
+	public void setCompany(Office company) {
+		this.company = company;
+	}
+
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+
+	public String getIds() {
+		return ids;
+	}
+
+	public void setIds(String ids) {
+		this.ids = ids;
+	}
+
+	public String getCCid() {
+		return CCid;
+	}
+
+	public void setCCid(String CCid) {
+		this.CCid = CCid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List<String> getAdds() {
+		return adds;
+	}
+
+	public void setAdds(List<String> adds) {
+		this.adds = adds;
+	}
+
+	public String getComment() {
+		return comment;
+	}
+
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getAmountCN() {
+		String amountCN = "";
+		if(org.apache.commons.lang3.StringUtils.isNotBlank(amount)){
+			BigDecimal bd = new BigDecimal(amount);
+			amountCN = Number2CN.number2CNMontrayUnit(bd);
+		}
+		return amountCN;
+	}
+
+	public void setAmountCN(String amountCN) {
+		this.amountCN = amountCN;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+}

+ 670 - 0
src/main/java/com/jeeplus/modules/workpayment/service/WorkPaymentService.java

@@ -0,0 +1,670 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpayment.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import com.jeeplus.modules.pushinfo.service.PushinfoService;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workapprovalcopy.entity.ApprovalCopy;
+import com.jeeplus.modules.workapprovalcopy.service.ApprovalCopyService;
+import com.jeeplus.modules.workpayment.dao.WorkPaymentDao;
+import com.jeeplus.modules.workpayment.entity.WorkPayment;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 付款申请Service
+ * @author fgy
+ * @version 2018-01-16
+ */
+@SuppressWarnings("all")
+@Service
+@Transactional(readOnly = true)
+public class WorkPaymentService extends CrudService<WorkPaymentDao, WorkPayment> {
+
+	@Autowired
+	private WorkPaymentDao workPaymentDao;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private UserDao userDao;
+	@Autowired
+	private ActTaskService actTaskService;
+	@Autowired
+	private ApprovalCopyService approvalCopyService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private PushinfoService pushinfoService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+
+	public WorkPayment get(String id) {
+		WorkPayment workPayment = workPaymentDao.get(id);
+		Map<String,Object> variables=null;
+		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(workPayment.getProcessInstanceId()).singleResult();
+		if(historicProcessInstance!=null) {
+			variables = Collections3.extractToMap(historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list(), "variableName", "value");
+		} else {
+			variables = runtimeService.getVariables(runtimeService.createProcessInstanceQuery().processInstanceId(workPayment.getProcessInstanceId()).active().singleResult().getId());
+		}
+		workPayment.setVariables(variables);
+		return workPayment;
+	}
+	
+	public List<WorkPayment> findList(WorkPayment workPayment) {
+		return super.findList(workPayment);
+	}
+	
+	public Page<WorkPayment> findPage(Page<WorkPayment> page, WorkPayment workPayment) {
+		workPayment.getSqlMap().put("dsf", dataScopeFilter(workPayment.getCurrentUser(), "o", "u","", MenuStatusEnum.WORK_PETTYCASH.getValue()));
+		workPayment.setPage(page);
+		page.setList(workPaymentDao.findList(workPayment));
+		if(page.getList()!=null && page.getList().size()>0){
+			for(WorkPayment item : page.getList()) {
+				String processInstanceId = item.getProcessInstanceId();
+				HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+				if(historicProcessInstance!=null) {
+					item.setHistoricProcessInstance(historicProcessInstance);
+					item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
+				} else {
+					ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+					if (processInstance != null){
+						item.setProcessInstance(processInstance);
+						item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
+					}
+				}
+				ProcessInstance processInstance = actTaskService.getProcIns(item.getProcessInstanceId());
+				if (processInstance!=null) {
+					Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+					if (StringUtils.isNotBlank(taskInfok.getAssignee()) && taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
+						item.setTask(taskInfok);
+					}
+				}
+			}
+		}
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkPayment workPayment) {
+		super.save(workPayment);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkPayment workPayment) {
+		super.delete(workPayment);
+	}
+
+	@Transactional(readOnly = false)
+	public void update(WorkPayment workPayment) {
+		workPaymentDao.update(workPayment);
+	}
+	public WorkPayment getByProcessInstanceId(String processInstanceId) {
+		WorkPayment workPayment = workPaymentDao.getByProcessInstanceId(processInstanceId);
+		return workPayment;
+	}
+	public WorkPayment getById(String id) {
+		WorkPayment workPayment = workPaymentDao.get(id);
+		return workPayment;
+	}
+
+	@Transactional(readOnly = false)
+	public Map<String,Boolean> saveWorkPettyCash(WorkPayment workPayment) {
+		Map<String,Boolean> resultMap = Maps.newHashMap();
+		try {
+			workPayment.setStatus("1");
+			String approverId = "";
+			List<String> adds = workPayment.getAdds();
+			for(int i = 0;i<adds.size();i++){
+				if(i + 1 == adds.size()){
+					approverId += adds.get(i);
+				}else{
+					approverId += adds.get(i) + ",";
+				}
+			}
+			workPayment.setIds(approverId);
+			Map<String, Object> variables = Maps.newHashMap();
+			String type = "1";
+			String alias = "1";
+			List<String> assigneeList=new ArrayList<String>(); //分配任务的人员
+			if(!UserUtils.getUser().isAdmin() && approverId!=null && !approverId.equals("")) {
+				if (approverId.contains(UserUtils.getUser().getId())){
+					logger.error("付款申请失败,审批人不能为本人");
+					resultMap.put("flag",false);
+					return resultMap;
+				}
+				String[] approverIds = approverId.split(",");
+				for (int i =0 ;i<approverIds.length;i++){
+					assigneeList.add(approverIds[i]);
+				}
+				type = approverIds.length+"";
+				alias = approverIds[0];
+			}
+			variables.put("assigneeList", assigneeList);
+			variables.put("count",assigneeList.size());
+			Office office = UserUtils.getSelectOffice();//付款申请部门
+			Office company = UserUtils.getSelectCompany();
+			User user = UserUtils.getUser();
+			workPayment.setCompany(company);
+			workPayment.setOffice(office);
+			workPayment.setCreateBy(user);
+			workPayment.setUpdateBy(user);
+			workPayment.setDelFlag("0");
+			workPayment.setStatus("1");
+			workPayment.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+			workPayment.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
+			save(workPayment,variables,type);
+			ApprovalCopy approvalCopy = new ApprovalCopy();
+			approvalCopy.setCCId(workPayment.getCCid());
+			approvalCopy.setUserId(user.getId());
+			approvalCopy.setType("payment");
+			approvalCopy.setRemarks(workPayment.getReason());
+			approvalCopy.setApprovalId(workPayment.getId());
+			approvalCopy.setApproverId(approverId);
+			approvalCopy.setReadFlag("0");
+			approvalCopyService.save(approvalCopy);
+
+			//给抄送人、审批人发送通知
+			if(approvalCopy!=null && org.apache.commons.lang3.StringUtils.isNotBlank(approvalCopy.getId())){
+				String chaosongIds = approvalCopy.getCCId();//给所有抄送人发送通知
+				String shenpiIds = alias;//给审批流程的第一个人发送通知
+				this.sendNotify(chaosongIds,shenpiIds,approvalCopy.getApprovalId());
+				String content = "审批信息 申请人:" + user.getName() + ",付款申请: 待审批!";
+				UserUtils.pushIm(alias,content);
+			}
+
+			String title="审批";
+			String content =  user.getName()+"的付款申请需要你审批";
+			String status = "待审批";
+			Office office1 = workPayment.getOffice();
+			String officeName = "";
+			if (office1!=null){
+				Office o = officeService.get(office1.getId());
+				officeName = o.getName();
+			}
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			Date payDate = workPayment.getPayDate();
+			String payDateStr = payDate==null?"":sdf.format(payDate);
+			String remarks = "付款申请部门:"+office.getName()+ "\n"
+					+"付款事由:"+workPayment.getReason()+"\n"
+					+"付款金额:"+workPayment.getAmount();
+			Map extras = new HashMap();
+			extras.put("type", "4001");
+			extras.put("id", workPayment.getId());
+			extras.put("procDefKey", "payment");
+
+			boolean b = JPushClientUtil.sendNotificationToAlias(title, content, extras, alias);
+			Pushinfo pushinfo = new Pushinfo();
+			pushinfo.setCurrentUser(UserUtils.getUser());
+			pushinfo.setRemarks(remarks);
+			pushinfo.setUserId(UserUtils.getUser().getId());
+			pushinfo.setType("4001");
+			pushinfo.setPushId(workPayment.getId());
+			pushinfo.setTitle(title);
+			pushinfo.setContent(content);
+			pushinfo.setPushUserId(alias);
+			pushinfo.setParentType("singleApproval");
+			pushinfo.setStatus(status);
+			pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+			pushinfo.setAddcontent("payment");
+			pushinfo.setMobile("ios,android");
+			pushinfoService.save(pushinfo);
+			if (b){
+				resultMap.put("flag",true);
+				resultMap.put("b",b);
+				return resultMap;
+			}
+		} catch (Exception e) {
+			logger.error("启动付款流程失败:", e);
+		}
+		resultMap.put("flag",false);
+		return resultMap;
+	}
+
+	@Transactional(readOnly = false)
+	public void sendNotify(String chaosongIds, String shenpiIds, String paymentId) {
+		if(StringUtils.isNotBlank(paymentId)){
+			if(StringUtils.isNotBlank(chaosongIds)){
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setTitle(UserUtils.getUser().getName()+"发起了付款申请");
+				notify.setRemarks("待通知");
+				notify.setContent(UserUtils.getUser().getName()+"的付款申请");
+				notify.setNotifyRole("");
+				notify.setNotifyId(paymentId);
+				notify.setStatus("0");
+				notify.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify.setType("34");
+				String[] arr = chaosongIds.split(",");
+				for (String id : arr){
+					if(StringUtils.isNotBlank(id)){
+						notify.setId("");
+						notify.setUser(new User(id));
+						workProjectNotifyService.save(notify);
+					}
+				}
+			}
+			if(StringUtils.isNotBlank(shenpiIds)){
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setTitle("您有新的付款申请待审批");
+				notify.setRemarks("待审批");
+				notify.setContent("付款申请--待审批");
+				notify.setNotifyRole("");
+				notify.setUser(new User(shenpiIds));
+				notify.setNotifyId(paymentId);
+				notify.setStatus("0");
+				notify.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify.setType("34");
+				workProjectNotifyService.save(notify);
+			}
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void save(WorkPayment workPayment, Map<String, Object> variables, String type) {
+		// 保存业务数据
+		if (StringUtils.isBlank(workPayment.getId())) {
+			// 保存业务数据
+			workPayment.preInsert();
+			workPaymentDao.insert(workPayment);
+			logger.debug("save entity: {}", workPayment);
+
+			// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+			identityService.setAuthenticatedUserId(workPayment.getCurrentUser().getId());
+
+			// 启动流程
+			String businessKey = workPayment.getId().toString();
+			variables.put("type", "payment");
+			variables.put("busId", businessKey);
+			variables.put("title", workPayment.getReason());//设置标题;
+			ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OA_PAYMENT[0], businessKey, variables);
+
+			// 更新流程实例ID
+			workPayment.setProcessInstanceId(processInstance.getId());
+			workPayment.setProcessInstance(processInstance);
+			workPaymentDao.updateProcessInstanceId(workPayment);
+
+			logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[] {
+					ActUtils.PD_OA_PAYMENT[0], businessKey, processInstance.getId(), variables });
+		}else{
+			workPayment.preUpdate();
+			workPaymentDao.update(workPayment);
+			workPayment.getAct().setComment(("yes".equals(workPayment.getAct().getFlag())?"[重申] ":"[销毁] ")+workPayment.getAct().getComment());
+
+			// 完成流程任务
+			Map<String, Object> vars = Maps.newHashMap();
+			vars.put("reApply", "yes".equals(workPayment.getAct().getFlag())? true : false);
+			actTaskService.complete(workPayment.getAct().getTaskId(), workPayment.getAct().getProcInsId(), workPayment.getAct().getComment(), workPayment.getComment(), vars);
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void auditSave(WorkPayment workPayment) {
+
+		// 设置意见
+		workPayment.getAct().setComment(("yes".equals(workPayment.getAct().getFlag())?"[同意] ":"[驳回] ")+workPayment.getAct().getComment());
+		workPayment.preUpdate();
+		this.update(workPayment);
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = workPayment.getAct().getTaskDefKey();
+
+		//发送通知
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workPayment.getId());
+		notify.setCompanyId(UserUtils.getSelectCompany().getId());
+		notify.setType("34");
+		notify.setStatus("0");
+		notify.setNotifyRole("");
+
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		// 审核环节
+		if ("audit1".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit2".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit3".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit4".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit5".equals(taskDefKey)){
+			exp = "pass";
+		}else if("apply_end".equals(taskDefKey)){
+			exp = "pass";
+		}
+		// 未知环节,直接返回
+		else{
+			return;
+		}
+
+		// 提交流程任务
+		Map<String, Object> vars = Maps.newHashMap();
+		vars.put(exp, "yes".equals(workPayment.getAct().getFlag())? false : true);
+		// 提交流程任务
+		actTaskService.complete(workPayment.getAct().getTaskId(), workPayment.getAct().getProcInsId(), workPayment.getAct().getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(workPayment.getAct().getProcInsId());
+		workPayment.setStatus("2");
+		if (!state){
+			if ("yes".equals(workPayment.getAct().getFlag())){
+				workPayment.setStatus("3");
+			}else {
+				workPayment.setStatus("4");
+			}
+		}
+		workPayment.preUpdate();
+		this.update(workPayment);
+
+		//需在workSealForm更新后 操作:
+		//1待审核  2审核中 3通过 4驳回 5已撤销 6催办中
+		if("2".equals(workPayment.getStatus())){
+			workPayment = this.get(workPayment.getId());
+			String userId = workPayment.getVariables().get("assignee").toString();
+			if(StringUtils.isNotBlank(userId)){
+				notify.setUser(UserUtils.get(userId));
+			}
+			notify.setTitle("您有新的付款申请待审批");
+			notify.setRemarks("待审批");
+			notify.setContent("备用金申请--待审批");
+
+		}else if("3".equals(workPayment.getStatus())){
+			notify.setUser(workPayment.getCreateBy());
+			notify.setTitle("您的付款申请已通过");
+			notify.setRemarks("待通知");
+			notify.setContent(workPayment.getAct().getComment());
+		}else if("4".equals(workPayment.getStatus())){
+			notify.setUser(workPayment.getCreateBy());
+			notify.setTitle("您的付款申请被驳回");
+			notify.setRemarks("待通知");
+			notify.setContent(workPayment.getAct().getComment());
+		}
+		workProjectNotifyService.save(notify);
+
+		//更新审核人的阅读状态
+		WorkProjectNotify notify2 = new WorkProjectNotify();
+		notify2.setUser(UserUtils.getUser());
+		notify2.setNotifyId(workPayment.getId());
+		workProjectNotifyService.readByNotifyIdAndNotifyUser(notify2);
+
+		//抄送
+		if("3".equals(workPayment.getStatus()) || "4".equals(workPayment.getStatus())){
+			ApprovalCopy approvalCopy = approvalCopyService.getByApprovalId(workPayment.getId());
+			if(approvalCopy!=null && StringUtils.isNotBlank(approvalCopy.getCCId())){
+				WorkProjectNotify notify1= new WorkProjectNotify();
+				notify1.setNotifyId(workPayment.getId());
+				notify1.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify1.setType("34");
+				notify1.setStatus("0");
+				notify1.setNotifyRole("");
+				notify1.setContent(workPayment.getAct().getComment());
+				String[] ccIds = approvalCopy.getCCId().split(",");
+				for(String ccId : ccIds){
+					if(StringUtils.isNotBlank(ccId)){
+						notify1.setUser(new User(ccId));
+						if("3".equals(workPayment.getStatus())){
+							notify1.setTitle(UserUtils.get(workPayment.getCreateBy().getId()).getName()+"的付款申请已通过");
+						}
+						if("4".equals(workPayment.getStatus())){
+							notify1.setTitle(UserUtils.get(workPayment.getCreateBy().getId()).getName()+"的付款申请被驳回");
+						}
+						notify1.setRemarks("待通知");
+						notify1.setId("");
+						workProjectNotifyService.save(notify1);
+					}
+				}
+			}
+		}
+	}
+	@Transactional(readOnly = false)
+	public Map getPaymentById(String id, String type) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+		WorkPayment workPayment = this.getById(id);
+		Map<String,Object> map = Maps.newHashMap();
+		if(workPayment!=null){
+			User user = userDao.get(workPayment.getCreateBy());
+			String officeName = "";
+			if(user!=null){
+				map.put("userName", user.getName());
+				map.put("users", user.getId());
+				map.put("photo",user.getPhoto());
+				Office office = user.getOffice();
+				if(office!=null && office.getName()!=null){
+					officeName = office.getName();
+				}
+			}
+			map.put("officeName",officeName);
+			map.put("createDate",workPayment.getCreateDate()==null?"":sdf.format(workPayment.getCreateDate()));
+			map.put("payDate",workPayment.getPayDate()==null?"":sdf.format(workPayment.getPayDate()));
+			map.put("payObject",workPayment.getPayObject());
+			map.put("payBank",workPayment.getPayBank());
+			map.put("payBankAccount",workPayment.getPayBankAccount());
+			String payType = workPayment.getPayType();
+			if (payType.equals("1")){
+				payType = "支票";
+			}else if (payType.equals("2")){
+				payType = "贷记";
+			}else if (payType.equals("3")){
+				payType = "电汇";
+			}else if (payType.equals("4")){
+				payType = "汇票";
+			}else if (payType.equals("5")){
+				payType = "现金";
+			}else if (payType.equals("6")){
+				payType = "银行卡";
+			}else if (payType.equals("7")){
+				payType = "其他";
+			}
+			map.put("payType",payType);
+			map.put("status",workPayment.getStatus());
+			map.put("amount",workPayment.getAmount());
+			map.put("amountCN",workPayment.getAmountCN());
+			map.put("remarks",workPayment.getRemarks());
+			String office = "";
+			if(workPayment.getOffice()!=null && workPayment.getOffice().getName()!=null){
+				office = workPayment.getOffice().getName();
+			}
+
+			map.put("reason",workPayment.getReason());
+			map.put("approvalId",id);
+			List<Act> list = actTaskService.histoicFlowList(workPayment.getProcessInstanceId(), "", "");
+			List<Act> list2 = actTaskService.toMyStartedList(workPayment.getProcessInstanceId());
+			if (list2!=null && list2.size()!=0) {
+				Act act1 = list2.get(list2.size()-1);
+				map.put("taskId", act1.getTaskId());
+				map.put("taskName", act1.getTaskName());
+				map.put("procInsId", act1.getProcInsId());
+				map.put("procDefId", act1.getProcDefId());
+				map.put("actStatus", act1.getStatus()==null?"todo":act1.getStatus());
+				map.put("taskDefKey", act1.getTaskDefKey());
+				map.put("procDefKey", "payment");
+			}
+			List list1 = new ArrayList();
+			String approvalStatus = "0";
+			String assigneeName = "";
+			if (list!=null && list.size()!=0) {
+				if (list.get(0).getHistIns().getActivityName().contains("审批")) {
+					for (int i = list.size() - 1; i > -1; i--) {
+						Act act = list.get(i);
+						Map<String, Object> maps = new HashMap<String, Object>();
+						String state = "0";
+						String activityName = "";
+						if (act.getHistIns().getActivityName().contains("审批")) {
+							if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+								activityName = "已审批";
+								if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
+									approvalStatus = "1";
+								}
+							} else {
+								activityName = "待审批";
+								state = "2";
+							}
+						} else {
+							activityName = act.getHistIns().getActivityName();
+						}
+						maps.put("activityName", activityName);
+						maps.put("assigneeName", UserUtils.getUser().getName().equals(act.getAssigneeName()) ? "我" : act.getAssigneeName());
+						maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+						maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+						maps.put("durationTime", act.getDurationTime());
+						maps.put("state", state);
+						maps.put("userId", act.getCurrentUser().getId());
+						list1.add(maps);
+					}
+				} else {
+					if (workPayment.getStatus().equals("4") || workPayment.getStatus().equals("3")){
+						for (int i = 0; i < list.size()-1; i++) {
+							Act act = list.get(i);
+							Map<String, Object> maps = new HashMap<String, Object>();
+							String state = "0";
+							String activityName = "";
+							if (act.getHistIns().getActivityName().contains("发起申请")) {
+								activityName = act.getHistIns().getActivityName();
+								assigneeName = act.getAssigneeName();
+							}else if (act.getHistIns().getActivityName().contains("审批")) {
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+									activityName = "已审批";
+									if (UserUtils.getUser().getName().equals(assigneeName)){
+										approvalStatus = "1";
+									}
+									if (i == (list.size()-2) && workPayment.getStatus().equals("4")){
+										activityName = "审核驳回";
+										state = "1";
+									}else if (i == (list.size()-2) && workPayment.getStatus().equals("3")){
+										activityName = "审核成功";
+									}
+								} else {
+									activityName = "待审批";
+									state = "2";
+								}
+							}
+							else {
+								activityName = act.getHistIns().getActivityName();
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+							}
+							maps.put("activityName", activityName);
+							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
+							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+							maps.put("durationTime", act.getDurationTime());
+							maps.put("state", state);
+							maps.put("userId", act.getCurrentUser().getId());
+							list1.add(maps);
+						}
+					}else {
+						for (int i = 0; i < list.size(); i++) {
+							Act act = list.get(i);
+							Map<String, Object> maps = new HashMap<String, Object>();
+							String state = "0";
+							String activityName = "";
+							if (act.getHistIns().getActivityName().contains("发起申请")) {
+								activityName = act.getHistIns().getActivityName();
+								assigneeName = act.getAssigneeName();
+							}else if (act.getHistIns().getActivityName().contains("审批")) {
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+									activityName = "已审批";
+									if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
+										approvalStatus = "1";
+									}
+								} else {
+									activityName = "待审批";
+									state = "2";
+								}
+							}
+							else {
+								activityName = act.getHistIns().getActivityName();
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+							}
+							if (workPayment.getStatus().equals("5") && i == list.size() - 1) {
+								activityName = "已撤销";
+								state = "1";
+							}
+							maps.put("activityName", activityName);
+							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
+							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+							maps.put("durationTime", act.getDurationTime());
+							maps.put("state", state);
+							maps.put("userId", act.getCurrentUser().getId());
+							list1.add(maps);
+						}
+					}
+				}
+			}
+			map.put("approvalStatus", approvalStatus);
+			ApprovalCopy approvalCopy = new ApprovalCopy();
+			approvalCopy.setApprovalId(id);
+			List<ApprovalCopy> approvalCopyList = approvalCopyService.findList(approvalCopy);
+			String CCName = "";
+			String CCId = "";
+			Boolean readFlag = false;
+			if (approvalCopyList!=null && approvalCopyList.size()!=0) {
+				ApprovalCopy approvalCopy1 = approvalCopyList.get(0);
+				CCId = approvalCopy1.getCCId();
+				String[] CCid = approvalCopy1.getCCId().split(",");
+				readFlag = approvalCopy1.getReadFlag().equals("0");
+				if (type.equals("3") && readFlag){
+					approvalCopy1.setReadFlag("1");
+					approvalCopyService.save(approvalCopy1);
+				}
+				for (String userId : CCid) {
+					User CCUser = UserUtils.get(userId);
+					if (CCUser != null) {
+						CCName = CCUser.getName() + ",";
+					}
+				}
+				if (CCName.length() > 1) {
+					CCName = CCName.substring(0, CCName.length() - 1);
+				} else {
+					CCName = "";
+				}
+			}
+			map.put("nameCopy",CCName);
+			map.put("CCId",CCId);
+			map.put("process",list1);
+
+		}
+		return  map;
+	}
+}

+ 436 - 0
src/main/java/com/jeeplus/modules/workpayment/web/WorkPaymentController.java

@@ -0,0 +1,436 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpayment.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActAuditService;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workpayment.entity.WorkPayment;
+import com.jeeplus.modules.workpayment.service.WorkPaymentService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 付款申请Controller
+ * @author fgy
+ * @version 2018-01-16
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/workpayment/workPayment")
+public class WorkPaymentController extends BaseController {
+
+	@Autowired
+	private WorkPaymentService workPaymentService;
+	@Autowired
+	protected RuntimeService runtimeService;
+
+	@Autowired
+	protected TaskService taskService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+	@Autowired
+	private ActAuditService actAuditService;
+	
+	@ModelAttribute
+	public WorkPayment get(@RequestParam(required=false) String id) {
+		WorkPayment entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workPaymentService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkPayment();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 付款申请列表页面
+	 */
+	@RequiresPermissions("workpayment:workPayment:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkPayment workPayment, HttpServletRequest request, HttpServletResponse response, Model model) {
+		User user = UserUtils.getUser();
+		if (!user.isAdmin()){
+			workPayment.setCompanyId(user.getComId());
+			if (!UserUtils.isManager()){
+				workPayment.setCreateBy(user);//申请人
+				//workPayment.setOfficeId(UserUtils.getSelectOffice().getId());
+			}
+		}
+
+		Page<WorkPayment> page = workPaymentService.findPage(new Page<WorkPayment>(request, response), workPayment); 
+		model.addAttribute("page", page);
+		return "modules/workpayment/workPaymentList";
+	}
+
+	/**
+	 * 查看,增加,编辑付款申请表单页面
+	 */
+	@RequiresPermissions(value={"workpayment:workPayment:view","workpayment:workPayment:add","workpayment:workPayment:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkPayment workPayment, Model model) {
+		String view = "workPaymentForm";
+		// 查看审批申请单
+		if (org.apache.commons.lang3.StringUtils.isNotBlank(workPayment.getId())){//.getAct().getProcInsId())){
+			// 环节编号
+			String taskDefKey = workPayment.getAct().getTaskDefKey();
+			if (taskDefKey!=null) {
+				// 查看工单
+				if (workPayment.getAct().isFinishTask()) {
+					view = "workPaymentView";
+				}
+				// 修改环节
+				else if ("apply_end".equals(taskDefKey)) {
+					view = "workPaymentAudit";
+				}
+				// 审核环节
+				else if ("audit1".equals(taskDefKey)) {
+					if (org.apache.commons.lang3.StringUtils.isBlank(workPayment.getAct().getStatus())){
+						model.addAttribute("disabled","true");
+					}else {
+						model.addAttribute("disabled","false");
+					}
+					view = "workPaymentAudit";
+				}
+				//
+				else if ("modifyApply".equals(taskDefKey)) {
+					view = "workPaymentForm";
+				}
+			}
+			if (org.apache.commons.lang3.StringUtils.isNotBlank(workPayment.getName())){
+				if (workPayment.getName().equals("view")){
+					model.addAttribute("disabled","true");
+					workPayment.getAct().setProcInsId(workPayment.getProcessInstanceId());
+					view = "workPaymentAudit";
+				}
+			}
+		}
+		model.addAttribute("workPayment", workPayment);
+		return "modules/workpayment/"+view;
+	}
+
+	/**
+	 * 保存付款申请
+	 */
+	@RequiresPermissions(value={"workpayment:workPayment:add","workpayment:workPayment:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkPayment workPayment, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workPayment)){
+			return form(workPayment, model);
+		}
+		if (org.apache.commons.lang3.StringUtils.isNotBlank(workPayment.getId())) {
+			WorkPayment t = workPaymentService.get(workPayment.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workPayment, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			if (t.getStatus().equals("3") || t.getStatus().equals("4")){
+				addMessage(redirectAttributes, "已结束流程不能修改!");
+			}else {
+				workPaymentService.save(t);
+			}
+		} else {
+			try {
+				Map<String,Boolean> resultMap = workPaymentService.saveWorkPettyCash(workPayment);
+				boolean flag = resultMap.get("flag");
+				if(!flag){
+					addMessage(redirectAttributes,"不能选择自己为审批人!");
+				}else{
+					boolean b = resultMap.get("b");
+					if (b){
+						addMessage(redirectAttributes, "付款申请已经提交");
+					}else {
+						addMessage(redirectAttributes, "系统内部错误!");
+					}
+				}
+			}catch (Exception e){
+				logger.info("save e.getMessage()="+e.getMessage());
+				addMessage(redirectAttributes, "系统内部错误!");
+			}
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+	}
+	
+	/**
+	 * 删除付款申请
+	 */
+	@RequiresPermissions("workpayment:workPayment:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkPayment workPayment, RedirectAttributes redirectAttributes) {
+		workPaymentService.delete(workPayment);
+		addMessage(redirectAttributes, "删除付款申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+	}
+	
+	/**
+	 * 批量删除付款申请
+	 */
+	@RequiresPermissions("workpayment:workPayment:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workPaymentService.delete(workPaymentService.get(id));
+		}
+		addMessage(redirectAttributes, "删除付款申请成功");
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+	}
+	/**
+	 * 执行审批任务
+	 * @param
+	 * @param vars
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkPayment workPayment, Map<String, Object> vars, Model model) {
+		//workPaymentService.auditSave(workPayment);
+		Act act = workPayment.getAct();
+		actAuditService.saveAudit(act, act.getProcInsId(), "payment", workPayment.getAct().getComment(), workPayment.getId(), "2");
+		if (workPayment!=null && org.apache.commons.lang3.StringUtils.isNotBlank(workPayment.getHome()) && workPayment.getHome().equals("home")){
+			return "redirect:" + adminPath + "/home";
+		}
+		return "redirect:" + adminPath + "/workpayment/workPayment";
+	}
+
+	/**
+	 * 待办任务
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = {"workPaymentTodoList"})
+	public String workPaymentTodoList(Act act, HttpServletRequest request, HttpServletResponse response, Model model) {
+		act.setProcDefKey("payment");
+		List<Act> list = actTaskService.todoList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<WorkPayment> lists = new ArrayList<WorkPayment>();
+		for (Act a : list) {
+			WorkPayment workPayment = workPaymentService.getByProcessInstanceId(a.getProcInsId());
+			if (workPayment != null && workPayment.getCompanyId().equals(companyId)) {
+				if (a.getVars().getMap().get("applyUserId")!=null) {
+					User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+					if (user != null) {
+						a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+					}
+				}
+				workPayment.setAct(a);
+				if (com.jeeplus.common.utils.StringUtils.isNotBlank(workPayment.getId())){
+					workPayment.setName(officeService.get(companyId).getName());
+				}
+				lists.add(workPayment);
+			}
+		}
+		model.addAttribute("list", lists);
+		return "modules/workpayment/workPaymentTodoList";
+	}
+
+	/**
+	 * 已办任务
+	 * @param act
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = {"workPaymentHistoricList"})
+	public String workPaymentHistoricList (Act act, HttpServletRequest request, HttpServletResponse response, Model model){
+		act.setProcDefKey("payment");
+		Page<Act> page = actTaskService.historicList(new Page<Act>(request, response), act);
+		List<Act> list = page.getList();
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<WorkPayment> lists = new ArrayList<WorkPayment>();
+		for (Act a : list) {
+			WorkPayment workPayment = workPaymentService.getByProcessInstanceId(a.getHistTask().getProcessInstanceId());
+			if (workPayment != null && workPayment.getCompanyId().equals(companyId)) {
+				if (a.getVars().getMap().get("applyUserId")!=null){
+					a.getVars().getMap().put("applyUserId",UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+				}
+				workPayment.setAct(a);
+				if (com.jeeplus.common.utils.StringUtils.isNotBlank(workPayment.getId())){
+					workPayment.setName(officeService.get(companyId).getName());
+				}
+				lists.add(workPayment);
+			}
+		}
+		model.addAttribute("list", lists);
+
+		return "modules/workpayment/workPaymentHistoricList";
+	}
+
+	/**
+	 * 审核付款申请
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "applyOnWorkpayment")
+	public String applyOnWorkpayment(Act act, HttpServletResponse response, Model model) {
+		// 获取流程XML上的表单KEY
+		String formKey = actTaskService.getFormKey(act.getProcDefId(), act.getTaskDefKey());
+		//logger.info("------formKeys:"+formKeys);
+		// 获取流程实例对象
+		if (act.getProcInsId() != null){
+			if(actTaskService.getProcIns(act.getProcInsId())!=null){
+				act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+			}else{
+				act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+			}
+		}
+		return "redirect:" + ActUtils.getFormUrl(formKey, act);
+	}
+
+	/**
+	 * 撤销付款申请
+	 * @param
+	 * @return
+	 */
+	@RequestMapping(value = "revoke")
+	public String revoke(HttpServletRequest request, HttpServletResponse response) {
+
+		HashMap<String, String> requestMap = findRequestMap(request);
+		String processInstanceId = requestMap.get("processInstanceId");
+		String id = requestMap.get("id");
+		String deleteReason = requestMap.get("reason");
+
+		AjaxJson j = new AjaxJson();
+		try {
+			WorkPayment workPayment = workPaymentService.getById(id);
+			workPayment.setStatus("5");
+			workPayment.preUpdate();
+			workPaymentService.update(workPayment);
+			Map map = workPaymentService.getPaymentById(id,"1");
+			j.put("data",map);
+			actTaskService.endProcessInstance(processInstanceId, deleteReason);
+			j.setMsg("撤销申请成功");
+
+			//撤销后,更改所有发送过的通知的阅读状态
+			WorkProjectNotify notify = new WorkProjectNotify();
+			notify.setNotifyId(workPayment.getId());
+			workProjectNotifyService.readByNotifyId(notify);
+		}catch (Exception e){
+			j.setErrorCode("101");
+			logger.info(e.getMessage());
+			j.setMsg("撤销申请失败");
+			j.setSuccess(false);
+		}
+		return "redirect:" + adminPath + "/workpayment/workPayment";
+	}
+
+
+
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workpayment:workPayment:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkPayment workPayment, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "付款申请"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkPayment> page = workPaymentService.findPage(new Page<WorkPayment>(request, response, -1), workPayment);
+    		new ExportExcel("付款申请", WorkPayment.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出付款申请记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workpayment:workPayment:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkPayment> list = ei.getDataList(WorkPayment.class);
+			for (WorkPayment workPayment : list){
+				try{
+					workPaymentService.save(workPayment);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条付款申请记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条付款申请记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入付款申请失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+    }
+	
+	/**
+	 * 下载导入付款申请数据模板
+	 */
+	@RequiresPermissions("workpayment:workPayment:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "付款申请数据导入模板.xlsx";
+    		List<WorkPayment> list = Lists.newArrayList(); 
+    		new ExportExcel("付款申请数据", WorkPayment.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workpayment/workPayment/?repage";
+    }
+	
+	
+	
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workperformance/dao/WorkPerformanceDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperformance.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workperformance.entity.WorkPerformance;
+
+/**
+ * 公司业绩库DAO接口
+ * @author ssrh
+ * @version 2018-08-20
+ */
+@MyBatisDao
+public interface WorkPerformanceDao extends CrudDao<WorkPerformance> {
+
+	
+}

+ 207 - 0
src/main/java/com/jeeplus/modules/workperformance/entity/WorkPerformance.java

@@ -0,0 +1,207 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperformance.entity;
+
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+
+import java.util.List;
+
+/**
+ * 公司业绩库Entity
+ * @author ssrh
+ * @version 2018-08-20
+ */
+public class WorkPerformance extends DataEntity<WorkPerformance> {
+	//附件 113
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司
+	private String officeId;		// 部门
+	private String num;		// 合同编号
+	private String name;		// 项目名称
+	private String client;		// 委托单位
+	private String content;		// 服务内容
+	private String type;		// 工程分类
+	private String serviceDate;		// 服务起止时间
+	private String contractPrice;		// 合同金额(元)
+	private String investmentAmount;		// 投资额(万元)
+	private String scaleQuantity;		// 建筑面积/规模
+	private String linkman;		// 委托方联系人/电话
+	private String contractSource;		// 合同来源
+	private String officeName;		// 所属部门
+	private String projectLeaders;		// 项目负责人
+	private String record;		// 是否归档
+	private String source;		// 数据来源(引用/导入)
+
+	private List<WorkClientAttachment> workAttachments = Lists.newArrayList(); //附件
+	public WorkPerformance() {
+		super();
+	}
+
+	public WorkPerformance(String id){
+		super(id);
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="合同编号", align=2, sort=9)
+	public String getNum() {
+		return num;
+	}
+
+	public void setNum(String num) {
+		this.num = num;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=10)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="委托单位", align=2, sort=11)
+	public String getClient() {
+		return client;
+	}
+
+	public void setClient(String client) {
+		this.client = client;
+	}
+	
+	@ExcelField(title="服务内容", align=2, sort=12)
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+	@ExcelField(title="工程分类", align=2, sort=13)
+	public String getType() {
+		return type;
+	}
+
+	public void setType(String type) {
+		this.type = type;
+	}
+	
+	@ExcelField(title="服务起止时间", align=2, sort=14)
+	public String getServiceDate() {
+		return serviceDate;
+	}
+
+	public void setServiceDate(String serviceDate) {
+		this.serviceDate = serviceDate;
+	}
+	
+	@ExcelField(title="合同金额(元)", align=2, sort=15)
+	public String getContractPrice() {
+		return contractPrice;
+	}
+
+	public void setContractPrice(String contractPrice) {
+		this.contractPrice = contractPrice;
+	}
+	
+	@ExcelField(title="投资额(万元)", align=2, sort=16)
+	public String getInvestmentAmount() {
+		return investmentAmount;
+	}
+
+	public void setInvestmentAmount(String investmentAmount) {
+		this.investmentAmount = investmentAmount;
+	}
+	
+	@ExcelField(title="建筑面积/规模", align=2, sort=17)
+	public String getScaleQuantity() {
+		return scaleQuantity;
+	}
+
+	public void setScaleQuantity(String scaleQuantity) {
+		this.scaleQuantity = scaleQuantity;
+	}
+	
+	@ExcelField(title="委托方联系人/电话", align=2, sort=18)
+	public String getLinkman() {
+		return linkman;
+	}
+
+	public void setLinkman(String linkman) {
+		this.linkman = linkman;
+	}
+	
+	@ExcelField(title="合同来源", align=2, sort=19)
+	public String getContractSource() {
+		return contractSource;
+	}
+
+	public void setContractSource(String contractSource) {
+		this.contractSource = contractSource;
+	}
+	
+	@ExcelField(title="所属部门", align=2, sort=20)
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+	
+	@ExcelField(title="项目负责人", align=2, sort=21)
+	public String getProjectLeaders() {
+		return projectLeaders;
+	}
+
+	public void setProjectLeaders(String projectLeaders) {
+		this.projectLeaders = projectLeaders;
+	}
+	
+	@ExcelField(title="是否归档", align=2, sort=22)
+	public String getRecord() {
+		return record;
+	}
+
+	public void setRecord(String record) {
+		this.record = record;
+	}
+	
+	//@ExcelField(title="数据来源", align=2, sort=23)
+	public String getSource() {
+		return source;
+	}
+
+	public void setSource(String source) {
+		this.source = source;
+	}
+
+	public List<WorkClientAttachment> getWorkAttachments() {
+		return workAttachments;
+	}
+
+	public void setWorkAttachments(List<WorkClientAttachment> workAttachments) {
+		this.workAttachments = workAttachments;
+	}
+}

+ 97 - 0
src/main/java/com/jeeplus/modules/workperformance/service/WorkPerformanceService.java

@@ -0,0 +1,97 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperformance.service;
+
+import java.util.List;
+
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.WorkattachmentService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientAttachmentDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workperformance.entity.WorkPerformance;
+import com.jeeplus.modules.workperformance.dao.WorkPerformanceDao;
+
+/**
+ * 公司业绩库Service
+ * @author ssrh
+ * @version 2018-08-20
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkPerformanceService extends CrudService<WorkPerformanceDao, WorkPerformance> {
+	@Autowired
+	private WorkattachmentService workattachmentService;
+	@Autowired
+	private WorkClientAttachmentDao workClientAttachmentDao;
+	public WorkPerformance get(String id) {
+		WorkPerformance workPerformance = super.get(id);
+		//附件
+		WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+		workClientAttachment.setAttachmentId(id);
+		workClientAttachment.setAttachmentFlag("113");
+		workPerformance.setWorkAttachments(workClientAttachmentDao.findList(workClientAttachment));
+		return workPerformance;
+	}
+	
+	public List<WorkPerformance> findList(WorkPerformance workPerformance) {
+		return super.findList(workPerformance);
+	}
+	
+	public Page<WorkPerformance> findPage(Page<WorkPerformance> page, WorkPerformance workPerformance) {
+		//设置数据权限
+		if(!UserUtils.getUser().isAdmin()) {
+			String dataScopeSql = dataScopeFilterOR(workPerformance.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_PERFORMANCE.getValue());
+			workPerformance.getSqlMap().put("dsf", dataScopeSql);
+		}
+		workPerformance.setPage(page);
+		List<WorkPerformance> recordsList = findList(workPerformance);
+		page.setList(recordsList);
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkPerformance workPerformance) {
+		super.save(workPerformance);
+		//附件信息
+		for (WorkClientAttachment workClientAttachment : workPerformance.getWorkAttachments()) {
+			if (workClientAttachment.getId() == null) {
+				continue;
+			}
+			if (WorkClientAttachment.DEL_FLAG_NORMAL.equals(workClientAttachment.getDelFlag())) {
+				workClientAttachment.setAttachmentId(workPerformance.getId());
+				workClientAttachment.setAttachmentFlag("113");
+				workClientAttachment.setAttachmentUser(UserUtils.getUser().getId());
+				if (StringUtils.isBlank(workClientAttachment.getId()) || "null".equals(workClientAttachment.getId())) {
+					workClientAttachment.preInsert();
+					workClientAttachmentDao.insert(workClientAttachment);
+				} else {
+					workClientAttachment.preUpdate();
+					workClientAttachmentDao.update(workClientAttachment);
+				}
+			} else {
+				workClientAttachmentDao.delete(workClientAttachment);
+			}
+		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkPerformance workPerformance) {
+		super.delete(workPerformance);
+	}
+	
+	
+	
+	
+}

+ 297 - 0
src/main/java/com/jeeplus/modules/workperformance/web/WorkPerformanceController.java

@@ -0,0 +1,297 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperformance.web;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.base.Strings;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.modules.projectrecord.entity.ProjectRecords;
+import com.jeeplus.modules.projectrecord.service.ProjectRecordsService;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workperformance.entity.WorkPerformance;
+import com.jeeplus.modules.workperformance.service.WorkPerformanceService;
+
+/**
+ * 公司业绩库Controller
+ * @author ssrh
+ * @version 2018-08-20
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workperformance/workPerformance")
+public class WorkPerformanceController extends BaseController {
+
+	@Autowired
+	private WorkPerformanceService workPerformanceService;
+	@Autowired
+	private ProjectRecordsService projectRecordsService;
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private HttpServletRequest request;
+	@ModelAttribute
+	public WorkPerformance get(@RequestParam(required=false) String id) {
+		WorkPerformance entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workPerformanceService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkPerformance();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 公司业绩库列表页面
+	 */
+	@RequiresPermissions("workperformance:workPerformance:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkPerformance workPerformance, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkPerformance> page = workPerformanceService.findPage(new Page<WorkPerformance>(request, response), workPerformance); 
+		model.addAttribute("page", page);
+		return "modules/workperformance/workPerformanceList";
+	}
+
+	/**
+	 * 查看,增加,编辑公司业绩库表单页面
+	 */
+	@RequiresPermissions(value={"workperformance:workPerformance:view","workperformance:workPerformance:add","workperformance:workPerformance:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkPerformance workPerformance, Model model) {
+		model.addAttribute("workPerformance", workPerformance);
+		String view=request.getParameter("tabId");
+		if(StringUtils.isNotBlank(view) && view.equals("view")){
+			return "modules/workperformance/workPerformanceView";
+		}
+		return "modules/workperformance/workPerformanceForm";
+	}
+
+	/**
+	 * 保存公司业绩库
+	 */
+	@RequiresPermissions(value={"workperformance:workPerformance:add","workperformance:workPerformance:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkPerformance workPerformance, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workPerformance)){
+			return form(workPerformance, model);
+		}
+		if(!workPerformance.getIsNewRecord()){//编辑表单保存
+			WorkPerformance t = workPerformanceService.get(workPerformance.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workPerformance, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workPerformanceService.save(t);//保存
+		}else{//新增表单保存
+			workPerformanceService.save(workPerformance);//保存
+		}
+		addMessage(redirectAttributes, "保存公司业绩库成功");
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+	}
+	
+	/**
+	 * 删除公司业绩库
+	 */
+	@RequiresPermissions("workperformance:workPerformance:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkPerformance workPerformance, RedirectAttributes redirectAttributes) {
+		workPerformanceService.delete(workPerformance);
+		addMessage(redirectAttributes, "删除公司业绩库成功");
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+	}
+	
+	/**
+	 * 批量删除公司业绩库
+	 */
+	@RequiresPermissions("workperformance:workPerformance:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workPerformanceService.delete(workPerformanceService.get(id));
+		}
+		addMessage(redirectAttributes, "删除公司业绩库成功");
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workperformance:workPerformance:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkPerformance workPerformance, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "公司业绩库"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkPerformance> page = workPerformanceService.findPage(new Page<WorkPerformance>(request, response, -1), workPerformance);
+    		new ExportExcel("公司业绩库", WorkPerformance.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出公司业绩库记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workperformance:workPerformance:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkPerformance> list = ei.getDataList(WorkPerformance.class);
+			for (WorkPerformance workPerformance : list){
+				try{
+					workPerformance.setCompanyId(UserUtils.getSelectCompany().getId());
+					workPerformance.setOfficeId(UserUtils.getSelectOffice().getId());
+					workPerformance.setSource("导入");
+					workPerformanceService.save(workPerformance);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条公司业绩库记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条公司业绩库记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入公司业绩库失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+    }
+	
+	/**
+	 * 下载导入公司业绩库数据模板
+	 */
+	@RequiresPermissions("workperformance:workPerformance:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "公司业绩库数据导入模板.xlsx";
+    		List<WorkPerformance> list = Lists.newArrayList(); 
+    		new ExportExcel("公司业绩库数据", WorkPerformance.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperformance/workPerformance/?repage";
+    }
+
+	@RequestMapping(value = "projectIds")
+	@ResponseBody
+	public AjaxJson projectIds(String ids, RedirectAttributes redirectAttributes) {
+		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+		AjaxJson ajaxJson = new AjaxJson();
+		if(Global.isDemoMode()){
+			ajaxJson.setSuccess(false);
+			return ajaxJson;
+		}
+		try {
+			String[] arrid = ids.split(",");
+			StringBuilder msg = new StringBuilder();
+			//int newNum = 0;
+			for (String id:arrid){
+				if(StringUtils.isNotBlank(id)){
+					ProjectRecords p = projectRecordsService.getQueryProjectUsers(id);
+					if(p!=null){
+						WorkPerformance workPerformance = new WorkPerformance();
+						workPerformance.setCompanyId(p.getCompany().getId());
+						workPerformance.setOfficeId(p.getOffice().getId());
+						workPerformance.setNum(p.getWorkContractInfo().getContractNum());
+						workPerformance.setName(p.getProjectName());
+						workPerformance.setClient(p.getClientName());
+						workPerformance.setContent(p.getProjectDesc());//工程概况
+						workPerformance.setType(DictUtils.getMainDictLabel(p.getWorkContractInfo().getContractType(),"contract_type",""));
+						if(p.getWorkContractInfo().getEffectiveDate()!=null && p.getWorkContractInfo().getClosingDate()!=null){
+							workPerformance.setServiceDate(formatter.format(p.getWorkContractInfo().getEffectiveDate())+"-"+formatter.format(p.getWorkContractInfo().getClosingDate()));
+						}
+						workPerformance.setContractPrice(p.getContractPrice());
+						workPerformance.setInvestmentAmount(p.getWorkContractInfo().getInvestmentAmount());
+						if(StringUtils.isNotBlank(p.getScaleType()) && p.getScaleQuantity()!=null){
+							workPerformance.setScaleQuantity(p.getScaleType()+"/"+p.getScaleQuantity());
+						}else if(StringUtils.isNotBlank(p.getScaleType()) && p.getScaleQuantity()==null){
+							workPerformance.setScaleQuantity(p.getScaleType());
+						}else if(StringUtils.isBlank(p.getScaleType()) && p.getScaleQuantity()!=null){
+							workPerformance.setScaleQuantity(""+p.getScaleQuantity());
+						}
+						if(StringUtils.isNotBlank(p.getWorkContractInfo().getClient().getName()) && StringUtils.isNotBlank(p.getWorkContractInfo().getClient().getTelephone())){
+							workPerformance.setLinkman(p.getWorkContractInfo().getClient().getName()+"+"+p.getWorkContractInfo().getClient().getTelephone());
+						}else if(StringUtils.isNotBlank(p.getWorkContractInfo().getClient().getName()) && StringUtils.isBlank(p.getWorkContractInfo().getClient().getTelephone())){
+							workPerformance.setLinkman(p.getWorkContractInfo().getClient().getName());
+						}else if(StringUtils.isBlank(p.getWorkContractInfo().getClient().getName()) && StringUtils.isNotBlank(p.getWorkContractInfo().getClient().getTelephone())){
+							workPerformance.setLinkman(p.getWorkContractInfo().getClient().getTelephone());
+						}
+
+						if("0".equals(p.getWorkContractInfo().getExt())){
+							workPerformance.setContractSource("投标项目");
+						}else{
+							workPerformance.setContractSource("非投标项目");
+						}
+						workPerformance.setOfficeName(p.getWorkContractInfo().getChargeCompanyName());
+						workPerformance.setProjectLeaders(p.getLeaderNameStr());
+						if(StringUtils.isBlank(p.getWorkContractInfo().getRecordState())){
+							workPerformance.setRecord("待归档");
+						}else{
+							workPerformance.setRecord(DictUtils.getDictLabel(p.getWorkContractInfo().getRecordState(),"record_state",""));
+						}
+						workPerformance.setSource("引用");
+						List<WorkClientAttachment> workAttachments = p.getWorkContractInfo().getWorkAttachments();
+						List<WorkClientAttachment> workAttachment = new ArrayList<>();
+						for (WorkClientAttachment w:
+							 workAttachments) {
+							WorkClientAttachment workClientAttachment = new WorkClientAttachment();
+							workClientAttachment.setUrl(w.getUrl());
+							workClientAttachment.setType(w.getType());
+							workClientAttachment.setAttachmentName(w.getAttachmentName());
+							workAttachment.add(workClientAttachment);
+						}
+						workPerformance.setWorkAttachments(workAttachment);
+						workPerformance.setId("");
+						workPerformanceService.save(workPerformance);
+					}
+				}
+			}
+			addMessage(redirectAttributes, "引用成功");
+			ajaxJson.setMsg("引用成功");
+		}catch (Exception e){
+			ajaxJson.setMsg("引用失败");
+		}
+
+		return ajaxJson;
+	}
+	
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workperson/dao/WorkPersonDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperson.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workperson.entity.WorkPerson;
+
+/**
+ * 人员信息DAO接口
+ * @author ssrh
+ * @version 2018-08-21
+ */
+@MyBatisDao
+public interface WorkPersonDao extends CrudDao<WorkPerson> {
+
+	
+}

+ 65 - 0
src/main/java/com/jeeplus/modules/workperson/entity/WorkPerson.java

@@ -0,0 +1,65 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperson.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+
+/**
+ * 人员信息Entity
+ * @author ssrh
+ * @version 2018-08-21
+ */
+public class WorkPerson extends DataEntity<WorkPerson> {
+	
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司
+	private String officeId;		// 部门
+	private String basicId;		// 人员档案
+	private WorkStaffBasicInfo workStaffBasicInfo;
+	public WorkPerson() {
+		super();
+	}
+
+	public WorkPerson(String id){
+		super(id);
+	}
+
+	@ExcelField(title="公司", align=2, sort=7)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="部门", align=2, sort=8)
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+	
+	@ExcelField(title="人员档案", align=2, sort=9)
+	public String getBasicId() {
+		return basicId;
+	}
+
+	public void setBasicId(String basicId) {
+		this.basicId = basicId;
+	}
+
+	public WorkStaffBasicInfo getWorkStaffBasicInfo() {
+		return workStaffBasicInfo;
+	}
+
+	public void setWorkStaffBasicInfo(WorkStaffBasicInfo workStaffBasicInfo) {
+		this.workStaffBasicInfo = workStaffBasicInfo;
+	}
+}

+ 64 - 0
src/main/java/com/jeeplus/modules/workperson/service/WorkPersonService.java

@@ -0,0 +1,64 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperson.service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workperson.entity.WorkPerson;
+import com.jeeplus.modules.workperson.dao.WorkPersonDao;
+
+/**
+ * 人员信息Service
+ * @author ssrh
+ * @version 2018-08-21
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkPersonService extends CrudService<WorkPersonDao, WorkPerson> {
+
+	public WorkPerson get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkPerson> findList(WorkPerson workPerson) {
+		return super.findList(workPerson);
+	}
+	
+	public Page<WorkPerson> findPage(Page<WorkPerson> page, WorkPerson workPerson) {
+		if(!UserUtils.getUser().isAdmin()) {
+			String dataScopeSql = dataScopeFilterOR(workPerson.getCurrentUser(), "o", "u", "s", MenuStatusEnum.WORK_PERSON.getValue());
+			workPerson.getSqlMap().put("dsf", dataScopeSql);
+			if(workPerson.getCurrentUser().getBranchOffice()==null){
+				workPerson.getCurrentUser().setBranchOffice(workPerson.getCurrentUser().getCompany());
+			}
+			workPerson.setPage(page);
+			page.setList(this.findList(workPerson));
+			return page;
+		}else {
+			return super.findPage(page, workPerson);		}
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkPerson workPerson) {
+		super.save(workPerson);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkPerson workPerson) {
+		super.delete(workPerson);
+	}
+	
+	
+	
+	
+}

+ 230 - 0
src/main/java/com/jeeplus/modules/workperson/web/WorkPersonController.java

@@ -0,0 +1,230 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workperson.web;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workstaff.entity.WorkStaffBasicInfo;
+import com.jeeplus.modules.workstaff.service.WorkStaffBasicInfoService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workperson.entity.WorkPerson;
+import com.jeeplus.modules.workperson.service.WorkPersonService;
+
+/**
+ * 人员信息Controller
+ * @author ssrh
+ * @version 2018-08-21
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workperson/workPerson")
+public class WorkPersonController extends BaseController {
+
+	@Autowired
+	private WorkPersonService workPersonService;
+	@Autowired
+	private WorkStaffBasicInfoService workStaffBasicInfoService;
+
+	@ModelAttribute
+	public WorkPerson get(@RequestParam(required=false) String id) {
+		WorkPerson entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workPersonService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkPerson();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 人员信息列表页面
+	 */
+	@RequiresPermissions("workperson:workPerson:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkPerson workPerson, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkPerson> page = workPersonService.findPage(new Page<WorkPerson>(request, response), workPerson);
+		model.addAttribute("page", page);
+		return "modules/workperson/workPersonList";
+	}
+
+	/**
+	 * 查看,增加,编辑人员信息表单页面
+	 */
+	@RequiresPermissions(value={"workperson:workPerson:view","workperson:workPerson:add","workperson:workPerson:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkPerson workPerson, Model model) {
+		model.addAttribute("workPerson", workPerson);
+		return "modules/workperson/workPersonForm";
+	}
+
+	/**
+	 * 保存人员信息
+	 */
+	@RequiresPermissions(value={"workperson:workPerson:add","workperson:workPerson:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkPerson workPerson, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workPerson)){
+			return form(workPerson, model);
+		}
+		if(!workPerson.getIsNewRecord()){//编辑表单保存
+			WorkPerson t = workPersonService.get(workPerson.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workPerson, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workPersonService.save(t);//保存
+		}else{//新增表单保存
+			workPersonService.save(workPerson);//保存
+		}
+		addMessage(redirectAttributes, "保存人员信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+	}
+	
+	/**
+	 * 删除人员信息
+	 */
+	@RequiresPermissions("workperson:workPerson:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkPerson workPerson, RedirectAttributes redirectAttributes) {
+		workPersonService.delete(workPerson);
+		addMessage(redirectAttributes, "删除人员信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+	}
+	
+	/**
+	 * 批量删除人员信息
+	 */
+	@RequiresPermissions("workperson:workPerson:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workPersonService.delete(workPersonService.get(id));
+		}
+		addMessage(redirectAttributes, "删除人员信息成功");
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workperson:workPerson:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkPerson workPerson, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "人员信息"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkPerson> page = workPersonService.findPage(new Page<WorkPerson>(request, response, -1), workPerson);
+    		new ExportExcel("人员信息", WorkPerson.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出人员信息记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workperson:workPerson:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkPerson> list = ei.getDataList(WorkPerson.class);
+			for (WorkPerson workPerson : list){
+				try{
+					workPersonService.save(workPerson);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条人员信息记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条人员信息记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入人员信息失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+    }
+	
+	/**
+	 * 下载导入人员信息数据模板
+	 */
+	@RequiresPermissions("workperson:workPerson:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "人员信息数据导入模板.xlsx";
+    		List<WorkPerson> list = Lists.newArrayList(); 
+    		new ExportExcel("人员信息数据", WorkPerson.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workperson/workPerson/?repage";
+    }
+
+
+	@RequestMapping(value = "assignUserIds")
+	@ResponseBody
+	public AjaxJson assignUserIds(String userIds, RedirectAttributes redirectAttributes) {
+		AjaxJson ajaxJson = new AjaxJson();
+		if(Global.isDemoMode()){
+			ajaxJson.setSuccess(false);
+			return ajaxJson;
+		}
+		try {
+			String[] userIdArr = userIds.split(",");
+			StringBuilder msg = new StringBuilder();
+			//int newNum = 0;
+			for (String id:userIdArr){
+				if(StringUtils.isNotBlank(id)){
+					WorkStaffBasicInfo workStaffBasicInfo = workStaffBasicInfoService.getAchives(id);
+					WorkPerson workPerson = new WorkPerson();
+					workPerson.setBasicId(id);
+					workPerson.setCompanyId(workStaffBasicInfo.getCompany().getId());
+					workPerson.setOfficeId(workStaffBasicInfo.getOffice().getId());
+					workPersonService.save(workPerson);
+				}
+			}
+			addMessage(redirectAttributes, ""+msg);
+			ajaxJson.setMsg("引用成功");
+		}catch (Exception e){
+			ajaxJson.setMsg("引用失败");
+		}
+
+		return ajaxJson;
+	}
+
+}

+ 21 - 0
src/main/java/com/jeeplus/modules/workpettycash/dao/WorkPettyCashDao.java

@@ -0,0 +1,21 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpettycash.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workpettycash.entity.WorkPettyCash;
+
+/**
+ * 备用金申请DAO接口
+ * @author fgy
+ * @version 2018-01-15
+ */
+@MyBatisDao
+public interface WorkPettyCashDao extends CrudDao<WorkPettyCash> {
+
+    WorkPettyCash getByProcessInstanceId(String processInstanceId);
+
+    int updateProcessInstanceId(WorkPettyCash workPettyCash);
+}

+ 381 - 0
src/main/java/com/jeeplus/modules/workpettycash/entity/WorkPettyCash.java

@@ -0,0 +1,381 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpettycash.entity;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.ActEntity;
+import com.jeeplus.common.utils.Number2CN;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.repository.ProcessDefinition;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 备用金申请Entity
+ * @author fgy
+ * @version 2018-01-15
+ */
+public class WorkPettyCash extends ActEntity<WorkPettyCash> {
+	
+	private static final long serialVersionUID = 1L;
+	private Office company;		// 公司
+	private String companyId;
+	private String companyName;
+	private Office office;		// 创建部门
+	private String officeId;
+	private String officeName;
+	private User user;//创建人
+	private String userName;//创建人
+	private String applicantName;  //申请人
+	private Office applicantOffice;  //申请部门
+	private String applicantOfficeId;
+	private String applicantOfficeName;
+	private String reason;		// 事由
+	private String amount;		// 金额
+	private String amountCN;    //金额大写
+	private Date useDate;		// 使用日期
+	private String useDateStr;
+	private Date returnDate;		// 归还日期
+	private String returnDateStr;
+	private User casher;		// 出纳
+	private String casherName;  //出纳
+	private String status;		// 审核状态
+	private String processInstanceId;		// 流程id
+	private String ids;		//审批人
+	private String CCid;   //抄送人
+	private String name;
+	private List<String> adds = Lists.newArrayList();
+	private String comment; //审核意见 目前只保存手机端审核
+	private String home;
+
+
+	// 流程任务
+	private Task task;
+	private Map<String, Object> variables;
+	// 运行中的流程实例
+	private ProcessInstance processInstance;
+	// 历史的流程实例
+	private HistoricProcessInstance historicProcessInstance;
+	// 流程定义
+	private ProcessDefinition processDefinition;
+
+
+	public WorkPettyCash() {
+		super();
+	}
+
+	public WorkPettyCash(String id){
+		super(id);
+	}
+
+	@ExcelField(title="申请公司", align=2, sort=7)
+	public Office getCompany() {
+		return company;
+	}
+
+	public void setCompany(Office company) {
+		this.company = company;
+	}
+	
+	@ExcelField(title="申请部门", fieldType=Office.class, value="", align=2, sort=8)
+	public Office getOffice() {
+		return office;
+	}
+
+	public void setOffice(Office office) {
+		this.office = office;
+	}
+
+	@ExcelField(title="事由", align=2, sort=10)
+	public String getReason() {
+		return reason;
+	}
+
+	public void setReason(String reason) {
+		this.reason = reason;
+	}
+	
+	@ExcelField(title="金额", align=2, sort=11)
+	public String getAmount() {
+		return amount;
+	}
+
+	public void setAmount(String amount) {
+		this.amount = amount;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="使用日期不能为空")
+	@ExcelField(title="使用日期", align=2, sort=12)
+	public Date getUseDate() {
+		return useDate;
+	}
+
+	public void setUseDate(Date useDate) {
+		this.useDate = useDate;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="归还日期不能为空")
+	@ExcelField(title="归还日期", align=2, sort=13)
+	public Date getReturnDate() {
+		return returnDate;
+	}
+
+	public void setReturnDate(Date returnDate) {
+		this.returnDate = returnDate;
+	}
+	
+	@ExcelField(title="出纳", fieldType=User.class, value="", align=2, sort=14)
+	public User getCasher() {
+		return casher;
+	}
+
+	public void setCasher(User casher) {
+		this.casher = casher;
+	}
+	
+	@ExcelField(title="申请状态", dictType="act_status", align=2, sort=15)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+	
+	@ExcelField(title="流程id", align=2, sort=16)
+	public String getProcessInstanceId() {
+		return processInstanceId;
+	}
+
+	public void setProcessInstanceId(String processInstanceId) {
+		this.processInstanceId = processInstanceId;
+	}
+
+	public String getCasherName() {
+		return casherName;
+	}
+
+	public void setCasherName(String casherName) {
+		this.casherName = casherName;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+
+	public String getOfficeName() {
+		return officeName;
+	}
+
+	public void setOfficeName(String officeName) {
+		this.officeName = officeName;
+	}
+
+	public String getIds() {
+		List<String> idList = Lists.newArrayList();
+		if (StringUtils.isNotBlank(ids)) {
+			String ss = ids.trim().replace(" ", ",").replace(" ", ",").replace(",", ",").replace("'", "");
+			for (String s : ss.split(",")) {
+				// if(s.matches("\\d*")) {
+				idList.add("'" + s + "'");
+				// }
+			}
+		}
+		return StringUtils.join(idList, ",");
+	}
+
+	public void setIds(String ids) {
+		this.ids = ids;
+	}
+
+	public String getCCid() {
+		return CCid;
+	}
+
+	public void setCCid(String CCid) {
+		this.CCid = CCid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public List<String> getAdds() {
+		return adds;
+	}
+
+	public void setAdds(List<String> adds) {
+		this.adds = adds;
+	}
+
+	public String getCompanyName() {
+		return companyName;
+	}
+
+	public void setCompanyName(String companyName) {
+		this.companyName = companyName;
+	}
+
+	public Task getTask() {
+		return task;
+	}
+
+	public void setTask(Task task) {
+		this.task = task;
+	}
+
+	public Map<String, Object> getVariables() {
+		return variables;
+	}
+
+	public void setVariables(Map<String, Object> variables) {
+		this.variables = variables;
+	}
+
+	public ProcessInstance getProcessInstance() {
+		return processInstance;
+	}
+
+	public void setProcessInstance(ProcessInstance processInstance) {
+		this.processInstance = processInstance;
+	}
+
+	public HistoricProcessInstance getHistoricProcessInstance() {
+		return historicProcessInstance;
+	}
+
+	public void setHistoricProcessInstance(HistoricProcessInstance historicProcessInstance) {
+		this.historicProcessInstance = historicProcessInstance;
+	}
+
+	public ProcessDefinition getProcessDefinition() {
+		return processDefinition;
+	}
+
+	public void setProcessDefinition(ProcessDefinition processDefinition) {
+		this.processDefinition = processDefinition;
+	}
+
+	public String getComment() {
+		return comment;
+	}
+
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+
+	public String getUseDateStr() {
+		return useDateStr;
+	}
+
+	public void setUseDateStr(String useDateStr) {
+		this.useDateStr = useDateStr;
+	}
+
+	public String getReturnDateStr() {
+		return returnDateStr;
+	}
+
+	public void setReturnDateStr(String returnDateStr) {
+		this.returnDateStr = returnDateStr;
+	}
+
+	public String getUserName() {
+		return userName;
+	}
+
+	public void setUserName(String userName) {
+		this.userName = userName;
+	}
+
+	public String getAmountCN() {
+		String amountCN = "";
+		if(org.apache.commons.lang3.StringUtils.isNotBlank(amount)){
+			BigDecimal bd = new BigDecimal(amount);
+			amountCN = Number2CN.number2CNMontrayUnit(bd);
+		}
+		return amountCN;
+	}
+
+	public void setAmountCN(String amountCN) {
+		this.amountCN = amountCN;
+	}
+
+	public String getApplicantName() {
+		return applicantName;
+	}
+
+	public void setApplicantName(String applicantName) {
+		this.applicantName = applicantName;
+	}
+
+	public Office getApplicantOffice() {
+		return applicantOffice;
+	}
+
+	public void setApplicantOffice(Office applicantOffice) {
+		this.applicantOffice = applicantOffice;
+	}
+
+	public String getApplicantOfficeName() {
+		return applicantOfficeName;
+	}
+
+	public void setApplicantOfficeName(String applicantOfficeName) {
+		this.applicantOfficeName = applicantOfficeName;
+	}
+
+	public String getApplicantOfficeId() {
+		return applicantOfficeId;
+	}
+
+	public void setApplicantOfficeId(String applicantOfficeId) {
+		this.applicantOfficeId = applicantOfficeId;
+	}
+
+	public User getUser() {
+		return user;
+	}
+
+	public void setUser(User user) {
+		this.user = user;
+	}
+
+	public String getHome() {
+		return home;
+	}
+
+	public void setHome(String home) {
+		this.home = home;
+	}
+}

+ 661 - 0
src/main/java/com/jeeplus/modules/workpettycash/service/WorkPettyCashService.java

@@ -0,0 +1,661 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpettycash.service;
+
+import com.google.common.collect.Maps;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.JPushClientUtil;
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.pushinfo.entity.Pushinfo;
+import com.jeeplus.modules.pushinfo.service.PushinfoService;
+import com.jeeplus.modules.sys.dao.UserDao;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workapprovalcopy.entity.ApprovalCopy;
+import com.jeeplus.modules.workapprovalcopy.service.ApprovalCopyService;
+import com.jeeplus.modules.workpettycash.dao.WorkPettyCashDao;
+import com.jeeplus.modules.workpettycash.entity.WorkPettyCash;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.*;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 备用金申请Service
+ * @author fgy
+ * @version 2018-01-15
+ */
+@SuppressWarnings("all")
+@Service
+@Transactional(readOnly = true)
+public class WorkPettyCashService extends CrudService<WorkPettyCashDao, WorkPettyCash> {
+	@Autowired
+	private WorkPettyCashDao workPettyCashDao;
+	@Autowired
+	private RuntimeService runtimeService;
+	@Autowired
+	protected TaskService taskService;
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private IdentityService identityService;
+	@Autowired
+	private UserDao userDao;
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private ApprovalCopyService approvalCopyService;
+
+	@Autowired
+	private OfficeService officeService;
+	@Autowired
+	private PushinfoService pushinfoService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+
+
+	public WorkPettyCash get(String id) {
+		WorkPettyCash workPettyCash = workPettyCashDao.get(id);
+		Map<String,Object> variables=null;
+		HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(workPettyCash.getProcessInstanceId()).singleResult();
+		if(historicProcessInstance!=null) {
+			variables = Collections3.extractToMap(historyService.createHistoricVariableInstanceQuery().processInstanceId(historicProcessInstance.getId()).list(), "variableName", "value");
+		} else {
+			variables = runtimeService.getVariables(runtimeService.createProcessInstanceQuery().processInstanceId(workPettyCash.getProcessInstanceId()).active().singleResult().getId());
+		}
+		workPettyCash.setVariables(variables);
+		return workPettyCash;
+	}
+	
+	public List<WorkPettyCash> findList(WorkPettyCash workPettyCash) {
+		return super.findList(workPettyCash);
+	}
+	
+	public Page<WorkPettyCash> findPage(Page<WorkPettyCash> page, WorkPettyCash workPettyCash) {
+		workPettyCash.getSqlMap().put("dsf", dataScopeFilter(workPettyCash.getCurrentUser(), "o", "u","", MenuStatusEnum.WORK_PAYMENT.getValue()));
+		workPettyCash.setPage(page);
+		page.setList(workPettyCashDao.findList(workPettyCash));
+		if(page.getList()!=null && page.getList().size()>0){
+			for(WorkPettyCash item : page.getList()) {
+				String processInstanceId = item.getProcessInstanceId();
+				HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+				if(historicProcessInstance!=null) {
+					item.setHistoricProcessInstance(historicProcessInstance);
+					item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
+				} else {
+					ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+					if (processInstance != null){
+						item.setProcessInstance(processInstance);
+						item.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
+					}
+				}
+				ProcessInstance processInstance = actTaskService.getProcIns(item.getProcessInstanceId());
+				if (processInstance!=null) {
+					Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+					if (StringUtils.isNotBlank(taskInfok.getAssignee()) && taskInfok.getAssignee().equals(UserUtils.getUser().getId())) {
+						item.setTask(taskInfok);
+					}
+				}
+			}
+		}
+		return page;
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkPettyCash workPettyCash) {
+		super.save(workPettyCash);
+	}
+	
+
+
+	@Transactional(readOnly = false)
+	public void delete(WorkPettyCash workPettyCash) {
+		super.delete(workPettyCash);
+	}
+
+
+    public WorkPettyCash getByProcessInstanceId(String processInstanceId) {
+		WorkPettyCash workPettyCash = workPettyCashDao.getByProcessInstanceId(processInstanceId);
+		return workPettyCash;
+    }
+
+	public WorkPettyCash getById(String id) {
+		WorkPettyCash workPettyCash = workPettyCashDao.get(id);
+		return workPettyCash;
+	}
+
+	@Transactional(readOnly = false)
+	public void update(WorkPettyCash workPettyCash) {
+		workPettyCashDao.update(workPettyCash);
+	}
+
+	@Transactional(readOnly = false)
+	public Map getPettyCashById(String id, String type) {
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		WorkPettyCash workPettyCash = this.getById(id);
+		Map<String,Object> map = Maps.newHashMap();
+		if(workPettyCash!=null){
+			User user = userDao.get(workPettyCash.getCreateBy());
+			String officeName = "";
+			if(user!=null){
+				map.put("userName", user.getName());
+				map.put("users", user.getId());
+				map.put("photo",user.getPhoto());
+				Office office = user.getOffice();
+				if(office!=null && office.getName()!=null){
+					officeName = office.getName();
+				}
+			}
+			map.put("officeName",officeName);
+			map.put("createDate",workPettyCash.getCreateDate()==null?"":sdf.format(workPettyCash.getCreateDate()));
+			map.put("useDateStr",workPettyCash.getUseDate()==null?"":sdf.format(workPettyCash.getUseDate()));
+			map.put("returnDateStr",workPettyCash.getReturnDate()==null?"":sdf.format(workPettyCash.getReturnDate()));
+			map.put("status",workPettyCash.getStatus());
+			map.put("applicantName", workPettyCash.getApplicantName());
+			map.put("applicantOfficeName",workPettyCash.getApplicantOfficeName());
+			map.put("casherName",workPettyCash.getCasherName());
+			map.put("amount",workPettyCash.getAmount());
+			map.put("amountCN",workPettyCash.getAmountCN());
+			map.put("reason",workPettyCash.getReason());
+			map.put("remarks",workPettyCash.getRemarks());
+			map.put("approvalId",id);
+			List<Act> list = actTaskService.histoicFlowList(workPettyCash.getProcessInstanceId(), "", "");
+			List<Act> list2 = actTaskService.toMyStartedList(workPettyCash.getProcessInstanceId());
+			if (list2!=null && list2.size()!=0) {
+				Act act1 = list2.get(list2.size()-1);
+				map.put("taskId", act1.getTaskId());
+				map.put("taskName", act1.getTaskName());
+				map.put("procInsId", act1.getProcInsId());
+				map.put("procDefId", act1.getProcDefId());
+				map.put("actStatus", act1.getStatus()==null?"todo":act1.getStatus());
+				map.put("taskDefKey", act1.getTaskDefKey());
+				map.put("procDefKey", "pettyCash");
+			}
+			List list1 = new ArrayList();
+			String approvalStatus = "0";
+			String assigneeName = "";
+			if (list!=null && list.size()!=0) {
+				if (list.get(0).getHistIns().getActivityName().contains("审批")) {
+					for (int i = list.size() - 1; i > -1; i--) {
+						Act act = list.get(i);
+						Map<String, Object> maps = new HashMap<String, Object>();
+						String state = "0";
+						String activityName = "";
+						if (act.getHistIns().getActivityName().contains("审批")) {
+							if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+								activityName = "已审批";
+								if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
+									approvalStatus = "1";
+								}
+							} else {
+								activityName = "待审批";
+								state = "2";
+							}
+						} else {
+							activityName = act.getHistIns().getActivityName();
+						}
+						maps.put("activityName", activityName);
+						maps.put("assigneeName", UserUtils.getUser().getName().equals(act.getAssigneeName()) ? "我" : act.getAssigneeName());
+						maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+						maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+						maps.put("durationTime", act.getDurationTime());
+						maps.put("state", state);
+						maps.put("userId", act.getCurrentUser().getId());
+						list1.add(maps);
+					}
+				} else {
+					if (workPettyCash.getStatus().equals("4") || workPettyCash.getStatus().equals("3")){
+						for (int i = 0; i < list.size()-1; i++) {
+							Act act = list.get(i);
+							Map<String, Object> maps = new HashMap<String, Object>();
+							String state = "0";
+							String activityName = "";
+							if (act.getHistIns().getActivityName().contains("发起申请")) {
+								activityName = act.getHistIns().getActivityName();
+								assigneeName = act.getAssigneeName();
+							}else if (act.getHistIns().getActivityName().contains("审批")) {
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+									activityName = "已审批";
+									if (UserUtils.getUser().getName().equals(assigneeName)){
+										approvalStatus = "1";
+									}
+									if (i == (list.size()-2) && workPettyCash.getStatus().equals("4")){
+										activityName = "审核驳回";
+										state = "1";
+									}else if (i == (list.size()-2) && workPettyCash.getStatus().equals("3")){
+										activityName = "审核成功";
+									}
+								} else {
+									activityName = "待审批";
+									state = "2";
+								}
+							}
+							else {
+								activityName = act.getHistIns().getActivityName();
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+							}
+							maps.put("activityName", activityName);
+							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
+							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+							maps.put("durationTime", act.getDurationTime());
+							maps.put("state", state);
+							maps.put("userId", act.getCurrentUser().getId());
+							list1.add(maps);
+						}
+					}else {
+						for (int i = 0; i < list.size(); i++) {
+							Act act = list.get(i);
+							Map<String, Object> maps = new HashMap<String, Object>();
+							String state = "0";
+							String activityName = "";
+							if (act.getHistIns().getActivityName().contains("发起申请")) {
+								activityName = act.getHistIns().getActivityName();
+								assigneeName = act.getAssigneeName();
+							}else if (act.getHistIns().getActivityName().contains("审批")) {
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+								if (act.getDurationTime() != null && !act.getDurationTime().equals("")) {
+									activityName = "已审批";
+									if (UserUtils.getUser().getName().equals(act.getAssigneeName())){
+										approvalStatus = "1";
+									}
+								} else {
+									activityName = "待审批";
+									state = "2";
+								}
+							}
+							else {
+								activityName = act.getHistIns().getActivityName();
+								if (UserUtils.get(act.getHistIns().getAssignee())!=null) {
+									assigneeName = UserUtils.get(act.getHistIns().getAssignee()).getName();
+								}
+							}
+							if (workPettyCash.getStatus().equals("5") && i == list.size() - 1) {
+								activityName = "已撤销";
+								state = "1";
+							}
+							maps.put("activityName", activityName);
+							maps.put("assigneeName", UserUtils.getUser().getName().equals(assigneeName) ? "我" : assigneeName);
+							maps.put("startTime", act.getHistIns().getStartTime() == null ? "" : sdf.format(act.getHistIns().getStartTime()));
+							maps.put("endTime", act.getHistIns().getEndTime() == null ? "" : sdf.format(act.getHistIns().getEndTime()));
+							maps.put("durationTime", act.getDurationTime());
+							maps.put("state", state);
+							maps.put("userId", act.getCurrentUser().getId());
+							list1.add(maps);
+						}
+					}
+				}
+			}
+			map.put("approvalStatus", approvalStatus);
+			ApprovalCopy approvalCopy = new ApprovalCopy();
+			approvalCopy.setApprovalId(id);
+			List<ApprovalCopy> approvalCopyList = approvalCopyService.findList(approvalCopy);
+			String CCName = "";
+			String CCId = "";
+			Boolean readFlag = false;
+			if (approvalCopyList!=null && approvalCopyList.size()!=0) {
+				ApprovalCopy approvalCopy1 = approvalCopyList.get(0);
+				CCId = approvalCopy1.getCCId();
+				String[] CCid = approvalCopy1.getCCId().split(",");
+				readFlag = approvalCopy1.getReadFlag().equals("0");
+				if (type.equals("3") && readFlag){
+					approvalCopy1.setReadFlag("1");
+					approvalCopyService.save(approvalCopy1);
+				}
+				for (String userId : CCid) {
+					User CCUser = UserUtils.get(userId);
+					if (CCUser != null) {
+						CCName = CCUser.getName() + ",";
+					}
+				}
+				if (CCName.length() > 1) {
+					CCName = CCName.substring(0, CCName.length() - 1);
+				} else {
+					CCName = "";
+				}
+			}
+			map.put("nameCopy",CCName);
+			map.put("CCId",CCId);
+			map.put("process",list1);
+
+		}
+		return  map;
+	}
+
+	@Transactional(readOnly = false)
+	public Map<String,Boolean> saveWorkPettyCash(WorkPettyCash workPettyCash) {
+		Map<String,Boolean> resultMap = Maps.newHashMap();
+		try {
+			String approverId = "";
+			List<String> adds = workPettyCash.getAdds();
+			for(int i = 0;i<adds.size();i++){
+				if(i + 1 == adds.size()){
+					approverId += adds.get(i);
+				}else{
+					approverId += adds.get(i) + ",";
+				}
+			}
+			workPettyCash.setIds(approverId);
+			Map<String, Object> variables = Maps.newHashMap();
+			String type = "1";
+			String alias = "1";
+			List<String> assigneeList=new ArrayList<String>(); //分配任务的人员
+			if(!UserUtils.getUser().isAdmin() && approverId!=null && !approverId.equals("")) {
+				if (approverId.contains(UserUtils.getUser().getId())){
+					logger.error("备用金申请失败,审批人不能为本人");
+					resultMap.put("flag",false);
+					return resultMap;
+				}
+				String[] approverIds = approverId.split(",");
+				for (int i =0 ;i<approverIds.length;i++){
+					assigneeList.add(approverIds[i]);
+				}
+				type = approverIds.length+"";
+				alias = approverIds[0];
+			}
+			variables.put("assigneeList", assigneeList);
+			variables.put("count",assigneeList.size());
+			Office office = workPettyCash.getOffice();//备用金申请部门
+			Office company = UserUtils.getSelectCompany();
+//			User CC = new User();
+//			CC.setId(workPettyCash.getCCid());
+			User user = UserUtils.getUser();//创建人
+
+			workPettyCash.setCompany(company);
+			workPettyCash.setOffice(office);
+			workPettyCash.setCreateBy(user);
+			workPettyCash.setUpdateBy(user);
+			workPettyCash.setDelFlag("0");
+			workPettyCash.setStatus("1");
+			workPettyCash.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+			workPettyCash.setOfficeId(UserUtils.getSelectOffice()==null?"":UserUtils.getSelectOffice().getId());
+			save(workPettyCash,variables,type);
+			ApprovalCopy approvalCopy = new ApprovalCopy();
+			approvalCopy.setCCId(workPettyCash.getCCid());
+			approvalCopy.setUserId(user.getId());
+			approvalCopy.setType("pettyCash");
+			approvalCopy.setRemarks(workPettyCash.getReason());
+			approvalCopy.setApprovalId(workPettyCash.getId());
+			approvalCopy.setApproverId(approverId);
+			approvalCopy.setReadFlag("0");
+			approvalCopyService.save(approvalCopy);
+
+			//给抄送人、审批人发送通知
+			if(approvalCopy!=null && org.apache.commons.lang3.StringUtils.isNotBlank(approvalCopy.getId())){
+				String chaosongIds = approvalCopy.getCCId();//给所有抄送人发送通知
+				String shenpiIds = alias;//给审批流程的第一个人发送通知
+				this.sendNotify(chaosongIds,shenpiIds,approvalCopy.getApprovalId());
+				String content = "审批信息 申请人:" + user.getName() + ",备用金申请: 待审批!";
+				UserUtils.pushIm(alias,content);
+			}
+
+			String title="审批";
+			String content =  UserUtils.getUser().getName()+"的备用金申请需要你审批";
+			String status = "待审批";
+			Office office1 = workPettyCash.getOffice();
+			String officeName = "";
+			if (office1!=null){
+				Office o = officeService.get(office1.getId());
+				officeName = o.getName();
+			}
+			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+			Date useDate = workPettyCash.getUseDate();
+			Date returnDate = workPettyCash.getReturnDate();
+			String useDateStr = useDate==null?"":sdf.format(useDate);
+			String returnDateStr = returnDate==null?"":sdf.format(returnDate);
+			String remakers = "备用金申请部门:"+workPettyCash.getApplicantOfficeName()+ "\n"
+					+"申请人:"+workPettyCash.getApplicantName()+"\n"
+					+"使用日期:"+ useDateStr
+					+"归还日期:"+ returnDateStr;
+			Map extras = new HashMap();
+			extras.put("type", "4001");
+			extras.put("id", workPettyCash.getId());
+			extras.put("procDefKey", "pettyCash");
+
+			boolean b = JPushClientUtil.sendNotificationToAlias(title, content, extras, alias);
+			Pushinfo pushinfo = new Pushinfo();
+			pushinfo.setCurrentUser(UserUtils.getUser());
+			pushinfo.setRemarks(remakers);
+			pushinfo.setUserId(UserUtils.getUser().getId());
+			pushinfo.setType("4001");
+			pushinfo.setPushId(workPettyCash.getId());
+			pushinfo.setTitle(title);
+			pushinfo.setContent(content);
+			pushinfo.setPushUserId(alias);
+			pushinfo.setParentType("singleApproval");
+			pushinfo.setStatus(status);
+			pushinfo.setCompanyId(UserUtils.getSelectCompany()==null?"":UserUtils.getSelectCompany().getId());
+			pushinfo.setAddcontent("pettyCash");
+			pushinfo.setMobile("ios,android");
+			pushinfoService.save(pushinfo);
+			if (b){
+				resultMap.put("flag",true);
+				resultMap.put("b",b);
+				return resultMap;
+			}
+		} catch (Exception e) {
+			logger.error("启动备用金流程失败:", e);
+		}
+		resultMap.put("flag",false);
+		return resultMap;
+	}
+	@Transactional(readOnly = false)
+	public void sendNotify(String chaosongIds, String shenpiIds, String pettyCashId) {
+		if(StringUtils.isNotBlank(pettyCashId)){
+			if(StringUtils.isNotBlank(chaosongIds)){
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setTitle(UserUtils.getUser().getName()+"发起了备用金申请");
+				notify.setRemarks("待通知");
+				notify.setContent(UserUtils.getUser().getName()+"的备用金申请");
+				notify.setNotifyRole("");
+				notify.setNotifyId(pettyCashId);
+				notify.setStatus("0");
+				notify.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify.setType("33");
+				String[] arr = chaosongIds.split(",");
+				for (String id : arr){
+					if(StringUtils.isNotBlank(id)){
+						notify.setId("");
+						notify.setUser(new User(id));
+						workProjectNotifyService.save(notify);
+					}
+				}
+			}
+			if(StringUtils.isNotBlank(shenpiIds)){
+				WorkProjectNotify notify = new WorkProjectNotify();
+				notify.setTitle("您有新的备用金申请待审批");
+				notify.setRemarks("待审批");
+				notify.setContent("备用金申请--待审批");
+				notify.setNotifyRole("");
+				notify.setUser(new User(shenpiIds));
+				notify.setNotifyId(pettyCashId);
+				notify.setStatus("0");
+				notify.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify.setType("33");
+				workProjectNotifyService.save(notify);
+			}
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void save(WorkPettyCash workPettyCash, Map<String, Object> variables, String type) {
+		// 保存业务数据
+		if (StringUtils.isBlank(workPettyCash.getId())) {
+			// 保存业务数据
+			workPettyCash.preInsert();
+			workPettyCashDao.insert(workPettyCash);
+			logger.debug("save entity: {}", workPettyCash);
+
+			// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
+			identityService.setAuthenticatedUserId(workPettyCash.getCurrentUser().getId());
+
+			// 启动流程
+			String businessKey = workPettyCash.getId().toString();
+			variables.put("type", "pettyCash");
+			variables.put("busId", businessKey);
+			variables.put("title", workPettyCash.getReason());//设置标题;
+			ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(ActUtils.PD_OA_PETTYCASH[0], businessKey, variables);
+
+			// 更新流程实例ID
+			workPettyCash.setProcessInstanceId(processInstance.getId());
+			workPettyCash.setProcessInstance(processInstance);
+			workPettyCashDao.updateProcessInstanceId(workPettyCash);
+
+			logger.debug("start process of {key={}, bkey={}, pid={}, variables={}}", new Object[] {
+					ActUtils.PD_OA_PETTYCASH[0], businessKey, processInstance.getId(), variables });
+		}else{
+			workPettyCash.preUpdate();
+			workPettyCashDao.update(workPettyCash);
+			workPettyCash.getAct().setComment(("yes".equals(workPettyCash.getAct().getFlag())?"[重申] ":"[销毁] ")+workPettyCash.getAct().getComment());
+
+			// 完成流程任务
+			Map<String, Object> vars = Maps.newHashMap();
+			vars.put("reApply", "yes".equals(workPettyCash.getAct().getFlag())? true : false);
+			actTaskService.complete(workPettyCash.getAct().getTaskId(), workPettyCash.getAct().getProcInsId(), workPettyCash.getAct().getComment(), workPettyCash.getComment(), vars);
+		}
+	}
+
+	@Transactional(readOnly = false)
+	public void auditSave(WorkPettyCash workPettyCash) {
+
+		// 设置意见
+		workPettyCash.getAct().setComment(("yes".equals(workPettyCash.getAct().getFlag())?"[同意] ":"[驳回] ")+workPettyCash.getAct().getComment());
+		workPettyCash.preUpdate();
+		this.update(workPettyCash);
+		// 对不同环节的业务逻辑进行操作
+		String taskDefKey = workPettyCash.getAct().getTaskDefKey();
+
+		//发送通知
+		WorkProjectNotify notify = new WorkProjectNotify();
+		notify.setNotifyId(workPettyCash.getId());
+		notify.setCompanyId(UserUtils.getSelectCompany().getId());
+		notify.setType("33");
+		notify.setStatus("0");
+		notify.setNotifyRole("");
+
+		//业务逻辑对应的条件表达式
+		String exp = "";
+		// 审核环节
+		if ("audit1".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit2".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit3".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit4".equals(taskDefKey)){
+			exp = "pass";
+		}else if ("audit5".equals(taskDefKey)){
+			exp = "pass";
+		}else if("apply_end".equals(taskDefKey)){
+			exp = "pass";
+		}
+		// 未知环节,直接返回
+		else{
+			return;
+		}
+
+		// 提交流程任务
+		Map<String, Object> vars = Maps.newHashMap();
+		vars.put(exp, "yes".equals(workPettyCash.getAct().getFlag())? false : true);
+		// 提交流程任务
+		actTaskService.complete(workPettyCash.getAct().getTaskId(), workPettyCash.getAct().getProcInsId(), workPettyCash.getAct().getComment(), vars);
+		boolean state = actTaskService.isProcessEnd(workPettyCash.getAct().getProcInsId());
+		workPettyCash.setStatus("2");
+		if (!state){
+			if ("yes".equals(workPettyCash.getAct().getFlag())){
+				workPettyCash.setStatus("3");
+			}else {
+				workPettyCash.setStatus("4");
+			}
+		}
+		workPettyCash.preUpdate();
+		this.update(workPettyCash);
+
+		//需在workSealForm更新后 操作:
+		//1待审核  2审核中 3通过 4驳回 5已撤销 6催办中
+		if("2".equals(workPettyCash.getStatus())){
+			workPettyCash = this.get(workPettyCash.getId());
+			String userId = workPettyCash.getVariables().get("assignee").toString();
+			if(StringUtils.isNotBlank(userId)){
+				notify.setUser(UserUtils.get(userId));
+			}
+			notify.setTitle("您有新的备用金申请待审批");
+			notify.setRemarks("待审批");
+			notify.setContent("备用金申请--待审批");
+
+		}else if("3".equals(workPettyCash.getStatus())){
+			notify.setUser(workPettyCash.getCreateBy());
+			notify.setTitle("您的备用金申请已通过");
+			notify.setRemarks("待通知");
+			notify.setContent(workPettyCash.getAct().getComment());
+		}else if("4".equals(workPettyCash.getStatus())){
+			notify.setUser(workPettyCash.getCreateBy());
+			notify.setTitle("您的备用金申请被驳回");
+			notify.setRemarks("待通知");
+			notify.setContent(workPettyCash.getAct().getComment());
+		}
+		workProjectNotifyService.save(notify);
+
+		//更新审核人的阅读状态
+		WorkProjectNotify notify2 = new WorkProjectNotify();
+		notify2.setUser(UserUtils.getUser());
+		notify2.setNotifyId(workPettyCash.getId());
+		workProjectNotifyService.readByNotifyIdAndNotifyUser(notify2);
+
+		//抄送
+		if("3".equals(workPettyCash.getStatus()) || "4".equals(workPettyCash.getStatus())){
+			ApprovalCopy approvalCopy = approvalCopyService.getByApprovalId(workPettyCash.getId());
+			if(approvalCopy!=null && StringUtils.isNotBlank(approvalCopy.getCCId())){
+				WorkProjectNotify notify1= new WorkProjectNotify();
+				notify1.setNotifyId(workPettyCash.getId());
+				notify1.setCompanyId(UserUtils.getSelectCompany().getId());
+				notify1.setType("33");
+				notify1.setStatus("0");
+				notify1.setNotifyRole("");
+				notify1.setContent(workPettyCash.getAct().getComment());
+				String[] ccIds = approvalCopy.getCCId().split(",");
+				for(String ccId : ccIds){
+					if(StringUtils.isNotBlank(ccId)){
+						notify1.setUser(new User(ccId));
+						if("3".equals(workPettyCash.getStatus())){
+							notify1.setTitle(UserUtils.get(workPettyCash.getCreateBy().getId()).getName()+"的备用金申请已通过");
+						}
+						if("4".equals(workPettyCash.getStatus())){
+							notify1.setTitle(UserUtils.get(workPettyCash.getCreateBy().getId()).getName()+"的备用金申请被驳回");
+						}
+						notify1.setRemarks("待通知");
+						notify1.setId("");
+						workProjectNotifyService.save(notify1);
+					}
+				}
+			}
+		}
+	}
+}

+ 439 - 0
src/main/java/com/jeeplus/modules/workpettycash/web/WorkPettyCashController.java

@@ -0,0 +1,439 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workpettycash.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActAuditService;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workpettycash.entity.WorkPettyCash;
+import com.jeeplus.modules.workpettycash.service.WorkPettyCashService;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 备用金申请Controller
+ *
+ * @author fgy
+ * @version 2018-01-15
+ */
+@SuppressWarnings("all")
+@Controller
+@RequestMapping(value = "${adminPath}/workpettycash/workPettyCash")
+public class WorkPettyCashController extends BaseController {
+
+    @Autowired
+    private WorkPettyCashService workPettyCashService;
+    @Autowired
+    protected RuntimeService runtimeService;
+
+    @Autowired
+    protected TaskService taskService;
+
+    @Autowired
+    private ActTaskService actTaskService;
+
+    @Autowired
+    private OfficeService officeService;
+    @Autowired
+    private WorkProjectNotifyService workProjectNotifyService;
+    @Autowired
+    private ActAuditService actAuditService;
+
+    @ModelAttribute
+    public WorkPettyCash get(@RequestParam(required = false) String id) {
+        WorkPettyCash entity = null;
+        if (StringUtils.isNotBlank(id)) {
+            entity = workPettyCashService.get(id);
+        }
+        if (entity == null) {
+            entity = new WorkPettyCash();
+        }
+        return entity;
+    }
+
+    /**
+     * 备用金申请列表页面
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:list")
+    @RequestMapping(value = {"list", ""})
+    public String list(WorkPettyCash workPettyCash, HttpServletRequest request, HttpServletResponse response, Model model) {
+        User user = UserUtils.getUser();
+        if (!user.isAdmin()) {
+            workPettyCash.setCompanyId(user.getComId());
+            if (!UserUtils.isManager()) {
+                workPettyCash.setCreateBy(user);//创建人
+                //workPettyCash.setOfficeId(UserUtils.getSelectOffice().getId());
+            }
+        }
+
+        Page<WorkPettyCash> page = workPettyCashService.findPage(new Page<WorkPettyCash>(request, response), workPettyCash);
+        model.addAttribute("page", page);
+        return "modules/workpettycash/workPettyCashList";
+    }
+
+    /**
+     * 查看,增加,编辑备用金申请表单页面
+     */
+    @RequiresPermissions(value = {"workpettycash:workPettyCash:view", "workpettycash:workPettyCash:add", "workpettycash:workPettyCash:edit"}, logical = Logical.OR)
+    @RequestMapping(value = "form")
+    public String form(WorkPettyCash workPettyCash, Model model) {
+        String view = "workPettyCashForm";
+        // 查看审批申请单
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(workPettyCash.getId())) {//.getAct().getProcInsId())){
+            // 环节编号
+            String taskDefKey = workPettyCash.getAct().getTaskDefKey();
+            if (taskDefKey != null) {
+                // 查看工单
+                if (workPettyCash.getAct().isFinishTask()) {
+                    view = "workPettyCashView";
+                }
+                // 修改环节
+                else if ("apply_end".equals(taskDefKey)) {
+                    view = "workPettyCashAudit";
+                }
+                // 审核环节
+                else if ("audit1".equals(taskDefKey)) {
+                    if (org.apache.commons.lang3.StringUtils.isBlank(workPettyCash.getAct().getStatus())) {
+                        model.addAttribute("disabled", "true");
+                    } else {
+                        model.addAttribute("disabled", "false");
+                    }
+                    view = "workPettyCashAudit";
+                }
+                //
+                else if ("modifyApply".equals(taskDefKey)) {
+                    view = "workPettyCashForm";
+                }
+            }
+            if (org.apache.commons.lang3.StringUtils.isNotBlank(workPettyCash.getName())) {
+                if (workPettyCash.getName().equals("view")) {
+                    model.addAttribute("disabled", "true");
+                    workPettyCash.getAct().setProcInsId(workPettyCash.getProcessInstanceId());
+                    view = "workPettyCashAudit";
+                }
+            }
+        }
+        model.addAttribute("workPettyCash", workPettyCash);
+        return "modules/workpettycash/" + view;
+    }
+
+    /**
+     * 保存备用金申请
+     */
+    @RequiresPermissions(value = {"workpettycash:workPettyCash:add", "workpettycash:workPettyCash:edit"}, logical = Logical.OR)
+    @RequestMapping(value = "save")
+    public String save(WorkPettyCash workPettyCash, Model model, RedirectAttributes redirectAttributes) throws Exception {
+        if (!beanValidator(model, workPettyCash)) {
+            return form(workPettyCash, model);
+        }
+        if (org.apache.commons.lang3.StringUtils.isNotBlank(workPettyCash.getId())) {
+            WorkPettyCash t = workPettyCashService.get(workPettyCash.getId());//从数据库取出记录的值
+            MyBeanUtils.copyBeanNotNull2Bean(workPettyCash, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+            if (t.getStatus().equals("3") || t.getStatus().equals("4")) {
+                addMessage(redirectAttributes, "已结束流程不能修改!");
+            } else {
+                workPettyCashService.save(t);
+            }
+        } else {
+            try {
+                Map<String, Boolean> resultMap = workPettyCashService.saveWorkPettyCash(workPettyCash);
+                boolean flag = resultMap.get("flag");
+                if (!flag) {
+                    addMessage(redirectAttributes, "不能选择自己为审批人!");
+                } else {
+                    boolean b = resultMap.get("b");
+                    if (b) {
+                        addMessage(redirectAttributes, "备用金申请已经提交");
+                    } else {
+                        addMessage(redirectAttributes, "系统内部错误!");
+                    }
+                }
+            } catch (Exception e) {
+                logger.info("save e.getMessage()=" + e.getMessage());
+                addMessage(redirectAttributes, "系统内部错误!");
+            }
+        }
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+    /**
+     * 删除备用金申请
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:del")
+    @RequestMapping(value = "delete")
+    public String delete(WorkPettyCash workPettyCash, RedirectAttributes redirectAttributes) {
+        workPettyCashService.delete(workPettyCash);
+        addMessage(redirectAttributes, "删除备用金申请成功");
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+    /**
+     * 批量删除备用金申请
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:del")
+    @RequestMapping(value = "deleteAll")
+    public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+        String idArray[] = ids.split(",");
+        for (String id : idArray) {
+            workPettyCashService.delete(workPettyCashService.get(id));
+        }
+        addMessage(redirectAttributes, "删除备用金申请成功");
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+    /**
+     * 执行审批任务
+     *
+     * @param
+     * @param vars
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "saveAudit")
+    public String saveAudit(WorkPettyCash workPettyCash, Map<String, Object> vars, Model model) {
+        //workPettyCashService.auditSave(workPettyCash);
+        Act act = workPettyCash.getAct();
+        actAuditService.saveAudit(act, act.getProcInsId(), "pettyCash", workPettyCash.getAct().getComment(), workPettyCash.getId(), "2");
+        if (workPettyCash!=null && org.apache.commons.lang3.StringUtils.isNotBlank(workPettyCash.getHome()) && workPettyCash.getHome().equals("home")){
+            return "redirect:" + adminPath + "/home";
+        }
+        return "redirect:" + adminPath + "/workpettycash/workPettyCash";
+    }
+
+    /**
+     * 待办任务
+     *
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = {"workPettyCashTodoList"})
+    public String workPettyCashTodoList(Act act, HttpServletRequest request, HttpServletResponse response, Model model) {
+        act.setProcDefKey("pettyCash");
+        List<Act> list = actTaskService.todoList(act);
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office == null ? "" : office.getId();
+        List<WorkPettyCash> lists = new ArrayList<WorkPettyCash>();
+        for (Act a : list) {
+            WorkPettyCash workPettyCash = workPettyCashService.getByProcessInstanceId(a.getProcInsId());
+            if (workPettyCash != null && workPettyCash.getCompanyId().equals(companyId)) {
+                if (a.getVars().getMap().get("applyUserId") != null) {
+                    User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+                    if (user != null) {
+                        a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+                    }
+                }
+                workPettyCash.setAct(a);
+                if (com.jeeplus.common.utils.StringUtils.isNotBlank(workPettyCash.getId())) {
+                    workPettyCash.setName(officeService.get(companyId).getName());
+                }
+                lists.add(workPettyCash);
+            }
+        }
+        model.addAttribute("list", lists);
+        return "modules/workpettycash/workPettyCashTodoList";
+    }
+
+    /**
+     * 已办任务
+     *
+     * @param act
+     * @param request
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = {"workPettyCashHistoricList"})
+    public String workPettyCashHistoricList(Act act, HttpServletRequest request, HttpServletResponse response, Model model) {
+        act.setProcDefKey("pettyCash");
+        Page<Act> page = actTaskService.historicList(new Page<Act>(request, response), act);
+        List<Act> list = page.getList();
+        Office office = UserUtils.getSelectCompany();
+        String companyId = office == null ? "" : office.getId();
+        List<WorkPettyCash> lists = new ArrayList<WorkPettyCash>();
+        for (Act a : list) {
+            WorkPettyCash workPettyCash = workPettyCashService.getByProcessInstanceId(a.getHistTask().getProcessInstanceId());
+            if (workPettyCash != null && workPettyCash.getCompanyId().equals(companyId)) {
+                if (a.getVars().getMap().get("applyUserId") != null) {
+                    a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+                }
+                workPettyCash.setAct(a);
+                if (com.jeeplus.common.utils.StringUtils.isNotBlank(workPettyCash.getId())) {
+                    workPettyCash.setName(officeService.get(companyId).getName());
+                }
+                lists.add(workPettyCash);
+            }
+        }
+        model.addAttribute("list", lists);
+
+        return "modules/workpettycash/workPettyCashHistoricList";
+    }
+
+    /**
+     * 审核备用金申请
+     *
+     * @param response
+     * @param model
+     * @return
+     */
+    @RequestMapping(value = "applyOnWorkpettycash")
+    public String applyOnWorkpettycash(Act act, HttpServletResponse response, Model model) {
+        // 获取流程XML上的表单KEY
+        String formKey = actTaskService.getFormKey(act.getProcDefId(), act.getTaskDefKey());
+        //logger.info("------formKeys:"+formKeys);
+        // 获取流程实例对象
+        if (act.getProcInsId() != null) {
+            if (actTaskService.getProcIns(act.getProcInsId()) != null) {
+                act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+            } else {
+                act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+            }
+        }
+        return "redirect:" + ActUtils.getFormUrl(formKey, act);
+    }
+
+    /**
+     * 撤销备用金申请
+     *
+     * @param
+     * @return
+     */
+    @RequestMapping(value = "revoke")
+    public String revoke(HttpServletRequest request, HttpServletResponse response) {
+
+        HashMap<String, String> requestMap = findRequestMap(request);
+        String processInstanceId = requestMap.get("processInstanceId");
+        String id = requestMap.get("id");
+        String deleteReason = requestMap.get("reason");
+
+        AjaxJson j = new AjaxJson();
+        try {
+            WorkPettyCash workPettyCash = workPettyCashService.getById(id);
+            workPettyCash.setStatus("5");
+            workPettyCash.preUpdate();
+            workPettyCashService.update(workPettyCash);
+            Map map = workPettyCashService.getPettyCashById(id, "1");
+            j.put("data", map);
+            actTaskService.endProcessInstance(processInstanceId, deleteReason);
+            j.setMsg("撤销申请成功");
+
+            //撤销后,更改所有发送过的通知的阅读状态
+            WorkProjectNotify notify = new WorkProjectNotify();
+            notify.setNotifyId(workPettyCash.getId());
+            workProjectNotifyService.readByNotifyId(notify);
+        } catch (Exception e) {
+            j.setErrorCode("101");
+            logger.info(e.getMessage());
+            j.setMsg("撤销申请失败");
+            j.setSuccess(false);
+        }
+        return "redirect:" + adminPath + "/workpettycash/workPettyCash";
+    }
+
+
+    /**
+     * 导出excel文件
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:export")
+    @RequestMapping(value = "export", method = RequestMethod.POST)
+    public String exportFile(WorkPettyCash workPettyCash, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "备用金申请" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
+            Page<WorkPettyCash> page = workPettyCashService.findPage(new Page<WorkPettyCash>(request, response, -1), workPettyCash);
+            new ExportExcel("备用金申请", WorkPettyCash.class).setDataList(page.getList()).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导出备用金申请记录失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+    /**
+     * 导入Excel数据
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:import")
+    @RequestMapping(value = "import", method = RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+        try {
+            int successNum = 0;
+            int failureNum = 0;
+            StringBuilder failureMsg = new StringBuilder();
+            ImportExcel ei = new ImportExcel(file, 1, 0);
+            List<WorkPettyCash> list = ei.getDataList(WorkPettyCash.class);
+            for (WorkPettyCash workPettyCash : list) {
+                try {
+                    workPettyCashService.save(workPettyCash);
+                    successNum++;
+                } catch (ConstraintViolationException ex) {
+                    failureNum++;
+                } catch (Exception ex) {
+                    failureNum++;
+                }
+            }
+            if (failureNum > 0) {
+                failureMsg.insert(0, ",失败 " + failureNum + " 条备用金申请记录。");
+            }
+            addMessage(redirectAttributes, "已成功导入 " + successNum + " 条备用金申请记录" + failureMsg);
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入备用金申请失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+    /**
+     * 下载导入备用金申请数据模板
+     */
+    @RequiresPermissions("workpettycash:workPettyCash:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            String fileName = "备用金申请数据导入模板.xlsx";
+            List<WorkPettyCash> list = Lists.newArrayList();
+            new ExportExcel("备用金申请数据", WorkPettyCash.class, 1).setDataList(list).write(response, fileName).dispose();
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
+        }
+        return "redirect:" + Global.getAdminPath() + "/workpettycash/workPettyCash/?repage";
+    }
+
+
+}

+ 81 - 0
src/main/java/com/jeeplus/modules/workprequalification/dao/WorkPrequalificationDao.java

@@ -0,0 +1,81 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprequalification.dao;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import java.util.List;
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprequalification.entity.WorkPrequalification;
+
+/**
+ * 投标资格预审DAO接口
+ * @author  mengxy
+ * @version 2017-05-24
+ */
+@MyBatisDao
+public interface WorkPrequalificationDao extends CrudDao<WorkPrequalification> {
+
+	public List<WorkClientInfo> findListBybiddingCompany(WorkClientInfo biddingCompany);
+	
+	
+	
+	/**
+	 * 取得工程成员用户数据
+	 * @param user
+	 * @return
+	 */
+	public List<String> getProjectMember(WorkPrequalification workPrequalification);
+	
+	
+	
+	/**
+	 * 取得工程成员用户数据
+	 * @param user
+	 * @return
+	 */
+	public List<String> getProjectMaster(WorkPrequalification workPrequalification);
+	
+	
+	/**
+	 * 插入工程成员用户数据
+	 * @param user
+	 * @return
+	 */
+	public int insertProjectMember(WorkPrequalification workPrequalification);
+	
+	/**
+	 * 插入工程负责人用户数据
+	 * @param user
+	 * @return
+	 */
+	public int insertProjectMaster(WorkPrequalification workPrequalification);
+	
+	/**
+	 * 删除工程用户关联数据
+	 * @param user
+	 * @return
+	 */
+	public int deleteProjectUser(WorkPrequalification workPrequalification);
+
+	/**
+	 *  删除成员用户和资格预审工程关联表数据
+	 * @param user
+	 * @return
+	 */
+	public int deleteProjectMember(WorkPrequalification workPrequalification);
+
+
+	/**
+	 * 删除负责人用户和资格预审工程关联表数据 
+	 * @param user
+	 * @return
+	 */
+	public int deleteProjectMaster(WorkPrequalification workPrequalification);
+
+
+
+
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workprequalification/dao/WorkProjectLinkmanDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprequalification.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprequalification.entity.WorkProjectLinkman;
+
+/**
+ * 客户管理DAO接口
+ * @author 丁旭
+ * @version 2017-03-20
+ */
+@MyBatisDao
+public interface WorkProjectLinkmanDao extends CrudDao<WorkProjectLinkman> {
+
+	
+}

+ 270 - 0
src/main/java/com/jeeplus/modules/workprequalification/entity/WorkPrequalification.java

@@ -0,0 +1,270 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprequalification.entity;
+
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.sys.entity.User;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.Collections3;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 投标资格预审Entity
+ * @author  mengxy
+ * @version 2017-05-24
+ */
+public class WorkPrequalification extends DataEntity<WorkPrequalification> {
+	
+	private static final long serialVersionUID = 1L;
+	private String number;		// 项目编号
+	private String projectName;		// 项目名称
+	private String projectType;		// 项目类型
+	private String projectSource;		// 项目来源
+	private String isExternalContacts;		//  是否外部联系人  
+	private WorkClientInfo biddingCompany;		// 招标单位
+	private User contacts;		// 联系人
+	private String extCompany;		// 外部招标单位
+	private String extContacts;		// 外部联系人
+	private Date prequalificationDate;		// 预审日期
+	private Date registrationDate;		// 报名日期
+	private String isSubcontract;		// 是否外协
+	private String projectMember;		// 项目成员
+	private Date purchaseDate;		// 购买日期
+	private String documentCost;		// 文件费用
+	private String bindCost;		// 装订费用
+	private String projectSituation;		// 项目概况
+	private String status;		// 项目状态
+	
+	private List<WorkProjectLinkman> workProjectLinkmanList = Lists.newArrayList();		// 子表列表
+	
+	private List<User> masterList = Lists.newArrayList();	//负责人列表
+	
+	private List<User> memberList = Lists.newArrayList();	//用户列表
+	
+	private List<User> officeList = Lists.newArrayList();	//用户列表
+	
+	public WorkPrequalification() {
+		super();
+	}
+
+	public WorkPrequalification(String id){
+		super(id);
+	}
+
+	@ExcelField(title="项目编号", align=2, sort=1)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=2)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="项目类型", dictType="projectType", align=2, sort=3)
+	public String getProjectType() {
+		return projectType;
+	}
+
+	public void setProjectType(String projectType) {
+		this.projectType = projectType;
+	}
+	
+	@ExcelField(title="项目来源", dictType="projectSource", align=2, sort=4)
+	public String getProjectSource() {
+		return projectSource;
+	}
+
+	public void setProjectSource(String projectSource) {
+		this.projectSource = projectSource;
+	}
+	
+	@ExcelField(title=" 是否外部联系人  ", dictType="", align=2, sort=5)
+	public String getIsExternalContacts() {
+		return isExternalContacts;
+	}
+
+	public void setIsExternalContacts(String isExternalContacts) {
+		this.isExternalContacts = isExternalContacts;
+	}
+	
+	@ExcelField(title="招标单位", align=2, sort=6)
+	public WorkClientInfo getBiddingCompany() {
+		return biddingCompany;
+	}
+
+	public void setBiddingCompany(WorkClientInfo biddingCompany) {
+		this.biddingCompany = biddingCompany;
+	}
+	
+	@ExcelField(title="联系人", fieldType=User.class, value="contacts.name", align=2, sort=7)
+	public User getContacts() {
+		return contacts;
+	}
+
+	public void setContacts(User contacts) {
+		this.contacts = contacts;
+	}
+	
+	@ExcelField(title="外部招标单位", align=2, sort=8)
+	public String getExtCompany() {
+		return extCompany;
+	}
+
+	public void setExtCompany(String extCompany) {
+		this.extCompany = extCompany;
+	}
+	
+	@ExcelField(title="外部联系人", align=2, sort=9)
+	public String getExtContacts() {
+		return extContacts;
+	}
+
+	public void setExtContacts(String extContacts) {
+		this.extContacts = extContacts;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="预审日期", align=2, sort=10)
+	public Date getPrequalificationDate() {
+		return prequalificationDate;
+	}
+
+	public void setPrequalificationDate(Date prequalificationDate) {
+		this.prequalificationDate = prequalificationDate;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="报名日期", align=2, sort=11)
+	public Date getRegistrationDate() {
+		return registrationDate;
+	}
+
+	public void setRegistrationDate(Date registrationDate) {
+		this.registrationDate = registrationDate;
+	}
+	
+	@ExcelField(title="是否外协", dictType="", align=2, sort=12)
+	public String getIsSubcontract() {
+		return isSubcontract;
+	}
+
+	public void setIsSubcontract(String isSubcontract) {
+		this.isSubcontract = isSubcontract;
+	}
+	
+	@ExcelField(title="项目成员", align=2, sort=13)
+	public String getProjectMemberIds() {
+		return Collections3.extractToString(memberList, "id", ",") ;
+	}
+
+	public void setProjectMemberIds(String projectMember) {
+		this.memberList = Lists.newArrayList();
+		for (String id : StringUtils.split(projectMember, ",")){
+			this.memberList.add(new User(id));
+		}
+	}
+	
+	/**
+	 * 获取通知发送记录用户Name
+	 * @return
+	 */
+	public String getProjectMemberNames() {
+		return Collections3.extractToString(memberList, "name", ",") ;
+	}
+	
+	/**
+	 * 设置通知发送记录用户Name
+	 * @return
+	 */
+	public void setProjectMemberNames(String projectMember) {
+		// 什么也不做
+	}
+	
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@ExcelField(title="购买日期", align=2, sort=14)
+	public Date getPurchaseDate() {
+		return purchaseDate;
+	}
+
+	public void setPurchaseDate(Date purchaseDate) {
+		this.purchaseDate = purchaseDate;
+	}
+	
+	@ExcelField(title="文件费用", align=2, sort=15)
+	public String getDocumentCost() {
+		return documentCost;
+	}
+
+	public void setDocumentCost(String documentCost) {
+		this.documentCost = documentCost;
+	}
+	
+	@ExcelField(title="装订费用", align=2, sort=16)
+	public String getBindCost() {
+		return bindCost;
+	}
+
+	public void setBindCost(String bindCost) {
+		this.bindCost = bindCost;
+	}
+	
+	@ExcelField(title="项目概况", align=2, sort=17)
+	public String getProjectSituation() {
+		return projectSituation;
+	}
+
+	public void setProjectSituation(String projectSituation) {
+		this.projectSituation = projectSituation;
+	}
+	
+	@ExcelField(title="项目状态", align=2, sort=18)
+	public String getStatus() {
+		return status;
+	}
+
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	public List<WorkProjectLinkman> getWorkProjectLinkmanList() {
+		return workProjectLinkmanList;
+	}
+
+	public void setWorkProjectLinkmanList(List<WorkProjectLinkman> workProjectLinkmanList) {
+		this.workProjectLinkmanList = workProjectLinkmanList;
+	}
+
+	public List<User> getMasterList() {
+		return masterList;
+	}
+
+	public void setMasterList(List<User> masterList) {
+		this.masterList = masterList;
+	}
+
+	public List<User> getMemberList() {
+		return memberList;
+	}
+
+	public void setMemberList(List<User> memberList) {
+		this.memberList = memberList;
+	}
+	
+}

+ 116 - 0
src/main/java/com/jeeplus/modules/workprequalification/entity/WorkProjectLinkman.java

@@ -0,0 +1,116 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprequalification.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 工程客户管理Entity
+ * @author 丁旭
+ * @version 2017-05-25
+ */
+public class WorkProjectLinkman extends DataEntity<WorkProjectLinkman> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 联系人姓名
+	private String position;		// 职务
+	private String qq;		// QQ
+	private String linkPhone;		// 联系人电话
+	private String linkMobile;		// 联系人手机
+	private String email;		// E-mail
+	private String isDefault;		// 是否默认联系人
+	private String clientId;		// 外键关联客户表 父类
+	private String projectId;		// 外键关联工程表(资格预审)
+	
+	public WorkProjectLinkman() {
+		super();
+	}
+
+	public WorkProjectLinkman(String id){
+		super(id);
+	}
+
+	
+	@ExcelField(title="联系人姓名", align=2, sort=1)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+	@ExcelField(title="职务", align=2, sort=2)
+	public String getPosition() {
+		return position;
+	}
+
+	public void setPosition(String position) {
+		this.position = position;
+	}
+	
+	@ExcelField(title="QQ", align=2, sort=3)
+	public String getQq() {
+		return qq;
+	}
+
+	public void setQq(String qq) {
+		this.qq = qq;
+	}
+	
+	@ExcelField(title="联系人电话", align=2, sort=4)
+	public String getLinkPhone() {
+		return linkPhone;
+	}
+
+	public void setLinkPhone(String linkPhone) {
+		this.linkPhone = linkPhone;
+	}
+	
+	@ExcelField(title="联系人手机", align=2, sort=5)
+	public String getLinkMobile() {
+		return linkMobile;
+	}
+
+	public void setLinkMobile(String linkMobile) {
+		this.linkMobile = linkMobile;
+	}
+	
+	@ExcelField(title="E-mail", align=2, sort=6)
+	public String getEmail() {
+		return email;
+	}
+
+	public void setEmail(String email) {
+		this.email = email;
+	}
+	
+	@ExcelField(title="是否默认联系人", align=2, sort=7)
+	public String getIsDefault() {
+		return isDefault;
+	}
+
+	public void setIsDefault(String isDefault) {
+		this.isDefault = isDefault;
+	}
+	
+	public String getClientId() {
+		return clientId;
+	}
+
+	public void setClientId(String clientId) {
+		this.clientId = clientId;
+	}
+
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+	
+}

+ 137 - 0
src/main/java/com/jeeplus/modules/workprequalification/service/WorkPrequalificationService.java

@@ -0,0 +1,137 @@
+///**
+// * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+// */
+//package com.jeeplus.modules.workprequalification.service;
+//
+//import java.util.ArrayList;
+//import java.util.List;
+//
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Service;
+//import org.springframework.transaction.annotation.Transactional;
+//
+//import com.jeeplus.modules.sys.entity.User;
+//import com.jeeplus.modules.sys.utils.UserUtils;
+//import com.jeeplus.modules.workclientinfo.dao.WorkClientLinkmanDao;
+//import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+//import com.jeeplus.common.persistence.Page;
+//import com.jeeplus.common.service.CrudService;
+//import com.jeeplus.common.utils.StringUtils;
+//import com.jeeplus.modules.workprequalification.entity.WorkPrequalification;
+//import com.jeeplus.modules.workprequalification.entity.WorkProjectLinkman;
+//import com.jeeplus.modules.workprequalification.dao.WorkPrequalificationDao;
+//import com.jeeplus.modules.workprequalification.dao.WorkProjectLinkmanDao;
+//
+///**
+// * 投标资格预审Service
+// * @author  mengxy
+// * @version 2017-05-24
+// */
+//@Service
+//@Transactional(readOnly = true)
+//public class WorkPrequalificationService extends CrudService<WorkPrequalificationDao, WorkPrequalification> {
+//
+//	@Autowired
+//	private WorkClientLinkmanDao workClientLinkmanDao;
+//
+//	@Autowired
+//	private WorkProjectLinkmanDao workProjectLinkmanDao;
+//
+//	public WorkPrequalification get(String id) {
+//		WorkPrequalification workPrequalification = super.get(id);
+//		WorkProjectLinkman linkman =new WorkProjectLinkman();
+//		linkman.setProjectId(id);
+//		workPrequalification.setWorkProjectLinkmanList(workProjectLinkmanDao.findList(linkman));
+//		List<String> userId = dao.getProjectMember(workPrequalification);
+//		List<User> userList = new ArrayList<User>();
+//		for (int i = 0; i < userId.size(); i++) {
+//			userList.add(UserUtils.get(userId.get(i)));
+//		}
+//		workPrequalification.setMemberList(userList);
+//		return workPrequalification;
+//	}
+//
+//	public List<WorkProjectLinkman> findLinkmanList(String projectId) {
+//		WorkProjectLinkman linkman = new WorkProjectLinkman();
+//		linkman.setProjectId(projectId);
+//		return workProjectLinkmanDao.findList(linkman);
+//	}
+//
+//	public List<WorkPrequalification> findList(WorkPrequalification workPrequalification) {
+//		List<WorkPrequalification> preList =super.findList(workPrequalification);
+//		List<WorkProjectLinkman> linkmanList =new ArrayList<WorkProjectLinkman>();
+//		for (WorkPrequalification pre : preList) {
+//			linkmanList = findLinkmanList(pre.getId());
+//			List<String> userId = dao.getProjectMember(pre);
+//			List<User> userList = new ArrayList<User>();
+//			for (int i = 0; i < userId.size(); i++) {
+//				userList.add(UserUtils.get(userId.get(i)));
+//			}
+//			pre.setMasterList(userList);
+//			pre.setWorkProjectLinkmanList(linkmanList);
+//		}
+//
+//		return preList;
+//	}
+//
+//	public Page<WorkPrequalification> findPage(Page<WorkPrequalification> page, WorkPrequalification workPrequalification) {
+//		workPrequalification.setPage(page);
+//		page.setList(findList(workPrequalification));
+//		return page;
+//	}
+//
+//	@Transactional(readOnly = false)
+//	public void save(WorkPrequalification workPrequalification) {
+//		super.save(workPrequalification);
+//
+//		for (WorkProjectLinkman workProjectLinkman : workPrequalification.getWorkProjectLinkmanList()){
+//			if (workProjectLinkman.getId() == null){
+//				continue;
+//			}
+//			if (WorkProjectLinkman.DEL_FLAG_NORMAL.equals(workProjectLinkman.getDelFlag())){
+//				if (StringUtils.isNotBlank(workProjectLinkman.getId()) && workClientLinkmanDao.get(workProjectLinkman.getId())!=null){
+//					workProjectLinkman.setProjectId(workPrequalification.getId());
+//					workProjectLinkman.preInsert();
+//					workProjectLinkmanDao.insert(workProjectLinkman);
+//				}else if (StringUtils.isBlank(workProjectLinkman.getId())){
+//					workProjectLinkman.setProjectId(workPrequalification.getId());
+//					workProjectLinkman.preInsert();
+//					workProjectLinkmanDao.insert(workProjectLinkman);
+//				}else{
+//					workProjectLinkman.preUpdate();
+//					workProjectLinkmanDao.update(workProjectLinkman);
+//				}
+//			}else{
+//				workProjectLinkmanDao.delete(workProjectLinkman);
+//			}
+//		}
+//
+//
+//
+//		for (User user : workPrequalification.getMemberList()){
+//			if (user.getId() == null){
+//				continue;
+//			}
+//			dao.deleteProjectMember(workPrequalification);
+//			dao.insertProjectMember(workPrequalification);
+//		}
+//	}
+//
+//	@Transactional(readOnly = false)
+//	public void delete(WorkPrequalification workPrequalification) {
+//		super.delete(workPrequalification);
+//		WorkProjectLinkman linkman = new WorkProjectLinkman();
+//		linkman.setProjectId(workPrequalification.getId());
+//		dao.deleteProjectUser(workPrequalification);
+//		workProjectLinkmanDao.delete(linkman);
+//	}
+//
+//	public Page<WorkClientInfo> findPageBybiddingCompany(Page<WorkClientInfo> page, WorkClientInfo biddingCompany) {
+//		biddingCompany.setPage(page);
+//		page.setList(dao.findListBybiddingCompany(biddingCompany));
+//		return page;
+//	}
+//
+//
+//
+//}

+ 716 - 0
src/main/java/com/jeeplus/modules/workprequalification/web/WorkPrequalificationController.java

@@ -0,0 +1,716 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprequalification.web;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.json.AjaxJson;
+import com.jeeplus.common.mapper.JsonMapper;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.IdGen;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.act.entity.Act;
+import com.jeeplus.modules.act.service.ActTaskService;
+import com.jeeplus.modules.act.utils.ActUtils;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.entity.Role;
+import com.jeeplus.modules.sys.entity.User;
+import com.jeeplus.modules.sys.service.OfficeService;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workactivity.entity.Activity;
+import com.jeeplus.modules.workactivity.service.ActivityService;
+import com.jeeplus.modules.workbidproject.dao.WorkBidProjectDao;
+import com.jeeplus.modules.workbidproject.entity.WorkBidProject;
+import com.jeeplus.modules.workbidproject.service.WorkBidProjectService;
+import com.jeeplus.modules.workclientinfo.dao.WorkClientLinkmanDao;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workclientinfo.service.WorkClientInfoService;
+import com.jeeplus.modules.workfullmanage.service.WorkFullManageService;
+import com.jeeplus.modules.workproject.entity.WorkProject;
+import com.jeeplus.modules.workproject.service.WorkProjectService;
+import org.activiti.engine.HistoryService;
+import org.activiti.engine.RepositoryService;
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.TaskService;
+import org.activiti.engine.history.HistoricProcessInstance;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 投标资格预审Controller
+ * @author  mengxy
+ * @version 2017-05-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workprequalification/workPrequalification")
+public class WorkPrequalificationController extends BaseController {
+
+	@Autowired
+	private WorkFullManageService workFullManageService;
+
+	@Autowired
+	private WorkBidProjectService workBidProjectService;
+
+	@Autowired
+	private WorkClientInfoService workClientInfoService;
+
+	@Autowired
+	private WorkProjectService workProjectService;
+
+	@Autowired
+	protected RuntimeService runtimeService;
+
+	@Autowired
+	protected TaskService taskService;
+
+	@Autowired
+	private ActTaskService actTaskService;
+
+	@Autowired
+	private OfficeService officeService;
+
+	@Autowired
+	protected HistoryService historyService;
+	@Autowired
+	protected RepositoryService repositoryService;
+	@Autowired
+	private ActivityService activityService;
+	@Autowired
+	private WorkBidProjectDao workBidProjectDao;
+	@Autowired
+	private WorkClientLinkmanDao workClientLinkmanDao;
+	
+	@ModelAttribute
+	public WorkBidProject get(@RequestParam(required=false) String id) {
+		WorkBidProject entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workBidProjectService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkBidProject();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 资格预审项目列表页面
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkBidProject workBidProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		workBidProject.setName("2");
+		if(!UserUtils.getSelectRoleInfo()){
+			String id = UserUtils.getUser().getId();
+			workBidProject.setQueryCon(id);
+		}
+		/*if(role.getEnname().contains("bmzr")) {
+			model.addAttribute("role", role);
+		}else {
+			model.addAttribute("role", "");
+		}*/
+		model.addAttribute("role", "");
+		Page<WorkBidProject> page = workBidProjectService.findPage(new Page<WorkBidProject>(request, response), workBidProject);
+		for (WorkBidProject workBidProject1:page.getList()){
+			if(StringUtils.isNotBlank(workBidProject1.getProcessInstanceId())){
+				boolean state = actTaskService.isProcessEnd(workBidProject1.getProcessInstanceId());
+				if (state){
+					workBidProject1.setQueryCon("true");
+				}
+			}
+		}
+		model.addAttribute("page", page);
+		return "modules/workprequalification/workPrequalificationList";
+	}
+
+	/**
+	 * 工单执行(完成任务)
+	 * @param workBidProject
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "saveAudit")
+	public String saveAudit(WorkBidProject workBidProject,Map<String, Object> vars, Model model, RedirectAttributes redirectAttributes) {
+		/*if (org.apache.commons.lang3.StringUtils.isBlank(workBidProject.getAct().getComment())){
+			addMessage(model, "请填写审核意见。");
+			return form(workBidProject, model);
+		}*/
+		//String str = workBidProjectService.auditSave(workBidProject);
+		//addMessage(redirectAttributes, str);
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+
+	/**
+	 * 查看,增加,编辑资格预审项目表单页面
+	 */
+	@RequiresPermissions(value={"workprequalification:workPrequalification:view","workprequalification:workPrequalification:add","workprequalification:workPrequalification:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkBidProject workBidProject, Model model) {
+
+		List<WorkClientLinkman>  list = workBidProject.getWorkClientLinkmanList();
+		List<Map<Object,Object>> resultList = Lists.newArrayList();
+		if(list.size() > 0) {
+			for (int i = 0; i < list.size(); i++) {
+				HashMap<Object, Object> map = Maps.newHashMap();
+				map.put("linkmanName", list == null ? "" : list.get(i).getName());
+				map.put("linkmanOffice", list == null ? "" : list.get(i).getOffice());
+				map.put("linkmanPosition", list == null ? "" : list.get(i).getPosition());
+				map.put("QQ", list == null ? "" : list.get(i).getQq());
+				map.put("linkmanPhone", list == null ? "" : list.get(i).getLinkPhone());
+				map.put("linkmanMobile", list == null ? "" : list.get(i).getLinkMobile());
+				map.put("linkmanEmail", list == null ? "" : list.get(i).getEmail());
+				resultList.add(map);
+			}
+		}
+		String linkmanList = JsonMapper.toJsonString(resultList);
+		model.addAttribute("linkmanList",linkmanList);
+
+		if (workBidProject.getAct()!=null && StringUtils.isNotBlank(workBidProject.getAct().getTaskId())){
+			model.addAttribute("workPrequalification", workBidProject);
+			return "modules/workprequalification/workPrequalificationAudit";
+		}
+		if(StringUtils.isNotBlank(workBidProject.getName()) && workBidProject.getName().equals("view")){
+			model.addAttribute("workPrequalification", workBidProject);
+			return "modules/workprequalification/workPrequalificationView";
+		}
+		if (StringUtils.isBlank(workBidProject.getId())){
+			workBidProject.setProjectNumber(IdGen.uuid());
+		}
+		model.addAttribute("workPrequalification", workBidProject);
+		return "modules/workprequalification/workPrequalificationForm";
+	}
+
+
+
+	/**
+	 * 查询系统外客户
+	 * @return
+	 */
+	@RequestMapping(value = "getExtCompany")
+	@ResponseBody
+	public AjaxJson getExtCompany(String workBidProjectId){
+		AjaxJson j = new AjaxJson();
+		WorkBidProject workBidProject = workBidProjectDao.get(workBidProjectId);
+		List<WorkClientLinkman> list = Lists.newArrayList();
+		if(workBidProject!=null && "1".equals(workBidProject.getIsExt())){
+			WorkClientLinkman linkman =new WorkClientLinkman();
+			linkman.setProjectId(workBidProjectId);
+			list = workClientLinkmanDao.findListByProjectId(linkman);
+		}
+		j.put("list", list);
+		return j;
+	}
+
+	/**
+	 * 保存资格预审项目
+	 */
+	@RequiresPermissions(value={"workprequalification:workPrequalification:add","workprequalification:workPrequalification:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkBidProject workBidProject, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workBidProject)){
+			return form(workBidProject, model);
+		}
+		if(!"1".equals(workBidProject.getIsExt())){
+			workBidProject.setExtCompany("");
+		}
+		if(!workBidProject.getIsNewRecord()){//编辑表单保存
+			WorkBidProject t = workBidProjectService.get(workBidProject.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workBidProject, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			String contacts = workBidProject.getContacts();
+			String members = workBidProject.getProjectMemberIds();
+			t.setContacts(contacts);
+			t.setProjectMember(members);
+			String masters = workBidProject.getProjectMasterIds();
+			t.setProjectMaster(masters);
+
+			WorkProject workProject = workProjectService.get(t.getWorkProject().getId());
+			workProject.setName(t.getProjectName());
+			workProject.setUpdateBy(t.getUpdateBy());
+			workProject.setUpdateDate(t.getUpdateDate());
+			if (StringUtils.isNotBlank(t.getStatus()) &&t.getStatus().equals("4")){
+				String processInstanceId = t.getProcessInstanceId();
+				HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+				if(historicProcessInstance!=null) {
+					t.setHistoricProcessInstance(historicProcessInstance);
+					t.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
+				} else {
+					ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+					if (processInstance != null){
+						t.setProcessInstance(processInstance);
+						t.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
+					}
+				}
+				ProcessInstance processInstance = actTaskService.getProcIns(t.getProcessInstanceId());
+				if (processInstance!=null) {
+					Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+					Act act = new Act();
+					act.setTaskId(taskInfok.getId());
+					act.setTaskName(taskInfok.getName());
+					act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+					act.setProcDefId(taskInfok.getProcessDefinitionId());
+					act.setProcInsId(taskInfok.getProcessInstanceId());
+					act.setTask(taskInfok);
+					act.setFlag("yes");
+					t.setAct(act);
+				}
+				//workBidProjectService.auditSave(t);
+				//workProjectService.update(workProject);//保存项目总表
+				workBidProjectService.save(t);//保存
+				addMessage(redirectAttributes, "资格预审项目已重新申请!");
+			}else {
+				workProjectService.update(workProject);//保存项目总表
+				workBidProjectService.save(t);
+				addMessage(redirectAttributes, "修改资格预审项目成功!");
+			}
+		}else{//新增表单保存
+			workBidProject.setStatus("2");
+			String contacts = workBidProject.getContacts();
+			String members = workBidProject.getProjectMemberIds();
+			workBidProject.setContacts(contacts);
+			workBidProject.setProjectMember(members);
+			String masters = workBidProject.getProjectMasterIds();
+			workBidProject.setProjectMaster(masters);
+			workBidProject.setCompanyId(UserUtils.getSelectCompany().getId());
+			workBidProject.setOfficeId(UserUtils.getSelectOffice().getId());
+
+			WorkProject workProject = new WorkProject();
+			workProject.setName(workBidProject.getProjectName());
+			workProject.setNumber(workBidProject.getProjectNumber());
+			workProject.setCreateBy(workBidProject.getCreateBy());
+			workProject.setCreateDate(workBidProject.getCreateDate());
+			workProject.setDelFlag("-1");
+			workProject.setUpdateBy(workBidProject.getUpdateBy());
+			workProject.setUpdateDate(workBidProject.getUpdateDate());
+			workProject.setRemarks(workBidProject.getRemarks());
+			workProject.setCompanyId(UserUtils.getSelectCompany().getId());
+			workProject.setSort("投标项目");
+			workProjectService.save(workProject);//保存项目总表
+			workBidProject.setWorkProject(workProject);
+			workBidProjectService.save(workBidProject);//保存
+
+			Map<String, Object> variables = new HashMap<String, Object>();
+			workBidProjectService.startProcess(workBidProject,variables);
+			addMessage(redirectAttributes, "保存资格预审项目成功!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+	/**
+	 * 保存资格预审项目
+	 */
+	@RequestMapping(value = "store")
+	public String store(WorkBidProject workBidProject, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workBidProject)){
+			return form(workBidProject, model);
+		}
+		if(!"1".equals(workBidProject.getIsExt())){
+			workBidProject.setExtCompany("");
+		}
+
+		if(!workBidProject.getIsNewRecord()){//编辑表单保存
+			WorkBidProject t = workBidProjectService.get(workBidProject.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workBidProject, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			String contacts = workBidProject.getContacts();
+			String members = workBidProject.getProjectMemberIds();
+			t.setContacts(contacts);
+			t.setProjectMember(members);
+			String masters = workBidProject.getProjectMasterIds();
+			workBidProject.setProjectMaster(masters);
+
+			WorkProject workProject = workProjectService.get(t.getWorkProject().getId());
+			workProject.setName(t.getProjectName());
+			workProject.setUpdateBy(t.getUpdateBy());
+			workProject.setUpdateDate(t.getUpdateDate());
+			if (StringUtils.isNotBlank(t.getStatus()) &&t.getStatus().equals("4")){
+				String processInstanceId = t.getProcessInstanceId();
+				HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
+				if(historicProcessInstance!=null) {
+					t.setHistoricProcessInstance(historicProcessInstance);
+					t.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(historicProcessInstance.getProcessDefinitionId()).singleResult());
+				} else {
+					ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).active().singleResult();
+					if (processInstance != null){
+						t.setProcessInstance(processInstance);
+						t.setProcessDefinition(repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult());
+					}
+				}
+				ProcessInstance processInstance = actTaskService.getProcIns(t.getProcessInstanceId());
+				if (processInstance!=null) {
+					Task taskInfok = actTaskService.getCurrentTaskInfo(processInstance);
+					Act act = new Act();
+					act.setTaskId(taskInfok.getId());
+					act.setTaskName(taskInfok.getName());
+					act.setTaskDefKey(taskInfok.getTaskDefinitionKey());
+					act.setProcDefId(taskInfok.getProcessDefinitionId());
+					act.setProcInsId(taskInfok.getProcessInstanceId());
+					act.setTask(taskInfok);
+					act.setFlag("no");
+					t.setAct(act);
+				}
+				//workBidProjectService.auditSave(t);
+				workProjectService.update(workProject);//保存项目总表
+				workBidProjectService.save(t);//保存
+				addMessage(redirectAttributes, "资格预审项目已撤销!");
+			}else {
+				workProjectService.update(workProject);//保存项目总表
+				workBidProjectService.save(t);
+				addMessage(redirectAttributes, "修改资格预审项目成功!");
+			}
+		}else{//新增表单保存
+			workBidProject.setStatus("1");
+			String contacts = workBidProject.getContacts();
+			String members = workBidProject.getProjectMemberIds();
+			workBidProject.setContacts(contacts);
+			workBidProject.setProjectMember(members);
+			workBidProject.setCompanyId(UserUtils.getSelectCompany().getId());
+			workBidProject.setOfficeId(UserUtils.getSelectOffice().getId());
+
+			WorkProject workProject = new WorkProject();
+			workProject.setName(workBidProject.getProjectName());
+			workProject.setNumber(workBidProject.getProjectNumber());
+			workProject.setCreateBy(workBidProject.getCreateBy());
+			workProject.setCreateDate(workBidProject.getCreateDate());
+			workProject.setDelFlag("-1");
+			workProject.setUpdateBy(workBidProject.getUpdateBy());
+			workProject.setUpdateDate(workBidProject.getUpdateDate());
+			workProject.setRemarks(workBidProject.getRemarks());
+			workProject.setSort("投标项目");
+			workProjectService.save(workProject);//保存项目总表
+			workBidProject.setWorkProject(workProject);
+
+			workBidProjectService.save(workBidProject);//保存
+			addMessage(redirectAttributes, "保存资格预审项目成功!");
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+
+	/**
+	 * 删除资格预审项目
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkBidProject workBidProject, RedirectAttributes redirectAttributes) {
+		WorkProject workProject = workBidProject.getWorkProject();
+		workProjectService.delete(workProject);//删除总项目表数据
+		workBidProjectService.delete(workBidProject);
+
+
+		addMessage(redirectAttributes, "删除资格预审项目成功");
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+	
+	/**
+	 * 批量删除资格预审项目
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			WorkProject workProject = workBidProjectService.get(id).getWorkProject();
+			workProjectService.delete(workProject);//删除总项目表数据
+
+			workBidProjectService.delete(workBidProjectService.get(id));
+
+		}
+		addMessage(redirectAttributes, "删除资格预审项目成功");
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkBidProject WorkBidProject, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "资格预审项目"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkBidProject> page = workBidProjectService.findPage(new Page<WorkBidProject>(request, response, -1), WorkBidProject);
+    		new ExportExcel("资格预审项目", WorkBidProject.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出资格预审项目记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkBidProject> list = ei.getDataList(WorkBidProject.class);
+			for (WorkBidProject workBidProject : list){
+				try{
+					workBidProjectService.save(workBidProject);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条资格预审项目记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条资格预审项目记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入资格预审项目失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+    }
+	
+	/**
+	 * 下载导入资格预审项目数据模板
+	 */
+	@RequiresPermissions("workprequalification:workPrequalification:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "资格预审项目数据导入模板.xlsx";
+    		List<WorkBidProject> list = Lists.newArrayList();
+    		new ExportExcel("资格预审项目数据", WorkBidProject.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+    }
+	
+	
+	/**
+	 * 选择招标单位
+	 */
+	@RequestMapping(value = "selectbiddingCompany")
+	public String selectbiddingCompany(WorkClientInfo biddingCompany, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkClientInfo> page = workBidProjectService.findPageBybidCompany(new Page<WorkClientInfo>(request, response),  biddingCompany);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", biddingCompany);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	
+
+	/**
+	 * 选择招标单位
+	 */
+	@ResponseBody
+	@RequestMapping(value = "selectLinkman")
+	public AjaxJson selectLinkman(String clientId,HttpServletRequest request, HttpServletResponse response, Model model) {
+		AjaxJson j = new AjaxJson();
+		List<WorkClientLinkman> list = workClientInfoService.findLinkmanList(new WorkClientInfo(clientId));
+		j.put("list", list);
+		return j;
+	}
+
+	/**
+	 * 待办任务列表页面
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = {"workPrequalificationTodoList"})
+	public String workPrequalificationTodoList(Act act, HttpServletRequest request, HttpServletResponse response, Model model) {
+		act.setProcDefKey("prequalification");
+		List<Act> list = new ArrayList<>();
+		list.addAll(actTaskService.todoList(act));
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("214ad3f24b1345bc800fa76a57bb45a8",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(actTaskService.todoList(act));
+		}
+		List<WorkBidProject> lists = new ArrayList<WorkBidProject>();
+		Role role = UserUtils.getSelectRole().get(0);
+		String officeId = "";
+		if (role.getDataScope().contains("4")){
+			User user = UserUtils.getUser();
+			officeId = user.getOffice().getId();
+		}
+		for (Act a : list) {
+			WorkBidProject workBidProject = workBidProjectService.getByProcessInstanceId(a.getProcInsId());
+			if (workBidProject != null && workBidProject.getCompanyId().equals(companyId) && workBidProject.getStatus() !=null && !workBidProject.getStatus().equals("4")) {
+				User createBy = UserUtils.get(workBidProject.getCreateBy().getId());
+				if (StringUtils.isNotBlank(officeId)){
+					if (officeId.equals(createBy.getOffice().getId())){
+						if (a.getVars().getMap().get("applyUserId")!=null) {
+							User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+							if (user != null) {
+								a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+							}
+						}
+						workBidProject.setAct(a);
+						if (com.jeeplus.common.utils.StringUtils.isNotBlank(workBidProject.getId())){
+							workBidProject.setName(officeService.get(companyId).getName());
+						}
+						lists.add(workBidProject);
+					}
+				}else {
+					if (a.getVars().getMap().get("applyUserId")!=null) {
+						User user = UserUtils.get(a.getVars().getMap().get("applyUserId").toString());
+						if (user != null) {
+							a.getVars().getMap().put("applyUserId", UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+						}
+					}
+					workBidProject.setAct(a);
+					if (com.jeeplus.common.utils.StringUtils.isNotBlank(workBidProject.getId())){
+						workBidProject.setName(officeService.get(companyId).getName());
+					}
+					lists.add(workBidProject);
+				}
+			}
+		}
+		model.addAttribute("list", lists);
+		return "modules/workprequalification/workPrequalificationTodoList";
+	}
+
+	/**
+	 * 已办任务
+	 * @param act
+	 * @param request
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = {"workPrequalificationHistoricList"})
+	public String workPrequalificationHistoricList (Act act, HttpServletRequest request, HttpServletResponse response, Model model){
+		act.setProcDefKey("prequalification");
+		List<Act> list = actTaskService.historicList(act);
+		Office office = UserUtils.getSelectCompany();
+		String companyId = office==null?"":office.getId();
+		List<Activity> activities = activityService.groupByActivityMenu("214ad3f24b1345bc800fa76a57bb45a8",companyId);
+		for (Activity activity:activities){
+			act.setProcDefKey(activity.getProcessKey());
+			list.addAll(actTaskService.historicList(act));
+		}
+		List<WorkBidProject> lists = new ArrayList<WorkBidProject>();
+		for (Act a : list) {
+			try {
+				WorkBidProject workBidProject = workBidProjectService.getByProcessInstanceId(a.getHistTask().getProcessInstanceId());
+				if (workBidProject != null && workBidProject.getCompanyId().equals(companyId)) {
+					if (a.getVars().getMap().get("applyUserId")!=null){
+						a.getVars().getMap().put("applyUserId",UserUtils.get(a.getVars().getMap().get("applyUserId").toString()).getName());
+					}
+					workBidProject.setAct(a);
+					if (com.jeeplus.common.utils.StringUtils.isNotBlank(workBidProject.getId())){
+						workBidProject.setName(officeService.get(companyId).getName());
+					}
+					lists.add(workBidProject);
+				}
+			}catch (Exception e){
+				logger.info("Exception e"+e);
+
+			}
+
+		}
+		model.addAttribute("list", lists);
+
+		return "modules/workprequalification/workPrequalificationHistoricList";
+	}
+
+	/**
+	 * 审核信息
+	 * @param response
+	 * @param model
+	 * @return
+	 */
+	@RequestMapping(value = "applyOnWorkBidProject")
+	public String applyOnWorkBidProject(Act act, HttpServletResponse response, Model model) {
+		// 获取流程XML上的表单KEY
+		String formKey = "/workprequalification/workPrequalification/form";
+		//logger.info("------formKeys:"+formKeys);
+		// 获取流程实例对象
+		if (act.getProcInsId() != null){
+			if(actTaskService.getProcIns(act.getProcInsId())!=null){
+				act.setProcIns(actTaskService.getProcIns(act.getProcInsId()));
+			}else{
+				act.setFinishedProcIns(actTaskService.getFinishedProcIns(act.getProcInsId()));
+			}
+		}
+		return "redirect:" + ActUtils.getFormUrl(formKey, act);
+	}
+
+	/**
+	 * 读取所有流程
+	 * @return
+	 */
+	@RequestMapping(value = "getProcess")
+	public String getProcess(WorkBidProject workBidProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		//admin 可以查看所有流程  展示注释
+//        User user = UserUtils.getUser();
+//        if (!user.isAdmin()){
+////            leave.setCompanyId(user.getComId());
+//            if (!UserUtils.isManager()){
+//                workReimbursement.setCreateBy(user);
+//            }
+//        }
+		WorkBidProject workBidProject1 = workBidProjectService.get(workBidProject.getId());
+		model.addAttribute("processInstanceId", workBidProject1.getProcessInstanceId());
+		return "modules/workprequalification/workPrequalificationTask";
+	}
+
+	/**
+	 * 启动流程
+	 * @return
+	 */
+	@RequestMapping(value = "startposs")
+	public String startposs(WorkBidProject workBidProject, HttpServletRequest request, HttpServletResponse response, Model model, RedirectAttributes redirectAttributes)throws Exception {
+		Map<String, Object> variables = new HashMap<String, Object>();
+		WorkBidProject t = workBidProjectService.get(workBidProject.getId());//从数据库取出记录的值
+		MyBeanUtils.copyBeanNotNull2Bean(workBidProject, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+		t.setStatus("2");
+		t.preUpdate();
+		workBidProjectService.update(t);
+		workBidProjectService.startProcess(t,variables);
+		addMessage(redirectAttributes, "启动流程成功");
+		return "redirect:"+Global.getAdminPath()+"/workprequalification/workPrequalification/?repage";
+	}
+
+}

+ 21 - 0
src/main/java/com/jeeplus/modules/workprocesstype/dao/WorkProcessDetailDao.java

@@ -0,0 +1,21 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessDetail;
+
+import java.util.List;
+
+/**
+ * 过程控制类型DAO接口
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@MyBatisDao
+public interface WorkProcessDetailDao extends CrudDao<WorkProcessDetail> {
+
+	public List<WorkProcessDetail> findListByState(WorkProcessDetail workProcessDetail);
+}

+ 21 - 0
src/main/java/com/jeeplus/modules/workprocesstype/dao/WorkProcessTypeDao.java

@@ -0,0 +1,21 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessType;
+
+/**
+ * 工程控制类型DAO接口
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@MyBatisDao
+public interface WorkProcessTypeDao extends CrudDao<WorkProcessType> {
+
+
+
+	
+}

+ 73 - 0
src/main/java/com/jeeplus/modules/workprocesstype/entity/WorkProcessDetail.java

@@ -0,0 +1,73 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 过程控制类型Entity
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+public class WorkProcessDetail extends DataEntity<WorkProcessDetail> {
+	
+	private static final long serialVersionUID = 1L;
+	private String processNumber;		// 表格编号
+	private String processName;			// 过程名称
+	private String companyId;			//公司编号
+	private String state;				//状态
+	private String typeId;				//从表主键
+	
+	public WorkProcessDetail() {
+		super();
+	}
+
+	public WorkProcessDetail(String id){
+		super(id);
+	}
+
+	@ExcelField(title="表格编号", align=2, sort=7)
+	public String getProcessNumber() {
+		return processNumber;
+	}
+
+	public void setProcessNumber(String processNumber) {
+		this.processNumber = processNumber;
+	}
+	
+	@ExcelField(title="过程名称", align=2, sort=8)
+	public String getProcessName() {
+		return processName;
+	}
+
+	public void setProcessName(String processName) {
+		this.processName = processName;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getTypeId() {
+		return typeId;
+	}
+
+	public void setTypeId(String typeId) {
+		this.typeId = typeId;
+	}
+}

+ 57 - 0
src/main/java/com/jeeplus/modules/workprocesstype/entity/WorkProcessType.java

@@ -0,0 +1,57 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 工程控制类型Entity
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+public class WorkProcessType extends DataEntity<WorkProcessType> {
+	
+	private static final long serialVersionUID = 1L;
+	private String companyId;		// 公司编号
+	private String state;		// 状态
+	private String stateId;		// 类型编号
+	
+	public WorkProcessType() {
+		super();
+	}
+
+	public WorkProcessType(String id){
+		super(id);
+	}
+
+	@ExcelField(title="公司编号", align=2, sort=7)
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+	
+	@ExcelField(title="状态", align=2, sort=8)
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+	
+	@ExcelField(title="类型编号", align=2, sort=9)
+	public String getStateId() {
+		return stateId;
+	}
+
+	public void setStateId(String stateId) {
+		this.stateId = stateId;
+	}
+	
+}

+ 55 - 0
src/main/java/com/jeeplus/modules/workprocesstype/service/WorkProcessDetailService.java

@@ -0,0 +1,55 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workprocesstype.dao.WorkProcessDetailDao;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessDetail;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 过程控制类型Service
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkProcessDetailService extends CrudService<WorkProcessDetailDao, WorkProcessDetail> {
+
+	@Autowired
+	private WorkProcessDetailDao workProcessDetailDao;
+
+	public WorkProcessDetail get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkProcessDetail> findList(WorkProcessDetail workProcessDetail) {
+		return super.findList(workProcessDetail);
+	}
+	
+	public Page<WorkProcessDetail> findPage(Page<WorkProcessDetail> page, WorkProcessDetail workProcessDetail) {
+		return super.findPage(page, workProcessDetail);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkProcessDetail workProcessDetail) {
+		super.save(workProcessDetail);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkProcessDetail workProcessDetail) {
+		super.delete(workProcessDetail);
+	}
+
+
+	public List<WorkProcessDetail> findListByState(WorkProcessDetail workProcessDetail){
+		return workProcessDetailDao.findListByState(workProcessDetail);
+	}
+	
+}

+ 49 - 0
src/main/java/com/jeeplus/modules/workprocesstype/service/WorkProcessTypeService.java

@@ -0,0 +1,49 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.service;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workprocesstype.dao.WorkProcessTypeDao;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessType;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 工程控制类型Service
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkProcessTypeService extends CrudService<WorkProcessTypeDao, WorkProcessType> {
+
+	public WorkProcessType get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkProcessType> findList(WorkProcessType workProcessType) {
+		return super.findList(workProcessType);
+	}
+	
+	public Page<WorkProcessType> findPage(Page<WorkProcessType> page, WorkProcessType workProcessType) {
+		return super.findPage(page, workProcessType);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkProcessType workProcessType) {
+		super.save(workProcessType);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkProcessType workProcessType) {
+		super.delete(workProcessType);
+	}
+	
+	
+	
+	
+}

+ 206 - 0
src/main/java/com/jeeplus/modules/workprocesstype/web/WorkProcessDetailController.java

@@ -0,0 +1,206 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.SpringContextHolder;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.Office;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workcontent.entity.WorkContentType;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessDetail;
+import com.jeeplus.modules.workprocesstype.service.WorkProcessDetailService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+
+/**
+ * 过程控制类型Controller
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workprocesstype/workProcessDetail")
+public class WorkProcessDetailController extends BaseController {
+
+	private static WorkProcessDetailService workProcessDetailServices = SpringContextHolder.getBean(WorkProcessDetailService.class);
+	@Autowired
+	private WorkProcessDetailService workProcessDetailService;
+	
+	@ModelAttribute
+	public WorkProcessDetail get(@RequestParam(required=false) String id) {
+		WorkProcessDetail entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workProcessDetailService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkProcessDetail();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 过程控制类型列表页面
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkProcessDetail workProcessDetail, HttpServletRequest request, HttpServletResponse response, Model model) {
+		workProcessDetail.setCompanyId(UserUtils.getSelectCompany().getId());
+		Page<WorkProcessDetail> page = workProcessDetailService.findPage(new Page<WorkProcessDetail>(request, response), workProcessDetail); 
+		model.addAttribute("page", page);
+		return "modules/workprocesstype/workProcessDetailList";
+	}
+
+	/**
+	 * 查看,增加,编辑过程控制类型表单页面
+	 */
+	@RequiresPermissions(value={"workprocesstype:workProcessDetail:view","workprocesstype:workProcessDetail:add","workprocesstype:workProcessDetail:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkProcessDetail workProcessDetail, Model model) {
+		model.addAttribute("workProcessDetail", workProcessDetail);
+		return "modules/workprocesstype/workProcessDetailForm";
+	}
+
+	/**
+	 * 保存过程控制类型
+	 */
+	@RequiresPermissions(value={"workprocesstype:workProcessDetail:add","workprocesstype:workProcessDetail:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkProcessDetail workProcessDetail, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workProcessDetail)){
+			return form(workProcessDetail, model);
+		}
+		if(!workProcessDetail.getIsNewRecord()){//编辑表单保存
+			WorkProcessDetail t = workProcessDetailService.get(workProcessDetail.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workProcessDetail, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workProcessDetailService.save(t);//保存
+		}else{//新增表单保存
+			workProcessDetailService.save(workProcessDetail);//保存
+		}
+		addMessage(redirectAttributes, "保存过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+	}
+	
+	/**
+	 * 删除过程控制类型
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkProcessDetail workProcessDetail, RedirectAttributes redirectAttributes) {
+		workProcessDetailService.delete(workProcessDetail);
+		addMessage(redirectAttributes, "删除过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+	}
+	
+	/**
+	 * 批量删除过程控制类型
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workProcessDetailService.delete(workProcessDetailService.get(id));
+		}
+		addMessage(redirectAttributes, "删除过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkProcessDetail workProcessDetail, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制类型"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkProcessDetail> page = workProcessDetailService.findPage(new Page<WorkProcessDetail>(request, response, -1), workProcessDetail);
+    		new ExportExcel("过程控制类型", WorkProcessDetail.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出过程控制类型记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkProcessDetail> list = ei.getDataList(WorkProcessDetail.class);
+			for (WorkProcessDetail workProcessDetail : list){
+				try{
+					workProcessDetailService.save(workProcessDetail);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条过程控制类型记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条过程控制类型记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入过程控制类型失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+    }
+	
+	/**
+	 * 下载导入过程控制类型数据模板
+	 */
+	@RequiresPermissions("workprocesstype:workProcessDetail:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制类型数据导入模板.xlsx";
+    		List<WorkProcessDetail> list = Lists.newArrayList(); 
+    		new ExportExcel("过程控制类型数据", WorkProcessDetail.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+    }
+
+
+	public static List<WorkProcessDetail> getContentList(){
+		WorkProcessDetail workProcessDetail = new WorkProcessDetail();
+		Office company = UserUtils.getSelectCompany();
+		workProcessDetail.setCompanyId(company.getId());
+		workProcessDetail.setDelFlag(WorkContentType.DEL_FLAG_NORMAL);
+		return workProcessDetailServices.findListByState(workProcessDetail);
+	}
+
+}

+ 214 - 0
src/main/java/com/jeeplus/modules/workprocesstype/web/WorkProcessTypeController.java

@@ -0,0 +1,214 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprocesstype.web;
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workprocesstype.entity.WorkProcessType;
+import com.jeeplus.modules.workprocesstype.service.WorkProcessTypeService;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+import java.util.List;
+
+/**
+ * 工程控制类型Controller
+ * @author 马鹏波
+ * @version 2018-06-07
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workprocesstype/workProcessType")
+public class WorkProcessTypeController extends BaseController {
+
+	@Autowired
+	private WorkProcessTypeService workProcessTypeService;
+	
+	@ModelAttribute
+	public WorkProcessType get(@RequestParam(required=false) String id) {
+		WorkProcessType entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workProcessTypeService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkProcessType();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 过程控制类型列表页面
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkProcessType workProcessType, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkProcessType> page = workProcessTypeService.findPage(new Page<WorkProcessType>(request, response), workProcessType); 
+		model.addAttribute("page", page);
+		return "modules/workprocesstype/workProcessTypeList";
+	}
+
+	/**
+	 * 查看,增加,编辑过程控制类型表单页面
+	 */
+	@RequiresPermissions(value={"workprocesstype:workProcessType:view","workprocesstype:workProcessType:add","workprocesstype:workProcessType:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkProcessType workProcessType, Model model) {
+		model.addAttribute("workProcessType", workProcessType);
+		return "modules/workprocesstype/workProcessTypeForm";
+	}
+
+	/**
+	 * 保存过程控制类型
+	 */
+	@RequiresPermissions(value={"workprocesstype:workProcessType:add","workprocesstype:workProcessType:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkProcessType workProcessType, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workProcessType)){
+			return form(workProcessType, model);
+		}
+		if(!workProcessType.getIsNewRecord()){//编辑表单保存
+			WorkProcessType t = workProcessTypeService.get(workProcessType.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workProcessType, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workProcessTypeService.save(t);//保存
+		}else{//新增表单保存
+			workProcessTypeService.save(workProcessType);//保存
+		}
+		addMessage(redirectAttributes, "保存过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+	}
+	
+	/**
+	 * 删除过程控制类型
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkProcessType workProcessType, RedirectAttributes redirectAttributes) {
+		workProcessTypeService.delete(workProcessType);
+		addMessage(redirectAttributes, "删除过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+	}
+	
+	/**
+	 * 批量删除过程控制类型
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workProcessTypeService.delete(workProcessTypeService.get(id));
+		}
+		addMessage(redirectAttributes, "删除过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkProcessType workProcessType, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制类型"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkProcessType> page = workProcessTypeService.findPage(new Page<WorkProcessType>(request, response, -1), workProcessType);
+    		new ExportExcel("过程控制类型", WorkProcessType.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出过程控制类型记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkProcessType> list = ei.getDataList(WorkProcessType.class);
+			for (WorkProcessType workProcessType : list){
+				try{
+					workProcessTypeService.save(workProcessType);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条过程控制类型记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条过程控制类型记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入过程控制类型失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+    }
+	
+	/**
+	 * 下载导入过程控制类型数据模板
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "过程控制类型数据导入模板.xlsx";
+    		List<WorkProcessType> list = Lists.newArrayList(); 
+    		new ExportExcel("过程控制类型数据", WorkProcessType.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessType/?repage";
+    }
+
+	/**
+	 * 保存过程控制类型
+	 */
+	@RequiresPermissions("workprocesstype:workProcessType:saveState")
+	@RequestMapping(value = "saveState")
+	public String saveState(WorkProcessType workProcessType, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		if (!beanValidator(model, workProcessType)){
+			return form(workProcessType, model);
+		}
+		workProcessType.setCompanyId(UserUtils.getSelectCompany().getId());
+		if(!workProcessType.getIsNewRecord()){//编辑表单保存
+			WorkProcessType t = workProcessTypeService.get(workProcessType.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workProcessType, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workProcessTypeService.save(t);//保存
+		}else{//新增表单保存
+			workProcessTypeService.save(workProcessType);//保存
+		}
+		addMessage(redirectAttributes, "保存过程控制类型成功");
+		return "redirect:"+Global.getAdminPath()+"/workprocesstype/workProcessDetail/?repage";
+	}
+	
+
+}

+ 25 - 0
src/main/java/com/jeeplus/modules/workproject/dao/WorkProjectDao.java

@@ -0,0 +1,25 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workproject.dao;
+
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import java.util.List;
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workproject.entity.WorkProject;
+
+/**
+ * 总项目管理DAO接口
+ * @author liuw
+ * @version 2017-11-29
+ */
+@MyBatisDao
+public interface WorkProjectDao extends CrudDao<WorkProject> {
+
+	public List<WorkContractInfo> findListBycontractId(WorkContractInfo contractId);
+
+	public List<WorkProject> getByCId(WorkContractInfo contractId);
+
+	public void updateStatus (WorkProject workProject);
+}

+ 93 - 0
src/main/java/com/jeeplus/modules/workproject/entity/WorkProject.java

@@ -0,0 +1,93 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workproject.entity;
+
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 总项目管理Entity
+ * @author liuw
+ * @version 2017-11-29
+ */
+public class WorkProject extends DataEntity<WorkProject> {
+	
+	private static final long serialVersionUID = 1L;
+	private String name;		// 项目名称
+	private String number;		// 项目编号
+	private WorkContractInfo contractId;		// 合同外键
+	private String sort;      //项目分类
+	private String companyId;  //公司id
+	private String officeId;  //公司id
+	private String state;   //项目归档状态(1能归档并处在归档中2或空或null不能归档3已归档)
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getCompanyId() {
+		return companyId;
+	}
+
+	public void setCompanyId(String companyId) {
+		this.companyId = companyId;
+	}
+
+	public WorkProject() {
+		super();
+	}
+
+	public WorkProject(String id){
+		super(id);
+	}
+
+	@ExcelField(title="项目名称", align=2, sort=7)
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public String getSort() {
+		return sort;
+	}
+
+	public void setSort(String sort) {
+		this.sort = sort;
+	}
+
+	@ExcelField(title="项目编号", align=2, sort=8)
+	public String getNumber() {
+		return number;
+	}
+
+	public void setNumber(String number) {
+		this.number = number;
+	}
+	
+	@ExcelField(title="合同外键", align=2, sort=9)
+	public WorkContractInfo getContractId() {
+		return contractId;
+	}
+
+	public void setContractId(WorkContractInfo contractId) {
+		this.contractId = contractId;
+	}
+
+	public String getOfficeId() {
+		return officeId;
+	}
+
+	public void setOfficeId(String officeId) {
+		this.officeId = officeId;
+	}
+}

+ 76 - 0
src/main/java/com/jeeplus/modules/workproject/service/WorkProjectService.java

@@ -0,0 +1,76 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workproject.service;
+
+import java.util.List;
+
+import com.jeeplus.common.utils.MenuStatusEnum;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workproject.entity.WorkProject;
+import com.jeeplus.modules.workproject.dao.WorkProjectDao;
+
+/**
+ * 总项目管理Service
+ * @author liuw
+ * @version 2017-11-29
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkProjectService extends CrudService<WorkProjectDao, WorkProject> {
+	@Autowired
+	private WorkProjectDao workProjectDao;
+	public WorkProject get(String id) {
+		return super.get(id);
+	}
+
+	@Transactional(readOnly = false)
+	public void updateStatus(WorkProject workProject) {
+		dao.updateStatus(workProject);
+	}
+	public List<WorkProject> getByCId(WorkContractInfo contractId) {
+		return workProjectDao.getByCId(contractId);
+	}
+	public List<WorkProject> findList(WorkProject workProject) {
+		return super.findList(workProject);
+	}
+	
+	public Page<WorkProject> findPage(Page<WorkProject> page, WorkProject workProject) {
+		workProject.getSqlMap().put("dsf", dataScopeFilter(workProject.getCurrentUser(), "o", "u","s", MenuStatusEnum.END.getValue()));
+		return super.findPage(page, workProject);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkProject workProject) {
+		if (StringUtils.isBlank(workProject.getOfficeId())){
+			workProject.setOfficeId(UserUtils.getSelectOffice().getId());
+		}
+		super.save(workProject);
+	}
+
+	@Transactional(readOnly = false)
+	public void update(WorkProject workProject) {
+		workProjectDao.update(workProject);
+	}
+	@Transactional(readOnly = false)
+	public void delete(WorkProject workProject) {
+		super.delete(workProject);
+	}
+	
+	public Page<WorkContractInfo> findPageBycontractId(Page<WorkContractInfo> page, WorkContractInfo contractId) {
+		contractId.setPage(page);
+		page.setList(dao.findListBycontractId(contractId));
+		return page;
+	}
+	
+	
+	
+}

+ 382 - 0
src/main/java/com/jeeplus/modules/workproject/web/WorkProjectController.java

@@ -0,0 +1,382 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workproject.web;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.ConstraintViolationException;
+
+import com.google.common.base.Strings;
+import com.jeeplus.modules.sys.utils.DictUtils;
+import com.jeeplus.modules.sys.utils.UserUtils;
+import com.jeeplus.modules.workbidingproject.entity.WorkBidingProject;
+import com.jeeplus.modules.workbidingproject.service.WorkBidingProjectService;
+import com.jeeplus.modules.workbidproject.entity.WorkBidProject;
+import com.jeeplus.modules.workbidproject.service.WorkBidProjectService;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientAttachment;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientInfo;
+import com.jeeplus.modules.workclientinfo.entity.WorkClientLinkman;
+import com.jeeplus.modules.workengineeringproject.entity.WorkEngineeringProject;
+import com.jeeplus.modules.workengineeringproject.service.WorkEngineeringProjectService;
+import com.jeeplus.modules.workfullmanage.dao.WorkFullManageDao;
+import com.jeeplus.modules.workfullmanage.entity.WorkFullManage;
+import com.jeeplus.modules.workfullmanage.entity.WorkFullRecord;
+import com.jeeplus.modules.workfullmanage.service.WorkFullManageService;
+import com.jeeplus.modules.workfullmanage.service.WorkFullRecordService;
+import com.jeeplus.modules.workproject.dao.WorkProjectDao;
+import com.jeeplus.modules.workprojectnotify.entity.WorkProjectNotify;
+import com.jeeplus.modules.workprojectnotify.service.WorkProjectNotifyService;
+import com.jeeplus.modules.workreimbursement.utils.VarStr;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
+
+import com.jeeplus.modules.workcontractinfo.entity.WorkContractInfo;
+import com.google.common.collect.Lists;
+import com.jeeplus.common.utils.DateUtils;
+import com.jeeplus.common.utils.MyBeanUtils;
+import com.jeeplus.common.config.Global;
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.excel.ExportExcel;
+import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.modules.workproject.entity.WorkProject;
+import com.jeeplus.modules.workproject.service.WorkProjectService;
+
+/**
+ * 总项目管理Controller
+ * @author liuw
+ * @version 2017-11-29
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/workproject/workProject")
+public class WorkProjectController extends BaseController {
+
+	@Autowired
+	private WorkProjectService workProjectService;
+	@Autowired
+	private WorkFullRecordService workFullRecordService;
+	@Autowired
+	private WorkProjectDao workProjectDao;
+	@Autowired
+	private WorkBidProjectService workBidProjectService;
+	@Autowired
+	private WorkBidingProjectService workBidingProjectService;
+	@Autowired
+	private WorkEngineeringProjectService workEngineeringProjectService;
+	@Autowired
+	private WorkFullManageDao workFullManageDao;
+	@Autowired
+	private WorkFullManageService workFullManageService;
+	@Autowired
+	private WorkProjectNotifyService workProjectNotifyService;
+
+	@ModelAttribute
+	public WorkProject get(@RequestParam(required=false) String id) {
+		WorkProject entity = null;
+		if (StringUtils.isNotBlank(id)){
+			entity = workProjectService.get(id);
+		}
+		if (entity == null){
+			entity = new WorkProject();
+		}
+		return entity;
+	}
+	
+	/**
+	 * 项目管理列表页面
+	 */
+	@RequiresPermissions("workproject:workProject:list")
+	@RequestMapping(value = {"list", ""})
+	public String list(WorkProject workProject, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkProject> page = workProjectService.findPage(new Page<WorkProject>(request, response), workProject);
+		List<WorkProject> list =  page.getList();
+		List<WorkProject> list2 = new ArrayList<WorkProject>();
+		if(list!=null){
+			for (int i =0;i<list.size();i++) {
+				WorkProject w = list.get(i);
+				if(!("投标项目").equals(w.getSort())){
+					list2.add(w);
+				}
+			}
+			page.setList(list2);
+		}
+		model.addAttribute("page", page);
+		return "modules/workproject/workProjectList";
+	}
+
+	/**
+	 * 查看,增加,编辑项目管理表单页面
+	 */
+	@RequiresPermissions(value={"workbidproject:workBidProject:view","workbidingproject:workBidingProject:view","workengineeringproject:workEngineeringProject:view","workfullmanage:workFullManage:view","workproject:workProject:view","workproject:workProject:add","workproject:workProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "form")
+	public String form(WorkProject workProject, Model model,HttpServletRequest request) {
+		String view = request.getParameter("view");
+		//投标项目
+		if(StringUtils.isNotBlank(view)&&view.equals("1")){
+			WorkBidProject workBidProject = workBidProjectService.findUniqueByProperty("work_project_id", workProject.getId());
+			model.addAttribute("workBidProject", workBidProject);
+			return "modules/workbidproject/workBidProjectView";
+		}
+		//招标代理
+		if(StringUtils.isNotBlank(view)&&view.equals("2")){
+			WorkBidingProject workBidingProject = workBidingProjectService.findUniqueByProperty("work_project_id", workProject.getId());
+			String id = null;
+			if(workBidingProject!=null){
+				id = workBidingProject.getId();
+			}
+			/*model.addAttribute("workBidingProject", workBidingProject);
+			return "modules/workbidingproject/workBidingProjectView";*/
+			return "redirect:"+Global.getAdminPath()+"/workbidingproject/workBidingProject/form?name=view&id="+id;
+		}
+		//工程咨询
+		if(StringUtils.isNotBlank(view)&&view.equals("3")){
+			WorkEngineeringProject workEngineeringProject = workEngineeringProjectService.findUniqueByProperty("project_id", workProject.getId());
+			model.addAttribute("workEngineeringProject", workEngineeringProject);
+			return "modules/workengineeringproject/workEngineeringProjectView";
+		}
+		//全过程管理
+		if(StringUtils.isNotBlank(view)&&view.equals("4")){
+			WorkFullManage workFullManage = workFullManageDao.getByPId(workProject);
+			if(workFullManage==null){
+				return null;
+			}
+			String id = workFullManage.getId();
+			return "redirect:"+Global.getAdminPath()+"/workfullmanage/workFullManage/form?tabId=0&id="+id;
+		}
+		model.addAttribute("workProject", workProject);
+		return "modules/workproject/workProjectForm";
+	}
+
+	/**
+	 * 保存项目管理
+	 */
+	@RequiresPermissions(value={"workproject:workProject:add","workproject:workProject:edit"},logical=Logical.OR)
+	@RequestMapping(value = "save")
+	public String save(WorkProject workProject, Model model, RedirectAttributes redirectAttributes,HttpServletRequest request) throws Exception{
+		if (!beanValidator(model, workProject)){
+			return form(workProject, model,request);
+		}
+		if(!workProject.getIsNewRecord()){//编辑表单保存
+			WorkProject t = workProjectService.get(workProject.getId());//从数据库取出记录的值
+			MyBeanUtils.copyBeanNotNull2Bean(workProject, t);//将编辑表单中的非NULL值覆盖数据库记录中的值
+			workProjectService.save(t);//保存
+		}else{//新增表单保存
+			workProjectService.save(workProject);//保存
+		}
+		addMessage(redirectAttributes, "保存项目管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+	}
+	
+	/**
+	 * 删除项目管理
+	 */
+	@RequiresPermissions("workproject:workProject:del")
+	@RequestMapping(value = "delete")
+	public String delete(WorkProject workProject, RedirectAttributes redirectAttributes) {
+		workProjectService.delete(workProject);
+		addMessage(redirectAttributes, "删除项目管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+	}
+	
+	/**
+	 * 批量删除项目管理
+	 */
+	@RequiresPermissions("workproject:workProject:del")
+	@RequestMapping(value = "deleteAll")
+	public String deleteAll(String ids, RedirectAttributes redirectAttributes) {
+		String idArray[] =ids.split(",");
+		for(String id : idArray){
+			workProjectService.delete(workProjectService.get(id));
+		}
+		addMessage(redirectAttributes, "删除项目管理成功");
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+	}
+	
+	/**
+	 * 导出excel文件
+	 */
+	@RequiresPermissions("workproject:workProject:export")
+    @RequestMapping(value = "export", method=RequestMethod.POST)
+    public String exportFile(WorkProject workProject, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目管理"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            Page<WorkProject> page = workProjectService.findPage(new Page<WorkProject>(request, response, -1), workProject);
+    		new ExportExcel("项目管理", WorkProject.class).setDataList(page.getList()).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导出项目管理记录失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+    }
+
+	/**
+	 * 导入Excel数据
+
+	 */
+	@RequiresPermissions("workproject:workProject:import")
+    @RequestMapping(value = "import", method=RequestMethod.POST)
+    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+		try {
+			int successNum = 0;
+			int failureNum = 0;
+			StringBuilder failureMsg = new StringBuilder();
+			ImportExcel ei = new ImportExcel(file, 1, 0);
+			List<WorkProject> list = ei.getDataList(WorkProject.class);
+			for (WorkProject workProject : list){
+				try{
+					workProjectService.save(workProject);
+					successNum++;
+				}catch(ConstraintViolationException ex){
+					failureNum++;
+				}catch (Exception ex) {
+					failureNum++;
+				}
+			}
+			if (failureNum>0){
+				failureMsg.insert(0, ",失败 "+failureNum+" 条项目管理记录。");
+			}
+			addMessage(redirectAttributes, "已成功导入 "+successNum+" 条项目管理记录"+failureMsg);
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入项目管理失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+    }
+	
+	/**
+	 * 下载导入项目管理数据模板
+	 */
+	@RequiresPermissions("workproject:workProject:import")
+    @RequestMapping(value = "import/template")
+    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+		try {
+            String fileName = "项目管理数据导入模板.xlsx";
+    		List<WorkProject> list = Lists.newArrayList(); 
+    		new ExportExcel("项目管理数据", WorkProject.class, 1).setDataList(list).write(response, fileName).dispose();
+    		return null;
+		} catch (Exception e) {
+			addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
+		}
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/?repage";
+    }
+	
+	
+	/**
+	 * 选择合同外键
+	 */
+	@RequestMapping(value = "selectcontractId")
+	public String selectcontractId(WorkContractInfo contractId, String url, String fieldLabels, String fieldKeys, String searchLabel, String searchKey, HttpServletRequest request, HttpServletResponse response, Model model) {
+		Page<WorkContractInfo> page = workProjectService.findPageBycontractId(new Page<WorkContractInfo>(request, response),  contractId);
+		try {
+			fieldLabels = URLDecoder.decode(fieldLabels, "UTF-8");
+			fieldKeys = URLDecoder.decode(fieldKeys, "UTF-8");
+			searchLabel = URLDecoder.decode(searchLabel, "UTF-8");
+			searchKey = URLDecoder.decode(searchKey, "UTF-8");
+		} catch (UnsupportedEncodingException e) {
+			e.printStackTrace();
+		}
+		model.addAttribute("labelNames", fieldLabels.split("\\|"));
+		model.addAttribute("labelValues", fieldKeys.split("\\|"));
+		model.addAttribute("fieldLabels", fieldLabels);
+		model.addAttribute("fieldKeys", fieldKeys);
+		model.addAttribute("url", url);
+		model.addAttribute("searchLabel", searchLabel);
+		model.addAttribute("searchKey", searchKey);
+		model.addAttribute("obj", contractId);
+		model.addAttribute("page", page);
+		return "modules/sys/gridselect";
+	}
+	/**
+	 * 保存项目归档
+	 */
+	@RequestMapping(value = "startProcess")
+	public String startProcess(WorkProject workProject, Model model, RedirectAttributes redirectAttributes) throws Exception{
+		WorkFullRecord workFullRecord = new WorkFullRecord();
+		if(StringUtils.isNotBlank(workProject.getState())&&workProject.getState().equals("3")){
+			WorkFullRecord workFullRecord1 = workFullRecordService.findUniqueByProperty("work_full_manage_id", workProject.getId());
+			if(workFullRecord1!=null){
+				//workFullRecord = workFullRecord1;
+				workFullRecord = workFullRecordService.gett(workFullRecord1.getId());
+				model.addAttribute("workFullRecord", workFullRecord);
+				return "modules/workproject/workRecordView";
+			}
+		}
+		WorkProject workProject1 = workProjectService.get(workProject.getId());
+		workFullRecord.setWorkProject(workProject1);
+		workFullRecord.setRecordNumber(workProject1.getNumber());
+		workFullRecord.setRecordName(workProject1.getName());
+		model.addAttribute("workFullRecord", workFullRecord);
+		/*if (StringUtils.isNotBlank(workProject.getName()) && workProject.getName().equals("view")){
+			WorkFullRecord workFullRecord1 = workFullRecordService.findUniqueByProperty("work_full_manage_id", workBidingProject.getId());
+			workFullRecord1.setWorkBidingProject(workBidingProject1);
+			workFullRecord1.setRecordNumber(workBidingProject1.getProjectNumber());
+			workFullRecord1.setRecordName(workBidingProject1.getProjectName());
+			model.addAttribute("workFullRecord", workFullRecord1);
+			return "modules/workaftermath/workRecordView";
+		}*/
+		return "modules/workproject/workRecordForm";
+	}
+	/**
+	 * 项目归档
+	 */
+	@RequestMapping(value = "updateRd")
+	public String updateRd(WorkFullRecord workFullRecord,HttpServletRequest request, RedirectAttributes redirectAttributes) {
+
+		String bid=  workFullRecord.getWorkProject().getId();
+		WorkProject workProject = workProjectService.get(bid);
+		WorkFullRecord workFullManageId = workFullRecordService.findUniqueByProperty("work_full_manage_id", bid);
+		if(workFullManageId != null){
+			addMessage(redirectAttributes, "项目归档已申请,不能重新申请");
+			return "redirect:"+Global.getAdminPath()+"/workproject/workProject/list";
+		}
+		//workFullManageId.preInsert();
+		workFullRecord.setCompanyId(UserUtils.getSelectCompany().getId());
+		WorkFullManage w = new WorkFullManage();
+		w.setId(bid);
+		workFullRecord.setWorkFullManage(w);
+		workFullRecord.setOfficeId(workProject.getOfficeId()==null?"":workProject.getOfficeId());
+		workFullRecord.setType("5");
+		workFullRecord.setBackRecordStatus(VarStr.BACKRECORD_STATUS[1]);
+		workFullRecordService.save(workFullRecord);
+
+
+		//Role r = new Role();
+		//r.setEnname(gly.toString());
+		//Role rolegd =  roleDao.getByEnname(r);
+		//List<User> userList = systemService.findUser(new User(new Role(rolegd.getId())));
+		//workFullManageId.setManageUser(userList==null||userList.size()==0?"":userList.get(0).getId());
+		//workFullRecordService.startposs(workFullManageId,variables,false,"4",buffer.toString());//保存
+
+		workProject.setState("3");//此时项目由归档中变为已归档
+		workProjectDao.updateStatus(workProject);
+
+		WorkProjectNotify workProjectNotify = new WorkProjectNotify();
+		workProjectNotify.setRemarks("待通知");
+		workProjectNotify.setUser(workProject.getCreateBy());
+		workProjectNotify.setTitle("由您创建的项目:"+workProject.getName()+"已完成归档!");
+		workProjectNotify.setNotifyId(workFullRecord.getId());
+		workProjectNotify.setCompanyId(workFullRecord.getCompanyId());
+		workProjectNotify.setContent("项目已归档");
+		workProjectNotify.setType("31");
+		workProjectNotify.setStatus("0");
+		workProjectNotifyService.save(workProjectNotify);
+		addMessage(redirectAttributes, "归档完成");
+		return "redirect:"+Global.getAdminPath()+"/workproject/workProject/list";
+	}
+
+}

+ 20 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/dao/WorkProjectCalcBuildDao.java

@@ -0,0 +1,20 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprojectcalc.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcBuild;
+
+/**
+ * 工程计算量底稿DAO接口
+ * @author 马鹏波
+ * @version 2018-06-06
+ */
+@MyBatisDao
+public interface WorkProjectCalcBuildDao extends CrudDao<WorkProjectCalcBuild> {
+
+    int deleteByProId(WorkProjectCalcBuild workProjectCalcBuild);
+
+}

+ 19 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/dao/WorkProjectCalcDecorDao.java

@@ -0,0 +1,19 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprojectcalc.dao;
+
+import com.jeeplus.common.persistence.CrudDao;
+import com.jeeplus.common.persistence.annotation.MyBatisDao;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcDecor;
+
+/**
+ * 工程计算量底稿-装饰DAO接口
+ * @author 马鹏波
+ * @version 2018-06-06
+ */
+@MyBatisDao
+public interface WorkProjectCalcDecorDao extends CrudDao<WorkProjectCalcDecor> {
+
+    int deleteByProId(WorkProjectCalcDecor workProjectCalcDecor);
+}

+ 115 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/entity/WorkProjectCalcBuild.java

@@ -0,0 +1,115 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprojectcalc.entity;
+
+
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * 工程计算量底稿Entity
+ * @author 马鹏波
+ * @version 2018-06-06
+ */
+public class WorkProjectCalcBuild extends DataEntity<WorkProjectCalcBuild> {
+	
+	private static final long serialVersionUID = 1L;
+	private String buildNumber;		// 序号
+	private String buildCode;		// 清单编码/定额编码
+	private String projectName;		// 项目名称
+	private String buildUnit;		// 计量单位
+	private String buildMode;		// 计算式/索引
+	private String buildOther;		// 其他
+	private String buildIndex;		// 分项式索引
+	private String buildSize;		//工程量
+	private String projectId;		//项目编号
+	
+	public WorkProjectCalcBuild() {
+		super();
+	}
+
+	public WorkProjectCalcBuild(String id){
+		super(id);
+	}
+
+	@ExcelField(title="序号", align=2, sort=7)
+	public String getBuildNumber() {
+		return buildNumber;
+	}
+
+	public void setBuildNumber(String buildNumber) {
+		this.buildNumber = buildNumber;
+	}
+	
+	@ExcelField(title="清单编码/定额编码", align=2, sort=8)
+	public String getBuildCode() {
+		return buildCode;
+	}
+
+	public void setBuildCode(String buildCode) {
+		this.buildCode = buildCode;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=9)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="计量单位", align=2, sort=10)
+	public String getBuildUnit() {
+		return buildUnit;
+	}
+
+	public void setBuildUnit(String buildUnit) {
+		this.buildUnit = buildUnit;
+	}
+	
+	@ExcelField(title="计算式/索引", align=2, sort=11)
+	public String getBuildMode() {
+		return buildMode;
+	}
+
+	public void setBuildMode(String buildMode) {
+		this.buildMode = buildMode;
+	}
+	
+	@ExcelField(title="其他", align=2, sort=12)
+	public String getBuildOther() {
+		return buildOther;
+	}
+
+	public void setBuildOther(String buildOther) {
+		this.buildOther = buildOther;
+	}
+	
+	@ExcelField(title="分项式索引", align=2, sort=13)
+	public String getBuildIndex() {
+		return buildIndex;
+	}
+
+	public void setBuildIndex(String buildIndex) {
+		this.buildIndex = buildIndex;
+	}
+
+
+	public String getBuildSize() {
+		return buildSize;
+	}
+
+	public void setBuildSize(String buildSize) {
+		this.buildSize = buildSize;
+	}
+
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+}

+ 137 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/entity/WorkProjectCalcDecor.java

@@ -0,0 +1,137 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprojectcalc.entity;
+
+
+import com.google.common.collect.Lists;
+import com.jeeplus.common.persistence.DataEntity;
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+import java.util.List;
+
+/**
+ * 工程计算量底稿-装饰Entity
+ * @author 马鹏波
+ * @version 2018-06-06
+ */
+public class WorkProjectCalcDecor extends DataEntity<WorkProjectCalcDecor> {
+	
+	private static final long serialVersionUID = 1L;
+	private String decorNumber;		// 序号
+	private String decorCode;		// 清单编码/定额编码
+	private String projectName;		// 项目名称
+	private String decorUnit;		// 计量单位
+	private String decorMode;		// 计算式
+	private String decorSize;		// 工程量
+	private String decorOther;		// 其他
+	private String decorOrigin;		// 工程量来源
+	private String projectId;		// 项目编号
+	private List<WorkProjectCalcBuild> workProjectCalcBuildList = Lists.newArrayList();
+	private List<WorkProjectCalcDecor> workProjectCalcDecorList = Lists.newArrayList();
+	
+	public WorkProjectCalcDecor() {
+		super();
+	}
+
+	public WorkProjectCalcDecor(String id){
+		super(id);
+	}
+
+	@ExcelField(title="序号", align=2, sort=7)
+	public String getDecorNumber() {
+		return decorNumber;
+	}
+
+	public void setDecorNumber(String decorNumber) {
+		this.decorNumber = decorNumber;
+	}
+	
+	@ExcelField(title="清单编码/定额编码", align=2, sort=8)
+	public String getDecorCode() {
+		return decorCode;
+	}
+
+	public void setDecorCode(String decorCode) {
+		this.decorCode = decorCode;
+	}
+	
+	@ExcelField(title="项目名称", align=2, sort=9)
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName = projectName;
+	}
+	
+	@ExcelField(title="计量单位", align=2, sort=10)
+	public String getDecorUnit() {
+		return decorUnit;
+	}
+
+	public void setDecorUnit(String decorUnit) {
+		this.decorUnit = decorUnit;
+	}
+	
+	@ExcelField(title="计算式", align=2, sort=11)
+	public String getDecorMode() {
+		return decorMode;
+	}
+
+	public void setDecorMode(String decorMode) {
+		this.decorMode = decorMode;
+	}
+	
+	@ExcelField(title="工程量", align=2, sort=12)
+	public String getDecorSize() {
+		return decorSize;
+	}
+
+	public void setDecorSize(String decorSize) {
+		this.decorSize = decorSize;
+	}
+	
+	@ExcelField(title="其他", align=2, sort=13)
+	public String getDecorOther() {
+		return decorOther;
+	}
+
+	public void setDecorOther(String decorOther) {
+		this.decorOther = decorOther;
+	}
+	
+	@ExcelField(title="工程量来源", align=2, sort=14)
+	public String getDecorOrigin() {
+		return decorOrigin;
+	}
+
+	public void setDecorOrigin(String decorOrigin) {
+		this.decorOrigin = decorOrigin;
+	}
+	
+	@ExcelField(title="项目编号", align=2, sort=15)
+	public String getProjectId() {
+		return projectId;
+	}
+
+	public void setProjectId(String projectId) {
+		this.projectId = projectId;
+	}
+
+	public List<WorkProjectCalcBuild> getWorkProjectCalcBuildList() {
+		return workProjectCalcBuildList;
+	}
+
+	public void setWorkProjectCalcBuildList(List<WorkProjectCalcBuild> workProjectCalcBuildList) {
+		this.workProjectCalcBuildList = workProjectCalcBuildList;
+	}
+
+	public List<WorkProjectCalcDecor> getWorkProjectCalcDecorList() {
+		return workProjectCalcDecorList;
+	}
+
+	public void setWorkProjectCalcDecorList(List<WorkProjectCalcDecor> workProjectCalcDecorList) {
+		this.workProjectCalcDecorList = workProjectCalcDecorList;
+	}
+}

+ 50 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/service/WorkProjectCalcBuildService.java

@@ -0,0 +1,50 @@
+/**
+ * Copyright &copy; 2015-2020 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.modules.workprojectcalc.service;
+
+import java.util.List;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeeplus.common.persistence.Page;
+import com.jeeplus.common.service.CrudService;
+import com.jeeplus.modules.workprojectcalc.entity.WorkProjectCalcBuild;
+import com.jeeplus.modules.workprojectcalc.dao.WorkProjectCalcBuildDao;
+
+/**
+ * 工程计算量底稿Service
+ * @author 马鹏波
+ * @version 2018-06-06
+ */
+@Service
+@Transactional(readOnly = true)
+public class WorkProjectCalcBuildService extends CrudService<WorkProjectCalcBuildDao, WorkProjectCalcBuild> {
+
+	public WorkProjectCalcBuild get(String id) {
+		return super.get(id);
+	}
+	
+	public List<WorkProjectCalcBuild> findList(WorkProjectCalcBuild workProjectCalcBuild) {
+		return super.findList(workProjectCalcBuild);
+	}
+	
+	public Page<WorkProjectCalcBuild> findPage(Page<WorkProjectCalcBuild> page, WorkProjectCalcBuild workProjectCalcBuild) {
+		return super.findPage(page, workProjectCalcBuild);
+	}
+	
+	@Transactional(readOnly = false)
+	public void save(WorkProjectCalcBuild workProjectCalcBuild) {
+		super.save(workProjectCalcBuild);
+	}
+	
+	@Transactional(readOnly = false)
+	public void delete(WorkProjectCalcBuild workProjectCalcBuild) {
+		super.delete(workProjectCalcBuild);
+	}
+	
+	
+	
+	
+}

+ 0 - 0
src/main/java/com/jeeplus/modules/workprojectcalc/service/WorkProjectCalcDecorService.java


Неке датотеке нису приказане због велике количине промена