diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatAgreement.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatAgreement.java new file mode 100644 index 0000000..636614c --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatAgreement.java @@ -0,0 +1,69 @@ +package com.evotech.hd.common.core.entity.resource; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @author zrb + * @since 2024-12-21 + */ +@TableName("yt_setting_wechat_agreement") +@Schema(name = "微信协议") +@Data +public class WechatAgreement implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "pk_id", type = IdType.AUTO) + @Schema(hidden = true) + private Integer pkId; + + private String appid; + + @Schema(description = "类型:1-服务条款,2-隐私协议", requiredMode = RequiredMode.REQUIRED) + @NotNull + private Integer type; + + @Schema(description = "标题", requiredMode = RequiredMode.REQUIRED) + @NotBlank + private String title; + + @Schema(description = "协议内容", requiredMode = RequiredMode.REQUIRED) + @NotBlank + private String content; + + @Schema(description = "版本") + private String version; + + @Schema(description = "状态:1-可用,0-不可用") + private Integer status; + + @Schema(description = "创建人", hidden = true) + private String creater; + + @Schema(description = "创建时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date ctime; + + @Schema(description = "更新人", hidden = true) + private String updater; + + @Schema(description = "更新时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date uptime; +} diff --git a/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatSwiper.java b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatSwiper.java new file mode 100644 index 0000000..671d5c1 --- /dev/null +++ b/base-commons/common-core/src/main/java/com/evotech/hd/common/core/entity/resource/WechatSwiper.java @@ -0,0 +1,69 @@ +package com.evotech.hd.common.core.entity.resource; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author zrb + * @since 2024-12-21 + */ +@Data +@TableName("yt_setting_wechat_swiper") +@Schema(name = "微信轮播图设置") +public class WechatSwiper implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "pk_id", type = IdType.AUTO) + @Schema(hidden = true) + private Integer pkId; + + private String appid; + + @Schema(description = "类型:1-logo,2-轮播图") + private Integer type; + + @Schema(description = "名称") + private String name; + + @Schema(description = "图片地址") + private String picUrl; + + @Schema(description = "排序") + private Integer sort; + + @Schema(description = "链接标识") + private Integer linkFlag; + + @Schema(description = "外链地址") + private String outLinks; + + @Schema(description = "状态:1-可用,0-不可用") + private Integer status; + + @Schema(description = "创建人", hidden = true) + private String creater; + + @Schema(description = "创建时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date ctime; + + @Schema(description = "更新人", hidden = true) + private String updater; + + @Schema(description = "更新时间", hidden = true) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") + private Date uptime; +} diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/MqttMessageTestController.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/MqttMessageTestController.java index 59fb88c..7729547 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/MqttMessageTestController.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/controller/test/MqttMessageTestController.java @@ -14,6 +14,7 @@ import com.evotech.hd.cloud.mqtt.enums.StateFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.order.OrderByPlateNumReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatus; +import com.evotech.hd.cloud.mqtt.message.dto.newer.state.SwapStep; import com.evotech.hd.common.core.entity.Result; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; @@ -72,6 +73,21 @@ public class MqttMessageTestController { return new Result().success("OK"); } + + @Operation(summary = "反馈换电步骤") + @PostMapping("/swapStep") + @ApiOperationSupport(order = 3) + public Result swapStep(@ParameterObject SwapStep swapStep, String stationCode) { + + JSONObject jo = JSONUtil.parseObj(swapStep); + + String topic = mqttTestUtil.getTopic(stationCode, MqttMessageTypeEnum.STATE.getType()); + MqttMessageHeader header = mqttTestUtil.getHeader(StateFunctionTypesEnum.FUN_SWAPSTEP.getFunction()); + + mqttTestUtil.publishMessage(stationCode, jo, topic, header); + + return new Result().success("OK"); + } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatus.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatus.java index b18f44c..996c8e3 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatus.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/OrderStatus.java @@ -4,6 +4,7 @@ import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** @@ -16,8 +17,9 @@ public class OrderStatus { private Integer status; + @Schema(description = "时间", example = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date statusTime; - private OrderStatusData statusDate; + private OrderStatusData statusData; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/SwapStep.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/SwapStep.java index 7a9f016..921d209 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/SwapStep.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/dto/newer/state/SwapStep.java @@ -2,6 +2,9 @@ package com.evotech.hd.cloud.mqtt.message.dto.newer.state; import java.util.Date; +import org.springframework.format.annotation.DateTimeFormat; + +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; /** @@ -14,6 +17,8 @@ public class SwapStep { private Integer step; + @Schema(description = "时间", example = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date stepTime; } diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java index c30f7d6..35d25cc 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/mqtt/message/handle/StateMessageService.java @@ -49,7 +49,7 @@ public class StateMessageService { switch (StateFunctionTypesEnum.getFunctionType(header.getFunction())) { case FUN_ORDERSTATUS: OrderStatus orderStatus = JSONUtil.toBean(dataBody, OrderStatus.class); - OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusDate"), OrderStatusData.class); + OrderStatusData statusData = JSONUtil.toBean(dataBody.getJSONObject("statusData"), OrderStatusData.class); handleOrderStatus(orderStatus, statusData); break; @@ -83,8 +83,14 @@ public class StateMessageService { case 3: // 修改订单状态和数据 OrderSwapBattery osb = alterOrderStatus(orderStatus, statusData); - // 换电步骤添加最后一条 TODO - + // 换电步骤添加最后一条 + OrderSwapBatteryStep step = new OrderSwapBatteryStep(); + step.setOrderNo(orderStatus.getOrderNo()); + step.setStep(8); + step.setStepTime(orderStatus.getStatusTime()); + step.setCtime(new Date()); + step.setCreater("SYS"); + orderSwapBatteryStepDao.insert(step); // 添加2块电池的溯源记录 addBatteryTrace(orderStatus, statusData, osb); break; diff --git a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java index 6932ebe..c9bccb4 100644 --- a/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java +++ b/cloud-manage-server/src/main/java/com/evotech/hd/cloud/service/impl/BatteryStationDcServiceImpl.java @@ -30,9 +30,18 @@ public class BatteryStationDcServiceImpl implements BatteryStationDcService { @Override public Result add(BatteryStationDc bsdc) { - bsdc.setCtime(new Date()); + Date d = new Date(); + bsdc.setCtime(d); int n = batteryStationDcDao.insert(bsdc); if (n == 1) { + BatteryTrace bt = new BatteryTrace(); + bt.setBatCode(bsdc.getBatCode()); + bt.setBeginTime(d); + bt.setCreater("SYS"); + bt.setPointType(bsdc.getSourceFrom()); + bt.setPointCode(bt.getPointType() == 1? bsdc.getStationCode():bsdc.getSourceCode()); + bt.setPointName(bt.getPointType() == 1? bsdc.getStationName():""); + addTrace(bt); return new Result().success(n); } return new Result().error("添加电池出错!"); diff --git a/pom.xml b/pom.xml index 82bee49..be7bff9 100644 --- a/pom.xml +++ b/pom.xml @@ -45,7 +45,8 @@ 2.2.23 3.4.0 5.3.0 - 2.4.1 + 2.4.2 + 8.5.14 @@ -148,6 +149,11 @@ xxl-job-core ${xxl-job.version} + + io.minio + minio + ${minio.version} + diff --git a/resource-server/pom.xml b/resource-server/pom.xml index 450e0af..419a02b 100644 --- a/resource-server/pom.xml +++ b/resource-server/pom.xml @@ -57,6 +57,11 @@ cn.hutool hutool-json + + + io.minio + minio + diff --git a/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfig.java b/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfig.java new file mode 100644 index 0000000..b38c185 --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfig.java @@ -0,0 +1,30 @@ +package com.evotech.hd.resource.config.minio; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import io.minio.MinioClient; +import jakarta.annotation.Resource; + + +@Configuration +@EnableConfigurationProperties({MinIOConfigProperties.class}) +@ConditionalOnProperty(prefix = "yt.minio", name = "enable", matchIfMissing = false) +public class MinIOConfig { + + @Resource + private MinIOConfigProperties minIOConfigProperties; + + @Bean + MinioClient buildMinioClient() { + return MinioClient + .builder() + .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey()) + .endpoint(minIOConfigProperties.getEndpoint()) + + .build(); + } + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfigProperties.java b/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfigProperties.java new file mode 100644 index 0000000..b8008e0 --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/config/minio/MinIOConfigProperties.java @@ -0,0 +1,26 @@ +package com.evotech.hd.resource.config.minio; + +import java.io.Serializable; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; + +import lombok.Data; + + +@ConditionalOnProperty(prefix = "yt.minio", name = "enable", matchIfMissing = false) +@ConfigurationProperties(prefix = "yt.minio", ignoreUnknownFields = true) +@Data +public class MinIOConfigProperties implements Serializable { + + private static final long serialVersionUID = 2706961148421781695L; + + private String accessKey; + private String secretKey; + private String bucket; + private String endpoint; + private String folderCloud; + private String folderWechat; + private String urlPrefix; + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/controller/FileUpLoadController.java b/resource-server/src/main/java/com/evotech/hd/resource/controller/FileUpLoadController.java index 1a63d80..f316090 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/controller/FileUpLoadController.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/controller/FileUpLoadController.java @@ -23,6 +23,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; @Tag(name = "上传接口") @ApiSupport(order = 150) @@ -70,4 +71,21 @@ public class FileUpLoadController { return fileUpLoadService.fileUpLoad(file, user, isAlterRandomName); } + + @Operation(summary = "图片文件上传, 设置微信先用这个") + @PostMapping("/img/upload") + @ApiOperationSupport(order = 6) + public Result imgUpLoad(@RequestPart MultipartFile file, @RequestParam Integer useFor) { + return fileUpLoadService.imgUpLoad(file, useFor); + } + + + @Operation(summary = "图片文件删除, 设置微信先用这个") + @PostMapping("/img/del") + @ApiOperationSupport(order = 7) + public Result imgDelete(@NotBlank @RequestParam String url) { + return fileUpLoadService.imgDelete(url); + } + + } diff --git a/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatAgreementController.java b/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatAgreementController.java new file mode 100644 index 0000000..8162da7 --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatAgreementController.java @@ -0,0 +1,6 @@ +package com.evotech.hd.resource.controller; + + +public class WechatAgreementController { + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatSwiperController.java b/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatSwiperController.java new file mode 100644 index 0000000..2fe5679 --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/controller/WechatSwiperController.java @@ -0,0 +1,5 @@ +package com.evotech.hd.resource.controller; + +public class WechatSwiperController { + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatAgreementDao.java b/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatAgreementDao.java new file mode 100644 index 0000000..7a3309b --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatAgreementDao.java @@ -0,0 +1,12 @@ +package com.evotech.hd.resource.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.common.core.entity.resource.WechatAgreement; + +/** + * @author zrb + * @since 2024-12-21 + */ +public interface WechatAgreementDao extends BaseMapper { + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatSwiperDao.java b/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatSwiperDao.java new file mode 100644 index 0000000..45a7bf7 --- /dev/null +++ b/resource-server/src/main/java/com/evotech/hd/resource/dao/WechatSwiperDao.java @@ -0,0 +1,12 @@ +package com.evotech.hd.resource.dao; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evotech.hd.common.core.entity.resource.WechatSwiper; + +/** + * @author zrb + * @since 2024-12-21 + */ +public interface WechatSwiperDao extends BaseMapper { + +} diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/FileUpLoadService.java b/resource-server/src/main/java/com/evotech/hd/resource/service/FileUpLoadService.java index d252eaa..f995fd6 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/FileUpLoadService.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/FileUpLoadService.java @@ -20,4 +20,8 @@ public interface FileUpLoadService { public Result delete(String filePath, Integer fileId, String logId); public Result fileUpLoad(MultipartFile file, String user, Boolean isAlterRandomName); + + public Result imgUpLoad(MultipartFile file, Integer useFor); + + public Result imgDelete(String url); } diff --git a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/FileUpLoadServiceImpl.java b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/FileUpLoadServiceImpl.java index fd5a789..82ac469 100644 --- a/resource-server/src/main/java/com/evotech/hd/resource/service/impl/FileUpLoadServiceImpl.java +++ b/resource-server/src/main/java/com/evotech/hd/resource/service/impl/FileUpLoadServiceImpl.java @@ -1,6 +1,8 @@ package com.evotech.hd.resource.service.impl; import java.io.File; +import java.io.InputStream; +import java.net.URL; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -16,6 +18,7 @@ import com.evotech.hd.common.core.entity.resource.LogUpload; import com.evotech.hd.common.core.entity.resource.UploadFile; import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.utils.SnowflakeUtil; +import com.evotech.hd.resource.config.minio.MinIOConfigProperties; import com.evotech.hd.resource.dao.LogUploadDao; import com.evotech.hd.resource.dao.UploadFileDao; import com.evotech.hd.resource.entity.request.ListFileRequest; @@ -26,6 +29,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; +import io.minio.MinioClient; +import io.minio.PutObjectArgs; +import io.minio.RemoveObjectArgs; import jakarta.annotation.Resource; @Service @@ -35,6 +42,12 @@ public class FileUpLoadServiceImpl implements FileUpLoadService { private UploadFileDao uploadFileDao; @Resource private LogUploadDao uploadLogDao; + @Resource + private MinioClient minioClient; + @Resource + private MinIOConfigProperties minIOConfigProperties; + + @Value("${yt.file.file-path}") private String filePath; @@ -191,4 +204,50 @@ public class FileUpLoadServiceImpl implements FileUpLoadService { return new Result().success(url); } + @Override + public Result imgUpLoad(MultipartFile file, Integer useFor) { + // 重命名 + String fileFinalName = IdUtil.fastSimpleUUID() + "." + FileUtil.extName(file.getOriginalFilename()); + // 上传 + String filePath = useFor == 1 ? minIOConfigProperties.getFolderWechat() : minIOConfigProperties.getFolderCloud(); + String filePathName = filePath + "/" + fileFinalName; + try { + InputStream inputStream = file.getInputStream(); + PutObjectArgs putObjectArgs = PutObjectArgs.builder() + .bucket(minIOConfigProperties.getBucket()) + .object(filePathName) + .contentType(file.getContentType()) + .stream(inputStream, file.getSize(), -1) + .build(); + minioClient.putObject(putObjectArgs); + inputStream.close(); + String url = minIOConfigProperties.getUrlPrefix() + minIOConfigProperties.getBucket() + "/" + filePathName; + return new Result().success(url); + } catch (Exception e) { + e.printStackTrace(); + return new Result().error("上传文件失败:" + e.getMessage()); + } + } + + @Override + public Result imgDelete(String url) { + URL urlU = URLUtil.url(url); + String path = urlU.getPath().substring(1); + int index = path.indexOf("/"); + String bucket = path.substring(0, index); + String filePathName = path.substring(index + 1); + // 删除Objects + RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder() + .bucket(bucket) + .object(filePathName) + .build(); + try { + minioClient.removeObject(removeObjectArgs); + return new Result().success("OK"); + } catch (Exception e) { + e.printStackTrace(); + return new Result().error("删除失败:" + e.getMessage()); + } + } + } diff --git a/resource-server/src/test/java/com/evotech/hd/resource/Test1.java b/resource-server/src/test/java/com/evotech/hd/resource/Test1.java new file mode 100644 index 0000000..59caf20 --- /dev/null +++ b/resource-server/src/test/java/com/evotech/hd/resource/Test1.java @@ -0,0 +1,13 @@ +package com.evotech.hd.resource; + +import cn.hutool.core.util.URLUtil; + +public class Test1 { + + public static void main(String[] args) { + String url = "https://static.evo-techina.com/ythd/oauth2.png"; + System.out.println(URLUtil.getHost(URLUtil.url(url))); + System.out.println(URLUtil.getDecodedPath(URLUtil.url(url))); + } + +}