27cd10e78f10f93c900aacc57e677580dbf6d0ca..64f046ed41c2ae607dc065c82b6d454f64e90584
7 天以前 whyclxw
预警分析管理-电源告警
64f046 对比 | 目录
7 天以前 whyclxw
预警分析管理-电源告警
257c8b 对比 | 目录
7 天以前 whyclxw
Merge branch 'master' of http://118.89.139.230:10101/r/powerIntelligenceSystem
326468 对比 | 目录
7 天以前 whyclxw
预警分析管理-主属性和分析属性
669906 对比 | 目录
7 天以前 whycxzp
维修调度-工单模块的设备信息关联处理
220530 对比 | 目录
7 天以前 whycxzp
维修调度-工单模块的设备信息关联处理
db0054 对比 | 目录
7 天以前 whycxzp
维修调度-工单模块的设备信息关联表
e0ffff 对比 | 目录
7 天以前 whycxzp
维修调度-出库
010609 对比 | 目录
7 天以前 whyclxw
判断优良电源性能
cfdb27 对比 | 目录
7 天以前 whyclxw
判断优良电源性能
e10896 对比 | 目录
7 天以前 whyclxw
判断优良电源性能
3f10a9 对比 | 目录
7 天以前 whyclxw
判断优良电源性能
9f46f8 对比 | 目录
7 天以前 whyclxw
电池告警参数全部导出加设备名
270056 对比 | 目录
7 天以前 DELL
项目规格书提交
43a6a1 对比 | 目录
7 天以前 whyclxw
平台需求分析文件
43c7a1 对比 | 目录
7 天以前 whyclxw
平台需求分析文件
b529f0 对比 | 目录
7 天以前 whyclxw
3.1预警设置界面用于导出的查询
e77384 对比 | 目录
7 天以前 whyclxw
Merge branch 'master' of http://118.89.139.230:10101/r/powerIntelligenceSystem
a7e068 对比 | 目录
7 天以前 whyclxw
1.2.7优良电源统计
1157cd 对比 | 目录
7 天以前 whycxzp
维修调度-维修-入库-报废
98d543 对比 | 目录
7 天以前 whycxzp
维修调度-维修 增加剩余未处理数量
8a299b 对比 | 目录
7 天以前 whycxzp
维修调度-维修-入库-报废 流程的申请及自动化流程的申请
08879b 对比 | 目录
25个文件已修改
22个文件已添加
2557 ■■■■■ 已修改文件
PlateFormFile/直流电源智慧平台开发计划.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
PlateFormFile/直流电源智慧平台需求规格书2.0.docx 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/RoleEnum.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/WorkflowEnum.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/WorkflowProcessEnum.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/constant/WorkflowTypeEnum.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/AlmParamController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/StatisticController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/WorkflowLinkController.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/WorkflowMainController.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/dto/Statistic/SticPwr7Res.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/AlmAnalysisParamMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/BattAlmparamMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/PwrdevAlarmMapper.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/PwrdevAlarmParamMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/WorkflowDeviceMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/WorkflowLinkMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/WorkflowMainMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_param/AlmAnalysisParam.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_param/BattAlmparam.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/db_param/PowerPropertyParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/web_site/WorkflowDevice.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/web_site/WorkflowLink.java 288 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/web_site/WorkflowMain.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/AlmAnalysisParamService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/AppParamService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BaojigroupService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BattAlmparamService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BattRealdataIdService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/BatttestdataInfService.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PwrdevAlarmParamService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PwrdevAlarmService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/PwrdevHistorydataIdService.java 59 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/SubTablePageInfoService.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/WorkflowDeviceService.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/WorkflowLinkService.java 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/WorkflowMainService.java 511 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/ActionUtil.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/CommonUtil.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/ThreadLocalUtil.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BattAlmparamMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BattalarmDataMapper.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PowerPropertyParamMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PwrdevAlarmMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/PwrdevAlarmParamMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WorkflowLinkMapper.xml 323 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WorkflowMainMapper.xml 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PlateFormFile/Ö±Á÷µçÔ´ÖÇ»ÛÆ½Ì¨¿ª·¢¼Æ»®.xlsx
Binary files differ
PlateFormFile/Ö±Á÷µçÔ´ÖÇ»ÛÆ½Ì¨ÐèÇ󹿏ñÊé2.0.docx
Binary files differ
src/main/java/com/whyc/constant/RoleEnum.java
New file
@@ -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;
    }
}
src/main/java/com/whyc/constant/WorkflowEnum.java
New file
@@ -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;
    }
}
src/main/java/com/whyc/constant/WorkflowProcessEnum.java
New file
@@ -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;
    }
}
src/main/java/com/whyc/constant/WorkflowTypeEnum.java
New file
@@ -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;
    }
}
src/main/java/com/whyc/controller/AlmParamController.java
@@ -39,6 +39,9 @@
    private BattalarmDataService battalarmDataService;
    @Autowired
    private PwrdevAlarmService pwrdevAlarmService;
    @Autowired
    private BattRealdataIdService battRealdataIdService;
@@ -53,6 +56,13 @@
    @ApiOperation("获取电池告警参数")
    public Response getBattAlmParam(@RequestBody ParamAlmDto dto){
        return battAlmparamService.getBattAlmParam(dto);
    }
    @GetMapping("getBattAlmParamToExport")
    @ApiOperation("获取电池告警参数(无参用于导出)")
    public Response getBattAlmParamToExport(){
        Integer uid=ActionUtil.getUser().getId();
        return battAlmparamService.getBattAlmParamToExport(uid);
    }
    @PostMapping("setBattAlmParam")
