k94314517
2025-04-09 ffc5c6b152165b763458c4b129b5a5017bb6d22d
工单业务
已添加2个文件
已修改10个文件
606 ■■■■■ 文件已修改
server/src/main/java/com/doumee/api/web/WebWorkOrderController.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/constants/Constants.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/core/utils/DateUtil.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Multifile.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/Workorder.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/web/dto/CloseDTO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/web/dto/PassOnDTO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/dao/web/vo/WorkOrderDataVO.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/WorkorderService.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java 321 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/com/doumee/api/web/WebWorkOrderController.java
@@ -8,7 +8,10 @@
import com.doumee.dao.business.model.Managers;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Workorder;
import com.doumee.dao.web.dto.CloseDTO;
import com.doumee.dao.web.dto.PassOnDTO;
import com.doumee.dao.web.dto.UpdEmailDTO;
import com.doumee.dao.web.vo.WorkOrderDataVO;
import com.doumee.service.business.ManagersService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.WorkorderService;
@@ -70,7 +73,6 @@
    public ApiResponse<List<Managers>> managersList (@RequestBody Managers model, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            Member user =  jwtTokenUtil.getUserInfoByToken(token);
            return ApiResponse.success(managersService.findList(model));
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
@@ -98,9 +100,77 @@
    @LoginRequired
    @ApiOperation("工单关闭")
    @PostMapping("/closeWorkOrder")
    public ApiResponse closeWorkOrder(@RequestBody CloseDTO closeDTO, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            closeDTO.setMember(jwtTokenUtil.getUserInfoByToken(token));
            workorderService.closeWorkOrder(closeDTO);
            return ApiResponse.success("操作成功");
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    @LoginRequired
    @ApiOperation("工单指派")
    @PostMapping("/passOn")
    public ApiResponse passOn(@RequestBody PassOnDTO passOnDTO, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            passOnDTO.setMember(jwtTokenUtil.getUserInfoByToken(token));
            workorderService.passOn(passOnDTO);
            return ApiResponse.success("操作成功");
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    @LoginRequired
    @ApiOperation("工单催促")
    @GetMapping("/urge")
    public ApiResponse urge(@RequestParam Integer workorderId, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            workorderService.urge(workorderId,jwtTokenUtil.getUserInfoByToken(token));
            return ApiResponse.success("操作成功");
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    @LoginRequired
    @ApiOperation("报表")
    @GetMapping("/getWorkOrderData")
    public ApiResponse<List<WorkOrderDataVO>> getWorkOrderData(@RequestParam Integer queryType, @RequestHeader(JwtTokenUtil.HEADER_KEY) String token, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            return ApiResponse.success(workorderService.getWorkOrderData(queryType));
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
}
server/src/main/java/com/doumee/core/constants/Constants.java
@@ -188,14 +188,31 @@
     * æ–‡ä»¶é™„件类型
     */
    public interface multiFileType{
        //0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片
        int sheUpload = 0;
        int dbhUpload = 1;
        int dbhDeal = 2;
        int dbhAllocation = 3;
        int dbhDealUser = 4;
        int dcaUpload = 5;
        int dcaDeal = 6;
        int dcaWorkOrder= 7;
        //0问题上报 1跌绊滑上报 2跌绊滑处理 3分配物业主管 4分配处理人 5DCA风险上报 6DCA风险处理 7DCA问题工单图片
//        int sheUpload = 0;
//        int dbhUpload = 1;
//        int dbhDeal = 2;
//        int dbhAllocation = 3;
//        int dbhDealUser = 4;
//        int dcaUpload = 5;
//        int dcaDeal = 6;
//        int dcaWorkOrder= 7;
        //0工单上报 1工单处理 2工单转交
        int upload = 0;
        int deal = 1;
        int passOn = 2;
    }
    public interface workOrderStatus{
        int waitConfirm = 0;
        int waitAllocation = 1;
        int waitDeal = 2;
        int sheClose = 3;
        int wtsClose = 4;
        int close = 5;
    }
}
server/src/main/java/com/doumee/core/utils/DateUtil.java
@@ -594,12 +594,12 @@
     * @return String
     * @throws Exception
     */
    public static String getNowMonth() throws Exception {
    public static Integer getNowMonth() throws Exception {
        String nowMonth = "";
        try {
            String strTemp = getNowLongTime();
            nowMonth = strTemp.substring(4, 6);
            return nowMonth;
            return Integer.valueOf(nowMonth);
        } catch (Exception e) {
            throw e;
        }
@@ -2928,8 +2928,9 @@
//            System.out.println(DateUtil.afterMinutesDate(-5));
            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
//            System.out.println(DateUtil.getBeforMonthStr(new Date(),12));
//            List<String> s = DateUtil.getDayByMonth();
//            System.out.println(getPlusTime2(DateUtil.addMonthToDate(new Date(),-1)));
            System.out.println(DateUtil.getNowMonth());
//            List<Date> list =getThisMonthDateList();
//            for(Date d :list){
@@ -3236,6 +3237,14 @@
        return cal.getTime();
    }
    public static Date afterHoursDate(Date date,Integer hours){
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR,hours);
        return cal.getTime();
    }
    /**
     * LocalDateTime to date
     * @param now
server/src/main/java/com/doumee/dao/business/WorkorderLogMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.WorkorderLog;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @since 2025/04/02 17:49
 */
public interface WorkorderLogMapper extends BaseMapper<WorkorderLog> {
public interface WorkorderLogMapper extends MPJJoinMapper<WorkorderLog> {
}
server/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -63,8 +63,10 @@
    @ExcelExportColumn(name="类型0图片 1视频 2其他")
    private Integer type;
    @ApiModelProperty(value = "关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片", example = "1")
    @ExcelExportColumn(name="关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片")
//    @ApiModelProperty(value = "关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片", example = "1")
//    @ExcelExportColumn(name="关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片")
    @ApiModelProperty(value = "关联对象类型 0工单上报 1工单处理 2工单转交", example = "1")
    @ExcelExportColumn(name="关联对象类型 0工单上报 1工单处理 2工单转交")
    private Integer objType;
    @ApiModelProperty(value = "文件地址")
server/src/main/java/com/doumee/dao/business/model/Workorder.java
@@ -58,8 +58,8 @@
    @ExcelExportColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "状态 0待确认/待初审 1待分配/待终审 2待处理  3 å·²æ’¤å›ž 4已处理", example = "1")
    @ExcelExportColumn(name="状态 0待确认/待初审 1待分配/待终审 2待处理  3 å·²æ’¤å›ž 4已处理")
    @ApiModelProperty(value = "状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理  3SHE关闭 4WTS关闭 5工程师关闭", example = "1")
    @ExcelExportColumn(name="状态 çŠ¶æ€ 0待确认/待初审 1待分配/待终审 2待处理  3SHE关闭 4WTS关闭 5工程师关闭")
    private Integer status;
    @ApiModelProperty(value = "排序码", example = "1")
@@ -126,9 +126,9 @@
    @ExcelExportColumn(name="企业微信通知人员编码集合")
    private String qwnoticeMemberIds;
    @ApiModelProperty(value = "发现时间")
    @ExcelExportColumn(name="发现时间")
    private String happenTime;
    @ApiModelProperty(value = "发生时间")
    @ExcelExportColumn(name="发生时间")
    private Date happenTime;
    @ApiModelProperty(value = "风险、伤害、观察主题类型(关联category)")
    @ExcelExportColumn(name="风险、伤害、观察主题类型(关联category)")
@@ -140,11 +140,11 @@
    @ApiModelProperty(value = "当前物业主管企业微信编码", example = "1")
    @ExcelExportColumn(name="当前物业主管企业微信编码")
    private Integer managerId;
    private String managerId;
    @ApiModelProperty(value = "当前处理人员企业微信编码", example = "1")
    @ExcelExportColumn(name="当前处理人员企业微信编码")
    private Integer dealerId;
    private String dealerId;
    @ApiModelProperty(value = "分配时间")
    @ExcelExportColumn(name="分配时间")
@@ -199,6 +199,10 @@
    @ExcelExportColumn(name="DCA工单抄送人员企业微信编码集合(多个英文逗号隔开)")
    private String dcaCsIds;
    @ApiModelProperty(value = "下次催促时间")
    @ExcelExportColumn(name="下次催促时间")
    private Date urgeDate;
    @ApiModelProperty("附件信息")
    @TableField(exist = false)
    private List<Multifile> multifileList;
server/src/main/java/com/doumee/dao/business/model/WorkorderLog.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelExportColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -9,6 +10,7 @@
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
 * å·¥å•操作历史表
@@ -63,8 +65,8 @@
    @ExcelExportColumn(name="简介")
    private String content;
    @ApiModelProperty(value = "操作类型 0任务上报 1任务确认 2任务分配物业主管 3任务关闭 4任务分配处理人 5任务催促", example = "1")
    @ExcelExportColumn(name="操作类型 0任务上报 1任务确认 2任务分配物业主管 3任务关闭 4任务分配处理人 5任务催促")
    @ApiModelProperty(value = "操作类型 0任务上报 1任务分配物业主管 2任务分配处理人 3任务处理关闭 4任务催促", example = "1")
    @ExcelExportColumn(name="操作类型 0任务上报 1任务分配物业主管 2任务分配处理人 3任务处理关闭 4任务催促")
    private Integer objType;
    @ApiModelProperty(value = "关联对象编码")
@@ -95,4 +97,17 @@
    @ExcelExportColumn(name="参数4")
    private String param4;
    @ApiModelProperty(value = "操作人名称")
    @TableField(exist = false)
    private String userName;
    @ApiModelProperty(value = "部门名称")
    @TableField(exist = false)
    private String companyName;
    @ApiModelProperty(value = "附件信息")
    @TableField(exist = false)
    private List<Multifile> multifileList;
}
server/src/main/java/com/doumee/dao/web/dto/CloseDTO.java
@@ -1,5 +1,6 @@
package com.doumee.dao.web.dto;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Multifile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -24,8 +25,8 @@
    @ApiModelProperty(value = "工单关闭附件图片")
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "用户主键",hidden = true)
    private Integer memberId;
    @ApiModelProperty(value = "用户信息",hidden = true)
    private Member member;
server/src/main/java/com/doumee/dao/web/dto/PassOnDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.doumee.dao.web.dto;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Multifile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/4/8 17:41
 */
@Data
public class PassOnDTO {
    @ApiModelProperty(value = "工单主键")
    private Integer workorderId;
    @ApiModelProperty(value = "被转交人(下一步处理人)")
    private Integer passOnUserId;
    @ApiModelProperty(value = "说明")
    private String info;
    @ApiModelProperty(value = "附件图片")
    private List<Multifile> multifileList;
    @ApiModelProperty(value = "用户信息",hidden = true)
    private Member member;
    @ApiModelProperty(value = "转交类型:0=SHE转交;1=WTS转交",hidden = true)
    private Integer passOnType;
}
server/src/main/java/com/doumee/dao/web/vo/WorkOrderDataVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.dao.web.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2025/4/8 9:20
 */
@Data
public class WorkOrderDataVO {
    @ApiModelProperty(value = "日期")
    private String dateStr;
    @ApiModelProperty(value = "总数")
    private Integer total;
    @ApiModelProperty(value = "SHE总数")
    private Integer sheTotal;
    @ApiModelProperty(value = "WTS总数")
    private Integer wtsTotal;
    @ApiModelProperty(value = "工程师总数")
    private Integer gcsTotal;
    @ApiModelProperty(value = "未关闭总数")
    private Integer unCloseTotal;
}
server/src/main/java/com/doumee/service/business/WorkorderService.java
@@ -2,7 +2,12 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Workorder;
import com.doumee.dao.web.dto.CloseDTO;
import com.doumee.dao.web.dto.PassOnDTO;
import com.doumee.dao.web.vo.WorkOrderDataVO;
import java.util.List;
/**
@@ -104,7 +109,36 @@
    Workorder getDetail(Integer id);
    /**
     * åˆå§‹åŒ–code
     * æ¯å¤©åˆå§‹åŒ–工单编号code
     */
    void initializationCode();
    /**
     * å·¥å•关闭
     * @param closeDTO
     */
    void  closeWorkOrder(CloseDTO closeDTO);
    /**
     * å·¥å•转交处理
     * @param passOnDTO
     */
    void passOn(PassOnDTO passOnDTO);
    /**
     * å·¥å•催促
     * @param workorderId
     * @param member
     */
    void urge(Integer workorderId, Member member);
    /**
     * å®šæ—¶å‚¬ä¿ƒå·¥å•
     */
    void jobUrge();
    List<WorkOrderDataVO> getWorkOrderData(Integer queryType) throws Exception;
}
server/src/main/java/com/doumee/service/business/impl/WorkorderServiceImpl.java
@@ -9,10 +9,13 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.qiyeweixin.QywxUtil;
import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.CloseDTO;
import com.doumee.dao.web.dto.DCANoProblemDTO;
import com.doumee.dao.web.dto.PassOnDTO;
import com.doumee.dao.web.vo.WorkOrderDataVO;
import com.doumee.service.business.WorkorderService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -23,6 +26,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -72,22 +76,34 @@
        workorder.setEditDate(new Date());
        workorder.setMemberId(workorder.getMemberId());
        workorder.setIsdeleted(Constants.ZERO);
        workorder.setStatus(Constants.ZERO);
        workorder.setCode(this.getNextCode(workorder.getType()));
        //处理人员类信息
        this.dealNoticeData(workorder);
        //处理SHE事件状态
        workorder.setStatus(Constants.equalsInteger(workorder.getType(),Constants.ZERO)?Constants.workOrderStatus.close:Constants.workOrderStatus.waitConfirm);
        workorderMapper.insert(workorder);
        //存储DCA é—®é¢˜è®°å½•表
        this.saveProblemData(workorder);
        //存储附件信息
        this.saveMutiFile(workorder);
        //处理上报日志
        this.saveLog(null,workorder,Constants.ZERO,workorder.getMemberId());
        //TODO å‘送通知
        //存储日志
        this.dealLogData(workorder);
        //TODO å‘送企微通知
        return workorder.getId();
    }
    public void dealLogData(Workorder workorder){
        //处理上报日志 DCA工单 æ—¥å¿—存储至子业务 ä¸å­˜åœ¨äºŽçˆ¶çº§
        if(!Constants.equalsInteger(workorder.getType(),Constants.ONE)){
            String logTitle = "工单提报";
            if(!Constants.equalsInteger(workorder.getType(),Constants.ZERO)){
                logTitle = Constants.equalsInteger(workorder.getType(),Constants.ONE)?"跌绊滑风险提报":"DCA上报";
            }
            this.saveLog(null,workorder,Constants.ZERO,workorder.getMemberId(),logTitle,null);
        }
    }
    /**
     * å­˜å‚¨é™„件信息
@@ -99,13 +115,7 @@
            for (Multifile multifile:multifileList) {
                multifile.setObjId(workorder.getId());
                multifile.setCreateDate(new Date());
                if(Constants.equalsInteger(workorder.getType(),Constants.ZERO)){//SHE事件上报图片
                    multifile.setObjType(Constants.multiFileType.sheUpload);
                }else if(Constants.equalsInteger(workorder.getType(),Constants.THREE)){//跌绊滑事件上报图片
                    multifile.setObjType(Constants.multiFileType.dbhUpload);
                }else if(Constants.equalsInteger(workorder.getType(),Constants.ONE)){//DCA事件上报
                    multifile.setObjType(Constants.multiFileType.dcaUpload);
                }
                multifile.setObjType(Constants.multiFileType.upload);
            }
            multifileMapper.insert(multifileList);
        }
@@ -134,13 +144,16 @@
                    dcaWorkOrder.setProblemId(problem.getId());
                    dcaWorkOrder.setProblemInfo(problem.getRemark());
                    dcaWorkOrder.setDcaRecordId(workorder.getId());
                    dcaWorkOrder.setEventInfo(dcaNoProblemDTO.getEventInfo());
                    workorderMapper.insert(dcaWorkOrder);
                    //存储日志
                    this.dealLogData(dcaWorkOrder);
                    List<Multifile> multifileList = dcaNoProblemDTO.getMultifileList();
                    if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
                        for (Multifile multifile:multifileList) {
                            multifile.setObjId(dcaWorkOrder.getId());
                            multifile.setCreateDate(new Date());
                            multifile.setObjType(Constants.multiFileType.dcaWorkOrder);
                            multifile.setObjType(Constants.multiFileType.upload);
                        }
                        multifileMapper.insert(multifileList);
                    }
@@ -187,10 +200,10 @@
     *
     * @param beforeJson
     * @param afterWorkorder
     * @param objType æ“ä½œç±»åž‹ 0任务上报 1任务确认 2任务分配物业主管 3任务关闭 4任务分配处理人 5任务催促
     * @param objType æ“ä½œç±»åž‹ 0任务上报 1任务分配物业主管 2任务分配处理人 3任务处理关闭 4任务催促
     * @param memberId
     */
    public void saveLog(String beforeJson,Workorder afterWorkorder,Integer objType,Integer memberId){
    public Integer saveLog(String beforeJson,Workorder afterWorkorder,Integer objType,Integer memberId,String title,String content){
        WorkorderLog workorderLog = new WorkorderLog();
        workorderLog.setCreateDate(new Date());
        workorderLog.setEditDate(new Date());
@@ -200,7 +213,10 @@
        workorderLog.setParam1(memberId.toString());
        workorderLog.setObjId(afterWorkorder.getId().toString());
        workorderLog.setObjType(objType);
        workorderLog.setTitle(title);
        workorderLog.setContent(content);
        workorderLogMapper.insert(workorderLog);
        return workorderLog.getId();
    }
@@ -290,8 +306,44 @@
                workorder.setMultifileList(multifileList);
            }
        }
        //查询日志信息
        workorder.setLogList(this.getLogList(workorder.getId()));
        return workorder;
    }
    public List<WorkorderLog> getLogList(Integer orderId){
        List<WorkorderLog> logList = workorderLogMapper.selectJoinList(WorkorderLog.class,
                new MPJLambdaWrapper<WorkorderLog>()
                        .selectAll(WorkorderLog.class)
                        .selectAs(Member::getName,WorkorderLog::getUserName)
                        .selectAs(Member::getCompanyName,WorkorderLog::getCompanyName)
                        .leftJoin(Member.class,Member::getId,WorkorderLog::getParam1)
                        .eq(WorkorderLog::getObjId,orderId)
                        .orderByAsc(WorkorderLog::getId)
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(logList)){
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.WORKORDER_FILE_PATH).getCode();
            for (WorkorderLog workorderLog:logList) {
                //查询附件信息
                List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                        .eq(Multifile::getIsdeleted,Constants.ZERO)
                        .ne(Multifile::getObjType,Constants.multiFileType.upload)
                        .eq(Multifile::getObjId,workorderLog.getId())
                        .orderByAsc(Multifile::getId));
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
                    for (Multifile multifile:multifileList) {
                        multifile.setFileurlFull(path+multifile.getFileurl());
                    }
                    workorderLog.setMultifileList(multifileList);
                }
            }
        }
        return logList;
    }
    @Override
