From 5ac376ca75e4f9c0833f1d83dff2a8df01d8ccb2 Mon Sep 17 00:00:00 2001 From: yang_shj <1069818635@QQ.com> Date: Wed, 10 May 2023 18:28:25 +0800 Subject: [PATCH 1/3] =?UTF-8?q?#bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspect/offline/service/impl/InspectOfflineServiceImpl.java | 4 ++-- .../alert/service/impl/HistoryAbnormalAlarmServiceImpl.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java index d8097da..99ca727 100644 --- a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java +++ b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java @@ -598,7 +598,7 @@ public class InspectOfflineServiceImpl implements IOfflineDataService { // 查询巡检任务项目 List taskObjectProjects = taskObjectProjectService.getObjectProjectData(taskIds); // 返回数据 - return taskObjectProjects.stream().map(item -> this.convertFileOrVideo(item)).collect(Collectors.toList()); + return taskObjectProjects.stream().map(this::convertFileOrVideo).collect(Collectors.toList()); } /** @@ -616,7 +616,7 @@ public class InspectOfflineServiceImpl implements IOfflineDataService { in(TaskObjectProjectContentEntity::getTaskId, taskIds); }}); // 返回数据 - return contents.stream().map(item -> this.convertFileOrVideo(item)).collect(Collectors.toList()); + return contents.stream().map(this::convertFileOrVideo).collect(Collectors.toList()); } /** diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java index bbce8f5..9445c1f 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/alert/service/impl/HistoryAbnormalAlarmServiceImpl.java @@ -251,7 +251,7 @@ public class HistoryAbnormalAlarmServiceImpl extends BaseServiceImpl handles = handleService.handles(types.stream().map(Long::parseLong).collect(Collectors.toList()),AbnormalAlarmConstant.INTELLIGENCE_ALARM); + List handles = handleService.handles(types.stream().map(Long::parseLong).collect(Collectors.toList()),AbnormalAlarmConstant.SYSTEM_ALARM); // 返回数据 AlarmReustVo response = new AlarmReustVo(); From a606638bc4cf1a08d52270549414ef436b9ff69d Mon Sep 17 00:00:00 2001 From: yang_shj <1069818635@QQ.com> Date: Wed, 10 May 2023 18:32:10 +0800 Subject: [PATCH 2/3] =?UTF-8?q?#bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inspect/offline/service/impl/InspectOfflineServiceImpl.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java index 99ca727..f9ccdc9 100644 --- a/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java +++ b/hzims-service/inspect/src/main/java/com/hnac/hzinfo/inspect/offline/service/impl/InspectOfflineServiceImpl.java @@ -203,8 +203,6 @@ public class InspectOfflineServiceImpl implements IOfflineDataService { } // FIXME 下载至 response this.downloadZip(response,zipFile); - } catch (FileNotFoundException e) { - e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } @@ -631,7 +629,7 @@ public class InspectOfflineServiceImpl implements IOfflineDataService { // 查询巡检对象 List objects = objectService.getReDbjectData(tenantId); // 返回数据 - return objects.stream().map(item -> this.convertFileOrVideo(item)).collect(Collectors.toList()); + return objects.stream().map(this::convertFileOrVideo).collect(Collectors.toList()); } /** @@ -646,7 +644,7 @@ public class InspectOfflineServiceImpl implements IOfflineDataService { // 查询巡检项目 List projects = projectService.getProjectData(tenantId); // 返回数据 - return projects.stream().map(item -> this.convertFileOrVideo(item)).collect(Collectors.toList()); + return projects.stream().map(this::convertFileOrVideo).collect(Collectors.toList()); } /** From f8343ddf699cc1c04cf2def43e48e1f2fb311895 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E9=A3=9E=E5=AE=87?= <2684146481@qq.com> Date: Thu, 11 May 2023 17:23:41 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E6=96=B0=E5=B7=A5=E4=BD=9C=E6=B5=81bug?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hnac/hzims/message/fegin/IMessageClient.java | 54 +- .../hzims/ticket/constants/TicketConstants.java | 1 + .../workTicket/entity/WorkTicketInfoEntity.java | 33 +- .../spare/service/impl/WtSpBasicServiceImpl.java | 2 +- .../abstracts/TemplateAbstractService.java | 6 +- .../serviceimpl/MaintenanceTempleServiceImpl.java | 16 +- .../com/hnac/hzims/ticket/config/ThreadConfig.java | 35 ++ .../consumer/StandardWorkTicketConsumer.java | 1 + .../serviceimpl/MakeProcessServiceImpl.java | 60 --- .../serviceimpl/OneTicketProcessServiceImpl.java | 56 ++ .../serviceimpl/OperatorProcessServiceImpl.java | 54 -- .../serviceimpl/SignatureProcessServiceImpl.java | 53 -- .../propperties/ThreadPoolConfigProperties.java | 32 ++ .../controller/TicketProcessController.java | 3 - .../constant/TicketProcessConstant.java | 14 - .../flowprocess/service/TicketProcessService.java | 31 -- .../oneserviceImpl/OneMakeProcessServiceImpl.java | 154 ------ .../OnePrincipalProcessServiceImpl.java | 126 ----- .../OneReceptionProcessServiceImpl.java | 124 ----- .../OneSafetyProcessServiceImpl.java | 127 ----- .../oneserviceImpl/OneSignProcessServiceImpl.java | 125 ----- .../service/IWorkTicketFinishService.java | 6 + .../service/impl/TicketProcessServiceImpl.java | 596 ++++++++------------- .../service/impl/WorkTicketFinishServiceImpl.java | 21 +- .../service/IWorkTicketDelayService.java | 6 + .../service/IWorkTicketPrincipalChangeService.java | 7 + .../service/impl/WorkTicketDelayServiceImpl.java | 245 +++++---- .../impl/WorkTicketPrincipalChangeServiceImpl.java | 22 +- .../新电气第一种工作票模板.xlsx | Bin 14706 -> 14047 bytes 29 files changed, 621 insertions(+), 1389 deletions(-) create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/config/ThreadConfig.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/MakeProcessServiceImpl.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OneTicketProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OperatorProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/SignatureProcessServiceImpl.java create mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/propperties/ThreadPoolConfigProperties.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/constant/TicketProcessConstant.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/service/TicketProcessService.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneMakeProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OnePrincipalProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneReceptionProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSafetyProcessServiceImpl.java delete mode 100644 hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSignProcessServiceImpl.java diff --git a/hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/fegin/IMessageClient.java b/hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/fegin/IMessageClient.java index 40338c2..be87e27 100644 --- a/hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/fegin/IMessageClient.java +++ b/hzims-service-api/message-api/src/main/java/com/hnac/hzims/message/fegin/IMessageClient.java @@ -20,34 +20,38 @@ import javax.annotation.Resource; * @author hx */ @FeignClient( - value = MessageConstants.APP_NAME + value = MessageConstants.APP_NAME, + fallback = MessageClientFallback.class ) public interface IMessageClient { - String API_PREFIX = "/feign/message"; - String SEND_SMS_MESSAGE = API_PREFIX + "/send-sms-message"; - String SEND_MESSAGE = API_PREFIX + "/sendMessage"; - String GET_TEMPLATE_BY_ID = API_PREFIX + "/getMsgTemplateById"; - String PLAN_SEND_MESSAGE = API_PREFIX + "/planSendMessage"; - /** - * 推送消息(短信) - * @param pushDto - * @return - */ - @PostMapping(SEND_SMS_MESSAGE) - R sendSmsMessage(SmsPushDto pushDto); + String API_PREFIX = "/feign/message"; + String SEND_SMS_MESSAGE = API_PREFIX + "/send-sms-message"; + String SEND_MESSAGE = API_PREFIX + "/sendMessage"; + String GET_TEMPLATE_BY_ID = API_PREFIX + "/getMsgTemplateById"; + String PLAN_SEND_MESSAGE = API_PREFIX + "/planSendMessage"; - @PostMapping(SEND_MESSAGE) - R sendMessage(@RequestBody MessagePushRecordDto request); + /** + * 推送消息(短信) + * + * @param pushDto + * @return + */ + @PostMapping(SEND_SMS_MESSAGE) + R sendSmsMessage(SmsPushDto pushDto); - @GetMapping(GET_TEMPLATE_BY_ID) - R getMsgTemplateById(@RequestParam Long id); + @PostMapping(SEND_MESSAGE) + R sendMessage(@RequestBody MessagePushRecordDto request); - /** @Author hx - * @Description 计划推送类型消息推送 - * @Date 2023/4/14 15:04 - * @Param - * @return - **/ - @PostMapping(PLAN_SEND_MESSAGE) - R planSendMessage(@RequestBody PlanMsgRecordDto request); + @GetMapping(GET_TEMPLATE_BY_ID) + R getMsgTemplateById(@RequestParam Long id); + + /** + * @return + * @Author hx + * @Description 计划推送类型消息推送 + * @Date 2023/4/14 15:04 + * @Param + **/ + @PostMapping(PLAN_SEND_MESSAGE) + R planSendMessage(@RequestBody PlanMsgRecordDto request); } diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java index acd4218..928605a 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/constants/TicketConstants.java @@ -101,6 +101,7 @@ public interface TicketConstants { SECOND_WORK("7","大隆水电站电气第二种工作票模板"), MECHANICAL_WORK("8","大隆水电站水力机械工作票模板"), EMERGENCY_REPAIR("9","大隆水电站事故应急抢修单模板"), + NEW_FIRST_WORK("10","新电气第一种工作票模板"), ; @Getter private String type; diff --git a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java index b1ddd70..ab112ed 100644 --- a/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java +++ b/hzims-service-api/ticket-api/src/main/java/com/hnac/hzims/ticket/workTicket/entity/WorkTicketInfoEntity.java @@ -412,14 +412,41 @@ public class WorkTicketInfoEntity extends TenantEntity implements Serializable { /** - * 工作确认是否通过 (delay 工作票延期 transfe 工作票转移 true 通过 ) + * 工作确认是否通过 (input= 延期 input=转移 input 通过 ) */ - @ApiModelProperty("工作确认是否通过 (delay 工作票延期 transfe 工作票转移 true 通过 )") - private String flag; + @ApiModelProperty("input= 延期 input=转移 input 通过") + private String input; + /** + * 下一个审批人 + */ + @ApiModelProperty("下一个审批人") + private Long nextStepOperator; + + + /** + * 当前审批人 + */ + @ApiModelProperty("当前审批人") + private Long stepOperator; + /** + * 当前任务名 + */ + @ApiModelProperty("当前任务名") + private String flowTaskName; + + + + + /** + * 当前任务名 + */ + @ApiModelProperty("当前任务名") + private String flowTaskId; + } diff --git a/hzims-service/assets/src/main/java/com/hnac/hzims/spare/service/impl/WtSpBasicServiceImpl.java b/hzims-service/assets/src/main/java/com/hnac/hzims/spare/service/impl/WtSpBasicServiceImpl.java index 53cc782..c33c23e 100644 --- a/hzims-service/assets/src/main/java/com/hnac/hzims/spare/service/impl/WtSpBasicServiceImpl.java +++ b/hzims-service/assets/src/main/java/com/hnac/hzims/spare/service/impl/WtSpBasicServiceImpl.java @@ -1,6 +1,6 @@ package com.hnac.hzims.spare.service.impl; -import cn.afterturn.easypoi.excel.entity.ImportParams; + import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; diff --git a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/abstracts/TemplateAbstractService.java b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/abstracts/TemplateAbstractService.java index b058eba..32d4ea2 100644 --- a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/abstracts/TemplateAbstractService.java +++ b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/abstracts/TemplateAbstractService.java @@ -44,8 +44,9 @@ public abstract class TemplateAbstractService implements TemplateService { private void saveData(PlanMsgRecordDto list) { log.info("正在保存推送的数据"); R planMsgRecordDtoR = messageClient.planSendMessage(list); - if (planMsgRecordDtoR.isSuccess()) { - throw new ServiceException(planMsgRecordDtoR.getMsg()); + if (!planMsgRecordDtoR.isSuccess()) { + log.error("业务出错呢:{}", planMsgRecordDtoR.getMsg()); + throw new ServiceException("推送的数据,远程调用失败"); } } @@ -57,3 +58,4 @@ public abstract class TemplateAbstractService implements TemplateService { */ public abstract PlanMsgRecordDto executeTemplateMessage(PlanMsgRecordDto planMsgRecord); } + diff --git a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/serviceimpl/MaintenanceTempleServiceImpl.java b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/serviceimpl/MaintenanceTempleServiceImpl.java index 3f7108a..d5d3db5 100644 --- a/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/serviceimpl/MaintenanceTempleServiceImpl.java +++ b/hzims-service/safeproduct/src/main/java/com/hnac/hzims/safeproduct/template/serviceimpl/MaintenanceTempleServiceImpl.java @@ -11,13 +11,15 @@ import org.springblade.system.user.cache.UserCache; import org.springblade.system.user.entity.User; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; /** - * 日常维护计划 + * 安全维护计划 * * @Author WL * @Version v1.0 @@ -36,12 +38,16 @@ public class MaintenanceTempleServiceImpl extends TemplateAbstractService { @Override public PlanMsgRecordDto executeTemplateMessage(PlanMsgRecordDto planMsgRecord) { Map map = new HashMap<>(); - map.put("one", Optional.ofNullable(UserCache.getUser(planMsgRecord.getReceiver())).map(User::getName).orElse("")); - map.put("two", planMsgRecord.getPlanTime()); + String name = Optional.ofNullable(UserCache.getUser(planMsgRecord.getReceiver())).map(User::getName).orElse(""); + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String planTime = dateTimeFormatter.format(planMsgRecord.getPlanTime()); + map.put("one", name); + map.put("two", planTime); // planMsgRecord.setContent(JSON.toJSONString(map)); planMsgRecord.setSmsParam(JSON.toJSONString(map)); planMsgRecord.setResourceCode("aliyun-safeTool-push"); - planMsgRecord.setContent(JSON.toJSONString(map)); + planMsgRecord.setContent("【华自科技】工器具检查提醒:工器具(+" + + name + ")将于" + planTime + "到检查时间,请安排时间复核!"); return planMsgRecord; } @@ -56,4 +62,6 @@ public class MaintenanceTempleServiceImpl extends TemplateAbstractService { } + + } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/config/ThreadConfig.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/config/ThreadConfig.java new file mode 100644 index 0000000..8b7385f --- /dev/null +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/config/ThreadConfig.java @@ -0,0 +1,35 @@ +package com.hnac.hzims.ticket.config; + +import com.hnac.hzims.ticket.propperties.ThreadPoolConfigProperties; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @Author WL + * @Version v1.0 + * @Serial 1.0 + * @Date 2023/5/10 12:49 + */ +@Configuration +public class ThreadConfig { + + @Autowired + private ThreadPoolConfigProperties threadPoolConfigProperties; + + // @Bean + public ThreadPoolExecutor threadPoolExecutor() { + return new ThreadPoolExecutor(threadPoolConfigProperties.getCorePoolSize(), + threadPoolConfigProperties.getMaxSize(), + threadPoolConfigProperties.getKeepAliveTime(), + TimeUnit.SECONDS, + new LinkedBlockingDeque<>(threadPoolConfigProperties.getCapacity()), + Executors.defaultThreadFactory(), + new ThreadPoolExecutor.AbortPolicy()); + } +} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/consumer/StandardWorkTicketConsumer.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/consumer/StandardWorkTicketConsumer.java index 15fb42e..5936bed 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/consumer/StandardWorkTicketConsumer.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/consumer/StandardWorkTicketConsumer.java @@ -50,6 +50,7 @@ public class StandardWorkTicketConsumer implements IQueueConsume { try { ticketService.calculate(response); } catch (Exception e) { + e.printStackTrace(); //todo 业务出错误 做补偿 log.error("业务出错,StandardWorkTicketConsumer: {}", e.getMessage()); log.error("业务出错,StandardWorkTicketConsumer: {} ", response); diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/MakeProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/MakeProcessServiceImpl.java deleted file mode 100644 index cb5f248..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/MakeProcessServiceImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.hnac.hzims.ticket.processflow.strategy.serviceimpl; - -import com.hnac.hzims.ticket.processflow.constant.TicketProcessConstant; -import com.hnac.hzims.ticket.processflow.entity.ProcessType; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.processflow.strategy.abstracts.ProcessAbstractService; -import com.hnac.hzims.ticket.processflow.strategy.entity.WorkflowQueue; -import com.hnac.hzims.ticket.twoTicket.service.TicketProcessService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.api.R; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 开工作票流程实现类 - * - * @Author dfy - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/3/28 8:47 - */ -@Slf4j -@Service -@RequiredArgsConstructor -public class MakeProcessServiceImpl extends ProcessAbstractService { - - - - private final TicketProcessService ticketProcessService; - - - /** - * 设置执行那种实现类 - * - * @param flowQueue - * @return - */ - @Override - public Boolean isWorkflowProcess(WorkflowQueue flowQueue) { - log.info("是否执行开工作票流程环节操作~~~~,流程ticket: {}", flowQueue); - if (TicketProcessConstant.STARTEVENT.equals(flowQueue.getProcessDefinitionKey())) { - log.info("已执行开工作票流程环节操作~~~~"); - return true; - } - log.error("未是否执行开工作票流程环节操作,请联系管理员~~~~"); - return false; - } - - /** - * 两票管理业务方法 - * - * @param response - */ - @Override - public void calculate(ProcessWorkFlowResponse response) { - ticketProcessService.findPending(response); - } -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OneTicketProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OneTicketProcessServiceImpl.java new file mode 100644 index 0000000..82f64ce --- /dev/null +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OneTicketProcessServiceImpl.java @@ -0,0 +1,56 @@ +package com.hnac.hzims.ticket.processflow.strategy.serviceimpl; + +import com.hnac.hzims.ticket.processflow.constant.TicketProcessConstant; +import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; +import com.hnac.hzims.ticket.processflow.strategy.abstracts.ProcessAbstractService; +import com.hnac.hzims.ticket.processflow.strategy.entity.WorkflowQueue; +import com.hnac.hzims.ticket.twoTicket.service.TicketProcessService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 开工作票流程实现类 + * + * @Author dfy + * @Version v1.0 + * @Serial 1.0 + * @Date 2023/3/28 8:47 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class OneTicketProcessServiceImpl extends ProcessAbstractService { + + + + private final TicketProcessService ticketProcessService; + + + /** + * 设置执行那种实现类 + * + * @param flowQueue + * @return + */ + @Override + public Boolean isWorkflowProcess(WorkflowQueue flowQueue) { + log.info("是否执行开第一种工作票流程环节操作~~~~,流程ticket: {}", flowQueue); + if (TicketProcessConstant.STARTEVENT.equals(flowQueue.getProcessDefinitionKey())) { + log.info("已执行第一种开工作票流程环节操作~~~~"); + return true; + } + log.error("未是否执行第一种开工作票流程环节操作,请联系管理员~~~~"); + return false; + } + + /** + * 两票管理业务方法 + * + * @param response + */ + @Override + public void calculate(ProcessWorkFlowResponse response) { + ticketProcessService.findPending(response); + } +} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OperatorProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OperatorProcessServiceImpl.java deleted file mode 100644 index 84088a0..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/OperatorProcessServiceImpl.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.hnac.hzims.ticket.processflow.strategy.serviceimpl; - -import com.hnac.hzims.ticket.processflow.entity.ProcessType; -import com.hnac.hzims.ticket.processflow.strategy.abstracts.ProcessAbstractService; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.processflow.strategy.entity.WorkflowQueue; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 运行人实例类 (运行人接收) - * - * @Author dfy - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/3/28 8:47 - */ -@Slf4j -@Service -public class OperatorProcessServiceImpl extends ProcessAbstractService { - - - - /** - * 设置执行那种实现类 - * - * @param flowQueue - * @return - */ - @Override - public Boolean isWorkflowProcess(WorkflowQueue flowQueue) { - log.info("是否执行运行人接收操作~~~~,流程flowQueue: {}", flowQueue); - List ticketList = this.getProcessList(); - ProcessType properties = ticketList.get(2); - if (properties.getDeploymentId().equals(flowQueue.getProcessDefinitionKey())) { - log.info("已执行运行人接收操作~~~~"); - return true; - } - log.info("未执行运行人接收操作,请联系管理员~~~~"); - return false; - } - - /** - * 两票管理业务方法 - * - * @param response - */ - @Override - public void calculate(ProcessWorkFlowResponse response) { - System.out.println("OperatorTicketServiceImpl"); - } -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/SignatureProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/SignatureProcessServiceImpl.java deleted file mode 100644 index 4461926..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/processflow/strategy/serviceimpl/SignatureProcessServiceImpl.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.hnac.hzims.ticket.processflow.strategy.serviceimpl; - -import com.hnac.hzims.ticket.processflow.entity.ProcessType; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.processflow.strategy.abstracts.ProcessAbstractService; -import com.hnac.hzims.ticket.processflow.strategy.entity.WorkflowQueue; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 签发人实现类(签发人签发) - * - * @Author dfy - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/3/27 16:40 - */ -@Slf4j -@Service -public class SignatureProcessServiceImpl extends ProcessAbstractService { - - - /** - * 设置执行那种实现类 - * - * @param flowQueue - * @return - */ - @Override - public Boolean isWorkflowProcess(WorkflowQueue flowQueue) { - log.info("是否执行运行人接收操作~~~~,流程flowQueue: {}", flowQueue); - List ticketList = this.getProcessList(); - ProcessType properties = ticketList.get(1); - if (properties.getDeploymentId().equals(flowQueue.getProcessDefinitionKey())){ - log.info("已执行运行人接收操作~~~~"); - return true; - } - log.info("未执行运行人接收操作,请联系管理员~~~~"); - return false; - } - - /** - * 两票管理业务方法 - * - * @param response - */ - @Override - public void calculate(ProcessWorkFlowResponse response) { - System.out.println("SignatureTicketServiceImpl"); - } -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/propperties/ThreadPoolConfigProperties.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/propperties/ThreadPoolConfigProperties.java new file mode 100644 index 0000000..4a8da8d --- /dev/null +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/propperties/ThreadPoolConfigProperties.java @@ -0,0 +1,32 @@ +package com.hnac.hzims.ticket.propperties; + +import lombok.Data; +import org.springframework.context.annotation.Configuration; + +/** + * + * @Author WL + * @Version v1.0 + * @Serial 1.0 + * @Date 2023/5/10 12:51 + */ +@Configuration +@Data +public class ThreadPoolConfigProperties { + /** + * 核心数 + */ + private Integer corePoolSize = 20; + /** + * 最大数 + */ + private Integer maxSize = 200; + /** + * 存活时间 + */ + private Integer keepAliveTime = 20; + /** + * 容量 + */ + private Integer capacity = 10000; +} \ No newline at end of file diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java index 98c62b2..c929ed2 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/controller/TicketProcessController.java @@ -38,9 +38,6 @@ public class TicketProcessController { private final TicketProcessService ticketProcessService; - - - /** * 启动流程 * @return diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/constant/TicketProcessConstant.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/constant/TicketProcessConstant.java deleted file mode 100644 index a5955e3..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/constant/TicketProcessConstant.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.constant; - -/** - * 开票常量类 - * - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/4/8 10:53 - */ -public class TicketProcessConstant { - - public final static String WORKTICKET = "workTicket"; -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/service/TicketProcessService.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/service/TicketProcessService.java deleted file mode 100644 index bdc7e77..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/service/TicketProcessService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.service; - -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; - -/** - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:21 - */ -public interface TicketProcessService { - - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus); - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo); -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneMakeProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneMakeProcessServiceImpl.java deleted file mode 100644 index be9d804..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneMakeProcessServiceImpl.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.serviceimpl.oneserviceImpl; - -import com.hnac.hzims.operational.access.entity.OperAccessTaskEntity; -import com.hnac.hzims.operational.access.feign.IOperAccessTaskClient; -import com.hnac.hzims.operational.feign.IAccessTaskClient; -import com.hnac.hzims.operational.maintenance.dto.OperMaintenanceTaskDTO; -import com.hnac.hzims.operational.maintenance.feign.ITaskClient; -import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzims.ticket.constants.TicketConstants; -import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.flowprocess.service.TicketProcessService; -import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; -import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; -import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketContentService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketPrincipalChangeService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketSafetyMeasureService; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.core.tool.utils.Func; -import org.springblade.flow.core.feign.IFlowClient; -import org.springblade.system.user.feign.IUserClient; -import org.springframework.stereotype.Service; - -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.START; -import static com.hnac.hzims.ticket.twoTicket.flowprocess.constant.TicketProcessConstant.WORKTICKET; - -/** - * 开票 - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:36 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class OneMakeProcessServiceImpl implements TicketProcessService { - - - - private final IFlowClient flowClient; - - - private final IWorkTicketInfoService workTicketInfoService; - - - private final ProcessIdWorker processIdWorker; - - - private final IFirstWorkTicketService firstWorkTicketService; - - - private final IWorkTicketSafetyMeasureService workTicketSafetyMeasureService; - - - private final IWorkTicketContentService contentService; - - - private final IUserClient userClient; - - - private final IOperAccessTaskClient operAccessTaskClient; - - - private final ITaskClient taskClient; - - - private final IAccessTaskClient accessTaskClient; - - private String newFirstWorkTicketFlowKey = "workTicket"; - - - private final IStationClient stationClient; - - - private final WorkTicketOperateTimeServiceImpl workTicketOperateTimeServiceImpl; - - - private final IWorkTicketFinishService workTicketFinishService; - - private final WorkTicketDelayServiceImpl workTicketDelayService; - - - private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - @Override - public Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus) { - if (WORKTICKET.equals(processDefinitionKey) && START.equals(enumByStatus)){ - log.info("执行开票业务成功,正准备处理开票业务逻辑~~~~"); - return true; - } - log.error("执行开票业务出错~~~"); - return false; - } - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - @Override - public void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setProcessInstanceId(response.getProcessInstanceId()); - workTicket.setFlowStatus(FlowWorkTicketConstants.SIGN.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.SIGN.getDescription()); - //保存工作流实例ID - workTicketInfoService.updateById(workTicket); - //处理来源任务 - this.returnTicket(workTicketVo); - } - - - - /** - * 处理来源任务 - * - * @param workTicketVo - */ - private void returnTicket(WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - if (TicketConstants.TaskTypeEnum.JXRW.getType().equals(workTicket.getTaskType())) { - OperAccessTaskEntity taskEntity = new OperAccessTaskEntity(); - taskEntity.setId(workTicket.getTaskId()); - taskEntity.setTicketId(workTicket.getId()); - operAccessTaskClient.updateById(taskEntity); - } - if (TicketConstants.TaskTypeEnum.RCWH.getType().equals(workTicket.getTaskType())) { - OperMaintenanceTaskDTO dto = new OperMaintenanceTaskDTO(); - dto.setId(workTicket.getTaskId()); - dto.setTicketId(workTicket.getId()); - taskClient.doUpdateTaskById(dto); - } - //消缺流程进行 - if ((TicketConstants.TaskTypeEnum.JXRW.getType().equals(workTicket.getTaskType()) || TicketConstants.TaskTypeEnum.JXJH.getType().equals(workTicket.getTaskType())) && Func.isNotEmpty(workTicket.getTaskId())) { - accessTaskClient.billing(workTicket.getTaskId()); - } - } - -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OnePrincipalProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OnePrincipalProcessServiceImpl.java deleted file mode 100644 index 3e3aa01..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OnePrincipalProcessServiceImpl.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.serviceimpl.oneserviceImpl; - -import com.hnac.hzims.operational.access.feign.IOperAccessTaskClient; -import com.hnac.hzims.operational.feign.IAccessTaskClient; -import com.hnac.hzims.operational.maintenance.feign.ITaskClient; -import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.flowprocess.service.TicketProcessService; -import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; -import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; -import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketContentService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketPrincipalChangeService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketSafetyMeasureService; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.flow.core.feign.IFlowClient; -import org.springblade.system.user.feign.IUserClient; -import org.springframework.stereotype.Service; - -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.*; -import static com.hnac.hzims.ticket.twoTicket.flowprocess.constant.TicketProcessConstant.WORKTICKET; - -/** - * 工作负责人确认安全措施 - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:36 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class OnePrincipalProcessServiceImpl implements TicketProcessService { - - - - private final IFlowClient flowClient; - - - private final IWorkTicketInfoService workTicketInfoService; - - - private final ProcessIdWorker processIdWorker; - - - private final IFirstWorkTicketService firstWorkTicketService; - - - private final IWorkTicketSafetyMeasureService workTicketSafetyMeasureService; - - - private final IWorkTicketContentService contentService; - - - private final IUserClient userClient; - - - private final IOperAccessTaskClient operAccessTaskClient; - - - private final ITaskClient taskClient; - - - private final IAccessTaskClient accessTaskClient; - - private String newFirstWorkTicketFlowKey = "workTicket"; - - - private final IStationClient stationClient; - - - private final WorkTicketOperateTimeServiceImpl workTicketOperateTimeServiceImpl; - - - private final IWorkTicketFinishService workTicketFinishService; - - private final WorkTicketDelayServiceImpl workTicketDelayService; - - - private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - @Override - public Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus) { - if (WORKTICKET.equals(processDefinitionKey) && PRINCIPAL_CONFIRM_MEASURE.equals(enumByStatus)){ - log.info("执行运行人员布置安全措施业务成功,正准备处理签发人签发业务逻辑~~~~"); - return true; - } - log.error("执行运行人员布置安全措施业务出错~~~"); - return false; - } - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - @Override - public void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - //负责人确认时间 - //workTicket.setConfirmDateTime(workTicketVo.getWorkTicket().getConfirmDateTime()); - - workTicket.setFlowStatus(PRINCIPAL_CONFIRM_MEASURE.getStatus()); - workTicket.setFlowDescription(PRINCIPAL_CONFIRM_MEASURE.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); - } - - - - -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneReceptionProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneReceptionProcessServiceImpl.java deleted file mode 100644 index b4d3cbd..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneReceptionProcessServiceImpl.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.serviceimpl.oneserviceImpl; - -import com.hnac.hzims.operational.access.feign.IOperAccessTaskClient; -import com.hnac.hzims.operational.feign.IAccessTaskClient; -import com.hnac.hzims.operational.maintenance.feign.ITaskClient; -import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.flowprocess.service.TicketProcessService; -import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; -import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; -import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketContentService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketPrincipalChangeService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketSafetyMeasureService; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.flow.core.feign.IFlowClient; -import org.springblade.system.user.feign.IUserClient; -import org.springframework.stereotype.Service; - -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.RECEIVE; -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.START; -import static com.hnac.hzims.ticket.twoTicket.flowprocess.constant.TicketProcessConstant.WORKTICKET; - -/** - * 运功人接收 - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:36 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class OneReceptionProcessServiceImpl implements TicketProcessService { - - - - private final IFlowClient flowClient; - - - private final IWorkTicketInfoService workTicketInfoService; - - - private final ProcessIdWorker processIdWorker; - - - private final IFirstWorkTicketService firstWorkTicketService; - - - private final IWorkTicketSafetyMeasureService workTicketSafetyMeasureService; - - - private final IWorkTicketContentService contentService; - - - private final IUserClient userClient; - - - private final IOperAccessTaskClient operAccessTaskClient; - - - private final ITaskClient taskClient; - - - private final IAccessTaskClient accessTaskClient; - - private String newFirstWorkTicketFlowKey = "workTicket"; - - - private final IStationClient stationClient; - - - private final WorkTicketOperateTimeServiceImpl workTicketOperateTimeServiceImpl; - - - private final IWorkTicketFinishService workTicketFinishService; - - private final WorkTicketDelayServiceImpl workTicketDelayService; - - - private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - @Override - public Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus) { - if (WORKTICKET.equals(processDefinitionKey) && RECEIVE.equals(enumByStatus)){ - log.info("执行签发人签发业务成功,正准备处理签发人签发业务逻辑~~~~"); - return true; - } - log.error("执行签发人签发业务出错~~~"); - return false; - } - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - @Override - public void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.FIX_UP.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.FIX_UP.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); - } - - - - -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSafetyProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSafetyProcessServiceImpl.java deleted file mode 100644 index e051b33..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSafetyProcessServiceImpl.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.serviceimpl.oneserviceImpl; - -import com.hnac.hzims.operational.access.feign.IOperAccessTaskClient; -import com.hnac.hzims.operational.feign.IAccessTaskClient; -import com.hnac.hzims.operational.maintenance.feign.ITaskClient; -import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.flowprocess.service.TicketProcessService; -import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; -import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; -import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketContentService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketPrincipalChangeService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketSafetyMeasureService; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.flow.core.feign.IFlowClient; -import org.springblade.system.user.feign.IUserClient; -import org.springframework.stereotype.Service; - -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.FIX_UP; -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.START; -import static com.hnac.hzims.ticket.twoTicket.flowprocess.constant.TicketProcessConstant.WORKTICKET; - -/** - * 运行人员布置安全措施 - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:36 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class OneSafetyProcessServiceImpl implements TicketProcessService { - - - - private final IFlowClient flowClient; - - - private final IWorkTicketInfoService workTicketInfoService; - - - private final ProcessIdWorker processIdWorker; - - - private final IFirstWorkTicketService firstWorkTicketService; - - - private final IWorkTicketSafetyMeasureService workTicketSafetyMeasureService; - - - private final IWorkTicketContentService contentService; - - - private final IUserClient userClient; - - - private final IOperAccessTaskClient operAccessTaskClient; - - - private final ITaskClient taskClient; - - - private final IAccessTaskClient accessTaskClient; - - private String newFirstWorkTicketFlowKey = "workTicket"; - - - private final IStationClient stationClient; - - - private final WorkTicketOperateTimeServiceImpl workTicketOperateTimeServiceImpl; - - - private final IWorkTicketFinishService workTicketFinishService; - - private final WorkTicketDelayServiceImpl workTicketDelayService; - - - private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - @Override - public Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus) { - if (WORKTICKET.equals(processDefinitionKey) && FIX_UP.equals(enumByStatus)){ - log.info("执行运行人员布置安全措施业务成功,正准备处理签发人签发业务逻辑~~~~"); - return true; - } - log.error("执行运行人员布置安全措施业务出错~~~"); - return false; - } - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - @Override - public void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - //值班负责人 - workTicket.setWatchPrincipal(workTicketVo.getWorkTicket().getPrincipal()); - workTicket.setWatchPrincipalEndTime(workTicketVo.getWorkTicket().getWatchPrincipalEndTime()); - workTicket.setFlowStatus(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_MEASURE.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_MEASURE.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); - } - - - - -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSignProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSignProcessServiceImpl.java deleted file mode 100644 index 33f51f1..0000000 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/flowprocess/serviceimpl/oneserviceImpl/OneSignProcessServiceImpl.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.hnac.hzims.ticket.twoTicket.flowprocess.serviceimpl.oneserviceImpl; - -import com.hnac.hzims.operational.access.feign.IOperAccessTaskClient; -import com.hnac.hzims.operational.feign.IAccessTaskClient; -import com.hnac.hzims.operational.maintenance.feign.ITaskClient; -import com.hnac.hzims.operational.station.feign.IStationClient; -import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; -import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; -import com.hnac.hzims.ticket.twoTicket.flowprocess.service.TicketProcessService; -import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; -import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; -import com.hnac.hzims.ticket.twoTicket.vo.process.WorkTicketVo; -import com.hnac.hzims.ticket.workTicket.entity.WorkTicketInfoEntity; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketContentService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketInfoService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketPrincipalChangeService; -import com.hnac.hzims.ticket.workTicket.service.IWorkTicketSafetyMeasureService; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; -import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springblade.flow.core.feign.IFlowClient; -import org.springblade.system.user.feign.IUserClient; -import org.springframework.stereotype.Service; - -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.SIGN; -import static com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants.START; -import static com.hnac.hzims.ticket.twoTicket.flowprocess.constant.TicketProcessConstant.WORKTICKET; - -/** - * 签发人签发 - * @Author WL - * @Version v1.0 - * @Serial 1.0 - * @Date 2023/5/5 8:36 - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class OneSignProcessServiceImpl implements TicketProcessService { - - - - private final IFlowClient flowClient; - - - private final IWorkTicketInfoService workTicketInfoService; - - - private final ProcessIdWorker processIdWorker; - - - private final IFirstWorkTicketService firstWorkTicketService; - - - private final IWorkTicketSafetyMeasureService workTicketSafetyMeasureService; - - - private final IWorkTicketContentService contentService; - - - private final IUserClient userClient; - - - private final IOperAccessTaskClient operAccessTaskClient; - - - private final ITaskClient taskClient; - - - private final IAccessTaskClient accessTaskClient; - - private String newFirstWorkTicketFlowKey = "workTicket"; - - - private final IStationClient stationClient; - - - private final WorkTicketOperateTimeServiceImpl workTicketOperateTimeServiceImpl; - - - private final IWorkTicketFinishService workTicketFinishService; - - private final WorkTicketDelayServiceImpl workTicketDelayService; - - - private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - /** - * 判断状态 - * @param processDefinitionKey - * @param enumByStatus - * @return - */ - @Override - public Boolean isStatus(String processDefinitionKey, FlowWorkTicketConstants enumByStatus) { - if (WORKTICKET.equals(processDefinitionKey) && SIGN.equals(enumByStatus)){ - log.info("执行签发人签发业务成功,正准备处理签发人签发业务逻辑~~~~"); - return true; - } - log.error("执行签发人签发业务出错~~~"); - return false; - } - - - /** - * 执行业务 - * @param response - * @param workTicketVo - */ - @Override - public void execute(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicketInfoEntity = workTicketVo.getWorkTicket(); - //更新状态值 - workTicketInfoEntity.setFlowStatus(FlowWorkTicketConstants.RECEIVE.getStatus()); - workTicketInfoEntity.setFlowDescription(FlowWorkTicketConstants.RECEIVE.getDescription()); - workTicketInfoEntity.setSignerDateTime(workTicketVo.getWorkTicket().getSignerDateTime()); - workTicketInfoService.updateById(workTicketInfoEntity); - } - - - - -} diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/IWorkTicketFinishService.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/IWorkTicketFinishService.java index 130ca02..a50fe6c 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/IWorkTicketFinishService.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/IWorkTicketFinishService.java @@ -19,4 +19,10 @@ public interface IWorkTicketFinishService extends IService { * @return */ WorkTicketFinish selectByTicketId(Long ticketId); + + /** + * 更新 + * @param workTicketFinish + */ + void updateByTicketId(WorkTicketFinish workTicketFinish); } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java index 6f7c9dc..0770a20 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java @@ -1,10 +1,12 @@ package com.hnac.hzims.ticket.twoTicket.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.hnac.hzims.common.logs.utils.StringUtils; import com.hnac.hzims.operational.access.entity.OperAccessTaskEntity; @@ -19,7 +21,6 @@ import com.hnac.hzims.ticket.constants.WorkTicketConstants; import com.hnac.hzims.ticket.processflow.strategy.core.ProcessIdWorker; import com.hnac.hzims.ticket.response.ProcessWorkFlowResponse; import com.hnac.hzims.ticket.twoTicket.entity.WorkTicketFinish; -import com.hnac.hzims.ticket.twoTicket.enums.FlowWorkTicketConstants; import com.hnac.hzims.ticket.twoTicket.service.IFirstWorkTicketService; import com.hnac.hzims.ticket.twoTicket.service.IWorkTicketFinishService; import com.hnac.hzims.ticket.twoTicket.service.TicketProcessService; @@ -31,14 +32,14 @@ import com.hnac.hzims.ticket.workTicket.entity.*; import com.hnac.hzims.ticket.workTicket.service.*; import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketDelayServiceImpl; import com.hnac.hzims.ticket.workTicket.service.impl.WorkTicketOperateTimeServiceImpl; -import com.hnac.hzims.ticket.workTicket.vo.WorkTicketSafetyMeasureVO; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.math.NumberUtils; import org.apache.poi.ss.usermodel.Workbook; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; -import org.springblade.core.tool.utils.BeanUtil; import org.springblade.core.tool.utils.CollectionUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.ObjectUtil; @@ -54,9 +55,10 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletResponse; -import java.time.Instant; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; import java.time.LocalDateTime; -import java.time.ZoneId; import java.util.*; import java.util.stream.Collectors; @@ -69,9 +71,9 @@ import java.util.stream.Collectors; * @Serial 1.0 * @Date 2023/4/8 11:11 */ -@Service @Slf4j @RequiredArgsConstructor +@Service public class TicketProcessServiceImpl implements TicketProcessService { @@ -120,10 +122,6 @@ public class TicketProcessServiceImpl implements TicketProcessService { private final IWorkTicketPrincipalChangeService workTicketPrincipalChangeService; - - private final List processService; - - private final IWorkTicketOperateTimeService workTicketOperateTimeService; @@ -141,13 +139,14 @@ public class TicketProcessServiceImpl implements TicketProcessService { * * @param workTicketVo */ + @SneakyThrows @Override @Transactional public void startUp(WorkTicketVo workTicketVo) { + log.info("执行 com.hnac.hzims.ticket.twoTicket.service.impl【startUp】 。。。方法"); if (workTicketVo.getWorkTicket().getSignage() == null) { throw new ServiceException("站点标识-两票编码不能为空"); } - //1. 获取站点站点标识-两票编码 StationEntity stationEntity = new StationEntity(); stationEntity.setCode(workTicketVo.getWorkTicket().getSignageCode()); R stationClientOne = stationClient.getOne(stationEntity); @@ -158,7 +157,6 @@ public class TicketProcessServiceImpl implements TicketProcessService { if (station == null) { throw new ServiceException("根据条件获取唯一站点暂无数据"); } - log.info("前端查的站点编号 :{}", workTicketVo.getWorkTicket().getSignage()); log.info("后端查寻的站点编码 :{}", station.getSignage()); if (!workTicketVo.getWorkTicket().getSignage().equals(station.getSignage())) { @@ -170,24 +168,24 @@ public class TicketProcessServiceImpl implements TicketProcessService { if (StringUtils.isBlank(signage) || signage.length() < 2) { throw new ServiceException("站点标识-两票编码不能为空"); } - signage = signage.length() == 2 ? station.getSignage() : station.getSignage().substring(0, 2); workTicketVo.getWorkTicket().setSignage(signage); workTicketVo.getWorkTicket().setSignageCode(station.getCode()); //2. 获取编码 - String code = processIdWorker.getTicketByCode(workTicketVo.getWorkTicket().getSignage(), - workTicketVo.getWorkTicket().getType(), LocalDateTime.now()); + String code = processIdWorker.getTicketByCode(workTicketVo.getWorkTicket().getSignage(), workTicketVo.getWorkTicket().getType(), LocalDateTime.now()); workTicketVo.getWorkTicket().setCode(code); - //2 .保存工作对象 + //3 .保存工作对象 this.saveWorkTicketInfo(workTicketVo.getWorkTicket()); - //3. 保存安全措施 - log.info("获取报存安全措施:{}", workTicketVo.getSafetyMeasuresList()); + //4. 保存安全措施 this.saveSafetyMeasures(workTicketVo.getSafetyMeasuresList(), workTicketVo.getWorkTicket()); - //4. 保存工作任务 + //5. 保存工作任务 this.saveWorkTicketContentDto(workTicketVo.getWorkTicketContentDtoList(), workTicketVo.getWorkTicket()); - //5. 开启动作流 + //6. 开启动作流 this.dealProcess(newFirstWorkTicketFlowKey, workTicketVo); + //7. 处理任务 + this.returnTicket(workTicketVo); + } /** @@ -196,15 +194,13 @@ public class TicketProcessServiceImpl implements TicketProcessService { * @param response */ @Override + @Transactional(rollbackFor = Exception.class) public void findPending(ProcessWorkFlowResponse response) { log.info("获取待处理的数据 {}", response); log.info("获取businessKey: {}", response.getBusinessKey()); log.info("获取taskId: {}", response.getTaskId()); log.info("获取下一个审批人是: {}", response.getNextStepOperator()); - if (StringUtils.isNull(response.getTaskId())) { - log.info("工作流结束~~~"); - return; - } + log.info("获取当前任务名称是: {}", response.getTaskName()); //json转换表单 String formData = JSON.toJSONString(response.getVariables()); log.info("获取表单的数据:{}", formData); @@ -212,12 +208,8 @@ public class TicketProcessServiceImpl implements TicketProcessService { try { fristWorkFlowResponse = JSONObject.parseObject(formData, FristWorkTicketVo.class); } catch (Exception e) { - e.printStackTrace(); - } - - if (ObjectUtils.isEmpty(fristWorkFlowResponse)) { - log.error("获取表单的数据解析的数据为null"); - return; + log.error("获取表单出现异常了~~~~"); + throw new IllegalArgumentException(e.getMessage()); } //获取表单数据 WorkTicketVo workTicketVo = fristWorkFlowResponse.getWorkTicketVo(); @@ -225,20 +217,16 @@ public class TicketProcessServiceImpl implements TicketProcessService { //2.流程处理 String businessKey = response.getBusinessKey(); WorkTicketInfoEntity workTicketInfo = firstWorkTicketService.getById(businessKey); - if (ObjectUtils.isEmpty(workTicketInfo) || ObjectUtils.isEmpty(workTicket.getId())) { + if (ObjectUtils.isEmpty(workTicketInfo)) { log.error("获取工作票的数据为不存在"); return; } //更新工作票 - if (workTicket.getId() == null) { - workTicket.setId(workTicketInfo.getId()); - } - + workTicket.setId(workTicketInfo.getId()); + //保存流程描述 + saveWorkTicket(workTicket, response); //工作流ID - if (StringUtils.isEmpty(workTicketInfo.getProcessInstanceId())) { - workTicket.setProcessInstanceId(response.getProcessInstanceId()); - } - + workTicket.setProcessInstanceId(response.getProcessInstanceId()); workTicketInfoService.updateById(workTicket); //更新安全措施 List safetyMeasuresList = workTicketVo.getSafetyMeasuresList(); @@ -255,367 +243,194 @@ public class TicketProcessServiceImpl implements TicketProcessService { }); } //工作票工作任务组 - List workTicketContentDtoList = workTicketVo.getWorkTicketContentDtoList(); - if (CollectionUtils.isNotEmpty(workTicketContentDtoList)) { - log.info("获取工作票工作任务组:{}", workTicketContentDtoList); - workTicketContentDtoList.forEach(item -> { - if (ObjectUtils.isEmpty(item.getId())) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WorkTicketContentEntity::getTicketId, workTicketInfo.getId()); - contentService.update(item, queryWrapper); - } else { - contentService.updateById(item); - } - }); - } + // List workTicketContentDtoList = workTicketVo.getWorkTicketContentDtoList(); + // if (CollectionUtils.isNotEmpty(workTicketContentDtoList)) { + // log.info("获取工作票工作任务组:{}", workTicketContentDtoList); + // workTicketContentDtoList.forEach(item -> { + // if (ObjectUtils.isEmpty(item.getId())) { + // LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // queryWrapper.eq(WorkTicketContentEntity::getTicketId, workTicketInfo.getId()); + // contentService.update(item, queryWrapper); + // } else { + // contentService.updateById(item); + // } + // }); + // } // 工作票延期 WorkTicketDelayEntity workTicketDelay = workTicketVo.getWorkTicketDelay(); - if (ObjectUtils.isNotEmpty(workTicketDelay) && ObjectUtils.isNotEmpty(workTicketDelay.getCreateUser())) { - log.info("获取工作票延期:{}", workTicketDelay); - try { - workTicketDelay.setCreateDept(workTicket.getCreateDept()); + try { + if (ObjectUtils.isNotEmpty(workTicketDelay) && "延期".equals(workTicket.getInput())) { + + WorkTicketDelayEntity workTicketDelayEntity = workTicketDelayService.selectByTicketId(workTicketInfo.getId()); + log.info("获取工作票延期:{}", workTicketDelay); + workTicketDelay.setCreateDept(workTicketInfo.getCreateDept()); workTicketDelay.setTicketId(workTicketInfo.getId()); workTicketDelay.setTenantId(workTicketInfo.getTenantId()); - if (ObjectUtils.isEmpty(workTicketDelay.getId())) { + if (ObjectUtils.isEmpty(workTicketDelay.getId()) || ObjectUtils.isEmpty(workTicketDelayEntity)) { workTicketDelayService.save(workTicketDelay); } else { - workTicketDelayService.updateById(workTicketDelay); + workTicketDelayService.updateByTicketId(workTicketDelay); } - } catch (Exception e) { - e.printStackTrace(); } + } catch (Exception e) { + e.printStackTrace(); } - - //工作结束 WorkTicketFinish workTicketFinish = workTicketVo.getWorkTicketFinish(); - if (ObjectUtils.isNotEmpty(workTicketFinish) && ObjectUtils.isNotEmpty(workTicketFinish.getPrincipal())) { - log.info("获取工作结束:{}", workTicketFinish); - if (ObjectUtils.isEmpty(workTicketFinish.getId())) { - workTicketDelay.setTicketId(workTicketInfo.getId()); - //workTicketDelay.setInitialTime(LocalDateTime.now()); - workTicketFinishService.save(workTicketFinish); - } else { - workTicketDelay.setInitialTime(LocalDateTime.now()); - workTicketFinishService.updateById(workTicketFinish); + try { + if (ObjectUtils.isNotEmpty(workTicketFinish) && 99 == workTicket.getFlowStatus().intValue()) { + WorkTicketFinish ticketFinish = workTicketFinishService.selectByTicketId(workTicketInfo.getId()); + log.info("获取工作结束:{}", workTicketFinish); + if (ObjectUtils.isEmpty(workTicketFinish.getId()) || ObjectUtils.isEmpty(ticketFinish)) { + workTicketFinish.setTicketId(workTicketInfo.getId()); + workTicketFinishService.save(workTicketFinish); + } else { + workTicketDelay.setInitialTime(LocalDateTime.now()); + workTicketFinishService.updateByTicketId(workTicketFinish); + } } + } catch (Exception e) { + e.printStackTrace(); } //工作开始时间和结束时间 - List workTicketOperateTimeEntities = workTicketVo.getWorkTicketOperateTimeEntities(); - if (CollectionUtils.isNotEmpty(workTicketOperateTimeEntities)) { - log.info("工作开始时间和结束时间:{}", workTicketFinish); - workTicketOperateTimeService.saveBatch(workTicketOperateTimeEntities); - } - - - //工作票负责人变更 - WorkTicketPrincipalChangeEntity workTicketPrincipalChange = workTicketVo.getWorkTicketPrincipalChange(); - if (ObjectUtils.isNotEmpty(workTicketPrincipalChange) && workTicketPrincipalChange.getInitialPrincipal() != null) { - log.info("工作票负责人变更: {}", workTicketPrincipalChange); - //原来的负责人 - User user = UserCache.getUser(workTicketPrincipalChange.getInitialPrincipal()); - //新的负责人 - User newUser = UserCache.getUser(workTicketPrincipalChange.getChangePrincipal()); - workTicketPrincipalChange.setCreateDept(workTicket.getCreateDept()); - workTicketPrincipalChange.setTicketId(workTicketInfo.getId()); - workTicketPrincipalChange.setTenantId(workTicketInfo.getTenantId()); - if (workTicketPrincipalChange.getId() == null) { - workTicketPrincipalChangeService.save(workTicketPrincipalChange); - } else { - workTicketPrincipalChangeService.updateById(workTicketPrincipalChange); - } - log.info("工作负责人变更 原来的负责人 {},变更为 {}", user.getName(), newUser.getName()); - workTicket.setPrincipal(workTicketPrincipalChange.getChangePrincipal()); - workTicket.setPrincipalName(newUser.getName()); - //更新工作票 - workTicketInfoService.updateById(workTicket); - } - - - // WorkTicketInfoEntity workTicketInfo = firstWorkTicketService.getById(workTicket.getId()); - // Integer flowStatus = workTicketInfo.getFlowStatus(); - // FlowWorkTicketConstants enumByStatus = FlowWorkTicketConstants.getEnumByStatus(flowStatus); - - // ProcessService dbProcessService = processService.stream().filter(item -> item.isStatus(response.getProcessDefinitionKey(), - // enumByStatus)).findFirst().orElse(null); - // dbProcessService.execute(response,workTicketVo); - // - // switch (enumByStatus) { - // case START: - // //开票 - // make(response, workTicketVo); - // break; - // case SIGN: - // //签发人签发 - // //工作票签发人默认执行 - // sign(response, workTicketVo); - // break; - // case RECEIVE: - // //运功人接收 - // reception(response, workTicketVo); - // break; - // case FIX_UP: - // // 运行人员布置安全措施 - // safety(response, workTicketVo); - // break; - // case PRINCIPAL_CONFIRM_MEASURE: - // //工作负责人确认安全措施 - // principal(response, workTicketVo); - // break; - // case LICENCE: - // //许可人许可 - // license(response, workTicketVo); - // break; - // case PRINCIPAL_CONFIRM_CONTENT: - // //工作负责人确认工作内容执行 - // principalConfirmContent(response, workTicketVo); - // break; - // case PRINCIPAL_CONFIRM_END: - // //工作负责人确认工作票结束 - // principalConfirmEnd(response, workTicketVo); - // break; - // case LICENSE_CONFIRM_END: - // //许可人确认工作票结束 - // licenseConfirmEnd(response, workTicketVo); - // break; - // case PROCESS_POSTPONE: - // //工作票延期 - // processPostpone(response, workTicketVo); - // break; - // case PROCESS_COURSE: - // //工作票转移 - // processCourse(response, workTicketVo); - // break; - // case SIGN_CONFIRM_DELAY: - // //签发人审核 - // signConfirmDelay(response, workTicketVo); - // break; + // List workTicketOperateTimeEntities = workTicketVo.getWorkTicketOperateTimeEntities(); + // if (CollectionUtils.isNotEmpty(workTicketOperateTimeEntities)) { + // log.info("工作开始时间和结束时间:{}", workTicketFinish); + // workTicketOperateTimeService.saveBatch(workTicketOperateTimeEntities); // } - } - - - /** - * 签发人审核 - * - * @param response - * @param workTicketVo - */ - private void signConfirmDelay(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.LICENCE.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.LICENCE.getDescription()); - workTicketInfoService.updateById(workTicket); - - - } - - - /** - * 工作票转移 - * - * @param response - * @param workTicketVo - */ - private void processCourse(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { //工作票负责人变更 WorkTicketPrincipalChangeEntity workTicketPrincipalChange = workTicketVo.getWorkTicketPrincipalChange(); - workTicketPrincipalChangeService.save(workTicketPrincipalChange); - //更新工作票信息 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.SIGN_CONFIRM_DELAY.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.SIGN_CONFIRM_DELAY.getDescription()); - workTicketInfoService.updateById(workTicket); - - - } - - - /** - * 工作票延期 - * - * @param response - * @param workTicketVo - */ - private void processPostpone(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - //保存工作票延期 - WorkTicketDelayEntity workTicketDelay = workTicketVo.getWorkTicketDelay(); - workTicketDelayService.save(workTicketDelay); - //更新工作票信息 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.LICENCE.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.LICENCE.getDescription()); - workTicketInfoService.updateById(workTicket); - - } - - - /** - * 许可人确认工作票结束 - * - * @param response - * @param workTicketVo - */ - private void licenseConfirmEnd(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - //工作结束 - WorkTicketFinish workTicketFinish = workTicketVo.getWorkTicketFinish(); - workTicketFinishService.updateById(workTicketFinish); - //更新工作票信息 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.END.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.END.getDescription()); - workTicketInfoService.updateById(workTicket); - } - - - /** - * 工作负责人确认工作票结束 - * - * @param response - * @param workTicketVo - */ - private void principalConfirmEnd(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - //工作结束 - WorkTicketFinish workTicketFinish = workTicketVo.getWorkTicketFinish(); - workTicketFinishService.save(workTicketFinish); - //更新工作票信息 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.LICENSE_CONFIRM_END.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.LICENSE_CONFIRM_END.getDescription()); - workTicketInfoService.updateById(workTicket); - } - - - /** - * 工作负责人确认工作内容执行 - * - * @param response - * @param workTicketVo - */ - private void principalConfirmContent(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - List workTicketOperateTimeEntities = workTicketVo.getWorkTicketOperateTimeEntities(); - if (CollectionUtils.isEmpty(workTicketOperateTimeEntities)) { - log.info("暂时没有每日开工每日收的数据"); - return; - } - workTicketOperateTimeServiceImpl.saveBatch(workTicketOperateTimeEntities); - //更新工作票信息 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_END.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_END.getDescription()); - workTicketInfoService.updateById(workTicket); - } + try { + if (ObjectUtils.isNotEmpty(workTicketPrincipalChange) && "转移".equals(workTicket.getInput())) { + log.info("工作票负责人变更: {}", workTicketPrincipalChange); + //原来的负责人 + User user = UserCache.getUser(workTicketPrincipalChange.getInitialPrincipal()); + //新的负责人 + User newUser = UserCache.getUser(workTicketPrincipalChange.getChangePrincipal()); + workTicketPrincipalChange.setCreateDept(workTicketInfo.getCreateDept()); + workTicketPrincipalChange.setTicketId(workTicketInfo.getId()); + workTicketPrincipalChange.setTenantId(workTicketInfo.getTenantId()); + if (workTicketPrincipalChange.getFlowCode() == null) { + workTicketPrincipalChange.setFlowCode(IdWorker.getIdStr()); + } - /** - * 许可人许可 - * - * @param response - * @param workTicketVo - */ - private void license(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - List safetyMeasuresList = workTicketVo.getSafetyMeasuresList(); - if (CollectionUtils.isEmpty(safetyMeasuresList)) { - log.error("没有安全措施数据"); - return; - } + WorkTicketPrincipalChangeEntity workTicketPrincipalChangeEntity = workTicketPrincipalChangeService.selectByTicketId(workTicket.getId()); - //更新安全措施的状态 - List workTicketSafetyMeasureEntities = new ArrayList<>(); - for (WorkTicketSafetyMeasureEntity workTicketSafetyMeasureDto : safetyMeasuresList) { - WorkTicketSafetyMeasureEntity workTicketSafetyMeasureEntity = BeanUtil.copyProperties(workTicketSafetyMeasureDto, WorkTicketSafetyMeasureEntity.class); - workTicketSafetyMeasureEntities.add(workTicketSafetyMeasureEntity); + if (workTicketPrincipalChange.getId() == null || ObjectUtils.isEmpty(workTicketPrincipalChangeEntity)) { + workTicketPrincipalChangeService.save(workTicketPrincipalChange); + } else { + workTicketPrincipalChangeService.updateByTicketId(workTicketPrincipalChange); + } + log.info("工作负责人变更 原来的负责人 {},变更为 {}", user.getName(), newUser.getName()); + workTicket.setPrincipal(workTicketPrincipalChange.getChangePrincipal()); + workTicket.setPrincipalName(newUser.getName()); + //更新工作票 + workTicketInfoService.updateById(workTicket); + } + } catch (Exception e) { + e.printStackTrace(); } - workTicketSafetyMeasureService.saveBatch(workTicketSafetyMeasureEntities); - - //更新工作票 - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_CONTENT.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_CONTENT.getDescription()); - workTicketInfoService.updateById(workTicket); - } - - /** - * 工作负责人确认安全措施 - * - * @param response - * @param workTicketVo - */ - private void principal(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - //负责人确认时间 - //workTicket.setConfirmDateTime(workTicketVo.getWorkTicket().getConfirmDateTime()); - workTicket.setFlowStatus(FlowWorkTicketConstants.LICENCE.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.LICENCE.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); } /** - * 运行人员布置安全措施 + * 保存流程描述 * + * @param workTicket * @param response - * @param workTicketVo */ - private void safety(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - //值班负责人 - workTicket.setWatchPrincipal(workTicketVo.getWorkTicket().getPrincipal()); - workTicket.setWatchPrincipalEndTime(workTicketVo.getWorkTicket().getWatchPrincipalEndTime()); - workTicket.setFlowStatus(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_MEASURE.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.PRINCIPAL_CONFIRM_MEASURE.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); + private void saveWorkTicket(WorkTicketInfoEntity workTicket, ProcessWorkFlowResponse response) { + String taskId = response.getTaskId(); + String nextStepOperator = response.getNextStepOperator(); + //1.获取状态 + Integer flowStatus = workTicket.getFlowStatus(); + //2.根据流程获取描述信息 + String description = getWorkTicketDescription(flowStatus); + String flowDescription = ""; + //当前审批人 + User user = UserCache.getUser(workTicket.getStepOperator()); + + if (StringUtils.isNotEmpty(nextStepOperator)) { + Long taskUser = NumberUtils.createLong(nextStepOperator.startsWith("taskUser_") ? + nextStepOperator.substring(9) : null); + //下一个审批人 + User stepUser = UserCache.getUser(taskUser); + flowDescription = "审批中,当前环节是".concat(description) + .concat(",当前审批人是").concat(user.getName()) + .concat(",下一个审批人是").concat(stepUser.getName()).concat("待审批"); + workTicket.setNextStepOperator(taskUser); + } else { + flowDescription = "审批中,当前环节是".concat(description) + .concat(",审批人是").concat(user.getName()); + } + //如果taskId为空 或 flowStatus = 99 + if (StringUtils.isEmpty(taskId) || 99 == flowStatus) { + flowDescription = "结束"; + workTicket.setFlowDescription(flowDescription); + workTicket.setFlowTaskId(""); + workTicket.setFlowTaskName("结束"); + workTicket.setNextStepOperator(-1L); + workTicket.setStepOperator(-1L); + } else { + workTicket.setFlowDescription(flowDescription); + workTicket.setFlowTaskId(taskId); + workTicket.setFlowTaskName(response.getTaskName()); + } + //如果下一个审批人【nextStepOperator】是null设为-1 + if (StringUtils.isEmpty(nextStepOperator)) { + workTicket.setNextStepOperator(-1L); + } } /** - * 运功人接收 + * 获取描述信息 * - * @param response - * @param workTicketVo - */ - private void reception(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setFlowStatus(FlowWorkTicketConstants.FIX_UP.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.FIX_UP.getDescription()); - //更新状态值 - workTicketInfoService.updateById(workTicket); - } - - - /** - * 第一种工作票签发 - */ - //@Transactional(rollbackFor = Exception.class) - public void sign(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicketInfoEntity = workTicketVo.getWorkTicket(); - //更新状态值 - workTicketInfoEntity.setStatus(FlowWorkTicketConstants.RECEIVE.getStatus()); - workTicketInfoEntity.setFlowStatus(FlowWorkTicketConstants.RECEIVE.getStatus()); - workTicketInfoEntity.setFlowDescription(FlowWorkTicketConstants.RECEIVE.getDescription()); - workTicketInfoEntity.setSignerDateTime(workTicketVo.getWorkTicket().getSignerDateTime()); - workTicketInfoService.updateById(workTicketInfoEntity); - } - - - /** - * 开票 + * @param flowStatus 状态 + * @return */ - private void make(ProcessWorkFlowResponse response, WorkTicketVo workTicketVo) { - WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); - workTicket.setProcessInstanceId(response.getProcessInstanceId()); - workTicket.setStatus(FlowWorkTicketConstants.SIGN.getStatus()); - workTicket.setFlowStatus(FlowWorkTicketConstants.SIGN.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.SIGN.getDescription()); - //保存工作流实例ID - workTicketInfoService.updateById(workTicket); - //处理来源任务 - this.returnTicket(workTicketVo); + private String getWorkTicketDescription(Integer flowStatus) { + String value = null; + switch (flowStatus) { + case 1: + value = "签发人签发"; + break; + case 2: + value = "运行人接收"; + break; + case 3: + value = "布置安全措施"; + break; + case 4: + value = "确认安全措施"; + break; + case 5: + value = "许可人许可"; + break; + case 6: + value = "确认工作内容执行"; + break; + case 7: + value = "工作负责人确认结束"; + break; + case 8: + value = "许可人确认结束"; + break; + case 9: + value = "签发人审核"; + break; + case 99: + value = "结束"; + break; + default: + log.error("getWorkTicketDescription【flowStatus】 输入的有误,请重洗输入。。。。"); + break; + } + return value; } - /** * 处理来源任务 * @@ -738,8 +553,8 @@ public class TicketProcessServiceImpl implements TicketProcessService { //班组负责人 String principalName = getByPrincipal(workTicket); workTicket.setPrincipalName(principalName); - workTicket.setFlowStatus(FlowWorkTicketConstants.START.getStatus()); - workTicket.setFlowDescription(FlowWorkTicketConstants.START.getDescription()); + workTicket.setFlowStatus(1); + workTicket.setStepOperator(AuthUtil.getUserId()); //唯一 workTicket.setCreateUser(AuthUtil.getUserId()); boolean isSave = firstWorkTicketService.save(workTicket); @@ -805,10 +620,12 @@ public class TicketProcessServiceImpl implements TicketProcessService { String fileName = TicketConstants.WordFileNameEnum.getFileNameByType(ticketType) + PdfUtils.XLSX_SUFFIX; log.info("工作票模板为:{}", fileName); - TemplateExportParams templateExportParams = new TemplateExportParams("template/" + fileName, true); + TemplateExportParams templateExportParams = new TemplateExportParams("template/新电气第一种工作票模板.xlsx", true); Workbook workbook = null; + Map map = new HashMap(); + map.put("name", "你好"); try { - workbook = ExcelUtil.getWorkbook(templateExportParams, workTicketInfoMap); + workbook = ExcelExportUtil.exportExcel(templateExportParams, map); } catch (Exception e) { e.printStackTrace(); } @@ -836,12 +653,11 @@ public class TicketProcessServiceImpl implements TicketProcessService { WorkTicketInfoEntity workTicket = workTicketVo.getWorkTicket(); //1. 工作对象 Map workTicketInfoMap = PdfUtils.objectToMap(workTicket); - result.putAll(workTicketInfoMap); + //2. 安全措施 List safetyMeasuresList = workTicketVo.getSafetyMeasuresList(); if (CollectionUtils.isNotEmpty(safetyMeasuresList)) { - Map> measureMap = safetyMeasuresList.stream() - .collect(Collectors.groupingBy(WorkTicketSafetyMeasureEntity::getType)); + Map> measureMap = safetyMeasuresList.stream().collect(Collectors.groupingBy(WorkTicketSafetyMeasureEntity::getType)); Arrays.stream(WorkTicketConstants.WorkTicketMeasureTypeEnum.class.getEnumConstants()).forEach(measureEnum -> { if (CollectionUtil.isNotEmpty(measureMap.get(measureEnum.getType()))) { List> mapList = measureMap.get(measureEnum.getType()).stream().map(measureVO -> { @@ -857,6 +673,7 @@ public class TicketProcessServiceImpl implements TicketProcessService { } }); } + result.putAll(workTicketInfoMap); //3. 工作票工作任务组 List workTicketContentDtoList = workTicketVo.getWorkTicketContentDtoList(); if (CollectionUtils.isNotEmpty(workTicketContentDtoList)) { @@ -891,8 +708,47 @@ public class TicketProcessServiceImpl implements TicketProcessService { private static Map parseObjectMap(T target, Class clas) { return JSONObject.parseObject(JSONObject.toJSONString(target), Map.class); } + + + public static void main(String[] args) throws IOException { + //System.out.println(DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss").format(LocalDateTime.now())); + TemplateExportParams params = new TemplateExportParams( + "template/新电气第一种工作票模板.xlsx"); + + Map map = new HashMap(); + map.put("name", "你好"); + // map.put("money", 2000000.00); + // map.put("upperMoney", "贰佰万"); + // map.put("company", "执笔潜行科技有限公司"); + // map.put("bureau", "财政局"); + // map.put("person", "JueYue"); + // map.put("phone", "1879740****"); + // List> listMap = new ArrayList>(); + // for (int i = 0; i < 4; i++) { + // Map lm = new HashMap(); + // lm.put("id", i + 1 + ""); + // lm.put("zijin", i * 10000 + ""); + // lm.put("bianma", "A001"); + // lm.put("mingcheng", "设计"); + // lm.put("xiangmumingcheng", "EasyPoi " + i + "期"); + // lm.put("quancheng", "开源项目"); + // lm.put("sqje", i * 10000 + ""); + // lm.put("hdje", i * 10000 + ""); + // + // listMap.add(lm); + // } + // map.put("maplist", listMap); + + Workbook workbook = ExcelExportUtil.exportExcel(params, map); + FileOutputStream fos = new FileOutputStream("F:\\idea项目\\flowable\\demo\\src\\main\\resources\\新电气第一种工作票模板2" + + ".xlsx"); + workbook.write(fos); + fos.close(); + } } + + diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/WorkTicketFinishServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/WorkTicketFinishServiceImpl.java index e093a17..f6e0b8e 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/WorkTicketFinishServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/WorkTicketFinishServiceImpl.java @@ -1,6 +1,7 @@ package com.hnac.hzims.ticket.twoTicket.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.hnac.hzims.ticket.twoTicket.entity.WorkTicketFinish; import com.hnac.hzims.ticket.twoTicket.mapper.WorkTicketFinishMapper; @@ -31,7 +32,25 @@ public class WorkTicketFinishServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WorkTicketFinish::getTicketId,ticketId); + queryWrapper.eq(WorkTicketFinish::getTicketId, ticketId); + queryWrapper.orderByDesc(WorkTicketFinish::getCreateTime); + queryWrapper.last("limit 1"); return this.getOne(queryWrapper); } + + /** + * 更新 + * + * @param workTicketFinish + */ + @Override + public void updateByTicketId(WorkTicketFinish workTicketFinish) { + if (workTicketFinish.getId() == null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().eq(WorkTicketFinish::getTicketId, workTicketFinish.getTicketId()); + this.update(workTicketFinish, updateWrapper); + return; + } + this.updateById(workTicketFinish); + } } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/IWorkTicketDelayService.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/IWorkTicketDelayService.java index 8f2c35f..d83cb84 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/IWorkTicketDelayService.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/IWorkTicketDelayService.java @@ -62,4 +62,10 @@ public interface IWorkTicketDelayService extends BaseService implements IWorkTicketDelayService { - private final WorkTicketInfoMapper infoMapper; - private final IFlowClient flowClient; - private final IOperAccessTaskClient taskClient; - private final ITaskClient maintenanceTaskClient; + private final WorkTicketInfoMapper infoMapper; + private final IFlowClient flowClient; + private final IOperAccessTaskClient taskClient; + private final ITaskClient maintenanceTaskClient; - @Override - public R> queryList(WorkTicketDelayDto req, Query query) { - LambdaQueryWrapper queryWrapper = this.getQueryWrapper(req); - IPage pages = super.page(Condition.getPage(query),queryWrapper); - return R.data(pages.setRecords(WorkTicketDelayWrapper.build().listVO(pages.getRecords()))); - } + @Override + public R> queryList(WorkTicketDelayDto req, Query query) { + LambdaQueryWrapper queryWrapper = this.getQueryWrapper(req); + IPage pages = super.page(Condition.getPage(query), queryWrapper); + return R.data(pages.setRecords(WorkTicketDelayWrapper.build().listVO(pages.getRecords()))); + } - @Override - public List list(WorkTicketDelayDto req) { - List workTicketDelayEntityList = this.list(this.getQueryWrapper(req)); - return CollectionUtil.isNotEmpty(workTicketDelayEntityList) ? WorkTicketDelayWrapper.build().listVO(workTicketDelayEntityList) : null; - } + @Override + public List list(WorkTicketDelayDto req) { + List workTicketDelayEntityList = this.list(this.getQueryWrapper(req)); + return CollectionUtil.isNotEmpty(workTicketDelayEntityList) ? WorkTicketDelayWrapper.build().listVO(workTicketDelayEntityList) : null; + } - @Override - @Transactional - public R saveAndStartFlow(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto, ComleteTask comleteTask) { - /**更新工作票状态**/ - infoMapper.updateById(infoDto); - /**新增工作票延期记录**/ - this.save(delayDto); - /**开启工作流**/ - R completeTaskR = flowClient.completeTask(comleteTask); - if(!completeTaskR.isSuccess()){ - throw new ServiceException(completeTaskR.getMsg()); - } - return R.success("保存成功!"); - } + @Override + @Transactional + public R saveAndStartFlow(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto, ComleteTask comleteTask) { + /**更新工作票状态**/ + infoMapper.updateById(infoDto); + /**新增工作票延期记录**/ + this.save(delayDto); + /**开启工作流**/ + R completeTaskR = flowClient.completeTask(comleteTask); + if (!completeTaskR.isSuccess()) { + throw new ServiceException(completeTaskR.getMsg()); + } + return R.success("保存成功!"); + } - @Override - @Transactional - public R updateAndConfirmFlow(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto, ComleteTask comleteTask) { - /**更新工作票状态**/ - infoMapper.updateById(infoDto); - /**工作票延期更新许可人以及许可时间**/ - if(TicketConstants.DelayStatusEnum.LICENSOR_CONFIRM.getStatus() == delayDto.getStatus()){ - delayDto.setLicensor(AuthUtil.getUserId()); - delayDto.setLicenseTime(LocalDateTime.now()); - } - /**负责人确认更新时间**/ - if(TicketConstants.DelayStatusEnum.PRINCIPAL_CONFIRM.getStatus() == delayDto.getStatus()){ - delayDto.setPrincipalTime(LocalDateTime.now()); - } - this.updateById(delayDto); - /**开启工作流**/ - R completeTaskR = flowClient.completeTask(comleteTask); - if(!completeTaskR.isSuccess()){ - throw new ServiceException(completeTaskR.getMsg()); - } - //更新任务延期状态 - if(TicketConstants.DelayStatusEnum.PRINCIPAL_CONFIRM.getStatus() == delayDto.getStatus()){ - updateTaskDelayStatus(infoDto,delayDto); - } - return R.success("操作成功!"); - } + @Override + @Transactional + public R updateAndConfirmFlow(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto, ComleteTask comleteTask) { + /**更新工作票状态**/ + infoMapper.updateById(infoDto); + /**工作票延期更新许可人以及许可时间**/ + if (TicketConstants.DelayStatusEnum.LICENSOR_CONFIRM.getStatus() == delayDto.getStatus()) { + delayDto.setLicensor(AuthUtil.getUserId()); + delayDto.setLicenseTime(LocalDateTime.now()); + } + /**负责人确认更新时间**/ + if (TicketConstants.DelayStatusEnum.PRINCIPAL_CONFIRM.getStatus() == delayDto.getStatus()) { + delayDto.setPrincipalTime(LocalDateTime.now()); + } + this.updateById(delayDto); + /**开启工作流**/ + R completeTaskR = flowClient.completeTask(comleteTask); + if (!completeTaskR.isSuccess()) { + throw new ServiceException(completeTaskR.getMsg()); + } + //更新任务延期状态 + if (TicketConstants.DelayStatusEnum.PRINCIPAL_CONFIRM.getStatus() == delayDto.getStatus()) { + updateTaskDelayStatus(infoDto, delayDto); + } + return R.success("操作成功!"); + } - /** - * 工作票延期 - * - * @param ticketId - * @return - */ - @Override - public WorkTicketDelayEntity selectByTicketId(Long ticketId) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(WorkTicketDelayEntity::getTicketId,ticketId); - List entities = this.list(queryWrapper); - return entities.get(0); - } + /** + * 工作票延期 + * + * @param ticketId + * @return + */ + @Override + public WorkTicketDelayEntity selectByTicketId(Long ticketId) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WorkTicketDelayEntity::getTicketId, ticketId); + queryWrapper.orderByDesc(BaseEntity::getCreateTime); + List entities = this.list(queryWrapper); + return CollectionUtils.isNotEmpty(entities) ? entities.get(0) : null; + } + + /** + * 工作票延期更新 + * + * @param workTicketDelay + */ + @Override + public void updateByTicketId(WorkTicketDelayEntity workTicketDelay) { + if (workTicketDelay.getId() == null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().eq(WorkTicketDelayEntity::getTicketId, workTicketDelay.getTicketId()); + this.update(workTicketDelay, updateWrapper); + return; + } + this.updateById(workTicketDelay); + } + + /** + * 更新任务延期时间状态 + * + * @param infoDto + */ + @Transactional(rollbackFor = Exception.class) + public void updateTaskDelayStatus(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto) { + //检修 + if (TicketConstants.TaskTypeEnum.JXRW.getType().equals(infoDto.getTaskType())) { + OperAccessTaskEntity taskEntity = new OperAccessTaskEntity(); + taskEntity.setDelayStatus(AccessConstants.DELAY_STATUS_2); + taskEntity.setDelayDate(LocalDateTime.now()); + taskEntity.setId(infoDto.getTaskId()); + taskEntity.setPlanEndTime(Date.from(delayDto.getChangeTime().atZone(ZoneId.systemDefault()).toInstant())); + taskClient.updateById(taskEntity); + } + //日常维护 + else if (TicketConstants.TaskTypeEnum.RCWH.getType().equals(infoDto.getTaskType())) { + OperMaintenanceTaskDTO taskDTO = new OperMaintenanceTaskDTO(); + taskDTO.setDelayStatus(AccessConstants.DELAY_STATUS_2); + taskDTO.setDelayDate(LocalDateTime.now()); + taskDTO.setPlanEndTime(delayDto.getChangeTime()); + taskDTO.setId(infoDto.getTaskId()); + TaskFlowDTO taskFlowDTO = new TaskFlowDTO(); + taskFlowDTO.setTaskDTO(taskDTO); + maintenanceTaskClient.updateTaskStatus(taskFlowDTO); + } + } + + /** + * 获取queryWrapper + * + * @param req + * @return + */ + private LambdaQueryWrapper getQueryWrapper(WorkTicketDelayDto req) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + if (Func.isNotEmpty(req.getFlowId())) { + queryWrapper.eq(WorkTicketDelayEntity::getFlowId, req.getFlowId()); + } + if (Func.isNotEmpty(req.getTicketId())) { + queryWrapper.eq(WorkTicketDelayEntity::getTicketId, req.getTicketId()); + } + return queryWrapper; + } - /** - * 更新任务延期时间状态 - * @param infoDto - */ - @Transactional(rollbackFor = Exception.class) - public void updateTaskDelayStatus(WorkTicketInfoDto infoDto, WorkTicketDelayDto delayDto){ - //检修 - if(TicketConstants.TaskTypeEnum.JXRW.getType().equals(infoDto.getTaskType())){ - OperAccessTaskEntity taskEntity = new OperAccessTaskEntity(); - taskEntity.setDelayStatus(AccessConstants.DELAY_STATUS_2); - taskEntity.setDelayDate(LocalDateTime.now()); - taskEntity.setId(infoDto.getTaskId()); - taskEntity.setPlanEndTime(Date.from(delayDto.getChangeTime().atZone( ZoneId.systemDefault()).toInstant())); - taskClient.updateById(taskEntity); - } - //日常维护 - else if(TicketConstants.TaskTypeEnum.RCWH.getType().equals(infoDto.getTaskType())){ - OperMaintenanceTaskDTO taskDTO = new OperMaintenanceTaskDTO(); - taskDTO.setDelayStatus(AccessConstants.DELAY_STATUS_2); - taskDTO.setDelayDate(LocalDateTime.now()); - taskDTO.setPlanEndTime(delayDto.getChangeTime()); - taskDTO.setId(infoDto.getTaskId()); - TaskFlowDTO taskFlowDTO = new TaskFlowDTO(); - taskFlowDTO.setTaskDTO(taskDTO); - maintenanceTaskClient.updateTaskStatus(taskFlowDTO); - } - } - /** - * 获取queryWrapper - * @param req - * @return - */ - private LambdaQueryWrapper getQueryWrapper(WorkTicketDelayDto req){ - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); - if(Func.isNotEmpty(req.getFlowId())){ - queryWrapper.eq(WorkTicketDelayEntity::getFlowId,req.getFlowId()); - } - if(Func.isNotEmpty(req.getTicketId())){ - queryWrapper.eq(WorkTicketDelayEntity::getTicketId,req.getTicketId()); - } - return queryWrapper; - } } diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketPrincipalChangeServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketPrincipalChangeServiceImpl.java index d6b3c99..893b07d 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketPrincipalChangeServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/workTicket/service/impl/WorkTicketPrincipalChangeServiceImpl.java @@ -2,6 +2,7 @@ package com.hnac.hzims.ticket.workTicket.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.hnac.hzims.ticket.constants.TicketConstants; import com.hnac.hzims.ticket.twoTicket.entity.WorkTicketFinish; @@ -16,6 +17,7 @@ import com.hnac.hzims.ticket.workTicket.vo.WorkTicketPrincipalChangeVO; import com.hnac.hzims.ticket.workTicket.wrapper.WorkTicketPrincipalChangeWrappper; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springblade.core.mp.base.BaseEntity; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; @@ -97,7 +99,23 @@ public class WorkTicketPrincipalChangeServiceImpl extends BaseServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(WorkTicketPrincipalChangeEntity::getTicketId,ticketId); - List workTicketPrincipalChangeEntities = this.list(queryWrapper); - return workTicketPrincipalChangeEntities.get(workTicketPrincipalChangeEntities.size() - 1); + queryWrapper.orderByDesc(BaseEntity::getCreateTime); + queryWrapper.last("limit 1"); + return this.getOne(queryWrapper); + } + + /** + * 更新 + * @param workTicketPrincipalChange + */ + @Override + public void updateByTicketId(WorkTicketPrincipalChangeEntity workTicketPrincipalChange) { + if (workTicketPrincipalChange.getId() == null) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().eq(WorkTicketPrincipalChangeEntity::getTicketId, workTicketPrincipalChange.getTicketId()); + this.update(workTicketPrincipalChange, updateWrapper); + return; + } + this.updateById(workTicketPrincipalChange); } } diff --git a/hzims-service/ticket/src/main/resources/template/新电气第一种工作票模板.xlsx b/hzims-service/ticket/src/main/resources/template/新电气第一种工作票模板.xlsx index d66fefaceacc68b69abf3f45285e4ddf8699d9f7..2bc884cbfee9a4e9df8af8e329da89bcd1409708 100644 GIT binary patch delta 8825 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 delta 9403 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 AH2?qr