@@ -86,7 +96,12 @@
        return pwrAlmparamService.getPwrAlmParam(dto);
    }
    @GetMapping("getPwrAlmParamToExport")
    @ApiOperation("获取电源告警参数(无参用于导出)")
    public Response getPwrAlmParamToExport(){
        Integer uid=ActionUtil.getUser().getId();
        return pwrAlmparamService.getPwrAlmParamToExport(uid);
    }
    @PostMapping("setPwrAlmParam")
    @ApiOperation("修改电源告警参数")
    public Response setPwrAlmParam(@RequestBody List<PwrdevAlarmParam> almparamList){
@@ -123,9 +138,17 @@
    }
    @GetMapping("getBattHisRealInAlm")
    @ApiOperation("电池告警点击具体告警信息查看从告警开始时间到现在的历史实时数据")
    public Response getBattHisRealInAlm(@RequestParam Integer battgroupId,@RequestParam String startTime,@RequestParam(required = false) Integer monNum) throws ParseException, InterruptedException {
        return battRealdataIdService.getBattHisRealInAlm(battgroupId,startTime,monNum);
    @ApiOperation("预警分析管理-主属性和分析属性")
    public Response getBattHisRealInAlm(@RequestParam Integer battgroupId,@RequestParam String startTime,@RequestParam(required = false) Integer almId) throws ParseException, InterruptedException {
        return battRealdataIdService.getBattHisRealInAlm(battgroupId,startTime,almId);
    }
    @PostMapping("getPwrtAlmAnalyse")
    @ApiOperation("预警分析管理-电源告警")
    public Response getPwrtAlmAnalyse(@RequestBody AlmAnalyseDto dto){
        Integer uid=ActionUtil.getUser().getId();
        dto.setUid(uid);
        return pwrdevAlarmService.getPwrtAlmAnalyse(dto);
    }
}
src/main/java/com/whyc/controller/StatisticController.java
@@ -90,7 +90,7 @@
    }
    @ApiOperation(value = "优良电源数量统计(1.2.7)")
    @PostMapping("getPwr7Statistic")
    public Response getPwr7Statistic(@RequestBody Pwr7Stic stic){
    public Response getPwr7Statistic(@RequestBody Pwr7Stic stic) throws NoSuchFieldException, IllegalAccessException {
        User uinf= ActionUtil.getUser();
        stic.setUid(uinf.getId());
        return battTinfService.getPwr7Statistic(stic);
src/main/java/com/whyc/controller/WorkflowLinkController.java
New file
@@ -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或者dealRejectReason;" +
            "字段status:5-通过,8-驳回")
    public Response updateLink(@RequestBody WorkflowLink link) {
        return service.updateLink(link);
    }
}
src/main/java/com/whyc/controller/WorkflowMainController.java
New file
@@ -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);
    }
}
src/main/java/com/whyc/dto/Statistic/SticPwr7Res.java
@@ -17,5 +17,5 @@
    private Date inuseTime;
    private String stationType;
    private String groupName;
    private String performanceName;//电池性能:1优秀,2劣化,3损坏 4未放电 ä¸ä¼ å…¨éƒ¨
    private String performanceName;//电池性能:1优秀,2一般,3预警 4严重不传全部
}
src/main/java/com/whyc/mapper/AlmAnalysisParamMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.db_param.AlmAnalysisParam;
public interface AlmAnalysisParamMapper extends CustomMapper<AlmAnalysisParam>{
}
src/main/java/com/whyc/mapper/BattAlmparamMapper.java
@@ -9,4 +9,6 @@
public interface BattAlmparamMapper extends CustomMapper<BattAlmparam>{
    //获取电池告警参数
    List<BattAlmparam> getBattAlmParam(@Param("almDto") AlmDto almDto);
    //获取电池告警参数(无参用于导出)
    List<BattAlmparam> getBattAlmParamToExport(@Param("uid") Integer uid);
}
src/main/java/com/whyc/mapper/PwrdevAlarmMapper.java
@@ -1,8 +1,10 @@
package com.whyc.mapper;
import com.whyc.dto.AlarmDto;
import com.whyc.dto.Param.AlmAnalyseDto;
import com.whyc.dto.Real.AlmDto;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarm;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmParam;
import com.whyc.pojo.web_site.AlarmInspection;
import java.util.List;
@@ -14,5 +16,6 @@
    List<AlarmInspection> getListGreatThan(Long id);
    List<AlarmDto> getListByUserId(Integer userId, Integer alarmLevel);
    //预警分析管理-电源告警
    List<PwrdevAlarm> getPwrtAlmAnalyse(AlmAnalyseDto dto);
}
src/main/java/com/whyc/mapper/PwrdevAlarmParamMapper.java
@@ -9,4 +9,6 @@
public interface PwrdevAlarmParamMapper extends CustomMapper<PwrdevAlarmParam>{
    //获取电源告警参数
    List<PwrdevAlarmParam> getPwrAlmParam(@Param("almDto") AlmDto almDto);
    //获取电源告警参数(无参用于导出)
    List<PwrdevAlarmParam> getPwrAlmParamToExport(@Param("uid") Integer uid);
}
src/main/java/com/whyc/mapper/WorkflowDeviceMapper.java
New file
@@ -0,0 +1,6 @@
package com.whyc.mapper;
import com.whyc.pojo.web_site.WorkflowDevice;
public interface WorkflowDeviceMapper extends CustomMapper<WorkflowDevice>{
}
src/main/java/com/whyc/mapper/WorkflowLinkMapper.java
New file
@@ -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);
    /**二次核容和隐患故障的统计*/
    List<WorkflowLink> getReceivedList2(int type, User user);
    //查询自己需要处理或者审批的
}
src/main/java/com/whyc/mapper/WorkflowMainMapper.java
New file
@@ -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();
}
src/main/java/com/whyc/pojo/db_param/AlmAnalysisParam.java
New file
@@ -0,0 +1,69 @@
package com.whyc.pojo.db_param;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
 * <p>
 * é¢„警分析管理关联字段配置表
 * </p>
 *
 * @author lxw
 * @since 2025-06-19
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName(schema = "db_param",value ="tb_alm_analysis_param")
@ApiModel(value="AlmAnalysisParam对象", description="预警分析管理关联字段配置表")
public class AlmAnalysisParam implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(value = "自增主键")
    @TableId(value = "num", type = IdType.AUTO)
    private Long num;
    @ApiModelProperty(value = "告警ID")
    private Integer almId;
    @ApiModelProperty(value = "主参考字段")
    private String mainField;
    @ApiModelProperty(value = "主字段类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer mainFieldType;
    @ApiModelProperty(value = "次要字段1参考配置")
    private String minorField1;
    @ApiModelProperty(value = "字段1类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField1Type;
    @ApiModelProperty(value = "次要字段2参考配置")
    private String minorField2;
    @ApiModelProperty(value = "字段2类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField2Type;
    @ApiModelProperty(value = "次要字段3参考配置")
    private String minorField3;
    @ApiModelProperty(value = "字段3类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField3Type;
    @ApiModelProperty(value = "次要字段4参考配置")
    private String minorField4;
    @ApiModelProperty(value = "字段4类型[1:直流,2:通信,3配网  4:电池 5:设备]")
    private Integer minorField4Type;
}
src/main/java/com/whyc/pojo/db_param/BattAlmparam.java
@@ -78,6 +78,9 @@
    @ApiModelProperty(value = "下下限告警使能")
    private Integer almLowCoeLowerEn;
    @ApiModelProperty(value = "告警延迟时长[单位:秒]")
    private Integer almDelayTime;
    @TableField(exist = false)
    private String provice;
@@ -96,4 +99,7 @@
    @TableField(exist = false)
    private String battgroupName;
    @TableField(exist = false)
    private String devName;
}
src/main/java/com/whyc/pojo/db_param/PowerPropertyParam.java
@@ -52,5 +52,5 @@
    private Float alarmLimithUpper;
    @TableField(exist = false)
    private Float alarmLimithLowper;
    private Float alarmLimitlLower;
}
src/main/java/com/whyc/pojo/web_site/WorkflowDevice.java
New file
@@ -0,0 +1,35 @@
package com.whyc.pojo.web_site;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.ToString;
@ToString
@Data
@TableName(schema = "web_site",value ="tb_workflow_device")
@ApiModel("工单模块-现场故障模块-维修-入库-报废-出库的设备信息")
public class WorkflowDevice {
    private Integer id;
    @ApiModelProperty("器件名称")
    private String name;
    @ApiModelProperty("器件型号")
    private String model;
    @ApiModelProperty("器件版本")
    private String version;
    @ApiModelProperty("数量")
    private Integer quantity;
    @ApiModelProperty("未处理的数量.维修申请时需填入")
    private Integer quantityUnprocessed;
    @ApiModelProperty("品牌")
    private String brand;
    @ApiModelProperty("类型")
    private String type;
    @ApiModelProperty("供应商")
    private String supplier;
    @ApiModelProperty("工单流程主表id")
    private Integer mainId;
}
src/main/java/com/whyc/pojo/web_site/WorkflowLink.java
New file
@@ -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("处理人id")
    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;
    }
}
src/main/java/com/whyc/pojo/web_site/WorkflowMain.java
New file
@@ -0,0 +1,105 @@
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.Data;
import lombok.ToString;
import org.apache.ibatis.type.Alias;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * å·¥ä½œæµä¸»è¡¨
 */
