Bläddra i källkod

报销类型修改功能修改,物资管理-库存修改

wangqiang 1 år sedan
förälder
incheckning
d9fa687845
16 ändrade filer med 1251 tillägg och 0 borttagningar
  1. 41 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementAmountInfo.java
  2. 96 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfo.java
  3. 94 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoContract.java
  4. 98 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoOther.java
  5. 93 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoProcured.java
  6. 94 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/SaveInfoDto.java
  7. 17 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/WorkAttachmentDto.java
  8. 307 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/ConvertServiceUtil.java
  9. 94 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/RestTemplateService2.java
  10. 85 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ActionType.java
  11. 15 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/AssigneeDto.java
  12. 57 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/HisTaskVo.java
  13. 21 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/NoticeVo.java
  14. 62 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ProcessStatus.java
  15. 39 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ProcessVo.java
  16. 38 0
      jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/TaskVo.java

+ 41 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementAmountInfo.java

@@ -0,0 +1,41 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "reimbursement_amount_info")
+public class ReimbursementAmountInfo extends BaseEntity {
+
+    /**
+     * 关联id
+     */
+    private String infoId;
+
+    /**
+     * 发票代码
+     */
+    private String code;
+
+    /**
+     * 发票编号
+     */
+    private String number;
+
+    /**
+     * 金额
+     */
+    private String amount;
+
+    /**
+     * 税额
+     */
+    private String taxAmount;
+
+    /**
+     * 价税合计
+     */
+    private String count;
+
+}

+ 96 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfo.java

@@ -0,0 +1,96 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+@Data
+@TableName(value = "reimbursement_detail_info")
+public class ReimbursementDetailInfo extends BaseEntity {
+
+    /**
+     * 关联id
+     */
+    private String infoId;
+
+    /**
+     * 报销人
+     */
+    private String userId;
+
+    /**
+     * 报销人名称
+     */
+    private String userName;
+
+    /**
+     * 报销部门
+     */
+    private String deptId;
+
+    /**
+     * 报销部门名称
+     */
+    private String deptName;
+
+    /**
+     * 报销类型
+     */
+    private String typeId;
+
+    /**
+     * 报销类型名称
+     */
+    private String typeName;
+
+    /**
+     * 报销项目
+     */
+    private String projectId;
+
+    /**
+     * 报销项目名称
+     */
+    private String projectName;
+
+    /**
+     * 报告号
+     */
+    private String reportNumber;
+
+    /**
+     * 费用(元)
+     */
+    private String number;
+
+    /**
+     * 收据张数
+     */
+    private Integer receiptNumber;
+
+    /**
+     * 出差天数
+     */
+    private Integer days;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 排序
+     */
+    private String sort;
+
+    /**
+     * 出差天数ccpm
+     */
+    private String evectionNumber;
+
+    /**
+     * 收据张数ccpm
+     */
+    private String receiptNumbers;
+}
+

+ 94 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoContract.java

