diff --git a/src/main/java/com/thinglinks/uav/alarms/controller/AlarmsController.java b/src/main/java/com/thinglinks/uav/alarms/controller/AlarmsController.java index 95f406313943c7f4afb5c64d2359d7986b1de9e9..4f08c5483daf7201ea7524cf5aadcdc2ef1dea76 100644 --- a/src/main/java/com/thinglinks/uav/alarms/controller/AlarmsController.java +++ b/src/main/java/com/thinglinks/uav/alarms/controller/AlarmsController.java @@ -1,13 +1,14 @@ package com.thinglinks.uav.alarms.controller; import com.thinglinks.uav.alarms.dto.*; -import com.thinglinks.uav.alarms.entity.Alarms; import com.thinglinks.uav.alarms.entity.AlarmsParameter; import com.thinglinks.uav.alarms.service.AlarmsParameterService; import com.thinglinks.uav.alarms.service.AlarmsService; import com.thinglinks.uav.common.dto.BasePageResponse; import com.thinglinks.uav.common.dto.BaseResponse; +import com.thinglinks.uav.common.dto.IdsRequest; import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.Operation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -26,26 +27,48 @@ public class AlarmsController { private AlarmsParameterService alarmsParameterService; @GetMapping - public BasePageResponse getAlarmsList(@Valid QueryAlarmDTO request) { + @Operation(summary = "获取预警列表") + public BasePageResponse getAlarmsList(@Valid QueryAlarmDTO request) { return alarmsService.getPage(request); } + @GetMapping("{alarmid}") + @Operation(summary = "获取预警详情") + public BaseResponse getAlarmsDetail(@PathVariable("alarmid") String alarmid) { + return alarmsService.getAlarmsDetail(alarmid); + } + @GetMapping("/statistics") + @Operation(summary = "获取预警数据统计") public BaseResponse> getStatistics() { return alarmsService.getStatistics(); } + // 预警处理 @PostMapping("{alarmid}") + @Operation(summary = "预警处理") public BaseResponse alarmHandle(@PathVariable String alarmid,@RequestBody @Valid AlarmsHandleDTO request) { return alarmsService.alarmHandle(alarmid,request); } + // 批量预警处理 + @PostMapping("/batchAlarmHandle") + @Operation(summary = "批量预警处理") + public BaseResponse batchAlarmHandle(@RequestBody @Valid IdsRequest ids) { + return alarmsService.batchAlarmHandle(ids); + } + + + // 获取预警参数 @GetMapping("/settings") + @Operation(summary = "获取预警参数") public BaseResponse> getAlarmsParameters() { return alarmsParameterService.getAlarmsParameters(); } + // 修改预警参数 @PatchMapping("/settings") + @Operation(summary = "修改预警参数") public BaseResponse editAlarmsParameters(@RequestBody EditAlarmsParameterDTO request) { return alarmsParameterService.editAlarmsParameters(request); } diff --git a/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDTO.java b/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..aed3f8fe9b1c2248c36c1fa4ea8241dc494a14e7 --- /dev/null +++ b/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDTO.java @@ -0,0 +1,74 @@ +package com.thinglinks.uav.alarms.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class AlarmDTO{ + @ApiModelProperty(value = "预警id") + private String alarmid; + + @ApiModelProperty(value = "预警类型") + private String alarmType; + + @ApiModelProperty(value = "预警标签") + private String tag; + + @ApiModelProperty(value = "预警详细内用") + private String content; + +// @ApiModelProperty(value = "展示预警内容") +// private String displayWarningContent; + + @ApiModelProperty(value = "保险类型") + private String insuranceType; + + @ApiModelProperty(value = "保单号") + private String insuranceCode; + + @ApiModelProperty(value = "告警处理结果") + private String result; + + @ApiModelProperty(value = "处理状态") + private Boolean status; + + @ApiModelProperty(value = "预警时间") + private long alarmTime; + + @ApiModelProperty(value = "处理时间") + private long handleAt; + + @ApiModelProperty(value = "处理备注") + private String remark; + + @ApiModelProperty(value = "订单id") + private String ordid; + + @ApiModelProperty(value = "客户单位") + private String customer; + + @ApiModelProperty(value = "姓名") + private String name; + + @ApiModelProperty(value = "联系方式") + private String phone; + + @ApiModelProperty(value = "产品名称") + private String product; + + @ApiModelProperty(value = "设备sn码") + private String snCode; + + @ApiModelProperty(value = "接单人") + private String receiver; + + + @ApiModelProperty(value = "配件名称") + private String stockName; + + @ApiModelProperty(value = "配件数量") + private Integer stockNumber; + + @ApiModelProperty(value = "项目名称") + private String projectName; +} diff --git a/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDetailDTO.java b/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDetailDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..c64fe49e47e83eeaec4ecae5d5abf8e0834cae00 --- /dev/null +++ b/src/main/java/com/thinglinks/uav/alarms/dto/AlarmDetailDTO.java @@ -0,0 +1,42 @@ +package com.thinglinks.uav.alarms.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class AlarmDetailDTO { + + @ApiModelProperty(value = "预警类型") + private String alarmType; + + @ApiModelProperty(value = "处理状态") + private Boolean status; + + @ApiModelProperty(value = "预警经办人") + private String agent; + + @ApiModelProperty(value = "经办部门") + private String agentDepartment; + + @ApiModelProperty(value = "保险类型") + private String insuranceType; + + @ApiModelProperty(value = "保险到期时间") + private long insuranceExpireAt; + + @ApiModelProperty(value = "预警内容") + private String content; + + @ApiModelProperty(value = "预警处理时间") + private long handleAt; + + @ApiModelProperty(value = "预警处理结果") + private String result; + + @ApiModelProperty(value = "预警处理备注") + private String remark; + + @ApiModelProperty(value = "预警时间") + private long alarmTime; + +} diff --git a/src/main/java/com/thinglinks/uav/alarms/dto/QueryAlarmDTO.java b/src/main/java/com/thinglinks/uav/alarms/dto/QueryAlarmDTO.java index f5dd2cee59f97738b7e6dbb0622cbd008f079a98..ad7b979b2ceead9c83fc7c965671828c6af6cada 100644 --- a/src/main/java/com/thinglinks/uav/alarms/dto/QueryAlarmDTO.java +++ b/src/main/java/com/thinglinks/uav/alarms/dto/QueryAlarmDTO.java @@ -7,9 +7,12 @@ import javax.validation.constraints.NotNull; @Data public class QueryAlarmDTO extends BasePageRequest { - private String startTime; - private String endTime; + private String tag; + + private long startTime; + + private long endTime; @NotNull(message = "告警类型不能为空") private String type; diff --git a/src/main/java/com/thinglinks/uav/alarms/entity/Alarms.java b/src/main/java/com/thinglinks/uav/alarms/entity/Alarms.java index c2761ef96257b646853b0abf9158fca1e79a5b18..355116a02a8998550e45a0f9ca98ea87c752fa36 100644 --- a/src/main/java/com/thinglinks/uav/alarms/entity/Alarms.java +++ b/src/main/java/com/thinglinks/uav/alarms/entity/Alarms.java @@ -9,7 +9,6 @@ import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Table; -import java.util.Date; @EqualsAndHashCode(callSuper = true) @Entity @@ -17,51 +16,63 @@ import java.util.Date; @Data public class Alarms extends BaseEntity { - @Column(name = "alarmid", unique = true, columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '告警内部ID 唯一'") + @Column(name = "alarmid", unique = true, columnDefinition = "告警内部ID 唯一") private String alarmid; - @Column(name = "type", columnDefinition = "varchar(255) NOT NULL COMMENT '告警类型 1:保险到期 2:保养到期 3:服务超时 4:库存告警'") + @Column(name = "type", columnDefinition = "告警类型 1:保险到期 2:保养到期 3:服务超时 4:库存告警") @ApiModelProperty(value = "告警类型,1:保险到期,2:保养到期,3:服务超时,4:库存告警") private String type; - @Column(name = "content", columnDefinition = "text NOT NULL COMMENT '告警内容'") + @Column(name = "tag", columnDefinition = "列表展示的 预警类型 如保险即将到期、保险已到期 基础保养、常规保养、深度保养 保险待确认超时、定损超时、维修超时、寄件超时、初版保险资料不齐超时预警、终版资料不齐超时预警、预付款工单处理预警'") + @ApiModelProperty(value = "告警内容") + private String tag; + + @Column(name = "content", columnDefinition = "告警内容'") @ApiModelProperty(value = "告警内容") private String content; - @Column(name = "status", columnDefinition = "tinyint(1) DEFAULT '0' COMMENT '处理状态 true:已处理 false:未处理'") + @Column(name = "status", columnDefinition = "'处理状态 true:已处理 false:未处理'") @ApiModelProperty(value = "处理状态,true:已处理,false:未处理") private Boolean status; - @Column(name = "result", columnDefinition = "varchar(255) DEFAULT NULL COMMENT '告警处理结果 1:保养 2:不保养 3:续保 4:不续保'") + @Column(name = "result", columnDefinition = "告警处理结果 1:保养 2:不保养 3:续保 4:不续保") @ApiModelProperty(value = "告警处理结果,1:保养,2:不保养,3:续保,4:不续保") private String result; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Column(name = "handle_at", columnDefinition = "datetime DEFAULT NULL COMMENT '告警处理时间'") + @Column(name = "handle_at", columnDefinition = "告警处理时间") @ApiModelProperty(value = "告警处理时间") private Long handleAt; - @Column(name = "remark", columnDefinition = "varchar(255) DEFAULT NULL COMMENT '处理备注'") + @Column(name = "remark", columnDefinition = "处理备注") @ApiModelProperty(value = "处理备注") private String remark; - @Column(name = "cpid", columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '相关公司ID'") + @Column(name = "cpid", columnDefinition = "相关公司ID") @ApiModelProperty(value = "相关公司ID") private String cpid; - @Column(name = "uid", columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '用户ID'") + @Column(name = "uid", columnDefinition = "预警处理 用户ID") @ApiModelProperty(value = "用户ID") private String uid; - @Column(name = "devid", columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '设备ID'") + @Column(name = "devid", columnDefinition = "设备ID") @ApiModelProperty(value = "设备ID") private String devid; - @Column(name = "stcid", columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '库存ID'") + @Column(name = "stcid", columnDefinition = "库存ID") @ApiModelProperty(value = "库存ID") private String stcid; - @Column(name = "ordid", columnDefinition = "char(36) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '订单ID'") + @Column(name = "ordid", columnDefinition = "订单ID") @ApiModelProperty(value = "订单ID") private String ordid; + + @Column(name = "iid", columnDefinition = "订单ID") + @ApiModelProperty(value = "保险id") + private String iid; + + @Column(name = "pjid", columnDefinition = "项目ID") + @ApiModelProperty(value = "项目id") + private String pjid; } diff --git a/src/main/java/com/thinglinks/uav/alarms/entity/AlarmsParameter.java b/src/main/java/com/thinglinks/uav/alarms/entity/AlarmsParameter.java index 2587b4c778c3cd3895d22f897de4724c5782ce9a..c032b63ecbc97ecee66aff6d87a2733d1e17ab47 100644 --- a/src/main/java/com/thinglinks/uav/alarms/entity/AlarmsParameter.java +++ b/src/main/java/com/thinglinks/uav/alarms/entity/AlarmsParameter.java @@ -19,6 +19,8 @@ public class AlarmsParameter extends BaseEntity { private String unit; @Column(name = "value") private Integer value; + @Column(name = "remark") + private String remark; public AlarmsParameter() { } diff --git a/src/main/java/com/thinglinks/uav/alarms/enums/AlarmTypeEnums.java b/src/main/java/com/thinglinks/uav/alarms/enums/AlarmTypeEnums.java index 450f40359dc3187530f2a1d80116ccf65c7ced5b..783124a17c71938b6b8dbbe5b0e4dc2fe1fff1a4 100644 --- a/src/main/java/com/thinglinks/uav/alarms/enums/AlarmTypeEnums.java +++ b/src/main/java/com/thinglinks/uav/alarms/enums/AlarmTypeEnums.java @@ -1,19 +1,48 @@ package com.thinglinks.uav.alarms.enums; +import lombok.Getter; + public enum AlarmTypeEnums { - INSURANCE("insurance","保险到期预警"), + // 预警类型 + INSURANCETYPE("保险预警", "1"), + MAINTAINTYPE("保养到期预警", "2"), + SERVICETYPE("服务超时", "3"), + INVENTORYTYPE("库存预警", "4"), + PROJECTTYPE("项目预警", "5"), + + // 保险预警 + INSURANCE("insurance","保险预警"), + INSURANCEISABOUTTOEXPIRE("insuranceIsAboutToExpire","保险即将到期预警"), + INSURANCEEXPIRED("insuranceExpired","保险已到期预警"), + + // 保养预警 MAINTENANCE("maintenance", "保养到期预警"), - INSURANCECONFIRM("insuranceConfirm", "保险待确认预警"), - LOSSASSESSMENT("lossAssessment", "定损超时预警"), - FIX("fix","维修超时预警"), - EXPRESSES("expresses","寄件超时预警"), - RECEIVE("receive","接单预警"), - FEES("fees","费用预警"), - EXPRESS("express", "快递预警"), - TOTAL("total", "总预警"), - PROJECT("project", "项目预警"); + BASEMAINTENANCE("baseMaintenance", "基础保养"), + ROUTINEMAINTENANCE("routineMaintenance", "常规保养"), + INDEPTHMAINTENANCE("InDepthMaintenance", "深度保养"), + + // 服务预警 + INSURANCECONFIRM("insuranceConfirm", "保险待确认超时"), + LOSSASSESSMENT("lossAssessment", "定损超时"), + FIX("fix","维修超时"), + EXPRESS("express", "寄件超时"), + INSURANCEFIRSTWAITINGSUBMIT("insuranceFirstWaitingSubmit", "初版资料待提交超时"), + FIRSTREJECT("firstReject", "初版资料驳回修改超时"), + INSURANCELASTWAITINGSUBMIT("insuranceLastWaitingSubmit", "终版资料提交超时"), + FEES("fees","预付款工单处理预警"), + + // 库存预警 + INVENTORY("inventory", "库存预警"), + INVENTORYCONTENT("inventoryContent", "配件已低于安全库存设置"), + + // 项目预警 + PROJECT("project", "项目预警"), + PROJECTISABOUTTOEXPIRE("projectIsAboutToExpire", "合同即将到期"), + PROJECTEXPIRED("projectExpired", "合同已到期"); + @Getter private final String name; + @Getter private final String remark; public static boolean isExist(String name) { @@ -29,4 +58,13 @@ public enum AlarmTypeEnums { this.name = name; this.remark = remark; } + + public static String getNameByRemark(String remark) { + for (AlarmTypeEnums alarmTypeEnums : AlarmTypeEnums.values()) { + if (alarmTypeEnums.remark.equals(remark)) { + return alarmTypeEnums.name; + } + } + return null; + } } diff --git a/src/main/java/com/thinglinks/uav/alarms/enums/UnitTypeEnums.java b/src/main/java/com/thinglinks/uav/alarms/enums/UnitTypeEnums.java index 40adc1db5c5db3dfbc4ddbbd40db917610b6e721..12e94c7f706059d617819ba7401a27c59048c287 100644 --- a/src/main/java/com/thinglinks/uav/alarms/enums/UnitTypeEnums.java +++ b/src/main/java/com/thinglinks/uav/alarms/enums/UnitTypeEnums.java @@ -2,6 +2,9 @@ package com.thinglinks.uav.alarms.enums; import lombok.Getter; +import java.util.Arrays; +import java.util.Optional; + public enum UnitTypeEnums { MONTH("month", "月"), WEEK("week", "周"), @@ -11,6 +14,7 @@ public enum UnitTypeEnums { @Getter private final String code; + @Getter private final String name; public static boolean exists(String code) { @@ -27,4 +31,20 @@ public enum UnitTypeEnums { this.name = name; } + public static UnitTypeEnums getUnitTypeEnums(String code) { + for (UnitTypeEnums unitTypeEnums : UnitTypeEnums.values()) { + if (unitTypeEnums.getCode().equals(code)) { + return unitTypeEnums; + } + } + return null; + } + + public static Optional getNameByCode(String code) { + return Arrays.stream(values()) + .filter(unit -> unit.getCode().equals(code)) + .map(UnitTypeEnums::getName) + .findFirst(); + } + } diff --git a/src/main/java/com/thinglinks/uav/alarms/repository/AlarmsRepository.java b/src/main/java/com/thinglinks/uav/alarms/repository/AlarmsRepository.java index 694ac962c00244d6b3250dcb17301a8d4d66d725..6607702dbc09f3b6166f14913667e269aa06b633 100644 --- a/src/main/java/com/thinglinks/uav/alarms/repository/AlarmsRepository.java +++ b/src/main/java/com/thinglinks/uav/alarms/repository/AlarmsRepository.java @@ -16,4 +16,10 @@ public interface AlarmsRepository extends JpaRepository, JpaSpe @Query("SELECT a.type, COUNT(a) FROM Alarms a WHERE a.status = false GROUP BY a.type") List countAlarmsByTypeWithUntreated(); + + boolean existsByOrdid(String ordid); + + void deleteByIid(String iid); + void deleteByOrdid(String ordid); + void deleteByPjid(String pjid); } diff --git a/src/main/java/com/thinglinks/uav/alarms/service/AlarmsService.java b/src/main/java/com/thinglinks/uav/alarms/service/AlarmsService.java index 06258ec5d1eca8cb45d3ef97e4bb0c82ee93158d..fb96e764d7fbad004dc7c6a7e3f63774556fc8a7 100644 --- a/src/main/java/com/thinglinks/uav/alarms/service/AlarmsService.java +++ b/src/main/java/com/thinglinks/uav/alarms/service/AlarmsService.java @@ -1,19 +1,21 @@ package com.thinglinks.uav.alarms.service; -import com.thinglinks.uav.alarms.dto.AlarmsCount; -import com.thinglinks.uav.alarms.dto.AlarmsHandleDTO; -import com.thinglinks.uav.alarms.dto.QueryAlarmDTO; -import com.thinglinks.uav.alarms.entity.Alarms; +import com.thinglinks.uav.alarms.dto.*; import com.thinglinks.uav.common.dto.BasePageResponse; import com.thinglinks.uav.common.dto.BaseResponse; +import com.thinglinks.uav.common.dto.IdsRequest; import java.util.List; public interface AlarmsService { - BasePageResponse getPage(QueryAlarmDTO request); + BasePageResponse getPage(QueryAlarmDTO request); BaseResponse> getStatistics(); BaseResponse alarmHandle(String alarmid,AlarmsHandleDTO alarmsHandleDTO); + + BaseResponse batchAlarmHandle(IdsRequest ids); + + BaseResponse getAlarmsDetail(String alarmid); } diff --git a/src/main/java/com/thinglinks/uav/alarms/service/impl/AlarmsServiceImpl.java b/src/main/java/com/thinglinks/uav/alarms/service/impl/AlarmsServiceImpl.java index dd836f957a41f282561e816560784be78c4bacd0..d10fdadd528408d57f66a7f9cd7455fbe6d9f2bb 100644 --- a/src/main/java/com/thinglinks/uav/alarms/service/impl/AlarmsServiceImpl.java +++ b/src/main/java/com/thinglinks/uav/alarms/service/impl/AlarmsServiceImpl.java @@ -1,15 +1,37 @@ package com.thinglinks.uav.alarms.service.impl; -import com.thinglinks.uav.alarms.dto.AlarmsCount; -import com.thinglinks.uav.alarms.dto.AlarmsHandleDTO; -import com.thinglinks.uav.alarms.dto.QueryAlarmDTO; +import com.thinglinks.uav.alarms.dto.*; import com.thinglinks.uav.alarms.entity.Alarms; +import com.thinglinks.uav.alarms.enums.AlarmTypeEnums; import com.thinglinks.uav.alarms.repository.AlarmsRepository; import com.thinglinks.uav.alarms.service.AlarmsService; import com.thinglinks.uav.common.dto.BasePageResponse; import com.thinglinks.uav.common.dto.BaseResponse; +import com.thinglinks.uav.common.dto.IdsRequest; +import com.thinglinks.uav.common.enums.InsuranceEnum; import com.thinglinks.uav.common.utils.CommonUtils; +import com.thinglinks.uav.customer.entity.Customer; +import com.thinglinks.uav.customer.entity.Device; +import com.thinglinks.uav.customer.repository.CustomersRepository; +import com.thinglinks.uav.customer.repository.DeviceRepository; +import com.thinglinks.uav.departments.entity.Department; +import com.thinglinks.uav.departments.repository.DepartmentsRepository; +import com.thinglinks.uav.insurance.entity.Insurance; +import com.thinglinks.uav.insurance.repository.InsuranceRepository; +import com.thinglinks.uav.order.entity.Order; +import com.thinglinks.uav.order.repository.OrderRepository; +import com.thinglinks.uav.product.entity.Product; +import com.thinglinks.uav.product.repository.ProductRepository; +import com.thinglinks.uav.project.entity.Project; +import com.thinglinks.uav.project.repository.ProjectRepository; +import com.thinglinks.uav.stock.entity.Stock; +import com.thinglinks.uav.stock.repository.StockRepository; +import com.thinglinks.uav.user.entity.User; +import com.thinglinks.uav.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; @@ -29,12 +51,38 @@ public class AlarmsServiceImpl implements AlarmsService { @Resource private AlarmsRepository alarmsRepository; + @Resource + private InsuranceRepository insuranceRepository; + + @Resource + private OrderRepository orderRepository; + @Resource + private UserRepository userRepository; + + @Resource + private CustomersRepository customersRepository; + + @Resource + private DeviceRepository deviceRepository; + + @Resource + private ProductRepository productRepository; + + @Resource + private StockRepository stockRepository; + + @Resource + private ProjectRepository projectRepository; + + @Resource + private DepartmentsRepository departmentsRepository; + /** * @param request * @return */ @Override - public BasePageResponse getPage(QueryAlarmDTO request) { + public BasePageResponse getPage(QueryAlarmDTO request) { PageRequest pageRequest = request.of(); Specification specification = (root, criteriaQuery, criteriaBuilder) -> { ArrayList predicates = new ArrayList<>(); @@ -44,14 +92,42 @@ public class AlarmsServiceImpl implements AlarmsService { if (Objects.nonNull(request.getStatus())){ predicates.add(criteriaBuilder.equal(root.get("status"), request.getStatus())); } - if(Objects.nonNull(request.getStartTime()) && Objects.nonNull(request.getEndTime())){ - predicates.add(criteriaBuilder.between(root.get("createTime"), request.getStartTime(), request.getEndTime())); + if(request.getStartTime() > 0 && request.getEndTime() > 0){ + predicates.add(criteriaBuilder.between(root.get("ut"), request.getStartTime(), request.getEndTime())); + } + if(StringUtils.isNotBlank(request.getTag())){ + predicates.add(criteriaBuilder.equal(root.get("tag"), request.getTag())); } Predicate[] p = new Predicate[predicates.size()]; return criteriaBuilder.and(predicates.toArray(p)); }; Page page = alarmsRepository.findAll(specification, pageRequest); - List result = page.stream().collect(Collectors.toList()); + List result = page.stream().map(alarm -> { + AlarmDTO alarmDTO = new AlarmDTO(); + alarmDTO.setAlarmid(alarm.getAlarmid()); + alarmDTO.setAlarmType(AlarmTypeEnums.getNameByRemark(alarm.getType())); + alarmDTO.setContent(alarm.getContent()); + alarmDTO.setStatus(alarm.getStatus()); + alarmDTO.setResult(alarm.getResult()); + alarmDTO.setRemark(alarm.getRemark()); + alarmDTO.setTag(alarm.getTag()); + alarmDTO.setHandleAt(alarm.getUt()); + if (!StringUtils.isBlank(alarm.getIid())){ + getInsuranceInformation(alarmDTO, alarm); + } + if (!StringUtils.isBlank(alarm.getOrdid())){ + getOrderInformation(alarmDTO, alarm); + } + if (!StringUtils.isBlank(alarm.getStcid())){ + getStockInformation(alarmDTO, alarm); + } + if (!StringUtils.isBlank(alarm.getPjid())){ + getProjectInformation(alarmDTO, alarm); + } + + + return alarmDTO; + }).collect(Collectors.toList()); return BasePageResponse.success(page, result); } @@ -76,4 +152,100 @@ public class AlarmsServiceImpl implements AlarmsService { alarmsRepository.save(alarm); return BaseResponse.success(); } + + /** + * @param ids + * @return + */ + @Override + public BaseResponse batchAlarmHandle(IdsRequest ids) { + String uid = CommonUtils.getUid(); + ids.getIds().forEach(id -> { + Alarms alarm = alarmsRepository.findByAlarmid(id); + if(Objects.nonNull(alarm)){ + alarm.setStatus(true); + alarm.setHandleAt(System.currentTimeMillis()); + alarm.setUid(uid); + alarmsRepository.save(alarm); + } + }); + return BaseResponse.success(); + } + + /** + * @param alarmid + * @return + */ + @Override + public BaseResponse getAlarmsDetail(String alarmid) { + AlarmDetailDTO alarmDetailDTO = new AlarmDetailDTO(); + Alarms alarm = alarmsRepository.findByAlarmid(alarmid); + if (Objects.nonNull(alarm)){ + if (StringUtils.isNotBlank(alarm.getUid())){ + alarmDetailDTO.setContent(alarm.getContent()); + alarmDetailDTO.setAlarmTime(alarm.getCt()); + alarmDetailDTO.setStatus(alarm.getStatus()); + alarmDetailDTO.setAlarmType(AlarmTypeEnums.getNameByRemark(alarm.getType())); + if (StringUtils.isNotBlank(alarm.getResult())){ + alarmDetailDTO.setResult(alarm.getResult()); + } + if (Objects.nonNull(alarm.getRemark())){ + alarmDetailDTO.setRemark(alarm.getRemark()); + } + if (Objects.nonNull(alarm.getHandleAt()) && alarm.getHandleAt()>0){ + alarmDetailDTO.setHandleAt(alarm.getHandleAt()); + } + User user = userRepository.findByUid(alarm.getUid()); + if (StringUtils.isNotBlank(user.getDid())){ + Department department = departmentsRepository.findByDid(user.getDid()); + alarmDetailDTO.setAgentDepartment(department.getName()); + } + alarmDetailDTO.setAgent(user.getUserName()); + } + if (alarm.getType().equals(AlarmTypeEnums.INSURANCETYPE.getRemark())){ + Insurance insurance = insuranceRepository.findByIid(alarm.getIid()); + alarmDetailDTO.setInsuranceType(InsuranceEnum.getNameByCode(insurance.getInsuranceType())); + alarmDetailDTO.setInsuranceExpireAt(insurance.getInsuranceExpireAt()); + } + + + return BaseResponse.success(alarmDetailDTO); + + } + return BaseResponse.fail("预警信息不存在"); + } + + public void getInsuranceInformation(AlarmDTO alarmDTO, Alarms alarm){ + Insurance insurance = insuranceRepository.findByIid(alarm.getIid()); + alarmDTO.setInsuranceCode(insurance.getInsuranceCode()); + alarmDTO.setInsuranceType(InsuranceEnum.getNameByCode(insurance.getInsuranceType())); + } + + public void getOrderInformation(AlarmDTO alarmDTO, Alarms alarm){ + Order order = orderRepository.findByOrdid(alarm.getOrdid()); + User user = userRepository.findByUid(order.getCuid()); + User receiveUser = userRepository.findByUid(order.getReceiveUid()); + alarmDTO.setReceiver(receiveUser.getNickName()); + Customer customer = customersRepository.findByCid(user.getCid()); + alarmDTO.setOrdid(order.getOrdid()); + alarmDTO.setCustomer(customer.getName()); + alarmDTO.setName(user.getNickName()); + alarmDTO.setPhone(user.getMobile()); + Device device = deviceRepository.findByDevid(order.getDevid()); + alarmDTO.setSnCode(device.getCode()); + Product product = productRepository.findByPid(device.getPid()); + alarmDTO.setProduct(product.getName()); + } + + public void getStockInformation(AlarmDTO alarmDTO, Alarms alarm){ + Stock stock = stockRepository.findByStcid(alarm.getStcid()); + Product product = productRepository.findByPid(stock.getPid()); + alarmDTO.setStockName(product.getName()); + alarmDTO.setStockNumber(stock.getCount()); + } + + public void getProjectInformation(AlarmDTO alarmDTO, Alarms alarm){ + Project project = projectRepository.findByPjid(alarm.getPjid()); + alarmDTO.setProjectName(project.getName()); + } } diff --git a/src/main/java/com/thinglinks/uav/alarms/task/AlarmsTask.java b/src/main/java/com/thinglinks/uav/alarms/task/AlarmsTask.java index 33a4736d8e11d553a338604550dd463951eb1261..0e4cf68f9d46249ed31fd71eeec86284fe8c9e59 100644 --- a/src/main/java/com/thinglinks/uav/alarms/task/AlarmsTask.java +++ b/src/main/java/com/thinglinks/uav/alarms/task/AlarmsTask.java @@ -9,16 +9,22 @@ import com.thinglinks.uav.alarms.repository.AlarmsRepository; import com.thinglinks.uav.common.utils.CommonUtils; import com.thinglinks.uav.insurance.entity.Insurance; import com.thinglinks.uav.insurance.repository.InsuranceRepository; +import com.thinglinks.uav.message.service.MessageService; import com.thinglinks.uav.order.entity.Order; +import com.thinglinks.uav.order.enums.InsuranceStatusEnums; import com.thinglinks.uav.order.enums.OrderStatusEnums; import com.thinglinks.uav.order.repository.OrderRepository; import com.thinglinks.uav.project.entity.Project; import com.thinglinks.uav.project.repository.ProjectRepository; +import com.thinglinks.uav.stock.entity.Stock; +import com.thinglinks.uav.stock.repository.StockRepository; import com.thinglinks.uav.user.entity.User; import com.thinglinks.uav.user.repository.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; import javax.annotation.Resource; import java.util.Calendar; @@ -34,20 +40,22 @@ public class AlarmsTask { private static final String SERVICE_TYPE = "3"; + private static final String STOCK_TYPE = "4"; + private static final String PROJECT_TYPE = "5"; // 保险二次预警 30天 - private static final AlarmsParameter SECOND_INSURANCE_REMINDER_THRESHOLD = new AlarmsParameter(30, UnitTypeEnums.DAY.name()); + private static final AlarmsParameter SECOND_INSURANCE_REMINDER_THRESHOLD = new AlarmsParameter(30, UnitTypeEnums.DAY.getCode()); // 基础保养预警周期 - private static final AlarmsParameter BASE_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(6, UnitTypeEnums.MONTH.name()); + private static final AlarmsParameter BASE_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(6, UnitTypeEnums.MONTH.getCode()); // 常规保养预警周期 - private static final AlarmsParameter REGULAR_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(12, UnitTypeEnums.MONTH.name()); + private static final AlarmsParameter REGULAR_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(12, UnitTypeEnums.MONTH.getCode()); // 深度保养预警周期 - private static final AlarmsParameter DEEP_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(12, UnitTypeEnums.MONTH.name()); + private static final AlarmsParameter DEEP_MAINTENANCE_WARNING_THRESHOLD = new AlarmsParameter(12, UnitTypeEnums.MONTH.getCode()); // 项目二次预警 2个月 - private static final AlarmsParameter SECOND_PROJECT_REMINDER_THRESHOLD = new AlarmsParameter(2, UnitTypeEnums.MONTH.name()); + private static final AlarmsParameter SECOND_PROJECT_REMINDER_THRESHOLD = new AlarmsParameter(2, UnitTypeEnums.MONTH.getCode()); @Resource private AlarmsRepository alarmsRepository; @@ -67,7 +75,15 @@ public class AlarmsTask { @Resource private UserRepository userRepository; + @Resource + private StockRepository stockRepository; + + @Resource + private MessageService messageService; + + // 保养到期预警 TODO 目前还没保养订单 待确认 + @Transactional(rollbackFor = Exception.class) @Scheduled(fixedRate = 3600000) public void maintenanceExpirationEarlyWarningTask() { try { @@ -78,18 +94,22 @@ public class AlarmsTask { } // 保险到期预警 - @Scheduled(fixedRate = 3600000) + @Scheduled(fixedRate = 30000) + @Transactional(rollbackFor = Exception.class) public void insuranceExpirationEarlyWarningTask() { try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + long now = System.currentTimeMillis(); // 获取预警参数信息 AlarmsParameter parameter = alarmsParameterRepository.findByName(AlarmTypeEnums.INSURANCE.name()); - String validity = parameter.getValue() + parameter.getUnit(); + String validity = parameter.getValue() + UnitTypeEnums.getNameByCode(parameter.getUnit()).get(); Long warningTime = calculatedWarningTime(parameter); List activeInsurances = insuranceRepository.findActiveInsurances(now); // 二次预警参数 Long secondWarningTime = calculatedWarningTime(SECOND_INSURANCE_REMINDER_THRESHOLD); - String secondValidity = SECOND_INSURANCE_REMINDER_THRESHOLD.getValue() + SECOND_INSURANCE_REMINDER_THRESHOLD.getUnit(); + String secondValidity = SECOND_INSURANCE_REMINDER_THRESHOLD.getValue() + UnitTypeEnums.getNameByCode(SECOND_INSURANCE_REMINDER_THRESHOLD.getUnit()).get(); if (warningTime != null && secondWarningTime != null) { List expiringDays = activeInsurances.stream() .filter(insurance -> insurance.getInsuranceExpireAt() <= warningTime) @@ -105,15 +125,29 @@ public class AlarmsTask { } else { log.warn("Warning time is null, skipping insurance expiration early warning task."); } + + // 已过期保险 + List expiredInsurances = insuranceRepository.findExpiredInsurances(now); + if (!expiredInsurances.isEmpty()) { + expiredInsurances.forEach(this::createInsuranceExpiredAlarm); + // todo 过期保险推送系统消息 + } + + stopWatch.stop(); + log.info("doInsuranceExpirationEarlyWarningTask spend: {}ms", stopWatch.getLastTaskTimeMillis()); } catch (Exception e) { log.error("保险到期预警任务执行失败: {}", e.getMessage()); } } // 服务超时预警 - @Scheduled(fixedRate = 3600000) + @Scheduled(fixedRate = 30000) + @Transactional(rollbackFor = Exception.class) public void serviceExpirationEarlyWarningTask() { try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + long now = System.currentTimeMillis(); // 保险待确认超时 List insuranceWaitConfirmList = orderRepository.findByStatus(OrderStatusEnums.ORDER_STATUS_WAIT_CONFIRM_INSURANCE.getCode()); @@ -122,8 +156,9 @@ public class AlarmsTask { insuranceWaitConfirmList.forEach(order -> { long daysDifference = (now - order.getUt()) / getUnitTimestamp(alarmsParameter.getUnit()); - if (daysDifference % alarmsParameter.getValue() == 0) { - String timeOut = daysDifference + alarmsParameter.getUnit(); + if (daysDifference != 0 && daysDifference % alarmsParameter.getValue() == 0) { + + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(alarmsParameter.getUnit()).get(); createInsuranceWaitConfirmAlarm(order, timeOut); } }); @@ -134,8 +169,8 @@ public class AlarmsTask { AlarmsParameter lossAssessmentParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.LOSSASSESSMENT.name()); waitConfirmLossList.forEach(order -> { long daysDifference = (now - order.getUt()) / getUnitTimestamp(lossAssessmentParameter.getUnit()); - if (daysDifference % lossAssessmentParameter.getValue() == 0) { - String timeOut = daysDifference + lossAssessmentParameter.getUnit(); + if (daysDifference != 0 && daysDifference % lossAssessmentParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(lossAssessmentParameter.getUnit()).get(); String lossUid = order.getLossUid(); User user = userRepository.findByUid(lossUid); createLossAssessmentAlarm(order, timeOut, user.getUserName()); @@ -148,8 +183,8 @@ public class AlarmsTask { AlarmsParameter fixParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.FIX.name()); maintainingList.forEach(order -> { long daysDifference = (now - order.getUt()) / getUnitTimestamp(fixParameter.getUnit()); - if (daysDifference % fixParameter.getValue() == 0) { - String timeOut = daysDifference + fixParameter.getUnit(); + if (daysDifference != 0 && daysDifference % fixParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(fixParameter.getUnit()).get(); String maintainerUid = order.getMaintainerUid(); User user = userRepository.findByUid(maintainerUid); createFixAlarm(order, timeOut, user.getUserName()); @@ -158,12 +193,12 @@ public class AlarmsTask { } // 寄件超时 List waitExpressesList = orderRepository.findByStatus(OrderStatusEnums.ORDER_STATUS_WAITING_CUSTOMER_EXPRESSES.getCode()); - if(!waitExpressesList.isEmpty()){ - AlarmsParameter expressList = alarmsParameterRepository.findByName(AlarmTypeEnums.EXPRESS.name()); + if (!waitExpressesList.isEmpty()) { + AlarmsParameter expressAlarmsParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.EXPRESS.name()); waitExpressesList.forEach(order -> { - long daysDifference = (now - order.getUt()) / getUnitTimestamp(expressList.getUnit()); - if (daysDifference % expressList.getValue() == 0) { - String timeOut = daysDifference + expressList.getUnit(); + long daysDifference = (now - order.getUt()) / getUnitTimestamp(expressAlarmsParameter.getUnit()); + if (daysDifference != 0 && daysDifference % expressAlarmsParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(expressAlarmsParameter.getUnit()).get(); String returnSendUid = order.getReturnSendUid(); User user = userRepository.findByUid(returnSendUid); createExpressAlarm(order, timeOut, user.getUserName()); @@ -172,30 +207,99 @@ public class AlarmsTask { } - // 初版保险资料不齐超时预警:系统后台创建工单从确认收件开始每3个工作日提醒一次,资料驳回修改每2个工作日提醒一次。 - - // 终版资料不齐超时预警:从发送报价开始每5个工作日提醒一次 + // 初版保险资料不齐超时预警 + List firstWaitingSubmit = orderRepository.findByReviewInsuranceStatus(InsuranceStatusEnums.INSURANCE_FIRST_WAITING_SUBMIT.getCode()); + if (!firstWaitingSubmit.isEmpty()) { + AlarmsParameter firstAlarmsParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.INSURANCEFIRSTWAITINGSUBMIT.name()); + firstWaitingSubmit.forEach(order -> { + long daysDifference = (now - order.getUt()) / getUnitTimestamp(firstAlarmsParameter.getUnit()); + if (daysDifference != 0 && daysDifference % firstAlarmsParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(firstAlarmsParameter.getUnit()).get(); + String uid = order.getUid(); + User user = userRepository.findByUid(uid); + createFirstWaitingSubmitAlarm(order, timeOut, user.getUserName()); + } + }); + } + // 初版保险资料驳回修改超时 + List firstRejectList = orderRepository.findByReviewInsuranceStatus(InsuranceStatusEnums.INSURANCE_FIRST_REJECT.getCode()); + if (!firstWaitingSubmit.isEmpty()) { + AlarmsParameter firstRejectParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.FIRSTREJECT.name()); + firstRejectList.forEach(order -> { + long daysDifference = (now - order.getUt()) / getUnitTimestamp(firstRejectParameter.getUnit()); + if (daysDifference != 0 && daysDifference % firstRejectParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(firstRejectParameter.getUnit()).get(); + String uid = order.getUid(); + User user = userRepository.findByUid(uid); + createFirstRejectAlarm(order, timeOut, user.getUserName()); + } + }); + } + // 终版资料不齐超时预警 + List lastWaitingSubmitList = orderRepository.findByReviewInsuranceStatus(InsuranceStatusEnums.INSURANCE_LAST_WAITING_SUBMIT.getCode()); + if (!lastWaitingSubmitList.isEmpty()) { + AlarmsParameter lastWaitingSubmitParameter = alarmsParameterRepository.findByName(AlarmTypeEnums.INSURANCELASTWAITINGSUBMIT.name()); + lastWaitingSubmitList.forEach(order -> { + long daysDifference = (now - order.getUt()) / getUnitTimestamp(lastWaitingSubmitParameter.getUnit()); + if (daysDifference != 0 && daysDifference % lastWaitingSubmitParameter.getValue() == 0) { + String timeOut = daysDifference + UnitTypeEnums.getNameByCode(lastWaitingSubmitParameter.getUnit()).get(); + String uid = order.getUid(); + User user = userRepository.findByUid(uid); + createLastWaitingSubmitAlarm(order, timeOut, user.getUserName()); + } + }); + } // 预付款工单处理预警:第一次6个工作日预警一次,之后每3个工作日预警一次 + + stopWatch.stop(); + log.info("doServiceAlarmTask spend: {}ms", stopWatch.getLastTaskTimeMillis()); } catch (Exception e) { log.error("服务超时预警任务执行失败: {}", e.getMessage()); } } + // 配件库存预警 + @Transactional(rollbackFor = Exception.class) + @Scheduled(fixedRate = 30000) + public void partStockEarlyWarningTask() { + try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + + List stocksWithLowCount = stockRepository.findStocksWithLowCount(); + if (!stocksWithLowCount.isEmpty()) { + stocksWithLowCount.forEach(stock -> { + createStockEarlyWarningAlarm(stock.getStcid(), stock.getPName(), stock.getCount(), stock.getMinLimit()); + }); + } + + + stopWatch.stop(); + log.info("doPartStockEarlyWarningTask spend: {}ms", stopWatch.getLastTaskTimeMillis()); + } catch (Exception e) { + log.error("配件库存预警任务执行失败: {}", e.getMessage()); + } + } + // 项目到期预警 - @Scheduled(fixedRate = 3600000) + @Scheduled(fixedRate = 30000) + @Transactional(rollbackFor = Exception.class) public void projectExpirationEarlyWarningTask() { try { + StopWatch stopWatch = new StopWatch(); + stopWatch.start(); + long now = System.currentTimeMillis(); // 获取首次预警参数信息 AlarmsParameter parameter = alarmsParameterRepository.findByName(AlarmTypeEnums.PROJECT.name()); - String validity = parameter.getValue() + parameter.getUnit(); + String validity = parameter.getValue() + UnitTypeEnums.getNameByCode(parameter.getUnit()).get(); Long warningTime = calculatedWarningTime(parameter); List activeProjects = projectRepository.findActiveProjects(now); // 二次预警参数 Long secondWarningTime = calculatedWarningTime(SECOND_PROJECT_REMINDER_THRESHOLD); - String secondValidity = SECOND_PROJECT_REMINDER_THRESHOLD.getValue() + SECOND_PROJECT_REMINDER_THRESHOLD.getUnit(); + String secondValidity = SECOND_PROJECT_REMINDER_THRESHOLD.getValue() + UnitTypeEnums.getNameByCode(SECOND_PROJECT_REMINDER_THRESHOLD.getUnit()).get(); if (warningTime != null && secondWarningTime != null) { List expiringDays = activeProjects.stream() .filter(project -> project.getEndTime() <= warningTime) @@ -210,6 +314,15 @@ public class AlarmsTask { } else { log.warn("Warning time is null, skipping project expiration early warning task."); } + + // 已经到期项目 + List expiredProjects = projectRepository.findExpiredProjects(now); + if (!expiredProjects.isEmpty()) { + expiredProjects.forEach(this::createProjectExpiredAlarm); + } + + stopWatch.stop(); + log.info("doProjectAlarmTask spend: {}ms", stopWatch.getLastTaskTimeMillis()); } catch (Exception e) { log.error("项目预警任务执行失败: {}", e.getMessage()); } @@ -224,12 +337,31 @@ public class AlarmsTask { alarm.setType(INSURANCE_TYPE); alarm.setContent(generateInsuranceEarlyWarningInformation(insurance.getIid(), validityPeriod)); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.INSURANCEISABOUTTOEXPIRE.getRemark()); + alarm.setIid(insurance.getIid()); + + alarmsRepository.deleteByIid(insurance.getIid()); alarmsRepository.save(alarm); } }); } - // 生成项目预警信息 + // 生成保险过期预警 + private void createInsuranceExpiredAlarm(Insurance insurance) { + if (!alarmsRepository.existsByContent(generateInsuranceExpiredWarningInformation(insurance.getIid()))) { + Alarms alarms = new Alarms(); + alarms.setAlarmid(CommonUtils.uuid()); + alarms.setType(INSURANCE_TYPE); + alarms.setContent(generateInsuranceExpiredWarningInformation(insurance.getIid())); + alarms.setStatus(false); + alarms.setTag(AlarmTypeEnums.INSURANCEEXPIRED.getRemark()); + alarms.setIid(insurance.getIid()); + alarmsRepository.deleteByIid(insurance.getIid()); + alarmsRepository.save(alarms); + } + } + + // 生成项目即将到期预警信息 private void createProjectAlarm(List projects, String validityPeriod) { projects.forEach(project -> { if (!alarmsRepository.existsByContent(generateProjectWarningInformation(project.getPjid(), validityPeriod))) { @@ -238,60 +370,180 @@ public class AlarmsTask { alarm.setType(PROJECT_TYPE); alarm.setContent(generateProjectWarningInformation(project.getPjid(), validityPeriod)); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.PROJECTISABOUTTOEXPIRE.getRemark()); + alarm.setPjid(project.getPjid()); + + alarmsRepository.deleteByPjid(project.getPjid()); + alarmsRepository.save(alarm); } }); } + // 生成项目已到期预警信息 + private void createProjectExpiredAlarm(Project project) { + if (!alarmsRepository.existsByContent(generateProjectExpiredInformation(project.getPjid()))) { + Alarms alarm = new Alarms(); + alarm.setAlarmid(CommonUtils.uuid()); + alarm.setType(PROJECT_TYPE); + alarm.setContent(generateProjectExpiredInformation(project.getPjid())); + alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.PROJECTEXPIRED.getRemark()); + alarm.setPjid(project.getPjid()); + + alarmsRepository.deleteByPjid(project.getPjid()); + + alarmsRepository.save(alarm); + } + } + // 生成保险待确认超时预警信息 private void createInsuranceWaitConfirmAlarm(Order order, String timeOut) { - if (!alarmsRepository.existsByContent(generateInsuranceWaitConfirmWarningInformation(order.getOrdid(), timeOut))) { + if (!alarmsRepository.existsByContent(generateInsuranceWaitConfirmWarningInformation(order.getInnerCode(), timeOut))) { Alarms alarm = new Alarms(); alarm.setAlarmid(CommonUtils.uuid()); alarm.setType(SERVICE_TYPE); - alarm.setContent(generateInsuranceWaitConfirmWarningInformation(order.getOrdid(), timeOut)); + alarm.setContent(generateInsuranceWaitConfirmWarningInformation(order.getInnerCode(), timeOut)); + alarm.setOrdid(order.getOrdid()); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.INSURANCECONFIRM.getRemark()); + alarm.setTag(AlarmTypeEnums.INSURANCECONFIRM.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } alarmsRepository.save(alarm); } } // 生成定损超时预警信息 private void createLossAssessmentAlarm(Order order, String timeOut, String userName) { - if (!alarmsRepository.existsByContent(generateLossAssessmentInformation(order.getOrdid(), timeOut, userName))) { + if (!alarmsRepository.existsByContent(generateLossAssessmentInformation(order.getInnerCode(), timeOut, userName))) { Alarms alarm = new Alarms(); alarm.setAlarmid(CommonUtils.uuid()); alarm.setType(SERVICE_TYPE); - alarm.setContent(generateLossAssessmentInformation(order.getOrdid(), timeOut, userName)); + alarm.setContent(generateLossAssessmentInformation(order.getInnerCode(), timeOut, userName)); + alarm.setOrdid(order.getOrdid()); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.LOSSASSESSMENT.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } alarmsRepository.save(alarm); } } // 生成维修超时预警信息 - private void createFixAlarm(Order order, String validity,String name) { - if (!alarmsRepository.existsByContent(generateFixAlarmInformation(order.getOrdid(),validity,name))) { + private void createFixAlarm(Order order, String validity, String name) { + if (!alarmsRepository.existsByContent(generateFixAlarmInformation(order.getInnerCode(), validity, name))) { Alarms alarm = new Alarms(); alarm.setAlarmid(CommonUtils.uuid()); alarm.setType(SERVICE_TYPE); - alarm.setContent(generateFixAlarmInformation(order.getOrdid(),validity,name)); + alarm.setContent(generateFixAlarmInformation(order.getInnerCode(), validity, name)); + alarm.setOrdid(order.getOrdid()); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.FIX.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } alarmsRepository.save(alarm); } } // 生成寄件超时预警信息 private void createExpressAlarm(Order order, String validity, String userName) { - if (!alarmsRepository.existsByContent(generateExpressAlarmInformation(order.getOrdid(),validity,userName))) { + if (!alarmsRepository.existsByContent(generateExpressAlarmInformation(order.getInnerCode(), validity, userName))) { + Alarms alarm = new Alarms(); + alarm.setAlarmid(CommonUtils.uuid()); + alarm.setType(SERVICE_TYPE); + alarm.setContent(generateExpressAlarmInformation(order.getInnerCode(), validity, userName)); + alarm.setOrdid(order.getOrdid()); + alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.EXPRESS.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } + alarmsRepository.save(alarm); + } + } + + // 生成初版资料提交超时预警信息 + private void createFirstWaitingSubmitAlarm(Order order, String validity, String userName) { + if (!alarmsRepository.existsByContent(generateFirstWaitingSubmitInformation(order.getInnerCode(), validity, userName))) { + Alarms alarm = new Alarms(); + alarm.setAlarmid(CommonUtils.uuid()); + alarm.setType(SERVICE_TYPE); + alarm.setContent(generateFirstWaitingSubmitInformation(order.getInnerCode(), validity, userName)); + alarm.setOrdid(order.getOrdid()); + alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.INSURANCEFIRSTWAITINGSUBMIT.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } + alarmsRepository.save(alarm); + } + } + + // 生成初版驳回修改超时预警信息 + private void createFirstRejectAlarm(Order order, String validity, String userName) { + if (!alarmsRepository.existsByContent(generateFirstRejectAlarmInformation(order.getInnerCode(), validity, userName))) { + Alarms alarm = new Alarms(); + alarm.setAlarmid(CommonUtils.uuid()); + alarm.setType(SERVICE_TYPE); + alarm.setContent(generateFirstRejectAlarmInformation(order.getInnerCode(), validity, userName)); + alarm.setOrdid(order.getOrdid()); + alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.FIRSTREJECT.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } + alarmsRepository.save(alarm); + } + } + + // 生成终版资料提交超时预警信息 + private void createLastWaitingSubmitAlarm(Order order, String validity, String userName) { + if (!alarmsRepository.existsByContent(generateLastWaitingSubmitInformation(order.getInnerCode(), validity, userName))) { Alarms alarm = new Alarms(); alarm.setAlarmid(CommonUtils.uuid()); alarm.setType(SERVICE_TYPE); - alarm.setContent(generateExpressAlarmInformation(order.getOrdid(),validity,userName)); + alarm.setContent(generateLastWaitingSubmitInformation(order.getInnerCode(), validity, userName)); + alarm.setOrdid(order.getOrdid()); + alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.INSURANCELASTWAITINGSUBMIT.getRemark()); + // 写入新预警信息之前 删除该工单ID的旧预警信息 保证最大深度的预警信息 + if (alarmsRepository.existsByOrdid(order.getOrdid())) { + orderRepository.deleteByOrdid(order.getOrdid()); + } + alarmsRepository.save(alarm); + } + } + + // 生成备件库存预警信息 + private void createStockEarlyWarningAlarm(String stcid, String pName, Integer count, Integer minLimit) { + if (!alarmsRepository.existsByContent(generateStockEarlyWarningAlarmInformation(pName, count, minLimit))) { + Alarms alarm = new Alarms(); + alarm.setAlarmid(CommonUtils.uuid()); + alarm.setType(STOCK_TYPE); + alarm.setContent(generateStockEarlyWarningAlarmInformation(pName, count, minLimit)); + alarm.setTag(AlarmTypeEnums.INVENTORYCONTENT.getRemark()); alarm.setStatus(false); + alarm.setTag(AlarmTypeEnums.INVENTORYCONTENT.getRemark()); + + alarm.setStcid(stcid); + + stockRepository.deleteByStcid(stcid); alarmsRepository.save(alarm); } } - private Long calculatedWarningTime(AlarmsParameter parameter) { + + private static Long calculatedWarningTime(AlarmsParameter parameter) { if (parameter.getUnit().equals(UnitTypeEnums.MONTH.getCode())) { return calculateMonthsLater(System.currentTimeMillis(), parameter.getValue()); } @@ -311,33 +563,33 @@ public class AlarmsTask { } - private long calculateMonthsLater(long now, int months) { + private static long calculateMonthsLater(long now, int months) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(now); calendar.add(Calendar.MONTH, months); return calendar.getTimeInMillis(); } - private long calculateWeeksLater(long now, int weeks) { + private static long calculateWeeksLater(long now, int weeks) { return now + weeks * 7 * 24 * 60 * 60 * 1000L; } - private long calculateDaysLater(long now, int days) { + private static long calculateDaysLater(long now, int days) { return now + days * 24 * 60 * 60 * 1000L; } - private long calculateHoursLater(long now, int hours) { + private static long calculateHoursLater(long now, int hours) { return now + hours * 60 * 60 * 1000L; } - private long calculateMinutesLater(long now, int minutes) { + private static long calculateMinutesLater(long now, int minutes) { return now + minutes * 60 * 1000L; } - private long getUnitTimestamp(String unit) { + private static long getUnitTimestamp(String unit) { try { - UnitTypeEnums type = UnitTypeEnums.valueOf(unit); + UnitTypeEnums type = UnitTypeEnums.getUnitTypeEnums(unit); switch (type) { case MONTH: return 30L * 1000 * 60 * 60 * 24; @@ -362,8 +614,21 @@ public class AlarmsTask { return "保险 【" + iid + "】 剩余有效期【" + validity + "】"; } - public static String generateProjectWarningInformation(String pjid, String validity) { - return "项目 【" + pjid + "】 距离结束剩余【" + validity + "】"; + public static String generateInsuranceExpiredWarningInformation(String iid) { + return "保险 【" + iid + "】 已到期"; + } + + public String generateProjectWarningInformation(String pjid, String validity) { + validity = "距离合同到期剩余【" + validity + "】"; + Project project = projectRepository.findByPjid(pjid); + if (project != null) { + return messageService.generateProjectAlarmContent(project, validity); + } + return ""; + } + + public static String generateProjectExpiredInformation(String pjid) { + return "项目 【" + pjid + "】 合同已到期"; } public static String generateInsuranceWaitConfirmWarningInformation(String oid, String validity) { @@ -379,6 +644,22 @@ public class AlarmsTask { } public static String generateExpressAlarmInformation(String oid, String validity, String name) { - return "工单 【" + oid + "】 寄件超时【" + validity + "】,请联系工程师【" + name + "尽快处理!"; + return "工单 【" + oid + "】 寄件超时【" + validity + "】,请联系工程师【" + name + "】尽快处理!"; + } + + public static String generateFirstWaitingSubmitInformation(String oid, String validity, String name) { + return "工单 【" + oid + "】 保险初版资料提交超时【" + validity + "】,请联系用户【" + name + "】尽快处理!"; + } + + public static String generateFirstRejectAlarmInformation(String oid, String validity, String name) { + return "工单 【" + oid + "】 保险初版资料驳回修改超时【" + validity + "】,请联系用户【" + name + "】尽快处理!"; + } + + public static String generateLastWaitingSubmitInformation(String oid, String validity, String name) { + return "工单 【" + oid + "】 保险终版资料提交超时【" + validity + "】,请联系用户【" + name + "】尽快处理!"; + } + + public static String generateStockEarlyWarningAlarmInformation(String pName, Integer count, Integer minLimit) { + return "备件 【" + pName + "】 库存数量【" + count + "】,已经小于下限值【" + minLimit + "】请即时采购!"; } } diff --git a/src/main/java/com/thinglinks/uav/common/constants/MessageConstants.java b/src/main/java/com/thinglinks/uav/common/constants/MessageConstants.java index 908f42bb41800c310b973e5fd6b96e122b9d8ed1..e6310bce80d2c2f9f17cd7144ba0780528cd6b3c 100644 --- a/src/main/java/com/thinglinks/uav/common/constants/MessageConstants.java +++ b/src/main/java/com/thinglinks/uav/common/constants/MessageConstants.java @@ -26,6 +26,8 @@ public class MessageConstants { */ public static final String PERSONAL_ORDER_URL = "/personal/orderDetail?ordid="; + public static final String PROJECT_URL = "/projects/"; + /** * 个人级 */ diff --git a/src/main/java/com/thinglinks/uav/common/enums/InsuranceEnum.java b/src/main/java/com/thinglinks/uav/common/enums/InsuranceEnum.java index f0c54f7daf351121f3218e2247228277747ab9fd..5fd409493a8f7996088a6fec11c67f8716f48d99 100644 --- a/src/main/java/com/thinglinks/uav/common/enums/InsuranceEnum.java +++ b/src/main/java/com/thinglinks/uav/common/enums/InsuranceEnum.java @@ -18,4 +18,12 @@ public enum InsuranceEnum { this.code = code; this.name = name; } -} + public static String getNameByCode(String code) { + for (InsuranceEnum insuranceEnum : InsuranceEnum.values()){ + if (insuranceEnum.getCode().equals(code)){ + return insuranceEnum.getName(); + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/thinglinks/uav/departments/repository/DepartmentsRepository.java b/src/main/java/com/thinglinks/uav/departments/repository/DepartmentsRepository.java index 888d073121d24988d1bea8315e5966b257309ea7..6f1ad0654752c523b7e54be3f84b589e05534c7b 100644 --- a/src/main/java/com/thinglinks/uav/departments/repository/DepartmentsRepository.java +++ b/src/main/java/com/thinglinks/uav/departments/repository/DepartmentsRepository.java @@ -31,4 +31,6 @@ public interface DepartmentsRepository extends JpaRepository ids); Department findByName(String organizationName); + + Department findByDid(String did); } \ No newline at end of file diff --git a/src/main/java/com/thinglinks/uav/insurance/repository/InsuranceRepository.java b/src/main/java/com/thinglinks/uav/insurance/repository/InsuranceRepository.java index 72554292bb2fdf22c668dc0d89aaaf072e5f5f66..cff7ef5c605560ae4d6d225ea3ff591a691a72a8 100644 --- a/src/main/java/com/thinglinks/uav/insurance/repository/InsuranceRepository.java +++ b/src/main/java/com/thinglinks/uav/insurance/repository/InsuranceRepository.java @@ -29,6 +29,9 @@ public interface InsuranceRepository extends JpaRepository, @Query("SELECT i FROM Insurance i WHERE i.insuranceExpireAt >= :now") List findActiveInsurances(@Param("now") Long now); + + @Query("SELECT i FROM Insurance i WHERE i.insuranceExpireAt < :now") + List findExpiredInsurances(@Param("now") Long now); } diff --git a/src/main/java/com/thinglinks/uav/message/service/MessageService.java b/src/main/java/com/thinglinks/uav/message/service/MessageService.java index bf164354aa838c1172f234e918812c1bb04b091a..50a87c07b16044a9326bb8dcfadb431126e09f4d 100644 --- a/src/main/java/com/thinglinks/uav/message/service/MessageService.java +++ b/src/main/java/com/thinglinks/uav/message/service/MessageService.java @@ -1,5 +1,6 @@ package com.thinglinks.uav.message.service; +import com.thinglinks.uav.project.entity.Project; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -71,6 +72,13 @@ public interface MessageService { * @param uidList 接收者ID列表 */ void sendOrderMessage(String title, String content, String level, String ordid, List uidList); + + /** + * 生成项目消息内容 + * @param project 项目 + * @return 消息内容 + */ + String generateProjectAlarmContent(Project project,String content); } diff --git a/src/main/java/com/thinglinks/uav/message/service/impl/MessageServiceImpl.java b/src/main/java/com/thinglinks/uav/message/service/impl/MessageServiceImpl.java index 2544dbc55e1ea07c9769a187331846c163ac6152..b64986e902941b3f5c92de5789860e0d8e366a16 100644 --- a/src/main/java/com/thinglinks/uav/message/service/impl/MessageServiceImpl.java +++ b/src/main/java/com/thinglinks/uav/message/service/impl/MessageServiceImpl.java @@ -9,6 +9,7 @@ import com.thinglinks.uav.message.repository.MessageRepository; import com.thinglinks.uav.message.service.MessageService; import com.thinglinks.uav.order.entity.Order; import com.thinglinks.uav.order.repository.OrderRepository; +import com.thinglinks.uav.project.entity.Project; import com.thinglinks.uav.system.config.CustomConfig; import com.thinglinks.uav.user.entity.User; import com.thinglinks.uav.user.repository.UserRepository; @@ -101,6 +102,20 @@ public class MessageServiceImpl implements MessageService { messageService.sendMessage(title, content, MessageConstants.TYPE_ORDER, level, ordid, uidList); } + /** + * @param project 项目 + * @return + */ + @Override + public String generateProjectAlarmContent(Project project,String content) { + if (project != null) { + String url = buildProjectUrl(project, MessageConstants.PROJECT_URL); + content = "
项目" + "【" + url + "】" + content +"
"; + return content; + } + return ""; + } + /** * 根据级别和接收者ID获取用户ID列表 */ @@ -141,6 +156,17 @@ public class MessageServiceImpl implements MessageService { return String.format("%s", jumpUrl, order.getOrdid(), innerCode); } + /** + * 构造项目详情跳转链接 + */ + private String buildProjectUrl(Project project, String jumpUrl) { + String pjid = project.getPjid(); +// jumpUrl = "http://" + customConfig.getUavServiceIp() + jumpUrl; + return String.format("%s", jumpUrl, project.getPjid(), project.getName()); + } + + + } diff --git a/src/main/java/com/thinglinks/uav/order/repository/OrderRepository.java b/src/main/java/com/thinglinks/uav/order/repository/OrderRepository.java index 154d4eedc1f283266f74c09fbaf8ec2b70b67744..b37455ed9cb1b19122d541cb538d504b02451b61 100644 --- a/src/main/java/com/thinglinks/uav/order/repository/OrderRepository.java +++ b/src/main/java/com/thinglinks/uav/order/repository/OrderRepository.java @@ -63,4 +63,6 @@ public interface OrderRepository extends JpaRepository, JpaSpeci boolean existsByCidIn(List ids); List findByStatus(String status); + + List findByReviewInsuranceStatus(String reviewInsuranceStatus); } diff --git a/src/main/java/com/thinglinks/uav/project/repository/ProjectRepository.java b/src/main/java/com/thinglinks/uav/project/repository/ProjectRepository.java index 1deb1197a1cb407ef722c975351b676ff872aa39..cb143823385bc3d6941b0a02596590b2b9c506b6 100644 --- a/src/main/java/com/thinglinks/uav/project/repository/ProjectRepository.java +++ b/src/main/java/com/thinglinks/uav/project/repository/ProjectRepository.java @@ -32,4 +32,7 @@ public interface ProjectRepository extends JpaRepository , Jpa @Query("SELECT p FROM Project p WHERE p.endTime >= :now") List findActiveProjects(@Param("now") Long now); + + @Query("SELECT p FROM Project p WHERE p.endTime < :now") + List findExpiredProjects(@Param("now") Long now); } diff --git a/src/main/java/com/thinglinks/uav/stock/repository/StockRepository.java b/src/main/java/com/thinglinks/uav/stock/repository/StockRepository.java index 0b7c17801b6b721b96f6d32a729aa7172b622880..a4e17ee593cec879e452c433379ad7d44ce49ae7 100644 --- a/src/main/java/com/thinglinks/uav/stock/repository/StockRepository.java +++ b/src/main/java/com/thinglinks/uav/stock/repository/StockRepository.java @@ -3,6 +3,7 @@ package com.thinglinks.uav.stock.repository; import com.thinglinks.uav.stock.entity.Stock; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; import java.util.List; @@ -19,4 +20,9 @@ public interface StockRepository extends JpaRepository, JpaSpecific boolean existsByPidIn(List pidList); List findByStoreid(String storeId); + + @Query("SELECT s FROM Stock s WHERE s.count < s.minLimit") + List findStocksWithLowCount(); + + void deleteByStcid(String stcId); } diff --git a/src/test/java/com/thinglinks/uav/RepositoryTest.java b/src/test/java/com/thinglinks/uav/RepositoryTest.java index 16fd1e2aceb2886dd1793c023e8245fde0bb5619..bb78c7288421fa40b217b949529ce266978d1c52 100644 --- a/src/test/java/com/thinglinks/uav/RepositoryTest.java +++ b/src/test/java/com/thinglinks/uav/RepositoryTest.java @@ -2,6 +2,7 @@ package com.thinglinks.uav; import com.thinglinks.uav.address.repository.AddressRepository; import com.thinglinks.uav.alarms.dto.AlarmsCount; +import com.thinglinks.uav.alarms.entity.Alarms; import com.thinglinks.uav.alarms.entity.AlarmsParameter; import com.thinglinks.uav.alarms.repository.AlarmsParameterRepository; import com.thinglinks.uav.alarms.repository.AlarmsRepository; @@ -173,7 +174,7 @@ public class RepositoryTest { @Test public void repositoryTest() { - List ordersWithInsurancePendingConfirmation = orderRepository.findByStatus("0001"); - System.out.println(ordersWithInsurancePendingConfirmation.size()); + Alarms byAlarmid = alarmsRepository.findByAlarmid("15a565400aee4a1dbf4b2d6bc0fd14c5"); + System.out.println(byAlarmid); } }