@ToString
@Data
@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;
    /**创建人id*/
    @ApiModelProperty("创建人id")
    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 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;
    @TableField(exist = false)
    private List<WorkflowDevice> deviceList;
}
src/main/java/com/whyc/service/AlmAnalysisParamService.java
New file
@@ -0,0 +1,21 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whyc.mapper.AlmAnalysisParamMapper;
import com.whyc.pojo.db_param.AlmAnalysisParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class AlmAnalysisParamService {
    @Autowired(required = false)
    private AlmAnalysisParamMapper mapper;
    //获取告警almId对应的分析配置属性值
    public AlmAnalysisParam getAnalysisParam(Integer almId) {
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.eq("alm_id",almId);
        wrapper.last("limit 1");
        AlmAnalysisParam param= mapper.selectOne(wrapper);
        return param;
    }
}
src/main/java/com/whyc/service/AppParamService.java
@@ -54,4 +54,12 @@
        wrapper.orderByAsc("id");
        return mapper.selectList(wrapper);
    }
    //获取预警分析周期阈值
    public AppParam getAlarmAnalysisCycle() {
        QueryWrapper wrapper=new QueryWrapper();
        wrapper.eq("param_name_psx","alm_analysis_already_time");
        wrapper.last("limit 1");
        AppParam param=mapper.selectOne(wrapper);
        return param;
    }
}
src/main/java/com/whyc/service/BaojigroupService.java
@@ -247,6 +247,9 @@
    //查询机房所在的班组
    public String getGroupName(Integer powerId) {
        String groupName = powerInfMapper.getGroupName(powerId);
        if(groupName==null||groupName.length()<0){
            groupName="none";
        }
        return  groupName;
    }
    //查询所有的包机组名集合(班组)
