Browse Source

移动端功能相关代码调整

wangqiang 1 year atrás
parent
commit
db96645876
23 changed files with 1517 additions and 54 deletions
  1. 1 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/constant/FlowableConstant.java
  2. 5 5
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableProcessController.java
  3. 7 7
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java
  4. 2 0
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/model/Flow.java
  5. 24 5
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowProcessService.java
  6. 135 34
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java
  7. 1 1
      jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java
  8. 12 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/controller/HandoverController.java
  9. 4 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/domain/Handover.java
  10. 6 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/mapper/HandoverMapper.java
  11. 9 1
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/mapper/xml/HandoverMapper.xml
  12. 31 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverService.java
  13. 131 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/controller/HolidayController.java
  14. 64 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/domain/Holiday.java
  15. 42 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/mapper/HolidayMapper.java
  16. 142 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/mapper/xml/HolidayMapper.xml
  17. 356 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/service/HolidayService.java
  18. 96 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/service/dto/HolidayDTO.java
  19. 323 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/utils/EasyPoiUtil.java
  20. 75 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/utils/ExcelDiceAddressListHandlerImpl.java
  21. 5 0
      jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/purchase/domain/MaterialBasic.java
  22. 45 0
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/app/AppUserController.java
  23. 1 1
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

+ 1 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/constant/FlowableConstant.java

@@ -21,5 +21,6 @@ public interface FlowableConstant {
     String AFTER_ADDSIGN = "after";    //后加签
     String BEFORE_ADDSIGN = "before";    //前加签
     String RECORDTYPE="recordType";   //项目类型
+    String DAYS="days"; //请假天数
 
 }

+ 5 - 5
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableProcessController.java