@@ -445,29 +497,254 @@
    @Override
    public void  closeWorkOrder(CloseDTO closeDTO){
        if(Objects.isNull(closeDTO)
        || Objects.isNull(closeDTO.getWorkorderId())
        || org.apache.commons.lang3.StringUtils.isBlank(closeDTO.getInfo())
        || com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(closeDTO.getMultifileList())){
            || Objects.isNull(closeDTO.getWorkorderId())
            || org.apache.commons.lang3.StringUtils.isBlank(closeDTO.getInfo())
            || com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(closeDTO.getMultifileList())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Workorder workorder = workorderMapper.selectById(closeDTO.getWorkorderId());
        String beforeJson = JSONObject.toJSONString(workorder);
        if(Objects.isNull(workorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到工单数据");
        }
        if(!(Constants.equalsInteger(workorder.getStatus(),Constants.ZERO)
            || Constants.equalsInteger(workorder.getStatus(),Constants.ONE)
            || Constants.equalsInteger(workorder.getStatus(),Constants.TWO))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"工单状态已流转无法进行操作");
        if(Constants.equalsInteger(workorder.getType(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"SHE工单无法进行该操作");
        }
        if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.sheClose)||Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.wtsClose)||Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.close)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"工单状态已流转");
        }
        //提交后的 å¾…确认/待初审状态 å¦‚果去关闭 åªæœ‰å·¥å•里绑定的SHE人员可以关闭
        if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitConfirm)){
            //判断SHE人员内是否有当前登录账号
            if(workorder.getQwnoticeMemberIds().indexOf(closeDTO.getMember().getQwId())<Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前工单非您的工单,无法进行处理");
            }
            workorder.setStatus(Constants.workOrderStatus.sheClose);
        }else if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)){
            //判断SHE人员内是否有当前登录账号
            if(workorder.getQwnoticeMemberIds().indexOf(closeDTO.getMember().getQwId())<Constants.ZERO &&  !workorder.getManagerId().equals(closeDTO.getMember().getQwId())){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前工单非您的工单,无法进行处理");
            }
            workorder.setStatus(Constants.workOrderStatus.wtsClose);
        }else if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitDeal)){
            //判断SHE人员内是否有当前登录账号
            if(workorder.getQwnoticeMemberIds().indexOf(closeDTO.getMember().getQwId())<Constants.ZERO &&  !workorder.getManagerId().equals(closeDTO.getMember().getQwId())
                    &&  !workorder.getDealerId().equals(closeDTO.getMember().getQwId()) ){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,当前工单非您的工单,无法进行处理");
            }
            workorder.setStatus(Constants.workOrderStatus.wtsClose);
        }else{
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"工单状态已流转");
        }
        workorder.setEditDate(new Date());
        workorder.setDealTime(new Date());
        workorder.setDealInfo(closeDTO.getInfo());
        workorderMapper.updateById(workorder);
        //处理上报日志
        Integer logId = this.saveLog(beforeJson,workorder,Constants.THREE,workorder.getMemberId(),"任务已处理",closeDTO.getInfo());
        List<Multifile> multifileList = workorder.getMultifileList();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
            for (Multifile multifile:multifileList) {
                multifile.setObjId(logId);
                multifile.setCreateDate(new Date());
                multifile.setObjType(Constants.multiFileType.deal);
            }
            multifileMapper.insert(multifileList);
        }
    }
    @Override
    public void passOn(PassOnDTO passOnDTO){
        if(Objects.isNull(passOnDTO)
                || Objects.isNull(passOnDTO.getWorkorderId())
                || Objects.isNull(passOnDTO.getPassOnUserId())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Member member = memberMapper.selectById(passOnDTO.getPassOnUserId());
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到被转交人信息");
        }
        Workorder workorder = workorderMapper.selectById(passOnDTO.getWorkorderId());
        String beforeJson = JSONObject.toJSONString(workorder);
        if(Objects.isNull(workorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到工单数据");
        }
        if(Constants.equalsInteger(workorder.getType(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"SHE工单无法进行该操作");
        }
        if(Constants.equalsInteger(passOnDTO.getPassOnType(),Constants.ZERO)){
            if(!Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitConfirm)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"工单状态已流转");
            }
            workorder.setManagerId(member.getQwId());
            workorder.setStatus(Constants.workOrderStatus.waitAllocation);
        }else{
            if(!(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)
                || Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitDeal))){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"工单状态已流转");
            }
            workorder.setDealerId(member.getQwId());
            workorder.setStatus(Constants.workOrderStatus.waitDeal);
        }
        workorder.setEditDate(new Date());
        workorder.setUrgeDate(DateUtil.afterHoursDate(new Date(),24));
        workorderMapper.updateById(workorder);
        //处理上报日志
        Integer logId = this.saveLog(beforeJson,workorder,
                Constants.equalsInteger(passOnDTO.getPassOnType(),Constants.ZERO)?Constants.ONE:Constants.TWO
                ,workorder.getMemberId(),"任务分配",passOnDTO.getInfo());
        List<Multifile> multifileList = workorder.getMultifileList();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(multifileList)){
            for (Multifile multifile:multifileList) {
                multifile.setObjId(logId);
                multifile.setCreateDate(new Date());
                multifile.setObjType(Constants.multiFileType.passOn);
            }
            multifileMapper.insert(multifileList);
        }
        //TODO ä¼ä¸šå¾®ä¿¡é€šçŸ¥
    }
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public void urge(Integer workorderId,Member member){
        Workorder workorder = workorderMapper.selectById(workorderId);
        workorder.setEditDate(new Date());
        workorder.setUrgeDate(DateUtil.afterHoursDate(new Date(),24));
        workorderMapper.updateById(workorder);
        if(Objects.isNull(workorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到工单数据");
        }
        Member urgeUser = new Member();
        //如果已分配 wts åˆ™æ˜¯å‚¬ä¿ƒwts
        if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)){
            urgeUser = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO).eq(Member::getQwId,workorder.getManagerId()).last("limit 1 "));
        }else if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)){
            urgeUser = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO).eq(Member::getQwId,workorder.getDealerId()).last("limit 1 "));
        }else{
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"状态已流转无法进行该操作");
        }
        this.saveLog(null,workorder,
                Constants.ONE
                ,member.getId(),"催促","已催促 "+urgeUser.getCompanyName() + "/" + urgeUser.getName());
        //TODO å‘送企微通知
    }
    @Override
    public void jobUrge(){
        List<Workorder> workorderList = workorderMapper.selectList(new QueryWrapper<Workorder>().lambda().eq(Workorder::getIsdeleted,Constants.ZERO)
                .in(Workorder::getStatus,Constants.workOrderStatus.waitAllocation,Constants.workOrderStatus.waitDeal)
                .apply(" urge_time > now() ")
        );
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(workorderList)){
            for (Workorder workorder:workorderList) {
                this.autoUrge(workorder);
                workorder.setEditDate(new Date());
                workorder.setUrgeDate(DateUtil.afterHoursDate(new Date(),24));
                workorderMapper.updateById(workorder);
            }
        }
    }
    public void autoUrge(Workorder workorder){
        if(Objects.isNull(workorder)){
           return;
        }
        Member urgeUser = new Member();
        //如果已分配 wts åˆ™æ˜¯å‚¬ä¿ƒwts
        if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)){
            urgeUser = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO).eq(Member::getQwId,workorder.getManagerId()).last("limit 1 "));
        }else if(Constants.equalsInteger(workorder.getStatus(),Constants.workOrderStatus.waitAllocation)){
            urgeUser = memberMapper.selectOne(new QueryWrapper<Member>().lambda().eq(Member::getIsdeleted,Constants.ZERO).eq(Member::getQwId,workorder.getDealerId()).last("limit 1 "));
        }else{
            return;
        }
        //TODO å‘送企微通知
    }
    /**
     * æ•°æ®æŠ¥è¡¨
     * @param queryType 0=按照月份;1=按照季度;2=按照年份(暂不处理)
     * @return
     */
    @Override
    public List<WorkOrderDataVO> getWorkOrderData(Integer queryType) throws Exception {
        String year = DateUtil.getNowYear();
        Integer nowMonth = DateUtil.getNowMonth();
        Integer quarter  = (nowMonth - 1) / 3 + 1;
        List<WorkOrderDataVO> workOrderDataVOList = new ArrayList<>();
        //查询今年所有的数据
        List<Workorder> workorderList = workorderMapper.selectList(new QueryWrapper<Workorder>().lambda().like(Workorder::getCreateDate,year)
                .eq(Workorder::getIsdeleted,Constants.ZERO));
        if(Constants.equalsInteger(queryType,Constants.ZERO)){
            for (int i = 1 ; i <= nowMonth; i++) {
                WorkOrderDataVO workOrderDataVO = new WorkOrderDataVO();
                String monthDay = year + "-" + org.apache.commons.lang3.StringUtils.leftPad(nowMonth.toString(),2,"0");
                List<Workorder> dataList = workorderList.stream().filter(j->DateUtil.formatDate(j.getCreateDate(),"yyyy-MM").equals(monthDay))
                        .collect(Collectors.toList());
                workOrderDataVO.setDateStr(monthDay);
                workOrderDataVO.setGcsTotal(Constants.ZERO);
                workOrderDataVO.setWtsTotal(Constants.ZERO);
                workOrderDataVO.setSheTotal(Constants.ZERO);
                workOrderDataVO.setUnCloseTotal(Constants.ZERO);
                workOrderDataVO.setTotal(Constants.ZERO);
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(dataList)){
                    workOrderDataVO.setTotal(dataList.size());
                    workOrderDataVO.setGcsTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.close)).collect(Collectors.toList()).size());
                    workOrderDataVO.setSheTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.sheClose)).collect(Collectors.toList()).size());
                    workOrderDataVO.setWtsTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.wtsClose)).collect(Collectors.toList()).size());
                    workOrderDataVO.setUnCloseTotal(workOrderDataVO.getTotal() - workOrderDataVO.getSheTotal() - workOrderDataVO.getWtsTotal() - workOrderDataVO.getGcsTotal());
                }
                workOrderDataVOList.add(workOrderDataVO);
            }
        }else if(Constants.equalsInteger(queryType,Constants.ONE)){
            //按照季度查询
            for (int i = 1 ; i <= quarter; i++) {
                List<Workorder> dataList = new ArrayList<>();
                if(Constants.equalsInteger(i,Constants.ONE)){
                     dataList = workorderList.stream().filter(j->Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))<=3 )
                            .collect(Collectors.toList());
                }else if(Constants.equalsInteger(i,Constants.TWO)){
                    dataList = workorderList.stream().filter(j->Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))<=6 && Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))>=4 )
                            .collect(Collectors.toList());
                }else if(Constants.equalsInteger(i,Constants.THREE)){
                    dataList = workorderList.stream().filter(j->Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))<=9 && Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))>=7 )
                            .collect(Collectors.toList());
                }else {
                    dataList = workorderList.stream().filter(j-> Integer.valueOf(DateUtil.formatDate(j.getCreateDate(),"MM"))>=10 )
                            .collect(Collectors.toList());
                }
                WorkOrderDataVO workOrderDataVO = new WorkOrderDataVO();
                workOrderDataVO.setDateStr(i+"季度");
                workOrderDataVO.setGcsTotal(Constants.ZERO);
                workOrderDataVO.setWtsTotal(Constants.ZERO);
                workOrderDataVO.setSheTotal(Constants.ZERO);
                workOrderDataVO.setUnCloseTotal(Constants.ZERO);
                workOrderDataVO.setTotal(Constants.ZERO);
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(dataList)){
                    workOrderDataVO.setTotal(dataList.size());
                    workOrderDataVO.setGcsTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.close)).collect(Collectors.toList()).size());
                    workOrderDataVO.setSheTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.sheClose)).collect(Collectors.toList()).size());
                    workOrderDataVO.setWtsTotal(dataList.stream().filter(j->Constants.equalsInteger(j.getStatus(),Constants.workOrderStatus.wtsClose)).collect(Collectors.toList()).size());
                    workOrderDataVO.setUnCloseTotal(workOrderDataVO.getTotal() - workOrderDataVO.getSheTotal() - workOrderDataVO.getWtsTotal() - workOrderDataVO.getGcsTotal());
                }
                workOrderDataVOList.add(workOrderDataVO);
            }
        }
        return workOrderDataVOList;
    }