src/main/java/com/whyc/service/BattAlmparamService.java
@@ -40,6 +40,12 @@
        //PageInfo<BattAlmparam> pageInfo=new PageInfo<>(list);
        return new Response().setIII(1,list!=null,list,binf,"获取电池告警参数");
    }
    //获取电池告警参数(无参用于导出)
    public Response getBattAlmParamToExport(Integer uid) {
        //获取所有的电池组id
        List<BattAlmparam> list = mapper.getBattAlmParamToExport(uid);
        return new Response().setII(1,list!=null,list,"获取电池告警参数");
    }
    //修改电池告警参数
    public Response setBattAlmParam(List<BattAlmparam> almparamList) {
        for (BattAlmparam param:almparamList) {
src/main/java/com/whyc/service/BattRealdataIdService.java
@@ -9,6 +9,8 @@
import com.whyc.mapper.CommonMapper;
import com.whyc.pojo.db_data_history.BattRealdataId;
import com.whyc.pojo.db_param.AlmAnalysisParam;
import com.whyc.pojo.db_param.AppParam;
import com.whyc.util.ActionUtil;
import com.whyc.util.DateUtil;
import com.whyc.util.ThreadLocalUtil;
@@ -40,6 +42,12 @@
    @Autowired
    private BattInfService binfService;
    @Autowired
    private AlmAnalysisParamService almAnalysisParamService;
    @Autowired
    private AppParamService appParamService;
    //获取电池组最近一季度的单体数据
@@ -219,9 +227,16 @@
        return new Response().set(1, dataListSorted);
    }
    //电池告警点击具体告警信息查看从告警开始时间到现在的历史实时数据
    public Response getBattHisRealInAlm(Integer battgroupId, String startTime, Integer monNum) throws ParseException, InterruptedException {
    public Response getBattHisRealInAlm(Integer battgroupId, String startTime, Integer almId) throws ParseException, InterruptedException {
        //获取告警almId对应的分析配置属性值
        AlmAnalysisParam almAnalysisParam= almAnalysisParamService.getAnalysisParam(almId);
        List<RealDateDTO> dataList = new LinkedList<>();
        List<List<Date>> monthTimeList = DateUtil.getMonthTime(ThreadLocalUtil.parse(startTime,1),new Date());
        //获取预警分析周期阈值
        AppParam appParam = appParamService.getAlarmAnalysisCycle();
        Integer cycleTime=appParam.getParamValue().intValue();
        Date cyscleDate=ActionUtil.getDateAdd(ThreadLocalUtil.parse(startTime,1),cycleTime*(-1));
        //获取cyscleDate到现在所有的历史实时数据
        List<List<Date>> monthTimeList = DateUtil.getMonthTime(cyscleDate,new Date());
        ThreadPoolExecutor pool = ThreadPoolExecutorFactory.getPoolExecutor();
        CountDownLatch latch = new CountDownLatch(monthTimeList.size());
        for (int i = 0; i < monthTimeList.size(); i++) {
@@ -237,15 +252,7 @@
                int tableNum = subTablePageInfoService.judgeTable_realdata(table);
                List<RealDateDTO> list = new ArrayList();
                if (tableNum > 0) {
                    //获取指定时间段内最大最小recordNum确保数据的完整
                    List recordNums= subTablePageInfoService.getMaxAndMinRecordNum(realdata);
                    Integer maxRecordNum= 0;
                    Integer minRecordNum= 0;
                    if(recordNums.size()>0){
                        maxRecordNum=(Integer)recordNums.get(0);
                        minRecordNum=(Integer)recordNums.get(1);
                    }
                    list = subTablePageInfoService.getBattRealDataHis(realdata,1,maxRecordNum,minRecordNum);
                    list = subTablePageInfoService.getBattHisRealInAlm(realdata);
                }
                dataList.addAll(list);
                latch.countDown();
@@ -254,7 +261,7 @@
        }
        latch.await(10, TimeUnit.MINUTES);
        List dataListSorted = dataList.stream().sorted(Comparator.comparing(RealDateDTO::getRecordTime)).collect(Collectors.toList());
        return new Response().set(1, dataListSorted);
        return new Response().setIII(1,true, dataListSorted,almAnalysisParam,"电池告警点击具体告警信息查看从告警开始时间到现在的历史实时数据");
    }
}
src/main/java/com/whyc/service/BatttestdataInfService.java
@@ -939,18 +939,20 @@
        return new Response().setII(1,reslist.size()>0,pageInfo,"电池组电池性能统计(未放电,优秀,劣化,损坏)统计(1.2.8/9/10)");
    }
   //优良电源数量统计(1.2.7)
    public Response getPwr7Statistic(Pwr7Stic stic) {
    public Response getPwr7Statistic(Pwr7Stic stic) throws NoSuchFieldException, IllegalAccessException {
        Date inuseTimeStart =new Date();
        if(stic.getInuseYear()==1){
            //投入使用时间条件筛选
            LocalDateTime startTime = LocalDateTime.now().minusYears(5);
            inuseTimeStart = DateUtil.convertToDate(startTime);
        }else{
            //投入使用时间条件筛选
            LocalDateTime startTime = LocalDateTime.now().minusYears(stic.getInuseYear());
            inuseTimeStart = DateUtil.convertToDate(startTime);
        if(stic.getInuseYear()!=null){
            if(stic.getInuseYear()==1){
                //投入使用时间条件筛选
                LocalDateTime startTime = LocalDateTime.now().minusYears(5);
                inuseTimeStart = DateUtil.convertToDate(startTime);
            }else{
                //投入使用时间条件筛选
                LocalDateTime startTime = LocalDateTime.now().minusYears(stic.getInuseYear());
                inuseTimeStart = DateUtil.convertToDate(startTime);
            }
            stic.setPwrInUseTime(inuseTimeStart);
        }
        stic.setPwrInUseTime(inuseTimeStart);
        //1查询符合条件的电池组
        List<PowerInf> pinfList=powerInfService.getPwr7Statistic(stic);
        if(pinfList==null||pinfList.size()==0){
@@ -973,7 +975,13 @@
                res.setInuseTime(pinf.getPowerInuseTime());
                Integer performance= pwrHisdataIdService.getPwrQuarter7(pinf.getPowerId(),pinf.getPowerType());
                res.setPerformanceName(PwrCapperformanceEnum.getValue(performance));
                reslist.add(res);
                if(stic.getPerformance()==null){
                    reslist.add(res);
                }else{
                    if(performance==stic.getPerformance()){
                        reslist.add(res);
                    }
                }
            }
        }
        PageInfo pageInfo=PageInfoUtils.list2PageInfo(reslist, stic.getPageNum(), stic.getPageSize());
src/main/java/com/whyc/service/PwrdevAlarmParamService.java
@@ -5,12 +5,15 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.constant.BattSingalIdEnum;
import com.whyc.constant.PowerAlarmEnum;
import com.whyc.dto.AlarmParam;
import com.whyc.dto.Param.AlmAnalyseDto;
import com.whyc.dto.Param.ParamAlmDto;
import com.whyc.dto.Real.AlmDto;
import com.whyc.dto.Response;
import com.whyc.mapper.PwrdevAlarmParamMapper;
import com.whyc.pojo.db_alarm.BattalarmData;
import com.whyc.pojo.db_param.BattAlmparam;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmParam;
import com.whyc.pojo.db_station.PowerInf;
@@ -90,6 +93,12 @@
       // PageInfo<PwrdevAlarmParam> pageInfo=new PageInfo(list);
        return new Response().setIII(1,list!=null,list,pinf,"获取电源告警参数");
    }
    //获取电源告警参数(无参用于导出)
    public Response getPwrAlmParamToExport(Integer uid) {
        List<PwrdevAlarmParam> list = mapper.getPwrAlmParamToExport(uid);
        return new Response().setII(1,list!=null,list,"获取电源告警参数(无参用于导出)");
    }
    //修改电源告警参数
    public Response setPwrAlmParam(List<PwrdevAlarmParam> almparamList) {
        for (PwrdevAlarmParam param:almparamList) {
src/main/java/com/whyc/service/PwrdevAlarmService.java
@@ -8,11 +8,13 @@
import com.whyc.constant.DevAlarmEnum;
import com.whyc.constant.PowerAlarmEnum;
import com.whyc.dto.AlarmDto;
import com.whyc.dto.Param.AlmAnalyseDto;
import com.whyc.dto.Real.AlmDto;
import com.whyc.dto.Response;
import com.whyc.mapper.PwrdevAlarmMapper;
import com.whyc.pojo.db_alarm.DevalarmData;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarm;
import com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmParam;
import com.whyc.pojo.web_site.AlarmInspection;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
@@ -84,4 +86,12 @@
    public List<AlarmDto> getListByUserId(Integer userId,Integer alarmLevel) {
        return mapper.getListByUserId(userId,alarmLevel);
    }
    //预警分析管理-电源告警
    public Response getPwrtAlmAnalyse(AlmAnalyseDto dto) {
        PageHelper .startPage(dto.getPageNum(),dto.getPageSize());
        List<PwrdevAlarm> list=mapper.getPwrtAlmAnalyse(dto);
        PageInfo pageInfo=new PageInfo(list);
        return new Response().setII(1,list!=null,pageInfo,"电源告警分析");
    }
}
src/main/java/com/whyc/service/PwrdevHistorydataIdService.java
@@ -1,6 +1,7 @@
package com.whyc.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.whyc.constant.PwrCapperformanceEnum;
import com.whyc.dto.Real.CompareDto;
import com.whyc.dto.Real.PwrHisRealAcInDto;
import com.whyc.dto.Real.PwrHisRealDcoutInDto;
@@ -19,6 +20,7 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
@@ -89,7 +91,7 @@
        return new Response().setIII(1,datalist.size()>0,datalist,modelCfg,"获取半小时内直流输出统计");
    }
    //1.2.7优良电源统计上一季度的电源某一属性和参数阈值超过的次数
    public Integer getPwrQuarter7(Integer powerId,Integer powerType) {
    public Integer getPwrQuarter7(Integer powerId,Integer powerType) throws NoSuchFieldException, IllegalAccessException {
        Map<String,Integer> map=new HashMap<>();
        //获取优良电源性能统计在平台上的时间参数设置表
        ApptimeParam apptimeParam=apptimeParamService.getPwrPerformanceStrartTime(powerId);
@@ -97,12 +99,12 @@
        List<String> datelist=ActionUtil.getDateListBetweenDates(apptimeParam.getParamValue(), new Date());
        //获取电源优良判断的标准参数值
        List<PowerPropertyParam> paramList=propertyParamService.getPwrStandardParam(powerType);
        Map<String,Float> paramValues=new HashMap<>();
        /*Map<String,Float> paramValues=new HashMap<>();
        for (PowerPropertyParam param : paramList) {
            paramValues.put(param.getPropertyName()+"_upper", param.getBasisVal()*param.getAlarmLimithUpper());
            paramValues.put(param.getPropertyName()+"_lower", param.getBasisVal()*param.getAlarmLimithLowper());
            paramValues.put(param.getPropertyName()+"_lower", param.getBasisVal()*param.getAlarmLimitlLower());
            map.put(param.getPropertyName(), 0);
        }
        }*/
        for (int i=0;i<datelist.size();i++) {
            String date=datelist.get(i);
            String tableName ="db_data_history.tb_pwrdev_historydata_"+powerId+"_"+date;
@@ -111,10 +113,10 @@
            if(existTableName == null){
                continue;
            }
            List<QuarterPwr7Res> datalist=subTablePageInfoService.getPwrQuarter7(tableName);
            List<PwrdevHistorydataId> datalist=subTablePageInfoService.getPwrQuarter7(tableName);
            // éåކ dataList å¹¶æ¯”较属性值
            for (QuarterPwr7Res data : datalist) {
                if(paramValues.get("acin1_vola_upper")!=null){
            for (PwrdevHistorydataId data : datalist) {
                /*if(paramValues.get("acin1_vola_upper")!=null){
                    if ((data.getAcin1Vola() > paramValues.get("acin1_vola_upper"))||(data.getAcin1Vola() < paramValues.get("acin1_vola_lower"))) {
                        map.put("acin1_vola", map.get("acin1_vola") + 1);
                    }
@@ -133,11 +135,23 @@
                    if ((data.getDcoutCurr() > paramValues.get("dcout_curr_upper")) || (data.getDcoutCurr() < paramValues.get("dcout_curr_lower"))) {
                        map.put("dcout_curr", map.get("dcout_curr") + 1);
                    }
                }*/
                for (int j=0;j<paramList.size();j++) {
                    PowerPropertyParam param = paramList.get(j);
                    String propertyName = ActionUtil.toCamelCase(param.getPropertyName());
                    Field field = PwrdevHistorydataId.class.getDeclaredField(propertyName);
                    field.setAccessible(true); // å¦‚果字段是私有的,需要设置为可访问
                    Float value = (Float) field.get(data);
                    if ((value > (param.getBasisVal()*param.getAlarmLimithUpper()))||(value <(param.getBasisVal()*param.getAlarmLimitlLower()))) {
                        int limitNum=map.get(param.getPropertyName())==null?0:map.get(param.getPropertyName());
                        map.put(param.getPropertyName(), limitNum+1);
                    }
                }
            }
        }
        return 1;
        //判断优良电源性能
        int pwrPerformence=judgePwrPerformence(map);
        return pwrPerformence;
    }
    //判断优良电源性能
    private Integer judgePwrPerformence(Map<String,Integer> map){
@@ -157,6 +171,31 @@
                warningVal=appParam.getParamValue();
            }
        }
        return 1;
        Integer performance = PwrCapperformanceEnum.PWRSTATE_1.getStateId(); // åˆå§‹åŒ–为最优等级
        for (Map.Entry<String, Integer> entry : map.entrySet()) {
            Integer level = evaluateValue(entry.getValue(), excellentVal, commonlyVal, warningVal);
            // æ ¹æ®ç­‰çº§æŽ’序确定当前是否是最差等级
            if (PwrCapperformanceEnum.PWRSTATE_4.getStateId()==level) {
                performance = PwrCapperformanceEnum.PWRSTATE_4.getStateId();
                return performance; // ä¸€æ—¦å‡ºçŽ°å·®ï¼Œç›´æŽ¥è¿”å›ž
            } else if (PwrCapperformanceEnum.PWRSTATE_3.getStateId()==level && PwrCapperformanceEnum.PWRSTATE_4.getStateId()!=performance) {
                performance = PwrCapperformanceEnum.PWRSTATE_3.getStateId();
            } else if (PwrCapperformanceEnum.PWRSTATE_2.getStateId()==level &&(PwrCapperformanceEnum.PWRSTATE_3.getStateId()!=performance||PwrCapperformanceEnum.PWRSTATE_4.getStateId()!=performance)) {
                performance = PwrCapperformanceEnum.PWRSTATE_2.getStateId();
            }
        }
        return performance;
    }
    // åˆ¤æ–­å•个值的等级
    public  Integer evaluateValue(Integer value, Float excellentVal, Float commonlyVal, Float warningVal) {
        if (value <= excellentVal) {
            return PwrCapperformanceEnum.PWRSTATE_1.getStateId();
        } else if (value <= commonlyVal&&value > excellentVal) {
            return PwrCapperformanceEnum.PWRSTATE_2.getStateId();
        } else if (value <= warningVal&&value > commonlyVal) {
            return PwrCapperformanceEnum.PWRSTATE_3.getStateId();
        } else {
            return PwrCapperformanceEnum.PWRSTATE_4.getStateId();
        }
    }
}
src/main/java/com/whyc/service/SubTablePageInfoService.java
@@ -772,6 +772,35 @@
        });
        return list;
    }
    //电池数据历史实时处理(预警分析)
    public List<RealDateDTO> getBattHisRealInAlm(BattRealdataId realdata) {
        String sql=" select record_time, group_vol, online_vol,group_curr, mon_vol, mon_tmp, mon_res, mon_num,record_num  " +
                "               from db_data_history.tb_batt_realdata_"+realdata.getTableName()+" " +
                "               where record_time >= '"+ThreadLocalUtil.format(realdata.getRecordTime(),1)+"' " +
                "               and record_time <= '"+ThreadLocalUtil.format(realdata.getRecordTime1(),1)+"' " +
                "               order by record_time asc,mon_num asc";
        List<RealDateDTO> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<RealDateDTO> list=new ArrayList<>();
                while (rs.next()){
                    RealDateDTO ph=new RealDateDTO();
                    ph.setRecordTime(rs.getTimestamp("record_time"));
                    ph.setGroupVol(rs.getFloat("group_vol"));
                    ph.setOnlineVol(rs.getFloat("online_vol"));
                    ph.setGroupCurr(rs.getFloat("group_curr"));
                    ph.setMonVol(rs.getFloat("mon_vol"));
                    ph.setMonTmp(rs.getFloat("mon_tmp"));
                    ph.setMonRes(rs.getFloat("mon_res"));
                    ph.setMonNum(rs.getInt("mon_num"));
                    ph.setRecordNum(rs.getInt("record_num"));
                    list.add(ph);
                }
                return list;
            }
        });
        return list;
    }
    //获取指定时间段内最大最小recordNum确保数据的完整
    public List getMaxAndMinRecordNum(BattRealdataId realdata) {
        String sql="select max(record_num) as maxRecordNum,min(record_num) as minRecordNum " +
@@ -793,21 +822,102 @@
         return list;
    }
    //1.2.7优良电源统计上一季度的电源某一属性和参数阈值超过的次数
    public List<QuarterPwr7Res> getPwrQuarter7(String tableName) {
        String sql=" select  distinct record_datetime,acin1_vola,acout_curra,dcout_vol,dcout_curr " +
    public List<PwrdevHistorydataId> getPwrQuarter7(String tableName) {
        String sql=" select  distinct * " +
                " from "+tableName+" " ;
        sql+=" order by record_datetime asc";
        List<QuarterPwr7Res> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
        List<PwrdevHistorydataId> list = sqlExecuteService.executeQuery_call(sql, new CallBack() {
            @Override
            public List getResults(ResultSet rs) throws SQLException {
                List<QuarterPwr7Res> list=new ArrayList<>();
                List<PwrdevHistorydataId> list=new ArrayList<>();
                while (rs.next()){
                    QuarterPwr7Res data=new QuarterPwr7Res();
                    PwrdevHistorydataId data=new PwrdevHistorydataId();
                    data.setRecordDatetime(rs.getTimestamp("record_datetime"));
                    data.setAcin1Vola(rs.getFloat("acin1_vola"));
                    data.setAcin1Volb(rs.getFloat("acin1_volb"));
                    data.setAcin1Volc(rs.getFloat("acin1_volc"));
                    data.setAcin2Vola(rs.getFloat("acin2_vola"));
                    data.setAcin2Volb(rs.getFloat("acin2_volb"));
                    data.setAcin2Volc(rs.getFloat("acin2_volc"));
                    data.setAcoutVola(rs.getFloat("acout_vola"));
                    data.setAcoutVolb(rs.getFloat("acout_volb"));
                    data.setAcoutVolc(rs.getFloat("acout_volc"));
                    data.setAcoutCurra(rs.getFloat("acout_curra"));
                    data.setAcoutCurrb(rs.getFloat("acout_currb"));
                    data.setAcoutCurrc(rs.getFloat("acout_currc"));
                    data.setDcoutVol(rs.getFloat("dcout_vol"));
                    data.setDcoutCurr(rs.getFloat("dcout_curr"));
                    data.setBattgroup1Vol(rs.getFloat("battgroup1_vol"));
                    data.setBattgroup1Curr(rs.getFloat("battgroup1_curr"));
                    data.setBattgroup2Vol(rs.getFloat("battgroup2_vol"));
                    data.setBattgroup2Curr(rs.getFloat("battgroup2_curr"));
                    data.setTemprature(rs.getFloat("temprature"));
                    data.setMOutputvol(rs.getFloat("m_outputvol"));
                    data.setM1Outcurr(rs.getFloat("m1_outcurr"));
                    data.setM2Outcurr(rs.getFloat("m2_outcurr"));
                    data.setM3Outcurr(rs.getFloat("m3_outcurr"));
                    data.setM4Outcurr(rs.getFloat("m4_outcurr"));
                    data.setM5Outcurr(rs.getFloat("m5_outcurr"));
                    data.setM6Outcurr(rs.getFloat("m6_outcurr"));
                    data.setM7Outcurr(rs.getFloat("m7_outcurr"));
                    data.setM8Outcurr(rs.getFloat("m8_outcurr"));
                    data.setM9Outcurr(rs.getFloat("m9_outcurr"));
                    data.setM10Outcurr(rs.getFloat("m10_outcurr"));
                    data.setM11Outcurr(rs.getFloat("m11_outcurr"));
                    data.setM12Outcurr(rs.getFloat("m12_outcurr"));
                    data.setM13Outcurr(rs.getFloat("m13_outcurr"));
                    data.setM14Outcurr(rs.getFloat("m14_outcurr"));
                    data.setM15Outcurr(rs.getFloat("m15_outcurr"));
                    data.setM16Outcurr(rs.getFloat("m16_outcurr"));
                    data.setAcin1Curra(rs.getFloat("acin1_curra"));
                    data.setAcin1Currb(rs.getFloat("acin1_currb"));
                    data.setAcin1Currc(rs.getFloat("acin1_currc"));
                    data.setLoaderCurr(rs.getFloat("loader_curr"));
                    data.setBattgroup1Ah(rs.getFloat("battgroup1_ah"));
                    data.setBattgroup1Temp(rs.getFloat("battgroup1_temp"));
                    data.setBattgroup2Ah(rs.getFloat("battgroup2_ah"));
                    data.setBattgroup2Temp(rs.getFloat("battgroup2_temp"));
                    data.setAcdcmTemp(rs.getFloat("acdcm_temp"));
                    data.setM1OutVol(rs.getFloat("m1_out_vol"));
                    data.setM2OutVol(rs.getFloat("m2_out_vol"));
                    data.setM3OutVol(rs.getFloat("m3_out_vol"));
                    data.setM4OutVol(rs.getFloat("m4_out_vol"));
                    data.setM5OutVol(rs.getFloat("m5_out_vol"));
                    data.setM6OutVol(rs.getFloat("m6_out_vol"));
                    data.setM7OutVol(rs.getFloat("m7_out_vol"));
                    data.setM8OutVol(rs.getFloat("m8_out_vol"));
                    data.setM9OutVol(rs.getFloat("m9_out_vol"));
                    data.setM10OutVol(rs.getFloat("m10_out_vol"));
                    data.setM11OutVol(rs.getFloat("m11_out_vol"));
                    data.setM12OutVol(rs.getFloat("m12_out_vol"));
                    data.setM13OutVol(rs.getFloat("m13_out_vol"));
                    data.setM14OutVol(rs.getFloat("m14_out_vol"));
                    data.setM15OutVol(rs.getFloat("m15_out_vol"));
                    data.setM16OutVol(rs.getFloat("m16_out_vol"));
                    data.setUseracin1Vola(rs.getFloat("useracin1_vola"));
                    data.setUseracin1Volb(rs.getFloat("useracin1_volb"));
                    data.setUseracin1Volc(rs.getFloat("useracin1_volc"));
                    data.setUseracin1Curra(rs.getFloat("useracin1_curra"));
                    data.setUseracin1Currb(rs.getFloat("useracin1_currb"));
                    data.setUseracin1Currc(rs.getFloat("useracin1_currc"));
                    data.setUseracin1Freq(rs.getFloat("useracin1_freq"));
                    data.setUseracin2Vola(rs.getFloat("useracin2_vola"));
                    data.setUseracin2Volb(rs.getFloat("useracin2_volb"));
                    data.setUseracin2Volc(rs.getFloat("useracin2_volc"));
                    data.setUseracin2Curra(rs.getFloat("useracin2_curra"));
                    data.setUseracin2Currb(rs.getFloat("useracin2_currb"));
                    data.setUseracin2Currc(rs.getFloat("useracin2_currc"));
                    data.setUseracin2Freq(rs.getFloat("useracin2_freq"));
                    data.setMTemper1(rs.getFloat("m_temper1"));
                    data.setMTemper2(rs.getFloat("m_temper2"));
                    data.setMTemper3(rs.getFloat("m_temper3"));
                    data.setMHumidity1(rs.getFloat("m_humidity1"));
                    data.setMHumidity2(rs.getFloat("m_humidity2"));
                    data.setMHumidity3(rs.getFloat("m_humidity3"));
                    list.add(data);
                }
                return list;
src/main/java/com/whyc/service/WorkflowDeviceService.java
New file
@@ -0,0 +1,45 @@
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.whyc.mapper.WorkflowDeviceMapper;
import com.whyc.pojo.web_site.WorkflowDevice;
import com.whyc.util.ActionUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class WorkflowDeviceService {
    @Autowired
    private WorkflowDeviceMapper mapper;
    public void addBatch(List<WorkflowDevice> deviceList) {
        mapper.insertBatchSomeColumn(deviceList);
    }
    public List<WorkflowDevice> getByMainId(Integer relatedId) {
        QueryWrapper<WorkflowDevice> query = Wrappers.query();
        query.eq("main_id",relatedId);
        return mapper.selectList(query);
    }
    public void setQuantityUnprocessedZero(Integer relatedId) {
        UpdateWrapper<WorkflowDevice> update = Wrappers.update();
        update.set("quantity_unprocessed",0).eq("main_id",relatedId);
        mapper.update((WorkflowDevice) ActionUtil.objeNull,update);
    }
    public void updateQuantityUnprocessedBatch(List<WorkflowDevice> deviceRelatedListInDB) {
        for (int i = 0; i < deviceRelatedListInDB.size(); i++) {
            WorkflowDevice deviceRelatedInDB = deviceRelatedListInDB.get(i);
            UpdateWrapper<WorkflowDevice> update = Wrappers.update();
            update.set("quantity_unprocessed",deviceRelatedInDB.getQuantityUnprocessed())
                    .eq("id",deviceRelatedInDB.getId());
            mapper.update((WorkflowDevice) ActionUtil.objeNull,update);
        }
    }
}
src/main/java/com/whyc/service/WorkflowLinkService.java
New file
@@ -0,0 +1,233 @@
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.WorkflowDevice;
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;
    @Autowired
    private WorkflowDeviceService deviceService;
    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 mainInDB = mainService.getById(linkInDB.getMainId());
        //查看申请流程类型
        switch (mainInDB.getType()) {
            case 1: { //设备维修申请
                //查看主表的状态
                //因为是单个链路节点,所以不需要判断是不是待处理,肯定只有1个节点. å®¡æ‰¹é€šè¿‡æˆ–者驳回
                //if(main.getStatus() == WorkflowEnum.MAIN_STATUS_DEALING.getValue().intValue()){ //待处理,下一步是审批通过,待处理 æˆ–者驳回
                if(link.getStatus() == WorkflowEnum.LINK_STATUS_PASS.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_WAIT_FOR_DEALING.getValue());
                    mainService.updateById(mainInDB);
                }else if(link.getStatus() == WorkflowEnum.LINK_STATUS_REJECT.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_END_REJECT.getValue());
                    mainInDB.setEndReason(link.getDealRejectReason());
                    mainInDB.setEndTime(now);
                    mainService.updateById(mainInDB);
                    link.setDealAndClose(1);
                }
            }break;
            //设备入库申请
            case 2:
            //设备报废申请
            case 3:{
                if(link.getStatus() == WorkflowEnum.LINK_STATUS_PASS.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_END_PASS.getValue());
                    mainInDB.setEndTime(now);
                    mainInDB.setEndReason(link.getDealReason());
                    mainService.updateById(mainInDB);
                }else if(link.getStatus() == WorkflowEnum.LINK_STATUS_REJECT.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_END_REJECT.getValue());
                    mainInDB.setEndReason(link.getDealRejectReason());
                    mainInDB.setEndTime(now);
                    //检查是否有关联工单.
                    // å¦‚果有关联工单,关联工单状态重置为完结待处理,完成时间重置为空
                    if(mainInDB.getRelatedId() != null){
                        Integer relatedId = mainInDB.getRelatedId();
                        mainService.resetRepairStatus(relatedId);
                        //关联工单的设备附属表未处理数量也要回退,等于主表设备数量
                        List<WorkflowDevice> deviceRelatedListInDB = deviceService.getByMainId(mainInDB.getRelatedId());
                        List<WorkflowDevice> deviceListInDB = deviceService.getByMainId(mainInDB.getId());
                        for (int i = 0; i < deviceListInDB.size(); i++) {
                            WorkflowDevice deviceInDB = deviceListInDB.get(i);
                            for (int j = 0; j < deviceRelatedListInDB.size(); j++) {
                                WorkflowDevice deviceRelatedInDB = deviceRelatedListInDB.get(j);
                                if (deviceInDB.getName().equals(deviceRelatedInDB.getName())
                                        && deviceInDB.getModel().equals(deviceRelatedInDB.getModel())
                                        && deviceInDB.getVersion().equals(deviceRelatedInDB.getVersion())
                                        && deviceInDB.getBrand().equals(deviceRelatedInDB.getBrand())
                                        && deviceInDB.getType().equals(deviceRelatedInDB.getType())
                                        && deviceInDB.getSupplier().equals(deviceRelatedInDB.getSupplier())
                                ) {
                                    deviceRelatedInDB.setQuantityUnprocessed(deviceInDB.getQuantity());
                                    //关联工单当前设备附属的未处理数量回退完成,下一个
                                    break;
                                }
                            }
                        }
                        deviceService.updateQuantityUnprocessedBatch(deviceRelatedListInDB);
                    }
                    mainService.updateById(mainInDB);
                    link.setDealAndClose(1);
                }
            }break;
            case 4:{ //TODO å‡ºåº“申请
                if(link.getStatus() == WorkflowEnum.LINK_STATUS_PASS.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_WAIT_FOR_DEALING.getValue());
                    mainService.updateById(mainInDB);
                }else if(link.getStatus() == WorkflowEnum.LINK_STATUS_REJECT.getValue().intValue()){
                    mainInDB.setStatus(WorkflowEnum.MAIN_STATUS_END_REJECT.getValue());
                    mainInDB.setEndReason(link.getDealRejectReason());
                    mainInDB.setEndTime(now);
                    //检查是否有关联工单.如果有关联工单,关联工单状态重置为完结待处理,完成时间重置为空
                    if(mainInDB.getRelatedId() != null){
                        Integer relatedId = mainInDB.getRelatedId();
                        //mainService.resetRepairStatus(relatedId,mainInDB.getQuantity());
                    }
                    mainService.updateById(mainInDB);
                    link.setDealAndClose(1);
                }
            }break;
            default:
                break;
        }
        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或者dealRejectReason
     */
    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;
    }
    /**
     *
     * äºŒæ¬¡æ ¸å®¹å’Œé𐿂£æ•…障的统计
     *
     * å¢žåŠ äº†å…¨éƒ¨ 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);
    }
}
src/main/java/com/whyc/service/WorkflowMainService.java
New file
@@ -0,0 +1,511 @@
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.WorkflowDevice;
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;
    @Autowired
    private WorkflowDeviceService deviceService;
    /**
     * åˆ†æ´¾å•号:
     * */
    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 updateById(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);
    }
    /**
     * äºŒæ¬¡æ ¸å®¹å’Œæ•…障隐患的统计
     *
     * å¢žåŠ äº†å…¨éƒ¨ key=0
     * @param type ={0,2,3} 0代表二次核容和故障隐患一起
     * @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不为空,则需要特殊处理. è¯æ˜Žä¼šå½±å“åˆ°å…³è”单据
     *
     * æ¶‰åŠåˆ°æ–°çš„问题需要解决,现场故障后,设备维修申请 æˆ– æŠ¥åºŸç”³è¯· æ˜¯å¤šä¸ª,并存入工单设备表中. å¹¶ä¸åªæ˜¯å•纯的数量. TODO ?自动化处理怎么更新
     */
    @Transactional
    public Response submit(WorkflowMain main){
        //1.提交到单据审批流程
        //如果存在关联单据id,首先校验提交的数量
        Date now = new Date();
        List<WorkflowDevice>  deviceListRelatedInDB = deviceService.getByMainId(main.getRelatedId());
        List<WorkflowDevice> deviceList = main.getDeviceList();
        if(main.getRelatedId() != null) {
            //遍历deviceList,如果deviceList内的对象的quantity值大于 deviceListRelatedInDB内对象列表中的对象所有字段相同的记录的quantityUnprocessed值,则返回错误
            for (int i = 0; i < deviceList.size(); i++) {
                WorkflowDevice device = deviceList.get(i);
                for (int j = 0; j < deviceListRelatedInDB.size(); j++) {
                    WorkflowDevice deviceInDB = deviceListRelatedInDB.get(j);
                    if (device.getName().equals(deviceInDB.getName())
                            && device.getModel().equals(deviceInDB.getModel())
                            && device.getVersion().equals(deviceInDB.getVersion())
                            && device.getBrand().equals(deviceInDB.getBrand())
                            && device.getType().equals(deviceInDB.getType())
                            && device.getSupplier().equals(deviceInDB.getSupplier())
                    ) {
                        if (device.getQuantity() > deviceInDB.getQuantityUnprocessed()) {
                            return new Response().setII(1, "入库数量不能大于维修申请关联单据的未处理数量");
                        }else{
                            //当前设备的校验结束,进入下一个设备校验
                            break;
                        }
                    }
                }
            }
        }
        //主表插入
        //初始化相关字段
        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());
        if(main.getType() == WorkflowTypeEnum.DEVICE_REPAIR.getType().intValue()){ //维修申请单,需填入
            for (int i = 0; i < deviceList.size(); i++) {
                deviceList.get(i).setQuantityUnprocessed(deviceList.get(i).getQuantity());
            }
        }
        add(main);
        //主表关联的物料插入
        for (WorkflowDevice device : deviceList) {
            device.setMainId(main.getId());
        }
        deviceService.addBatch(deviceList);
        //内存中去除已插入数据库的单号
        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, deviceListRelatedInDB, user);
        return new Response().setII(1,"提交完成");
    }
    private void checkRelatedAndDone(WorkflowMain main, Date now, List<WorkflowDevice> deviceListRelatedInDB, User user) {
        if(main.getRelatedId() != null){
            //申请的数量<关联单据的未处理数量,则说明有剩余. éœ€è¦è‡ªåŠ¨ç”Ÿæˆå¯¹ç«‹å·¥å•
            List<WorkflowDevice> deviceList = main.getDeviceList();
            //计算deviceListn内quantity属性值的和
            int sumQuantity = 0;
            for (WorkflowDevice device : deviceList) {
                sumQuantity += device.getQuantity();
            }
            //计算deviceListRelatedInDBn内quantityUnprocessed属性值的和
            int sumQuantityUnprocessedInDB = 0;
            for (WorkflowDevice device : deviceListRelatedInDB) {
                sumQuantityUnprocessedInDB += device.getQuantityUnprocessed();
            }
            if (sumQuantity < sumQuantityUnprocessedInDB){ //说明需要自动生成入库或者报废单据
                //需要自动生成报废的申请
                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.setProcessStage(processAuto.getStage());
                mainAuto.setStatus(statusAuto);
                mainAuto.setRelatedId(main.getRelatedId());
                //整理主表的设备附表
                List<WorkflowDevice> deviceListAuto = new ArrayList<>();
                //遍历deviceListRelatedInDB,减去deviceList中申请的数量
                for (WorkflowDevice deviceInDB : deviceListRelatedInDB) {
                    boolean deviceExists = false;
                    for (WorkflowDevice device : deviceList) {
                        if (device.getName().equals(deviceInDB.getName())
                                && device.getModel().equals(deviceInDB.getModel())
                                && device.getVersion().equals(deviceInDB.getVersion())
                                && device.getBrand().equals(deviceInDB.getBrand())
                                && device.getType().equals(deviceInDB.getType())
                                && device.getSupplier().equals(deviceInDB.getSupplier())
                        ){
                            deviceExists = true;
                            if (deviceInDB.getQuantityUnprocessed()-device.getQuantity() > 0){
                                WorkflowDevice deviceAuto = new WorkflowDevice();
                                deviceAuto.setName(deviceInDB.getName());
                                deviceAuto.setModel(deviceInDB.getModel());
                                deviceAuto.setVersion(deviceInDB.getVersion());
                                deviceAuto.setQuantity(deviceInDB.getQuantityUnprocessed()-device.getQuantity());
                                deviceAuto.setBrand(deviceInDB.getBrand());
                                deviceAuto.setType(deviceInDB.getType());
                                deviceAuto.setSupplier(deviceInDB.getSupplier());
                                deviceListAuto.add(deviceAuto);
                            }else{
                                break;
                            }
                        }
                    }
                    if (!deviceExists){
                        WorkflowDevice deviceAuto = new WorkflowDevice();
                        deviceAuto.setName(deviceInDB.getName());
                        deviceAuto.setModel(deviceInDB.getModel());
                        deviceAuto.setVersion(deviceInDB.getVersion());
                        deviceAuto.setQuantity(deviceInDB.getQuantityUnprocessed());
                        deviceAuto.setBrand(deviceInDB.getBrand());
                        deviceAuto.setType(deviceInDB.getType());
                        deviceAuto.setSupplier(deviceInDB.getSupplier());
                        deviceListAuto.add(deviceAuto);
                    }
                }
                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);
                deviceListAuto.forEach(device -> {
                    device.setMainId(mainAuto.getId());
                });
                //插入主表的设备附表
                deviceService.addBatch(deviceListAuto);
                //自动节点生成
                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("用户提交维修申请后的报废申请,维修流程结束");
            }
            updateById(relatedMain);
            //更新关联单据的设备剩余未处理数量为0
            deviceService.setQuantityUnprocessedZero(main.getRelatedId());
        }
    }
    /**
     * 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);
    }
    public void resetRepairStatus(Integer relatedId) {
        UpdateWrapper<WorkflowMain> update = Wrappers.update();
        update.set("status",WorkflowEnum.MAIN_STATUS_WAIT_FOR_DEALING.getValue())
                .set("end_time",null)
                .set("end_reason",null)
                .eq("id",relatedId);
        mapper.update((WorkflowMain) ActionUtil.objeNull,update);
    }
}
src/main/java/com/whyc/util/ActionUtil.java
@@ -29,6 +29,7 @@
    public static String time_yyyyMMddHHmmss = "yyyy-MM-dd HH:mm:ss";
    public static String time_yyyyMMdd = "yyyy-MM-dd";
    public static String time_yyyyMM = "yyyy-MM";
    public static String time_yyyy_MM = "yyyy_MM";
    public static String time_yyyyMMdd_HH_mm_ss = "yyyy-MM-dd_HH_mm_ss";
    public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    public static SimpleDateFormat sdfwithOutday = new SimpleDateFormat("yyyy_MM");
@@ -647,7 +648,7 @@
        List<String> dateList = new ArrayList<>();
        LocalDate currentDate = startDate;
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ActionUtil.time_yyyyMM);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(ActionUtil.time_yyyy_MM);
        while (!currentDate.isAfter(endDate)) {
            String formattedDate = currentDate.format(formatter);
            dateList.add(formattedDate);
@@ -655,11 +656,29 @@
        }
        return dateList;
    }
    // åŒ¹é… "_" åŽè·Ÿä¸€ä¸ªå­—母(小写或大写)
    public static String toCamelCase(String input) {
        // åŒ¹é… "_" åŽè·Ÿä¸€ä¸ªå­—母(小写或大写)
        Pattern pattern = Pattern.compile("_(\\w)");
        Matcher matcher = pattern.matcher(input);
        StringBuffer result = new StringBuffer();
        while (matcher.find()) {
            // å°†åŒ¹é…åˆ°çš„字母转为大写,并替换掉前面的下划线
            matcher.appendReplacement(result, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(result);
        return result.toString();
    }
    public static void main(String[] args) throws ParseException {
        List<String> dateList =getDateListBetweenDates(ActionUtil.sdf.parse("2025-01-01 00:00:00"),new Date());
        /*List<String> dateList =getDateListBetweenDates(ActionUtil.sdf.parse("2025-01-01 00:00:00"),new Date());
        for (String date : dateList) {
            System.out.println(date);
        }
        }*/
        //System.out.println(toCamelCase("user_name_and_age"));
        Date time1=getDateAdd(new Date(),-10);
        System.out.println(ActionUtil.sdf.format(time1));
    }
}    
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;
    }
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();
src/main/resources/mapper/BattAlmparamMapper.xml
@@ -34,4 +34,21 @@
            order by tb_batt_inf.dev_id asc,battgroup_id asc
        </where>
    </select>
    <select id="getBattAlmParamToExport" resultType="com.whyc.pojo.db_param.BattAlmparam">
        select distinct tb_batt_almparam.*,tb_batt_inf.battgroup_name,tb_batt_inf.dev_name
        ,tb_station_inf.station_type,tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_station_inf.full_name
        from db_station.tb_batt_inf,db_station.tb_station_inf,db_param.tb_batt_almparam
        <where>
            tb_batt_inf.battgroup_id=tb_batt_almparam.battgroup_id
            and tb_batt_inf.station_id=tb_station_inf.station_id
            <if test="uid>100">
                and tb_batt_inf.station_id in(
                select distinct station_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr
                where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id
                and tb_baojigroup_usr.uid=#{uid}
                )
            </if>
            order by tb_batt_inf.dev_id asc,battgroup_id asc
        </where>
    </select>