@@ -46,11 +46,11 @@ public class FlowableProcessController {
      * 流程定义列表
      */
     @GetMapping("list")
-    public ResponseEntity processListData(Page <Map> page, String category) {
+    public ResponseEntity processListData(Page <Map> page, String category,String type) {
         /*
          * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
          */
-        page = flowProcessService.processList ( page, category );
+        page = flowProcessService.processList ( page, category, type );
         return ResponseEntity.ok ( page );
     }
 
@@ -253,7 +253,7 @@ public class FlowableProcessController {
         /*
          * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
          */
-        page = flowProcessService.processList(page, "");
+        page = flowProcessService.processList(page, "","");
         List<Map> records = page.getRecords();
         Map resultMap = new HashMap();
         for (Map map : records) {
@@ -272,7 +272,7 @@ public class FlowableProcessController {
         /*
          * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
          */
-        page = flowProcessService.processList(page, "");
+        page = flowProcessService.processList(page, "", "");
         List<Map> records = page.getRecords();
         Map resultMap = new HashMap();
         for (Map map : records) {
@@ -291,7 +291,7 @@ public class FlowableProcessController {
         /*
          * 保存两个对象,一个是ProcessDefinition(流程定义),一个是Deployment(流程部署)
          */
-        page = flowProcessService.processList(page, "");
+        page = flowProcessService.processList(page, "", "");
         List<Map> records = page.getRecords();
         Map resultMap = new HashMap();
         for (Map map : records) {

+ 7 - 7
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/controller/FlowableTaskController.java

@@ -87,8 +87,8 @@ public class FlowableTaskController {
     private IMailApi mailApi;
 
     @GetMapping("todo")
-    public ResponseEntity todoListData(Page <ProcessVo> page, Flow flow) {
-        page = flowTaskService.todoList ( page, flow );
+    public ResponseEntity todoListData(Page <ProcessVo> page, Flow flow, String type) {
+        page = flowTaskService.todoList ( page, flow, type );
         return ResponseEntity.ok ( page );
     }
 
@@ -98,8 +98,8 @@ public class FlowableTaskController {
      * @return
      */
     @GetMapping("historic")
-    public ResponseEntity historicListData(Page <HisTaskVo> page, Flow flow) {
-        page = flowTaskService.historicList ( page, flow );
+    public ResponseEntity historicListData(Page <HisTaskVo> page, Flow flow,String type) {
+        page = flowTaskService.historicList ( page, flow ,type);
         return ResponseEntity.ok ( page );
     }
 
@@ -109,8 +109,8 @@ public class FlowableTaskController {
      * @return
      */
     @GetMapping("myApplyed")
-    public ResponseEntity myApplyedListData(Page <ProcessVo> page, Flow flow) throws Exception {
-        page = flowTaskService.getMyStartedProcIns ( userApi.getByToken ( TokenProvider.getCurrentToken ( ) ), page, flow );
+    public ResponseEntity myApplyedListData(Page <ProcessVo> page, Flow flow, String type) throws Exception {
+        page = flowTaskService.getMyStartedProcIns ( userApi.getByToken ( TokenProvider.getCurrentToken ( ) ), page, flow, type );
         return ResponseEntity.ok ( page );
     }
 
@@ -169,7 +169,7 @@ public class FlowableTaskController {
      */
     @PostMapping("start")
     public ResponseEntity start(@RequestBody Flow flow) {
-        String procInsId = flowTaskService.startProcess ( flow.getProcDefKey ( ), flow.getBusinessTable ( ), flow.getBusinessId ( ), flow.getTitle ( ),flow.getRecordType(), flow.getProcDefId() );
+        String procInsId = flowTaskService.startProcess ( flow.getProcDefKey ( ), flow.getBusinessTable ( ), flow.getBusinessId ( ), flow.getTitle ( ),flow.getRecordType(), flow.getProcDefId(),flow.getDays() );
 
         //指定下一步处理人
         if ( StringUtils.isNotBlank ( flow.getAssignee ( ) ) ) {

+ 2 - 0
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/model/Flow.java

@@ -27,6 +27,8 @@ public class Flow {
 
     private static final long serialVersionUID = 1L;
 
+    private String days;// 请假天数
+
     private String taskId;        // 任务编号
     private String taskName;    // 任务名称
     private String taskDefKey;    // 任务定义Key(任务环节标识)

+ 24 - 5
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowProcessService.java

@@ -14,6 +14,7 @@ import com.jeeplus.common.TokenProvider;
 import com.jeeplus.flowable.constant.FlowableConstant;
 import com.jeeplus.flowable.model.TaskComment;
 import com.jeeplus.flowable.service.converter.json.FlowModelService;
+import com.jeeplus.flowable.utils.StringUtils;
 import com.jeeplus.flowable.vo.ActionType;
 import com.jeeplus.flowable.vo.ProcessStatus;
 import com.jeeplus.flowable.vo.ProcessVo;
@@ -63,10 +64,7 @@ import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import java.io.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 import java.util.zip.ZipInputStream;
 
@@ -136,7 +134,7 @@ public class FlowProcessService {
      * 流程定义列表
      */
     @InterceptorIgnore(tenantLine = "true")
-    public Page <Map> processList(Page <Map> page, String category) {
+    public Page <Map> processList(Page <Map> page, String category,String type) {
         ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery ( )/*.processDefinitionTenantId ( tenantApi.getCurrentTenantId ( ) )*/.active ( )
                 .latestVersion ( ).orderByProcessDefinitionKey ( ).asc ( );
         if ( StrUtil.isNotEmpty ( category ) ) {
@@ -144,6 +142,27 @@ public class FlowProcessService {
         }
 
         List <ProcessDefinition> processDefinitionList = processDefinitionQuery.list ( );
+
+        if (StringUtils.isNotBlank(type)) {
+            if (type.equals("ydd")) {
+                // 创建一个包含需要保留的流程定义名称的集合
+                List<String> requiredNames = Arrays.asList("物资管理-领用申请", "物资管理-采购申请", "日常办公-请假申请", "离职申请", "离职交接申请", "会计-报销审批");
+                /**
+                 * 移动端工作台数据处理
+                 */
+                // 使用流操作筛选出符合条件的流程定义
+                //它首先创建了一个包含需要保留的流程定义名称的集合 requiredNames,
+                // 然后使用 stream() 方法将流程定义列表转换为流,
+                // 接着使用 filter 方法筛选出名称在 requiredNames 中的流程定义,
+                // 最后使用 collect 方法将结果收集到一个新的列表中
+                List<ProcessDefinition> newList = processDefinitionList.stream()
+                        .filter(processDefinition -> requiredNames.contains(processDefinition.getName()))
+                        .collect(Collectors.toList());
+                processDefinitionList.clear();
+                processDefinitionList.addAll(newList);
+            }
+        }
+
         List records = Lists.newArrayList ( );
         for (ProcessDefinition processDefinition : processDefinitionList) {
             if ( this.isAuth ( userApi.getByToken ( TokenProvider.getCurrentToken ( ) ), processDefinition.getId ( ) ) ) {

+ 135 - 34
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/FlowTaskService.java

@@ -38,6 +38,7 @@ import org.flowable.engine.*;
 import org.flowable.engine.history.HistoricActivityInstance;
 import org.flowable.engine.history.HistoricProcessInstance;
 import org.flowable.engine.history.HistoricProcessInstanceQuery;
+import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.runtime.ActivityInstance;
 import org.flowable.engine.runtime.ProcessInstance;
 import org.flowable.task.api.DelegationState;
@@ -351,7 +352,7 @@ public class FlowTaskService {
      *
      * @return
      */
-    public Page <ProcessVo> todoList(Page <ProcessVo> page, Flow flow) {
+    public Page <ProcessVo> todoList(Page <ProcessVo> page, Flow flow, String type) {
         List <HashMap <String, String>> result = new ArrayList <HashMap <String, String>> ( );
         String userId = userApi.getByToken ( TokenProvider.getCurrentToken ( ) ).getId ( );//ObjectUtils.toString(UserUtils.getUser().getId());
         // =============== 已经签收或者等待签收的任务  ===============
@@ -390,28 +391,48 @@ public class FlowTaskService {
         }
         List records = Lists.newArrayList ( );
         for (Task task : todoList) {
-            Process process = SpringUtil.getBean ( RepositoryService.class ).getBpmnModel ( task.getProcessDefinitionId ( ) ).getMainProcess ( );
-            ProcessVo processVo = new ProcessVo ( );
-            TaskVo taskVo = new TaskVo ( task );
-            taskVo.setProcessDefKey ( process.getId ( ) );
-            processVo.setTask ( taskVo );
-            processVo.setVars ( task.getProcessVariables ( ) );
-            processVo.setProcessDefinitionName ( ProcessDefCache.get ( task.getProcessDefinitionId ( ) ).getName ( ) );
-            processVo.setVersion ( ProcessDefCache.get ( task.getProcessDefinitionId ( ) ).getVersion ( ) );
-            processVo.setStatus ( "todo" );
-            records.add ( processVo );
+
+            String processDefinitionId = task.getProcessDefinitionId();
+            String processName = ProcessDefCache.get(processDefinitionId).getName();
+
+            // 如果类型为 "ydd" 并且流程名称满足条件,或者类型为空
+            if (("ydd".equals(type) && isRequiredProcess(processName)) || StringUtils.isBlank(type)) {
+                Process process = SpringUtil.getBean ( RepositoryService.class ).getBpmnModel ( task.getProcessDefinitionId ( ) ).getMainProcess ( );
+
+                ProcessVo processVo = new ProcessVo();
+                TaskVo taskVo = new TaskVo(task);
+
+                taskVo.setProcessDefKey ( process.getId ( ) );
+                processVo.setTask(taskVo);
+                processVo.setVars(task.getProcessVariables());
+                processVo.setProcessDefinitionName(processName);
+                processVo.setVersion(ProcessDefCache.get(processDefinitionId).getVersion());
+                processVo.setStatus("todo");
+
+                records.add(processVo);
+            }
         }
         page.setRecords ( records );
         return page;
     }
 
+    // 判断流程名称是否满足条件
+    private boolean isRequiredProcess(String processName) {
+        return processName.equals("物资管理-领用申请") ||
+                processName.equals("物资管理-采购申请") ||
+                processName.equals("日常办公-请假申请") ||
+                processName.equals("离职申请") ||
+                processName.equals("离职交接申请") ||
+                processName.equals("会计-报销审批") ;
+    }
+
     /**
      * 获取已办任务列表
      *
      * @param page
      * @return
      */
-    public Page <HisTaskVo> historicList(Page <HisTaskVo> page, Flow act) {
+    public Page <HisTaskVo> historicList(Page <HisTaskVo> page, Flow act,String type) {
         String userId = userApi.getByToken ( TokenProvider.getCurrentToken ( ) ).getId ( );
 
         HistoricTaskInstanceQuery histTaskQuery = historyService.createHistoricTaskInstanceQuery ( ).taskAssignee ( userId ).finished ( )
@@ -447,28 +468,84 @@ public class FlowTaskService {
 
         List records = Lists.newArrayList ( );
         for (HistoricTaskInstance histTask : histList) {
-            HisTaskVo hisTaskVo = new HisTaskVo ( histTask );
-            hisTaskVo.setProcessDefinitionName ( ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ) );
-            hisTaskVo.setBack ( isBack ( histTask ) );
-            List <Task> currentTaskList = taskService.createTaskQuery ( ).processInstanceId ( histTask.getProcessInstanceId ( ) ).list ( );
-            if ( ((List) currentTaskList).size ( ) > 0 ) {
-                TaskVo currentTaskVo = new TaskVo ( currentTaskList.get ( 0 ) );
-                hisTaskVo.setCurrentTask ( currentTaskVo );
+
+            String processDefinitionId = histTask.getProcessDefinitionId();
+            String processName = ProcessDefCache.get(processDefinitionId).getName();
+            if (("ydd".equals(type) && isRequiredProcess(processName)) || StringUtils.isBlank(type)){
+                HisTaskVo hisTaskVo = new HisTaskVo ( histTask );
+                hisTaskVo.setProcessDefinitionName ( ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ) );
+                hisTaskVo.setBack ( isBack ( histTask ) );
+                List <Task> currentTaskList = taskService.createTaskQuery ( ).processInstanceId ( histTask.getProcessInstanceId ( ) ).list ( );
+                if ( ((List) currentTaskList).size ( ) > 0 ) {
+                    TaskVo currentTaskVo = new TaskVo ( currentTaskList.get ( 0 ) );
+                    hisTaskVo.setCurrentTask ( currentTaskVo );
+                }
+
+                // 获取意见评论内容
+                List <TaskComment> commentList = this.getTaskComments ( histTask.getId ( ) );
+                if ( commentList.size ( ) > 0 ) {
+                    TaskComment comment = commentList.get ( commentList.size ( ) - 1 );
+                    hisTaskVo.setComment ( comment.getMessage ( ) );
+                    hisTaskVo.setLevel ( comment.getLevel ( ) );
+                    hisTaskVo.setType ( comment.getType ( ) );
+                    hisTaskVo.setStatus ( comment.getStatus ( ) );
+
+                }
+                records.add ( hisTaskVo );
             }
+            /*if (StringUtils.isNotBlank(type)) {
+                if (type.equals("ydd")) {
+                    if (ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ).equals("物资管理-领用申请") ||
+                            ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ).equals("物资管理-采购申请") ||
+                            ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ).equals("日常办公-请假申请")){
+                        HisTaskVo hisTaskVo = new HisTaskVo ( histTask );
+                        hisTaskVo.setProcessDefinitionName ( ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ) );
+                        hisTaskVo.setBack ( isBack ( histTask ) );
+                        List <Task> currentTaskList = taskService.createTaskQuery ( ).processInstanceId ( histTask.getProcessInstanceId ( ) ).list ( );
+                        if ( ((List) currentTaskList).size ( ) > 0 ) {
+                            TaskVo currentTaskVo = new TaskVo ( currentTaskList.get ( 0 ) );
+                            hisTaskVo.setCurrentTask ( currentTaskVo );
+                        }
 
 
-            // 获取意见评论内容
+                        // 获取意见评论内容
 
-            List <TaskComment> commentList = this.getTaskComments ( histTask.getId ( ) );
-            if ( commentList.size ( ) > 0 ) {
-                TaskComment comment = commentList.get ( commentList.size ( ) - 1 );
-                hisTaskVo.setComment ( comment.getMessage ( ) );
-                hisTaskVo.setLevel ( comment.getLevel ( ) );
-                hisTaskVo.setType ( comment.getType ( ) );
-                hisTaskVo.setStatus ( comment.getStatus ( ) );
+                        List <TaskComment> commentList = this.getTaskComments ( histTask.getId ( ) );
+                        if ( commentList.size ( ) > 0 ) {
+                            TaskComment comment = commentList.get ( commentList.size ( ) - 1 );
+                            hisTaskVo.setComment ( comment.getMessage ( ) );
+                            hisTaskVo.setLevel ( comment.getLevel ( ) );
+                            hisTaskVo.setType ( comment.getType ( ) );
+                            hisTaskVo.setStatus ( comment.getStatus ( ) );
 
-            }
-            records.add ( hisTaskVo );
+                        }
+                        records.add ( hisTaskVo );
+                    }
+                }
+            } else {
+                HisTaskVo hisTaskVo = new HisTaskVo ( histTask );
+                hisTaskVo.setProcessDefinitionName ( ProcessDefCache.get ( histTask.getProcessDefinitionId ( ) ).getName ( ) );
+                hisTaskVo.setBack ( isBack ( histTask ) );
+                List <Task> currentTaskList = taskService.createTaskQuery ( ).processInstanceId ( histTask.getProcessInstanceId ( ) ).list ( );
+                if ( ((List) currentTaskList).size ( ) > 0 ) {
+                    TaskVo currentTaskVo = new TaskVo ( currentTaskList.get ( 0 ) );
+                    hisTaskVo.setCurrentTask ( currentTaskVo );
+                }
+
+
+                // 获取意见评论内容
+
+                List <TaskComment> commentList = this.getTaskComments ( histTask.getId ( ) );
+                if ( commentList.size ( ) > 0 ) {
+                    TaskComment comment = commentList.get ( commentList.size ( ) - 1 );
+                    hisTaskVo.setComment ( comment.getMessage ( ) );
+                    hisTaskVo.setLevel ( comment.getLevel ( ) );
+                    hisTaskVo.setType ( comment.getType ( ) );
+                    hisTaskVo.setStatus ( comment.getStatus ( ) );
+
+                }
+                records.add ( hisTaskVo );
+            }*/
         }
         page.setRecords ( records );
         return page;
@@ -566,7 +643,7 @@ public class FlowTaskService {
      * @param user
      * @return
      */
-    public Page <ProcessVo> getMyStartedProcIns(UserDTO user, Page <ProcessVo> page, Flow flow) throws Exception {
+    public Page <ProcessVo> getMyStartedProcIns(UserDTO user, Page <ProcessVo> page, Flow flow, String type) throws Exception {
         HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery ( ).startedBy ( user.getId ( ) ).includeProcessVariables ( ).orderByProcessInstanceStartTime ( ).desc ( );
         if ( flow.getBeginDate ( ) != null ) {
             query.startedAfter ( flow.getBeginDate ( ) );
@@ -587,6 +664,27 @@ public class FlowTaskService {
             int size = (int) (page.getSize ( ));
             histList = query.involvedUser ( user.getId ( ) ).listPage ( start, size );
         }
+
+        if (StringUtils.isNotBlank(type)) {
+            if (type.equals("ydd")) {
+                // 创建一个包含需要保留的流程定义名称的集合
+                List<String> requiredNames = Arrays.asList("物资管理-领用申请", "物资管理-采购申请", "日常办公-请假申请", "离职申请", "离职交接申请", "会计-报销审批");
+                /**
+                 * 移动端工作台数据处理
+                 */
+                // 使用流操作筛选出符合条件的流程定义
+                //它首先创建了一个包含需要保留的流程定义名称的集合 requiredNames,
+                // 然后使用 stream() 方法将流程定义列表转换为流,
+                // 接着使用 filter 方法筛选出名称在 requiredNames 中的流程定义,
+                // 最后使用 collect 方法将结果收集到一个新的列表中
+                List<HistoricProcessInstance> newList = histList.stream()
+                        .filter(processDefinition -> requiredNames.contains(processDefinition.getProcessDefinitionName()))
+                        .collect(Collectors.toList());
+                histList.clear();
+                histList.addAll(newList);
+            }
+        }
+
         List records = Lists.newArrayList ( );
         for (HistoricProcessInstance historicProcessInstance : histList) {
             ProcessVo processVo = flowProcessService.queryProcessState ( historicProcessInstance.getProcessDefinitionId ( ), historicProcessInstance.getId ( ) );
@@ -615,9 +713,9 @@ public class FlowTaskService {
      * @param recordType    项目类型
      * @return 流程实例ID
      */
-    public String startProcess(String procDefKey, String businessTable, String businessId, String title,String recordType, String procDefId) {
+    public String startProcess(String procDefKey, String businessTable, String businessId, String title,String recordType, String procDefId,String days) {
         Map <String, Object> vars = Maps.newHashMap ( );
-        return startProcess ( procDefKey, businessTable, businessId, title,  vars ,recordType, procDefId);
+        return startProcess ( procDefKey, businessTable, businessId, title,  vars ,recordType, procDefId,days);
     }
 
     /**
@@ -698,7 +796,7 @@ public class FlowTaskService {
      * @return 流程实例ID
      */
     @SuppressWarnings("unused")
-    public String startProcess(String procDefKey, String businessTable, String businessId, String title, Map <String, Object> vars,String recordType,  String procDefId) {
+    public String startProcess(String procDefKey, String businessTable, String businessId, String title, Map <String, Object> vars,String recordType,  String procDefId,String days) {
         //String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId())
         // 设置流程变量
         if ( vars == null ) {
@@ -728,7 +826,10 @@ public class FlowTaskService {
         if (StrUtil.isNotBlank(recordType)){
             vars.put(FlowableConstant.RECORDTYPE,recordType);
         }
-
+        //设置请假天数
+        if (StrUtil.isNotBlank(days)){
+            vars.put(FlowableConstant.DAYS,days);
+        }
 
         // 启动流程
         ProcessInstance procIns = runtimeService.startProcessInstanceByKeyAndTenantId ( procDefKey, businessTable + ":" + businessId, vars, /*tenantApi.getCurrentTenantId ( )*/ flowMapper.getTenantIdByProcDefKey(procDefKey) );

+ 1 - 1
jeeplus-modules/jeeplus-flowable/src/main/java/com/jeeplus/flowable/service/MyNoticeService.java

@@ -136,7 +136,7 @@ public class MyNoticeService {
         if (StringUtils.isNotEmpty(taskName)) {
             notice.setTaskName(taskName);
         } else {
-            Page<Map> page = flowProcessService.processList(new Page<Map>(), "");
+            Page<Map> page = flowProcessService.processList(new Page<Map>(), "", "");
             List<Map> records = page.getRecords();
             Map resultMap = new HashMap();
             for (Map<String, String> map : records) {

+ 12 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/controller/HandoverController.java

@@ -41,6 +41,18 @@ public class HandoverController {
     }
 
     /**
+     * 查询是否有已完成的流程数据
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "查询是否有已完成的流程数据")
+    @GetMapping("/selectComplete")
+    public ResponseEntity<Boolean> selectComplete(){
+        Boolean s = handoverService.selectComplete();
+        return ResponseEntity.ok(s);
+    }
+
+    /**
      * 查询
      * @param id
      * @return

+ 4 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/domain/Handover.java

@@ -46,8 +46,12 @@ public class Handover extends BaseEntity {
 
     private String name;
     private String projectManager;      //项目经理
+    @TableField(exist = false)
+    private String projectManagerName;      //项目经理名称
     private String remarks;                 //备注
     private String department;              //所属部门
+    @TableField(exist = false)
+    private String departmentName;              //所属部门名称
     private String type;                //流程状态
     private String procInsId;
     private String processDefinitionId;

+ 6 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/mapper/HandoverMapper.java

@@ -35,4 +35,10 @@ public interface HandoverMapper extends BaseMapper<Handover> {
      */
     void updateSignatureUrl(Handover handover);
 
+    /**
+     * 根据离职申请表id查询离职申请表id
+     * @param userId
+     * @return
+     */
+    String getUserInfoByUserId(@Param("userId")String userId);
 }

+ 9 - 1
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/mapper/xml/HandoverMapper.xml

@@ -29,8 +29,13 @@
 
     <select id="getById" resultType="com.jeeplus.human.depart.handover.domain.Handover">
         select
-        <include refid="Base_Column_List"></include>
+        <include refid="Base_Column_List"></include>,
+        so.name as departmentName,
+        su2.name as projectManagerName
         from human_resources_depart_handover a
+        left join sys_user su on a.create_by_id = su.id
+        left join sys_office so on su.office_id = so.id
+        left join sys_user su2 on a.project_manager = su2.id
         where a.id = #{id} and a.del_flag = '0'
     </select>
     <select id="getUserInfoById" resultType="com.jeeplus.human.depart.handover.domain.Handover">
@@ -45,6 +50,9 @@
         from human_resources_depart_handover a
         where a.signature_contract_id = #{signatureContractId} and a.del_flag = '0'
     </select>
+    <select id="getUserInfoByUserId" resultType="java.lang.String">
+        select id FROM human_resources_depart_registration where create_by_id = #{userId} and del_flag = 0
+    </select>
 
     <update id="updateSignatureUrl">
         UPDATE human_resources_depart_handover SET signature_url = #{signatureUrl}

+ 31 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverService.java

@@ -10,6 +10,8 @@ import com.jeeplus.flowable.feign.IFinanceApi;
 import com.jeeplus.flowable.feign.IFlowableApi;
 import com.jeeplus.human.depart.handover.domain.*;
 import com.jeeplus.human.depart.handover.mapper.HandoverMapper;
+import com.jeeplus.human.depart.registration.domain.DepartRegistration;
+import com.jeeplus.human.depart.registration.mapper.DepartMapper;
 import com.jeeplus.human.enrollment.enrollmentRegistration.utils.HunamFreemarkerUtil;
 import com.jeeplus.human.signature.entity.*;
 import com.jeeplus.human.signature.utils.*;
@@ -87,6 +89,9 @@ public class HandoverService extends ServiceImpl<HandoverMapper, Handover> {
     private HandoverMapper mapper;
 
     @Resource
+    private DepartMapper departMapper;
+
+    @Resource
     private HandoverDraftService draftService;
 
     @Resource
@@ -111,6 +116,26 @@ public class HandoverService extends ServiceImpl<HandoverMapper, Handover> {
         mapper.updateStatusById(dto.getId(), dto.getType());
     }
 
+    public Boolean selectComplete() {
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        QueryWrapper<Handover> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("create_by_id",userDTO.getId());
+        queryWrapper.eq("del_flag","0");
+        Integer integer = mapper.selectCount(queryWrapper);
+
+
+        QueryWrapper<DepartRegistration> newWrapper = new QueryWrapper<>();
+        newWrapper.eq("create_by_id",userDTO.getId());
+        newWrapper.eq("del_flag","0");
+        newWrapper.eq("type","5");
+        Integer newInteger = departMapper.selectCount(newWrapper);
+        if (integer == 0 || newInteger == 0) {
+            return false;
+        }else {
+            return true;
+        }
+    }
+
     public Handover findById(String id) {
         // 查询基础信息表
         Handover info = mapper.getById(id);
@@ -363,6 +388,12 @@ public class HandoverService extends ServiceImpl<HandoverMapper, Handover> {
         String accountsAssignee = getAssignee(accountsRoleInfo.getId());
         report.setDraftAdministrator(accountsAssignee);
 
+        if (StringUtils.isBlank(report.getRegistrationId())) {
+            //移动端发起的话没有registrationId,所以根据发起人的id去离职表中查出离职申请表id
+            String registrationId = mapper.getUserInfoByUserId(report.getCreateById());
+            report.setRegistrationId(registrationId);
+        }
+
         mapper.insert(report);
 
         //根据freemarker模板生成离职证明XML文件

+ 131 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/controller/HolidayController.java

@@ -0,0 +1,131 @@
+package com.jeeplus.pubmodules.holiday.controller;
+
+import cn.hutool.extra.spring.SpringUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.common.excel.ExcelOptions;
+import com.jeeplus.common.excel.annotation.ExportMode;
+import com.jeeplus.common.utils.ResponseUtil;
+import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.pubmodules.holiday.domain.Holiday;
+import com.jeeplus.pubmodules.holiday.mapper.HolidayMapper;
+import com.jeeplus.pubmodules.holiday.service.HolidayService;
+import com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO;
+import com.jeeplus.pubmodules.holiday.utils.EasyPoiUtil;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Api(tags ="请假申请")
+@RestController
+@RequestMapping(value = "/holiday")
+public class HolidayController {
+
+    @Resource
+    private HolidayService holidayService;
+
+    @Resource
+    private HolidayMapper holidayMapper;
+
+
+    /**
+     * 列表
+     */
+    @ApiOperation(value = "请假申请列表")
+    @GetMapping(value = "/findList")
+    public ResponseEntity<IPage<HolidayDTO>> applyList(HolidayDTO holidayDTO, Page<HolidayDTO> page) throws Exception {
+        IPage<HolidayDTO> pageList=holidayService.findPageList(holidayDTO,page);
+        return ResponseEntity.ok(pageList);
+    }
+
+    /**
+     * 根据id查询数据
+     */
+    @ApiOperation(value = "根据id查询数据")
+    @GetMapping(value = "findById")
+    public ResponseEntity<HolidayDTO> findById(@RequestParam String id){
+        HolidayDTO holidayDTO=holidayService.findById(id);
+        return ResponseEntity.ok(holidayDTO);
+    }
+
+    /**
+     * 当请假类型为年假时进行校验
+     */
+    @ApiOperation(value = "校验请假类型")
+    @PostMapping(value = "checkType")
+    public ResponseEntity checkType(@RequestBody HolidayDTO holidayDTO){
+       String data= holidayService.checkType(holidayDTO);
+       return ResponseEntity.ok(data);
+    }
+
+
+    /*
+    新增或修改
+     */
+    @ApiOperation(value = "新增或修改")
+    @PostMapping(value = "/saveForm")
+    public ResponseEntity saveForm(@RequestBody HolidayDTO holidayDTO){
+        Holiday dto=holidayService.save(holidayDTO);
+        return ResponseUtil.newInstance().add("businessTable","jy_holiday").add("businessId",dto.getId()).add("days",dto.getDays()).ok("操作成功");
+    }
+
+    /**
+     * 根据id修改状态status
+     * @param
+     */
+    @ApiOperation(value = "根据id修改状态status")
+    @PostMapping(value = "/updateStatusById")
+    public void updateStatusById(@RequestBody HolidayDTO holidayDTO) {
+        holidayService.updateStatusById(holidayDTO);
+    }
+
+    /**
+     * 根据id进行删除
+     */
+    @ApiOperation(value = "根据id进行删除")
+    @DeleteMapping(value = "/delete")
+    public ResponseEntity<String> deleteById(@RequestParam String id){
+        String s = holidayService.deleteById(id);
+        return ResponseEntity.ok(s);
+    }
+
+    @ApiLog(value = "导出请假申请数据", type = LogTypeEnum.EXPORT)
+    @GetMapping("export")
+    @ApiOperation(value = "导出请假申请数据")
+    public void exportFile(HolidayDTO holidayDTO, Page <HolidayDTO> page, ExcelOptions options, HttpServletResponse response) throws Exception {
+        String fileName = options.getFilename();
+        String sheetName = options.getSheetName();
+        List<HolidayDTO> result = new ArrayList<>();
+        if ( ExportMode.current.equals ( options.getMode() ) ) {
+            result = holidayService.findPageList(holidayDTO,page).getRecords();
+        } else if (ExportMode.selected.equals ( options.getMode() )) {
+            result = holidayService.findPageList(holidayDTO,page).getRecords().stream ( ).filter ( item ->
+                    options.getSelectIds ( ).contains ( item.getId ( ) )
+            ).collect ( Collectors.toList ( ) );
+        } else {
+            page.setSize (-1);
+            page.setCurrent (0);
+            result = holidayService.findPageList(holidayDTO,page).getRecords();
+        }
+        EasyPoiUtil.exportExcel ( result, sheetName,  sheetName, HolidayDTO.class, fileName, response );
+
+    }
+
+
+
+}

+ 64 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/domain/Holiday.java

@@ -0,0 +1,64 @@
+package com.jeeplus.pubmodules.holiday.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+@TableName("jy_holiday")
+public class Holiday extends BaseEntity {
+
+    /**
+     * 请假开始时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date startDay;
+
+    private String beginTime;
+
+    /**
+     * 请假结束时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date endDay;
+
+    private String endTime;
+
+    /**
+     * 请假天数
+     */
+    private String days;
+
+    /**
+     * 请假类型
+     */
+    private String type;
+
+    /*
+    请假原因
+     */
+    private String reason;
+
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+    @TableField(exist = false)
+    private String taskId;
+
+    private String status;
+
+
+}

+ 42 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/mapper/HolidayMapper.java

@@ -0,0 +1,42 @@
+package com.jeeplus.pubmodules.holiday.mapper;
+
+import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.pubmodules.holiday.domain.Holiday;
+import com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+
+public interface HolidayMapper extends BaseMapper<Holiday> {
+
+    List<WorkAttachmentInfo> findList(@Param("id")String id);
+
+    Integer findIsExit(@Param("id")String id, @Param("name")String name);
+
+    List<WorkAttachmentInfo> findDtos(@Param("id") String id);
+
+    IPage<HolidayDTO> findPageList(@Param(Constants.WRAPPER) QueryWrapper<HolidayDTO> queryWrapper, Page<HolidayDTO> page);
+
+    @InterceptorIgnore(tenantLine = "true")
+    HolidayDTO findById(@Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    HolidayDTO findByUserId(@Param("id") String id);
+
+    List<HolidayDTO> selectByUserId(@Param("id") String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateStatusById(@Param("status")String status, @Param("id")String id);
+
+    @InterceptorIgnore(tenantLine = "true")
+    void updateByIdForApp(@Param("holiday")Holiday holiday);
+}

+ 142 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/mapper/xml/HolidayMapper.xml

@@ -0,0 +1,142 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeeplus.pubmodules.holiday.mapper.HolidayMapper">
+
+    <select id="findList" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+		SELECT * FROM work_attachment WHERE del_flag = 0 AND attachment_id = #{id}
+	</select>
+
+    <select id="findIsExit" resultType="java.lang.Integer">
+		SELECT
+			COUNT( 0 )
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+			AND attachment_name = #{name}
+	</select>
+
+    <select id="findDtos" resultType="com.jeeplus.sys.domain.WorkAttachmentInfo">
+		SELECT
+			id,
+			url,
+			attachment_name AS `name`,
+			create_by_id AS `by`,
+			create_time
+		FROM
+			work_attachment
+		WHERE
+			del_flag = 0
+			AND attachment_id = #{id}
+	</select>
+
+    <select id="findPageList" resultType="com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO">
+        select distinct
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.start_day,
+            a.begin_time,
+            a.end_day,
+            a.end_time,
+            a.days,
+            a.type,
+            a.proc_ins_id,
+            a.process_definition_id,
+            (select dv.label from sys_dict_value dv LEFT JOIN sys_dict_type dt on dt.id=dv.dict_type_id where dv.value=a.status and dt.type='program_project_list_info_status') as driveApplyStatus,
+            (select dv.label from sys_dict_value dv LEFT JOIN sys_dict_type dt on dt.id=dv.dict_type_id where dv.value=a.type and dt.type='jy_holiday_type') as holidayType,
+            concat(a.days,'天') as holidayDays,
+            a.status,
+            art1.ID_ as task_id,
+            su.name as createName,
+            so.name as officeName
+        from jy_holiday a
+        left join sys_user su on a.create_by_id = su.id and su.del_flag = '0'
+        left join sys_office so on su.office_id = so.id and so.del_flag = '0'
+        LEFT JOIN act_ru_task art1 ON a.proc_ins_id = art1.PROC_INST_ID_
+        left join sys_user_manage_office sumo on sumo.office_id = su.office_id
+         ${ew.customSqlSegment}
+        ORDER BY a.update_time DESC
+    </select>
+
+    <select id="findById" resultType="com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.start_day,
+            a.begin_time,
+            a.end_day,
+            a.end_time,
+            a.days,
+            a.type,
+            a.proc_ins_id,
+            a.process_definition_id,
+            a.status,
+            a.reason,
+            art1.ID_ as task_id,
+            su.name as createName,
+            so.name as officeName
+        from jy_holiday a
+        left join sys_user su on a.create_by_id = su.id and su.del_flag = '0'
+        left join sys_office so on su.office_id = so.id and so.del_flag = '0'
+        LEFT JOIN act_ru_task art1 ON a.proc_ins_id = art1.PROC_INST_ID_
+        where a.id = #{id}
+    </select>
+
+    <select id="findByUserId" resultType="com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO">
+        select
+            contract_start_date,
+            user_id
+        from human_resources_enrollment_registration
+        where user_id = #{id} and del_flag = '0'
+    </select>
+
+    <select id="selectByUserId" resultType="com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO">
+        select
+            a.id,
+            a.create_by_id,
+            a.create_time,
+            a.start_day,
+            a.begin_time,
+            a.end_day,
+            a.end_time,
+            a.days,
+            a.type,
+            a.proc_ins_id,
+            a.process_definition_id,
+            a.status,
+            a.reason,
+            art1.ID_ as task_id,
+            su.name as createName,
+            so.name as officeName
+        from jy_holiday a
+        left join sys_user su on a.create_by_id = su.id and su.del_flag = '0'
+        left join sys_office so on su.office_id = so.id and so.del_flag = '0'
+        LEFT JOIN act_ru_task art1 ON a.proc_ins_id = art1.PROC_INST_ID_
+        where a.create_by_id = #{id} and a.type = '1' and YEAR(a.create_time) = YEAR(CURDATE()) and a.del_flag = '0' and a.status = '5'
+    </select>
+
+    <update id="updateStatusById">
+        update jy_holiday set status = #{status} where id =#{id}
+    </update>
+    <update id="updateByIdForApp">
+        update jy_holiday
+        set
+        update_by_id = #{holiday.updateById},
+        update_time = #{holiday.updateTime},
+        start_day = #{holiday.startDay},
+        begin_time = #{holiday.beginTime},
+        end_day = #{holiday.endDay},
+        end_time = #{holiday.endTime},
+        days = #{holiday.days},
+        type = #{holiday.type},
+        reason = #{holiday.reason},
+        status = #{holiday.status}
+         WHERE id = #{holiday.id}
+    </update>
+
+</mapper>

+ 356 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/service/HolidayService.java

@@ -0,0 +1,356 @@
+package com.jeeplus.pubmodules.holiday.service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.common.TokenProvider;
+import com.jeeplus.core.query.QueryWrapperGenerator;
+import com.jeeplus.pubmodules.holiday.domain.Holiday;
+import com.jeeplus.pubmodules.holiday.mapper.HolidayMapper;
+import com.jeeplus.pubmodules.holiday.service.dto.HolidayDTO;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.feign.IWorkAttachmentApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.xml.crypto.Data;
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+
+@Service
+public class HolidayService {
+
+    @Resource
+    private HolidayMapper holidayMapper;
+
+    public IPage<HolidayDTO> findPageList(HolidayDTO holidayDTO, Page<HolidayDTO> page) throws Exception {
+        QueryWrapper<HolidayDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(holidayDTO, HolidayDTO.class);
+        queryWrapper.eq("a.del_flag",0);
+        //请假类型
+        if (StringUtils.isNotBlank(holidayDTO.getType())){
+            queryWrapper.eq("a.type",holidayDTO.getType());
+        }
+        //请假人
+        if (StringUtils.isNotBlank(holidayDTO.getCreateById())){
+            queryWrapper.eq("a.create_by_id",holidayDTO.getCreateById());
+        }
+        //申请人部门
+        if (StringUtils.isNotBlank(holidayDTO.getOfficeId())){
+            queryWrapper.eq("so.id",holidayDTO.getOfficeId());
+        }
+        //申请时间
+        if (holidayDTO.getDates() != null && holidayDTO.getDates().length > 0) {
+            queryWrapper.between("a.start_day", holidayDTO.getDates()[0], holidayDTO.getDates()[1]);
+        }
+        IPage<HolidayDTO> pageList=holidayMapper.findPageList(queryWrapper,page);
+        return pageList;
+    }
+
+    /**
+     * 根据id查询数据
+     * @param id
+     * @return
+     */
+    public HolidayDTO findById(String id) {
+        HolidayDTO holidayDTO=holidayMapper.findById(id);
+        // 查询附件信息
+        List<WorkAttachmentInfo> files = holidayMapper.findDtos(id);
+        if (CollectionUtils.isNotEmpty(files)) {
+            for (WorkAttachmentInfo i : files) {
+                i.setCreateBy(SpringUtil.getBean ( IUserApi.class ).getById(i.getBy()));
+            }
+            holidayDTO.setFiles(files);
+        }
+        return holidayDTO;
+    }
+
+    /**
+     * 校验年假
+     * @param holidayDTO
+     * @return
+     */
+    public String checkType(HolidayDTO holidayDTO) {
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        //获取当前登录人入职时间
+        HolidayDTO dto=holidayMapper.findByUserId(userDTO.getId());
+        //判断当前登录人是否有入职时间
+        if (ObjectUtils.isNotEmpty(dto)){
+            Date date=dto.getContractStartDate();
+            LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+            LocalDate intime = LocalDate.of(localDate.getYear(), localDate.getMonth(), localDate.getDayOfMonth());
+            //当前时间
+            LocalDate now = LocalDate.now();
+            //判断是否满一年
+            long yearsPassed = ChronoUnit.YEARS.between(intime, now); // 计算经过的年数
+            if (yearsPassed<1){
+                return "入职不满一年,无法休年假";
+            }
+            //计算员工入职时间距离今年还剩多少天
+            LocalDate inTime = LocalDate.of(now.getYear(), localDate.getMonth(), localDate.getDayOfMonth());
+            LocalDate endDate = LocalDate.of(now.getYear(), 12, 31);
+            long days = ChronoUnit.DAYS.between(inTime, endDate);
+            //计算今年一共有多少天
+            Calendar instance = Calendar.getInstance();
+            instance.setTime(new Date());
+            int daysInYear = instance.getActualMaximum(Calendar.DAY_OF_YEAR);
+            //判断员工入职是否满10年
+            long round=0;
+            //员工请假时间
+            double days1=0;
+            if (ObjectUtil.isNotEmpty(holidayDTO.getDays())){
+                days1=Double.parseDouble(holidayDTO.getDays());
+            }else {
+                return "请选择请假日期";
+            }
+            if (yearsPassed>=1 && yearsPassed<10){
+                //(当年剩余的天数/当年一共天数)*5
+                double yearDays=(double)days/daysInYear*5;
+                round = Math.round(yearDays);
+                if (days1>round){
+                    return "已超出可休年假天数,当年可休年假天数为"+round+"天";
+                }
+            }else if (yearsPassed>=10){
+                //(当年距离入职时间剩余的天数/当年一共天数)*10
+                double yearDays=(double)days/daysInYear*10;
+                round = Math.round(yearDays);
+                if (days1>round){
+                    return "已超出可休年假天数,当年可休年假天数为"+round+"天";
+                }
+            }
+            //当前员工当年是否休过年假
+            List<HolidayDTO> holidays = holidayMapper.selectByUserId(userDTO.getId());
+            Double holiday=0.00;
+            if (ObjectUtils.isNotEmpty(holidays)){
+                for (HolidayDTO holiday1 : holidays) {
+                    //获取已经休过的年假天数
+                    holiday+=Double.parseDouble(holiday1.getDays());
+                }
+                //员工可休年假天数与已休年假天数比较 获取剩余年假天数
+                double surplus=round-holiday;
+                //如果剩余年假天数小于等于0
+                if (surplus <= 0){
+                    return "当年无剩余年假,无法再休年假";
+                }else {
+                    //判断本次年假天数是否大于剩余年假天数
+                    if (days1>surplus){
+                        return "本次年假时间超出剩余年假天数,剩余年假"+surplus+"天";
+                    }
+                }
+            }else {
+                //若当年未休过年假,则计算剩余年假
+                holiday=round-days1;
+                //如果剩余年假天数小于等于0
+                if (holiday < 0){
+                    return "已超出可休年假天数,可休年假天数"+holiday+"天";
+                }
+            }
+            return "本次年假休息"+days1+"天,剩余年假"+holiday+"天";
+        }
+        return "您的入职信息不完善,请完善后再休年假";
+
+
+
+
+
+    }
+
+    /**
+     * 新增或修改
+     * @param holidayDTO
+     * @return
+     */
+    public Holiday save(HolidayDTO holidayDTO) {
+        //获取当前登录人信息
+        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken());
+        if (StringUtils.isNotBlank(holidayDTO.getId())){
+            return update(holidayDTO,userDTO);
+        }
+        return add(holidayDTO,userDTO);
+    }
+
+    private Holiday update(HolidayDTO holidayDTO, UserDTO userDTO) {
+        Holiday holiday = new Holiday();
+        BeanUtils.copyProperties(holidayDTO,holiday);
+        holiday.setUpdateById(userDTO.getId());
+        holiday.setUpdateTime(new Date());
+        holiday.setStartDay(holidayDTO.getStartDay());//开始日期
+        holiday.setBeginTime(holidayDTO.getBeginTime());//开始时间
+        holiday.setEndDay(holidayDTO.getEndDay());//结束日期
+        holiday.setEndTime(holidayDTO.getEndTime());//结束时间
+        holiday.setType(holidayDTO.getType());//请假类型
+        holiday.setDays(holidayDTO.getDays());//请假时长
+        holiday.setReason(holidayDTO.getReason());//请假原因
+        holiday.setStatus(holidayDTO.getStatus());
+        holidayMapper.updateByIdForApp(holiday);
+        //修改附件
+        if (CollectionUtils.isNotEmpty(holidayDTO.getFiles())){
+            List<WorkAttachmentInfo> files = holidayDTO.getFiles();
+            updateFiles(files, userDTO, holidayDTO.getId());
+        }
+        return holiday;
+    }
+    /**
+     * 修改附件信息
+     * @param list 待修改的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void updateFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id) {
+        int j = 1;
+        String names = new String();
+        //表中存在,但是传过来不存在,说明已删除,表中数据也要删除
+        for (WorkAttachmentInfo dto : list) {
+            names = names + "," +dto.getUrl();
+        }
+        //查询保存的附件信息
+        List<WorkAttachmentInfo> infoList = holidayMapper.findList(id);
+        if (CollectionUtil.isNotEmpty(infoList)) {
+            for (WorkAttachmentInfo i : infoList) {
+                if (!names.contains(i.getUrl())) {
+                    SpringUtil.getBean ( IWorkAttachmentApi.class ).deleteById(i.getId());
+                }
+            }
+        }
+        //保存信息
+        for (WorkAttachmentInfo dto : list) {
+            //判断是否存在
+            Integer isExit = holidayMapper.findIsExit(id, dto.getName());
+            if (isExit == 0) {
+                WorkAttachmentInfo i = new WorkAttachmentInfo();
+                //包含了url、size、name
+                i.setId(UUID.randomUUID().toString().replace("-", ""));
+//                i.getCreateBy().setId(userDTO.getId());
+                i.setCreateTime(new Date());
+//                i.getUpdateBy().setId(userDTO.getId());
+                i.setUpdateTime(new Date());
+                i.setDelFlag(0);
+                i.setUrl(dto.getUrl());
+                //文件类型处理
+                List<String> strings = Arrays.asList(dto.getName().split("\\."));
+                if (CollectionUtil.isNotEmpty(strings)) {
+                    i.setType(strings.get(1));
+                }
+                i.setAttachmentId(id);
+                i.setAttachmentName(dto.getName());
+                i.setAttachmentFlag("jyHoliday");
+                i.setFileSize(dto.getSize());
+                i.setSort(j);
+                Map<String,String> map = new HashMap<>();
+                String workAttachment = JSON.toJSONString((i));
+                String userDTOInfo = JSON.toJSONString((userDTO));
+                map.put("workAttachment",workAttachment);
+                map.put("userDTO",userDTOInfo);
+                SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+                j++;
+            }
+        }
+    }
+
+    private Holiday add(HolidayDTO holidayDTO, UserDTO userDTO) {
+        Holiday holiday = new Holiday();
+        //获取id
+        String id = UUID.randomUUID().toString().replace("-", "");
+
+        holiday.setId(id);
+        holiday.setStartDay(holidayDTO.getStartDay());//开始日期
+        holiday.setBeginTime(holidayDTO.getBeginTime());//开始时间
+        holiday.setEndDay(holidayDTO.getEndDay());//结束日期
+        holiday.setEndTime(holidayDTO.getEndTime());//结束时间
+        holiday.setType(holidayDTO.getType());//请假类型
+        holiday.setDays(holidayDTO.getDays());//请假时长
+        holiday.setReason(holidayDTO.getReason());//请假原因
+        holiday.setStatus(holidayDTO.getStatus());
+
+        /**
+         * 移动端保存所需
+         */
+        if (StringUtils.isNotBlank(holidayDTO.getUserId())) {
+            holiday.setCreateById(holidayDTO.getUserId());
+            holiday.setUpdateById(holidayDTO.getUserId());
+            //根据用户id查询用户所属的租户id
+            UserDTO dto = SpringUtil.getBean(IUserApi.class).getById(holidayDTO.getUserId());
+            holiday.setTenantId(dto.getTenantDTO().getId());
+        }
+        holidayMapper.insert(holiday);
+        //保存附件
+        List<WorkAttachmentInfo> files = holidayDTO.getFiles();
+        if (CollectionUtil.isNotEmpty(files)) {
+            saveFiles(files, userDTO, id);
+        }
+        return holiday;
+    }
+
+    /**
+     * 保存附件信息
+     * @param list 待保存的附件列表
+     * @param userDTO 当前登录用户
+     * @param id 关联id
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveFiles(List<WorkAttachmentInfo> list, UserDTO userDTO, String id) {
+        int j = 1;
+        for (WorkAttachmentInfo dto : list) {
+            WorkAttachmentInfo i = new WorkAttachmentInfo();
+            //包含了url、size、name
+            i.setId(UUID.randomUUID().toString().replace("-", ""));
+//            i.getCreateBy().setId(userDTO.getId());
+            i.setCreateTime(new Date());
+//            i.getUpdateBy().setId(userDTO.getId());
+            i.setUpdateTime(new Date());
+            i.setDelFlag(0);
+            i.setUrl(dto.getUrl());
+            //文件类型处理
+            List<String> strings = Arrays.asList(dto.getName().split("\\."));
+            if (CollectionUtil.isNotEmpty(strings)) {
+                i.setType(strings.get(1));
+            }
+            i.setAttachmentId(id);
+            i.setAttachmentName(dto.getName());
+            i.setAttachmentFlag("jyHoliday");
+            i.setFileSize(dto.getSize());
+            i.setSort(j);
+            Map<String,String> map = new HashMap<>();
+            String workAttachment = JSON.toJSONString((i));
+            String userDTOInfo = JSON.toJSONString((userDTO));
+            map.put("workAttachment",workAttachment);
+            map.put("userDTO",userDTOInfo);
+            SpringUtil.getBean ( IWorkAttachmentApi.class ).insertWorkAttachment(map);
+            j++;
+        }
+    }
+
+
+    /*
+    根据id修改状态
+     */
+    public void updateStatusById(HolidayDTO holidayDTO) {
+        holidayMapper.updateStatusById(holidayDTO.getStatus(),holidayDTO.getId());
+    }
+
+    /**
+     * 根据id进行删除
+     * @param id
+     * @return
+     */
+    public String deleteById(String id) {
+        holidayMapper.deleteById(id);
+        return "操作成功";
+    }
+}

+ 96 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/service/dto/HolidayDTO.java

@@ -0,0 +1,96 @@
+package com.jeeplus.pubmodules.holiday.service.dto;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import com.alibaba.fastjson.annotation.JSONField;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeeplus.core.domain.BaseEntity;
+import com.jeeplus.sys.domain.WorkAttachmentInfo;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class HolidayDTO extends BaseEntity {
+    /**
+     * 请假开始时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    @Excel(name = "请假日期",width = 16,exportFormat = "yyyy-MM-dd")
+    private Date startDay;
+
+    private String beginTime;
+
+    /**
+     * 请假结束时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date endDay;
+
+    private String endTime;
+
+    /**
+     * 请假天数
+     */
+    private String days;
+
+    /**
+     * 请假类型
+     */
+    private String type;
+
+    /*
+    请假原因
+     */
+    private String reason;
+
+    /**
+     * 年假剩余天数
+     */
+    private String remainDays;
+
+    /**
+     * 员工入职日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date contractStartDate;
+
+    /**
+     * 用户id
+     */
+    private String userId;
+    @Excel(name = "请假人",width = 16)
+    private String createName;
+    private String officeId;
+    @Excel(name = "请假人部门",width = 16)
+    private String officeName;
+    private String[] dates;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+    /**
+     * 流程信息
+     */
+    private String processDefinitionId;
+    @TableField(exist = false)
+    private String taskId;
+
+    private String status;
+
+    private List<WorkAttachmentInfo> files;
+    @Excel(name = "请假状态",width = 16)
+    private String driveApplyStatus;
+    @Excel(name = "请假类型",width = 16)
+    private String holidayType;
+    @Excel(name = "请假天数",width = 16)
+    private String holidayDays;
+    @Excel(name = "请假发起时间",width = 16,exportFormat = "yyyy-MM-dd")
+    private Date createTime;
+}

+ 323 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/utils/EasyPoiUtil.java

@@ -0,0 +1,323 @@
+package com.jeeplus.pubmodules.holiday.utils;
+
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+/**
+ * @Author Steel.D
+ * @Description easypoi导入导出通用工具类
+ * @Date 2019-7-31 9:29
+ * @Param
+ * @return
+ **/
+
+public class EasyPoiUtil {
+
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名。创建表头
+     *
+     * @param list           导出的实体类
+     * @param title          表头名称
+     * @param sheetName      sheet表名
+     * @param pojoClass      映射的实体类
+     * @param isCreateHeader 是否创建表头
+     * @param fileName
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:30
+     */
+
+    public static void exportExcel(List <?> list, String title, String sheetName, Class <?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) {
+
+        ExportParams exportParams = new ExportParams( title, sheetName );
+
+        exportParams.setCreateHeadRows ( isCreateHeader );
+
+        defaultExport ( list, pojoClass, fileName, response, exportParams );
+
+    }
+
+
+    /**
+     * 功能描述:复杂导出Excel,包括文件名以及表名,不创建表头
+     *
+     * @param list      导出的实体类
+     * @param title     表头名称
+     * @param sheetName sheet表名
+     * @param pojoClass 映射的实体类
+     * @param fileName  文件名
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:35
+     */
+
+    public static void exportExcel(List <?> list, String title, String sheetName, Class <?> pojoClass, String fileName, HttpServletResponse response) {
+        ExportParams exportParams = new ExportParams(title, sheetName);
+        exportParams.setDictHandler(new ExcelDiceAddressListHandlerImpl());
+        defaultExport ( list, pojoClass, fileName, response, exportParams );
+
+    }
+
+
+    /**
+     * 功能描述:Map 集合导出
+     *
+     * @param list     实体集合
+     * @param fileName 导出的文件名称
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:45
+     */
+
+    public static void exportExcel(List <Map <String, Object>> list, String fileName, HttpServletResponse response) {
+
+        defaultExport ( list, fileName, response );
+
+    }
+
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list         导出的实体集合
+     * @param fileName     导出的文件名
+     * @param pojoClass    pojo实体
+     * @param exportParams ExportParams封装实体
+     * @param response
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 9:50
+     */
+
+    private static void defaultExport(List <?> list, Class <?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
+
+        Workbook workbook = ExcelExportUtil.exportExcel ( exportParams, pojoClass, list );
+
+        if ( workbook != null ) {
+
+            downLoadExcel ( fileName, response, workbook );
+
+        }
+
+    }
+
+    /**
+     * 功能描述:Excel导出
+     *
+     * @param fileName 文件名称
+     * @param response
+     * @param workbook Excel对象
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 10:35
+     */
+
+    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
+
+        try {
+
+            response.setCharacterEncoding ( "UTF-8" );
+
+            response.setHeader ( "content-Type", "application/vnd.ms-excel" );
+
+            response.setHeader ( "Content-Disposition", "attachment;filename=" + URLEncoder.encode ( fileName, "UTF-8" ) );
+
+            workbook.write ( response.getOutputStream ( ) );
+
+        } catch (IOException e) {
+
+            throw new RuntimeException ( e );
+
+        }
+
+    }
+
+
+    /**
+     * 功能描述:默认导出方法
+     *
+     * @param list     导出的实体集合
+     * @param fileName 导出的文件名
+     * @param response
+     * @return
+     * @author SteeL.D
+     * @Date 2019-7-31 10:45
+     */
+
+    private static void defaultExport(List <Map <String, Object>> list, String fileName, HttpServletResponse response) {
+
+        Workbook workbook = ExcelExportUtil.exportExcel ( list, ExcelType.HSSF );
+
+        if ( workbook != null ) ;
+
+        downLoadExcel ( fileName, response, workbook );
+
+    }
+
+
+    /**
+     * 功能描述:根据文件路径来导入Excel
+     *
+     * @param filePath   文件路径
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:05
+     */
+
+    public static <T> List <T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class <T> pojoClass) {
+
+        //判断文件是否存在
+
+        if ( StringUtils.isBlank ( filePath ) ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( new File ( filePath ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "模板不能为空" );
+
+        } catch (Exception e) {
+
+            e.printStackTrace ( );
+
+
+        }
+
+        return list;
+
+    }
+
+
+    /**
+     * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
+     *
+     * @param file       上传的文件
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:30
+     */
+
+    public static <T> List <T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class <T> pojoClass) {
+
+        if ( file == null ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( file.getInputStream ( ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "excel文件不能为空" );
+
+        } catch (Exception e) {
+            e.printStackTrace ();
+            throw new RuntimeException ( e.getMessage ( ) );
+
+        }
+
+        return list;
+
+    }
+
+    /**
+     * 功能描述:根据接收的Excel文件来导入Excel,并封装成实体类
+     *
+     * @param file       上传的文件
+     * @param titleRows  表标题的行数
+     * @param headerRows 表头行数
+     * @param sheetNum   开始sheet页
+     * @param sheetNum   sheet页数
+     * @param pojoClass  Excel实体类
+     * @return
+     * @author Steel.D
+     * @Date 2019-7-31 11:30
+     */
+    public static <T> List <T> importSheetExcel(MultipartFile file, Integer titleRows, Integer headerRows, Integer startSheetIndex, Integer sheetNum, Class <T> pojoClass) {
+
+        if ( file == null ) {
+
+            return null;
+
+        }
+
+        ImportParams params = new ImportParams( );
+
+        params.setTitleRows ( titleRows );
+
+        params.setHeadRows ( headerRows );
+
+        params.setStartSheetIndex(startSheetIndex);
+
+        params.setSheetNum(sheetNum);
+
+        List <T> list = null;
+
+        try {
+
+            list = ExcelImportUtil.importExcel ( file.getInputStream ( ), pojoClass, params );
+
+        } catch (NoSuchElementException e) {
+
+            throw new RuntimeException ( "excel文件不能为空" );
+
+        } catch (Exception e) {
+            e.printStackTrace ();
+            throw new RuntimeException ( e.getMessage ( ) );
+
+        }
+
+        return list;
+
+    }
+
+
+}

+ 75 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/holiday/utils/ExcelDiceAddressListHandlerImpl.java

@@ -0,0 +1,75 @@
+package com.jeeplus.pubmodules.holiday.utils;
+
+import cn.afterturn.easypoi.handler.inter.IExcelDictHandler;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.extra.spring.SpringUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import com.jeeplus.sys.feign.IDictApi;
+import com.jeeplus.sys.service.dto.DictValueInfoDTO;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+//import com.jeeplus.sys.utils.DictUtils;
+//import com.jeeplus.sys.service.dto.DictValueDTO;
+//import com.jeeplus.sys.utils.DictUtils;
+
+/**
+ * 模拟使用,生产请用真实字典
+ *
+ */
+public class ExcelDiceAddressListHandlerImpl implements IExcelDictHandler {
+
+    /**
+     * 返回字典所有值
+     * key: dictKey
+     *
+     * @param dict 字典Key
+     * @return
+     */
+    @Override
+    public List<Map> getList(String dict) {
+        List<Map> list = new ArrayList<> ();
+//        Map<String, String> dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "0");
+//        dictMap.put("dictValue", "严重瞌睡");
+//        list.add(dictMap);
+//        dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "1");
+//        dictMap.put("dictValue", "小B");
+//        list.add(dictMap);
+//        dictMap = new HashMap<>();
+//        dictMap.put("dictKey", "1");
+//        dictMap.put("dictValue", "深度富有");
+//        list.add(dictMap);
+        String datas = SpringUtil.getBean ( IDictApi.class ).getDictMap (dict);
+        List<DictValueInfoDTO> dictValueDTOs = JSON.parseObject(datas, new TypeReference<List<DictValueInfoDTO>>() {});
+//        List<DictValueInfoDTO> dictValueDTOs = DictUtils.getDictMap ().get (dict);
+        dictValueDTOs.forEach (dictValueDTO -> {
+            Map<String, String> dictMap = new HashMap<> ();
+            dictMap.put ("dictKey", dictValueDTO.getValue ());
+            dictMap.put ("dictValue", dictValueDTO.getLabel ());
+            list.add (dictMap);
+        });
+        return list;
+    }
+
+    @Override
+    public String toName(String dict, Object obj, String name, Object value) {
+        if (ObjectUtil.isNotEmpty(value)) {
+            return SpringUtil.getBean ( IDictApi.class ).getDictLabel (value.toString (), dict, null);
+        }
+        return "";
+    }
+
+    @Override
+    public String toValue(String dict, Object obj, String name, Object value) {
+        if (ObjectUtil.isNotEmpty(value)) {
+            return SpringUtil.getBean ( IDictApi.class ).getDictLabel (value.toString (), dict, null);
+        }
+        return "";
+    }
+}

+ 5 - 0
jeeplus-modules/jeeplus-public-modules/src/main/java/com/jeeplus/pubmodules/purchase/domain/MaterialBasic.java

@@ -64,6 +64,11 @@ public class MaterialBasic extends BaseEntity {
      */
     private String purchaseMode;
 
+    /**
+     * 备注
+     */
+    private String remarks;
+
     @TableField(exist = false)
     List<MaterialDetailed> detailInfos;
 }

+ 45 - 0
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/controller/app/AppUserController.java

@@ -3,22 +3,29 @@
  */
 package com.jeeplus.sys.controller.app;
 
+import cn.hutool.extra.spring.SpringUtil;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.jeeplus.common.TokenProvider;
 import com.jeeplus.sys.controller.UserController;
 import com.jeeplus.sys.domain.Office;
 import com.jeeplus.sys.domain.User;
+import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.service.OfficeService;
 import com.jeeplus.sys.service.UserService;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 用户Controller
@@ -47,6 +54,44 @@ public class AppUserController extends UserController {
         return ResponseEntity.ok ( rootTree );
     }
 
+    /**
+     * 移动端人员单选所需-获取机构JSON数据。
+     *
+     * @return
+     */
+    @GetMapping("treeDataRadio")
+    public ResponseEntity treeDataRadio(String type) {
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
+        List<Office> list = new ArrayList<>();
+        if (null != type && type.equals("ydd")) {
+            list = officeService.list().stream()
+                    .filter(office -> office.getTenantId().equals(userDTO.getTenantDTO().getId()))
+                    .collect(Collectors.toList());
+        } else {
+            list = officeService.list ( );
+        }
+
+        List rootTree = getRootTreeRadio ( list, type, userDTO );
+        return ResponseEntity.ok ( rootTree );
+    }
+
+    private List <Map> getRootTreeRadio(List <Office> list, String type, UserDTO userDTO) {
+        List <Map> offices = Lists.newArrayList ( );
+
+        List <Office> rootTrees = new ArrayList<>();
+        if (null != type && type.equals("ydd")){
+            rootTrees = officeService.treeData().stream()
+                    .filter(office -> office.getTenantId().equals(userDTO.getTenantDTO().getId()))
+                    .collect(Collectors.toList());
+        } else {
+            rootTrees = officeService.treeData ( );
+        }
+
+        for (Office root : rootTrees) {
+            offices.add ( getChildOfTree ( root, list ) );
+        }
+        return offices;
+    }
 
     private List <Map> getRootTree(List <Office> list) {
         List <Map> offices = Lists.newArrayList ( );

+ 1 - 1
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -113,7 +113,7 @@ public class SampleXxlJob {
 
         for (int i=0;i<filteredUsers.size();i++){
             //发起完善个人信息流程
-            Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen(" - 完善个人信息");
+            Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("完善个人信息");
             String procDefId = map.get("id")+"";
 
             EnrollmentRegistrationInfo report = new EnrollmentRegistrationInfo();