From 08879b1fb5f25265b22becd95a31ce9c8709b8ba Mon Sep 17 00:00:00 2001
From: whycxzp <glperry@163.com>
Date: 星期四, 19 六月 2025 16:08:53 +0800
Subject: [PATCH] 维修调度-维修-入库-报废 流程的申请及自动化流程的申请

---
 src/main/java/com/whyc/pojo/web_site/WorkflowMain.java        |  314 +++++++++
 src/main/java/com/whyc/util/CommonUtil.java                   |    1 
 src/main/java/com/whyc/constant/WorkflowEnum.java             |   60 +
 src/main/java/com/whyc/mapper/WorkflowMainMapper.java         |   15 
 src/main/java/com/whyc/pojo/web_site/WorkflowLink.java        |  288 ++++++++
 src/main/java/com/whyc/constant/RoleEnum.java                 |   38 +
 src/main/java/com/whyc/util/ThreadLocalUtil.java              |    6 
 src/main/java/com/whyc/constant/WorkflowTypeEnum.java         |   58 +
 src/main/java/com/whyc/controller/WorkflowLinkController.java |   36 +
 src/main/java/com/whyc/controller/WorkflowMainController.java |   85 ++
 src/main/java/com/whyc/service/WorkflowLinkService.java       |  166 ++++
 src/main/java/com/whyc/mapper/WorkflowLinkMapper.java         |   18 
 src/main/resources/mapper/WorkflowLinkMapper.xml              |  323 +++++++++
 src/main/resources/mapper/WorkflowMainMapper.xml              |  128 +++
 src/main/java/com/whyc/constant/WorkflowProcessEnum.java      |   46 +
 src/main/java/com/whyc/service/WorkflowMainService.java       |  404 +++++++++++
 16 files changed, 1,986 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/whyc/constant/RoleEnum.java b/src/main/java/com/whyc/constant/RoleEnum.java