</mapper>
src/main/resources/mapper/BattalarmDataMapper.xml
@@ -95,9 +95,6 @@
            <if test="stationId!=null">
                and tb_station_inf.station_id=#{stationId}
            </if>
            <if test="stationId!=null">
                and tb_station_inf.station_id=#{stationId}
            </if>
            <if test="battgroupId!=null">
                and tb_battalarm_data.battgroup_id=#{battgroupId}
            </if>
@@ -119,7 +116,7 @@
                and tb_baojigroup_usr.uid=#{uid}
                )
            </if>
            order by alm_start_time desc
        </where>
    </select>
</mapper>
src/main/resources/mapper/PowerPropertyParamMapper.xml
@@ -8,5 +8,6 @@
        from db_param.tb_power_property_param,db_pwrdev_alarm.tb_pwrdev_alarm_param_stand
        where tb_power_property_param.property_name=tb_pwrdev_alarm_param_stand.property_name
              and tb_power_property_param.power_type=#{powerType}
              and tb_power_property_param.field_en=1
    </select>
</mapper>
src/main/resources/mapper/PwrdevAlarmMapper.xml
@@ -63,4 +63,35 @@
            and bu.uid = #{userId}
        )
    </select>
    <select id="getPwrtAlmAnalyse" resultType="com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarm">
        select tb_pwrdev_alarm.*,tb_power_inf.power_name,tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_station_inf.full_name
        from db_pwrdev_alarm.tb_pwrdev_alarm,db_station.tb_power_inf,db_station.tb_station_inf
        <where>
            tb_pwrdev_alarm.power_id=tb_power_inf.power_id
            and tb_power_inf.station_id=tb_station_inf.station_id
            <if test="provice!=null">
                and tb_station_inf.provice=#{provice}
            </if>
            <if test="city!=null">
                and tb_station_inf.city=#{city}
            </if>
            <if test="country!=null">
                and tb_station_inf.country=#{country}
            </if>
            <if test="stationId!=null">
                and tb_station_inf.station_id=#{stationId}
            </if>
            <if test="powerId!=null">
                and tb_pwrdev_alarm.power_id=#{powerId}
            </if>
            <if test="uid>100">
                and tb_pwrdev_alarm.power_id in(
                select distinct power_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr
                where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id
                and tb_baojigroup_usr.uid=#{uid}
                )
            </if>
        </where>
        order by alm_start_time desc
    </select>
