From 2855ae89d2ab6268e1edc42c3e9d7e73c8e7259e Mon Sep 17 00:00:00 2001 From: luodangjia <luodangjia> Date: 星期二, 03 九月 2024 10:09:24 +0800 Subject: [PATCH] 8.9 --- ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/UnsupportProtocolException.java | 15 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/ReassinDto.java | 10 ruoyi-service/ruoyi-worker/pom.xml | 6 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java | 10 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java | 5 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/SSLCipherSuiteUtil.java | 209 +++++++++ ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/AppMapper.java | 17 ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yaml | 4 ruoyi-service/ruoyi-admin/libs/java-sdk-core-3.2.5.jar | 0 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/HostName.java | 17 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/PageDto.java | 9 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/AppMapper.java | 16 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java | 54 ++ ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/RegionController.java | 44 + ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java | 7 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/AppVersion.java | 45 ++ ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/AppVersion.java | 49 ++ ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java | 1 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryRequest.java | 3 ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java | 4 ruoyi-service/ruoyi-user/src/main/resources/bootstrap.yaml | 4 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/HomePageController.java | 4 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryRequest.java | 2 ruoyi-service/ruoyi-admin/src/main/resources/template/订单记录.xlsx | 0 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java | 98 ++- ruoyi-service/ruoyi-admin/src/main/resources/bootstrap.yaml | 4 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ALiSendSms.java | 62 ++ ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/MultipartFileDto.java | 189 ++++++++ ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryVO.java | 3 ruoyi-gateway/src/main/resources/bootstrap.yml | 4 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/Constant.java | 24 + ruoyi-service/ruoyi-admin/pom.xml | 19 ruoyi-auth/src/main/resources/bootstrap.yml | 8 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java | 2 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/DescribeInstances.java | 2 ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml | 8 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryVO.java | 1 ruoyi-service/ruoyi-worker/src/main/resources/bootstrap.yaml | 4 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/SendSmsServiceImpl.java | 7 ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/MyDateObjectHandler.java | 4 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml | 44 + ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/MasterWorkerController.java | 13 ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/utils/FileImageWatermarkUtils.java | 276 ++++++++++++ 43 files changed, 1,249 insertions(+), 58 deletions(-) diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryRequest.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryRequest.java index a6275c3..4b20406 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryRequest.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryRequest.java @@ -54,6 +54,7 @@ @ApiModelProperty("站点名称") private String serveName; + private String address; @ApiModelProperty(value = "页码", required = true) private Integer pageNum = 1; @@ -61,6 +62,7 @@ @ApiModelProperty(value = "订单类型0:正常订单,1:后台订单") private Integer type ; + private Integer fake ; @ApiModelProperty(value = "每页显示条数", required = true) private Integer pageSize = 10; diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryVO.java index 71d50e7..846d18b 100644 --- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryVO.java +++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/entity/OrderQueryVO.java @@ -23,5 +23,8 @@ @ApiModelProperty("订单数量") private Integer number; + private Integer fakeNumber; + private Integer fakeCount; + } diff --git a/ruoyi-auth/src/main/resources/bootstrap.yml b/ruoyi-auth/src/main/resources/bootstrap.yml index c905ced..aaabcef 100644 --- a/ruoyi-auth/src/main/resources/bootstrap.yml +++ b/ruoyi-auth/src/main/resources/bootstrap.yml @@ -23,16 +23,20 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: jdhs_nacos! username: nacos - password: jdhs_nacos! + password: nacos config: # 配置中心地址 server-addr: localhost:8848 group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: jdhs_nacos! username: nacos - password: jdhs_nacos! + password: nacos name: ${spring.application.name} # 配置文件格式 file-extension: yml diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java index 3fafc20..22df5c7 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java @@ -265,7 +265,7 @@ /** * 数字 3000 */ - public static final Integer THREE_THOUSAND = 3000; + public static final Integer THREE_THOUSAND = 2000; /** * 师傅端默认用户ID前缀 @@ -300,6 +300,6 @@ /** * 手机号码正则 */ - public static final String PHONE = "^1[345789]\\d{9}$"; + public static final String PHONE = "^1[3456789]\\d{9}$"; } diff --git a/ruoyi-gateway/src/main/resources/bootstrap.yml b/ruoyi-gateway/src/main/resources/bootstrap.yml index 2fac5b9..f2398b9 100644 --- a/ruoyi-gateway/src/main/resources/bootstrap.yml +++ b/ruoyi-gateway/src/main/resources/bootstrap.yml @@ -19,6 +19,8 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 + username: nacos + password: nacos # username: nacos # password: jdhs_nacos! config: @@ -28,6 +30,8 @@ namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 name: ${spring.application.name} # 线上nacos需要鉴权 + username: nacos + password: nacos # username: nacos # password: jdhs_nacos! # 配置文件格式 diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml index b3c6d29..ec2a7bf 100644 --- a/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml +++ b/ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml @@ -23,16 +23,20 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: jdhs_nacos! username: nacos - password: jdhs_nacos! + password: nacos config: # 配置中心地址 server-addr: 127.0.0.1:8848 group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: jdhs_nacos! username: nacos - password: jdhs_nacos! + password: nacos name: ${spring.application.name} # 配置文件格式 file-extension: yml diff --git a/ruoyi-service/ruoyi-admin/libs/java-sdk-core-3.2.5.jar b/ruoyi-service/ruoyi-admin/libs/java-sdk-core-3.2.5.jar new file mode 100644 index 0000000..652fb6b --- /dev/null +++ b/ruoyi-service/ruoyi-admin/libs/java-sdk-core-3.2.5.jar Binary files differ diff --git a/ruoyi-service/ruoyi-admin/pom.xml b/ruoyi-service/ruoyi-admin/pom.xml index 644800f..cc03a02 100644 --- a/ruoyi-service/ruoyi-admin/pom.xml +++ b/ruoyi-service/ruoyi-admin/pom.xml @@ -18,6 +18,19 @@ </properties> <dependencies> + <dependency> + <groupId>org.openeuler</groupId> + <artifactId>bgmprovider</artifactId> + <version>1.0.4</version> + <exclusions> + <exclusion> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + </exclusion> + </exclusions> + </dependency> + + <!-- <dependency>--> <!-- <groupId>com.tencentcloudapi</groupId>--> <!-- <artifactId>tencentcloud-sdk-java</artifactId>--> @@ -48,7 +61,11 @@ <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-starter-websocket</artifactId>--> <!-- </dependency>--> - + <dependency> + <groupId>com.aliyun</groupId> + <artifactId>aliyun-java-sdk-core</artifactId> + <version>4.4.3</version> + </dependency> <dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/MyDateObjectHandler.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/MyDateObjectHandler.java index b6c0c71..f524b37 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/MyDateObjectHandler.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/config/MyDateObjectHandler.java @@ -30,8 +30,8 @@ // 更新时间 this.setFieldValByName("updateTime", new Date(), metaObject); // 创建人 - this.setFieldValByName("createBy", "", metaObject); - this.setFieldValByName("updateBy", "", metaObject); +// this.setFieldValByName("createBy", "", metaObject); +// this.setFieldValByName("updateBy", "", metaObject); // 是否软删除 this.setFieldValByName("isDelete", 0, metaObject); // 是否启用 默认启用 diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/HomePageController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/HomePageController.java index 86e88b6..b4d9189 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/HomePageController.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/HomePageController.java @@ -140,6 +140,10 @@ // cityList.addAll(loginUser.getCityList()); } } + List<MasterWorkerRankVO> masterWorkerRankVOS = masterWorkerService.workerRanking(cityList); + if (masterWorkerRankVOS.size()>10){ + return R.ok(masterWorkerRankVOS.subList(0,10)); + } return R.ok(masterWorkerService.workerRanking(cityList)); } diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java index 561b7b1..40552ab 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/OrderController.java @@ -12,6 +12,8 @@ import com.ruoyi.admin.utils.OcrBase; import com.ruoyi.admin.vo.OrderByServeRecordVO; import com.ruoyi.admin.vo.OrderDetailVO; +import com.ruoyi.admin.vo.OrderReasinDto; +import com.ruoyi.admin.vo.ReassinDto; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.domain.R; @@ -52,6 +54,7 @@ import java.math.BigDecimal; import java.nio.file.Files; import java.nio.file.Paths; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -119,7 +122,13 @@ }) public R<OrderDetailVO> orderDetail(@RequestParam String id) { // 独立orderService - return R.ok(orderService.orderListDetail(id)); + OrderDetailVO orderDetailVO = orderService.orderListDetail(id); + if (orderDetailVO.getServeRecordInfo().getPhoto()!=null&&!orderDetailVO.getServeRecordInfo().getPhoto().isEmpty()){ + if (orderDetailVO.getServeRecordInfo().getPhoto().get(0).equals("")){ + orderDetailVO.getServeRecordInfo().setPhoto(null); + } + } + return R.ok(orderDetailVO); } @Resource private RecoveryClassifyService recoveryClassifyService; @@ -239,6 +248,7 @@ .eq(MasterWorker::getIsDelete, 0).one(); order.setServerName(masterWorker.getRealName()); order.setServerPhone(masterWorker.getPhone()); + order.setAcceptTime(new Date()); // 待上门 order.setState(Constants.ONE); } else { @@ -334,7 +344,7 @@ */ @RequiresPermissions("order_reassignment") @ApiOperation(value = "订单列表-订单派单/改派", tags = {"后台-订单管理"}) - @GetMapping(value = "/reassignment") + @PostMapping(value = "/reassignment") @ApiImplicitParams({ @ApiImplicitParam(value = "操作类型(1:订单派单;2:订单改派)", name = "type", dataType = "Integer", required = true), @ApiImplicitParam(value = "订单id", name = "orderId", dataType = "Integer", required = true), @@ -342,44 +352,43 @@ @ApiImplicitParam(value = "改派原因", name = "applyReason", dataType = "String") }) @Transactional(rollbackFor = Exception.class) - public R<String> reassignment(@RequestParam Integer type, @RequestParam String orderIds, - @RequestParam Integer workerId, String applyReason) { - String[] split = orderIds.split(","); - for (String orderId : split) { + public R<String> reassignment(@RequestBody OrderReasinDto orderReasinDto) { +// String[] split = orderIds.split(","); + for (ReassinDto orderId : orderReasinDto.getReassinDtos()) { MasterWorker masterWorker = masterWorkerService.lambdaQuery() - .eq(MasterWorker::getId, workerId) + .eq(MasterWorker::getId, orderReasinDto.getWorkerId()) .eq(MasterWorker::getIsDelete, 0).one(); - Order item = orderClient.detail(orderId).getData(); - Order order = orderClient.exchangeOrder(type, orderId, workerId, + Order item = orderClient.detail(orderId.getOrderId()).getData(); + Order order = orderClient.exchangeOrder(orderId.getType(), orderId.getOrderId(), orderReasinDto.getWorkerId(), masterWorker.getRealName(), masterWorker.getPhone()).getData(); // 订单派单 boolean result = true; - if (Constants.TWO.equals(type)) { + if (Constants.TWO.equals(orderId.getType())) { if (order.getState().equals(Constants.SIX) || order.getState().equals(Constants.THREE)) { orderClient.updateState(order.getId(), Constants.ONE); } // 订单状态为 待完工时,需要更改状态 待上门且清空师傅到达预约点时间 if (order.getState().equals(Constants.TWO)) { - orderClient.updateStateAndArrivalTime(orderId, Constants.ONE); + orderClient.updateStateAndArrivalTime(orderId.getOrderId(), Constants.ONE); } // 生成改派信息 - ChangeDispatch changeDispatch = new ChangeDispatch(); - changeDispatch.setWorkerId(item.getServerId()); - changeDispatch.setWorkerName(item.getServerName()); - changeDispatch.setApplyReason(applyReason); - changeDispatch.setApplyTime(new Date()); - changeDispatch.setState(Constants.ONE); - changeDispatch.setOrderId(orderId); - changeDispatch.setOrderNumber(item.getOrderNumber()); - if (null != item.getUserId()) { - changeDispatch.setUserId(item.getUserId()); - } - changeDispatch.setUserName(item.getReservationName()); - changeDispatch.setIsDelete(Constants.ZERO); - result = dispatchClient.saveRecord(changeDispatch).getData(); +// ChangeDispatch changeDispatch = new ChangeDispatch(); +// changeDispatch.setWorkerId(item.getServerId()); +// changeDispatch.setWorkerName(item.getServerName()); +// changeDispatch.setApplyReason(orderReasinDto.getApplyReason()); +// changeDispatch.setApplyTime(new Date()); +// changeDispatch.setState(Constants.ONE); +// changeDispatch.setOrderId(orderId.getOrderId()); +// changeDispatch.setOrderNumber(item.getOrderNumber()); +// if (null != item.getUserId()) { +// changeDispatch.setUserId(item.getUserId()); +// } +// changeDispatch.setUserName(item.getReservationName()); +// changeDispatch.setIsDelete(Constants.ZERO); +// result = dispatchClient.saveRecord(changeDispatch).getData(); } - ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(workerId)); + ChannelHandlerContext context = NettyChannelMap.getData(String.valueOf(orderReasinDto.getWorkerId())); if (null != context) { NettyWebSocketController.sendMsgToClient(context, "您有一条新的订单,请注意查收!"); } @@ -419,6 +428,14 @@ @ApiOperation(value = "订单列表-excel导出", tags = {"后台-订单管理"}) @PostMapping(value = "/excelExport") public R<String> excelExport(@RequestBody OrderQueryRequest orderQueryRequest, HttpServletResponse response) { + List<Integer> servIds = new ArrayList<>(); + if (orderQueryRequest.getClassNameId()!=null){ + List<Integer> classIds = recoveryClassifyService.lambdaQuery().eq(RecoveryClassify::getId, orderQueryRequest.getClassNameId()).list().stream().map(RecoveryClassify::getId).collect(Collectors.toList()); + servIds = recoveryServeService.lambdaQuery().eq(BaseEntity::getIsDelete,0).in(RecoveryServe::getClassifyId, classIds).list().stream().map(RecoveryServe::getId).collect(Collectors.toList()); + } + orderQueryRequest.setServIds(servIds); + + R<List<Order>> result = orderClient.excelExport(orderQueryRequest); // 独立orderService return orderService.excelExport(result.getData(), response); @@ -440,6 +457,10 @@ @PostMapping (value = "/ocr") public R<JSONObject> ocr(String ocrAddress) { return R.ok(DescribeInstances.ocr(ocrAddress)); + } + + public static void main(String[] args) { + System.out.println(LocalDateTime.now().plusMonths(1)); } /** @@ -531,7 +552,7 @@ private RedisService redisService; @ApiOperation(value = "地图统计", tags = {"后台-订单管理-地图统计"}) @PostMapping(value = "/map/works") - public R<List<MasterWorker>> map(String cityCode) { + public R<List<MasterWorker>> map(String cityCode,String name) { LoginUser loginUser = tokenService.getLoginUser(); if (null == loginUser) { @@ -548,7 +569,7 @@ if (workIds==null||workIds.isEmpty()){ return R.ok(new ArrayList<>()); } - List<MasterWorker> list = masterWorkerService.lambdaQuery().in(MasterWorker::getId, workIds).list(); + List<MasterWorker> list = masterWorkerService.lambdaQuery().in(MasterWorker::getId, workIds).eq(name!=null&&name!="",MasterWorker::getRealName,name).eq(cityCode!=null&&cityCode!="", MasterWorker::getCityCode,cityCode).list(); for (MasterWorker masterWorker : list) { masterWorker.setLacation(redisService.getCacheObject("work:"+masterWorker.getId()+":")); } @@ -564,14 +585,14 @@ for (Order datum : workday.getData()) { OrderByServeRecordVO orderByServeRecord = new OrderByServeRecordVO(); -// String masterFolderPath = "/usr/local/coordinate/" + datum.getServerId(); -// File masterFolder = new File(masterFolderPath); - // 检查师傅ID的文件夹是否存在,存在就读取轨迹数据 -// System.out.println("文件是否存在:" + masterFolder.exists()); -// if (masterFolder.exists()) { - // 检查订单ID的JSON文件是否存在,不存在则创建 -// String jsonFilePath = masterFolderPath + "/" + datum.getId() + ".json"; - String jsonFilePath = "C:\\Users\\Admin\\Desktop\\1814257493315514369.json"; + String masterFolderPath = "/usr/local/coordinate/" + datum.getServerId(); + File masterFolder = new File(masterFolderPath); +// 检查师傅ID的文件夹是否存在,存在就读取轨迹数据 + System.out.println("文件是否存在:" + masterFolder.exists()); + if (masterFolder.exists()) { +// 检查订单ID的JSON文件是否存在,不存在则创建 + String jsonFilePath = masterFolderPath + "/" + datum.getId() + ".json"; +// String jsonFilePath = "C:\\Users\\Admin\\Desktop\\1814257493315514369.json"; File jsonFile = new File(jsonFilePath); System.out.println("订单Json文件是否存在:" + jsonFile.exists()); if (jsonFile.exists()) { @@ -590,9 +611,10 @@ } catch (IOException e) { System.out.println(e.getMessage()); } -// } + list.add(orderByServeRecord); + + } } - list.add(orderByServeRecord); } diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/RegionController.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/RegionController.java index d3e7d91..b7f2334 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/RegionController.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/controller/RegionController.java @@ -1,16 +1,23 @@ package com.ruoyi.admin.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.admin.entity.AppVersion; import com.ruoyi.admin.entity.Region; +import com.ruoyi.admin.entity.SysUser; +import com.ruoyi.admin.mapper.AppMapper; import com.ruoyi.admin.service.RegionService; +import com.ruoyi.admin.service.SysUserService; +import com.ruoyi.admin.service.UserService; +import com.ruoyi.admin.vo.PageDto; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.system.api.model.LoginUser; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.apache.commons.collections4.Get; +import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; @@ -33,6 +40,37 @@ private RegionService regionService; @Resource private TokenService tokenService; + @Resource + private AppMapper appMapper; + @Resource + private SysUserService sysUserService; + + @PostMapping("/version/list") + @ApiOperation(value = "列表", tags = {"后台-版本管理"}) + public R<Page<AppVersion>> versionList(@RequestBody PageDto pageDto) { + Page<AppVersion> appVersionPage = appMapper.selectPage(Page.of(pageDto.getPageNum(), pageDto.getPageSize()), new QueryWrapper<AppVersion>().orderByDesc("createTime")); + for (AppVersion record : appVersionPage.getRecords()) { + SysUser byId = sysUserService.getById(record.getCreateBy()); + record.setCreateBy(byId.getNickName()); + } + return R.ok(appVersionPage); + + } + + @PostMapping("/version/add") + @ApiOperation(value = "添加", tags = {"后台-版本管理"}) + public R versionAdd(@RequestBody AppVersion appVersion) { + com.ruoyi.system.api.domain.SysUser sysUser = tokenService.getLoginUser().getSysUser(); + appVersion.setCreateBy(String.valueOf(sysUser.getUserId())); + appMapper.insert(appVersion); + return R.ok(); + } + @PostMapping("/version/delete/{id}") + @ApiOperation(value = "删除", tags = {"后台-版本管理"}) + public R versionDelete(@PathVariable Integer id) { + appMapper.deleteById(id); + return R.ok(); + } /** * 收货地址省市二级联动 diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/AppVersion.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/AppVersion.java new file mode 100644 index 0000000..351c0a9 --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/entity/AppVersion.java @@ -0,0 +1,49 @@ +package com.ruoyi.admin.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; + +/** + * <p> + * 菜单权限表 + * </p> + * + * @author hjl + * @since 2024-06-25 + */ +@Getter +@Setter +@TableName("app_version") +@ApiModel(value = "版本管理") +public class AppVersion extends BaseEntity { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("版本号") + @TableField("version") + private String version; + + @ApiModelProperty("安卓下载地址") + @TableField("android_url") + private String androidUrl; + + @ApiModelProperty("二维码") + @TableField("code") + private String code; + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/AppMapper.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/AppMapper.java new file mode 100644 index 0000000..96743c7 --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/mapper/AppMapper.java @@ -0,0 +1,17 @@ +package com.ruoyi.admin.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.admin.entity.AppVersion; +import com.ruoyi.admin.entity.Notices; + +/** + * <p> + * 系统通知管理 Mapper 接口 + * </p> + * + * @author hjl + * @since 2024-05-29 + */ +public interface AppMapper extends BaseMapper<AppVersion> { + +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java index 472536e..11b6fe3 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/OrderServiceImpl.java @@ -215,6 +215,7 @@ orderInfo.setOrderNumber(order.getOrderNumber()); orderInfo.setPlaceOrderTime(order.getCreateTime()); orderInfo.setState(order.getState()); + orderInfo.setReservationRemark(order.getReservationRemark()); } result.setOrderInfo(orderInfo); } diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/SendSmsServiceImpl.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/SendSmsServiceImpl.java index 88a7166..7c8ea3e 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/SendSmsServiceImpl.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/service/impl/SendSmsServiceImpl.java @@ -2,6 +2,7 @@ import cn.hutool.core.util.RandomUtil; import com.ruoyi.admin.service.SendSmsService; +import com.ruoyi.admin.utils.ALiSendSms; import com.ruoyi.admin.utils.SendSmsUtil; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.RedisConstants; @@ -25,6 +26,9 @@ private RedisTemplate<String, Object> redisTemplate; @Resource private SendSmsUtil sendSmsUtil; + @Resource + private ALiSendSms aLiSendSms; + @Override public String workerSettleSms(String phone) { @@ -49,7 +53,8 @@ // 发送验证码 String phone = order.getReservationPhone(); String[] arr = {order.getOrderNumber()}; - sendSmsUtil.sendSms(new SendSmsUtil.SendSmsRequest(phone, sendSmsUtil.reservationId, arr)); +// sendSmsUtil.sendSms(new SendSmsUtil.SendSmsRequest(phone, sendSmsUtil.reservationId, arr)); + aLiSendSms.send(phone, order.getServerPhone()); return "发送成功!"; } diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ALiSendSms.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ALiSendSms.java new file mode 100644 index 0000000..795c2e2 --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/ALiSendSms.java @@ -0,0 +1,62 @@ +package com.ruoyi.admin.utils; + + +import com.aliyuncs.CommonRequest; +import com.aliyuncs.CommonResponse; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.exceptions.ClientException; +import com.aliyuncs.profile.DefaultProfile; +import com.google.gson.Gson; +import org.apache.http.HttpResponse; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +/** + * 阿里云短信工具类 + */ +@Component +public class ALiSendSms { + + + + + public void send(String phone,String workerPhone) { + String host = "https://gyytz.market.alicloudapi.com"; + String path = "/sms/smsSend"; + String method = "POST"; + String appcode = "0efeed6a5fe94240b143fec8910c5053"; + Map<String, String> headers = new HashMap<String, String>(); + //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 + headers.put("Authorization", "APPCODE " + appcode); + Map<String, String> querys = new HashMap<String, String>(); + querys.put("mobile", phone); + querys.put("param", "**phone**:"+workerPhone); + + //smsSignId(短信前缀)和templateId(短信模板),可登录国阳云控制台自助申请。参考文档:http://help.guoyangyun.com/Problem/Qm.html + + querys.put("smsSignId", "d946ebc659714663955e73540ea47185"); + querys.put("templateId", "f534b5fb27594fbf89c4f78288a5932d"); + Map<String, String> bodys = new HashMap<String, String>(); + + + try { + /** + * 重要提示如下: + * HttpUtils请从\r\n\t \t* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java\r\n\t \t* 下载 + * + * 相应的依赖请参照 + * https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml + */ + HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys); + System.out.println(response.toString()); + //获取response的body + //System.out.println(EntityUtils.toString(response.getEntity())); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/Constant.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/Constant.java new file mode 100644 index 0000000..40bba60 --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/Constant.java @@ -0,0 +1,24 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2023. All rights reserved. + */ + +package com.ruoyi.admin.utils; + +public final class Constant { + // verify ssl certificate (true) or do not verify (false) + public static final boolean DO_VERIFY = false; + + public static final String HTTPS = "HTTPS"; + public static final String TRUST_MANAGER_FACTORY = "SunX509"; + public static final String GM_PROTOCOL = "GMTLS"; + public static final String INTERNATIONAL_PROTOCOL = "TLSv1.2"; + public static final String SIGNATURE_ALGORITHM_SDK_HMAC_SHA256 = "SDK-HMAC-SHA256"; + public static final String SIGNATURE_ALGORITHM_SDK_HMAC_SM3 = "SDK-HMAC-SM3"; + public static final String[] SUPPORTED_CIPHER_SUITES = {"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", + "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", + "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"}; + public static final String SECURE_RANDOM_ALGORITHM_NATIVE_PRNG_NON_BLOCKING = "NativePRNGNonBlocking"; + + private Constant() { + } +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/DescribeInstances.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/DescribeInstances.java index 55b64da..05b5d44 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/DescribeInstances.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/DescribeInstances.java @@ -23,7 +23,7 @@ String host = "https://addre.market.alicloudapi.com"; String path = "/format"; String method = "GET"; - String appcode = "44145c4c95004841985608a86eb4a4b7"; + String appcode = "0efeed6a5fe94240b143fec8910c5053"; Map<String, String> headers = new HashMap<String, String>(); //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105 headers.put("Authorization", "APPCODE " + appcode); diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/HostName.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/HostName.java new file mode 100644 index 0000000..73663cb --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/HostName.java @@ -0,0 +1,17 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2023-2023. All rights reserved. + */ + +package com.ruoyi.admin.utils; + +public class HostName { + private static String urlHostName; + + public static void setUrlHostName(String hostName) { + urlHostName = hostName; + } + + public static boolean checkHostName(String SSLHostName) { + return urlHostName.equals(SSLHostName); + } +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/SSLCipherSuiteUtil.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/SSLCipherSuiteUtil.java new file mode 100644 index 0000000..d0866c1 --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/SSLCipherSuiteUtil.java @@ -0,0 +1,209 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2023. All rights reserved. + */ + +package com.ruoyi.admin.utils; + +import okhttp3.OkHttpClient; +import org.apache.http.client.HttpClient; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.bouncycastle.crypto.BlockCipher; +import org.bouncycastle.crypto.engines.AESEngine; +import org.bouncycastle.crypto.prng.SP800SecureRandomBuilder; +import org.openeuler.BGMProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.net.ssl.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.security.*; +import java.security.cert.X509Certificate; +import java.util.Locale; +import java.util.concurrent.TimeUnit; + +public class SSLCipherSuiteUtil { + private static final Logger LOGGER = LoggerFactory.getLogger(SSLCipherSuiteUtil.class); + private static CloseableHttpClient httpClient; + private static OkHttpClient okHttpClient; + + private static final int CIPHER_LEN = 256; + + private static final int ENTROPY_BITS_REQUIRED = 384; + + public static HttpClient createHttpClient(String protocol) throws Exception { + SSLContext sslContext = getSslContext(protocol); + // create factory + SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, + new String[]{protocol}, Constant.SUPPORTED_CIPHER_SUITES, new TrustAllHostnameVerifier()); + + httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); + return httpClient; + } + + public static HttpClient createHttpClientWithVerify(String protocol) throws Exception { + SSLContext sslContext = getSslContextWithVerify(protocol); + // create factory + SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, + new String[] {protocol}, Constant.SUPPORTED_CIPHER_SUITES, new TheRealHostnameVerifier()); + + httpClient = HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory).build(); + return httpClient; + } + + public static OkHttpClient createOkHttpClient(String protocol) throws Exception { + SSLContext sslContext = getSslContext(protocol); + // Create an ssl socket factory with our all-trusting manager + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .sslSocketFactory(sslSocketFactory, new TrustAllManager()) + .hostnameVerifier(new TrustAllHostnameVerifier()); + okHttpClient = builder.connectTimeout(10, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); + return okHttpClient; + } + + public static OkHttpClient createOkHttpClientWithVerify(String protocol) throws Exception { + SSLContext sslContext = getSslContextWithVerify(protocol); + SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + + TrustManagerFactory tmf = TrustManagerFactory.getInstance(Constant.TRUST_MANAGER_FACTORY); + tmf.init((KeyStore) null); + TrustManager[] verify = tmf.getTrustManagers(); + OkHttpClient.Builder builder = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, + (X509TrustManager) verify[0]).hostnameVerifier(new TheRealHostnameVerifier()); + + okHttpClient = builder.connectTimeout(10, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).build(); + return okHttpClient; + } + + public static HttpURLConnection createHttpsOrHttpURLConnection(URL uUrl, String protocol) throws Exception { + // initial connection + if (uUrl.getProtocol().toUpperCase(Locale.getDefault()).equals(Constant.HTTPS)) { + SSLContext sslContext = getSslContext(protocol); + HttpsURLConnection.setDefaultHostnameVerifier(new TrustAllHostnameVerifier()); + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + return (HttpsURLConnection) uUrl.openConnection(); + } + return (HttpURLConnection) uUrl.openConnection(); + } + + public static HttpURLConnection createHttpsOrHttpURLConnectionWithVerify(URL uUrl, String protocol) throws Exception { + // initial connection + if (uUrl.getProtocol().toUpperCase(Locale.getDefault()).equals(Constant.HTTPS)) { + SSLContext sslContext = getSslContextWithVerify(protocol); + HttpsURLConnection.setDefaultHostnameVerifier(new TheRealHostnameVerifier()); + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + return (HttpsURLConnection) uUrl.openConnection(); + } + return (HttpURLConnection) uUrl.openConnection(); + } + + private static SSLContext getSslContext(String protocol) throws UnsupportProtocolException, + NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException { + if (!Constant.GM_PROTOCOL.equals(protocol) && !Constant.INTERNATIONAL_PROTOCOL.equals(protocol)) { + LOGGER.info("Unsupport protocol: {}, Only support GMTLS TLSv1.2", protocol); + throw new UnsupportProtocolException("Unsupport protocol, Only support GMTLS TLSv1.2"); + } + // Create a trust manager that does not validate certificate chains + TrustAllManager[] trust = {new TrustAllManager()}; + KeyManager[] kms = null; + SSLContext sslContext; + + sslContext = SSLContext.getInstance(Constant.INTERNATIONAL_PROTOCOL, "SunJSSE"); + + if (Constant.GM_PROTOCOL.equals(protocol)) { + Security.insertProviderAt(new BGMProvider(), 1); + sslContext = SSLContext.getInstance(Constant.GM_PROTOCOL, "BGMProvider"); + } + SecureRandom secureRandom = getSecureRandom(); + sslContext.init(kms, trust, secureRandom); + sslContext.getServerSessionContext().setSessionCacheSize(8192); + sslContext.getServerSessionContext().setSessionTimeout(3600); + return sslContext; + } + + private static SSLContext getSslContextWithVerify(String protocol) + throws UnsupportProtocolException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException, + KeyStoreException { + if (!Constant.GM_PROTOCOL.equals(protocol) && !Constant.INTERNATIONAL_PROTOCOL.equals(protocol)) { + LOGGER.info("Unsupport protocol: {}, Only support GMTLS TLSv1.2", protocol); + throw new UnsupportProtocolException("Unsupport protocol, Only support GMTLS TLSv1.2"); + } + KeyManager[] kms = null; + SSLContext sslContext = SSLContext.getInstance(Constant.INTERNATIONAL_PROTOCOL, "SunJSSE"); + SecureRandom secureRandom = getSecureRandom(); + + if (Constant.GM_PROTOCOL.equals(protocol)) { + Security.insertProviderAt(new BGMProvider(), 1); + sslContext = SSLContext.getInstance(Constant.GM_PROTOCOL, "BGMProvider"); + } + + TrustManagerFactory tmf = TrustManagerFactory.getInstance(Constant.TRUST_MANAGER_FACTORY); + tmf.init((KeyStore) null); + TrustManager[] verify = tmf.getTrustManagers(); + sslContext.init(kms, verify, secureRandom); + + sslContext.getServerSessionContext().setSessionCacheSize(8192); + sslContext.getServerSessionContext().setSessionTimeout(3600); + return sslContext; + } + + // 不校验域名 + private static class TrustAllHostnameVerifier implements HostnameVerifier { + public boolean verify(String hostname, SSLSession session) { + return true; + } + } + + // 校验域名 + private static class TheRealHostnameVerifier implements HostnameVerifier { + public boolean verify(String hostname, SSLSession session) { + if (HostName.checkHostName(hostname)) { + return true; + } else { + HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier(); + return hv.verify(hostname, session); + } + } + } + + // 不校验服务端证书 + private static class TrustAllManager implements X509TrustManager { + private X509Certificate[] issuers; + + public TrustAllManager() { + this.issuers = new X509Certificate[0]; + } + + public X509Certificate[] getAcceptedIssuers() { + return issuers; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + } + + private static SecureRandom getSecureRandom() { + SecureRandom source; + try { + source = SecureRandom.getInstance(Constant.SECURE_RANDOM_ALGORITHM_NATIVE_PRNG_NON_BLOCKING); + } catch (NoSuchAlgorithmException e) { + try { + source = SecureRandom.getInstanceStrong(); + } catch (NoSuchAlgorithmException ex) { + LOGGER.error("get SecureRandom failed", e); + throw new RuntimeException("get SecureRandom failed"); + } + } + boolean predictionResistant = true; + BlockCipher cipher = new AESEngine(); + boolean reSeed = false; + return new SP800SecureRandomBuilder(source, predictionResistant).setEntropyBitsRequired( + ENTROPY_BITS_REQUIRED).buildCTR(cipher, CIPHER_LEN, null, reSeed); + } +} \ No newline at end of file diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/UnsupportProtocolException.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/UnsupportProtocolException.java new file mode 100644 index 0000000..2f1adde --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/utils/UnsupportProtocolException.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2022-2022. All rights reserved. + */ + +package com.ruoyi.admin.utils; + +public class UnsupportProtocolException extends Exception { + private static final long serialVersionUID = 4312820110480855928L; + private String msgDes; // 异常对应的描述信息 + + public UnsupportProtocolException(String message) { + super(message); + msgDes = message; + } +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java index b5a3194..b4f2922 100644 --- a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderInfoVO.java @@ -25,5 +25,7 @@ @ApiModelProperty("订单状态(0:待派单;1:待上门;2:待完工;3:已完结;4:已取消;5:已改派)") private Integer state; + @ApiModelProperty("预约备注") + private String reservationRemark; } diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java new file mode 100644 index 0000000..bc3a23d --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/OrderReasinDto.java @@ -0,0 +1,10 @@ +package com.ruoyi.admin.vo; + +import lombok.Data; + +import java.util.List; +@Data +public class OrderReasinDto { + Integer workerId; + List<ReassinDto> reassinDtos; +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/PageDto.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/PageDto.java new file mode 100644 index 0000000..1ef851d --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/PageDto.java @@ -0,0 +1,9 @@ +package com.ruoyi.admin.vo; + +import lombok.Data; + +@Data +public class PageDto { + private Integer pageNum = 1; + private Integer pageSize = 10; +} diff --git a/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/ReassinDto.java b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/ReassinDto.java new file mode 100644 index 0000000..f6899af --- /dev/null +++ b/ruoyi-service/ruoyi-admin/src/main/java/com/ruoyi/admin/vo/ReassinDto.java @@ -0,0 +1,10 @@ +package com.ruoyi.admin.vo; + +import lombok.Data; + +@Data +public class ReassinDto { + private String orderId; + private Integer type; + +} diff --git a/ruoyi-service/ruoyi-admin/src/main/resources/bootstrap.yaml b/ruoyi-service/ruoyi-admin/src/main/resources/bootstrap.yaml index 8316a23..5d865e7 100644 --- a/ruoyi-service/ruoyi-admin/src/main/resources/bootstrap.yaml +++ b/ruoyi-service/ruoyi-admin/src/main/resources/bootstrap.yaml @@ -23,6 +23,8 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: nacos username: nacos password: jdhs_nacos! config: @@ -31,6 +33,8 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: nacos username: nacos password: jdhs_nacos! name: ${spring.application.name} diff --git "a/ruoyi-service/ruoyi-admin/src/main/resources/template/\350\256\242\345\215\225\350\256\260\345\275\225.xlsx" "b/ruoyi-service/ruoyi-admin/src/main/resources/template/\350\256\242\345\215\225\350\256\260\345\275\225.xlsx" index 56a8b71..88b57f0 100644 --- "a/ruoyi-service/ruoyi-admin/src/main/resources/template/\350\256\242\345\215\225\350\256\260\345\275\225.xlsx" +++ "b/ruoyi-service/ruoyi-admin/src/main/resources/template/\350\256\242\345\215\225\350\256\260\345\275\225.xlsx" Binary files differ diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java index c69c55e..796742e 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ChangeDispatchController.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.time.LocalDateTime; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -244,9 +245,9 @@ .set(Order::getIsReinvest, Constants.ONE) .set(Order::getAcceptTime, new Date()) .set(Order::getArriveTime, null) - .set(Order::getCompleteTime, null) + .set(Order::getCompleteTime, null).set(Order::getAcceptTime, LocalDateTime.now()) // 原订单状态改为 1:待上门,已选择师傅 - .set(Order::getState, Constants.ONE) + .set(Order::getState, Constants.ONE).set(Order::getServerId, workerId).set(Order::getServerName, name).set(Order::getServerPhone, phone) .eq(Order::getId, order.getId()).update(); // 改派信息 boolean update = changeDispatchService.lambdaUpdate().set(ChangeDispatch::getState, 1) diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java index 82123fc..bbb2faf 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java @@ -313,6 +313,7 @@ order.setTime(orderRequest.getTime()); order.setAcceptTime(orderRequest.getAcceptTime()); +// order.setAcceptTime(new Date()); // 师傅信息 order.setServerId(orderRequest.getServerId()); order.setServerName(orderRequest.getServerName()); @@ -420,6 +421,12 @@ List<String> idList = Arrays.stream(ids.split(",")).collect(Collectors.toList()); List<Order> list = orderService.lambdaQuery().in(Order::getId, idList).list(); list.forEach(data -> data.setIsDelete(1)); + + List<ChangeDispatch> list1 = changeDispatchService.lambdaQuery().in(ChangeDispatch::getOrderId, idList).list(); + if (!list1.isEmpty()) { + list1.forEach(data -> data.setIsDelete(1)); + changeDispatchService.updateBatchById(list1); + } return R.ok(orderService.updateBatchById(list)); } diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryRequest.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryRequest.java index 70c2dbd..c4bd1f8 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryRequest.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryRequest.java @@ -29,6 +29,9 @@ @ApiModelProperty("订单状态(0:待派单;1:待上门;2:待完工;3:已完结;4:已取消;5:已改派)") private Integer state; + private Integer fake; + private String address; + @ApiModelProperty("师傅名称") private String workerName; diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryVO.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryVO.java index b36c225..71c3b59 100644 --- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryVO.java +++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderQueryVO.java @@ -23,6 +23,7 @@ @ApiModelProperty("订单数量") private Integer number; + private Integer fakeNumber; private Integer fakeCount; } diff --git a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yaml b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yaml index db16003..256dd67 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yaml +++ b/ruoyi-service/ruoyi-order/src/main/resources/bootstrap.yaml @@ -23,6 +23,8 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: nacos username: nacos password: jdhs_nacos! config: @@ -31,6 +33,8 @@ group: DEFAULT_GROUP namespace: 5b0cc96f-d058-4986-a46f-64644ff8a467 # 线上nacos需要鉴权 +# username: nacos +# password: nacos username: nacos password: jdhs_nacos! name: ${spring.application.name} diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml index f607e53..909cbe9 100644 --- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml +++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml @@ -5,6 +5,7 @@ <resultMap id="BaseResultMap" type="com.ruoyi.order.entity.Order"> <id column="id" property="id"/> <result column="site_id" property="siteId"/> + <result column="accept_time" property="acceptTime"/> <result column="order_number" property="orderNumber"/> <result column="order_money" property="orderMoney"/> <result column="site_name" property="siteName"/> @@ -202,7 +203,12 @@ from t_order o <where> o.is_delete = 0 - + <if test="data.fake != null "> + and o.fake = #{data.fake} + </if> + <if test="data.address != null and data.address != ''"> + and o.reservation_address like concat('%', #{data.address}, '%') + </if> <if test="data.orderNumber != null and data.orderNumber != ''"> and o.order_number like concat('%', #{data.orderNumber}, '%') </if> @@ -270,9 +276,23 @@ #{city} </foreach> </if> + + <if test="data.servIds != null and data.servIds.size() != 0"> + and o.serve_id in + <foreach collection="data.servIds" item="c" open="(" separator="," close=")"> + #{c} + </foreach> + </if> + <if test="data.type !=null"> and o.type = #{data.type} </if> + <if test="data.fake !=null"> + and o.fake = #{data.fake} + </if> + <if test="data.address != null and data.address != ''"> + and o.reservation_address like concat('%', #{data.address}, '%') + </if> <if test="data.orderNumber != null and data.orderNumber != ''"> and o.order_number like concat('%', #{data.orderNumber}, '%') </if> @@ -316,7 +336,7 @@ time, serve_name, server_name, - server_phone + server_phone,site_name from t_order <where> id in @@ -331,6 +351,21 @@ from t_order o <where> o.is_delete = 0 + <if test="data.fake != null "> + and o.fake = #{data.fake} + </if> + <if test="data.address != null and data.address != ''"> + and o.reservation_address like concat('%', #{data.address}, '%') + </if> + <if test="data.servIds != null and data.servIds.size() != 0"> + and o.serve_id in + <foreach collection="data.servIds" item="c" open="(" separator="," close=")"> + #{c} + </foreach> + </if> + <if test="data.type != null"> + and o.type = #{data.type} + </if> <if test="data.orderNumber != null and data.orderNumber != ''"> and o.order_number like concat('%', #{data.orderNumber}, '%') </if> @@ -353,7 +388,7 @@ and o.server_phone like concat('%', #{data.workerPhone}, '%') </if> <if test="data.serveName != null and data.serveName != ''"> - and o.serve_name like concat('%', #{data.serveName}, '%') + and o.site_name like concat('%', #{data.serveName}, '%') </if> <if test="data.orderTimeStart != null and data.orderTimeStart != ''"> and DATE(o.createTime) <![CDATA[ >= ]]> #{data.orderTimeStart} @@ -500,10 +535,11 @@ </select> <select id="papercout" resultType="com.ruoyi.common.core.vo.PaperInVo"> select count(*) as count, serve_id as serveId from t_order - where is_delete = 0 + where is_delete = 0 and state = 3 and server_id = #{workId} and `time` = #{date} group by serve_id + </select> </mapper> diff --git a/ruoyi-service/ruoyi-user/src/main/resources/bootstrap.yaml b/ruoyi-service/ruoyi-user/src/main/resources/bootstrap.yaml index 20eff32..b9289cd 100644 --- a/ruoyi-service/ruoyi-user/src/main/resources/bootstrap.yaml +++ b/ruoyi-service/ruoyi-user/src/main/resources/bootstrap.yaml @@ -25,6 +25,8 @@ # 线上nacos需要鉴权 username: nacos password: jdhs_nacos! +# username: nacos +# password: nacos config: # 配置中心地址 server-addr: 127.0.0.1:8848 @@ -33,6 +35,8 @@ # 线上nacos需要鉴权 username: nacos password: jdhs_nacos! +# username: nacos +# password: nacos name: ${spring.application.name} # 配置文件格式 file-extension: yml diff --git a/ruoyi-service/ruoyi-worker/pom.xml b/ruoyi-service/ruoyi-worker/pom.xml index f5ecc48..ce7140b 100644 --- a/ruoyi-service/ruoyi-worker/pom.xml +++ b/ruoyi-service/ruoyi-worker/pom.xml @@ -19,6 +19,12 @@ </properties> <dependencies> + <dependency> + <groupId>commons-fileupload</groupId> + <artifactId>commons-fileupload</artifactId> + <version>1.4</version> + </dependency> + <!-- mybatis-plus --> <dependency> <groupId>com.baomidou</groupId> diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/MasterWorkerController.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/MasterWorkerController.java index 2edf241..2197757 100644 --- a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/MasterWorkerController.java +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/MasterWorkerController.java @@ -1,6 +1,8 @@ package com.ruoyi.worker.controller; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.admin.api.entity.Agreement; import com.ruoyi.admin.api.feignClient.AdminClient; import com.ruoyi.common.core.constant.Constants; @@ -13,8 +15,10 @@ import com.ruoyi.order.api.entity.WorkerOrderCountVO; import com.ruoyi.order.api.feignClient.OrderClient; import com.ruoyi.system.api.model.LoginUserInfo; +import com.ruoyi.worker.entity.AppVersion; import com.ruoyi.worker.entity.MasterWorker; import com.ruoyi.worker.entity.WorkerProcess; +import com.ruoyi.worker.mapper.AppMapper; import com.ruoyi.worker.request.LoginPasswordRequest; import com.ruoyi.worker.request.LoginPhoneRequest; import com.ruoyi.worker.service.MasterWorkerService; @@ -61,7 +65,16 @@ private AdminClient adminClient; @Resource private OrderClient orderClient; + @Resource + private AppMapper appMapper; + + @PostMapping("/version/check") + @ApiOperation(value = "获取最新的版本信息", tags = {"自动更新"}) + public R<AppVersion> check() { + AppVersion appVersion = appMapper.selectOne(new QueryWrapper<AppVersion>().orderByDesc("createTime").eq("is_delete", 0).last("limit 1")); + return R.ok(appVersion); + } /** * 师傅端-密码登录 * diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java index b3ab899..f1db1a7 100644 --- a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/controller/OssController.java @@ -1,12 +1,17 @@ package com.ruoyi.worker.controller; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.domain.Result; +import com.ruoyi.common.core.utils.GaoDeMapUtil; import com.ruoyi.order.api.feignClient.OrderClient; +import com.ruoyi.worker.utils.FileImageWatermarkUtils; import com.ruoyi.worker.utils.TencentCosUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -14,6 +19,17 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.imageio.ImageIO; +import javax.imageio.stream.ImageOutputStream; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + /** * @author HJL @@ -23,12 +39,14 @@ @RestController @RequestMapping("/oss") @Api(tags = "师傅端-文件上传") +@Slf4j public class OssController { @Resource private OrderClient orderClient; @Resource private TencentCosUtil tencentCosUtil; + @PostMapping("/upload") @ApiOperation(value = "文件上传", tags = "师傅端-文件上传") @@ -52,4 +70,40 @@ return R.ok(tencentCosUtil.upLoadFile(file)); } + @PostMapping(value = "/pic", produces = "application/json;charset=UTF-8") + @ApiOperation(value = "文件上传加水印", tags = "师傅端-文件上传") + @ApiImplicitParams({ + @ApiImplicitParam(value = "文件", name = "file", dataType = "MultipartFile", required = true) + }) + public R<String> pic(@RequestParam("file") MultipartFile file,@RequestParam String longitude,@RequestParam String address, + @RequestParam String latitude) { +// Result<String> address = GaoDeMapUtil.getAddress(longitude, latitude); + + + // 获取当前时间 + + LocalDateTime date = LocalDateTime.now(); + + // 设置日期格式 + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // 通过format调用转换的方法 + + String dateWatermark = formatter.format(date); +// System.err.println("==========="+LocalDateTime.now()); + log.error("==========="+LocalDateTime.now()); + + MultipartFile watermarkFile = FileImageWatermarkUtils.markWithContent(file,dateWatermark,address); +// System.err.println("==========="+LocalDateTime.now()); + log.error("==========="+LocalDateTime.now()); + + + String url = tencentCosUtil.upLoadFile(watermarkFile); + log.error("==========="+LocalDateTime.now()); + return R.ok(url); + + } + + } diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/AppVersion.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/AppVersion.java new file mode 100644 index 0000000..b341007 --- /dev/null +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/AppVersion.java @@ -0,0 +1,45 @@ +package com.ruoyi.worker.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.ruoyi.common.core.domain.BaseEntity; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * <p> + * 菜单权限表 + * </p> + * + * @author hjl + * @since 2024-06-25 + */ +@Getter +@Setter +@TableName("app_version") +@ApiModel(value = "版本管理") +public class AppVersion extends BaseEntity { + + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("版本号") + @TableField("version") + private String version; + + @ApiModelProperty("安卓下载地址") + @TableField("android_url") + private String androidUrl; + + @ApiModelProperty("二维码") + @TableField("code") + private String code; + @ApiModelProperty("备注") + @TableField("remark") + private String remark; + +} diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/MultipartFileDto.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/MultipartFileDto.java new file mode 100644 index 0000000..df168c4 --- /dev/null +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/entity/MultipartFileDto.java @@ -0,0 +1,189 @@ +package com.ruoyi.worker.entity; + +import org.springframework.util.FileCopyUtils; + +import org.springframework.web.multipart.MultipartFile; + +import java.io.ByteArrayInputStream; + +import java.io.File; + +import java.io.IOException; + +import java.io.InputStream; + +/** + + * @author + + * file转MultipartFile的时候会用到MockMultipartFile + + * 当你导入spring-test依赖的时候 会跟某些依赖冲突(暂未找到具体是哪个冲突) + + * 解决方法 重写一个类去实现MultipartFile接口 + + * 直接用MockMultipartFile的源码 + + * + + */ + +public class MultipartFileDto implements MultipartFile { + + private final String name; + + private String originalFilename; + + private String contentType; + + private final byte[] content; + + /** + + * Create a new MultipartFileDto with the given content. + + * @param name the name of the file + + * @param content the content of the file + + */ + + public MultipartFileDto(String name, byte[] content) { + + this(name, "", null, content); + + } + + /** + + * Create a new MultipartFileDto with the given content. + + * @param name the name of the file + + * @param contentStream the content of the file as stream + + * @throws IOException if reading from the stream failed + + */ + + public MultipartFileDto(String name, InputStream contentStream) throws IOException { + + this(name, "", null, FileCopyUtils.copyToByteArray(contentStream)); + + } + + /** + + * Create a new MultipartFileDto with the given content. + + * @param name the name of the file + + * @param originalFilename the original filename (as on the client's machine) + + * @param contentType the content type (if known) + + * @param content the content of the file + + */ + + public MultipartFileDto(String name, String originalFilename, String contentType, byte[] content) { + + this.name = name; + + this.originalFilename = (originalFilename != null ? originalFilename : ""); + + this.contentType = contentType; + + this.content = (content != null ? content : new byte[0]); + + } + + /** + + * Create a new MultipartFileDto with the given content. + + * @param name the name of the file + + * @param originalFilename the original filename (as on the client's machine) + + * @param contentType the content type (if known) + + * @param contentStream the content of the file as stream + + * @throws IOException if reading from the stream failed + + */ + + public MultipartFileDto(String name, String originalFilename, String contentType, InputStream contentStream) + + throws IOException { + + this(name, originalFilename, contentType, FileCopyUtils.copyToByteArray(contentStream)); + + } + + @Override + + public String getName() { + + return this.name; + + } + + @Override + + public String getOriginalFilename() { + + return this.originalFilename; + + } + + @Override + + public String getContentType() { + + return this.contentType; + + } + + @Override + + public boolean isEmpty() { + + return (this.content.length == 0); + + } + + @Override + + public long getSize() { + + return this.content.length; + + } + + @Override + + public byte[] getBytes() throws IOException { + + return this.content; + + } + + @Override + + public InputStream getInputStream() throws IOException { + + return new ByteArrayInputStream(this.content); + + } + + @Override + + public void transferTo(File dest) throws IOException, IllegalStateException { + + FileCopyUtils.copy(this.content, dest); + + } + +} diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/AppMapper.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/AppMapper.java new file mode 100644 index 0000000..b670cf1 --- /dev/null +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/mapper/AppMapper.java @@ -0,0 +1,16 @@ +package com.ruoyi.worker.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.worker.entity.AppVersion; + +/** + * <p> + * 系统通知管理 Mapper 接口 + * </p> + * + * @author hjl + * @since 2024-05-29 + */ +public interface AppMapper extends BaseMapper<AppVersion> { + +} diff --git a/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/utils/FileImageWatermarkUtils.java b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/utils/FileImageWatermarkUtils.java new file mode 100644 index 0000000..61a9442 --- /dev/null +++ b/ruoyi-service/ruoyi-worker/src/main/java/com/ruoyi/worker/utils/FileImageWatermarkUtils.java @@ -0,0 +1,276 @@ +package com.ruoyi.worker.utils; + + +import com.ruoyi.worker.entity.MultipartFileDto; +import org.springframework.web.multipart.MultipartFile; + +import javax.imageio.ImageIO; + +import java.awt.AlphaComposite; + +import java.awt.Color; + +import java.awt.Font; + +import java.awt.Graphics2D; + +import java.awt.RenderingHints; + +import java.awt.image.BufferedImage; + +import java.io.*; + +/** + + * @author inspur + + * 定义文字加水印 + + */ + +public class FileImageWatermarkUtils { + + /** + + * 水印字体 + + */ + + private static final Font FONT = new Font("宋体", Font.PLAIN, 40); + + /** + + * 透明度 + + */ + + private static final AlphaComposite COMPOSITE = AlphaComposite + + .getInstance(AlphaComposite.SRC_OVER, 0.9f); + + /** + + * 水印之间的间隔 + + */ + + private static final int X_MOVE = 150; + + /** + + * 水印之间的间隔 + + */ + + private static final int Y_MOVE = 200; + + /** + + * 打水印(文字) + + * + + * @param file MultipartFile + + * @return MultipartFile + + */ + + public static MultipartFile markWithContent(MultipartFile file,String keyword,String address) { + + FileOutputStream fos = null; + + try { + + BufferedImage srcImg = ImageIO.read(file.getInputStream()); + + // 图片宽、高 + + int imgWidth = srcImg.getWidth(); + + int imgHeight = srcImg.getHeight(); + + // 图片缓存 + + BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB); + + // 创建绘图工具 + + Graphics2D graphics = bufImg.createGraphics(); + + // 画入原始图像 + + graphics.drawImage(srcImg, 0, 0, imgWidth, imgHeight, null); + + // 设置水印颜色 + + graphics.setColor(Color.RED); + + // 设置水印透明度 + + graphics.setComposite(COMPOSITE); + + // 设置倾斜角度 + +/* graphics.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2, + + (double) bufImg.getHeight() / 2);*/ + + // 设置水印字体 + + graphics.setFont(FONT); + + // 消除java.awt.Font字体的锯齿 + +// graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + + int xCoordinate , yCoordinate; + int xCoordinate1 , yCoordinate1; + int xCoordinate2 , yCoordinate2; + + String mark = "ls65535"; + + // 字体长度 + + int markWidth = FONT.getSize() * getTextLength(keyword); + + // 字体高度 + + int markHeight = FONT.getSize(); + + //位置控制 水印位于图片 下方右下角 + if (address.length()<=23){ + + + xCoordinate = (int) ((imgWidth - getWatermarkLength(keyword, graphics)) * 0.05); + + yCoordinate = (int) (imgHeight * 0.91); + + xCoordinate1 = (int) ((imgWidth - getWatermarkLength(keyword, graphics)) * 0.05); + + yCoordinate1 = (int) (imgHeight * 0.96); + + + graphics.drawString("地址:" + address, xCoordinate, yCoordinate); + graphics.drawString("时间:" + keyword, xCoordinate1, yCoordinate1); + + InputStream inputStream = buffToInputStream(bufImg); + + + // 释放画图工具 + + graphics.dispose(); + + return new MultipartFileDto(file.getName(),file.getOriginalFilename(),file.getContentType(),inputStream); + + }else { + xCoordinate2 = (int) ((imgWidth - getWatermarkLength(keyword, graphics)) * 0.05); + + yCoordinate2 = (int) (imgHeight * 0.91); + + xCoordinate = (int) ((imgWidth - getWatermarkLength(keyword, graphics)) * 0.05); + + yCoordinate = (int) (imgHeight * 0.88); + + xCoordinate1 = (int) ((imgWidth - getWatermarkLength(keyword, graphics)) * 0.05); + + yCoordinate1 = (int) (imgHeight * 0.96); + + + graphics.drawString("地址:" + address.substring(0,20), xCoordinate, yCoordinate); + graphics.drawString(address.substring(20), xCoordinate2, yCoordinate2); + + graphics.drawString("时间:" + keyword, xCoordinate1, yCoordinate1); + + InputStream inputStream = buffToInputStream(bufImg); + + + // 释放画图工具 + + graphics.dispose(); + + return new MultipartFileDto(file.getName(),file.getOriginalFilename(),file.getContentType(),inputStream); + } + + } catch (Exception e) { + + e.printStackTrace(); + + } finally { + + if (fos != null) { + + try { + + fos.flush(); + + fos.close(); + + } catch (Exception e) { + + e.printStackTrace(); + + } + + } + + } + + return null; + + } + + /** + + * 计算水印文本长度 + + * 1、中文长度即文本长度 2、英文长度为文本长度二分之一 + + * @param text + + * @return + + */ + + public static int getTextLength(String text) { + + //水印文字长度 + + int length = text.length(); + + for (int i = 0; i < text.length(); i++) { + + String s = String.valueOf(text.charAt(i)); + + if (s.getBytes().length > 1) { + + length++; + + } + + } + + length = length % 2 == 0 ? length / 2 : length / 2 + 1; + + return length; + + } + + public static InputStream buffToInputStream(BufferedImage buffer) throws IOException { + + ByteArrayOutputStream os = new ByteArrayOutputStream(); + + ImageIO.write(buffer, "png", os); + + return new ByteArrayInputStream(os.toByteArray()); + + } + + public static int getWatermarkLength(String waterMarkContent, Graphics2D g) { + + return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length()); + + } + +} + diff --git a/ruoyi-service/ruoyi-worker/src/main/resources/bootstrap.yaml b/ruoyi-service/ruoyi-worker/src/main/resources/bootstrap.yaml index 545476c..3c1ea25 100644 --- a/ruoyi-service/ruoyi-worker/src/main/resources/bootstrap.yaml +++ b/ruoyi-service/ruoyi-worker/src/main/resources/bootstrap.yaml @@ -25,6 +25,8 @@ # 线上nacos需要鉴权 username: nacos password: jdhs_nacos! +# username: nacos +# password: nacos config: # 配置中心地址 server-addr: 127.0.0.1:8848 @@ -33,6 +35,8 @@ # 线上nacos需要鉴权 username: nacos password: jdhs_nacos! +# username: nacos +# password: nacos name: ${spring.application.name} # 配置文件格式 file-extension: yml -- Gitblit v1.7.1