@@ -0,0 +1,94 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 评估-报销详情信息表
+ * @TableName reimbursement_detail_info_contract
+ */
+@TableName(value ="reimbursement_detail_info_contract")
+@Data
+public class ReimbursementDetailInfoContract extends BaseEntity implements Serializable {
+
+    /**
+     * 基础表id
+     */
+    private String infoId;
+
+    /**
+     * 报销人
+     */
+    private String userId;
+
+    /**
+     * 报销人名称
+     */
+    @TableField(exist = false)
+    private String userName;
+
+    /**
+     * 报销部门
+     */
+    private String deptId;
+
+    /**
+     * 报销部门名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+    /**
+     * 报销类型
+     */
+    private String typeId;
+
+    /**
+     * 报销类型名称
+     */
+    @TableField(exist = false)
+    private String typeName;
+
+    /**
+     * 报销合同
+     */
+    private String contractId;
+
+    /**
+     * 报销合同名称
+     */
+    @TableField(exist = false)
+    private String contractName;
+
+    /**
+     * 报告号
+     */
+    private String reportNumber;
+
+    /**
+     * 费用(元)
+     */
+    private String number;
+
+    /**
+     * 收据张数
+     */
+    private Integer receiptNumber;
+
+    /**
+     * 出差天数
+     */
+    private Integer days;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 98 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoOther.java

@@ -0,0 +1,98 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 评估-报销详情信息表
+ * @TableName reimbursement_detail_info_other
+ */
+@TableName(value ="reimbursement_detail_info_other")
+@Data
+public class ReimbursementDetailInfoOther extends BaseEntity implements Serializable {
+
+    /**
+     * 基础表id
+     */
+    private String infoId;
+
+    /**
+     * 报销人
+     */
+    private String userId;
+
+    /**
+     * 报销人名称
+     */
+    @TableField(exist = false)
+    private String userName;
+
+    /**
+     * 报销部门
+     */
+    private String deptId;
+
+    /**
+     * 报销部门名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+    /**
+     * 报销类型
+     */
+    private String typeId;
+
+    /**
+     * 报销类型名称
+     */
+    @TableField(exist = false)
+    private String typeName;
+
+    /**
+     * 报销项目
+     */
+    private String projectId;
+
+    /**
+     * 报销项目名称
+     */
+    private String projectName;
+
+    /**
+     * 报告号
+     */
+    private String reportNumber;
+
+    /**
+     * 费用(元)
+     */
+    private String number;
+
+    /**
+     * 收据张数
+     */
+    private Integer receiptNumber;
+
+    /**
+     * 出差天数
+     */
+    private Integer days;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 排序
+     */
+    private String sort;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 93 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/ReimbursementDetailInfoProcured.java

@@ -0,0 +1,93 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.jeeplus.core.domain.BaseEntity;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 评估-报销详情信息表
+ * @TableName reimbursement_detail_info_procured
+ */
+@TableName(value ="reimbursement_detail_info_procured")
+@Data
+public class ReimbursementDetailInfoProcured extends BaseEntity implements Serializable {
+
+    /**
+     * 基础表id
+     */
+    private String infoId;
+
+    /**
+     * 报销人
+     */
+    private String userId;
+
+    /**
+     * 报销人名称
+     */
+    @TableField(exist = false)
+    private String userName;
+
+    /**
+     * 报销部门
+     */
+    private String deptId;
+
+    /**
+     * 报销部门名称
+     */
+    @TableField(exist = false)
+    private String deptName;
+
+    /**
+     * 报销类型
+     */
+    private String typeId;
+
+    /**
+     * 报销类型名称
+     */
+    @TableField(exist = false)
+    private String typeName;
+
+    /**
+     * 报销项目
+     */
+    private String projectId;
+
+    /**
+     * 报销项目名称
+     */
+    private String projectName;
+
+    /**
+     * 报告号
+     */
+    private String reportNumber;
+
+    /**
+     * 费用(元)
+     */
+    private String number;
+
+    /**
+     * 收据张数
+     */
+    private Integer receiptNumber;
+
+    /**
+     * 出差天数
+     */
+    private Integer days;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    @TableField(exist = false)
+    private static final long serialVersionUID = 1L;
+}

+ 94 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/SaveInfoDto.java

@@ -0,0 +1,94 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+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;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class SaveInfoDto extends BaseEntity {
+
+    //合同编号类型(字典值)
+    public static final String BIZ_CODE = "5";
+
+    /**
+     * 经办人id
+     */
+    private String userId;
+
+    /**
+     * 经办人名称
+     */
+    private String userName;
+
+    /**
+     * 报销编号
+     */
+    private String no;
+
+    /**
+     * 所属部门
+     */
+    private String department;
+
+    /**
+     * 报销日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private Date reimDate;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
+    /**
+     * 状态
+     */
+    private String type;
+
+    /**
+     * 流程id
+     */
+    private String procInsId;
+
+    /**
+     *
+     */
+    private String processInstanceId;
+
+    private List<ReimbursementDetailInfo> detailInfos;
+    private List<ReimbursementDetailInfoContract> detailInfoContracts;
+    private List<ReimbursementDetailInfoOther> detailInfoOthers;
+    private List<ReimbursementDetailInfoProcured> detailInfoProcured;
+
+    private List<ReimbursementAmountInfo> amountInfos;
+
+    private List<WorkAttachmentDto> files;
+    /**
+     * 报销类型
+     */
+    private String sourceType;
+
+    /**
+     * 采购编号
+     */
+    private String purchaseNo;
+
+    private String purchaseId;
+
+    private String departmentName;
+
+    // 流程历史
+    List<Map<String,Object>> histoicFlowList;
+
+    // 流程流向图
+    List<Map<String,Object>> flowChart;
+
+
+}

+ 17 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/dto/reimbursement/WorkAttachmentDto.java

@@ -0,0 +1,17 @@
+package com.jeeplus.sys.dto.reimbursement;
+
+import com.jeeplus.core.service.dto.BaseDTO;
+import lombok.Data;
+
+@Data
+public class WorkAttachmentDto extends BaseDTO {
+
+    private String name;
+
+    private String size;
+
+    private String url;
+
+    private String lsUrl;
+
+}

+ 307 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/ConvertServiceUtil.java

@@ -0,0 +1,307 @@
+package com.jeeplus.sys.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jeeplus.sys.dto.reimbursement.ReimbursementAmountInfo;
+import com.jeeplus.sys.dto.reimbursement.ReimbursementDetailInfo;
+import com.jeeplus.sys.dto.reimbursement.SaveInfoDto;
+import com.jeeplus.sys.dto.reimbursement.WorkAttachmentDto;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.vo.ProcessVo;
+import com.jeeplus.sys.vo.TaskVo;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class ConvertServiceUtil {
+
+    /**
+     * 批量将ccpm系统待办返回的字段转换为当前系统待办需要的字段
+     * @param res
+     * @return
+     */
+    public static List<ProcessVo> convertProcessVoList(List<Map<String, Object>> res) throws Exception {
+        ArrayList<ProcessVo> processVoList = new ArrayList<>();
+        String ccpm_task = Global.getConfig("CCPM_TASK"); // 获取ccpm可查看的待办数据
+        if (StringUtils.isNotBlank(ccpm_task)) {
+            String[] taskAliasList = ccpm_task.split(","); // 获取到ccpm待办
+            if(CollectionUtil.isNotEmpty(res) && ArrayUtil.isNotEmpty(taskAliasList)) {
+                String[] distinctTaskAlias = ArrayUtil.distinct(taskAliasList); // ccpm待办去重
+                for (Map<String, Object> item : res) {
+                    for (String taskAlias : distinctTaskAlias) {
+                        if (taskAlias.equals(item.get("type").toString()) && item.get("remarks").toString().contains("待审批")) {
+                            ProcessVo processVo = convertProcessVo(item);
+                            processVoList.add(processVo);
+                        }
+                    }
+                }
+            }
+        }
+        return processVoList;
+    }
+    /**
+     * ccpm系统待办返回的字段转换为当前系统待办需要的字段
+     * @param map
+     * @return
+     */
+    public static ProcessVo convertProcessVo(Map<String, Object> map) throws Exception {
+        ProcessVo processVo = new ProcessVo();
+        Map<String, String> vars = new HashMap();
+        TaskVo task = new TaskVo();
+        if (CollectionUtil.isNotEmpty(map)) {
+            // 标题
+            if (Objects.nonNull(map.get("title"))){
+                vars.put("title", map.get("title").toString());
+            }
+            // 流程名称
+            if (Objects.nonNull(map.get("typeLabel"))){
+                processVo.setProcessDefinitionName(map.get("typeLabel").toString());
+            }
+            // 当前环节
+            if (Objects.nonNull(map.get("notifyRole"))){
+                task.setName(map.get("notifyRole").toString());
+            }
+            // 流程发起人
+            if (Objects.nonNull(map.get("createUserName"))){
+                vars.put("userName", map.get("createUserName").toString());
+            }
+            // 创建时间
+            if (Objects.nonNull(map.get("createDate"))){
+                task.setCreateTime((new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).parse(map.get("createDate").toString()));
+            }
+            // 流程id
+            if (Objects.nonNull(map.get("id"))){
+                task.setId(map.get("id").toString());
+            }
+            // 数据id
+            if (Objects.nonNull(map.get("notifyId"))){
+                vars.put("notifyId", map.get("notifyId").toString());
+            }
+            // 审批状态
+            if (Objects.nonNull(map.get("remarks"))){
+                vars.put("remarks", map.get("remarks").toString());
+            }
+        }
+        processVo.setVars(vars);
+        processVo.setTask(task);
+        processVo.setBelongProject("ccpm");
+        processVo.setStatus ("todo");
+        return processVo;
+    }
+
+    /**
+     * 将结果排序后分页
+     * 由于是根据数据中的creaTime字段来进行排序,所以此字段不可以为空,否则会报空指针
+     * @param page
+     * @param list
+     * @return
+     */
+    public static Page getSortAndPaging(Page page,List<ProcessVo> list) {
+        // 将数据按照creaTime倒序排序
+        List<ProcessVo> sort = CollectionUtil.sort(list, new Comparator<ProcessVo>() {
+            @Override
+            public int compare(ProcessVo o1, ProcessVo o2) {
+                return o2.getTask().getCreateTime().compareTo(o1.getTask().getCreateTime());
+            }
+        });
+        // 将数据分页
+        page.setTotal(list.size());
+        List<ProcessVo> records = new ArrayList<>();
+        int startIndex = (int) ((page.getCurrent() - 1) * page.getSize());
+        for (int i = 0; i < page.getSize() ; i ++) {
+            if (startIndex == list.size() || ObjectUtil.isEmpty(list.get(startIndex))) {
+                break;
+            }
+            records.add(list.get(startIndex));
+            startIndex++;
+        }
+        page.setRecords(records);
+        return page;
+    }
+
+    /**
+     * ccpm报销转换
+     * @param response
+     * @return
+     */
+    public static SaveInfoDto convertReim(Object response) {
+        SaveInfoDto result = new SaveInfoDto();
+        if (Objects.nonNull(response)) {
+            Map<String, Object> resp = JSONObject.parseObject(JSON.toJSONString(response));
+            if (CollectionUtil.isNotEmpty(resp)) {
+                // processInstanceId
+                if (ObjectUtil.isNotEmpty(resp.get("processInstanceId"))) {
+                    result.setProcInsId(resp.get("processInstanceId").toString());
+                }
+                // 经办人
+                if (ObjectUtil.isNotEmpty(resp.get("submitterName"))) { // 报销人
+                    result.setUserName(resp.get("submitterName").toString());
+                }
+                // 报销编号
+                if (ObjectUtil.isNotEmpty(resp.get("number"))) { // 报销编号
+                    result.setNo(resp.get("number").toString());
+                }
+                // 所属部门
+                if (ObjectUtil.isNotEmpty(resp.get("officeName"))) { // 所属部门
+                    result.setDepartmentName(resp.get("officeName").toString());
+                }
+                // 报销日期
+                if (ObjectUtil.isNotEmpty(resp.get("createDate"))) { // 报销日期、创建时间
+                    result.setReimDate(DateUtil.parse(resp.get("createDate").toString()));
+                }
+                // 备注
+                if (ObjectUtil.isNotEmpty(resp.get("remarks"))) { // 备注
+                    result.setRemarks(resp.get("remarks").toString());
+                }
+                // 附件
+                if (ObjectUtil.isNotEmpty(resp.get("workAttachments"))) {
+                    String jsonString = JSON.toJSONString(resp.get("workAttachments"));
+                    List<Object> attachmentList = JSON.parseArray(jsonString, Object.class);
+                    List<WorkAttachmentDto> attachments = new ArrayList<>();
+                    if (CollectionUtil.isNotEmpty(attachmentList)) {
+                        attachmentList.stream().forEach(attachment -> {
+                            WorkAttachmentDto attachmentDto = new WorkAttachmentDto();
+                            UserDTO userDTO = new UserDTO();
+                            Map<String, Object> fileMap = JSONObject.parseObject(JSON.toJSONString(attachment));
+                            if (ObjectUtil.isNotEmpty(fileMap.get("attachmentName"))) { // 附件名称
+                                attachmentDto.setName(fileMap.get("attachmentName").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(fileMap.get("createName"))) { // 创建人
+                                userDTO.setName(fileMap.get("createName").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(fileMap.get("createDate"))) { // 创建时间
+                                attachmentDto.setCreateDate(DateUtil.parse(fileMap.get("createDate").toString()));
+                            }
+                            if (ObjectUtil.isNotEmpty(fileMap.get("url"))) { // 文件地址
+                                attachmentDto.setUrl(fileMap.get("url").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(fileMap.get("temporaryUrl"))) { // 文件临时地址
+                                attachmentDto.setLsUrl(fileMap.get("temporaryUrl").toString());
+                            }
+                            attachmentDto.setCreateBy(userDTO);
+                            attachments.add(attachmentDto);
+                        });
+                    }
+                    result.setFiles(attachments);
+                }
+                // 专用发票信息
+                if (ObjectUtil.isNotEmpty(resp.get("reimbursementVATTaxes"))) {
+                    String jsonString = JSON.toJSONString(resp.get("reimbursementVATTaxes"));
+                    List<Object> reimVATTaxeList = JSON.parseArray(jsonString, Object.class);
+                    List<ReimbursementAmountInfo> reimbursementAmountInfoList = new ArrayList<>();
+                    if (CollectionUtil.isNotEmpty(reimVATTaxeList)) {
+                        reimVATTaxeList.stream().forEach(reim -> {
+                            ReimbursementAmountInfo reimbursementAmountInfo = new ReimbursementAmountInfo();
+                            Map<String, Object> vaTaxeMap = JSONObject.parseObject(JSON.toJSONString(reim));
+                            if (ObjectUtil.isNotEmpty(vaTaxeMap.get("invoiceCode"))) { // 发票代码
+                                reimbursementAmountInfo.setCode(vaTaxeMap.get("invoiceCode").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(vaTaxeMap.get("invoiceNumber"))) { // 发票号
+                                reimbursementAmountInfo.setNumber(vaTaxeMap.get("invoiceNumber").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(vaTaxeMap.get("money"))) { // 金额
+                                reimbursementAmountInfo.setAmount(vaTaxeMap.get("money").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(vaTaxeMap.get("taxAmount"))) { // 税额
+                                reimbursementAmountInfo.setTaxAmount(vaTaxeMap.get("taxAmount").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(vaTaxeMap.get("sumMoney"))) { // 价税合计
+                                reimbursementAmountInfo.setCount(vaTaxeMap.get("sumMoney").toString());
+                            }
+                            reimbursementAmountInfoList.add(reimbursementAmountInfo);
+                        });
+                    }
+                    result.setAmountInfos(reimbursementAmountInfoList);
+                }
+                // 报销详情
+                if (ObjectUtil.isNotEmpty(resp.get("workAccountList"))) {
+                    String jsonString = JSON.toJSONString(resp.get("workAccountList"));
+                    List<Object> workAccountList = JSON.parseArray(jsonString, Object.class);
+                    List<ReimbursementDetailInfo> reimbursementDetailInfos = new ArrayList<>();
+                    if (CollectionUtil.isNotEmpty(workAccountList)) {
+                        workAccountList.stream().forEach(detail -> {
+                            Map<String, Object> detailMap = JSONObject.parseObject(JSON.toJSONString(detail));
+                            ReimbursementDetailInfo detailInfo = new ReimbursementDetailInfo();
+                            if (ObjectUtil.isNotEmpty(detailMap.get("reimbursementName"))) { // 报销人
+                                detailInfo.setUserName(detailMap.get("reimbursementName").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("officeId"))) { // 报销部门
+                                detailInfo.setDeptName(detailMap.get("officeId").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("typeName"))) { // 报销类别
+                                detailInfo.setTypeName(detailMap.get("typeName").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("project"))) { // 报销项目
+                                Map<String, Object> projectMap = JSONObject.parseObject(JSON.toJSONString(detailMap.get("project")));
+                                if (ObjectUtil.isNotEmpty(projectMap.get("projectName"))) {
+                                    detailInfo.setProjectName(projectMap.get("projectName").toString());
+                                }
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("projectReportNumber"))) { // 报告号
+                                detailInfo.setReportNumber(detailMap.get("projectReportNumber").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("money"))) { // 费用(元)
+                                detailInfo.setNumber(detailMap.get("money").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("bills"))) { // 收据张数
+                                detailInfo.setReceiptNumbers(detailMap.get("bills").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("evectionNumber"))) { // 出差天数
+                                detailInfo.setEvectionNumber(detailMap.get("evectionNumber").toString());
+                            }
+                            if (ObjectUtil.isNotEmpty(detailMap.get("remarks"))) { // 内容
+                                detailInfo.setContent(detailMap.get("remarks").toString());
+                            }
+                            reimbursementDetailInfos.add(detailInfo);
+                        });
+                    }
+                    result.setDetailInfos(reimbursementDetailInfos);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * ccpm流程历史转换
+     * @param list
+     * @return
+     */
+    public static List<Map<String,Object>> convertHisFlowList(List<Map<String, Object>> list) {
+        if (CollectionUtil.isNotEmpty(list)) {
+            list.stream().forEach(item -> {
+                // beginDate日期格式化后重新赋值
+                if (Objects.nonNull(item.get("beginDate"))) {
+                    Long beginDate = Long.valueOf(String.valueOf(item.get("beginDate")));
+                    item.remove("beginDate");
+                    item.put("beginDate",formatLongDate(beginDate));
+                }
+                // endDate日期格式化后重新赋值
+                if (Objects.nonNull(item.get("endDate"))) {
+                    Long beginDate = Long.valueOf(String.valueOf(item.get("endDate")));
+                    item.remove("endDate");
+                    item.put("endDate",formatLongDate(beginDate));
+                }
+            });
+        }
+        return list;
+    }
+
+    /**
+     * 将Long类型时间转换为String时间格式
+     * @param date
+     * @return
+     */
+    public static String formatLongDate (Long date) {
+        Date dt=new Date(date);
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
+        String format = sdf.format(dt);
+        return format;
+    }
+}

+ 94 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/utils/RestTemplateService2.java

@@ -0,0 +1,94 @@
+package com.jeeplus.sys.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+import java.util.Map;
+import java.util.Objects;
+
+@Component
+public class RestTemplateService2 {
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 访问post接口 - CAS 系统
+     * @param path 接口路径
+     * @param token token
+     * @param paramMap 请求参数-路径后
+     * @param bodyMap 请求参数-请求体
+     * @return
+     */
+    public Object postCas(String path, String token, Map<String, Object> paramMap, Map<String, Object> bodyMap) {
+        return httpRequest(HttpMethod.POST, token, paramMap, bodyMap, Global.getConfig("CAS_PATH"), path);
+    }
+
+    /**
+     * 访问get接口 - CAS 系统
+     * @param path 接口路径
+     * @param token token
+     * @param paramMap 请求参数-路径后
+     * @return
+     */
+    public Object getCas(String path, String token, Map<String, Object> paramMap) {
+        return httpRequest(HttpMethod.GET, token, paramMap, null, Global.getConfig("CAS_PATH"), path);
+    }
+
+    /**
+     * 访问远程接口方法
+     * @param method 请求类型
+     * @param token token
+     * @param paramMap 请求参数-路径后
+     * @param bodyMap 请求参数-请求体
+     * @param hostAddress 服务host地址
+     * @param path 接口路径
+     * @return
+     */
+    public Object httpRequest(HttpMethod method, String token, Map<String, Object> paramMap, Map<String, Object> bodyMap, String hostAddress, String path) {
+        JSONObject jsonObject = new JSONObject();
+        if (CollectionUtil.isNotEmpty(bodyMap)) {
+            jsonObject = new JSONObject(bodyMap); // 另一端接口需要使用@RequestBody来接收此参数
+        }
+        String url = getUrl(hostAddress, path, paramMap);
+        HttpHeaders httpHeaders = new HttpHeaders();
+//        httpHeaders.add("token",token);
+        httpHeaders.add("Accept", MediaType.ALL_VALUE);
+        httpHeaders.add("cookie", "jeeplus.session.id=0635611b0f5a4401836262c7d23ae98e");
+        httpHeaders.setContentType(new MediaType("application","json", Charset.forName("UTF-8")));
+        HttpEntity<Object> entity = new HttpEntity<>(jsonObject,httpHeaders);
+        ResponseEntity<Object> responseEntity = restTemplate.exchange(url, method, entity, Object.class);
+        return responseEntity.getBody();
+    }
+
+    /**
+     * 将参数拼接到请求路径中
+     * @param hostAddress 服务host地址
+     * @param path 接口路径
+     * @param map 请求参数
+     * @return
+     */
+    public String getUrl(String hostAddress, String path, Map<String, Object> map) {
+        String url = hostAddress + path;
+        StringBuilder paramStr = new StringBuilder();
+        if (CollectionUtil.isNotEmpty(map)) {
+            for (String key : map.keySet()) {
+                Object o = map.get(key);
+                if (Objects.nonNull(o)) {
+//                    String value = URLEncoder.encode(o.toString(), "utf-8");
+                    paramStr.append("&").append(key).append("=").append(o);
+                }
+            }
+        }
+        if (StringUtils.isNotBlank(paramStr.toString())){
+            String param = paramStr.substring(1).toString(); // 去掉第一个&
+            url = url + "?" + param;
+        }
+        return url;
+    }
+}

+ 85 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ActionType.java

@@ -0,0 +1,85 @@
+package com.jeeplus.sys.vo;
+
+public enum ActionType {
+    BEGIN("开始", "_flow_start", "primary"),
+    END("结束", "_flow_end", "primary"),
+    SAVE("暂存", "_flow_save", "primary"),
+    AGREE("同意", "_flow_agree", "success"),
+    REJECT("驳回", "_flow_reject", "danger"),
+    BACK("指定回退", "_flow_back", "danger"),
+    ADD_MULTI_INSTANCE("加签", "_flow_add_multi_instance", "primary"),
+    DEL_MULTI_INSTANCE("减签", "_flow_add_multi_instance", "primary"),
+    TRANSFER("转办", "_flow_transfer", "primary"),
+    DELEGATE("委派", "_flow_delegate", "primary"),
+    STOP("终止", "_flow_stop", "info"),
+    PRINT("打印", "_flow_print", "primary"),
+    ADD_BEFORE_MULTI_INSTANCE("前加签", "_flow_before_add_multi_instance", "primary"),
+    ADD_AFTER_MULTI_INSTANCE("后加签", "_flow_after_add_multi_instance", "primary"),
+    COMMIT("提交", "_flow_commit", "success"),
+    Audit("审批", "_flow_audit", "success"),
+    WAITING("等待审核", "_flow_waiting", "primary"),
+    RECOMMIT("重新提交", "_flow_recommit", "warning"),
+    DELETED("作废流程", "_flow_delete", "danger"),
+    REVOKE("撤销流程", "_flow_revoke", "warning");
+    // 成员变量
+    private String status; // 评论描述
+    private String type; //编码
+    private String level; //描述级别
+    // 构造方法
+    private ActionType(String status, String type, String level) {
+        this.type = type;
+        this.status = status;
+        this.level = level;
+    }
+    // 普通方法
+    public static String getStatus(String type) {
+        for (ActionType c : ActionType.values()) {
+            if (c.getType ().equals (type)) {
+                return c.status;
+            }
+        }
+        return null;
+    }
+
+    // 普通方法
+    public static String getLevel(String type) {
+        for (ActionType c : ActionType.values()) {
+            if (c.getType ().equals (type)) {
+                return c.level;
+            }
+        }
+        return "primary"; //如果不存在返回 primary
+    }
+
+    public static ActionType value(String type) {
+        for (ActionType c : ActionType.values()) {
+            if (c.getType ().equals (type)) {
+                return c;
+            }
+        }
+        return null;
+    }
+    // get set 方法
+    public String getStatus() {
+        return status;
+    }
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+}

+ 15 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/AssigneeDto.java

@@ -0,0 +1,15 @@
+package com.jeeplus.sys.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class AssigneeDto {
+
+    private String type;
+
+    private String assignValue;
+}

+ 57 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/HisTaskVo.java

@@ -0,0 +1,57 @@
+package com.jeeplus.sys.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import org.flowable.task.api.history.HistoricTaskInstance;
+import java.util.Date;
+import java.util.Map;
+
+/*
+    历史任务节点
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class HisTaskVo {
+    private String id;
+    private String name;
+    private String assignee;
+    private String executionId;
+    private String taskDefinitionKey;
+    private Date createTime;
+    private Date endTime;
+    private String processDefinitionId;
+    private String processInstanceId;
+    private String processDefinitionName; // 流程名称
+    private boolean isBack; // 流程是否可以撤回到该节点
+    private String code; //任务办理状态:1,2
+    private String comment; //任务评论
+    private String type; // 操作类型编码
+    private String status; // 任务办理描述: 同意,驳回
+    private String level; // 文字颜色
+    private Map vars;
+
+    private String title; // 实例标题
+    private String startUserId; // 流程发起人id
+    private String startUserName; // 流程发起人姓名
+    private String assigneeName; // 节点审核人姓名
+
+    private TaskVo currentTask; // 当前流程节点
+
+    public HisTaskVo(HistoricTaskInstance task){
+        this.id = task.getId ();
+        this.name = task.getName ();
+        this.assignee = task.getAssignee ();
+        this.executionId = task.getExecutionId ();
+        this.taskDefinitionKey = task.getTaskDefinitionKey ();
+        this.createTime = task.getCreateTime ();
+        this.endTime = task.getEndTime ();
+        this.executionId = task.getExecutionId ();
+        this.processDefinitionId = task.getProcessDefinitionId ();
+        this.vars = task.getProcessVariables ();
+        this.processInstanceId = task.getProcessInstanceId ();
+    }
+
+}

+ 21 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/NoticeVo.java

@@ -0,0 +1,21 @@
+package com.jeeplus.sys.vo;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class NoticeVo {
+
+    private String processDefinitionName; // 流程名称
+    private int version; // 流程版本
+    private Map vars; // 流程变量
+    private TaskVo task; //流程当前节点
+    private int code; // 流程状态码
+    private String status; //流程状态
+    private String noticeId;//通知人
+    private String noticeName;//通知人姓名
+    private String type;//读取状态
+    private Integer repetitionCount;//重复数量
+
+}

+ 62 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ProcessStatus.java

@@ -0,0 +1,62 @@
+package com.jeeplus.sys.vo;
+
+public enum ProcessStatus {
+    SUSPENDED("已挂起", 0, "danger"),
+    WAITING("等待审核", 1, "primary"),
+    AGREE("审核通过", 2, "success"),
+    REVOKE ("流程撤回", 3, "warning"),
+    REJECT("审核驳回", 4, "danger"),
+    STOP("审核终止", 5, "info"),
+    DELETED("流程作废", 6, "danger");
+    // 成员变量
+    private String status;
+    private int code;
+    private String level;
+    // 构造方法
+    ProcessStatus(String status, int code, String level) {
+        this.code = code;
+        this.status = status;
+        this.level = level;
+    }
+    // 普通方法
+    public static String getStatus(int code) {
+        for (ProcessStatus c : ProcessStatus.values()) {
+            if (c.getCode () == code) {
+                return c.status;
+            }
+        }
+        return null;
+    }
+
+    public static ProcessStatus value(int code) {
+        for (ProcessStatus c : ProcessStatus.values()) {
+            if (c.getCode () == code) {
+                return c;
+            }
+        }
+        return null;
+    }
+    // get set 方法
+    public String getStatus() {
+        return status;
+    }
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+}

+ 39 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/ProcessVo.java

@@ -0,0 +1,39 @@
+package com.jeeplus.sys.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.Map;
+
+@Data
+public class ProcessVo {
+    private String processInstanceId; // 流程实例ID
+    private String processDefinitionId; // 流程定义ID
+    private String processDefinitionName; // 流程名称
+    private String activityId;
+    private int version; // 流程版本
+    private Map vars; // 流程变量
+    private Date startTime; // 流程开始时间
+    private Date endTime; //流程结束时间
+    private String taskName; //流程当前节点名称
+    private String deleteReason; //流程作废原因
+    private HisTaskVo hisTask; // 历史流程节点
+    private TaskVo task; //流程当前节点
+
+
+    private int code; // 流程状态码
+    private String status; //流程状态
+    private String level; //状态级别,用于控制在前台显示的颜色
+
+    private String belongProject; // 所属系统 ccpm cpa ...
+
+    public String getId(){ // 流程实例id 作为列表的id
+        return processInstanceId;
+    }
+
+    public void setProcessStatus(ProcessStatus processStatus){
+        this.code = processStatus.getCode ();
+        this.status = processStatus.getStatus ();
+        this.level = processStatus.getLevel ();
+    }
+}

+ 38 - 0
jeeplus-platform/jeeplus-admin/src/main/java/com/jeeplus/sys/vo/TaskVo.java

@@ -0,0 +1,38 @@
+package com.jeeplus.sys.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.flowable.task.api.TaskInfo;
+
+import java.util.Date;
+
+/**
+ * 当前活动任务节点
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TaskVo {
+    private String id;
+    private String name;
+    private String assignee;
+    private String executionId;
+    private String taskDefinitionKey;
+    private Date createTime;
+    private String processDefinitionId;
+    private String processInstanceId;
+    private String processDefKey;
+
+
+    public TaskVo(TaskInfo task){
+        this.id = task.getId ();
+        this.name = task.getName ();
+        this.assignee = task.getAssignee ();
+        this.executionId = task.getExecutionId ();
+        this.taskDefinitionKey = task.getTaskDefinitionKey ();
+        this.createTime = task.getCreateTime ();
+        this.processDefinitionId = task.getProcessDefinitionId ();
+        this.processInstanceId = task.getProcessInstanceId ();
+    }
+}