new file mode 100644
index 0000000..151ef82
--- /dev/null
+++ b/src/main/java/com/whyc/constant/RoleEnum.java
@@ -0,0 +1,38 @@
+package com.whyc.constant;
+
+/**
+ * 瑙掕壊:0-绠$悊涓撹矗,1-缁存姢缁勯暱,2-缁存姢缁勫憳,10-棰嗗,杩愮淮灞�-11,鐩戞帶灞�-12,涓撳憳灞�-14
+ * */
+public enum RoleEnum {
+    ADMIN(0,"绠$悊涓撹矗"),
+    GROUP_LEADER(1,"缁存姢缁勯暱"),
+    GROUP_MEMBER(2,"缁存姢缁勫憳"),
+    LEADER(10,"棰嗗"),
+    MAINTAINER(11,"杩愮淮灞�"),
+    MONITOR(12,"鐩戞帶灞�"),
+    SPECIALIST(14,"涓撳憳灞�");
+
+    RoleEnum(Integer id, String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    private Integer id;
+    private String name;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
diff --git a/src/main/java/com/whyc/constant/WorkflowEnum.java b/src/main/java/com/whyc/constant/WorkflowEnum.java
new file mode 100644
index 0000000..5efec97
--- /dev/null
+++ b/src/main/java/com/whyc/constant/WorkflowEnum.java
@@ -0,0 +1,60 @@
+package com.whyc.constant;
+
+/**
+ * 宸ヤ綔娴佺浉鍏虫灇涓�
+ */
+public enum WorkflowEnum {
+    /**涓昏〃(main)鐘舵��*/
+    MAIN_STATUS_DEALING("瀹℃壒涓�",1),
+    MAIN_STATUS_END_PASS("瀹℃壒缁撴潫,閫氳繃",2),
+    MAIN_STATUS_END_REJECT("瀹℃壒缁撴潫,椹冲洖",3),
+    MAIN_STATUS_END_CANCEL("瀹℃壒缁撴潫,鎾ら攢",4),
+    MAIN_STATUS_WAIT_FOR_DEALING("瀹℃壒缁撴潫,寰呭鐞�",5),
+    MAIN_STATUS_END_DEALT("瀹℃壒缁撴潫,宸插鐞�",6),
+
+    /**澶勭悊绫诲瀷 deal_type*/
+    TYPE_TAKE("鎺ュ崟",0),
+    TYPE_TRANSFER_DISPATCH("杞淳",1),
+    TYPE_DELIVER("绉讳氦",2),
+    TYPE_ASSIGN("鍒嗘淳",3),
+    TYPE_REJECT("椹冲洖",4),
+    TYPE_PASS("閫氳繃",5),
+    TYPE_REPLY("鍥炲",6),
+    TYPE_FINISH("澶勭悊骞跺綊妗�",7),
+
+    /**鑺傜偣琛�(link)鐘舵��*/
+    LINK_STATUS_PENDING("寰呭鐞�",0),
+    LINK_STATUS_TAKING("寰呮帴鍗�",1),
+    LINK_STATUS_DEALING("澶勭悊涓�", 2),
+    LINK_STATUS_WAIT_FOR_REPLY("寰呭洖澶�", 3),
+    LINK_STATUS_DEAL_WITH_REPLY("澶勭悊鍥炲", 4),
+    LINK_STATUS_PASS("閫氳繃", 5),
+    LINK_STATUS_WAIT_FOR_APPROVE("寰呭鎵�", 6),
+    LINK_STATUS_CANCEL("宸叉挙閿�", 7),
+    LINK_STATUS_REJECT("椹冲洖", 8);
+
+    private String name;
+    private Integer value;
+
+    WorkflowEnum(String name, Integer value) {
+        this.name = name;
+        this.value = value;
+    }
+
+    public final String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public final Integer getValue() {
+        return value;
+    }
+
+    public void setValue(Integer value) {
+        this.value = value;
+    }
+
+}
diff --git a/src/main/java/com/whyc/constant/WorkflowProcessEnum.java b/src/main/java/com/whyc/constant/WorkflowProcessEnum.java
new file mode 100644
index 0000000..e17b15d
--- /dev/null
+++ b/src/main/java/com/whyc/constant/WorkflowProcessEnum.java
@@ -0,0 +1,46 @@
+package com.whyc.constant;
+
+/**
+ * 瀹℃壒娴�-娴佺▼鑺傜偣鎻忚堪 ->鐢ㄤ簬鎵�鏈夌殑瀹℃壒娴佺▼
+ */
+public enum WorkflowProcessEnum {
+
+    PROCESS_SPECIALIST("P0","涓撳憳瀹℃壒"),
+    PROCESS_COUNTERSIGN("P1","浼氱"),
+    PROCESS_MANAGER1SIGN("P2","绠$悊瀹℃壒"),
+    PROCESS_MANAGER2SIGN("P3","棰嗗瀹℃壒"),
+    ;
+
+    WorkflowProcessEnum(String stage, String name) {
+        this.stage = stage;
+        this.name = name;
+    }
+
+    private String stage;
+    private String name;
+
+    public String getStage() {
+        return stage;
+    }
+
+    public void setStage(String stage) {
+        this.stage = stage;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public static WorkflowProcessEnum getByName(String name) {
+        for (WorkflowProcessEnum workflowProcessEnum : WorkflowProcessEnum.values()) {
+            if (workflowProcessEnum.name.equals(name)) {
+                return workflowProcessEnum;
+            }
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/com/whyc/constant/WorkflowTypeEnum.java b/src/main/java/com/whyc/constant/WorkflowTypeEnum.java
new file mode 100644
index 0000000..4524e61
--- /dev/null
+++ b/src/main/java/com/whyc/constant/WorkflowTypeEnum.java
@@ -0,0 +1,58 @@
+package com.whyc.constant;
+
+/**
+ * TODO 姣忔鏂板娴佺▼鏃�,闇�瑕佹寔缁淮鎶�
+ */
+public enum WorkflowTypeEnum {
+
+    DEVICE_DEFAULT(0,"鏈畾涔夌殑娴佺▼鐢宠鍗�","FG-WDY"),
+    DEVICE_REPAIR(1,"璁惧缁翠慨鐢宠鍗�","FG-WX"),
+    DEVICE_IN(2,"璁惧鍏ュ簱鐢宠鍗�","FG-RK"),
+    DEVICE_SCRAP(3,"璁惧鎶ュ簾鐢宠鍗�","FG-BF"),
+    DEVICE_OUT(4,"璁惧鍑哄簱鐢宠鍗�","FG-CK");
+
+
+    private Integer type;
+    private String name;
+
+    private String namingPrefix;
+
+    WorkflowTypeEnum(Integer type, String name, String namingPrefix) {
+        this.type = type;
+        this.name = name;
+        this.namingPrefix = namingPrefix;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNamingPrefix() {
+        return namingPrefix;
+    }
+
+    public void setNamingPrefix(String namingPrefix) {
+        this.namingPrefix = namingPrefix;
+    }
+
+    public static WorkflowTypeEnum getByType(Integer type) {
+        for (WorkflowTypeEnum value : WorkflowTypeEnum.values()) {
+            if (value.getType().equals(type)) {
+                return value;
+            }
+        }
+        return DEVICE_DEFAULT;
+    }
+}
diff --git a/src/main/java/com/whyc/controller/WorkflowLinkController.java b/src/main/java/com/whyc/controller/WorkflowLinkController.java
new file mode 100644
index 0000000..afb157a
--- /dev/null
+++ b/src/main/java/com/whyc/controller/WorkflowLinkController.java
@@ -0,0 +1,36 @@
+package com.whyc.controller;
+
+import com.whyc.dto.Response;
+import com.whyc.pojo.web_site.WorkflowLink;
+import com.whyc.service.WorkflowLinkService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("workflowLink")
+@Api(tags = "鍗曟嵁瀹℃壒")
+public class WorkflowLinkController extends BaseController{
+    
+    @Autowired
+    private WorkflowLinkService service;
+
+    @GetMapping("workflowInfo")
+    @ApiOperation(value = "宸ュ崟鑺傜偣鍒楄〃")
+    public Response<List<WorkflowLink>> getWorkflowInfo(@RequestParam Integer mainId){
+        return new Response<List<WorkflowLink>>().set(1, service.getWorkflowInfo(mainId));
+    }
+
+
+    @PostMapping("link")
+    @ApiOperation(value = "鏇存柊鑺傜偣", notes = "浼犲弬link瀵硅薄鍐�,浼犲叆id,dealReason鎴栬�卍ealRejectReason;" +
+            "瀛楁status:5-閫氳繃,8-椹冲洖")
+    public Response updateLink(@RequestBody WorkflowLink link) {
+        return service.updateLink(link);
+    }
+
+
+}
diff --git a/src/main/java/com/whyc/controller/WorkflowMainController.java b/src/main/java/com/whyc/controller/WorkflowMainController.java
new file mode 100644
index 0000000..5b15efa
--- /dev/null
+++ b/src/main/java/com/whyc/controller/WorkflowMainController.java
@@ -0,0 +1,85 @@
+package com.whyc.controller;
+
+import com.github.pagehelper.PageInfo;
+import com.whyc.dto.Response;
+import com.whyc.pojo.db_user.User;
+import com.whyc.pojo.web_site.WorkflowMain;
+import com.whyc.service.WorkflowLinkService;
+import com.whyc.service.WorkflowMainService;
+import com.whyc.util.ActionUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("workflowMain")
+@Api(tags = "鍗曟嵁瀹℃壒")
+public class WorkflowMainController {
+
+    @Autowired
+    private WorkflowMainService service;
+
+    @PostMapping("submit")
+    @ApiOperation(value = "鎻愪氦鍗曟嵁", notes = "浼犲弬:taskDesc,mainType,mainTypeCN,mainTypeEn,dealRoleId,processLevel")
+    public Response<Integer> submit(@RequestBody WorkflowMain  main){
+        return service.submit(main);
+    }
+
+
+    @GetMapping("basicInfo")
+    @ApiOperation(value = "宸ュ崟鍩烘湰鐘舵��")
+    public Response<WorkflowMain> getBasicInfo(@RequestParam Integer mainId){
+        return new Response<WorkflowMain>().set(1,service.getBaseInfo(mainId));
+    }
+
+    //鏈汉鐨勫崟鎹�: 宸插鎵�,瀹℃壒涓�,宸叉挙閿�,宸查┏鍥�
+    //鎺ユ敹鍒扮殑鍗曟嵁: 寰呭鏍�,(寰呮帴鍗曞鏍�?),宸插鏍�
+
+    /**
+     * 鏈汉鐨勫崟鎹�:
+     *  宸插鎵�,瀹℃壒涓�,宸叉挙閿�,宸查┏鍥�
+     * */
+    @GetMapping("ownStatistics")
+    @ApiOperation(value = "鏈汉鐨勫崟鎹粺璁�",notes = "status鍚箟:1-瀹℃壒涓�,2-瀹℃壒瀹屾垚涓旈�氳繃,3-瀹℃壒瀹屾垚涓旈┏鍥�")
+    public Response<Map<Integer,Integer>> getOwnStatistics(int type){
+        int userId = ActionUtil.getUser().getId().intValue();
+        return service.getOwnStatistics(userId,type);
+    }
+
+    /**
+     * 鏈汉鐨勫崟鎹�:
+     *  宸插鎵�,瀹℃壒涓�,宸叉挙閿�,宸查┏鍥�
+     * */
+    @GetMapping("ownListPage")
+    @ApiOperation(value = "鏈汉鐨勫崟鎹垪琛ㄥ垎椤�",notes = "status浼犲弬:0:鍏ㄩ儴,1-瀹℃壒涓�,2-瀹℃壒瀹屾垚涓旈�氳繃,3-瀹℃壒瀹屾垚涓旈┏鍥�")
+    public Response<PageInfo<WorkflowMain>> ownListPage(int type,int status,int pageNum,int pageSize){
+        int userId = ActionUtil.getUser().getId().intValue();
+        return service.ownListPage(userId,type,status,pageNum,pageSize);
+    }
+
+    /**
+     * 鎺ユ敹鍒扮殑鍗曟嵁:
+     *  鏀剧數璁″垝涓存椂琛ㄤ腑瀛樺湪: 寰呭鏍�,寰呮帴鍗曞鏍�,宸插鏍�
+     * */
+    @GetMapping("receivedStatistics")
+    @ApiOperation(value = "鎺ユ敹鍒扮殑鍗曟嵁缁熻",notes = "status鍚箟:1-寰呮帴鍗�,6-寰呭鏍�,58-宸插鏍�")
+    public Response<Map<Integer,Integer>> getReceivedStatistics(int type){
+        User user = ActionUtil.getUser();
+        return service.getReceivedStatistics(type,user);
+    }
+
+    /**
+     * 鎺ユ敹鍒扮殑鍗曟嵁:
+     * 鏀剧數璁″垝涓存椂琛ㄤ腑瀛樺湪: 寰呭鏍�,寰呮帴鍗曞鏍�,宸插鏍�
+     */
+    @GetMapping("receivedListPage")
+    @ApiOperation(value = "鎺ユ敹鍒扮殑鍗曟嵁鍒楄〃鍒嗛〉", notes = "status浼犲弬:0-鍏ㄩ儴,1-寰呮帴鍗�,6-寰呭鏍�,5|8-宸插鏍�(閫氳繃|椹冲洖)")
+    public Response<PageInfo<WorkflowMain>> getReceivedListPage(int type, int status, int pageNum, int pageSize) {
+        User user = ActionUtil.getUser();
+        return service.getReceivedListPage(type, status, user, pageNum, pageSize);
+    }
+
+}
diff --git a/src/main/java/com/whyc/mapper/WorkflowLinkMapper.java b/src/main/java/com/whyc/mapper/WorkflowLinkMapper.java
new file mode 100644
index 0000000..2b74739
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/WorkflowLinkMapper.java
@@ -0,0 +1,18 @@
+package com.whyc.mapper;
+
+
+import com.whyc.pojo.db_user.User;
+import com.whyc.pojo.web_site.WorkflowLink;
+
+import java.util.List;
+
+public interface WorkflowLinkMapper extends CustomMapper<WorkflowLink> {
+
+    List<WorkflowLink> getReceivedList(int type, User user);
+
+    /**浜屾鏍稿鍜岄殣鎮f晠闅滅殑缁熻*/
+    List<WorkflowLink> getReceivedList2(int type, User user);
+
+    //鏌ヨ鑷繁闇�瑕佸鐞嗘垨鑰呭鎵圭殑
+
+}
diff --git a/src/main/java/com/whyc/mapper/WorkflowMainMapper.java b/src/main/java/com/whyc/mapper/WorkflowMainMapper.java
new file mode 100644
index 0000000..e174550
--- /dev/null
+++ b/src/main/java/com/whyc/mapper/WorkflowMainMapper.java
@@ -0,0 +1,15 @@
+package com.whyc.mapper;
+
+import com.whyc.pojo.db_user.User;
+import com.whyc.pojo.web_site.WorkflowMain;
+
+import java.util.List;
+
+public interface WorkflowMainMapper extends CustomMapper<WorkflowMain> {
+
+    List<WorkflowMain> getReceivedListByUserAndType(User user, int type, int status);
+
+    //鏌ヨ琛ㄥ崟缂栧彿
+    Integer getMaxId();
+
+}
diff --git a/src/main/java/com/whyc/pojo/web_site/WorkflowLink.java b/src/main/java/com/whyc/pojo/web_site/WorkflowLink.java
new file mode 100644
index 0000000..226db57
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/web_site/WorkflowLink.java
@@ -0,0 +1,288 @@
+package com.whyc.pojo.web_site;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.ToString;
+import org.apache.ibatis.type.Alias;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 宸ヤ綔娴佽妭鐐硅〃
+ */
+@ToString
+@Alias("WorkflowLink")
+@TableName(schema = "web_site",value = "tb_workflow_link")
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class WorkflowLink {
+
+    private Integer id;
+    @ApiModelProperty("涓昏〃id")
+    private Integer mainId;
+    @ApiModelProperty("涓婄骇id")
+    private Integer parentId;
+    @ApiModelProperty("澶勭悊灞傜骇")
+    private String processStage;
+    @ApiModelProperty("澶勭悊灞傜骇鍚嶇О")
+    private String processName;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+    @ApiModelProperty("澶勭悊浜篿d")
+    private Integer dealUserId;
+    @ApiModelProperty("澶勭悊绫诲瀷")
+    private Integer dealType;
+    @ApiModelProperty("澶勭悊鎻忚堪")
+    private String dealDesc;
+    @ApiModelProperty("澶勭悊闄勪欢鍚嶇О")
+    private String dealFileName;
+    @ApiModelProperty("澶勭悊闄勪欢鍦板潃")
+    private String dealFileUrl;
+    @ApiModelProperty("澶勭悊鍥剧墖鍚嶇О")
+    private String dealPicName;
+    @ApiModelProperty("澶勭悊鍥剧墖鍦板潃")
+    private String dealPicUrl;
+    @ApiModelProperty("鑺傜偣鐘舵��")
+    private Integer status;
+    @ApiModelProperty("澶勭悊瑙掕壊")
+    private Integer dealRoleId;
+    @ApiModelProperty("澶勭悊瀹岃兘鍚﹀綊妗�")
+    private Integer dealAndClose;
+    @ApiModelProperty("椹冲洖鍘熷洜")
+    private String dealRejectReason;
+    @ApiModelProperty("瀛愪换鍔℃暟")
+    private Integer dealTaskNum;
+    @ApiModelProperty("瀛愪换鍔″洖澶嶆暟")
+    private Integer dealTaskReplyNum;
+    @ApiModelProperty("澶勭悊寤鸿")
+    private String dealReason;
+    @ApiModelProperty("澶勭悊鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date dealTime;
+    @ApiModelProperty("瑕佹眰瀹屾垚鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date requiredFinishTime;
+    @ApiModelProperty("瀹℃壒鍥炲鍐呭")
+    private String replyContent;
+    @ApiModelProperty("瀹℃壒鍥炲鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date replyTime;
+
+    @TableField(exist = false)
+    private List<Integer> dealUserIdList;
+
+    @TableField(exist = false)
+    private WorkflowMain workflowMain;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getMainId() {
+        return mainId;
+    }
+
+    public void setMainId(Integer mainId) {
+        this.mainId = mainId;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getProcessStage() {
+        return processStage;
+    }
+
+    public void setProcessStage(String processStage) {
+        this.processStage = processStage;
+    }
+
+    public String getProcessName() {
+        return processName;
+    }
+
+    public void setProcessName(String processName) {
+        this.processName = processName;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Integer getDealUserId() {
+        return dealUserId;
+    }
+
+    public void setDealUserId(Integer dealUserId) {
+        this.dealUserId = dealUserId;
+    }
+
+    public Integer getDealType() {
+        return dealType;
+    }
+
+    public void setDealType(Integer dealType) {
+        this.dealType = dealType;
+    }
+
+    public String getDealDesc() {
+        return dealDesc;
+    }
+
+    public void setDealDesc(String dealDesc) {
+        this.dealDesc = dealDesc;
+    }
+
+    public String getDealFileName() {
+        return dealFileName;
+    }
+
+    public void setDealFileName(String dealFileName) {
+        this.dealFileName = dealFileName;
+    }
+
+    public String getDealFileUrl() {
+        return dealFileUrl;
+    }
+
+    public void setDealFileUrl(String dealFileUrl) {
+        this.dealFileUrl = dealFileUrl;
+    }
+
+    public String getDealPicName() {
+        return dealPicName;
+    }
+
+    public void setDealPicName(String dealPicName) {
+        this.dealPicName = dealPicName;
+    }
+
+    public String getDealPicUrl() {
+        return dealPicUrl;
+    }
+
+    public void setDealPicUrl(String dealPicUrl) {
+        this.dealPicUrl = dealPicUrl;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getDealRoleId() {
+        return dealRoleId;
+    }
+
+    public void setDealRoleId(Integer dealRoleId) {
+        this.dealRoleId = dealRoleId;
+    }
+
+    public Integer getDealAndClose() {
+        return dealAndClose;
+    }
+
+    public void setDealAndClose(Integer dealAndClose) {
+        this.dealAndClose = dealAndClose;
+    }
+
+    public String getDealRejectReason() {
+        return dealRejectReason;
+    }
+
+    public void setDealRejectReason(String dealRejectReason) {
+        this.dealRejectReason = dealRejectReason;
+    }
+
+    public Integer getDealTaskNum() {
+        return dealTaskNum;
+    }
+
+    public void setDealTaskNum(Integer dealTaskNum) {
+        this.dealTaskNum = dealTaskNum;
+    }
+
+    public Integer getDealTaskReplyNum() {
+        return dealTaskReplyNum;
+    }
+
+    public void setDealTaskReplyNum(Integer dealTaskReplyNum) {
+        this.dealTaskReplyNum = dealTaskReplyNum;
+    }
+
+    public String getDealReason() {
+        return dealReason;
+    }
+
+    public void setDealReason(String dealReason) {
+        this.dealReason = dealReason;
+    }
+
+    public Date getDealTime() {
+        return dealTime;
+    }
+
+    public void setDealTime(Date dealTime) {
+        this.dealTime = dealTime;
+    }
+
+    public List<Integer> getDealUserIdList() {
+        return dealUserIdList;
+    }
+
+    public void setDealUserIdList(List<Integer> dealUserIdList) {
+        this.dealUserIdList = dealUserIdList;
+    }
+
+    public Date getRequiredFinishTime() {
+        return requiredFinishTime;
+    }
+
+    public void setRequiredFinishTime(Date requiredFinishTime) {
+        this.requiredFinishTime = requiredFinishTime;
+    }
+
+    public String getReplyContent() {
+        return replyContent;
+    }
+
+    public void setReplyContent(String replyContent) {
+        this.replyContent = replyContent;
+    }
+
+    public Date getReplyTime() {
+        return replyTime;
+    }
+
+    public void setReplyTime(Date replyTime) {
+        this.replyTime = replyTime;
+    }
+
+    public WorkflowMain getWorkflowMain() {
+        return workflowMain;
+    }
+
+    public void setWorkflowMain(WorkflowMain workflowMain) {
+        this.workflowMain = workflowMain;
+    }
+
+}
diff --git a/src/main/java/com/whyc/pojo/web_site/WorkflowMain.java b/src/main/java/com/whyc/pojo/web_site/WorkflowMain.java
new file mode 100644
index 0000000..971c1f3
--- /dev/null
+++ b/src/main/java/com/whyc/pojo/web_site/WorkflowMain.java
@@ -0,0 +1,314 @@
+package com.whyc.pojo.web_site;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.ToString;
+import org.apache.ibatis.type.Alias;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 宸ヤ綔娴佷富琛�
+ */
+@ToString
+@Alias("WorkflowMain")
+@TableName(schema = "web_site",value = "tb_workflow_main")
+public class WorkflowMain {
+
+    private Integer id;
+    /**
+     * 宸ュ崟id,瑙勮寖:WF-1-20211101-00001
+     * (Workflow)-(宸ュ崟绫诲瀷 鍛婅:1 鏅��:2)-(骞存湀鏃�)-(褰撴棩缂栧彿搴忓垪)
+     *
+     * */
+    @ApiModelProperty("宸ュ崟id,瑙勮寖:FG-GF-1-20211101-00001,(Workflow)-(宸ュ崟绫诲瀷 鍛婅:1 鏅��:2)-(骞存湀鏃�)-(褰撴棩缂栧彿搴忓垪)")
+    private String orderId;
+    /**鏍囬*/
+    @ApiModelProperty("鏍囬")
+    private String title;
+    /**浠诲姟鎻忚堪*/
+    @ApiModelProperty("浠诲姟鎻忚堪")
+    private String taskDesc;
+    /**鍒涘缓浜篿d*/
+    @ApiModelProperty("鍒涘缓浜篿d")
+    private Integer createUserId;
+    /**鍒涘缓鏃堕棿*/
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
+    private Date createTime;
+    /**浠诲姟璁″垝寮�濮嬫椂闂�*/
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
+    private Date planBeginTime;
+    /**浠诲姟璁″垝缁撴潫鏃堕棿*/
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
+    private Date planEndTime;
+    /**浠诲姟寮�濮嬪鐞嗘椂闂�*/
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
+    private Date beginTime;
+    /**浠诲姟褰掓。鏃堕棿*/
+    @ApiModelProperty("褰掓。鏃堕棿")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "Asia/Shanghai")
+    private Date endTime;
+
+    @ApiModelProperty("鐢宠鏁伴噺")
+    private Integer quantity;
+    /**浠诲姟绛夌骇*/
+    @ApiModelProperty("浠诲姟绛夌骇")
+    private Integer taskLevel;
+    /**鏄惁鍙婃椂*/
+    @ApiModelProperty("鏄惁鍙婃椂")
+    @TableField("is_in_time")
+    private Integer inTime;
+    @ApiModelProperty("娴佺▼杩囩▼闃舵")
+    private String processStage;
+    @ApiModelProperty("宸ュ崟鐘舵��")
+    private Integer status;
+    /**闄勪欢鍚嶇О*/
+    @ApiModelProperty("闄勪欢鍚嶇О")
+    private String fileName;
+    /**闄勪欢鍦板潃*/
+    @ApiModelProperty("闄勪欢鍦板潃")
+    private String fileUrl;
+    /**鍥剧墖鍚嶇О*/
+    @ApiModelProperty("鍥剧墖鍚嶇О")
+    private String picName;
+    /**鍥剧墖鍦板潃*/
+    @ApiModelProperty("鍥剧墖鍦板潃")
+    private String picUrl;
+    /**褰掓。鎰忚*/
+    @ApiModelProperty("褰掓。鎰忚")
+    private String endReason;
+    /**鏄惁鑷姩娲惧崟*/
+    @ApiModelProperty("鏄惁鑷姩娲惧崟")
+    @TableField("is_auto")
+    private Integer auto;
+
+    @ApiModelProperty("鍏宠仈宸ュ崟id")
+    private Integer relatedId;
+
+    /**
+     * @see com.whyc.constant.WorkflowTypeEnum
+     */
+    @ApiModelProperty("宸ュ崟娴佺被鍨�")
+    private Integer type;
+
+    @TableField(exist = false)
+    private String createUserName;
+
+    @TableField(exist = false)
+    private List<WorkflowLink> linkList;
+    public WorkflowMain(Integer id, Integer status, String endReason, Date endTime) {
+        this.id = id;
+        this.status = status;
+        this.endReason = endReason;
+        this.endTime = endTime;
+    }
+
+    public WorkflowMain() {
+
+    }
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getOrderId() {
+        return orderId;
+    }
+
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getTaskDesc() {
+        return taskDesc;
+    }
+
+    public void setTaskDesc(String taskDesc) {
+        this.taskDesc = taskDesc;
+    }
+
+    public Integer getCreateUserId() {
+        return createUserId;
+    }
+
+    public void setCreateUserId(Integer createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    public Date getPlanBeginTime() {
+        return planBeginTime;
+    }
+
+    public void setPlanBeginTime(Date planBeginTime) {
+        this.planBeginTime = planBeginTime;
+    }
+
+    public Date getPlanEndTime() {
+        return planEndTime;
+    }
+
+    public void setPlanEndTime(Date planEndTime) {
+        this.planEndTime = planEndTime;
+    }
+
+    public Date getBeginTime() {
+        return beginTime;
+    }
+
+    public void setBeginTime(Date beginTime) {
+        this.beginTime = beginTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Integer getTaskLevel() {
+        return taskLevel;
+    }
+
+    public void setTaskLevel(Integer taskLevel) {
+        this.taskLevel = taskLevel;
+    }
+
+    public Integer getInTime() {
+        return inTime;
+    }
+
+    public void setInTime(Integer inTime) {
+        this.inTime = inTime;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+
+    public String getFileUrl() {
+        return fileUrl;
+    }
+
+    public void setFileUrl(String fileUrl) {
+        this.fileUrl = fileUrl;
+    }
+
+    public String getPicName() {
+        return picName;
+    }
+
+    public void setPicName(String picName) {
+        this.picName = picName;
+    }
+
+    public String getPicUrl() {
+        return picUrl;
+    }
+
+    public void setPicUrl(String picUrl) {
+        this.picUrl = picUrl;
+    }
+
+    public String getEndReason() {
+        return endReason;
+    }
+
+    public void setEndReason(String endReason) {
+        this.endReason = endReason;
+    }
+
+    public Integer getAuto() {
+        return auto;
+    }
+
+    public void setAuto(Integer auto) {
+        this.auto = auto;
+    }
+
+    public List<WorkflowLink> getLinkList() {
+        return linkList;
+    }
+
+    public void setLinkList(List<WorkflowLink> linkList) {
+        this.linkList = linkList;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getCreateUserName() {
+        return createUserName;
+    }
+
+    public void setCreateUserName(String createUserName) {
+        this.createUserName = createUserName;
+    }
+
+    public Integer getQuantity() {
+        return quantity;
+    }
+
+    public void setQuantity(Integer quantity) {
+        this.quantity = quantity;
+    }
+
+    public String getProcessStage() {
+        return processStage;
+    }
+
+    public void setProcessStage(String processStage) {
+        this.processStage = processStage;
+    }
+
+    public Integer getRelatedId() {
+        return relatedId;
+    }
+
+    public void setRelatedId(Integer relatedId) {
+        this.relatedId = relatedId;
+    }
+}
diff --git a/src/main/java/com/whyc/service/WorkflowLinkService.java b/src/main/java/com/whyc/service/WorkflowLinkService.java
new file mode 100644
index 0000000..6fb525a
--- /dev/null
+++ b/src/main/java/com/whyc/service/WorkflowLinkService.java
@@ -0,0 +1,166 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.whyc.constant.WorkflowEnum;
+import com.whyc.dto.Response;
+import com.whyc.mapper.*;
+import com.whyc.pojo.db_user.User;
+import com.whyc.pojo.web_site.WorkflowLink;
+import com.whyc.pojo.web_site.WorkflowMain;
+import com.whyc.util.CommonUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class WorkflowLinkService {
+
+    @Resource
+    private WorkflowLinkMapper mapper;
+
+    @Autowired
+    @Lazy
+    private WorkflowMainService mainService;
+
+
+    public void addBatch(List<WorkflowLink> links) {
+        mapper.insertBatchSomeColumn(links);
+    }
+
+    public List<WorkflowLink> getWorkflowInfo(Integer mainId) {
+        QueryWrapper<WorkflowLink> wrapper = Wrappers.query();
+        wrapper.eq("main_id", mainId);
+        return mapper.selectList(wrapper);
+    }
+
+    @Transactional
+    public Response updateLink(WorkflowLink link) {
+        //鑾峰彇褰撳墠鑺傜偣鐨勮褰�
+        WorkflowLink linkInDB = mapper.selectById(link.getId());
+        User user = CommonUtil.getUser();
+        Date now = new Date();
+        //鏍规嵁id.鏌ヨ鍏宠仈鐨勪富琛�
+        WorkflowMain main = mainService.getById(linkInDB.getMainId());
+        //鏌ョ湅鐢宠娴佺▼绫诲瀷
+        switch (main.getType()) {
+            case 1: { //璁惧缁翠慨鐢宠
+                //鏌ョ湅涓昏〃鐨勭姸鎬�
+                if(main.getStatus() == WorkflowEnum.MAIN_STATUS_DEALING.getValue().intValue()){ //寰呭鐞�,涓嬩竴姝ユ槸瀹℃壒閫氳繃,寰呭鐞� 鎴栬�呴┏鍥�
+                    if(link.getStatus() == WorkflowEnum.LINK_STATUS_PASS.getValue().intValue()){
+                        main.setStatus(WorkflowEnum.MAIN_STATUS_WAIT_FOR_DEALING.getValue());
+                        mainService.updateStatus(main);
+                    }else if(link.getStatus() == WorkflowEnum.LINK_STATUS_REJECT.getValue().intValue()){
+                        main.setStatus(WorkflowEnum.MAIN_STATUS_END_REJECT.getValue());
+                        main.setEndReason(link.getDealRejectReason());
+                        main.setEndTime(now);
+                        mainService.updateStatus(main);
+                        link.setDealAndClose(1);
+                    }
+                }
+            }
+
+        }
+
+        link.setId(linkInDB.getId());
+        link.setDealUserId(user.getId());
+        link.setDealTime(now);
+
+        mapper.updateById(link);
+
+        return new Response().setII(1,"鏇存柊瀹屾垚");
+    }
+
+    /**
+     *
+     * @param mainId 鐗瑰畾鐨勫崟鎹�
+     * @param processLevel 鐗瑰畾鐨勮繃绋�
+     * @return 鐗瑰畾鍗曟嵁,鐗瑰畾杩囩▼,鏈畬鎴愮殑浼氱鐨勬暟閲�
+     */
+    private int getLeftAssignNum(Integer mainId, String processLevel) {
+        QueryWrapper<WorkflowLink> query = Wrappers.query();
+        query.select("count(*) as id").eq("main_id",mainId).eq("process_level",processLevel).ne("status",WorkflowEnum.LINK_STATUS_PASS.getValue());
+        return mapper.selectOne(query).getId();
+    }
+
+    /**
+     * 鏇存柊鑺傜偣,涓昏妭鐐逛笉瀹岀粨
+     * @param link 鍙傛暟id,status,dealReason鎴栬�卍ealRejectReason
+     */
+    private void updateLinkField(WorkflowLink link) {
+        Date now = new Date();
+        link.setDealTime(now);
+        mapper.updateById(link);
+    }
+
+
+    public Map<Integer, Integer> getReceivedStatistics(int type, User user) {
+        Map<Integer,Integer> statistics = new HashMap<>();
+        statistics.put(1,0);
+        statistics.put(6,0);
+        statistics.put(58,0);
+        List<WorkflowLink> links = mapper.getReceivedList(type,user);
+        Map<Integer, List<WorkflowLink>> receivedListMap = links.stream().collect(Collectors.groupingBy(WorkflowLink::getStatus));
+        Set<Integer> statusSet = receivedListMap.keySet();
+        for (Integer status : statusSet) {
+            if (status == 5 || status == 8) {
+                statistics.put(58, statistics.get(58) + receivedListMap.get(status).size());
+            } else {
+                statistics.put(status, receivedListMap.get(status).size());
+            }
+        }
+        return statistics;
+    }
+
+    /**
+     *
+     * 浜屾鏍稿鍜岄殣鎮f晠闅滅殑缁熻
+     *
+     * 澧炲姞浜嗗叏閮� 0
+     * 0:鍏ㄩ儴
+     * 1:瀹℃壒涓�
+     * 2:閫氳繃
+     * 3:椹冲洖
+     *
+     * status鍚箟:1-寰呮帴鍗�,6-寰呭鏍�,58-宸插鏍�
+     * @param type
+     * @param user
+     * @return
+     */
+    public Response getReceivedStatistics2(int type, User user) {
+        Map<Integer,Integer> statistics = new HashMap<>();
+        statistics.put(0,0);
+        statistics.put(1,0);
+        statistics.put(2,0);
+        statistics.put(3,0);
+        List<WorkflowLink> links = mapper.getReceivedList2(type,user);
+        Map<Integer, List<WorkflowLink>> receivedListMap = links.stream().collect(Collectors.groupingBy(WorkflowLink::getStatus));
+        Set<Integer> statusSet = receivedListMap.keySet();
+        int sum = 0;
+        for (Integer status : statusSet) {
+            int size = receivedListMap.get(status).size();
+            if (status == 1 || status == 6) { //瀹℃壒涓�
+                statistics.put(1, statistics.get(1) + size);
+            } else if(status == 5){ //閫氳繃
+                statistics.put(2, size);
+            }else if(status == 8){ //椹冲洖
+                statistics.put(3,size);
+            }
+            sum+=size;
+        }
+        statistics.put(0,sum);
+        return new Response().set(1,statistics);
+    }
+
+
+    public void add(WorkflowLink link) {
+        mapper.insert(link);
+    }
+
+
+}
diff --git a/src/main/java/com/whyc/service/WorkflowMainService.java b/src/main/java/com/whyc/service/WorkflowMainService.java
new file mode 100644
index 0000000..b031a7f
--- /dev/null
+++ b/src/main/java/com/whyc/service/WorkflowMainService.java
@@ -0,0 +1,404 @@
+package com.whyc.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.whyc.constant.WorkflowEnum;
+import com.whyc.constant.WorkflowProcessEnum;
+import com.whyc.constant.WorkflowTypeEnum;
+import com.whyc.dto.Response;
+import com.whyc.mapper.WorkflowMainMapper;
+import com.whyc.pojo.db_user.User;
+import com.whyc.pojo.web_site.WorkflowLink;
+import com.whyc.pojo.web_site.WorkflowMain;
+import com.whyc.util.ActionUtil;
+import com.whyc.util.CommonUtil;
+import com.whyc.util.ThreadLocalUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import javax.servlet.ServletContext;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class WorkflowMainService {
+
+    @Resource
+    private WorkflowMainMapper mapper;
+
+    @Autowired(required = false)
+    private WorkflowLinkService linkService;
+
+
+    /**
+     * 鍒嗘淳鍗曞彿:
+     * */
+    public String getNextOrderId(String typeName) {
+        ServletContext application = ActionUtil.getApplication();
+        List<String> orderIdList = (List) application.getAttribute("orderIdList");
+        if(orderIdList == null){
+            orderIdList = new LinkedList<>();
+        }
+        String nextSequence = "";
+        QueryWrapper<WorkflowMain> wrapper = Wrappers.query();
+
+        String orderId = typeName+"-";
+        String ymd = new SimpleDateFormat("yyyyMMdd").format(new Date());
+        orderId = orderId+ymd+"-";
+        //鍏堟煡璇㈡槸鍚︾紦瀛樹腑鏄惁瀛樺湪鍓嶇紑鐩稿悓鐨勫崟鍙�,鏈夌殑璇濆瓨璧锋潵
+        List<Integer> sequenceList = new LinkedList<>();
+        sequenceList.add(0);
+        for (String item : orderIdList) {
+            if(item.startsWith(orderId)){
+                String sequence = item.split("-")[3];
+                sequenceList.add(Integer.parseInt(sequence));
+            }
+        }
+        wrapper.likeRight("order_id",orderId).orderByDesc("order_id").last(" limit 1");
+        WorkflowMain workflowMain = mapper.selectOne(wrapper);
+        if(workflowMain != null){
+            String sequence = workflowMain.getOrderId().split("-")[3];
+            sequenceList.add(Integer.parseInt(sequence));
+        }
+        Integer maxSequence = sequenceList.stream().max(Comparator.comparing(Integer::intValue)).get();
+        nextSequence = String.format("%05d", maxSequence+1);
+        String nextOrderId = orderId + nextSequence;
+        //鍔犲叆缂撳瓨涓�
+        orderIdList.add(nextOrderId);
+        application.setAttribute("orderIdList",orderIdList);
+        return nextOrderId;
+    }
+
+    public void add(WorkflowMain main) {
+        mapper.insert(main);
+    }
+
+    public void addBatch(List<WorkflowMain> workflowMainList) {
+        mapper.insertBatchSomeColumn(workflowMainList);
+    }
+
+
+    public WorkflowMain getBaseInfo(Integer mainId) {
+        //鏍规嵁mainId鏌ヨ鏄摢绉嶇被鍨�
+        QueryWrapper<WorkflowMain> query = Wrappers.query();
+        query.eq("id",mainId).last(" limit 1");
+        WorkflowMain workflowMain = mapper.selectOne(query);
+        Integer type = workflowMain.getType();
+        if(type ==1){
+            //List<BattDischargePlanTemp> tempList = tempService.getListByMainId(mainId);
+            //workflowMain.setTempList(tempList);
+        }
+        List<WorkflowLink> linkList = linkService.getWorkflowInfo(mainId);
+        workflowMain.setLinkList(linkList);
+
+        return workflowMain;
+    }
+
+    public List<WorkflowLink> getAssignReply(Integer mainId) {
+        QueryWrapper<WorkflowLink> wrapper = Wrappers.query();
+        //wrapper.eq("main_id",mainId)
+        //return linkMapper.
+        return null;
+    }
+
+    public void updateStatus(WorkflowMain main) {
+        mapper.updateById(main);
+    }
+
+    /**
+     *
+     * @param userId
+     * @param type
+     * @see WorkflowEnum
+     *
+     * @return
+     */
+    public Response<Map<Integer,Integer>> getOwnStatistics(int userId, int type) {
+        Map<Integer,Integer> statistics = new HashMap<>();
+        statistics.put(1,0);
+        statistics.put(2,0);
+        statistics.put(3,0);
+        QueryWrapper<WorkflowMain> query = Wrappers.query();
+        query.eq("create_user_id",userId).eq("type",type);
+        List<WorkflowMain> mains = mapper.selectList(query);
+        Map<Integer, List<WorkflowMain>> statusListMap = mains.stream().collect(Collectors.groupingBy(WorkflowMain::getStatus));
+        Set<Integer> statusSet = statusListMap.keySet();
+        for (Integer status : statusSet) {
+            statistics.put(status,statusListMap.get(status).size());
+        }
+        return new Response<Map<Integer,Integer>>().set(1,statistics);
+    }
+
+    /**
+     * 浜屾鏍稿鍜屾晠闅滈殣鎮g殑缁熻
+     *
+     * 澧炲姞浜嗗叏閮� key=0
+     * @param type ={0,2,3} 0浠h〃浜屾鏍稿鍜屾晠闅滈殣鎮d竴璧�
+     * @see WorkflowEnum
+     *
+     * @return
+     */
+    public Response<Map<Integer,Integer>> getOwnStatistics2(int userId, int type) {
+        Map<Integer,Integer> statistics = new HashMap<>();
+        statistics.put(0,0);
+        statistics.put(1,0);
+        statistics.put(2,0);
+        statistics.put(3,0);
+        QueryWrapper<WorkflowMain> query = Wrappers.query();
+        query.eq("create_user_id", userId);
+        if(type == 0){
+            query.in("type",2,3);
+        }else {
+            query.eq("type", type);
+        }
+        List<WorkflowMain> mains = mapper.selectList(query);
+        Map<Integer, List<WorkflowMain>> statusListMap = mains.stream().collect(Collectors.groupingBy(WorkflowMain::getStatus));
+        Set<Integer> statusSet = statusListMap.keySet();
+        int sum = 0;
+        for (Integer status : statusSet) {
+            int size = statusListMap.get(status).size();
+            statistics.put(status, size);
+            sum+=size;
+        }
+        statistics.put(0,sum);
+        return new Response<Map<Integer,Integer>>().set(1,statistics);
+    }
+
+    public Response<PageInfo<WorkflowMain>> ownListPage(int userId, int type, int status, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum,pageSize);
+        List<WorkflowMain> mains = getOwnListByUserAndType(userId,type,status);
+        if(type == 1) {
+            for (WorkflowMain main : mains) {
+                Integer id = main.getId();
+                //List<BattDischargePlanTemp> tempList = tempService.getListByMainId(id);
+                //main.setTempList(tempList);
+            }
+        }
+        PageInfo<WorkflowMain> pageInfo = new PageInfo<>(mains);
+        return new Response<PageInfo<WorkflowMain>>().set(1,pageInfo);
+    }
+
+    private List<WorkflowMain> getOwnListByUserAndType(int userId, int type, int status) {
+        QueryWrapper<WorkflowMain> query = Wrappers.query();
+        if(status == 0){
+            query.eq("create_user_id",userId).eq("type",type).orderByDesc("id");
+        }else {
+            query.eq("create_user_id", userId).eq("type", type).eq("status", status).orderByDesc("id");
+        }
+        return mapper.selectList(query);
+    }
+
+    public Response<Map<Integer,Integer>> getReceivedStatistics(int type, User user) {
+        Map<Integer,Integer> statisticsMap = linkService.getReceivedStatistics(type,user);
+        return new Response<Map<Integer,Integer>>().set(1,statisticsMap);
+    }
+
+    public Response<PageInfo<WorkflowMain>> getReceivedListPage(int type, int status, User user, int pageNum, int pageSize) {
+        PageHelper.startPage(pageNum,pageSize);
+        List<WorkflowMain> mains = getReceivedListByUserAndType(user,type,status);
+        if (type == 1) {
+            for (WorkflowMain main : mains) {
+                Integer id = main.getId();
+                //List<BattDischargePlanTemp> tempList = tempService.getListByMainId(id);
+                //main.setTempList(tempList);
+            }
+        }
+        PageInfo<WorkflowMain> pageInfo = new PageInfo<>(mains);
+        return new Response<PageInfo<WorkflowMain>>().set(1, pageInfo);
+    }
+
+    private List<WorkflowMain> getReceivedListByUserAndType(User user, int type, int status) {
+        return mapper.getReceivedListByUserAndType(user, type, status);
+    }
+
+    public WorkflowMain getById(Integer mainId) {
+        return mapper.selectById(mainId);
+    }
+
+    //鏌ヨ琛ㄥ崟缂栧彿
+    public int getMaxId() {
+        Integer id = mapper.getMaxId();
+        if (id == null) {
+            id = 1;
+        } else {
+            id = id + 1;
+        }
+        return id;
+    }
+
+    /**
+     * 閫氱敤鎻愪氦鏂规硶,鎻愪氦缁欒鑹�-瑙掕壊灞�
+     * 濡傛灉related_id涓嶄负绌�,鍒欓渶瑕佺壒娈婂鐞�. 璇佹槑浼氬奖鍝嶅埌鍏宠仈鍗曟嵁
+     */
+
+    @Transactional
+    public Response submit(WorkflowMain main){
+        //1.鎻愪氦鍒板崟鎹鎵规祦绋�
+        //濡傛灉瀛樺湪鍏宠仈鍗曟嵁id,棣栧厛鏍¢獙鎻愪氦鐨勬暟閲�
+        Date now = new Date();
+        WorkflowMain mainRelated = getById(main.getRelatedId());
+        if(main.getRelatedId() != null) {
+            if (main.getQuantity() > mainRelated.getQuantity()) {
+                return new Response().setII(1, "鍏ュ簱鏁伴噺涓嶈兘澶т簬缁翠慨鐢宠鍏宠仈鍗曟嵁鐨勬暟閲�");
+            }
+        }
+        //涓昏〃鎻掑叆
+        //鍒濆鍖栫浉鍏冲瓧娈�
+        WorkflowTypeEnum typeEnum = WorkflowTypeEnum.getByType(main.getType());
+        String name = typeEnum.getName();
+        String namingPrefix = typeEnum.getNamingPrefix();
+        String orderId = getNextOrderId(namingPrefix);
+        //String title = mainTypeCN+"瀹℃壒鍗�-"+ DateUtil.YYYY_MM_DD_HH_MM_SS.format(now);
+
+        String title = name + ThreadLocalUtil.format(ThreadLocalUtil.TIME_YYYY_MM_DD_HH_MM_SS, now);
+        Integer mainStatus = WorkflowEnum.MAIN_STATUS_DEALING.getValue();
+        User user = CommonUtil.getUser();
+        WorkflowProcessEnum process = getProcessLevel(main.getType(),user.getRole());
+        main.setOrderId(orderId);
+        main.setTitle(title);
+        main.setCreateUserId(user.getId());
+        main.setCreateTime(now);
+        main.setBeginTime(now);
+        main.setStatus(mainStatus);
+        main.setProcessStage(process.getStage());
+        add(main);
+        //鍐呭瓨涓幓闄ゅ凡鎻掑叆鏁版嵁搴撶殑鍗曞彿
+        ServletContext application = ActionUtil.getApplication();
+        List<String> orderIdList = (List<String>) application.getAttribute("orderIdList");
+        //鏍¢獙鏄惁鍘婚櫎
+        boolean remove = orderIdList.remove(orderId);
+        if(!remove){
+            System.err.println("娌℃湁鍘婚櫎鎺�!!!!!!!!!!!!!");
+        }
+        application.setAttribute("orderIdList",orderIdList);
+
+        //鑺傜偣琛ㄦ彃鍏�
+        WorkflowLink link = new WorkflowLink();
+        link.setMainId(main.getId());
+        link.setParentId(0);
+        link.setProcessStage(process.getStage());
+        link.setProcessName(process.getName());
+        link.setCreateTime(now);
+        link.setDealRoleId(getNextDealRoleId(process.getName()));
+        link.setDealType(WorkflowEnum.TYPE_DELIVER.getValue());
+        link.setDealDesc(main.getTaskDesc());
+        link.setStatus(WorkflowEnum.LINK_STATUS_TAKING.getValue());
+
+        linkService.add(link);
+
+        //濡傛灉瀛樺湪鍏宠仈鍗曟嵁id,澶勭悊鍏宠仈鍗曟嵁鍙婅嚜鍔ㄧ敓鎴愭柊鍗曟嵁
+        checkRelatedAndDone(main, now, mainRelated, user);
+        return new Response().setII(1,"鎻愪氦瀹屾垚");
+    }
+
+    private void checkRelatedAndDone(WorkflowMain main, Date now, WorkflowMain mainRelated, User user) {
+        if(main.getRelatedId() != null){
+            //鍒ゆ柇鏄敵璇风殑鍏ュ簱,杩樻槸鎶ュ簾.
+            if (main.getQuantity() < mainRelated.getQuantity()){ //璇存槑闇�瑕佽嚜鍔ㄧ敓鎴愬叆搴撴垨鑰呮姤搴熷崟鎹�
+                //闇�瑕佽嚜鍔ㄧ敓鎴愭姤搴熺殑鐢宠
+                WorkflowMain mainAuto = new WorkflowMain();
+                WorkflowTypeEnum typeEnumAuto;
+
+                Integer statusAuto = WorkflowEnum.MAIN_STATUS_DEALING.getValue();
+                WorkflowProcessEnum processAuto = WorkflowProcessEnum.PROCESS_MANAGER1SIGN;
+                mainAuto.setCreateUserId(user.getId());
+                mainAuto.setCreateTime(now);
+                mainAuto.setBeginTime(now);
+                mainAuto.setQuantity(mainRelated.getQuantity()- main.getQuantity());
+                mainAuto.setProcessStage(processAuto.getStage());
+                mainAuto.setStatus(statusAuto);
+
+                if(main.getType() == WorkflowTypeEnum.DEVICE_IN.getType().intValue()) { //鐢宠鐨勫叆搴�
+                    mainAuto.setTaskDesc("鎻愪氦浜嗙淮淇悗鐨勫叆搴撶敵璇�,绯荤粺鑷姩鐢熸垚鍓╀綑鏁伴噺鐨勬姤搴熺敵璇�");
+                    typeEnumAuto = WorkflowTypeEnum.DEVICE_SCRAP;
+                }else { //鐢宠鐨勬姤搴�
+                    mainAuto.setTaskDesc("鎻愪氦浜嗙淮淇悗鐨勬姤搴熺敵璇�,绯荤粺鑷姩鐢熸垚鍓╀綑鏁伴噺鐨勫叆搴撶敵璇�");
+                    typeEnumAuto = WorkflowTypeEnum.DEVICE_IN;
+                }
+                mainAuto.setOrderId(getNextOrderId(typeEnumAuto.getNamingPrefix()));
+                String titleAuto = typeEnumAuto.getName() + ThreadLocalUtil.format(ThreadLocalUtil.TIME_YYYY_MM_DD_HH_MM_SS, now);
+                mainAuto.setTitle(titleAuto);
+                mainAuto.setType(typeEnumAuto.getType());
+                add(mainAuto);
+
+                //鑷姩鑺傜偣鐢熸垚
+                WorkflowLink linkAuto = new WorkflowLink();
+                linkAuto.setParentId(0);
+                linkAuto.setProcessStage(processAuto.getStage());
+                linkAuto.setProcessName(processAuto.getName());
+                linkAuto.setCreateTime(now);
+                linkAuto.setDealRoleId(getNextDealRoleId(processAuto.getName()));
+                linkAuto.setDealType(WorkflowEnum.TYPE_DELIVER.getValue());
+                linkAuto.setStatus(WorkflowEnum.LINK_STATUS_TAKING.getValue());
+                linkAuto.setMainId(mainAuto.getId());
+                linkAuto.setDealDesc(mainAuto.getTaskDesc());
+                linkService.add(linkAuto);
+
+            }
+            //鍏抽棴鍏宠仈鍗曟嵁鐨勭姸鎬�
+            WorkflowMain relatedMain = new WorkflowMain();
+            relatedMain.setId(main.getRelatedId());
+            relatedMain.setStatus(WorkflowEnum.MAIN_STATUS_END_DEALT.getValue());
+            relatedMain.setEndTime(now);
+            if(main.getType() == WorkflowTypeEnum.DEVICE_IN.getType().intValue()) {
+                relatedMain.setEndReason("鐢ㄦ埛鎻愪氦缁翠慨鐢宠鍚庣殑鍏ュ簱鐢宠,缁翠慨娴佺▼缁撴潫");
+            }else{
+                relatedMain.setEndReason("鐢ㄦ埛鎻愪氦缁翠慨鐢宠鍚庣殑鎶ュ簾鐢宠,缁翠慨娴佺▼缁撴潫");
+            }
+            updateStatus(relatedMain);
+        }
+    }
+
+    /**
+     * TODO 姣忔鏂板娴佺▼鏃�,闇�瑕佹寔缁淮鎶�
+     * 濡傛灉鍚庣画瀛樺湪浼氱,鍒欓渶瑕佽拷鍔犱竴涓type绫诲瀷鐨勫悓鍚嶆柟娉�
+     * @param processLevelName 娴佺▼闃舵鍚�
+     * @return 娴佺▼澶勭悊鐨勪笅涓�涓鑹�
+     */
+    private Integer getNextDealRoleId(String processLevelName) {
+        WorkflowProcessEnum processEnum = WorkflowProcessEnum.getByName(processLevelName);
+        switch (processEnum){
+            //瑙掕壊:1鏅�氱敤鎴凤紝2绠$悊灞傦紝3棰嗗灞傦紝4杩愮淮鐝粍
+            case PROCESS_MANAGER1SIGN:
+                return 2;
+            default:
+                return 2;
+        }
+    }
+
+    /**
+     * TODO 姣忔鏂板娴佺▼鏃�,闇�瑕佹寔缁淮鎶�
+     * @param type 娴佺▼鐨勭被鍨�
+     * @param roleId 鐜板湪鐨勮鑹�
+     * @return 娴佺▼澶勭悊鐨勪笅涓�涓鑹�
+     */
+    private WorkflowProcessEnum getProcessLevel(Integer type,Integer roleId) {
+        WorkflowTypeEnum typeEnum = WorkflowTypeEnum.getByType(type);
+        String name = typeEnum.getName();
+        //瑙掕壊:1鏅�氱敤鎴凤紝2绠$悊灞傦紝3棰嗗灞傦紝4杩愮淮鐝粍
+        switch (name){
+            //瀹℃壒椤哄簭涓� 鏅�氱敤鎴�->绠$悊鍛� ->鏅�氱敤鎴�(杩涜瀹岀粨)
+            case "璁惧缁翠慨鐢宠鍗�":
+            case "璁惧鍏ュ簱鐢宠鍗�":
+            case "璁惧鎶ュ簾鐢宠鍗�":
+            case "璁惧鍑哄簱鐢宠鍗�":
+                if (roleId == 1) {
+                    return WorkflowProcessEnum.PROCESS_MANAGER1SIGN;
+                }
+            default:
+                return WorkflowProcessEnum.PROCESS_SPECIALIST;
+        }
+    }
+
+    public void updateProcessLevel(String processLevel, Integer mainId) {
+        UpdateWrapper<WorkflowMain> update = Wrappers.update();
+        update.set("process_level",processLevel).eq("id",mainId);
+        mapper.update((WorkflowMain) ActionUtil.objeNull,update);
+    }
+}
diff --git a/src/main/java/com/whyc/util/CommonUtil.java b/src/main/java/com/whyc/util/CommonUtil.java
index a22d883..26725ac 100644
--- a/src/main/java/com/whyc/util/CommonUtil.java
+++ b/src/main/java/com/whyc/util/CommonUtil.java
@@ -45,6 +45,7 @@
             user = new User();
             user.setName("unlogged_user");
             user.setId(0);
+            user.setRole(1);
         }
         return user;
     }
diff --git a/src/main/java/com/whyc/util/ThreadLocalUtil.java b/src/main/java/com/whyc/util/ThreadLocalUtil.java
index c41c568..4507ed3 100644
--- a/src/main/java/com/whyc/util/ThreadLocalUtil.java
+++ b/src/main/java/com/whyc/util/ThreadLocalUtil.java
@@ -53,6 +53,12 @@
         return timeStr;
     }
 
+    /**
+     *
+     * @param timeFormat
+     * @param date
+     * @return
+     */
     public static String format(String timeFormat,Date date) {
         ThreadLocal<SimpleDateFormat> formatThreadLocal = ThreadLocal.withInitial(() -> new SimpleDateFormat(timeFormat));
         SimpleDateFormat format = formatThreadLocal.get();
diff --git a/src/main/resources/mapper/WorkflowLinkMapper.xml b/src/main/resources/mapper/WorkflowLinkMapper.xml
new file mode 100644
index 0000000..7c5cc2b
--- /dev/null
+++ b/src/main/resources/mapper/WorkflowLinkMapper.xml
@@ -0,0 +1,323 @@
+<?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.whyc.mapper.WorkflowLinkMapper">
+    <resultMap id="linkMain" type="WorkflowLink">
+        <result column="lid" property="id"></result>
+        <result column="lmain_id" property="mainId"></result>
+        <result column="parent_id" property="parentId"></result>
+        <result column="lprocess_level" property="processLevel"></result>
+        <result column="process_level_name" property="processLevelName"></result>
+        <result column="lcreate_time" property="createTime"></result>
+        <result column="deal_user_id" property="dealUserId"></result>
+        <result column="deal_type" property="dealType"></result>
+        <result column="deal_desc" property="dealDesc"></result>
+        <result column="deal_file_name" property="dealFileName"></result>
+        <result column="deal_file_url" property="dealFileUrl"></result>
+        <result column="deal_pic_name" property="dealPicName"></result>
+        <result column="deal_pic_url" property="dealPicUrl"></result>
+        <result column="lstatus" property="status"></result>
+        <result column="deal_role_id" property="dealRoleId"></result>
+        <result column="deal_and_close" property="dealAndClose"></result>
+        <result column="deal_reject_reason" property="dealRejectReason"></result>
+        <result column="deal_task_num" property="dealTaskNum"></result>
+        <result column="deal_task_reply_num" property="dealTaskReplyNum"></result>
+        <result column="deal_reason" property="dealReason"></result>
+        <result column="required_finish_time" property="requiredFinishTime"></result>
+        <result column="deal_time" property="dealTime"></result>
+        <result column="reply_content" property="replyContent"></result>
+        <result column="reply_time" property="replyTime"></result>
+        <association property="workflowMain" javaType="WorkflowMain">
+            <result column="mid" property="id"></result>
+            <result column="order_id" property="orderId"></result>
+            <result column="title" property="title"></result>
+            <result column="task_desc" property="taskDesc"></result>
+            <result column="create_user_id" property="createUserId"></result>
+            <result column="mcreate_time" property="createTime"></result>
+            <result column="plan_begin_time" property="planBeginTime"></result>
+            <result column="plan_end_time" property="planEndTime"></result>
+            <result column="begin_time" property="beginTime"></result>
+            <result column="end_time" property="endTime"></result>
+            <result column="task_level" property="taskLevel"></result>
+            <result column="is_in_time" property="inTime"></result>
+            <result column="mstatus" property="status"></result>
+            <result column="mprocess_level" property="processLevel"></result>
+            <result column="file_name" property="fileName"></result>
+            <result column="file_url" property="fileUrl"></result>
+            <result column="pic_name" property="picName"></result>
+            <result column="pic_url" property="picUrl"></result>
+            <result column="end_reason" property="endReason"></result>
+            <result column="is_auto" property="auto"></result>
+            <result column="type" property="type"></result>
+        </association>
+    </resultMap>
+    <select id="getReceivedList" resultType="com.whyc.pojo.web_site.WorkflowLink">
+        (
+            SELECT l.*
+            FROM web_site.tb_workflow_main m,
+                 web_site.tb_workflow_link l
+                 where m.id = l.main_id
+              and m.type = #{type}
+                and l.deal_user_id = #{user.uId}
+        )
+        union all
+        (
+            SELECT l.*
+            FROM web_site.tb_workflow_main m,
+                 web_site.tb_workflow_link l
+            where m.id = l.main_id
+              and m.type = #{type}
+              and l.deal_role_id = #{user.uRole}
+              and l.deal_user_id is null
+        )
+    </select>
+
+    <select id="getReceivedList2" resultType="com.whyc.pojo.web_site.WorkflowLink">
+        (
+        SELECT l.*
+        FROM web_site.tb_workflow_main m,
+        web_site.tb_workflow_link l
+        where m.id = l.main_id
+        <choose>
+            <when test="type == 0">
+                and m.type in (2,3)
+            </when>
+            <otherwise>
+                and m.type = #{type}
+            </otherwise>
+        </choose>
+        and l.deal_user_id = #{user.uId}
+        )
+        union all
+        (
+        SELECT l.*
+        FROM web_site.tb_workflow_main m,
+        web_site.tb_workflow_link l
+        where m.id = l.main_id
+        <choose>
+            <when test="type == 0">
+                and m.type in (2,3)
+            </when>
+            <otherwise>
+                and m.type = #{type}
+            </otherwise>
+        </choose>
+        and l.deal_role_id = #{user.uRole}
+        and l.deal_user_id is null
+        )
+    </select>
+
+    <select id="searchTmp" resultMap="linkMain">
+        (
+        SELECT parent_id
+        , process_level_name
+        , deal_user_id
+        , deal_type
+        , deal_desc
+        , deal_file_name
+        , deal_file_url
+        , deal_pic_name
+        , deal_pic_url
+        , deal_role_id
+        , deal_and_close
+        , deal_reject_reason
+        , deal_task_num
+        , deal_task_reply_num
+        , deal_reason
+        , required_finish_time
+        , deal_time
+        , reply_content
+        , reply_time
+        , l.process_level as lprocess_level
+        , l.main_id as lmain_id
+        , l.id as lid
+        , l.status as lstatus
+        , l.create_time as lcreate_time
+        , order_id
+        , title
+        , task_desc
+        , create_user_id
+        , plan_begin_time
+        , plan_end_time
+        , begin_time
+        , end_time
+        , task_level
+        , is_in_time
+        , file_name
+        , file_url
+        , pic_name
+        , pic_url
+        , end_reason
+        , is_auto
+        , m.type
+        , m.id as mid
+        , m.process_level as mprocess_level
+        , m.status as mstatus
+        , m.create_time as mcreate_time
+        FROM web_site.tb_workflow_link l
+        LEFT OUTER JOIN web_site.tb_workflow_main m on m.id = l.main_id
+        <where>
+            l.deal_user_id = #{uId}
+            <if test="type!=0">
+                and m.type = #{type}
+            </if>
+            <if test="type==0">
+                and m.type != 1
+            </if>
+            <if test="status==1">
+                and m.status = #{status}
+                and l.status in (0,1,6)
+            </if>
+            <if test="status==2">
+                and l.status =5
+            </if>
+            <if test="status==3">
+                and m.status = #{status}
+                and l.status =8
+            </if>
+        </where>
+
+        )
+        union all
+        (
+        SELECT parent_id
+        , process_level_name
+        , deal_user_id
+        , deal_type
+        , deal_desc
+        , deal_file_name
+        , deal_file_url
+        , deal_pic_name
+        , deal_pic_url
+        , deal_role_id
+        , deal_and_close
+        , deal_reject_reason
+        , deal_task_num
+        , deal_task_reply_num
+        , deal_reason
+        , required_finish_time
+        , deal_time
+        , reply_content
+        , reply_time
+        , l.process_level as lprocess_level
+        , l.main_id as lmain_id
+        , l.id as lid
+        , l.status as lstatus
+        , l.create_time as lcreate_time
+        , order_id
+        , title
+        , task_desc
+        , create_user_id
+        , plan_begin_time
+        , plan_end_time
+        , begin_time
+        , end_time
+        , task_level
+        , is_in_time
+        , file_name
+        , file_url
+        , pic_name
+        , pic_url
+        , end_reason
+        , is_auto
+        , m.type
+        , m.id as mid
+        , m.process_level as mprocess_level
+        , m.status as mstatus
+        , m.create_time as mcreate_time
+        FROM web_site.tb_workflow_link l
+        LEFT OUTER JOIN web_site.tb_workflow_main m on m.id = l.main_id
+        <where>
+            l.deal_role_id = #{uRole}
+            and l.deal_user_id is null
+            <if test="type!=0">
+                and m.type = #{type}
+            </if>
+            <if test="type==0">
+                and m.type != 1
+            </if>
+            <if test="status==1">
+                and m.status = #{status}
+                and l.status in (0,1,6)
+            </if>
+            <if test="status==2">
+                and l.status =5
+            </if>
+            <if test="status==3">
+                and m.status = #{status}
+                and l.status =8
+            </if>
+        </where>
+        )
+        ORDER BY lid
+    </select>
+    <resultMap id="Mainlink" type="WorkflowMain">
+        <result column="id" property="id"></result>
+        <result column="order_id" property="orderId"></result>
+        <result column="title" property="title"></result>
+        <result column="task_desc" property="taskDesc"></result>
+        <result column="create_user_id" property="createUserId"></result>
+        <result column="create_time" property="createTime"></result>
+        <result column="plan_begin_time" property="planBeginTime"></result>
+        <result column="plan_end_time" property="planEndTime"></result>
+        <result column="begin_time" property="beginTime"></result>
+        <result column="end_time" property="endTime"></result>
+        <result column="task_level" property="taskLevel"></result>
+        <result column="is_in_time" property="inTime"></result>
+        <result column="status" property="status"></result>
+        <result column="file_name" property="fileName"></result>
+        <result column="file_url" property="fileUrl"></result>
+        <result column="pic_name" property="picName"></result>
+        <result column="pic_url" property="picUrl"></result>
+        <result column="end_reason" property="endReason"></result>
+        <result column="is_auto" property="auto"></result>
+        <result column="type" property="type"></result>
+        <result column="process_level" property="processLevel"></result>
+        <collection property="workflowLink" javaType="WorkflowLink" ofType="com.whyc.pojo.WorkflowLink"
+                    column="{main_id=id}" select="selectWorkflowLink">
+        </collection>
+    </resultMap>
+    <select id="getFlowMainByUid" resultMap="Mainlink">
+        SELECT
+        id
+        ,order_id
+        , title
+        , task_desc
+        , create_user_id
+        , plan_begin_time
+        , plan_end_time
+        , begin_time
+        , end_time
+        , task_level
+        , is_in_time
+        , file_name
+        , file_url
+        , pic_name
+        , pic_url
+        , end_reason
+        , is_auto
+        , type
+        ,status
+        , create_time
+        ,process_level
+        FROM web_site.tb_workflow_main m
+        <where>
+            m.create_user_id=#{userId}
+            <if test="type!=0">
+                and m.type = #{type}
+            </if>
+            <if test="type==0">
+                and m.type != 1
+            </if>
+            <if test="status!=0">
+                and m.status = #{status}
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+    <select id="selectWorkflowLink" resultType="workflowLink">
+        SELECT *
+        from web_site.tb_workflow_link
+        where main_id = #{main_id}
+        order by parent_id desc limit 1
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/WorkflowMainMapper.xml b/src/main/resources/mapper/WorkflowMainMapper.xml
new file mode 100644
index 0000000..8c5dced
--- /dev/null
+++ b/src/main/resources/mapper/WorkflowMainMapper.xml
@@ -0,0 +1,128 @@
+<?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.whyc.mapper.WorkflowMainMapper" >
+
+    <sql id="linkColumn">
+        l.id link_id,
+        l.main_id,
+        l.parent_id,
+        l.process_level as lProcessLevel,
+        l.process_level_name,
+        l.create_time link_create_time,
+        l.deal_user_id,
+        l.deal_type,
+        l.deal_desc,
+        l.deal_file_name,
+        l.deal_file_url,
+        l.deal_pic_name,
+        l.deal_pic_url,
+        l.status link_status,
+        l.deal_role_id,
+        l.deal_and_close,
+        l.deal_reject_reason,
+        l.deal_task_num,
+        l.deal_task_reply_num,
+        l.deal_reason,
+        l.required_finish_time,
+        l.deal_time,
+        l.reply_content,
+        l.reply_time
+    </sql>
+
+    <resultMap id="Map_WorkflowMain" type="WorkflowMain">
+        <id column="id" property="id"/>
+        <result column="title" property="title"/>
+        <result column="order_id" property="orderId"/>
+        <result column="task_desc" property="taskDesc"/>
+        <result column="create_time" property="createTime"/>
+        <result column="create_user_id" property="createUserId"/>
+        <result column="create_user_name" property="createUserName"/>
+        <result column="plan_begin_time" property="planBeginTime"/>
+        <result column="plan_end_time" property="planEndTime"/>
+        <result column="begin_time" property="beginTime"/>
+        <result column="end_time" property="endTime"/>
+        <result column="task_level" property="taskLevel"/>
+        <result column="is_in_time" property="inTime"/>
+        <result column="file_name" property="fileName"/>
+        <result column="file_url" property="fileUrl"/>
+        <result column="pic_name" property="picName"/>
+        <result column="pic_url" property="picUrl"/>
+        <result column="end_reason" property="endReason"/>
+        <result column="status" property="status"/>
+        <result column="is_auto" property="auto"/>
+        <result column="type" property="type"/>
+        <collection property="linkList" ofType="WorkflowLink">
+            <id column="link_id" property="id"/>
+            <result column="main_id" property="mainId"/>
+            <result column="parent_id" property="parentId"/>
+            <result column="lProcessLevel" property="processLevel"/>
+            <result column="process_level_name" property="processLevelName"/>
+            <result column="link_create_time" property="createTime"/>
+            <result column="deal_user_id" property="dealUserId"/>
+            <result column="deal_type" property="dealType"/>
+            <result column="deal_desc" property="dealDesc"/>
+            <result column="deal_file_name" property="dealFileName"/>
+            <result column="deal_file_url" property="dealFileUrl"/>
+            <result column="deal_pic_name" property="dealPicName"/>
+            <result column="deal_pic_url" property="dealPicUrl"/>
+            <result column="link_status" property="status"/>
+            <result column="deal_role_id" property="dealRoleId"/>
+            <result column="deal_and_close" property="dealAndClose"/>
+            <result column="deal_reject_reason" property="dealRejectReason"/>
+            <result column="deal_task_num" property="dealTaskNum"/>
+            <result column="deal_task_reply_num" property="dealTaskReplyNum"/>
+            <result column="deal_reason" property="dealReason"/>
+            <result column="deal_time" property="dealTime"/>
+            <result column="required_finish_time" property="requiredFinishTime"/>
+            <result column="reply_content" property="replyContent"/>
+            <result column="reply_time" property="replyTime"/>
+        </collection>
+    </resultMap>
+
+    <select id="getReceivedListByUserAndType" resultMap="Map_WorkflowMain">
+        <choose>
+            <!--鍏ㄩ儴-->
+            <when test="status==0">
+                SELECT m.*,u.uName as create_user_name,<include refid="linkColumn" />
+                    FROM web_site.tb_workflow_main m,web_site.tb_workflow_link l,db_user.tb_user_inf u
+                    where m.id = l.main_id
+                    and m.create_user_id = u.uId
+                    and m.type = #{type}
+                    and l.deal_role_id = #{user.uRole}
+                    and l.deal_user_id is null
+                union all
+                SELECT m.*,u.uName as create_user_name,<include refid="linkColumn" />
+                    FROM web_site.tb_workflow_main m,web_site.tb_workflow_link l,db_user.tb_user_inf u
+                    where m.id = l.main_id
+                    and m.create_user_id = u.uId
+                    and m.type = #{type}
+                    and l.deal_user_id = #{user.uId} order by id desc
+            </when>
+            <!--寰呮帴鍗�-->
+            <when test="status==1">
+                SELECT m.*,u.uName as create_user_name,<include refid="linkColumn" />
+                FROM web_site.tb_workflow_main m,web_site.tb_workflow_link l,db_user.tb_user_inf u
+                where m.id = l.main_id
+                and m.create_user_id = u.uId
+                and m.type = #{type}
+                and l.deal_role_id = #{user.uRole}
+                and l.deal_user_id is null
+                and l.status = #{status} order by m.id desc
+            </when>
+            <otherwise>
+                SELECT m.*,u.uName as create_user_name,<include refid="linkColumn" />
+                FROM web_site.tb_workflow_main m,web_site.tb_workflow_link l,db_user.tb_user_inf u
+                where m.id = l.main_id
+                and m.create_user_id = u.uId
+                and m.type = #{type}
+                and l.deal_user_id = #{user.uId}
+                and l.status = #{status} order by m.id desc
+            </otherwise>
+        </choose>
+
+    </select>
+    <select id="getMaxId" resultType="java.lang.Integer">
+        select max(id)
+        from web_site.tb_workflow_main
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1