From 74d0440513e623ce3b18b043d8da218ca3f4d7f5 Mon Sep 17 00:00:00 2001 From: yang_shj <1069818635@QQ.com> Date: Wed, 23 Oct 2024 13:09:04 +0800 Subject: [PATCH] =?UTF-8?q?#=E6=A3=80=E4=BF=AE=E5=B7=A5=E4=BD=9C=E7=A5=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarm/config/constants/AlarmConstants.java | 2 +- .../process/constant/TicketProcessConstant.java | 3 + .../constants/AccessTicketConstants.java | 20 + .../dto/request/AccessTicketDetailReqDTO.java | 16 + .../dto/request/AccessTicketPageReqDTO.java | 19 + .../request/AccessTicketStartProcessReqDTO.java | 32 ++ .../dto/response/AccessTicketDetailRspDTO.java | 14 + .../dto/response/AccessTicketPageRspDTO.java | 14 + .../response/AccessTicketStartProcessRspDTO.java | 13 + .../accessTicket/entity/AccessTicketEntity.java | 118 ++++++ .../feign/AccessTicketClientFallback.java | 17 + .../accessTicket/feign/IAccessTicketClient.java | 26 ++ .../accessTicket/vo/AccessTicketMeasureVo.java | 17 + .../accessTicket/vo/AccessTicketPreviewVo.java | 134 +++++++ .../accessTicket/vo/AccessTicketRiskFactorsVo.java | 20 + .../service/impl/ElectricReportServiceImpl.java | 2 +- .../serviceimpl/AccessTicketServiceImpl.java | 60 +++ .../service/alarm/impl/AlarmServiceImpl.java | 7 +- .../impl/StartStopDurationServiceImpl.java | 2 +- .../operation/monitor/impl/MonitorServiceImpl.java | 13 +- .../inspect/obj/mapper/ObjectTemplateMapper.xml | 2 +- .../obj/services/impl/ObjectServiceImpl.java | 6 +- .../service/impl/RealMonitorServiceImpl.java | 4 - hzims-service/pom.xml | 2 +- .../com/hnac/hzims/ticket/TicketApplication.java | 2 +- .../controller/AccessTicketController.java | 68 ++++ .../accessTicket/feign/AccessTicketClient.java | 27 ++ .../accessTicket/mapper/AccessTicketMapper.java | 16 + .../accessTicket/mapper/AccessTicketMapper.xml | 18 + .../accessTicket/service/AccessTicketService.java | 32 ++ .../service/impl/AccessTicketServiceImpl.java | 441 +++++++++++++++++++++ .../java/com/hnac/hzims/ticket/utils/PdfUtils.java | 2 +- .../accessTicket/access_ticket_template.docx | Bin 0 -> 25106 bytes 33 files changed, 1148 insertions(+), 21 deletions(-) create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/constants/AccessTicketConstants.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketDetailReqDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketPageReqDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketStartProcessReqDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketDetailRspDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketPageRspDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketStartProcessRspDTO.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/entity/AccessTicketEntity.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/AccessTicketClientFallback.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/IAccessTicketClient.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketMeasureVo.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketPreviewVo.java create mode 100644 hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketRiskFactorsVo.java create mode 100644 hzims-service/hzims-middle/src/main/java/com/hnac/hzims/middle/processflow/strategy/serviceimpl/AccessTicketServiceImpl.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/controller/AccessTicketController.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/AccessTicketClient.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/mapper/AccessTicketMapper.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/mapper/AccessTicketMapper.xml create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/AccessTicketService.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/impl/AccessTicketServiceImpl.java create mode 100644 hzims-service/ticket/src/main/resources/template/accessTicket/access_ticket_template.docx diff --git a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/config/constants/AlarmConstants.java b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/config/constants/AlarmConstants.java index b4104c2..234d65d 100644 --- a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/config/constants/AlarmConstants.java +++ b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/config/constants/AlarmConstants.java @@ -70,5 +70,5 @@ public interface AlarmConstants { String FDP_INVALID_ZOME_STATUS = "1"; - List WHOLE_ALARM_TYPE = Arrays.asList(AlarmConstants.WARNING,AlarmConstants.FAULT,AlarmConstants.OFFSIDE,AlarmConstants.INTERRUPT,AlarmConstants.ABNORMAL,AlarmConstants.EARLY,AlarmConstants.ONE_LEVEL,AlarmConstants.TWO_LEVEL,AlarmConstants.THREE_LEVEL); + List WHOLE_ALARM_TYPE = Arrays.asList(AlarmConstants.WARNING,AlarmConstants.FAULT,AlarmConstants.OFFSIDE,AlarmConstants.INTERRUPT,AlarmConstants.CONDITION,AlarmConstants.ABNORMAL,AlarmConstants.EARLY,AlarmConstants.ONE_LEVEL,AlarmConstants.TWO_LEVEL,AlarmConstants.THREE_LEVEL); } diff --git a/hzims-service-api/middle-api/src/main/java/com/hnac/hzims/middle/process/constant/TicketProcessConstant.java b/hzims-service-api/middle-api/src/main/java/com/hnac/hzims/middle/process/constant/TicketProcessConstant.java index 4dfcdc3..79691ee 100644 --- a/hzims-service-api/middle-api/src/main/java/com/hnac/hzims/middle/process/constant/TicketProcessConstant.java +++ b/hzims-service-api/middle-api/src/main/java/com/hnac/hzims/middle/process/constant/TicketProcessConstant.java @@ -79,6 +79,9 @@ public class TicketProcessConstant { */ public static final String OFFLINE_OPERATION_TICKET = "OperationTicketOffline"; + + public static final String ACCESS_TICKET = "access_ticket"; + /**项目经理**/ public static final String PROJECT_MANAGER = "projectManager"; } diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/constants/AccessTicketConstants.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/constants/AccessTicketConstants.java new file mode 100644 index 0000000..e918b81 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/constants/AccessTicketConstants.java @@ -0,0 +1,20 @@ +package com.hnac.hzims.ticket.accessTicket.constants; + +/** + * @author ysj + */ +public interface AccessTicketConstants { + + // 检修工作票流程key + String ACCESS_TICKET_PROCESS_KEY = "access_ticket"; + + // 检修工作票流程表名 + String ACCESS_TICKET_TABLE = "access_work_ticket"; + + + // 检修完成 + String ACCESS_COMPLETE = "complete"; + + // 检修延期 + String ACCESS_EXTENSION = "extension"; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketDetailReqDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketDetailReqDTO.java new file mode 100644 index 0000000..09c8cb0 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketDetailReqDTO.java @@ -0,0 +1,16 @@ +package com.hnac.hzims.ticket.accessTicket.dto.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ysj + */ +@Data +public class AccessTicketDetailReqDTO implements Serializable { + + @ApiModelProperty(value = "主键id") + private String processInstanceId; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketPageReqDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketPageReqDTO.java new file mode 100644 index 0000000..50db863 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketPageReqDTO.java @@ -0,0 +1,19 @@ +package com.hnac.hzims.ticket.accessTicket.dto.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ysj + */ +@Data +public class AccessTicketPageReqDTO implements Serializable { + + @ApiModelProperty("开始时间 : YYYY-MM-DD HH:MM:SS") + private String startTime; + + @ApiModelProperty("结束时间 : YYYY-MM-DD HH:MM:SS") + private String endTime; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketStartProcessReqDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketStartProcessReqDTO.java new file mode 100644 index 0000000..36ac62f --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/request/AccessTicketStartProcessReqDTO.java @@ -0,0 +1,32 @@ +package com.hnac.hzims.ticket.accessTicket.dto.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * @author ysj + */ +@Data +public class AccessTicketStartProcessReqDTO implements Serializable { + + @ApiModelProperty("是否外部单位 : 0-非外部单位 1-外部单位") + private Integer isExternal; + + @ApiModelProperty("是否紧急 : 0-正常 1-紧急") + private Integer isEmergency; + + @ApiModelProperty("设备编号") + private String deviceCode; + + @ApiModelProperty("故障描述") + private String faultDescribe; + + @ApiModelProperty("图片") + private List imgs; + + @ApiModelProperty("视频") + private List videos; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketDetailRspDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketDetailRspDTO.java new file mode 100644 index 0000000..c560b70 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketDetailRspDTO.java @@ -0,0 +1,14 @@ +package com.hnac.hzims.ticket.accessTicket.dto.response; + +import com.hnac.hzims.ticket.accessTicket.entity.AccessTicketEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author ysj + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AccessTicketDetailRspDTO extends AccessTicketEntity { + +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketPageRspDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketPageRspDTO.java new file mode 100644 index 0000000..aa79b6f --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketPageRspDTO.java @@ -0,0 +1,14 @@ +package com.hnac.hzims.ticket.accessTicket.dto.response; + +import com.hnac.hzims.ticket.accessTicket.entity.AccessTicketEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author ysj + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class AccessTicketPageRspDTO extends AccessTicketEntity { + +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketStartProcessRspDTO.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketStartProcessRspDTO.java new file mode 100644 index 0000000..e98e064 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/dto/response/AccessTicketStartProcessRspDTO.java @@ -0,0 +1,13 @@ +package com.hnac.hzims.ticket.accessTicket.dto.response; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author ysj + */ +@Data +public class AccessTicketStartProcessRspDTO implements Serializable { + +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/entity/AccessTicketEntity.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/entity/AccessTicketEntity.java new file mode 100644 index 0000000..183fbb0 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/entity/AccessTicketEntity.java @@ -0,0 +1,118 @@ +package com.hnac.hzims.ticket.accessTicket.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.core.tenant.mp.TenantEntity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @author ysj + */ +@Data +@ApiModel(value = "检修工作票",description = "检修工作票") +@TableName("access_work_ticket") +@EqualsAndHashCode(callSuper = false) +public class AccessTicketEntity extends TenantEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("是否外部单位 : 0-非外部单位 1-外部单位") + private Integer isExternal; + + @ApiModelProperty("是否紧急 : 0-正常 1-紧急") + private Integer isEmergency; + + @ApiModelProperty("检修编号") + private String code; + + @ApiModelProperty("设备编号") + private String deviceCode; + + @ApiModelProperty("设备名称") + private String deviceName; + + @ApiModelProperty("设备地址") + private String deviceAddress; + + @ApiModelProperty("故障描述") + private String faultDescribe; + + @ApiModelProperty("检修内容") + private String accessContent; + + @ApiModelProperty("质量标准") + private String qualityStandard; + + @ApiModelProperty("危险作业类别: 存储作业类别字典,以逗号分隔") + private String dangerous; + + @ApiModelProperty("计划开始时间") + private Date planStartTime; + + @ApiModelProperty("计划结束时间") + private Date planEndTime; + + @ApiModelProperty("检修安全措施") + private String measures; + + @ApiModelProperty("检修安全措施确认人") + private String measuresConfirmPersonnel; + + @ApiModelProperty("危险因素") + private String riskFactors; + + @ApiModelProperty("学习确认危险点负责人") + private String studyHead; + + @ApiModelProperty("学习确认危险点成员") + private String studyMembers; + + @ApiModelProperty("签发时间") + private Date issueTime; + + @ApiModelProperty("签发人员") + private String issuePersonnel; + + @ApiModelProperty("实际开始时间") + private Date actStartTime; + + @ApiModelProperty("实际结束时间") + private Date actEndTime; + + @ApiModelProperty("延期时间") + private Date extensionTime; + + @ApiModelProperty("延期审核人") + private String extensionPersonnel; + + @ApiModelProperty("验收时间") + private Date checkTime; + + @ApiModelProperty("验收审核人") + private String checkPersonnel; + + @ApiModelProperty("备注") + private String memo; + + @ApiModelProperty("图片") + private String imgs; + + @ApiModelProperty("视频") + private String videos; + + @ApiModelProperty("当前任务名称") + private String taskName; + + @ApiModelProperty("当前步骤处理人员名称") + private String nextStepOperator; + + @ApiModelProperty("流程实例Id") + private String processInstanceId; + + +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/AccessTicketClientFallback.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/AccessTicketClientFallback.java new file mode 100644 index 0000000..e041791 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/AccessTicketClientFallback.java @@ -0,0 +1,17 @@ +package com.hnac.hzims.ticket.accessTicket.feign; + +import com.hnac.hzims.middle.process.to.ProcessWorkFlowResponse; +import org.springblade.core.tool.api.R; +import org.springframework.stereotype.Component; + +/** + * @author ysj + */ +@Component +public class AccessTicketClientFallback implements IAccessTicketClient { + + @Override + public R listener(ProcessWorkFlowResponse processWorkFlowResponse) { + return R.fail("执行失败!"); + } +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/IAccessTicketClient.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/IAccessTicketClient.java new file mode 100644 index 0000000..15cb841 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/feign/IAccessTicketClient.java @@ -0,0 +1,26 @@ +package com.hnac.hzims.ticket.accessTicket.feign; + +import com.hnac.hzims.middle.process.to.ProcessWorkFlowResponse; +import com.hnac.hzims.ticket.allTicket.fegin.TicketInfoAllClientFallback; +import com.hnac.hzims.ticket.constants.TicketConstants; +import org.springblade.core.tool.api.R; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author ysj + */ +@FeignClient( + value = TicketConstants.APP_NAME, + fallback = AccessTicketClientFallback.class +) +public interface IAccessTicketClient { + + String API_PREFIX = "/feign/accessTicket"; + + String ACCESS_TICKET_PROCESS_LISTENER = API_PREFIX + "/listener"; + + @PostMapping(ACCESS_TICKET_PROCESS_LISTENER) + R listener(@RequestBody ProcessWorkFlowResponse processWorkFlowResponse); +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketMeasureVo.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketMeasureVo.java new file mode 100644 index 0000000..05974d4 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketMeasureVo.java @@ -0,0 +1,17 @@ +package com.hnac.hzims.ticket.accessTicket.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author ysj + */ +@Data +public class AccessTicketMeasureVo { + + @ApiModelProperty("检修措施字典编号") + private String code; + + @ApiModelProperty("措施描述") + private String measures; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketPreviewVo.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketPreviewVo.java new file mode 100644 index 0000000..4962100 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketPreviewVo.java @@ -0,0 +1,134 @@ +package com.hnac.hzims.ticket.accessTicket.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author ysj + */ +@Data +public class AccessTicketPreviewVo { + + @ApiModelProperty("创建时间") + private String create; + + @ApiModelProperty("检修创建时间: 年") + private Integer cy; + + @ApiModelProperty("检修创建时间: 月") + private Integer cm; + + @ApiModelProperty("检修创建时间: 日") + private Integer cday; + + @ApiModelProperty("编号") + private String code; + + @ApiModelProperty("设备名称") + private String deviceName; + + @ApiModelProperty("检修内容") + private String content; + + @ApiModelProperty("质量标准") + private String standard; + + @ApiModelProperty("作业危险类别") + private String dangerous; + + @ApiModelProperty("备注") + private String memo; + + @ApiModelProperty("工作负责人签名") + private String studyHead; + + @ApiModelProperty("工作班组成员") + private String studyMembers; + + @ApiModelProperty("计划开始检修时间: 年") + private Integer psy; + + @ApiModelProperty("计划开始检修时间: 月") + private Integer psm; + + @ApiModelProperty("计划开始检修时间: 日") + private Integer psd; + + @ApiModelProperty("计划开始检修时间: 时") + private Integer psh; + + @ApiModelProperty("计划开始检修时间: 分") + private Integer psmi; + + @ApiModelProperty("计划结束检修时间: 年") + private Integer pey; + + @ApiModelProperty("计划结束检修时间: 月") + private Integer pem; + + @ApiModelProperty("计划结束检修时间: 日") + private Integer ped; + + @ApiModelProperty("计划结束检修时间: 时") + private Integer peh; + + @ApiModelProperty("计划结束检修时间: 分") + private Integer pemi; + + @ApiModelProperty("检修成员人数") + private Integer accessCount; + + @ApiModelProperty("签发人员") + private String issuePersonnel; + + @ApiModelProperty("签发时间: 年") + private Integer issy; + + @ApiModelProperty("签发时间: 月") + private Integer issm; + + @ApiModelProperty("签发时间: 日") + private Integer issd; + + @ApiModelProperty("签发时间: 时") + private Integer issh; + + @ApiModelProperty("签发时间: 分") + private Integer issmi; + + @ApiModelProperty("延期审核人") + private String extensionPersonnel; + + @ApiModelProperty("延期审核时间: 年") + private String ey; + + @ApiModelProperty("延期审核时间: 月") + private String em; + + @ApiModelProperty("延期审核时间: 日") + private String ed; + + @ApiModelProperty("延期审核时间: 时") + private String eh; + + @ApiModelProperty("延期审核时间: 分") + private String emi; + + @ApiModelProperty("验收审核人") + private String checkPersonnel; + + @ApiModelProperty("验收时间: 年") + private Integer chy; + + @ApiModelProperty("验收时间: 月") + private Integer chm; + + @ApiModelProperty("验收时间: 日") + private Integer chd; + + @ApiModelProperty("验收时间: 时") + private Integer chh; + + @ApiModelProperty("验收时间: 分") + private Integer chmi; +} \ No newline at end of file diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketRiskFactorsVo.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketRiskFactorsVo.java new file mode 100644 index 0000000..22adbb1 --- /dev/null +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/accessTicket/vo/AccessTicketRiskFactorsVo.java @@ -0,0 +1,20 @@ +package com.hnac.hzims.ticket.accessTicket.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author ysj + */ +@Data +public class AccessTicketRiskFactorsVo { + + @ApiModelProperty("危险因素字典编号") + private String code; + + @ApiModelProperty("控制措施") + private String controlMeasures; + + @ApiModelProperty("票据编号") + private String ticketCode; +} \ No newline at end of file diff --git a/hzims-service/equipment/src/main/java/com/hnac/hzims/electric/service/impl/ElectricReportServiceImpl.java b/hzims-service/equipment/src/main/java/com/hnac/hzims/electric/service/impl/ElectricReportServiceImpl.java index f5cf6ac..59159f7 100644 --- a/hzims-service/equipment/src/main/java/com/hnac/hzims/electric/service/impl/ElectricReportServiceImpl.java +++ b/hzims-service/equipment/src/main/java/com/hnac/hzims/electric/service/impl/ElectricReportServiceImpl.java @@ -1550,7 +1550,7 @@ public class ElectricReportServiceImpl implements IElectricReportService { reactive.setKeepFigures(2); reactive.setAccessRules(5); reactive.setSaveTimeType(2); - reactive.setSignages("reactive_generation"); + reactive.setSignages("reactive_generate"); reactive.setTimeInterval(1); reactive.setBeginTime(start); reactive.setEndTime(end); diff --git a/hzims-service/hzims-middle/src/main/java/com/hnac/hzims/middle/processflow/strategy/serviceimpl/AccessTicketServiceImpl.java b/hzims-service/hzims-middle/src/main/java/com/hnac/hzims/middle/processflow/strategy/serviceimpl/AccessTicketServiceImpl.java new file mode 100644 index 0000000..578e360 --- /dev/null +++ b/hzims-service/hzims-middle/src/main/java/com/hnac/hzims/middle/processflow/strategy/serviceimpl/AccessTicketServiceImpl.java @@ -0,0 +1,60 @@ +package com.hnac.hzims.middle.processflow.strategy.serviceimpl; + +import com.hnac.hzims.middle.process.to.ProcessWorkFlowResponse; +import com.hnac.hzims.middle.processflow.service.ProcessDictService; +import com.hnac.hzims.middle.processflow.strategy.abstracts.ProcessAbstractService; +import com.hnac.hzims.middle.processflow.strategy.entity.WorkflowQueue; +import com.hnac.hzims.ticket.accessTicket.feign.IAccessTicketClient; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.tool.api.R; +import org.springframework.stereotype.Service; + +import static com.hnac.hzims.middle.process.constant.TicketProcessConstant.ACCESS_TICKET; + +/** + * @author ysj + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AccessTicketServiceImpl extends ProcessAbstractService { + + + private final ProcessDictService processDictService; + + + private final IAccessTicketClient accessTicketClient; + + /** + * 比对流程key + * @param flowQueue + * @return + */ + @Override + public Boolean isWorkflowProcess(WorkflowQueue flowQueue) { + String dictValue = processDictService.selectDictValueByKey(ACCESS_TICKET); + if (dictValue.equals(flowQueue.getProcessDefinitionKey())) { + log.info("确认检修工作票流程程环节操作"); + return true; + } + return false; + } + + + /** + * 回调业务流程feign接口 + * @param response + */ + @Override + public void calculate(ProcessWorkFlowResponse response) { + log.info("检修工作票流程消费参数 :" + response); + R result = accessTicketClient.listener(response); + if (!result.isSuccess()){ + log.info("检修工作票流程处理失败"); + throw new ServiceException("检修工作票流程消费失败"); + } + log.info("检修工作票流程消费成功"); + } +} diff --git a/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/alarm/impl/AlarmServiceImpl.java b/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/alarm/impl/AlarmServiceImpl.java index 9c76de1..29de99b 100644 --- a/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/alarm/impl/AlarmServiceImpl.java +++ b/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/alarm/impl/AlarmServiceImpl.java @@ -67,7 +67,12 @@ public class AlarmServiceImpl implements AlarmService { */ @Override public void clearHistoryAlarm(String param) { - this.queryService.clear(param); + Calendar calendar = Calendar.getInstance(); + calendar.add(Calendar.DAY_OF_MONTH,-30); + calendar.add(Calendar.HOUR_OF_DAY,-calendar.get(Calendar.HOUR_OF_DAY)); + calendar.add(Calendar.MINUTE,-calendar.get(Calendar.MINUTE)); + calendar.add(Calendar.SECOND,-calendar.get(Calendar.SECOND)); + this.queryService.clear(DateUtil.format(calendar.getTime(),DateUtil.PATTERN_DATETIME)); } /** diff --git a/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/equipment/impl/StartStopDurationServiceImpl.java b/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/equipment/impl/StartStopDurationServiceImpl.java index 43a4a3d..cb59622 100644 --- a/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/equipment/impl/StartStopDurationServiceImpl.java +++ b/hzims-service/hzims-scheduled/src/main/java/com/hnac/hzims/scheduled/service/equipment/impl/StartStopDurationServiceImpl.java @@ -310,7 +310,7 @@ public class StartStopDurationServiceImpl extends ServiceImpl{ item.forEach((key,value)->{ RealStationVo realStation = new RealStationVo(); + Optional station = stations.stream().filter(o->key.equals(o.getCode())).findFirst(); + station.ifPresent(stationEntity -> realStation.setStatus(stationEntity.getStatus())); // 设备信息 List devices = this.monitorRealDevice(value,realTimeData); // 设备状态、装机容量 this.deviceParam(devices,deviceClassifyMap,deviceParms); realStation.setDeviceList(devices.stream().sorted(Comparator.comparing(RealDeviceVo::getDeviceName)).collect(Collectors.toList())); // 站点基础信息: 编码、名称、限制水位、服务类型、机构、排序 - this.stationBaseInfo(stations.stream().filter(station->key.equals(station.getCode())).findFirst(),sorts,realStation); + this.stationBaseInfo(stations.stream().filter(o->key.equals(o.getCode())).findFirst(),sorts,realStation); // 站点总功率计算 this.stationActivePower(devices,realStation); // 站点铃铛、数据中断状态 - this.stationStatus(aborts,bells,realStation); + this.stationStatus(bells,realStation,station); realStations.add(realStation); }); countDownLatch.countDown(); @@ -463,11 +465,10 @@ public class MonitorServiceImpl implements MonitorService { /** * 站点铃铛、数据中断状态 - * @param aborts * @param bells * @param realStation */ - private void stationStatus(List aborts, List bells, RealStationVo realStation) { + private void stationStatus(List bells, RealStationVo realStation,Optional optional) { realStation.setBell(0); realStation.setStatus(0); // 铃铛 @@ -475,8 +476,8 @@ public class MonitorServiceImpl implements MonitorService { realStation.setBell(1); } // 数据中断 - if(realStation.getPowerSum() <= 0 && aborts.contains(realStation.getStationCode())){ - realStation.setStatus(1); + if(realStation.getPowerSum() <= 0 && optional.isPresent()){ + realStation.setStatus(optional.get().getOnLine()); } } diff --git a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ObjectTemplateMapper.xml b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ObjectTemplateMapper.xml index 8220245..b59eb4c 100644 --- a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ObjectTemplateMapper.xml +++ b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/obj/mapper/ObjectTemplateMapper.xml @@ -3,7 +3,7 @@ + SELECT * FROM ACCESS_WORK_TICKET + + IS_DELETED = 0 + + AND CREATE_TIME >= #{param.startTime} + + + AND CREATE_TIME <= #{param.endTime} + + + ORDER BY CREATE_TIME DESC + + diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/AccessTicketService.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/AccessTicketService.java new file mode 100644 index 0000000..2f9c7f0 --- /dev/null +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/AccessTicketService.java @@ -0,0 +1,32 @@ +package com.hnac.hzims.ticket.accessTicket.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.hnac.hzims.middle.process.to.ProcessWorkFlowResponse; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketDetailReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketPageReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketStartProcessReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.response.AccessTicketDetailRspDTO; +import com.hnac.hzims.ticket.accessTicket.dto.response.AccessTicketPageRspDTO; +import com.hnac.hzims.ticket.accessTicket.entity.AccessTicketEntity; +import org.springblade.core.mp.support.Query; + +import javax.servlet.http.HttpServletResponse; + +/** + * @author ysj + */ +public interface AccessTicketService extends IService { + + boolean startProcess(AccessTicketStartProcessReqDTO param); + + boolean listener(ProcessWorkFlowResponse processWorkFlowResponse); + + IPage pageCondition(AccessTicketPageReqDTO param,Query query); + + AccessTicketDetailRspDTO detail(AccessTicketDetailReqDTO param); + + boolean revoke(Long ticketId); + + void preview(Long id); +} \ No newline at end of file diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/impl/AccessTicketServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/impl/AccessTicketServiceImpl.java new file mode 100644 index 0000000..5641468 --- /dev/null +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/accessTicket/service/impl/AccessTicketServiceImpl.java @@ -0,0 +1,441 @@ +package com.hnac.hzims.ticket.accessTicket.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.hnac.hzims.common.logs.utils.StringUtils; +import com.hnac.hzims.common.utils.Condition; +import com.hnac.hzims.equipment.entity.EmInfoEntity; +import com.hnac.hzims.equipment.feign.IEmInfoClient; +import com.hnac.hzims.middle.process.to.ProcessWorkFlowResponse; +import com.hnac.hzims.ticket.accessTicket.constants.AccessTicketConstants; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketDetailReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketPageReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.request.AccessTicketStartProcessReqDTO; +import com.hnac.hzims.ticket.accessTicket.dto.response.AccessTicketDetailRspDTO; +import com.hnac.hzims.ticket.accessTicket.dto.response.AccessTicketPageRspDTO; +import com.hnac.hzims.ticket.accessTicket.entity.AccessTicketEntity; +import com.hnac.hzims.ticket.accessTicket.mapper.AccessTicketMapper; +import com.hnac.hzims.ticket.accessTicket.service.AccessTicketService; +import com.hnac.hzims.ticket.accessTicket.vo.AccessTicketPreviewVo; +import com.hnac.hzims.ticket.utils.AsposeUtil; +import com.hnac.hzims.ticket.utils.PdfUtils; +import com.hnac.hzims.ticket.utils.WordUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.support.Query; +import org.springblade.core.secure.utils.AuthUtil; +import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.*; +import org.springblade.flow.core.entity.BladeFlow; +import org.springblade.flow.core.feign.IFlowClient; +import org.springblade.system.cache.DictCache; +import org.springblade.system.entity.Dict; +import org.springblade.system.user.entity.User; +import org.springblade.system.user.feign.IUserClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +/** + * @author ysj + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AccessTicketServiceImpl extends ServiceImpl implements AccessTicketService { + + + private final IUserClient userClient; + + private final IFlowClient flowClient; + + private final IEmInfoClient deviceClient; + + @Value("${hzims.ticket.accessTicket.save.pdf}") + private String savePdfPath; + + @Value("${hzims.ticket.accessTicket.save.work}") + private String saveWorkPath; + + /** + * 检修工作票开启流程 + * @param param + * @return + */ + @Override + public boolean startProcess(AccessTicketStartProcessReqDTO param) { + // 保存检修工作票 + AccessTicketEntity entity = this.saveAccessTicket(param); + + // 开启流程 + return this.start(entity); + } + + /** + * 检修工作票流程回调监听 + * @param processWorkFlowResponse + * @return + */ + @Override + public boolean listener(ProcessWorkFlowResponse processWorkFlowResponse) { + Map variables = (Map) processWorkFlowResponse.getVariables(); + AccessTicketEntity entity = JSONObject.parseObject(JSONObject.toJSONString(variables), new TypeReference(){}); + // 当前流程名称 + entity.setTaskName(processWorkFlowResponse.getTaskName()); + // 流程阶段执行人员名称 + entity.setNextStepOperator(processWorkFlowResponse.getNextStepOperator()); + + // 流程步骤 + if(variables.containsKey("processReversalStep")){ + String reversal = variables.get("processReversalStep").toString(); + // 受理 reversal = 1 + + // 检修安全措施 reversal = 2 + if("2".equals(reversal)){ + if(variables.containsKey("measures")){ + entity.setMeasures(variables.get("measures").toString()); + } + if(variables.containsKey("measuresConfirmPersonnel")){ + entity.setMeasuresConfirmPersonnel(variables.get("measuresConfirmPersonnel").toString()); + } + } + + + // 危害因素及措施 reversal = 3 + if("3".equals(reversal) && variables.containsKey("riskFactors")){ + entity.setRiskFactors(variables.get("riskFactors").toString()); + } + + // 学习确认危险点 reversal = 4 + if("4".equals(reversal)){ + if(variables.containsKey("studyHead")){ + entity.setStudyHead(variables.get("studyHead").toString()); + } + if(variables.containsKey("studyMembers")){ + entity.setStudyMembers(variables.get("studyMembers").toString()); + } + } + + // 审批签发 reversal = 5 + if("5".equals(reversal) && variables.containsKey("issuePersonnel")){ + entity.setIssueTime(new Date()); + entity.setIssuePersonnel(variables.get("issuePersonnel").toString()); + } + + // 实际检修 reversal = 6 + if("6".equals(reversal)){ + if(ObjectUtil.isNotEmpty(variables.get("access"))){ + // 检修延期 + if((Boolean) variables.get("access")){ + if(variables.containsKey("actStartTime")){ + entity.setActStartTime(DateUtil.parse(variables.get("actStartTime").toString(),DateUtil.PATTERN_DATETIME)); + } + if(variables.containsKey("actEndTime")){ + entity.setActEndTime(DateUtil.parse(variables.get("actEndTime").toString(),DateUtil.PATTERN_DATETIME)); + } + }else{ + if(variables.containsKey("extensionTime")){ + entity.setExtensionTime(DateUtil.parse(variables.get("extensionTime").toString(),DateUtil.PATTERN_DATETIME)); + } + } + } + } + + // 检修延期 reversal = 7 + if("7".equals(reversal) && variables.containsKey("extensionPersonnel")){ + entity.setExtensionPersonnel(variables.get("extensionPersonnel").toString()); + } + + // 检修验收 reversal = 8 + if("8".equals(reversal) && variables.containsKey("checkPersonnel")){ + entity.setCheckTime(new Date()); + entity.setCheckPersonnel(variables.get("checkPersonnel").toString()); + entity.setTaskName("流程结束"); + entity.setNextStepOperator("流程结束,无需人员处理"); + } + + } + return this.updateById(entity); + } + + + /** + * 保存检修工作票 + * @param param + */ + private AccessTicketEntity saveAccessTicket(AccessTicketStartProcessReqDTO param) { + // 查询设备信息 + R device = deviceClient.getEmInfoByEmCode(param.getDeviceCode()); + if(!device.isSuccess() || ObjectUtil.isEmpty(device.getData())){ + throw new ServiceException("设备信息不存在!"); + } + AccessTicketEntity entity = new AccessTicketEntity(); + entity.setCode(UUID.randomUUID().toString()); + entity.setIsExternal(param.getIsExternal()); + entity.setIsEmergency(param.getIsEmergency()); + entity.setDeviceCode(param.getDeviceCode()); + entity.setDeviceName(device.getData().getName()); + entity.setDeviceAddress(device.getData().getInsLocation()); + entity.setFaultDescribe(param.getFaultDescribe()); + // 图片 + if(CollectionUtil.isNotEmpty(param.getImgs())){ + entity.setImgs(JSONObject.toJSONString(param.getImgs())); + } + // 视频 + if(CollectionUtil.isNotEmpty(param.getVideos())){ + entity.setVideos(JSONObject.toJSONString(param.getVideos())); + } + entity.setStatus(0); + this.save(entity); + return entity; + } + + /** + * 开启流程 + * @param entity + */ + private boolean start(AccessTicketEntity entity) { + /* 并行人员设置 + // 项目负责人 + User header = queryRoleUser("200000", Long.valueOf(AuthUtil.getDeptId()), "accessTicketHead"); + variables.put("charge","taskUser_" + header.getId()); + // 许可人 + User licensor = queryRoleUser("200000", Long.valueOf(AuthUtil.getDeptId()), "accessTicketLicensor"); + variables.put("licensor","taskUser_" + licensor.getId()); + // 外部单位负责人 + User external = queryRoleUser("200000", Long.valueOf(AuthUtil.getDeptId()), "external"); + variables.put("external","taskUser_" + external.getId()); + // 设备负责人 + User manage = queryRoleUser("200000", Long.valueOf(AuthUtil.getDeptId()), "deviceManage"); + variables.put("manage","taskUser_" + manage.getId()); + + variables.put("persons", Arrays.asList("taskUser_" + header.getId(),"taskUser_" + licensor.getId(),"taskUser_" + external.getId(),"taskUser_" + manage.getId())); + */ + + Map variables = JSONObject.parseObject(JSONObject.toJSONStringWithDateFormat(entity,DateUtil.PATTERN_DATETIME), Map.class); + R result = flowClient.startProcessInstanceContainNameByKey(AccessTicketConstants.ACCESS_TICKET_PROCESS_KEY, + StringUtil.format("{}:{}",AccessTicketConstants.ACCESS_TICKET_TABLE, entity.getId()), DateUtil.format(new Date(),DateUtil.PATTERN_DATETIME) +"_" + entity.getDeviceName() + "_检修工作票", variables); + log.info("access_ticket : start_process_result _ {}",result); + // 更新任务流程Id + if (!result.isSuccess() || 200 != result.getCode()) { + throw new ServiceException("开启流程失败!"); + } + entity.setProcessInstanceId(result.getData().getProcessInstanceId()); + return this.updateById(entity); + } + + /** + * 获取当前机构指定角色的用户 + * @param tenantId + * @param deptId + * @param alias + * @return + */ + public User queryRoleUser(String tenantId, Long deptId, String alias){ + if(Func.isEmpty(tenantId)){ + tenantId = AuthUtil.getTenantId(); + } + R> result = userClient.relationUserListByRoleAlias(tenantId, deptId, alias); + if(!result.isSuccess()){ + throw new ServiceException("查询角色用户信息失败!"); + } + return result.getData().get(0); + } + + + /** + * 检修工作票列表分页查询 + * @param param + * @return + */ + @Override + public IPage pageCondition(AccessTicketPageReqDTO param, Query query) { + return super.baseMapper.pageCondition(Condition.getPage(query),param); + } + + /** + * 检修工作票详情查询 + * @param param + * @return + */ + @Override + public AccessTicketDetailRspDTO detail(AccessTicketDetailReqDTO param) { + if(StringUtil.isEmpty(param.getProcessInstanceId())){ + throw new ServiceException("参数错误!"); + } + AccessTicketEntity entity = this.getOne(Wrappers.lambdaQuery() + .eq(AccessTicketEntity::getProcessInstanceId,param.getProcessInstanceId()) + ); + return BeanUtil.copyProperties(entity,AccessTicketDetailRspDTO.class); + } + + /** + * 检修工作票预览 + * @param id + */ + @Override + public void preview(Long id) { + ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletResponse response = servletRequestAttributes.getResponse(); + // 查询检修工作票记录 + AccessTicketPreviewVo preview = this.previewParams(id); + // 参数对象 + Map params = new HashMap<>(); + try { + params = PdfUtils.objectToMap(preview); + log.info("preview_to_map : {}",params); + }catch (Exception e) { + log.info("转换对象失败!"); + } + String fileName = preview.getDeviceName() + "_检修工作票.docx"; + // 上传word文件至服务器 + String path = WordUtils.uploadWord("/template/accessTicket/",saveWorkPath,params,"access_ticket_template",fileName); + // pdf文件存放路径 + String pdfPath = savePdfPath + preview.getDeviceName() + "_检修工作票.pdf"; + // 转换pdf + AsposeUtil.wordToPdf(path,pdfPath); + // 将文件流存放至response + PdfUtils.readPdf(response,pdfPath); + } + + /** + * 检修工作票预览参数 + * @param id + * @return + */ + private AccessTicketPreviewVo previewParams(Long id) { + AccessTicketEntity access = this.getById(id); + if(ObjectUtil.isEmpty(access)){ + throw new ServiceException("未查询到检修工作票预览信息!"); + } + AccessTicketPreviewVo params = new AccessTicketPreviewVo(); + // 基础内容 + params.setCode(access.getCode()); + params.setDeviceName(access.getDeviceName()); + params.setContent(access.getAccessContent()); + params.setStandard(access.getQualityStandard()); + params.setMemo(access.getMemo()); + params.setStudyHead(access.getStudyHead()); + // 作业危险类别 + List dicts = DictCache.getList("jobHazardCategory"); + if(CollectionUtil.isNotEmpty(dicts)){ + StringBuilder dangerous = new StringBuilder(); + for (Dict dict : dicts){ + if(StringUtils.isNotEmpty(access.getDangerous())){ + if(access.getDangerous().contains(dict.getDictKey())){ + dangerous.append(" ☑").append(dict.getDictValue()); + }else{ + dangerous.append(" □").append(dict.getDictValue()); + } + }else{ + dangerous.append(" □").append(dict.getDictValue()); + } + } + params.setDangerous(dangerous.toString()); + } + + + // 检修成员人数 + if(StringUtils.isNotEmpty(access.getStudyMembers())){ + String[] members = access.getStudyMembers().split(","); + params.setAccessCount(members.length); + params.setStudyMembers(access.getStudyMembers()); + } + // 检修工作票创建时间 + Calendar create = Calendar.getInstance(); + create.setTime(access.getCreateTime()); + params.setCreate(DateUtil.format(access.getCreateTime(),DateUtil.PATTERN_DATETIME)); + params.setCy(create.get(Calendar.YEAR)); + params.setCm(create.get(Calendar.MONTH)); + params.setCday(create.get(Calendar.DAY_OF_MONTH)); + // 计划开始检修时间 + Calendar start = Calendar.getInstance(); + start.setTime(access.getPlanStartTime()); + params.setPsy(start.get(Calendar.YEAR)); + params.setPsm(start.get(Calendar.MONTH)); + params.setPsd(start.get(Calendar.DAY_OF_MONTH)); + params.setPsh(start.get(Calendar.HOUR_OF_DAY)); + params.setPsmi(start.get(Calendar.MINUTE)); + // 计划结束检修时间 + Calendar end = Calendar.getInstance(); + end.setTime(access.getPlanEndTime()); + params.setPey(end.get(Calendar.YEAR)); + params.setPem(end.get(Calendar.MONTH)); + params.setPed(end.get(Calendar.DAY_OF_MONTH)); + params.setPeh(end.get(Calendar.HOUR_OF_DAY)); + params.setPemi(end.get(Calendar.MINUTE)); + // 签发时间 + params.setIssuePersonnel(access.getIssuePersonnel()); + Calendar issue = Calendar.getInstance(); + issue.setTime(access.getIssueTime()); + params.setIssy(issue.get(Calendar.YEAR)); + params.setIssm(issue.get(Calendar.MONTH)); + params.setIssd(issue.get(Calendar.DAY_OF_MONTH)); + params.setIssh(issue.get(Calendar.HOUR_OF_DAY)); + params.setIssmi(issue.get(Calendar.MINUTE)); + // 延期时间 + if(StringUtils.isEmpty(access.getExtensionPersonnel())){ + params.setExtensionPersonnel("/"); + }else { + params.setExtensionPersonnel(access.getExtensionPersonnel()); + } + if(ObjectUtil.isEmpty(access.getExtensionTime())){ + params.setEy("/"); + params.setEm("/"); + params.setEd("/"); + params.setEh("/"); + params.setEmi("/"); + }else { + Calendar extens = Calendar.getInstance(); + params.setIssuePersonnel(access.getIssuePersonnel()); + extens.setTime(access.getExtensionTime()); + params.setEy(String.valueOf(extens.get(Calendar.YEAR))); + params.setEm(String.valueOf(extens.get(Calendar.MONTH))); + params.setEd(String.valueOf(extens.get(Calendar.DAY_OF_MONTH))); + params.setEh(String.valueOf(extens.get(Calendar.HOUR_OF_DAY))); + params.setEmi(String.valueOf(extens.get(Calendar.MINUTE))); + } + // 验收时间 + params.setCheckPersonnel(access.getCheckPersonnel()); + Calendar check = Calendar.getInstance(); + check.setTime(access.getCheckTime()); + params.setChy(check.get(Calendar.YEAR)); + params.setChm(check.get(Calendar.MONTH)); + params.setChd(check.get(Calendar.DAY_OF_MONTH)); + params.setChh(check.get(Calendar.HOUR_OF_DAY)); + params.setChmi(check.get(Calendar.MINUTE)); + return params; + } + + /** + * 撤销报修 + * @param ticketId + * @return + */ + @Override + public boolean revoke(Long ticketId) { + AccessTicketEntity entity = this.getOne(Wrappers.lambdaQuery() + .eq(AccessTicketEntity::getId,ticketId)); + if(ObjectUtil.isEmpty(entity)){ + throw new ServiceException("未查询到报修单信息!"); + } + if(entity.getStatus() == 1){ + throw new ServiceException("报修单已撤销,请勿重复撤销!"); + } + if(!"受理 (工作负责人)".equals(entity.getTaskName())){ + throw new ServiceException("报修单已受理,无法撤销!"); + } + return this.update(Wrappers.lambdaUpdate() + .set(AccessTicketEntity::getStatus,1) + .eq(AccessTicketEntity::getId,ticketId) + ); + } +} \ No newline at end of file diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java index ae5b8b6..b49edca 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/utils/PdfUtils.java @@ -104,7 +104,7 @@ public class PdfUtils { */ public static Map objectToMap(Object obj) { Map result = new HashMap<>(); - if (ObjectUtil.isNotEmpty(obj) && null != obj.getClass()) { + if (ObjectUtil.isNotEmpty(obj)) { Class clazz = obj.getClass(); List fieldList = new ArrayList<>(); while (clazz != null) { diff --git a/hzims-service/ticket/src/main/resources/template/accessTicket/access_ticket_template.docx b/hzims-service/ticket/src/main/resources/template/accessTicket/access_ticket_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..579e9a234c0c27a1180cc521b5e657de294d2179 GIT binary patch literal 25106 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 UckT~^bs0GBCI%F1Q|}b?e{i8WQUCw| literal 0 HcmV?d00001