</mapper>
src/main/resources/mapper/PwrdevAlarmParamMapper.xml
@@ -34,4 +34,21 @@
            order by tb_power_inf.power_id asc
        </where>
    </select>
    <select id="getPwrAlmParamToExport" resultType="com.whyc.pojo.db_pwrdev_alarm.PwrdevAlarmParam">
        select distinct tb_pwrdev_alarm_param.*,tb_power_inf.power_name
        ,tb_station_inf.station_type,tb_station_inf.station_name,tb_station_inf.provice,tb_station_inf.city,tb_station_inf.country,tb_station_inf.full_name
        from db_station.tb_power_inf,db_station.tb_station_inf,db_pwrdev_alarm.tb_pwrdev_alarm_param
        <where>
            tb_power_inf.power_id=tb_pwrdev_alarm_param.power_id
            and tb_power_inf.station_id=tb_station_inf.station_id
            <if test="uid>100">
                and tb_power_inf.power_id in(
                select distinct power_id from db_user.tb_baojigroup_power,db_user.tb_baojigroup_usr
                where   tb_baojigroup_power.baoji_group_id=tb_baojigroup_usr.baoji_group_id
                and tb_baojigroup_usr.uid=#{uid}
                )
            </if>
            order by tb_power_inf.power_id asc
        </where>
    </select>
</mapper>
src/main/resources/mapper/WorkflowLinkMapper.xml
New file
@@ -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>
src/main/resources/mapper/WorkflowMainMapper.xml
New file
@@ -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>